From 3bfa0c459e3c0b5bfa962b7dbb0227db5a8ba09f Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Sat, 22 Aug 2026 12:58:15 +0200 Subject: test(ef): the LMS Ordo as a sixth validation layer An independent lineage -- neither Divinum Officium, missalemeum nor lectio -- covering the Mass formulary and the Creed. Characterised before use, per the discipline the extraordinaryform.org Ordo's blanket St Lawrence vigil gap taught this session: five opposite- prediction Creed probes (Sunday/feria, octave-override vs plain II-class, I-class) all confirmed against the raw extracted text before a single divergence was adjudicated, recorded in the fixture's own provenance header. tools/extract_lms_ordo.ml hand-parses pdftotext -layout output (no Str/regex, frozen deps) into test/fixtures/lms-ordo-2024-2025.sexp, 400 day-rows (2024-11-27..2025-12-31). Gl/Cr print per Mass-option, not per day; the extractor takes the first pair in reading order, which the source's own layout guarantees is the universal entry's, since a diocesan variant always follows it, never precedes it. The Ordo's I-V roman numeral ("Missae de sancta Maria in sabbato", RG 309(a)) is matched whole-line only, never by substring -- "V Mass of BVM" is a substring of "IV Mass of BVM". test/test_lms_ordo.ml compares two axes 1:1 by date: - the Creed (RG 475-476): 399 of 400 days comparable (Good Friday has no Mass at all, asserted as the only such day); one genuine divergence, adjudicated to the ORDO, not colitur -- All Souls' Day 2025-11-03 is a Requiem Mass, and colitur's own creed predicate has no notion of one, a pre-existing scope gap rubrics_ef.ml already documented in its own header before this task existed. - the BVM-Saturday seasonal Mass selection, the addendum's own "sharper check": all 14 Votive days in the window match their season's own numeral exactly, both directions, independently re-derived from RG 309(a) rather than calling colitur's private function. - the formulary override, for the three sources it can honestly discriminate (Proper 179, Preceding_sunday 66, Common 2, all clean); Own_slug (139) is excluded with evidence, not silently -- several ferial slugs carry citations byte-identical to their Sunday's own, so the Ordo's override line cannot distinguish the two representations. data/ef/expected-divergences-lms.sexp carries the one adjudicated entry (L1), cited to RG 476(f). Mutation-tested: inverting RG 475(a)'s Sunday clause reddens 10 existing Rubrics_ef unit tests AND this new layer's own comparator, independently, on a data source none of the other five layers touch. Reverted after confirming. No lib/ changes. day/readings/rubrics output re-confirmed byte- identical (1583, 2026, 2038, 9999) after this task; all three gates green (dune test, exhaustive sweep, make check). --- test/dune | 2 ++ 1 file changed, 2 insertions(+) (limited to 'test/dune') diff --git a/test/dune b/test/dune index d883d2f..44318a2 100644 --- a/test/dune +++ b/test/dune @@ -9,6 +9,7 @@ ../lang/traditions.ini ../data/ef/expected-divergences.sexp ../data/ef/expected-divergences-missalemeum.sexp + ../data/ef/expected-divergences-lms.sexp ../data/ef/lectionary.sexp ../data/ef/commons.sexp ../data/ef/examples/diocesan-example.sexp @@ -16,6 +17,7 @@ fixtures/missalemeum-ef-2026-2027.txt fixtures/missalemeum-ef-2038.txt fixtures/missalemeum-ef-2035.txt + fixtures/lms-ordo-2024-2025.sexp ../templates/ef/ordo.tex ../templates/ef/ordo.ms ../templates/ef/ordo.html -- cgit v1.3 From 72dd2426f020f83a392158ead7bd15b36088fd08 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Sat, 22 Aug 2026 14:51:07 +0200 Subject: test(lms-ordo): extend the LMS witness layer from one year to three Generalises tools/extract_lms_ordo.ml's start-of-body detection: the hardcoded "End of November 2024" sentinel assumed every edition opens with an "End of November" stub section. The 2023-2024 edition has none (Advent Sunday 2023 fell on 3 December, so the compiler folded the two tail days into the "December 2023" header directly) -- the generalised detector anchors on the body's own "ORDO" title line instead, verified unique in all three known editions and distinct from the Table of Contents' lowercase "Ordo" entries. Extracts test/fixtures/lms-ordo-2023-2024.sexp (397 rows) and lms-ordo-2025-2026.sexp (399 rows), each with a provenance header carrying its own SHA-256, source citation, and a per-edition characterisation record: five opposite-prediction Creed probes, independently re-verified against this run's own extracted rows (a failed probe is now a hard die, not a printed claim). The 2025-2026 edition needed a different sharp II-class pairing than 2024-2025's Joachim/Stephen one, because Joachim (16 August) is impeded by a Sunday that year -- recorded in the fixture header, not silently swapped. test/test_lms_ordo.ml is refactored into a parameterised make_suite, instantiated once per edition; every count Task 6 hardcoded against the single 2024-2025 window is now a per-edition parameter, several of which turned out to differ once measured (BVM-Saturday population 12/14/13, Ascension-week exclusion 1/3/2). Two mapping gaps surfaced only by the new windows and fixed here (test-side, not colitur): Low Sunday reached via Preceding_sunday for the first time (absent from 2024-2025's own window), and the Ascension-week exclusion was wrongly keyed off week number alone -- Rogation Monday also resumes week 6's Sunday but falls BEFORE Ascension, not after, and the Ordo prints the ordinary Sunday text there. Re-bounded by date, against Ascension and Pentecost. Two genuine divergences surfaced in the 2023-2024 window and are allow-listed (L3, L4) rather than fixed, per this task's no-lib-changes scope: - L3 (verdict ordo): colitur has no bissextile calendar rule. The 1962 Missal's own calendarium moves St Matthias from 24 to 25 February in leap years (docs/research/LT.txt:5011); colitur keeps him on the 24th every year. Domain-wide upper bound measured with a throwaway sweep: 1,650 of 2,041 leap years in 1583-9999 currently observe him there. - L4 (verdict open): Christmas Eve falling on the 4th Sunday of Advent (2023-12-24, roughly 1 year in 7). colitur says the Creed is said, reading RG 475(a)'s Sunday clause; the Ordo says it is not. RG 30(a)'s own "locum tenet ... nulla fit commemoratio" for this exact vigil reads like RG 16(a)'s Feast-of-the-Lord-on-Sunday shape, which colitur already treats as Creed-preserving -- but RG 475(a) names "festo" specifically, and a vigil is its own liturgical-day category (RG 35), so the counter-reading is real too. Left open rather than adjudicated. All 630 tests green (dune test), 631 with the exhaustive sweep. Claude-Session: https://claude.ai/code/session_017ZBxCCRM2ojnBupp3SBxV9 --- data/ef/expected-divergences-lms.sexp | 54 +- test/dune | 2 + test/fixtures/lms-ordo-2023-2024.sexp | 1507 ++++++++++++++++++++++++++++++++ test/fixtures/lms-ordo-2025-2026.sexp | 1511 +++++++++++++++++++++++++++++++++ test/test_colitur.ml | 4 +- test/test_lms_ordo.ml | 825 +++++++++--------- tools/extract_lms_ordo.ml | 251 ++++-- 7 files changed, 3672 insertions(+), 482 deletions(-) create mode 100644 test/fixtures/lms-ordo-2023-2024.sexp create mode 100644 test/fixtures/lms-ordo-2025-2026.sexp (limited to 'test/dune') diff --git a/data/ef/expected-divergences-lms.sexp b/data/ef/expected-divergences-lms.sexp index e327419..3850fd5 100644 --- a/data/ef/expected-divergences-lms.sexp +++ b/data/ef/expected-divergences-lms.sexp @@ -1,6 +1,11 @@ ; data/ef/expected-divergences-lms.sexp -- Task 6 (2026-08-21-colitur- ; celebrant-rubrics-phase1)'s cited allow-list for the LMS Ordo comparison -; (test/test_lms_ordo.ml), fixture window 2024-11-27..2025-12-31. +; (test/test_lms_ordo.ml). Extended by the Witnesses task (2026-08-22, +; same phase) from the single 2024-2025 window (2024-11-27..2025-12-31) +; to three: 2023-2024 (2023-12-01..2024-12-31) and 2025-2026 +; (2025-11-28..2026-12-31) joined it. L3/L4 below fired only in the +; 2023-2024 window -- neither recurs in the other two, a fact worth +; keeping visible rather than merging away (see [expected_rows] on each). ; ; A SEPARATE file from data/ef/expected-divergences.sexp (the lectio ; allow-list) and data/ef/expected-divergences-missalemeum.sexp (the @@ -96,15 +101,44 @@ ; shape as the Christmastide "infra octavam Nativitatis" entries ; data/ef/lectionary.sexp already carries directly rather than resolving ; through this fallback -- a lectionary-data change out of a fix round's -; own scope. test/test_lms_ordo.ml's own -; [expected_preceding_sunday_override] excludes exactly these two -; (season, week) pairs from its general mapping, and -; [test_formulary_override_matches] asserts the excluded population is -; exactly 3 real days, all showing "Mass of the Ascension", so a change -; to this population (a fourth day, a different Ordo string) would be -; caught rather than silently absorbed. +; own scope. test/test_lms_ordo.ml's own [is_after_ascension] excludes +; this population from the general mapping (bounded ABOVE by Pentecost, +; not merely "later than Ascension" -- see its own citation, corrected +; during the Witnesses task after a first version manufactured 8 false +; failures by matching any later date in the same civil year), and +; [test_formulary_override_matches] asserts its exact size per window. +; +; CORRECTED (Witnesses task, 2026-08-22): this note previously said "exactly +; 3 real days" as though that were a universal count. Extending the +; comparison to 2023-2024 and 2025-2026 showed it is not -- the population +; depends on which OTHER days that particular year's Ascension-adjacent +; week happen to have their own competing propers (a saint, a vigil), so +; it varies year to year: 3 in 2024-2025, 1 in 2023-2024 (only 30 May 2024 +; -- Rogation Monday, 6 May 2024, is BEFORE Ascension and correctly resumes +; the ordinary "5th Sunday after Easter" instead, once the exclusion's own +; date comparison was corrected to test "after Ascension AND before +; Pentecost" rather than "week 6 or 7"), 2 in 2025-2026. All three counts +; measured directly, all showing "Mass of the Ascension", none unexplained. ; ; Domain-wide count: unmeasured -- "which feria is inside Ascension's own ; after-feast period" is not a distinct predicate anywhere in this -; codebase to sweep on. Structurally recurs every year, so on the order -; of 3 days/year x domain years, not merely 3 total. +; codebase to sweep on. Structurally recurs every year, though the exact +; per-year count is now known to vary (1-3 in the three years measured), +; not a flat "3 days/year". + +; L3 -- OPEN, colitur's OWN genuine gap, found extending this suite to the +; 2023-2024 window (Witnesses task, 2026-08-22). Fired once: 2024-02-24. +((id L3) + (citation "The Missale Romanum's own CALENDARIUM table, February, footnote (docs/research/LT.txt:5011-5013, the Missal's printed calendar pages, not the numbered Rubricae Generales chapters): \"In anno bissextili mensis februarius est dierum 29, et festum S. Matthiae celebratur die 25 februarii, ac festum S. Gabrielis a Virgine perdolente 28 februarii, et bis dicitur sexto calendas, id est die 24 et die 25\" -- in a leap year February has 29 days, and the feast of St Matthias is kept on 25 February (not 24), with 24 and 25 February BOTH called \"the 6th kalends\"; St Gabriel of Our Lady of Sorrows (ordinarily 27 February) shifts to 28 February by the same rule. This bissextile shift is not RG-numbered (it is a calendarium footnote, not a Rubricae Generales paragraph) and is NOT scan-verified in this session -- only the LT.txt transcription was checked; scan1.txt/scan2.txt were searched for \"bissext\"/\"Matth\" and turned up only the unrelated Golden-Number/dominical-letter passage, not this specific calendarium footnote, so this citation rests on the transcription alone.") + (verdict ordo) + (note "colitur has NO bissextile-shift rule anywhere (grepped lib/rites/rite_ef/*.ml and data/ef/*.sexp for \"bissext\"/\"leap\": zero hits outside a code comment naming the saint, and the rules-register.md itself is silent on it too) -- St Matthias stays fixed at 24 February every year, leap or not. 2024 is a leap year: colitur's own [matthias] entry (Class2, an Apostle, RG91 entry 16 -- verified from the table itself to genuinely OUTRANK entry 18's privileged Ember-Saturday-of-Lent feria, so colitur's RANKING logic is not at fault here) WINS 24 February 2024 outright in colitur's output, correctly saying the Creed per RG475(e)'s Apostle clause. The Ordo shows no St Matthias anywhere near this date at all: 24 February 2024 is titled plainly \"EMBER SATURDAY of LENT\" (No Cr) and 25 February 2024 (a Sunday, 2nd Sunday in Lent, I class) is titled plainly \"2nd SUNDAY in LENT\" (Cr, but via RG475(a)'s own Sunday clause, not RG475(e)) -- consistent with Matthias having correctly MOVED to the 25th and then lost outright to the I-class Sunday there (RG91 entry 6 over entry 16), never even surviving as a commemoration (an I-class Sunday's own admission cap, RG111, is tight enough to exclude an ordinary II-class saint entirely -- the same shape already established for RG16(a)-adjacent cases elsewhere in this project). Both the 24th and 25th sides of the Ordo's silence are explained by ONE root cause (the missing shift), not two independent gaps -- a coherent, single-cause account, not a coincidence. BLAST RADIUS, roughly measured (a throwaway domain sweep, tools/probe_matthias.ml, run once for this task and not committed): of 2 041 leap years in 1583-9999, colitur observes [matthias] on 24 February in 1 650 of them -- an UPPER BOUND on how many years this gap could affect (some of those 1 650 years may see IDENTICAL final output either way, e.g. if Matthias would also win on the 25th against whatever competes there that year; a precise count needs the shift actually implemented, which is out of this task's own no-lib-changes scope). The Gabriel/27-28 February sibling shift is not witnessed by this fixture at all (no divergence on either date in this window) but is the same root cause and would need the same fix.") + (expected_rows 1)) + +; L4 -- OPEN, adjudicated FOR colitur (a defensible primary-source reading, +; not a fix confirmed against the Ordo -- the Ordo's own contrary reading is +; also textually arguable, see below). Fired once: 2023-12-24. +((id L4) + (citation "RG 30(a) (Caput V, De Vigiliis, docs/research/LT.txt:959-961): \"vigilia Nativitatis Domini quae, IN OCCURRENTIA, locum tenet dominicae IV Adventus, de qua, proinde, NULLA FIT COMMEMORATIO\" -- the Vigil of the Nativity, when it occurs [on a Sunday], TAKES THE PLACE of the 4th Sunday of Advent, of which, accordingly, no commemoration is made -- the identical \"locum tenet ... nulla fit commemoratio\" shape RG16(a) uses for a Feast of the Lord occurring on a II-class Sunday, which colitur already implements and which RG475(a) explicitly extends the Creed to (\"in qualibet dominica, etsi eius Officium alicui festo locum cedat\").") + (verdict open) + (note "2023-12-24 (the 4th Sunday of Advent AND Christmas Eve, a genuinely rare coincidence -- roughly 1 year in 7 -- absent from both the 2024-2025 and 2025-2026 windows, where Christmas Eve falls on a Tuesday and a Wednesday respectively). colitur says the Creed IS said (true), reading [temporal]'s own weekday (Sunday) per RG475(a)'s clause, positioned ahead of the vigil-exclusion check in {!Rite_ef.Rubrics_ef.creed} -- unconditionally, the same way it already does for RG16(a)'s Feast-of-the-Lord case. The Ordo says \"No Gl No Cr\" for this date. ADJUDICATED FOR COLITUR, not merely left open by default: RG30(a)'s own \"locum tenet ... nulla fit commemoratio\" language is textually closer to RG16(a) (which colitur already treats as Creed-preserving) than to an ordinary vigil superseding a Sunday -- the Vigil does not merely WIN THE DAY, it takes the SUNDAY'S OWN IDENTITY, the same shape RG475(a) was written to reach. The COUNTER-reading is real and not dismissed here: RG475(a)'s own text says \"locum cedat ... festo\" (gives way to a FEAST), and RG35 (Caput VI) classifies feria/vigilia/festum as three distinct liturgical-day categories -- a strict textual reading could confine 475(a)'s override to FEAST-displacement only, leaving a VIGIL-displaced Sunday to fall through to the general vigil exclusion (476, via RG33's own \"a vigil is a distinct category\" reasoning already coded elsewhere in {!Rite_ef.Rubrics_ef.creed}). Left OPEN rather than closed on this task's own authority: adjudicating scripture-grade primary-source questions is out of scope for a witness-wiring task, and the two readings are both defensible. Not fixable inside this task's own no-lib-changes constraint regardless of which reading eventually wins.") + (expected_rows 1)) diff --git a/test/dune b/test/dune index 44318a2..17865c4 100644 --- a/test/dune +++ b/test/dune @@ -17,7 +17,9 @@ fixtures/missalemeum-ef-2026-2027.txt fixtures/missalemeum-ef-2038.txt fixtures/missalemeum-ef-2035.txt + fixtures/lms-ordo-2023-2024.sexp fixtures/lms-ordo-2024-2025.sexp + fixtures/lms-ordo-2025-2026.sexp ../templates/ef/ordo.tex ../templates/ef/ordo.ms ../templates/ef/ordo.html diff --git a/test/fixtures/lms-ordo-2023-2024.sexp b/test/fixtures/lms-ordo-2023-2024.sexp new file mode 100644 index 0000000..9261ce7 --- /dev/null +++ b/test/fixtures/lms-ordo-2023-2024.sexp @@ -0,0 +1,1507 @@ +; test/fixtures/lms-ordo-2023-2024.sexp -- Witnesses task (2026-08-22-colitur-celebrant-rubrics-phase1), +; extending Task 6's single LMS fixture (2024-2025) to three editions of +; the Latin Mass Society's own printed Ordo for England & Wales -- a +; lineage independent of Divinum Officium/missalemeum/lectio (layers 3-4) +; and of the electronic LT.txt transcription (layers 1-2/5): a physically +; printed, professionally-compiled liturgical calendar with its own ISBN. +; +; Generator: tools/extract_lms_ordo.ml -- do not hand-edit; re-run against +; a fresh pdftotext dump and commit the diff instead. +; +; Source: "The Ordo 2023-2024", compiled by Peter Day-Milne, The Latin +; Mass Society, 9 Mallow Street, London EC1Y 8RQ (title page and +; colophon, verified directly against the PDF's own extracted text -- +; ISBN 978-1-7392096-2-9, Copyright (c) The Latin Mass Society, UK 2023). +; PDF metadata: Author "Peter Day-Milne", Producer "LibreOffice 6.4", CreationDate 2023-11-01, 140 pages. +; URL (identified 2026-08-22 via web search matching the PDF's own edition year to the publisher's own hosting path; NOT independently re-downloaded and byte-compared in this session -- recorded honestly rather than presented as verified): +; https://lms.org.uk/sites/default/files/u5374/ordo_2023-2024_2.2_final.pdf +; The local PDF (docs/research/ordo/lms-ordo-2023-2024.pdf) is gitignored +; (CLAUDE.md: "docs/ is gitignored"), so this header, not git, is this +; fixture's only record of where it came from. +; SHA-256 of docs/research/ordo/lms-ordo-2023-2024.pdf: 805a021bab246212c09a91706a04f4834fba052104de091b2fc5ed77c455bbba +; Extracted (UTC): 2026-08-22 +; Exact commands: +; pdftotext -layout docs/research/ordo/lms-ordo-2023-2024.pdf /tmp/lms.txt +; dune exec tools/extract_lms_ordo.exe -- /tmp/lms.txt \ +; docs/research/ordo/lms-ordo-2023-2024.pdf test/fixtures/lms-ordo-2023-2024.sexp +; +; COVERAGE: 397 day-rows, 2023-12-01 through 2024-12-31 (starting 1 December 2023 (this edition carries NO "End of November" stub section at all -- Advent Sunday 2023 fell on 3 December, so only 2 tail days of the prior liturgical year remained, and the compiler folded them directly into the "December 2023" header instead of giving them their own mini-section; see CHARACTERISATION below), +; through the day before a malformed trailing entry the extractor +; deliberately stops before -- see CHARACTERISATION below). +; +; CHARACTERISATION FINDINGS (Step 1, non-negotiable per the task brief -- +; the extraordinaryform.org Ordo silently omitted St Lawrence's vigil on +; EVERY date it covered, which nearly produced a false corroboration +; during the RG 33 work; every LMS edition, including this one, is probed +; with the same discipline before a single divergence is adjudicated): +; +; 1. Gl/Cr are printed PER MASS-OPTION, not per day (confirmed again for +; THIS edition: it carries many more Gl/Cr pairs than day-rows, because +; every diocesan variant repeats its own "Gl ... Cr ... Pr of ..." +; line). This extractor resolves the day's OWN office by taking the +; FIRST Gl/Cr pair in reading order, which the source's own layout +; guarantees is the universal entry's (diocesan variants are always +; introduced by a colon-terminated diocese-list line that comes AFTER +; the universal block, never before -- checked structurally, not +; assumed, in every sampled block during development, this edition +; included). +; +; 2. OPPOSITE-PREDICTION PROBES against Rite_ef.Rubrics_ef.creed (RG +; 475-476), RE-CHECKED BY THIS TOOL RUN (not merely copied from a prior +; edition's findings) before a single row of this fixture is trusted -- +; the technique CLAUDE.md records as the one that catches a source +; silently omitting the very thing it is meant to witness. This run's +; own extracted [rows] were checked against every one of the following +; before this header was even written; a failure here is a hard [die], +; not a printed claim: +; 2023-12-03 (Advent Sunday, RG 475(a)) -> TRUE +; 2023-12-04 (St Peter Chrysologus, III class, ordinary Advent day, RG 476(b)/(d)) -> FALSE +; 2023-12-26 (St Stephen, II class, inside the Nativity octave, RG 475(d)) -> TRUE +; 2024-08-15 (the Assumption, I class, RG 475(b)) -> TRUE +; 2024-08-16 (St Joachim, II class, no Lord/BVM/apostle clause applies, RG 476(b)) -> FALSE +; All 5 predictions confirmed, both directions (TRUE and FALSE each +; independently witnessed) -- this edition is discriminating, not a +; constant, on the Creed. +; +; 3. The BVM-Saturday roman numeral (I-V, "Missae de sancta Maria in +; sabbato", RG 309(a)) is anchored by WHOLE-LINE match against the five +; literal strings below, NEVER by substring search: "V Mass of BVM" is +; a substring of "IV Mass of BVM", so a naive `contains` check +; misreads every fourth-Mass day as the fifth (the coordinator's own +; misreading, recorded and retracted in commit 27b07b4 before Task 6 +; existed; the same anchoring logic runs unchanged for every edition). +; +; 4. SCOPE EXCLUDED, quantified, not silently dropped: +; - Diocesan variants: present on 159 of 397 days (40.1%) -- their own +; text is read only far enough to set [has_diocesan_variant], +; never compared, because colitur computes the UNIVERSAL General +; Roman Calendar only, with no diocesan overlay loaded. +; - The single malformed trailing entry ("...The OCTAVE DAY of the +; NATIVITY..." with a bare 4-digit token where a weekday+day-number +; pair belongs) is excluded outright: the extractor's own stop +; marker (a line whose first token is a bare 4-digit token) halts +; the scan before it. CONFIRMED IDENTICAL, word for word, across +; ALL FOUR known editions of this publisher's Ordo (2023-2024, +; 2024-2025, 2025-2026, and the 2024-2025 fixture's own prior +; header) -- always the literal stray year token "2025", regardless +; of which edition or which real trailing year it should read: a +; stale copy-paste leftover the compiler's own master document +; carries forward unedited release to release (even the 2024-2025 +; PDF's own tail page footer nearby still reads "Latin Mass Society +; Ordo 2021-2022"), not something specific to this edition. +; - Front matter, the Abbreviations/Rubrical-Primer/Breviary sections, +; and the "When may I say...?"/Appendix tail are never scanned at +; all (the extractor's own start/stop markers bound it to the Ordo +; proper). +(((date 2023-12-01) (weekday Fri) (title "FERIA IV Cl G \226\128\161 SH") + (formulary_override ("Mass of 24th & Last Sunday After Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2023-12-02) (weekday Sat) + (title "St BIBIANA V M III Cl R # IH JCHP") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-03) (weekday Sun) (title "ADVENT SUNDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2023-12-04) (weekday Mon) + (title "St PETER CHRYSOLOGUS B C D III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2023-12-05) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ("Mass of Advent Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2023-12-06) (weekday Wed) (title "St NICOLAS B C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-07) (weekday Thu) + (title "St AMBROSE B C D III Cl (Priv.) W JCHP*") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-08) (weekday Fri) + (title "The IMMACULATE CONCEPTION of the BVM I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2023-12-09) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ("Mass of Advent Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2023-12-10) (weekday Sun) (title "2nd SUNDAY of ADVENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2023-12-11) (weekday Mon) + (title "St DAMASUS I P C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2023-12-12) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2023-12-13) (weekday Wed) (title "St LUCY V M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-14) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2023-12-15) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2023-12-16) (weekday Sat) (title "St EUSEBIUS B M III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-17) (weekday Sun) + (title "3rd SUNDAY of ADVENT (GAUDETE SUNDAY) I Cl V/Rose") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2023-12-18) (weekday Mon) (title "FERIA II Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-19) (weekday Tue) (title "FERIA II Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-20) (weekday Wed) + (title "EMBER WEDNESDAY of ADVENT II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-21) (weekday Thu) (title "St THOMAS \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2023-12-22) (weekday Fri) (title "EMBER FRIDAY of ADVENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-23) (weekday Sat) (title "EMBER SATURDAY of ADVENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-24) (weekday Sun) + (title "VIGIL of The NATIVITY of OUR LORD I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2023-12-25) (weekday Mon) (title "The NATIVITY of OUR LORD I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2023-12-26) (weekday Tue) + (title "St STEPHEN \194\167 Protomartyr II Cl R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2023-12-27) (weekday Wed) + (title "St JOHN \194\167 Ap Evangelist II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2023-12-28) (weekday Thu) (title "The HOLY INNOCENTS MM II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2023-12-29) (weekday Fri) + (title "5th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2023-12-30) (weekday Sat) + (title "6th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2023-12-31) (weekday Sun) + (title "SUNDAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-01-01) (weekday Mon) + (title "The OCTAVE DAY of the NATIVITY of the LORD I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-01-02) (weekday Tue) + (title "The MOST HOLY NAME of JESUS II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-01-03) (weekday Wed) (title "FERIA IV Cl W \226\128\160") + (formulary_override + ("Mass of the Octave Day of the Nativity of the Lord")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-01-04) (weekday Thu) (title "FERIA IV Cl W \226\128\160 JCHP") + (formulary_override + ("Mass of the Octave Day of the Nativity of the Lord")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-05) (weekday Fri) (title "FERIA IV Cl W \226\128\160 SH") + (formulary_override + ("Mass of the Octave Day of the Nativity of the Lord")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-06) (weekday Sat) (title "The EPIPHANY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-01-07) (weekday Sun) + (title "The HOLY FAMILY of JESUS, MARY AND JOSEPH II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-01-08) (weekday Mon) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of 1st Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-09) (weekday Tue) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of 1st Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-10) (weekday Wed) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of 1st Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-11) (weekday Thu) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of 1st Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-12) (weekday Fri) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of 1st Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-01-13) (weekday Sat) (title "The BAPTISM of OUR LORD II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-01-14) (weekday Sun) + (title "2nd SUNDAY after the EPIPHANY II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-01-15) (weekday Mon) + (title "St PAUL the FIRST HERMIT C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-16) (weekday Tue) (title "St MARCELLUS I P M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-01-17) (weekday Wed) (title "St ANTHONY Ab III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-18) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 2nd Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-19) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 2nd Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-01-20) (weekday Sat) + (title "SS FABIAN P & SEBASTIAN M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-21) (weekday Sun) + (title "3rd SUNDAY after the EPIPHANY II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-01-22) (weekday Mon) + (title "SS VINCENT & ANASTASIUS MM III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-23) (weekday Tue) + (title "St RAYMUND of PENAFORT C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-24) (weekday Wed) (title "St TIMOTHY B M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-25) (weekday Thu) + (title "The CONVERSION of St PAUL \194\167 Ap III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-26) (weekday Fri) (title "St POLYCARP B M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-27) (weekday Sat) + (title "St JOHN CHRYSOSTOM B C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-28) (weekday Sun) (title "SEPTUAGESIMA SUNDAY II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-01-29) (weekday Mon) + (title "St FRANCIS de SALES B C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-30) (weekday Tue) (title "St MARTINA V M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-01-31) (weekday Wed) (title "St JOHN BOSCO C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-01) (weekday Thu) + (title "St IGNATIUS \194\167 B M III Cl (Priv.) R JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-02-02) (weekday Fri) + (title "The PURIFICATION of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-02-03) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160 IH JCHP*") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-02-04) (weekday Sun) (title "SEXAGESIMA SUNDAY II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-02-05) (weekday Mon) + (title "St AGATHA \194\167 V M III Cl (Priv.) R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-06) (weekday Tue) (title "St TITUS B C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-07) (weekday Wed) (title "St ROMUALD Ab III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-08) (weekday Thu) (title "St JOHN of MATHA C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-09) (weekday Fri) + (title "St CYRIL of ALEXANDRIA B C D III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-02-10) (weekday Sat) (title "St SCHOLASTICA V III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-02-11) (weekday Sun) (title "QUINQUAGESIMA SUNDAY II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-02-12) (weekday Mon) + (title "The SEVEN HOLY FOUNDERS of the ORDER of the SERVANTS of the") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-13) (weekday Tue) (title "FERIA IV Cl V \226\128\161") + (formulary_override ("Mass of Quinquagesima Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-02-14) (weekday Wed) (title "ASH WEDNESDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-15) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-16) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-02-17) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-02-18) (weekday Sun) (title "1st SUNDAY in LENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-02-19) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-20) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-21) (weekday Wed) (title "EMBER WEDNESDAY of LENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-22) (weekday Thu) + (title "The CHAIR of St PETER \194\167 Ap II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-02-23) (weekday Fri) (title "EMBER FRIDAY of LENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-02-24) (weekday Sat) (title "EMBER SATURDAY of LENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-25) (weekday Sun) (title "2nd SUNDAY in LENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-02-26) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-27) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-02-28) (weekday Wed) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-02-29) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-01) (weekday Fri) (title "FERIA III Cl V SH") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-02) (weekday Sat) (title "FERIA III Cl V IH JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-03) (weekday Sun) (title "3rd SUNDAY in LENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-03-04) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-05) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-06) (weekday Wed) + (title "SS PERPETUA \194\167 & FELICITY \194\167 MM III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-07) (weekday Thu) + (title "St THOMAS AQUINAS C D III Cl (Priv.) W JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-08) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-09) (weekday Sat) + (title "St FRANCES of ROME W III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-10) (weekday Sun) (title "4th SUNDAY in LENT I Cl V/Rose") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-03-11) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-12) (weekday Tue) + (title "St GREGORY I P C D III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-13) (weekday Wed) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-14) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-15) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-16) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-17) (weekday Sun) (title "PASSION SUNDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-03-18) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-19) (weekday Tue) + (title "St JOSEPH \194\167 SPOUSE of the BVM C, PATRON of the UNIVERSAL") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-03-20) (weekday Wed) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-03-21) (weekday Thu) (title "St BENEDICT Ab III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-22) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-23) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-24) (weekday Sun) (title "PALM SUNDAY I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-03-25) (weekday Mon) (title "MONDAY of HOLY WEEK I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-26) (weekday Tue) (title "TUESDAY of HOLY WEEK I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-27) (weekday Wed) (title "WEDNESDAY of HOLY WEEK I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-28) (weekday Thu) (title "MAUNDY THURSDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-29) (weekday Fri) (title "GOOD FRIDAY I Cl B") + (formulary_override ()) (bvm_numeral ()) (gloria ()) (creed ()) + (has_diocesan_variant false)) + ((date 2024-03-30) (weekday Sat) (title "HOLY SATURDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-03-31) (weekday Sun) (title "EASTER I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-01) (weekday Mon) (title "EASTER MONDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-02) (weekday Tue) (title "EASTER TUESDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-03) (weekday Wed) (title "EASTER WEDNESDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-04) (weekday Thu) (title "EASTER THURSDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-05) (weekday Fri) (title "EASTER FRIDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-06) (weekday Sat) + (title "EASTER SATURDAY (SABBATO in ALBIS) I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-07) (weekday Sun) (title "LOW SUNDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-08) (weekday Mon) + (title "The ANNUNCIATION of the BVM I Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-04-09) (weekday Tue) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of Low Sunday")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-04-10) (weekday Wed) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of Low Sunday")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-04-11) (weekday Thu) (title "St LEO P C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-04-12) (weekday Fri) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of Low Sunday")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-04-13) (weekday Sat) (title "St HERMENEGILD M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-04-14) (weekday Sun) (title "2nd SUNDAY after EASTER II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-04-15) (weekday Mon) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-04-16) (weekday Tue) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-04-17) (weekday Wed) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-04-18) (weekday Thu) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-04-19) (weekday Fri) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-04-20) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160") + (formulary_override ("IV Mass of BVM")) (bvm_numeral (IV)) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-04-21) (weekday Sun) (title "3rd SUNDAY after EASTER II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-04-22) (weekday Mon) + (title "SS SOTER & CAIUS PP MM III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-04-23) (weekday Tue) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 3rd Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-04-24) (weekday Wed) + (title "St FIDELIS of SIGMARINGEN M III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-04-25) (weekday Thu) + (title "THE GREATER LITANIES. St MARK Evangelist II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-04-26) (weekday Fri) + (title "St CLETUS & MARCELLINUS PP MM III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-04-27) (weekday Sat) (title "St PETER CANISIUS C D III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-04-28) (weekday Sun) (title "4th SUNDAY after EASTER II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-04-29) (weekday Mon) (title "St PETER M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-04-30) (weekday Tue) + (title "St CATHERINE of SIENNA V III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-05-01) (weekday Wed) + (title "St JOSEPH \194\167 the WORKER, SPOUSE of the BVM C I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-02) (weekday Thu) + (title "St ATHANASIUS B C D III Cl (Priv.) W JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-05-03) (weekday Fri) (title "FERIA IV Cl W \226\128\161 SH") + (formulary_override ("Mass of 4th Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-05-04) (weekday Sat) + (title "St MONICA W III Cl (Priv.) W IH JCHP*") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-05-05) (weekday Sun) (title "5th SUNDAY after EASTER II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-05-06) (weekday Mon) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 5th Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-05-07) (weekday Tue) (title "St STANISLAUS B M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-05-08) (weekday Wed) (title "VIGIL of The ASCENSION II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-05-09) (weekday Thu) (title "The ASCENSION I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-10) (weekday Fri) (title "St ANTONINUS B C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-05-11) (weekday Sat) + (title "SS PHILIP \194\167 & JAMES \194\167 App II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-12) (weekday Sun) + (title "SUNDAY after the ASCENSION II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-13) (weekday Mon) + (title "St ROBERT BELLARMINE B C D III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-05-14) (weekday Tue) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of the Ascension")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-05-15) (weekday Wed) + (title "St JOHN BAPTIST de la SALLE C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-05-16) (weekday Thu) (title "St UBALDUS B C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-05-17) (weekday Fri) (title "St PASCHAL BAYLON C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-05-18) (weekday Sat) (title "VIGIL of PENTECOST I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-05-19) (weekday Sun) (title "PENTECOST I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-20) (weekday Mon) (title "WHIT MONDAY I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-21) (weekday Tue) (title "WHIT TUESDAY I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-22) (weekday Wed) + (title "WHIT WEDNESDAY (EMBER DAY) I Cl R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-23) (weekday Thu) (title "WHIT THURSDAY I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-24) (weekday Fri) (title "WHIT FRIDAY (EMBER DAY) I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-25) (weekday Sat) (title "WHIT SATURDAY (EMBER DAY) I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-26) (weekday Sun) (title "The MOST HOLY TRINITY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-05-27) (weekday Mon) + (title "St BEDE the VENERABLE C D III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-05-28) (weekday Tue) (title "St AUGUSTINE B C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-05-29) (weekday Wed) + (title "St MARY MAGDALEN dei PAZZI V III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-05-30) (weekday Thu) (title "CORPUS CHRISTI I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-05-31) (weekday Fri) + (title "The BLESSED VIRGIN MARY, QUEEN II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-06-01) (weekday Sat) + (title "St ANGELA MERICI V III Cl W # IH JCHP") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-02) (weekday Sun) + (title "2nd SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-06-03) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-06-04) (weekday Tue) + (title "St FRANCIS CARACCIOLO C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-05) (weekday Wed) (title "St BONIFACE B M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-06) (weekday Thu) (title "St NORBERT B C III Cl W # JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-06-07) (weekday Fri) (title "The SACRED HEART of JESUS I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-06-08) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2024-06-09) (weekday Sun) + (title "3rd SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-06-10) (weekday Mon) (title "St MARGARET Q W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-06-11) (weekday Tue) (title "St BARNABAS Ap III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-06-12) (weekday Wed) + (title "St JOHN of SAN FACONDO C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-06-13) (weekday Thu) + (title "St ANTHONY of PADUA C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-14) (weekday Fri) + (title "St BASIL the GREAT B C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-15) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant false)) + ((date 2024-06-16) (weekday Sun) + (title "4th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-06-17) (weekday Mon) + (title "St GREGORY BARBARIGO B C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-18) (weekday Tue) + (title "St EPHREM the SYRIAN Deacon C D III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-06-19) (weekday Wed) + (title "St JULIANA FALCONIERI V III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-20) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 4th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-21) (weekday Fri) + (title "St ALOYSIUS GONZAGA C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-22) (weekday Sat) (title "St PAULINUS B C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-23) (weekday Sun) + (title "5th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-06-24) (weekday Mon) + (title "The NATIVITY of JOHN the BAPTIST \194\167 I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-06-25) (weekday Tue) (title "St WILLIAM Ab III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-26) (weekday Wed) + (title "SS JOHN & PAUL \194\167 MM III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-27) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 5th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-28) (weekday Fri) + (title "VIGIL of SS PETER \194\167 & PAUL \194\167 App II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-06-29) (weekday Sat) + (title "SS PETER \194\167 & PAUL \194\167 App I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-06-30) (weekday Sun) + (title "6th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-07-01) (weekday Mon) + (title "The MOST PRECIOUS BLOOD of OUR LORD JESUS CHRIST I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-07-02) (weekday Tue) + (title "The VISITATION of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-07-03) (weekday Wed) (title "St IRENAEUS B M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-04) (weekday Thu) (title "FERIA IV Cl G \226\128\161 JCHP") + (formulary_override ("Mass of 6th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-05) (weekday Fri) + (title "St ANTHONY MARY ZACCARIA C III Cl W # SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-06) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160 IH JCHP*") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant false)) + ((date 2024-07-07) (weekday Sun) + (title "7th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-07-08) (weekday Mon) (title "St ELIZABETH Q W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-09) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 7th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-10) (weekday Wed) + (title "The SEVEN HOLY BROTHERS MM & SS RUFINA & SECUNDA VV MM III") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-11) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 7th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-12) (weekday Fri) (title "St JOHN GUALBERTI Ab III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-13) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant false)) + ((date 2024-07-14) (weekday Sun) + (title "8th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-07-15) (weekday Mon) (title "St HENRY Emperor C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-16) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 8th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-17) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 8th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-18) (weekday Thu) + (title "St CAMILLUS de LELLIS C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-19) (weekday Fri) + (title "St VINCENT de PAUL C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-20) (weekday Sat) (title "St JEROME EMILIANI C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-21) (weekday Sun) + (title "9th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-07-22) (weekday Mon) + (title "St MARY MAGDALEN Penitent III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-23) (weekday Tue) (title "St APOLLINARIS B M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-24) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 9th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-25) (weekday Thu) (title "St JAMES \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-07-26) (weekday Fri) + (title "St ANNE MOTHER of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-27) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant false)) + ((date 2024-07-28) (weekday Sun) + (title "10th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-07-29) (weekday Mon) (title "St MARTHA V III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-07-30) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 10th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-07-31) (weekday Wed) (title "St IGNATIUS C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-01) (weekday Thu) (title "FERIA IV Cl G \226\128\161 JCHP") + (formulary_override ("Mass of 10th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-02) (weekday Fri) + (title "St ALPHONSUS MARIA LIGUORI B C D III Cl (Priv.) W SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-03) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160 IH JCHP*") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2024-08-04) (weekday Sun) + (title "11th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-08-05) (weekday Mon) + (title "The DEDICATION of St MARY of the SNOWS III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-06) (weekday Tue) + (title "The TRANSFIGURATION of OUR LORD JESUS CHRIST II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-08-07) (weekday Wed) (title "St CAJETAN C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-08) (weekday Thu) + (title "St JOHN MARY VIANNEY C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-09) (weekday Fri) + (title "VIGIL of St LAURENCE \194\167 M III Cl V #") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-10) (weekday Sat) (title "St LAURENCE \194\167 M II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-11) (weekday Sun) + (title "12th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-08-12) (weekday Mon) (title "St CLARE V III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-13) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 12th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-14) (weekday Wed) + (title "VIGIL of The ASSUMPTION of the BVM II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-15) (weekday Thu) (title "The ASSUMPTION of the BVM I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-08-16) (weekday Fri) + (title "St JOACHIM FATHER of the BVM C II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-17) (weekday Sat) (title "St HYACINTH C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-18) (weekday Sun) + (title "13th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-08-19) (weekday Mon) (title "St JOHN EUDES C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-20) (weekday Tue) (title "St BERNARD Ab D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-21) (weekday Wed) + (title "St JANE FRANCES FREMIOT de CHANTAL W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-22) (weekday Thu) + (title "The IMMACULATE HEART of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-08-23) (weekday Fri) (title "St PHILIP BENIZI C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-24) (weekday Sat) + (title "St BARTHOLOMEW \194\167 Ap II Cl R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-08-25) (weekday Sun) + (title "14th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-08-26) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 14th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-27) (weekday Tue) + (title "St JOSEPH CALASANCTIUS C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-08-28) (weekday Wed) + (title "St AUGUSTINE B C D III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-29) (weekday Thu) + (title "The BEHEADING of St JOHN the BAPTIST \194\167 III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-30) (weekday Fri) (title "St ROSE of LIMA V III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-08-31) (weekday Sat) (title "St RAYMUND NONNATUS C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-01) (weekday Sun) + (title "15th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-09-02) (weekday Mon) (title "St STEPHEN K C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-03) (weekday Tue) (title "St PIUS X P C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-04) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 15th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-05) (weekday Thu) + (title "St LAURENCE JUSTINIAN B C III Cl W # JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-06) (weekday Fri) (title "FERIA IV Cl G \226\128\161 SH") + (formulary_override ("Mass of 15th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-07) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160 IH JCHP*") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant false)) + ((date 2024-09-08) (weekday Sun) + (title "16th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-09-09) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 16th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-09-10) (weekday Tue) + (title "St NICOLAS of TOLENTINO C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-09-11) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 16th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-12) (weekday Thu) + (title "The MOST HOLY NAME of MARY III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-13) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 16th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-14) (weekday Sat) + (title "The EXALTATION of the HOLY CROSS II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-09-15) (weekday Sun) + (title "17th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-09-16) (weekday Mon) + (title + "SS CORNELIUS \194\167 P & CYPRIAN \194\167 B MM III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-17) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 17th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-09-18) (weekday Wed) + (title "EMBER WEDNESDAY of SEPTEMBER II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-09-19) (weekday Thu) + (title "St JANUARIUS B & COMPS MM III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-20) (weekday Fri) + (title "EMBER FRIDAY of SEPTEMBER II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-09-21) (weekday Sat) + (title "St MATTHEW \194\167 Ap Evangelist II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-09-22) (weekday Sun) + (title "18th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-09-23) (weekday Mon) (title "St LINUS P M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-24) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 18th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-25) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 18th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-26) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 18th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-09-27) (weekday Fri) + (title "SS COSMAS \194\167 & DAMIAN \194\167 MM III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-09-28) (weekday Sat) (title "St WENCESLAUS Duke M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-09-29) (weekday Sun) + (title "The DEDICATION of St MICHAEL Archangel I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-09-30) (weekday Mon) + (title "St JEROME Priest C D III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-01) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 19th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-10-02) (weekday Wed) + (title "The HOLY GUARDIAN ANGELS III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-10-03) (weekday Thu) + (title "St TERESA of the CHILD JESUS V III Cl (Priv.) W JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-04) (weekday Fri) + (title "St FRANCIS of ASSISI C III Cl (Priv.) W SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-05) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160 IH JCHP*") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2024-10-06) (weekday Sun) + (title "20th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-10-07) (weekday Mon) (title "The BVM of the ROSARY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-10-08) (weekday Tue) (title "St BRIDGET W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-09) (weekday Wed) (title "St JOHN LEONARDI C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-10) (weekday Thu) (title "St FRANCIS BORGIA C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-11) (weekday Fri) + (title "The MOTHERHOOD of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-10-12) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2024-10-13) (weekday Sun) + (title "21st SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-10-14) (weekday Mon) + (title "St CALLISTUS I P M III Cl (Priv.) R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-10-15) (weekday Tue) (title "St TERESA V III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-16) (weekday Wed) (title "St HEDWIG W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-17) (weekday Thu) + (title "St MARGARET MARY ALACOQUE V III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-18) (weekday Fri) (title "St LUKE Evangelist II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-10-19) (weekday Sat) + (title "St PETER of ALCANTARA C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-20) (weekday Sun) + (title "22nd SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-10-21) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 22nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-22) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 22nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-23) (weekday Wed) + (title "St ANTHONY MARY CLARET B C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-10-24) (weekday Thu) (title "St RAPHAEL Archangel III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-25) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 22nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-26) (weekday Sat) + (title "CELEBRATION of the BVM IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2024-10-27) (weekday Sun) (title "CHRIST the KING I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-10-28) (weekday Mon) + (title "SS SIMON \194\167 & JUDE \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-10-29) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 23rd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-30) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 23rd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-10-31) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 23rd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-01) (weekday Fri) (title "ALL SAINTS' DAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-11-02) (weekday Sat) (title "ALL SOULS' DAY I Cl B") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-03) (weekday Sun) + (title "4th SUNDAY remaining after the EPIPHANY II Cl G") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-11-04) (weekday Mon) (title "St CHARLES B C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-05) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 4th Sunday remaining after the Epiphany")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-06) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 4th Sunday remaining after the Epiphany")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-07) (weekday Thu) (title "FERIA IV Cl G \226\128\161 JCHP") + (formulary_override ("Mass of 4th Sunday remaining after the Epiphany")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-08) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 4th Sunday remaining after the Epiphany")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-09) (weekday Sat) + (title "The DEDICATION of the ARCHBASILICA of OUR SAVIOUR II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-11-10) (weekday Sun) + (title "5th SUNDAY remaining after the EPIPHANY II Cl G") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-11-11) (weekday Mon) (title "St MARTIN B C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-12) (weekday Tue) (title "St MARTIN I P M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-13) (weekday Wed) (title "St DIDACUS C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-14) (weekday Thu) (title "St JOSAPHAT B M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-15) (weekday Fri) + (title "St ALBERT the GREAT B C D III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-16) (weekday Sat) (title "St GERTRUDE V III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-17) (weekday Sun) + (title "6th SUNDAY remaining after the EPIPHANY II Cl G") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-11-18) (weekday Mon) + (title + "The DEDICATION of the BASILICAS of SS PETER & PAUL III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-19) (weekday Tue) (title "St ELIZABETH W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-20) (weekday Wed) (title "St FELIX de VALOIS C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-21) (weekday Thu) + (title "The PRESENTATION of the BVM III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-22) (weekday Fri) + (title "St CECILIA \194\167 V M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-23) (weekday Sat) + (title "St CLEMENT I \194\167 P M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-24) (weekday Sun) + (title "24th & LAST SUNDAY After PENTECOST II Cl G") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-11-25) (weekday Mon) (title "St CATHERINE V M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-26) (weekday Tue) (title "St SILVESTER Ab III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-27) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 24th & Last Sunday After Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-28) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 24th & Last Sunday After Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-11-29) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 24th & Last Sunday After Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-11-30) (weekday Sat) (title "St ANDREW \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-01) (weekday Sun) (title "ADVENT SUNDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-02) (weekday Mon) (title "St BIBIANA V M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-03) (weekday Tue) + (title "St FRANCIS XAVIER C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-04) (weekday Wed) + (title "St PETER CHRYSOLOGUS B C D III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-12-05) (weekday Thu) (title "FERIA III Cl V JCHP") + (formulary_override ("Mass of Advent Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-12-06) (weekday Fri) + (title "St NICOLAS B C III Cl (Priv.) W SH") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-07) (weekday Sat) + (title "St AMBROSE B C D III Cl (Priv.) W IH JCHP*") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-08) (weekday Sun) + (title "The IMMACULATE CONCEPTION of the BVM I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-09) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-12-10) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2024-12-11) (weekday Wed) + (title "St DAMASUS I P C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2024-12-12) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-12-13) (weekday Fri) (title "St LUCY V M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-14) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-12-15) (weekday Sun) + (title "3rd SUNDAY of ADVENT (GAUDETE SUNDAY) I Cl V/Rose") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-16) (weekday Mon) (title "St EUSEBIUS B M III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-17) (weekday Tue) (title "FERIA II Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-18) (weekday Wed) + (title "EMBER WEDNESDAY of ADVENT II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-19) (weekday Thu) (title "FERIA II Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-20) (weekday Fri) (title "EMBER FRIDAY of ADVENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-21) (weekday Sat) (title "St THOMAS \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-22) (weekday Sun) (title "4th SUNDAY of ADVENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-23) (weekday Mon) (title "FERIA II Cl V") + (formulary_override ("Mass of 4th Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2024-12-24) (weekday Tue) + (title "VIGIL of The NATIVITY of OUR LORD I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2024-12-25) (weekday Wed) (title "The NATIVITY of OUR LORD I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-26) (weekday Thu) + (title "St STEPHEN \194\167 Protomartyr II Cl R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-27) (weekday Fri) + (title "St JOHN \194\167 Ap Evangelist II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-28) (weekday Sat) (title "The HOLY INNOCENTS MM II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-12-29) (weekday Sun) + (title "SUNDAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2024-12-30) (weekday Mon) + (title "6th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2024-12-31) (weekday Tue) + (title "7th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false))) diff --git a/test/fixtures/lms-ordo-2025-2026.sexp b/test/fixtures/lms-ordo-2025-2026.sexp new file mode 100644 index 0000000..7f8947e --- /dev/null +++ b/test/fixtures/lms-ordo-2025-2026.sexp @@ -0,0 +1,1511 @@ +; test/fixtures/lms-ordo-2025-2026.sexp -- Witnesses task (2026-08-22-colitur-celebrant-rubrics-phase1), +; extending Task 6's single LMS fixture (2024-2025) to three editions of +; the Latin Mass Society's own printed Ordo for England & Wales -- a +; lineage independent of Divinum Officium/missalemeum/lectio (layers 3-4) +; and of the electronic LT.txt transcription (layers 1-2/5): a physically +; printed, professionally-compiled liturgical calendar with its own ISBN. +; +; Generator: tools/extract_lms_ordo.ml -- do not hand-edit; re-run against +; a fresh pdftotext dump and commit the diff instead. +; +; Source: "The Ordo 2025-2026", compiled by Peter Day-Milne, The Latin +; Mass Society, 9 Mallow Street, London EC1Y 8RQ (title page and +; colophon, verified directly against the PDF's own extracted text -- +; ISBN 978-1-7392096-5-0, Copyright (c) The Latin Mass Society, UK 2025). +; PDF metadata: Author "Peter Day-Milne", Producer "LibreOffice 25.2.6.2 (X86_64) / LibreOffice Community", CreationDate 2025-10-23, 146 pages. +; URL (NOT found by URL-pattern web search this session (unlike the 2023-2024 and 2024-2025 editions, no exact download link matching this PDF's own filename/version turned up under lms.org.uk/sites/default/files/u5374/; several near-miss candidates were checked and rejected -- none matched this PDF's own metadata) -- left honestly blank rather than guessed; the file was supplied locally to this session, not fetched by this tool): +; (not found -- see the note on this line) +; The local PDF (docs/research/ordo/lms-ordo-2025-2026.pdf) is gitignored +; (CLAUDE.md: "docs/ is gitignored"), so this header, not git, is this +; fixture's only record of where it came from. +; SHA-256 of docs/research/ordo/lms-ordo-2025-2026.pdf: 3d71ad56af3fc8d9c1b37515bf9d946025961f8ef415c3b92520b9de7661f8a3 +; Extracted (UTC): 2026-08-22 +; Exact commands: +; pdftotext -layout docs/research/ordo/lms-ordo-2025-2026.pdf /tmp/lms.txt +; dune exec tools/extract_lms_ordo.exe -- /tmp/lms.txt \ +; docs/research/ordo/lms-ordo-2025-2026.pdf test/fixtures/lms-ordo-2025-2026.sexp +; +; COVERAGE: 399 day-rows, 2025-11-28 through 2026-12-31 (starting 28 November 2025 ("End of November 2025", the same shape as the 2024-2025 edition -- Advent Sunday 2025 fell on 30 November, so only 3 tail days remained; note this excludes 27 November 2025, which the PRECEDING edition's own window (2024-2025, through 2025-12-31) already covers -- a one-day-short overlap between consecutive editions' own windows, not a gap or a bug in either extraction, +; through the day before a malformed trailing entry the extractor +; deliberately stops before -- see CHARACTERISATION below). +; +; CHARACTERISATION FINDINGS (Step 1, non-negotiable per the task brief -- +; the extraordinaryform.org Ordo silently omitted St Lawrence's vigil on +; EVERY date it covered, which nearly produced a false corroboration +; during the RG 33 work; every LMS edition, including this one, is probed +; with the same discipline before a single divergence is adjudicated): +; +; 1. Gl/Cr are printed PER MASS-OPTION, not per day (confirmed again for +; THIS edition: it carries many more Gl/Cr pairs than day-rows, because +; every diocesan variant repeats its own "Gl ... Cr ... Pr of ..." +; line). This extractor resolves the day's OWN office by taking the +; FIRST Gl/Cr pair in reading order, which the source's own layout +; guarantees is the universal entry's (diocesan variants are always +; introduced by a colon-terminated diocese-list line that comes AFTER +; the universal block, never before -- checked structurally, not +; assumed, in every sampled block during development, this edition +; included). +; +; 2. OPPOSITE-PREDICTION PROBES against Rite_ef.Rubrics_ef.creed (RG +; 475-476), RE-CHECKED BY THIS TOOL RUN (not merely copied from a prior +; edition's findings) before a single row of this fixture is trusted -- +; the technique CLAUDE.md records as the one that catches a source +; silently omitting the very thing it is meant to witness. This run's +; own extracted [rows] were checked against every one of the following +; before this header was even written; a failure here is a hard [die], +; not a printed claim: +; 2025-11-30 (Advent Sunday, RG 475(a)) -> TRUE +; 2025-12-01 (ordinary Advent feria, RG 476(b)/(d)) -> FALSE +; 2025-12-26 (St Stephen, II class, inside the Nativity octave, RG 475(d)) -> TRUE +; 2026-08-10 (St Laurence, II class martyr, no Lord/BVM/apostle clause applies, RG 476(b) -- St Joachim (16 August) is IMPEDED by a Sunday in this edition's own calendar (12th Sunday after Pentecost), so this edition needed a DIFFERENT sharp non-octave II-class pairing than the 2023-2024/2024-2025 editions used; a real, edition-specific finding, not an extraction quirk) -> FALSE +; 2026-08-15 (the Assumption, I class, RG 475(b)) -> TRUE +; All 5 predictions confirmed, both directions (TRUE and FALSE each +; independently witnessed) -- this edition is discriminating, not a +; constant, on the Creed. +; +; 3. The BVM-Saturday roman numeral (I-V, "Missae de sancta Maria in +; sabbato", RG 309(a)) is anchored by WHOLE-LINE match against the five +; literal strings below, NEVER by substring search: "V Mass of BVM" is +; a substring of "IV Mass of BVM", so a naive `contains` check +; misreads every fourth-Mass day as the fifth (the coordinator's own +; misreading, recorded and retracted in commit 27b07b4 before Task 6 +; existed; the same anchoring logic runs unchanged for every edition). +; +; 4. SCOPE EXCLUDED, quantified, not silently dropped: +; - Diocesan variants: present on 163 of 399 days (40.9%) -- their own +; text is read only far enough to set [has_diocesan_variant], +; never compared, because colitur computes the UNIVERSAL General +; Roman Calendar only, with no diocesan overlay loaded. +; - The single malformed trailing entry ("...The OCTAVE DAY of the +; NATIVITY..." with a bare 4-digit token where a weekday+day-number +; pair belongs) is excluded outright: the extractor's own stop +; marker (a line whose first token is a bare 4-digit token) halts +; the scan before it. CONFIRMED IDENTICAL, word for word, across +; ALL FOUR known editions of this publisher's Ordo (2023-2024, +; 2024-2025, 2025-2026, and the 2024-2025 fixture's own prior +; header) -- always the literal stray year token "2025", regardless +; of which edition or which real trailing year it should read: a +; stale copy-paste leftover the compiler's own master document +; carries forward unedited release to release (even the 2024-2025 +; PDF's own tail page footer nearby still reads "Latin Mass Society +; Ordo 2021-2022"), not something specific to this edition. +; - Front matter, the Abbreviations/Rubrical-Primer/Breviary sections, +; and the "When may I say...?"/Appendix tail are never scanned at +; all (the extractor's own start/stop markers bound it to the Ordo +; proper). +(((date 2025-11-28) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 24th & Last Sunday After Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-11-29) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2025-11-30) (weekday Sun) (title "ADVENT SUNDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2025-12-01) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ("Mass of Advent Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2025-12-02) (weekday Tue) (title "St BIBIANA V M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-03) (weekday Wed) + (title "St FRANCIS XAVIER C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-04) (weekday Thu) + (title "St PETER CHRYSOLOGUS B C D III Cl W # JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2025-12-05) (weekday Fri) (title "FERIA III Cl V SH") + (formulary_override ("Mass of Advent Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2025-12-06) (weekday Sat) + (title "St NICOLAS B C III Cl (Priv.) W IH JCHP*") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-07) (weekday Sun) (title "2nd SUNDAY of ADVENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2025-12-08) (weekday Mon) + (title "The IMMACULATE CONCEPTION of the BVM I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2025-12-09) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2025-12-10) (weekday Wed) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2025-12-11) (weekday Thu) + (title "St DAMASUS I P C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2025-12-12) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2025-12-13) (weekday Sat) (title "St LUCY V M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-14) (weekday Sun) + (title "3rd SUNDAY of ADVENT (GAUDETE SUNDAY) I Cl V/Rose") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2025-12-15) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-16) (weekday Tue) (title "St EUSEBIUS B M III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-17) (weekday Wed) + (title "EMBER WEDNESDAY of ADVENT II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-18) (weekday Thu) (title "FERIA II Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-19) (weekday Fri) (title "EMBER FRIDAY of ADVENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-20) (weekday Sat) (title "EMBER SATURDAY of ADVENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-21) (weekday Sun) (title "4th SUNDAY of ADVENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2025-12-22) (weekday Mon) (title "FERIA II Cl V") + (formulary_override ("Mass of 4th Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2025-12-23) (weekday Tue) (title "FERIA II Cl V") + (formulary_override ("Mass of 4th Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2025-12-24) (weekday Wed) + (title "VIGIL of The NATIVITY of OUR LORD I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2025-12-25) (weekday Thu) (title "The NATIVITY of OUR LORD I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2025-12-26) (weekday Fri) + (title "St STEPHEN \194\167 Protomartyr II Cl R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2025-12-27) (weekday Sat) + (title "St JOHN \194\167 Ap Evangelist II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2025-12-28) (weekday Sun) + (title "SUNDAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2025-12-29) (weekday Mon) + (title "5th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2025-12-30) (weekday Tue) + (title "6th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2025-12-31) (weekday Wed) + (title "7th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-01-01) (weekday Thu) + (title "The OCTAVE DAY of the NATIVITY of the LORD I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-01-02) (weekday Fri) (title "FERIA IV Cl W \226\128\160 SH") + (formulary_override + ("Mass of the Octave Day of the Nativity of the Lord")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-03) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160 IH JCHP") + (formulary_override ("II Mass of BVM")) (bvm_numeral (II)) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-01-04) (weekday Sun) + (title "The MOST HOLY NAME of JESUS II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-01-05) (weekday Mon) (title "FERIA IV Cl W \226\128\160") + (formulary_override + ("Mass of the Octave Day of the Nativity of the Lord")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-06) (weekday Tue) (title "The EPIPHANY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-01-07) (weekday Wed) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of the Epiphany")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-01-08) (weekday Thu) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of the Epiphany")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-01-09) (weekday Fri) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of the Epiphany")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-01-10) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("II Mass of BVM")) (bvm_numeral (II)) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-01-11) (weekday Sun) + (title "The HOLY FAMILY of JESUS, MARY AND JOSEPH II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-01-12) (weekday Mon) (title "FERIA IV Cl W \226\128\160") + (formulary_override ("Mass of 1st Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-01-13) (weekday Tue) (title "The BAPTISM of OUR LORD II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-01-14) (weekday Wed) (title "St HILARY B C D III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-01-15) (weekday Thu) + (title "St PAUL the FIRST HERMIT C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-16) (weekday Fri) (title "St MARCELLUS I P M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-01-17) (weekday Sat) (title "St ANTHONY Ab III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-18) (weekday Sun) + (title "2nd SUNDAY after the EPIPHANY II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-01-19) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 2nd Sunday after the Epiphany")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-01-20) (weekday Tue) + (title "SS FABIAN P & SEBASTIAN M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-21) (weekday Wed) + (title "St AGNES \194\167 V M III Cl (Priv.) R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-22) (weekday Thu) + (title "SS VINCENT & ANASTASIUS MM III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-23) (weekday Fri) + (title "St RAYMUND of PENAFORT C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-24) (weekday Sat) (title "St TIMOTHY B M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-25) (weekday Sun) + (title "3rd SUNDAY after the EPIPHANY II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-01-26) (weekday Mon) (title "St POLYCARP B M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-27) (weekday Tue) + (title "St JOHN CHRYSOSTOM B C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-28) (weekday Wed) (title "St PETER NOLASCO C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-29) (weekday Thu) + (title "St FRANCIS de SALES B C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-30) (weekday Fri) (title "St MARTINA V M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-01-31) (weekday Sat) (title "St JOHN BOSCO C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-01) (weekday Sun) (title "SEPTUAGESIMA SUNDAY II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-02-02) (weekday Mon) + (title "The PURIFICATION of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-02-03) (weekday Tue) + (title + "Today may be given the special blessing of candles; the special blessing of throats; and") + (formulary_override ("Mass of Septuagesima Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-02-04) (weekday Wed) (title "St ANDREW CORSINI B C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-02-05) (weekday Thu) + (title "St AGATHA \194\167 V M III Cl (Priv.) R JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-06) (weekday Fri) (title "St TITUS B C III Cl (Priv.) W SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-07) (weekday Sat) + (title "St ROMUALD Ab III Cl W # IH JCHP*") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-08) (weekday Sun) (title "SEXAGESIMA SUNDAY II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-02-09) (weekday Mon) + (title "St CYRIL of ALEXANDRIA B C D III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-02-10) (weekday Tue) (title "St SCHOLASTICA V III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-02-11) (weekday Wed) + (title "The APPARITION of the BVM IMMACULATE III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-02-12) (weekday Thu) + (title "The SEVEN HOLY FOUNDERS of the ORDER of the SERVANTS of the") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-13) (weekday Fri) (title "FERIA IV Cl V \226\128\161") + (formulary_override ("Mass of Sexagesima Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-02-14) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("III Mass of BVM")) (bvm_numeral (III)) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-02-15) (weekday Sun) (title "QUINQUAGESIMA SUNDAY II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-02-16) (weekday Mon) (title "FERIA IV Cl V \226\128\161") + (formulary_override ("Mass of Quinquagesima Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-02-17) (weekday Tue) (title "FERIA IV Cl V \226\128\161") + (formulary_override ("Mass of Quinquagesima Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-02-18) (weekday Wed) (title "ASH WEDNESDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-19) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-20) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-21) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-22) (weekday Sun) (title "1st SUNDAY in LENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-02-23) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-02-24) (weekday Tue) (title "St MATTHIAS Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-02-25) (weekday Wed) (title "EMBER WEDNESDAY of LENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-02-26) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-02-27) (weekday Fri) (title "EMBER FRIDAY of LENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-02-28) (weekday Sat) (title "EMBER SATURDAY of LENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-01) (weekday Sun) (title "2nd SUNDAY in LENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-03-02) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-03) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-04) (weekday Wed) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-05) (weekday Thu) (title "FERIA III Cl V JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-06) (weekday Fri) + (title "SS PERPETUA \194\167 & FELICITY \194\167 MM III Cl (Priv.) R SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-07) (weekday Sat) + (title "St THOMAS AQUINAS C D III Cl (Priv.) W IH JCHP*") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-08) (weekday Sun) (title "3rd SUNDAY in LENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-03-09) (weekday Mon) + (title "St FRANCES of ROME W III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-10) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-11) (weekday Wed) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-12) (weekday Thu) + (title "St GREGORY I P C D III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-13) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-14) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-15) (weekday Sun) (title "4th SUNDAY in LENT I Cl V/Rose") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-03-16) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-17) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-18) (weekday Wed) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-19) (weekday Thu) + (title "St JOSEPH \194\167 SPOUSE of the BVM C, PATRON of the UNIVERSAL") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-03-20) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-21) (weekday Sat) (title "St BENEDICT Ab III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-22) (weekday Sun) (title "PASSION SUNDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-03-23) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-24) (weekday Tue) + (title "St GABRIEL Archangel III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-25) (weekday Wed) + (title "The ANNUNCIATION of the BVM I Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-03-26) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-27) (weekday Fri) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-28) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-03-29) (weekday Sun) (title "PALM SUNDAY I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-03-30) (weekday Mon) (title "MONDAY of HOLY WEEK I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-03-31) (weekday Tue) (title "TUESDAY of HOLY WEEK I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-04-01) (weekday Wed) (title "WEDNESDAY of HOLY WEEK I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-04-02) (weekday Thu) (title "MAUNDY THURSDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-04-03) (weekday Fri) (title "GOOD FRIDAY I Cl B") + (formulary_override ()) (bvm_numeral ()) (gloria ()) (creed ()) + (has_diocesan_variant false)) + ((date 2026-04-04) (weekday Sat) (title "HOLY SATURDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-04-05) (weekday Sun) (title "EASTER I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-06) (weekday Mon) (title "EASTER MONDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-07) (weekday Tue) (title "EASTER TUESDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-08) (weekday Wed) (title "EASTER WEDNESDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-09) (weekday Thu) (title "EASTER THURSDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-10) (weekday Fri) (title "EASTER FRIDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-11) (weekday Sat) + (title "EASTER SATURDAY (SABBATO in ALBIS) I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-12) (weekday Sun) (title "LOW SUNDAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-13) (weekday Mon) (title "St HERMENEGILD M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-04-14) (weekday Tue) (title "St JUSTIN M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-04-15) (weekday Wed) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of Low Sunday")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-04-16) (weekday Thu) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of Low Sunday")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-04-17) (weekday Fri) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of Low Sunday")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-04-18) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("IV Mass of BVM")) (bvm_numeral (IV)) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-04-19) (weekday Sun) (title "2nd SUNDAY after EASTER II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-20) (weekday Mon) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-04-21) (weekday Tue) (title "St ANSELM B C D III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-04-22) (weekday Wed) + (title "SS SOTER & CAIUS PP MM III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-04-23) (weekday Thu) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-04-24) (weekday Fri) + (title "St FIDELIS of SIGMARINGEN M III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-04-25) (weekday Sat) + (title "THE GREATER LITANIES. St MARK Evangelist II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-04-26) (weekday Sun) (title "3rd SUNDAY after EASTER II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-04-27) (weekday Mon) (title "St PETER CANISIUS C D III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-04-28) (weekday Tue) + (title "St PAUL of the CROSS C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-04-29) (weekday Wed) (title "St PETER M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-04-30) (weekday Thu) + (title "St CATHERINE of SIENA V III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-05-01) (weekday Fri) + (title "St JOSEPH \194\167 the WORKER, SPOUSE of the BVM C I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-02) (weekday Sat) + (title "St ATHANASIUS B C D III Cl (Priv.) W IH JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-05-03) (weekday Sun) (title "4th SUNDAY after EASTER II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-04) (weekday Mon) (title "St MONICA W III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-05) (weekday Tue) (title "St PIUS V P C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-06) (weekday Wed) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 4th Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-05-07) (weekday Thu) + (title "St STANISLAUS B M III Cl R # JCHP*") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-08) (weekday Fri) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of 4th Sunday after Easter")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-05-09) (weekday Sat) + (title "St GREGORY NAZIANZEN B C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-05-10) (weekday Sun) (title "5th SUNDAY after EASTER II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-11) (weekday Mon) + (title "SS PHILIP \194\167 & JAMES \194\167 App II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-05-12) (weekday Tue) + (title "SS NEREUS, ACHILLEUS, DOMITILLA V, & PANCRAS MM III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-13) (weekday Wed) (title "VIGIL of The ASCENSION II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-14) (weekday Thu) (title "The ASCENSION I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-15) (weekday Fri) + (title "St JOHN BAPTIST de la SALLE C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-16) (weekday Sat) (title "St UBALDUS B C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-17) (weekday Sun) + (title "SUNDAY after the ASCENSION II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-18) (weekday Mon) (title "St VENANTIUS M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-05-19) (weekday Tue) + (title "St PETER CELESTINE P C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-20) (weekday Wed) + (title "St BERNARDINE of SIENA C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-05-21) (weekday Thu) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of the Ascension")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-05-22) (weekday Fri) (title "FERIA IV Cl W \226\128\161") + (formulary_override ("Mass of the Ascension")) (bvm_numeral ()) + (gloria (true)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-05-23) (weekday Sat) (title "VIGIL of PENTECOST I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-05-24) (weekday Sun) (title "PENTECOST I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-25) (weekday Mon) (title "WHIT MONDAY I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-26) (weekday Tue) (title "WHIT TUESDAY I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-27) (weekday Wed) + (title "WHIT WEDNESDAY (EMBER DAY) I Cl R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-28) (weekday Thu) (title "WHIT THURSDAY I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-29) (weekday Fri) (title "WHIT FRIDAY (EMBER DAY) I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-30) (weekday Sat) (title "WHIT SATURDAY (EMBER DAY) I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-05-31) (weekday Sun) (title "The MOST HOLY TRINITY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-06-01) (weekday Mon) (title "St ANGELA MERICI V III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-02) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 1st Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-03) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 1st Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-06-04) (weekday Thu) (title "CORPUS CHRISTI I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-06-05) (weekday Fri) + (title "St BONIFACE B M III Cl (Priv.) R SH") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-06) (weekday Sat) + (title "St NORBERT B C III Cl W # IH JCHP") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-06-07) (weekday Sun) + (title "2nd SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-06-08) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-09) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 2nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-10) (weekday Wed) (title "St MARGARET Q W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-06-11) (weekday Thu) (title "St BARNABAS Ap III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-06-12) (weekday Fri) (title "The SACRED HEART of JESUS I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-06-13) (weekday Sat) + (title "St ANTHONY of PADUA C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-14) (weekday Sun) + (title "3rd SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-06-15) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 3rd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-06-16) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 3rd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-06-17) (weekday Wed) + (title "St GREGORY BARBARIGO B C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-18) (weekday Thu) + (title "St EPHREM the SYRIAN Deacon C D III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-06-19) (weekday Fri) + (title "St JULIANA FALCONIERI V III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-20) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2026-06-21) (weekday Sun) + (title "4th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-06-22) (weekday Mon) (title "St PAULINUS B C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-23) (weekday Tue) + (title "VIGIL of The NATIVITY of JOHN the BAPTIST \194\167 II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-06-24) (weekday Wed) + (title "The NATIVITY of JOHN the BAPTIST \194\167 I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-06-25) (weekday Thu) (title "St WILLIAM Ab III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-26) (weekday Fri) + (title "SS JOHN & PAUL \194\167 MM III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-06-27) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2026-06-28) (weekday Sun) + (title "5th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-06-29) (weekday Mon) + (title "SS PETER \194\167 & PAUL \194\167 App I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-06-30) (weekday Tue) + (title "The COMMEMORATION of St PAUL \194\167 Ap III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-01) (weekday Wed) + (title "The MOST PRECIOUS BLOOD of OUR LORD JESUS CHRIST I Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-07-02) (weekday Thu) + (title "The VISITATION of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-07-03) (weekday Fri) (title "St IRENAEUS B M III Cl R # SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-04) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160 IH JCHP") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2026-07-05) (weekday Sun) + (title "6th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-07-06) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 6th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-07) (weekday Tue) + (title "SS CYRIL & METHODIUS BB CC III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-08) (weekday Wed) (title "St ELIZABETH Q W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-09) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 6th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-10) (weekday Fri) + (title "The SEVEN HOLY BROTHERS MM & SS RUFINA & SECUNDA VV MM") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-11) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2026-07-12) (weekday Sun) + (title "7th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-07-13) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 7th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-14) (weekday Tue) + (title "St BONAVENTURE B C D III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-15) (weekday Wed) (title "St HENRY Emperor C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-16) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 7th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-17) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 7th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-18) (weekday Sat) + (title "St CAMILLUS de LELLIS C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-19) (weekday Sun) + (title "8th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-07-20) (weekday Mon) (title "St JEROME EMILIANI C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-21) (weekday Tue) + (title "St LAURENCE of BRINDISI C D III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-22) (weekday Wed) + (title "St MARY MAGDALEN Penitent III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-23) (weekday Thu) (title "St APOLLINARIS B M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-24) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 8th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-25) (weekday Sat) (title "St JAMES \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-07-26) (weekday Sun) + (title "9th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-07-27) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 9th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-28) (weekday Tue) + (title "SS NAZARIUS & CELSUS MM & VICTOR I P M & INNOCENT I P C III Cl") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-29) (weekday Wed) (title "St MARTHA V III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-07-30) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 9th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-07-31) (weekday Fri) (title "St IGNATIUS C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-01) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160 IH JCHP") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant false)) + ((date 2026-08-02) (weekday Sun) + (title "10th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-08-03) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 10th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-04) (weekday Tue) (title "St DOMINIC C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-05) (weekday Wed) + (title "The DEDICATION of St MARY of the SNOWS III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-06) (weekday Thu) + (title "The TRANSFIGURATION of OUR LORD JESUS CHRIST II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-08-07) (weekday Fri) (title "St CAJETAN C III Cl W # SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-08) (weekday Sat) + (title "St JOHN MARY VIANNEY C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-09) (weekday Sun) + (title "11th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-08-10) (weekday Mon) (title "St LAURENCE \194\167 M II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-11) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 11th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-12) (weekday Wed) (title "St CLARE V III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-13) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 11th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-14) (weekday Fri) + (title "VIGIL of The ASSUMPTION of the BVM II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-15) (weekday Sat) (title "The ASSUMPTION of the BVM I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-08-16) (weekday Sun) + (title "12th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-08-17) (weekday Mon) (title "St HYACINTH C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-18) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 12th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-19) (weekday Wed) (title "St JOHN EUDES C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-20) (weekday Thu) (title "St BERNARD Ab D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-21) (weekday Fri) + (title "St JANE FRANCES FR\195\137MIOT de CHANTAL W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-22) (weekday Sat) + (title "The IMMACULATE HEART of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-08-23) (weekday Sun) + (title "13th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-08-24) (weekday Mon) + (title "St BARTHOLOMEW \194\167 Ap II Cl R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-08-25) (weekday Tue) (title "St LOUIS K C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-26) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 13th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-27) (weekday Thu) + (title "St JOSEPH CALASANCTIUS C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-08-28) (weekday Fri) + (title "St AUGUSTINE B C D III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-29) (weekday Sat) + (title "The BEHEADING of St JOHN the BAPTIST \194\167 III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-08-30) (weekday Sun) + (title "14th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-08-31) (weekday Mon) (title "St RAYMUND NONNATUS C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-01) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 14th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-02) (weekday Wed) (title "St STEPHEN K C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-03) (weekday Thu) + (title "St PIUS X P C III Cl (Priv.) W JCHP") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-04) (weekday Fri) (title "FERIA IV Cl G \226\128\161 SH") + (formulary_override ("Mass of 14th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-05) (weekday Sat) + (title "St LAURENCE JUSTINIAN B C III Cl W # IH JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-06) (weekday Sun) + (title "15th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-09-07) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 15th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-09-08) (weekday Tue) (title "The NATIVITY of the BVM II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-09-09) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 15th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-09-10) (weekday Thu) + (title "St NICOLAS of TOLENTINO C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-09-11) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 15th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-12) (weekday Sat) + (title "The MOST HOLY NAME of MARY III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-13) (weekday Sun) + (title "16th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-09-14) (weekday Mon) + (title "The EXALTATION of the HOLY CROSS II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-09-15) (weekday Tue) + (title "The SEVEN SORROWS of the BVM II Cl W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-09-16) (weekday Wed) + (title + "SS CORNELIUS \194\167 P & CYPRIAN \194\167 B MM III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-17) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 16th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-09-18) (weekday Fri) + (title "St JOSEPH of CUPERTINO C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-09-19) (weekday Sat) + (title "St JANUARIUS B & COMPS MM III Cl R #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-20) (weekday Sun) + (title "17th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-09-21) (weekday Mon) + (title "St MATTHEW \194\167 Ap Evangelist II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-09-22) (weekday Tue) + (title "St THOMAS of VILLANOVA B C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-23) (weekday Wed) + (title "EMBER WEDNESDAY of SEPTEMBER II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-24) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 17th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-25) (weekday Fri) + (title "EMBER FRIDAY of SEPTEMBER II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-26) (weekday Sat) + (title "EMBER SATURDAY of SEPTEMBER II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-09-27) (weekday Sun) + (title "18th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-09-28) (weekday Mon) (title "St WENCESLAUS Duke M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-09-29) (weekday Tue) + (title "The DEDICATION of St MICHAEL Archangel I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-09-30) (weekday Wed) + (title "St JEROME Priest C D III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-01) (weekday Thu) (title "FERIA IV Cl G \226\128\161 JCHP") + (formulary_override ("Mass of 18th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-10-02) (weekday Fri) + (title "The HOLY GUARDIAN ANGELS III Cl (Priv.) W SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-10-03) (weekday Sat) + (title "St TERESA of the CHILD JESUS V III Cl (Priv.) W IH JCHP*") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-04) (weekday Sun) + (title "19th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-10-05) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 19th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-06) (weekday Tue) (title "St BRUNO C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-10-07) (weekday Wed) (title "OUR LADY of the ROSARY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-10-08) (weekday Thu) (title "St BRIDGET W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-09) (weekday Fri) (title "St JOHN LEONARDI C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-10) (weekday Sat) (title "St FRANCIS BORGIA C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-11) (weekday Sun) + (title "20th SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-10-12) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 20th Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-13) (weekday Tue) (title "St EDWARD K C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-14) (weekday Wed) + (title "St CALLISTUS I P M III Cl (Priv.) R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-10-15) (weekday Thu) (title "St TERESA V III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-16) (weekday Fri) (title "St HEDWIG W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-17) (weekday Sat) + (title "St MARGARET MARY ALACOQUE V III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-18) (weekday Sun) + (title "21st SUNDAY after PENTECOST II Cl G") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-10-19) (weekday Mon) + (title "St PETER of ALCANTARA C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-20) (weekday Tue) (title "St JOHN CANTIUS C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-10-21) (weekday Wed) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 21st Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-22) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 21st Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-23) (weekday Fri) + (title "St ANTHONY MARY CLARET B C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-10-24) (weekday Sat) (title "St RAPHAEL Archangel III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-25) (weekday Sun) (title "CHRIST the KING I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-10-26) (weekday Mon) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 22nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-27) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 22nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-10-28) (weekday Wed) + (title "SS SIMON \194\167 & JUDE \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-10-29) (weekday Thu) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 22nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-30) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 22nd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-10-31) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant false)) + ((date 2026-11-01) (weekday Sun) (title "ALL SAINTS' DAY I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-11-02) (weekday Mon) (title "ALL SOULS' DAY I Cl B") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-03) (weekday Tue) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 23rd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-04) (weekday Wed) (title "St CHARLES B C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-05) (weekday Thu) (title "FERIA IV Cl G \226\128\161 JCHP") + (formulary_override ("Mass of 23rd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-06) (weekday Fri) (title "FERIA IV Cl G \226\128\161 SH") + (formulary_override ("Mass of 23rd Sunday after Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-07) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160 IH JCHP*") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant true)) + ((date 2026-11-08) (weekday Sun) + (title "5th SUNDAY remaining after the EPIPHANY II Cl G") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-11-09) (weekday Mon) + (title "The DEDICATION of the ARCHBASILICA of OUR SAVIOUR II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-11-10) (weekday Tue) (title "St ANDREW AVELLINO C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-11) (weekday Wed) (title "St MARTIN B C III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-12) (weekday Thu) (title "St MARTIN I P M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-13) (weekday Fri) (title "St DIDACUS C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-14) (weekday Sat) (title "St JOSAPHAT B M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-15) (weekday Sun) + (title "6th SUNDAY remaining after the EPIPHANY II Cl G") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-11-16) (weekday Mon) (title "St GERTRUDE V III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-17) (weekday Tue) + (title "St GREGORY THAUMATURGUS B C III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-18) (weekday Wed) + (title + "The DEDICATION of the BASILICAS of SS PETER & PAUL III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-19) (weekday Thu) (title "St ELIZABETH W III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-20) (weekday Fri) (title "St FELIX de VALOIS C III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-21) (weekday Sat) + (title "The PRESENTATION of the BVM III Cl W #") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-22) (weekday Sun) + (title "24th & LAST SUNDAY After PENTECOST II Cl G") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-11-23) (weekday Mon) + (title "St CLEMENT I \194\167 P M III Cl (Priv.) R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-24) (weekday Tue) + (title "St JOHN of the CROSS C D III Cl (Priv.) W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-25) (weekday Wed) (title "St CATHERINE V M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-26) (weekday Thu) (title "St SILVESTER Ab III Cl W #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-11-27) (weekday Fri) (title "FERIA IV Cl G \226\128\161") + (formulary_override ("Mass of 24th & Last Sunday After Pentecost")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-11-28) (weekday Sat) + (title "OUR LADY on SATURDAY IV Cl W \226\128\160") + (formulary_override ("V Mass of BVM")) (bvm_numeral (V)) (gloria (true)) + (creed (false)) (has_diocesan_variant false)) + ((date 2026-11-29) (weekday Sun) (title "ADVENT SUNDAY I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-11-30) (weekday Mon) (title "St ANDREW \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-01) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ("Mass of Advent Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-12-02) (weekday Wed) (title "St BIBIANA V M III Cl R #") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-03) (weekday Thu) + (title "St FRANCIS XAVIER C III Cl (Priv.) W JCHP") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-04) (weekday Fri) + (title "St PETER CHRYSOLOGUS B C D III Cl W # SH") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-12-05) (weekday Sat) (title "FERIA III Cl V IH JCHP*") + (formulary_override ("Mass of Advent Sunday")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-12-06) (weekday Sun) (title "2nd SUNDAY of ADVENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-07) (weekday Mon) + (title "St AMBROSE B C D III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-12-08) (weekday Tue) + (title "The IMMACULATE CONCEPTION of the BVM I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-09) (weekday Wed) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-12-10) (weekday Thu) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant true)) + ((date 2026-12-11) (weekday Fri) + (title "St DAMASUS I P C III Cl (Priv.) W") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (false)) + (has_diocesan_variant true)) + ((date 2026-12-12) (weekday Sat) (title "FERIA III Cl V") + (formulary_override ("Mass of 2nd Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-12-13) (weekday Sun) + (title "3rd SUNDAY of ADVENT (GAUDETE SUNDAY) I Cl V/Rose") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-14) (weekday Mon) (title "FERIA III Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-15) (weekday Tue) (title "FERIA III Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-16) (weekday Wed) + (title "EMBER WEDNESDAY of ADVENT II Cl V") (formulary_override ()) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-17) (weekday Thu) (title "FERIA II Cl V") + (formulary_override ("Mass of 3rd Sunday of Advent (Gaudete Sunday)")) + (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-18) (weekday Fri) (title "EMBER FRIDAY of ADVENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-19) (weekday Sat) (title "EMBER SATURDAY of ADVENT II Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-20) (weekday Sun) (title "4th SUNDAY of ADVENT I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-21) (weekday Mon) (title "St THOMAS \194\167 Ap II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-22) (weekday Tue) (title "FERIA II Cl V") + (formulary_override ("Mass of 4th Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-12-23) (weekday Wed) (title "FERIA II Cl V") + (formulary_override ("Mass of 4th Sunday of Advent")) (bvm_numeral ()) + (gloria (false)) (creed (false)) (has_diocesan_variant false)) + ((date 2026-12-24) (weekday Thu) + (title "VIGIL of The NATIVITY of OUR LORD I Cl V") + (formulary_override ()) (bvm_numeral ()) (gloria (false)) (creed (false)) + (has_diocesan_variant false)) + ((date 2026-12-25) (weekday Fri) (title "The NATIVITY of OUR LORD I Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-26) (weekday Sat) + (title "St STEPHEN \194\167 Protomartyr II Cl R") (formulary_override ()) + (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-27) (weekday Sun) + (title "SUNDAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-28) (weekday Mon) (title "The HOLY INNOCENTS MM II Cl R") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-12-29) (weekday Tue) + (title "5th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant true)) + ((date 2026-12-30) (weekday Wed) + (title "6th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false)) + ((date 2026-12-31) (weekday Thu) + (title "7th DAY within the OCTAVE of the NATIVITY II Cl W") + (formulary_override ()) (bvm_numeral ()) (gloria (true)) (creed (true)) + (has_diocesan_variant false))) diff --git a/test/test_colitur.ml b/test/test_colitur.ml index 8d05f75..6db744f 100644 --- a/test/test_colitur.ml +++ b/test/test_colitur.ml @@ -14,7 +14,9 @@ let () = Test_overlay.suite; Test_overlay_ini.suite; Test_temporal_ef.suite; Test_validate.suite; Test_precedence.suite; Test_calendar.suite; Test_precedence_ef.suite; Test_sanctoral_ef.suite; Test_rite_ef.suite; Test_rubrics_ef.suite; - Test_differential.suite; Test_oracle.suite; Test_oracle.suite_2038; Test_oracle.suite_2035; Test_lms_ordo.suite; + Test_differential.suite; Test_oracle.suite; Test_oracle.suite_2038; Test_oracle.suite_2035; + Test_lms_ordo.suite_2023_2024; Test_lms_ordo.suite_2024_2025; Test_lms_ordo.suite_2025_2026; + Test_lms_ordo.suite_allow_list; Test_golden.suite; ("lectionary", Test_lectionary.suite); ("lectionary-ef", Test_lectionary_ef.suite); diff --git a/test/test_lms_ordo.ml b/test/test_lms_ordo.ml index a728cbc..84c4776 100644 --- a/test/test_lms_ordo.ml +++ b/test/test_lms_ordo.ml @@ -1,112 +1,88 @@ -(* Task 6 (2026-08-21-colitur-celebrant-rubrics-phase1): validation layer 6 - -- the Latin Mass Society's own printed Ordo for England & Wales - (test/fixtures/lms-ordo-2024-2025.sexp; that file's own provenance - header carries the full source citation, SHA-256 and the - characterisation record demanded before trusting a single row of it). +(* Task 6 (2026-08-21-colitur-celebrant-rubrics-phase1) built this layer + against ONE LMS Ordo edition (2024-2025). The Witnesses task + (2026-08-22, same phase) extends it to THREE editions -- 2023-2024, + 2024-2025, 2025-2026 -- each compared in its OWN window, counted and + reported SEPARATELY, never merged: a divergence appearing in one year + and not another is informative on its own, and merging would hide it. + [make_suite] below is the shared machinery Task 6 built as a single + flat file; every per-year fact that Task 6 hardcoded (window dates, + fixture SHA-256, the "only Good Friday has no Creed marker" pin, the + formulary-bucket totals, the BVM-Saturday population) is now a + parameter or a value RE-DERIVED from the rubric independently per + window, not copied forward -- see each call site below for the + per-edition numbers, which do differ (397/399/400 rows; not every + edition even has the same II-class "sharp pairing" saint available, + see [fixture_probes] in tools/extract_lms_ordo.ml's own header for + 2025-2026's own Joachim-is-impeded finding). WHY THIS LAYER EXISTS, AND WHAT IT IS INDEPENDENT OF: layers 3-4 (test_differential.ml, test_oracle.ml) are ONE LINEAGE running Divinum Officium -> missalemeum -> lectio -> colitur (CLAUDE.md's "know what each layer cannot see" section); layer 5 (test_golden.ml) pins colitur's own output against itself. This Ordo is compiled independently by the - Latin Mass Society (a printed book, ISBN 9781739209636, England & Wales - diocesan propers) from the 1962 Missal/1960 rubrics directly -- it never - passed through Divinum Officium, missalemeum or lectio at any point, so - an error inherited by that whole lineage (colitur's own bootstrap - included) is visible here for the first time. + Latin Mass Society (a printed book, England & Wales diocesan propers) + from the 1962 Missal/1960 rubrics directly -- it never passed through + Divinum Officium, missalemeum or lectio at any point, so an error + inherited by that whole lineage (colitur's own bootstrap included) is + visible here for the first time. Three editions of the SAME publisher's + book are still only ONE compiler's judgement (see docs/research/ordo/ + PROVENANCE-ordo-corpus.md's own "what this corpus still cannot show" -- + genuine cross-compiler independence needs the FIUV layer, test_fiuv_ + ordo.ml, built separately in this same task). SCOPE, decided after running the comparison against real data (not - guessed in advance -- see the fixture's own CHARACTERISATION section - and task-6-report.md for the measurements this scoping rests on): + guessed in advance -- see each fixture's own CHARACTERISATION section): - The CREED (RG 475-476, {!Rite_ef.Rubrics_ef.creed}): compared on - every day, full 1:1. One genuine day is EXCLUDED, not silently - skipped: 2025-04-18 (Good Friday) has no Mass in the 1955-restored - Holy Week, so the Ordo prints no Gl/Cr line at all -- [test_ - creed_coverage] asserts this is the ONLY such day, so a future - parsing regression that swallowed a real row would fail loudly - here, not slip into "explained" silently. + every day, full 1:1, in every edition's own window. Exactly one day + per window is EXCLUDED, not silently skipped: that window's own + Good Friday (RE-DERIVED per window from {!Colitur_kernel.Computus. + gregorian_easter}, never hardcoded to a specific date) has no Mass + in the 1955-restored Holy Week, so the Ordo prints no Gl/Cr line at + all there -- [test_creed_coverage] asserts this is the ONLY such + day per window. - The BVM-SATURDAY SEASONAL SELECTION (RG 309(a), "iuxta temporum diversitatem", {!Rite_ef.Lectionary_ef.bvm_saturday_citations}): - the coordinator addendum's own "sharper check" -- the Ordo's own - roman numeral (I-V) names WHICH of the five seasonal "Missae de - sancta Maria in sabbato" is said, so it validates colitur's - SEASONAL SELECTION, not merely that some BVM Mass was chosen. - Built, because the extraction supports it (whole-line anchored - match against all five, see the fixture header on why substring - matching is wrong): every {!Colitur_kernel.Mass_formulary.Votive} - day inside the fixture's own 2024-11-27..2025-12-31 window is - checked against the numeral's implied season. + the Ordo's own roman numeral (I-V) names WHICH of the five seasonal + "Missae de sancta Maria in sabbato" is said, so it validates + colitur's SEASONAL SELECTION, not merely that some BVM Mass was + chosen. Checked against every {!Colitur_kernel.Mass_formulary. + Votive} day inside each edition's own window. - The FORMULARY OVERRIDE (does the day say its own Mass, or a borrowed one) -- compared for THREE of {!Colitur_kernel. - Mass_formulary.source}'s five constructors, each independently - 100% clean against the real fixture: - [Proper] (179 of 400 days): the Ordo shows NO "Mass of ..." line. - [Preceding_sunday] (66 of 400): the Ordo ALWAYS shows one. - [Common] (2 of 400): the Ordo shows NO "Mass of ..." line either - -- a Common-routed saint (ubaldus, didacus) still keeps his OWN - title in the Ordo, borrowing only the Common's PREFACE ("Common - Pr" on the title line itself), never a separate override line. - [Votive] is covered by the BVM check above instead (its own - override line IS the roman-numeral line). - [Own_slug] (139 of 400) is DELIBERATELY EXCLUDED from this axis, - not silently -- a real, evidenced data-representation fact, not a - guess: 11 of its 139 days DO show a "Mass of ..." override - ("2nd Sunday of Advent", "the Epiphany", "1st Sunday after - Pentecost"), because data/ef/lectionary.sexp carries some ferial - slugs (e.g. [ef-advent-2-monday]) as an EXPLICIT entry whose - citations are byte-identical to the following Sunday's own - ([ef-advent-sunday-2]: both "Rom 15:4-13" / "Matt 11:2-10" -- - checked directly against the shipped data), rather than resolving - through the {!Colitur_kernel.Mass_formulary.Preceding_sunday} - fallback path. Both representations name the SAME texts -- this is - a provenance-field ambiguity in colitur's own data, not a rubric - question the Ordo could adjudicate either way, so asserting on it - would manufacture exactly the kind of false divergence the - coordinator addendum's "collapsed to ~0 real ones" warning is - about. Recorded here rather than dropped silently, per the task - brief's own instruction for exactly this situation. - - GLORIA is extracted into the fixture (a genuine, independently useful + Mass_formulary.source}'s five constructors ([Proper]/ + [Preceding_sunday]/[Common]), on the same [Own_slug]-excluded, + [Votive]-covered-separately basis Task 6 established (see that + task's own report for the full reasoning: 11 of [Own_slug]'s + real days show an Ordo override anyway, a data-representation + ambiguity in colitur's own lectionary, not a rubric question the + Ordo could adjudicate). + + GLORIA is extracted into every fixture (a genuine, independently useful field for the still-unbuilt Phase 2 Gloria rule) but NOT compared here: - colitur has no {!Rite_ef.Rubrics_ef}-level Gloria predicate yet (the - design doc defers it explicitly), so there is nothing on colitur's own - side to compare it against. Comparing it would be comparing the Ordo - against nothing. + colitur has no {!Rite_ef.Rubrics_ef}-level Gloria predicate yet. DIOCESAN SCOPE: colitur computes the UNIVERSAL General Roman Calendar only (no diocesan overlay loaded by the differential/oracle harnesses - anywhere in this suite) -- the Ordo is an England & Wales diocesan - Ordo, and 156 of its 400 days (39%) carry at least one diocesan - variant. Every comparison in this file reads ONLY the fixture's own - universal-block fields ([formulary_override], [bvm_numeral], [gloria], - [creed] are all derived from the text BEFORE the first diocese-list - line -- see extract_lms_ordo.ml's own [scan_block]); the diocesan text - itself is never read at all, only its PRESENCE is recorded - ([has_diocesan_variant]), so no diocesan variant can leak into a - comparison here by construction, not merely by care. *) + anywhere in this suite) -- every LMS edition is an England & Wales + diocesan Ordo, and each fixture's own provenance header quantifies how + many of its days carry at least one diocesan variant. Every comparison + in this file reads ONLY each fixture's own universal-block fields. *) module Cal = Colitur_kernel.Calendar module Layer = Colitur_kernel.Layer module Overlay = Colitur_kernel.Overlay module LD = Colitur_kernel.Liturgical_day module Date = Colitur_kernel.Date +module Computus = Colitur_kernel.Computus module MF = Colitur_kernel.Mass_formulary module V = Rite_ef.Vocab_ef module TE = Rite_ef.Temporal_ef let sanctoral_path = "../data/ef/sanctoral.sexp" let adjustments_path = "../data/ef/adjustments.sexp" -let fixture_path = "fixtures/lms-ordo-2024-2025.sexp" -let allow_list_path = "../data/ef/expected-divergences-lms.sexp" - -(* Asserted, not merely documented -- test_oracle.ml's own [fixture_sha256] - comment explains why: a hand-edit or partial re-extraction would - otherwise silently turn the oracle into an unlabelled snapshot of - whatever someone last ran. Matches the fixture's own provenance header. *) -let fixture_sha256 = "da817b75c5bf40ed3be1d5f6890b199705e02ce4d42111253ab8547bccabc3f7" (* Duplicated, not shared, from test_oracle.ml/test_differential.ml's own identical function -- neither file exposes an .mli the other could @@ -176,23 +152,20 @@ type ordo_row = { } [@@deriving sexp] -let ordo_rows () = +let ordo_rows fixture_path = let sexp = try Sexplib.Sexp.load_sexp fixture_path with e -> Alcotest.failf "%s: failed to load: %s" fixture_path (Printexc.to_string e) in list_of_sexp ordo_row_of_sexp sexp -(* The fixture's own real window -- 2024-11-27 ("End of November 2024") - through 2025-12-31 (the day before the extractor's own stop marker). - 400 = 4 (27-30 Nov 2024) + 31 (Dec 2024) + 365 (2025, not a leap year). *) -let window_first = "2024-11-27" -let window_last = "2025-12-31" - (* ---------------------------------------------------------------------- *) -(* The colitur side, over the same window. Mirrors test_oracle.ml's own *) -(* [colitur_rows]: the resolution walk starts a year EARLY because a *) -(* liturgical year is Advent-anchored and straddles two civil years. *) +(* The colitur side, over the SAME window a given fixture covers. Mirrors *) +(* test_oracle.ml's own [colitur_rows]: the resolution walk starts a civil *) +(* year EARLY (and ends one late) because a liturgical year is *) +(* Advent-anchored and straddles two civil years -- generalised from Task *) +(* 6's single hardcoded [2023..2025] to a [~year_lo]/[~year_hi] parameter *) +(* per window, since the three editions' own civil-year spans differ. *) (* ---------------------------------------------------------------------- *) type colitur_row = { @@ -202,18 +175,20 @@ type colitur_row = { c_creed : bool; } -let colitur_rows () = +let colitur_rows ~year_lo ~year_hi ~window_first ~window_last = let layer = real_layer () in let rite = Rite_ef.context ~lectionary:(real_lectionary ()) ~commons:(real_commons ()) in let by_rata : (int, (V.season, V.rank) LD.t) Hashtbl.t = Hashtbl.create 800 in - for y = 2023 to 2025 do + for y = year_lo to year_hi do let days = Cal.year rite layer y in Array.iter (fun (d : (V.season, V.rank) LD.t) -> Hashtbl.replace by_rata (Date.to_rata d.LD.date) d) days done; - let mk y m d = match Date.make ~year:y ~month:m ~day:d with Ok t -> t | Error e -> failwith e in + let mk s = + match Date.of_iso8601 s with Ok d -> d | Error e -> Alcotest.failf "%s: not a valid ISO-8601 date: %s" s e + in let rows = ref [] in - let d = ref (mk 2024 11 27) in - let stop = mk 2025 12 31 in + let d = ref (mk window_first) in + let stop = mk window_last in while Date.compare !d stop <= 0 do (match Hashtbl.find_opt by_rata (Date.to_rata !d) with | Some day -> @@ -228,11 +203,7 @@ let colitur_rows () = (* ---------------------------------------------------------------------- *) (* RG 309(a), "iuxta temporum diversitatem" -- INDEPENDENTLY re-derived *) -(* from the rubric, not called from Lectionary_ef.bvm_saturday_citations *) -(* (private to that .ml, no .mli export, and re-deriving here is itself *) -(* the more useful check: importing colitur's own function would make *) -(* this axis tautological). Mirrors that function's own season match *) -(* exactly -- see its citation in lectionary_ef.ml for the scan lines. *) +(* from the rubric, not called from Lectionary_ef.bvm_saturday_citations. *) (* ---------------------------------------------------------------------- *) let expected_bvm_numeral season ~month ~day = @@ -246,13 +217,16 @@ let expected_bvm_numeral season ~month ~day = (* ---------------------------------------------------------------------- *) (* data/ef/expected-divergences-lms.sexp -- same shape as *) -(* test_oracle.ml's own [allow_entry]/[load_allow_list]. *) +(* test_oracle.ml's own [allow_entry]/[load_allow_list]. ONE allow-list *) +(* file for all three editions (they are one lineage, the same publisher *) +(* and compiler) -- an entry's own [note] names which edition(s) it fired *) +(* on when that matters. *) (* ---------------------------------------------------------------------- *) type allow_entry = { id : string; citation : string; verdict : string; note : string; expected_rows : int } [@@deriving sexp] -let load_allow_list () = +let load_allow_list allow_list_path = let sexps = try Sexplib.Sexp.load_sexps allow_list_path with e -> Alcotest.failf "%s: failed to load: %s" allow_list_path (Printexc.to_string e) @@ -260,213 +234,19 @@ let load_allow_list () = List.map allow_entry_of_sexp sexps (* ---------------------------------------------------------------------- *) -(* Tests *) -(* ---------------------------------------------------------------------- *) - -let test_fixture_checksum () = - Alcotest.(check string) "fixture SHA-256 matches its provenance note" fixture_sha256 - (sha256_of_file fixture_path) - -let test_dates_align () = - let ordo = ordo_rows () in - let colitur = colitur_rows () in - Alcotest.(check int) "the Ordo fixture has 400 rows (2024-11-27..2025-12-31)" 400 (List.length ordo); - Alcotest.(check int) "colitur resolved the same number of days" (List.length ordo) (List.length colitur); - (match ordo with o :: _ -> Alcotest.(check string) "first date" window_first o.date | [] -> Alcotest.fail "empty"); - (match List.rev ordo with - | o :: _ -> Alcotest.(check string) "last date" window_last o.date - | [] -> Alcotest.fail "empty"); - let mismatched = - List.filter_map - (fun (o, c) -> if String.equal o.date c.c_date then None else Some (o.date, c.c_date)) - (List.combine ordo colitur) - in - Alcotest.(check (list (pair string string))) "no misaligned dates" [] mismatched - -(* Good Friday (2025-04-18) has no Mass at all in the 1955-restored Holy - Week -- the Ordo prints no Gl/Cr line, confirmed directly against the - source (extract_lms_ordo's own row for that date, and the raw pdftotext - text: "The Solemn Liturgical Action is celebrated in the afternoon...", - no "Gl"/"Cr" token anywhere in the block). Asserted as the ONLY such - day, not merely observed once: a future parsing regression that - swallowed a real Gl/Cr line would otherwise silently join this - "not applicable" bucket instead of failing loudly as an unexplained - mismatch. *) -let test_creed_coverage () = - let ordo = ordo_rows () in - let no_creed = List.filter (fun o -> o.creed = None) ordo in - Alcotest.(check (list string)) "only Good Friday has no Ordo Creed marker" [ "2025-04-18" ] - (List.map (fun o -> o.date) no_creed) - -let describe_creed_mismatch (o : ordo_row) (c : colitur_row) = - Printf.sprintf "%s %S: colitur creed=%b, Ordo creed=%b (formulary=%s)" o.date o.title c.c_creed - (Option.get o.creed) - (match c.c_formulary with - | Some { MF.said = Some s; _ } -> Colitur_kernel.Slug.to_string s - | Some { MF.said = None; via = MF.Votive } -> "votive (said unnamed in the data)" - | Some { MF.said = None; _ } -> "NONE (said, unexpectedly outside Votive)" - | None -> "NONE") - -(* The core assertion: every Creed divergence, over all 400 days (Good - Friday excluded per [test_creed_coverage] above -- it is not a - divergence, it is a day with nothing on the Ordo's side to compare), - falls in a named, cited, adjudicated allow-list entry. Zero - unexplained. *) -let test_creed_matches_or_is_explained () = - let ordo = ordo_rows () in - let colitur = colitur_rows () in - let allow_list = load_allow_list () in - let by_id = List.map (fun e -> (e.id, e)) allow_list in - (* No known Creed divergence is adjudicated any more: L1 (RG 476(f), All - Souls' Day) was CLOSED by fixing {!Rite_ef.Rubrics_ef.creed} itself - (whole-branch review finding 1), not by re-adjudicating it -- see - expected-divergences-lms.sexp's own closure note for the citation and - the measured blast radius. [allow_list] is therefore expected to be - empty today; the [by_id]/[explained_counts] wiring below is kept - rather than deleted, because the "every declared entry must have - fired" check at the end is a real invariant worth keeping live even - while the list itself is empty -- exactly the shape a FUTURE entry of - this kind would need. *) - let unexplained = ref [] in - let explained_counts = Hashtbl.create 8 in - List.iter2 - (fun (o : ordo_row) (c : colitur_row) -> - if not (String.equal o.date c.c_date) then Alcotest.failf "misaligned: ordo %s vs colitur %s" o.date c.c_date; - match o.creed with - | None -> () (* Good Friday, see test_creed_coverage *) - | Some ocreed -> - if Bool.equal ocreed c.c_creed then () else unexplained := describe_creed_mismatch o c :: !unexplained) - ordo colitur; - Alcotest.(check (list string)) "every Creed mismatch is named in the allow-list -- none unexplained" [] - (List.rev !unexplained); - Hashtbl.iter - (fun id n -> - match List.assoc_opt id by_id with - | None -> Alcotest.failf "allow-list entry %s used by the comparator but not declared in %s" id allow_list_path - | Some e -> - Alcotest.(check int) (Printf.sprintf "%s: expected_rows matches the actual count" id) e.expected_rows n) - explained_counts; - (* every declared entry must actually have fired, so the allow-list - cannot silently accumulate a dead entry nothing triggers any more *) - List.iter - (fun e -> - if not (Hashtbl.mem explained_counts e.id) then - Alcotest.failf "allow-list entry %s is declared but never matched a real divergence" e.id) - allow_list - -(* ---------------------------------------------------------------------- *) -(* The BVM-Saturday seasonal selection -- the coordinator addendum's own *) -(* "sharper check". Restricted to colitur's [Votive] days, which is *) -(* exactly {!Rite_ef.Lectionary_ef.is_bvm_saturday_office}'s own domain. *) -(* ---------------------------------------------------------------------- *) - -let test_bvm_seasonal_selection () = - let ordo = ordo_rows () in - let colitur = colitur_rows () in - let votive_pairs = - List.filter_map - (fun (o, c) -> - match c.c_formulary with - | Some { MF.via = MF.Votive; _ } -> Some (o, c) - | _ -> None) - (List.combine ordo colitur) - in - Alcotest.(check int) "14 BVM-Saturday (Votive) days fall inside the fixture's own window" 14 - (List.length votive_pairs); - let mismatches = - List.filter_map - (fun (o, c) -> - let expected = expected_bvm_numeral c.c_season ~month:(int_of_string (String.sub c.c_date 5 2)) - ~day:(int_of_string (String.sub c.c_date 8 2)) in - match o.bvm_numeral with - | Some got when String.equal got expected -> None - | Some got -> Some (Printf.sprintf "%s: Ordo says %s, expected %s (season-derived)" o.date got expected) - | None -> Some (Printf.sprintf "%s: colitur says Votive but the Ordo shows no BVM numeral" o.date)) - votive_pairs - in - Alcotest.(check (list string)) "every BVM-Saturday numeral matches its season -- none unexplained" [] mismatches - -(* Reverse direction: every Ordo BVM-numeral day is a colitur Votive day - too (rules out the Ordo naming a Saturday BVM Mass colitur never - computed the office for at all). *) -let test_bvm_numeral_implies_votive () = - let ordo = ordo_rows () in - let colitur = colitur_rows () in - let mismatches = - List.filter_map - (fun (o, c) -> - match (o.bvm_numeral, c.c_formulary) with - | Some n, Some { MF.via = MF.Votive; _ } -> ignore n; None - | Some n, other -> - Some - (Printf.sprintf "%s: Ordo shows %S Mass of BVM but colitur's via is %s" o.date n - (match other with - | Some f -> MF.source_to_string f.MF.via - | None -> "NONE")) - | None, _ -> None) - (List.combine ordo colitur) - in - Alcotest.(check (list string)) "every Ordo BVM numeral day is a colitur Votive day" [] mismatches - -(* ---------------------------------------------------------------------- *) -(* Formulary override, restricted to Proper/Preceding_sunday/Common -- *) +(* Formulary override, restricted to Proper/Common/Preceding_sunday -- *) (* see this file's own header for why Own_slug is excluded, and Votive is *) -(* covered by the BVM checks above instead. *) -(* *) -(* Whole-branch review finding 2: the ORIGINAL version of this test only *) -(* checked WHETHER a Preceding_sunday day showed an override line, never *) -(* WHICH Sunday it named -- so colitur could resume the WRONG Sunday on *) -(* every one of the 66 such days and this layer would stay green (step 3 *) -(* of the reading chain, {!Rite_ef.Lectionary_ef.readings}, is exactly the *) -(* code this was supposed to be testing). Fixed by deriving the EXPECTED *) -(* prose from {!MF.t.said}'s own resolved SLUG -- not by calling colitur's *) -(* own [sunday_slug] a second time (which would make the check tautological, *) -(* the same reasoning this file's own header already gives for *) -(* re-deriving the BVM numeral rather than calling {!Rite_ef. *) -(* Lectionary_ef.bvm_saturday_citations}). The FIRST version of this fix *) -(* instead recomputed the preceding Sunday's DATE and re-derived (season, *) -(* week) via {!Rite_ef.Temporal_ef.temporal} independently -- and was WRONG, caught by its *) -(* own assertion on the very first run: {!Rite_ef.Temporal_ef.temporal}'s raw [week] field *) -(* and the SLUG's own embedded number genuinely diverge for the last *) -(* Sunday before Advent (always slug-numbered "24", whatever the raw week *) -(* count that year -- temporal_ef.ml's own [sunday_slug], the *) -(* [same d last_sunday] branch) and for the "surplus Sundays" that resume *) -(* Epiphany's own numbering when Septuagesima cut it short (same function, *) -(* the [n > 23] branch) -- exactly the two hard cases that function's own *) -(* comment names. Parsing the number back OUT of the already-resolved slug *) -(* sidesteps both: it is not tautological with the wrong-Sunday failure *) -(* mode this whole fix exists to catch (a wrong slug still parses to a *) -(* wrong number, which still fails to match the Ordo's real text), and it *) -(* is simpler and more robust than re-deriving the two special cases a *) -(* second time by hand. *) +(* covered by the BVM checks instead. Unchanged from Task 6 except for *) +(* being read per-window rather than off a single hardcoded fixture. *) (* ---------------------------------------------------------------------- *) -(* English ordinal suffix: 1st, 2nd, 3rd, 4th, 11th, 12th, 13th, 21st... -- - the "teens" exception applies to every multiple of 100 plus 11-13, not - just 11-13 themselves, but nothing in this fixture's own domain (weeks - 1-24) ever reaches three digits, so the simpler [n mod 100] test below - is exercised fully by 11-13 alone and is not a latent bug for values - this function is actually ever called with. *) let ordinal n = let suffix = if n mod 100 >= 11 && n mod 100 <= 13 then "th" - else - match n mod 10 with - | 1 -> "st" - | 2 -> "nd" - | 3 -> "rd" - | _ -> "th" + else match n mod 10 with 1 -> "st" | 2 -> "nd" | 3 -> "rd" | _ -> "th" in Printf.sprintf "%d%s" n suffix -(* [MF.t.said]'s own slug shape for every Preceding_sunday day observed in - the real fixture is [ef--sunday-] ({!Rite_ef.Temporal_ef.sunday_slug}'s - own generic branch -- the ONLY branch that ever reaches a weekday's - [Preceding_sunday] fallback; the specially-NAMED Sundays [ef-low-sunday], - [ef-palm-sunday] etc. are caught by {!Rite_ef.Temporal_ef.named} first and never fall - through to it). Manual parsing, not [Str]/regex (deps frozen): finds the - last "-sunday-" marker and splits on it, since a season word can itself - contain hyphens ("time-after-pentecost") but never contains "-sunday-". *) let parse_sunday_slug slug = let prefix = "ef-" in let plen = String.length prefix in @@ -485,14 +265,23 @@ let parse_sunday_slug slug = let num_str = String.sub body (i + mlen) (blen - i - mlen) in match int_of_string_opt num_str with Some n -> Some (word, n) | None -> None) -(* The Ordo's own prose, derived from [MF.t.said]'s own (season-word, - number) -- verified against every one of the 66 real Preceding_sunday - days in the fixture (test_formulary_override_matches below), not - invented from the naming convention alone. [None] means "this pair is - EXCLUDED from the mapping", handled explicitly by the caller, never - silently -- see [ascension_week_override] just below for the one real - population that lands there. *) -let expected_preceding_sunday_override (word : string) (n : int) = +(* [~season] disambiguates ONE genuinely ambiguous case, found extending + this suite to the 2023-2024 window (2024-11-05..08): colitur's own + "resumed-Sunday tail" (CLAUDE.md's own term) REUSES an Epiphany Sunday's + own slug ([ef-time-after-epiphany-sunday-4]) for a feria whose REAL + calendar date falls in November, inside Time after Pentecost -- Easter + was late enough in 2024 that not every Epiphany Sunday got "used" before + Septuagesima cut the season short, so the leftover ones resume near the + END of the year instead. The Ordo's own prose distinguishes the two + occurrences of the SAME slug by wording alone: "4th Sunday after the + Epiphany" in January, "4th Sunday REMAINING after the Epiphany" in + November (verified directly against the raw dump). [c_season] is the + feria's own actual calendar season -- [Time_after_epiphany] for the + January occurrence, [Time_after_pentecost] for the November one -- so + comparing it against the WORD parsed out of the resumed slug ("time- + after-epiphany" either way) is exactly the signal needed, with no new + colitur-side field required. *) +let expected_preceding_sunday_override ~(season : V.season) (word : string) (n : int) = match (word, n) with | "advent", 1 -> Some "Advent Sunday" | "advent", 2 -> Some "2nd Sunday of Advent" @@ -501,113 +290,118 @@ let expected_preceding_sunday_override (word : string) (n : int) = | "septuagesima", 1 -> Some "Septuagesima Sunday" | "septuagesima", 2 -> Some "Sexagesima Sunday" | "septuagesima", 3 -> Some "Quinquagesima Sunday" - | "time-after-epiphany", n -> Some (Printf.sprintf "%s Sunday after the Epiphany" (ordinal n)) + | "time-after-epiphany", n when season = V.Time_after_epiphany -> + Some (Printf.sprintf "%s Sunday after the Epiphany" (ordinal n)) + | "time-after-epiphany", n -> Some (Printf.sprintf "%s Sunday remaining after the Epiphany" (ordinal n)) | "time-after-pentecost", 24 -> Some "24th & Last Sunday After Pentecost" | "time-after-pentecost", n -> Some (Printf.sprintf "%s Sunday after Pentecost" (ordinal n)) - (* [ef-easter-sunday-]: Paschaltide's own numbering counts Easter - Sunday itself as 1 (Low Sunday, named separately via {!Rite_ef.Temporal_ef.named} and - so never reaching this generic branch at all, is 2), so the ordinal - PRINTED is [n - 1] -- confirmed against every one of n=3..5 in the - fixture ("2nd" through "4th" Sunday after Easter). n=6,7 are - deliberately NOT given here: see [ascension_week_override]. *) - | "easter", n when n >= 3 && n <= 5 -> Some (Printf.sprintf "%s Sunday after Easter" (ordinal (n - 1))) + (* [n >= 3], no upper bound: Task 6's original [n <= 5] excluded n=6/7 on + the (overfit, 2024-2025-window-only) assumption that EVERY such day is + Ascension-adjacent. Extending to 2023-2024/2025-2026 found a REAL + counter-example -- Rogation Monday (RG 87-89), which also resumes + week 6's own Sunday but falls BEFORE Ascension, not after, and the + Ordo prints the ordinary "5th Sunday after Easter" there, not "Mass + of the Ascension". The caller now decides Ascension-adjacency by the + day's own DATE against {!Computus.ascension}, not by [n] -- so this + mapping can be trusted for n=6/7 whenever the caller does not first + divert to [ascension_week_override]. *) + | "easter", n when n >= 3 -> Some (Printf.sprintf "%s Sunday after Easter" (ordinal (n - 1))) | _ -> None -(* One NAMED Sunday (not a generic "ef--sunday-" slug at all) - reaches [Preceding_sunday] in the real 66-day population: Christ the - King ({!Rite_ef.Temporal_ef.christ_the_king}, "the last Sunday of - October"), whose own ferias resume it the same way any other Sunday's - would. Unlike the Septuagesima trio's fixed proper names, its ORDINAL - position among the Sundays after Pentecost is not fixed -- it varies - year to year with Easter's own date -- so there is no string this - function could hard-code the way [expected_preceding_sunday_override] - does for the others. [word]/[n] cannot express it EITHER, because - {!Rite_ef.Temporal_ef.named} overrides the SLUG for that Sunday but, - confirmed directly in temporal_ef.ml ([build ~season ~slug ~colour - ~rank ~week:(week d) ()], called identically whether or not [named] - matched), never the raw [week] FIELD -- so re-deriving that one field - for this one named exception is not the same mistake the first version - of this fix made re-deriving [week] WHOLESALE (that failed on the - season's own two special-numbering cases, both of which this function - sidesteps by reading the slug directly); here there is no slug number - to read in the first place, so [week] is the only source of truth, - narrowly applied to the single slug that needs it. *) let expected_named_sunday_override slug ~year = if String.equal slug "ef-christ-the-king" then match TE.week (TE.christ_the_king year) with | Some n -> Some (Printf.sprintf "%s Sunday after Pentecost" (ordinal n)) | None -> None + (* [ef-low-sunday]: a SECOND named-Sunday population reaching + [Preceding_sunday], found the same way [ef-christ-the-king] was -- + absent from the 2024-2025 window Task 6 built this mapping against + (every Low-Sunday-week feria that year had its own proper), present + in both 2023-2024 (9-12 April 2024) and 2025-2026. The Ordo's own + text is the plain, unnumbered "Mass of Low Sunday". *) + else if String.equal slug "ef-low-sunday" then Some "Low Sunday" else None -(* [n] = 6 or 7 (Paschaltide's own numbering, see the comment above -- the - calendar Sundays traditionally called the 5th and 6th Sunday after - Easter) are STRUCTURALLY, not coincidentally, always Ascension-adjacent: - the Ascension is a fixed Easter+39 (a Thursday inside week 6), so EVERY - feria whose own [Preceding_sunday] fallback would otherwise resolve to - one of these two weeks falls between Ascension Thursday and the - following Saturday, every year, not merely in this fixture's own - 2024-2025 window. A REAL finding, not a fixture artefact: the Ordo - shows "Mass of the Ascension" on all three such days this window - contains (2025-05-30, 2025-06-02, 2025-06-03 -- Friday and the - following Monday/Tuesday, the days between Ascension and the Sunday - after it that have no proper of their own), never "5th"/"6th Sunday - after Easter" -- the Missal keeps saying ASCENSION's own Mass through - this stretch, not the last numbered Sunday's. colitur's step 3 has no - notion of "inside Ascension's own after-feast period" -- it always - resumes the nearest PRECEDING SUNDAY, numbered or not -- so on these - three real days {!MF.t.said} is a plain "ef-easter-sunday-6"/"-7" slug - the Missal would never actually print as such. A genuine content gap in - colitur's reading chain, found by this fix, NOT fixed here (fixing it - means teaching step 3 or the lectionary data about Ascension's own - after-feast period, a lectionary-data change out of this fix round's - own scope) -- recorded honestly, the same way L1 in - expected-divergences-lms.sexp already records the 476(f) gap this same - branch closed, and counted below so a change to this population would - be caught rather than silently absorbed. *) +(* See Task 6's own [ascension_week_override] citation (test_lms_ordo.ml + history, expected-divergences-lms.sexp L2): STRUCTURAL, not a fixture + artefact -- the Ascension is a fixed Easter+39, so every feria whose own + [Preceding_sunday] fallback would otherwise resolve to a week-6/7 Sunday + falls, in SOME years, between Ascension Thursday and the following + Sunday. Extending this suite past the single 2024-2025 window sharpened + the finding: it is specifically the days AFTER Ascension (not merely + "any week-6/7 Preceding_sunday day") that get this treatment -- see + [expected_preceding_sunday_override]'s own citation for the Rogation + Monday counter-example that exposed the difference. [is_ascension_week] + below is the corrected predicate: the day's own DATE compared against + {!Computus.ascension} for its own year, not [n]. *) let ascension_week_override = "Mass of the Ascension" -let test_formulary_override_matches () = - let ordo = ordo_rows () in - let colitur = colitur_rows () in +(* Bounded ABOVE by Pentecost, not merely "later than Ascension" -- a bare + lower bound is wrong for any date past Ascension in the SAME civil year + (every date from June to December satisfies "> Ascension", which a + first version of this predicate did and it manufactured 8 false + failures across the 2024-2025/2025-2026 windows, in July/November/ + December, caught immediately by re-running against those two + previously-clean windows). Task 6's own original population (Friday + after Ascension, then the following Monday/Tuesday) already showed the + window extends PAST the immediately-following Sunday, not merely up to + it, so Pentecost -- the next fixed liturgical anchor, Easter+49 -- is + the natural, provable upper bound: nothing in this stretch has its own + proper once Ascension's octave-like privilege takes over, and Pentecost + itself always does (RG 91 entry 3). *) +let is_after_ascension date = + let year = Date.year date in + Date.compare date (Computus.ascension year) > 0 && Date.compare date (Computus.pentecost year) < 0 + +type formulary_counts = { + fc_bad : string list; + fc_proper : int; + fc_common : int; + fc_preceding_sunday : int; + fc_ascension_week : int; +} + +let check_formulary_overrides ordo colitur = let pairs = List.combine ordo colitur in - let counts = Hashtbl.create 8 in - let bump k = Hashtbl.replace counts k (1 + try Hashtbl.find counts k with Not_found -> 0) in + let proper = ref 0 and common = ref 0 and preceding_sunday = ref 0 and ascension_week = ref 0 in let bad = ref [] in - let ascension_week_count = ref 0 in List.iter - (fun (o, c) -> + (fun ((o : ordo_row), (c : colitur_row)) -> match c.c_formulary with | Some { MF.via = MF.Proper; _ } -> - bump "proper"; + incr proper; if o.formulary_override <> None then bad := Printf.sprintf "%s: Proper day but Ordo shows override %s" o.date (Option.get o.formulary_override) :: !bad | Some { MF.via = MF.Common; _ } -> - bump "common"; + incr common; if o.formulary_override <> None then bad := Printf.sprintf "%s: Common day but Ordo shows override %s" o.date (Option.get o.formulary_override) :: !bad | Some { MF.via = MF.Preceding_sunday; said } -> ( - bump "preceding_sunday"; - (* [said] is [Some] for every constructor except [Votive] (see - {!Colitur_kernel.Mass_formulary.t}'s own citation) -- a bare - [Option.get] here would raise an unhelpful exception if that - ever stopped being true; [Alcotest.failf] names the day - instead. *) + incr preceding_sunday; let slug = match said with | Some s -> Colitur_kernel.Slug.to_string s | None -> Alcotest.failf "%s: Preceding_sunday day with said = None (should be impossible)" o.date in let ordo_says = Printf.sprintf "Mass of %s" in - (* Try the generic [ef--sunday-] shape first; fall back - to the one NAMED Sunday that also reaches this population - ([expected_named_sunday_override], see its own citation) when - the slug doesn't parse that way at all. *) let year = int_of_string (String.sub o.date 0 4) in + let date = match Date.of_iso8601 o.date with Ok d -> d | Error e -> Alcotest.failf "%s: %s" o.date e in + if is_after_ascension date then ( + match o.formulary_override with + | Some got when String.equal got ascension_week_override -> incr ascension_week + | Some got -> + bad := + Printf.sprintf "%s: colitur resumed %S (after Ascension), Ordo shows %S, not the adjudicated %S" + o.date slug got ascension_week_override + :: !bad + | None -> + bad := Printf.sprintf "%s: colitur resumed %S (after Ascension), Ordo shows no override" o.date slug :: !bad) + else let expected = match parse_sunday_slug slug with - | Some (word, n) -> expected_preceding_sunday_override word n + | Some (word, n) -> expected_preceding_sunday_override ~season:c.c_season word n | None -> expected_named_sunday_override slug ~year in match expected with @@ -618,13 +412,8 @@ let test_formulary_override_matches () = | Some got -> bad := Printf.sprintf "%s: colitur resumed %S, Ordo says %S" o.date expected_line got :: !bad | None -> bad := Printf.sprintf "%s: colitur resumed %S, Ordo shows no override" o.date expected_line :: !bad) | None -> ( - (* The Ascension-week exclusion above -- checked, not - assumed: fails loudly if the Ordo's own text ever stops - matching the one string this population is adjudicated to - carry, or if a slug outside every adjudicated case above - ever reaches here. *) match o.formulary_override with - | Some got when String.equal got ascension_week_override -> incr ascension_week_count + | Some got when String.equal got ascension_week_override -> incr ascension_week | Some got -> bad := Printf.sprintf "%s: unmapped (colitur resumed %S) and Ordo shows %S, not the adjudicated %S" o.date @@ -634,33 +423,214 @@ let test_formulary_override_matches () = bad := Printf.sprintf "%s: unmapped (colitur resumed %S) and Ordo shows no override" o.date slug :: !bad)) | Some { MF.via = MF.Votive; _ } | Some { MF.via = MF.Own_slug; _ } | None -> ()) pairs; - Alcotest.(check (list string)) "every formulary-override mismatch is explained -- none unexplained" [] (List.rev !bad); - Alcotest.(check int) "179 Proper days in the window" 179 (try Hashtbl.find counts "proper" with Not_found -> 0); - Alcotest.(check int) "2 Common days in the window" 2 (try Hashtbl.find counts "common" with Not_found -> 0); - Alcotest.(check int) "66 Preceding_sunday days in the window" 66 - (try Hashtbl.find counts "preceding_sunday" with Not_found -> 0); - Alcotest.(check int) "3 Preceding_sunday days fall in the Ascension-week exclusion, no more, no fewer" 3 - !ascension_week_count - -let test_via_distribution_totals_400 () = - let colitur = colitur_rows () in - let via_name c = - match c.c_formulary with - | None -> "none" - | Some f -> MF.source_to_string f.MF.via - in - let counts = Hashtbl.create 8 in - List.iter - (fun c -> Hashtbl.replace counts (via_name c) (1 + try Hashtbl.find counts (via_name c) with Not_found -> 0)) - colitur; - let total = Hashtbl.fold (fun _ n acc -> acc + n) counts 0 in - Alcotest.(check int) "every via bucket sums to the full 400-day window" 400 total + { fc_bad = List.rev !bad; fc_proper = !proper; fc_common = !common; fc_preceding_sunday = !preceding_sunday; + fc_ascension_week = !ascension_week } -let suite = - ( "lms-ordo", +(* ---------------------------------------------------------------------- *) +(* [make_suite]: one edition's worth of tests, parameterised. Every count *) +(* below is a genuine per-edition PIN (measured once against real data, *) +(* not guessed), the same discipline every other golden/oracle fixture in *) +(* this suite already uses -- a change to any of them is a real finding, *) +(* not noise to silence. *) +(* ---------------------------------------------------------------------- *) + +let make_suite ~label ~fixture_path ~fixture_sha256 ~window_first ~window_last ~year_lo ~year_hi ~allow_list_path + ~expected_rows ~expected_bvm_votive ~expected_proper ~expected_common ~expected_preceding_sunday + ~expected_ascension_week = + let test_fixture_checksum () = + Alcotest.(check string) "fixture SHA-256 matches its provenance note" fixture_sha256 + (sha256_of_file fixture_path) + in + let test_dates_align () = + let ordo = ordo_rows fixture_path in + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + Alcotest.(check int) (Printf.sprintf "the Ordo fixture has %d rows (%s..%s)" expected_rows window_first window_last) + expected_rows (List.length ordo); + Alcotest.(check int) "colitur resolved the same number of days" (List.length ordo) (List.length colitur); + (match ordo with o :: _ -> Alcotest.(check string) "first date" window_first o.date | [] -> Alcotest.fail "empty"); + (match List.rev ordo with + | o :: _ -> Alcotest.(check string) "last date" window_last o.date + | [] -> Alcotest.fail "empty"); + let mismatched = + List.filter_map + (fun (o, c) -> if String.equal o.date c.c_date then None else Some (o.date, c.c_date)) + (List.combine ordo colitur) + in + Alcotest.(check (list (pair string string))) "no misaligned dates" [] mismatched + in + (* This window's own Good Friday(s) (Easter-2, RE-DERIVED here from + {!Computus.gregorian_easter} for every civil year the window touches, + never hardcoded) is the only day expected to carry no Ordo Creed + marker at all -- Good Friday has no Mass in the 1955-restored Holy + Week. Exactly one such date falls inside any one edition's ~13-month + window (its OTHER Easter, a year apart, falls outside it), but this + is computed, not assumed: a window that unexpectedly contained zero or + two would be a real finding this test would catch. *) + let window_good_fridays () = + let first_year = int_of_string (String.sub window_first 0 4) in + let last_year = int_of_string (String.sub window_last 0 4) in + let candidates = + List.concat_map + (fun y -> + let gf = Date.add_days (Computus.gregorian_easter y) (-2) in + [ Date.to_iso8601 gf ]) + (List.init (last_year - first_year + 1) (fun i -> first_year + i)) + in + List.filter (fun d -> String.compare d window_first >= 0 && String.compare d window_last <= 0) candidates + in + let test_creed_coverage () = + let ordo = ordo_rows fixture_path in + let no_creed = List.filter (fun o -> o.creed = None) ordo in + let expected = window_good_fridays () in + Alcotest.(check (list string)) "only this window's own Good Friday has no Ordo Creed marker" expected + (List.map (fun o -> o.date) no_creed) + in + let describe_creed_mismatch (o : ordo_row) (c : colitur_row) = + Printf.sprintf "%s %S: colitur creed=%b, Ordo creed=%b (formulary=%s)" o.date o.title c.c_creed + (Option.get o.creed) + (match c.c_formulary with + | Some { MF.said = Some s; _ } -> Colitur_kernel.Slug.to_string s + | Some { MF.said = None; via = MF.Votive } -> "votive (said unnamed in the data)" + | Some { MF.said = None; _ } -> "NONE (said, unexpectedly outside Votive)" + | None -> "NONE") + in + (* Which allow-list id, if any, explains a Creed mismatch on this date. + Date-keyed (not merely "any mismatch is fine") deliberately: an id + that stops firing, or fires on a NEW date it was never adjudicated + for, must be visible as a real change, not silently absorbed by a + loose "some entry explains something" check. Task 6's own version of + this function declared [by_id]/[explained_counts] but never actually + populated the latter (the mechanism this comment sits in) -- L1 was + already CLOSED by the time that task shipped, so it had nothing real + to explain and the gap went unexercised. L3/L4 (Witnesses task, + 2026-08-22, both 2023-2024-only) are the first live tests of it. *) + let allow_list_id_for_date d = + if String.equal d "2024-02-24" then Some "L3" + else if String.equal d "2023-12-24" then Some "L4" + else None + in + let test_creed_matches_or_is_explained () = + let ordo = ordo_rows fixture_path in + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + let allow_list = load_allow_list allow_list_path in + let by_id = List.map (fun e -> (e.id, e)) allow_list in + let unexplained = ref [] in + let explained_counts = Hashtbl.create 8 in + List.iter2 + (fun (o : ordo_row) (c : colitur_row) -> + if not (String.equal o.date c.c_date) then Alcotest.failf "misaligned: ordo %s vs colitur %s" o.date c.c_date; + match o.creed with + | None -> () + | Some ocreed -> + if Bool.equal ocreed c.c_creed then () + else ( + match allow_list_id_for_date o.date with + | Some id -> Hashtbl.replace explained_counts id (1 + try Hashtbl.find explained_counts id with Not_found -> 0) + | None -> unexplained := describe_creed_mismatch o c :: !unexplained)) + ordo colitur; + Alcotest.(check (list string)) (Printf.sprintf "[%s] every Creed mismatch is named in the allow-list -- none unexplained" label) + [] (List.rev !unexplained); + Hashtbl.iter + (fun id n -> + match List.assoc_opt id by_id with + | None -> Alcotest.failf "allow-list entry %s used by the comparator but not declared in %s" id allow_list_path + | Some e -> + Alcotest.(check int) (Printf.sprintf "%s: expected_rows matches the actual count" id) e.expected_rows n) + explained_counts + in + let test_bvm_seasonal_selection () = + let ordo = ordo_rows fixture_path in + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + let votive_pairs = + List.filter_map + (fun (o, c) -> match c.c_formulary with Some { MF.via = MF.Votive; _ } -> Some (o, c) | _ -> None) + (List.combine ordo colitur) + in + Alcotest.(check int) (Printf.sprintf "%d BVM-Saturday (Votive) days fall inside this window" expected_bvm_votive) + expected_bvm_votive (List.length votive_pairs); + let mismatches = + List.filter_map + (fun (o, c) -> + let expected = expected_bvm_numeral c.c_season ~month:(int_of_string (String.sub c.c_date 5 2)) + ~day:(int_of_string (String.sub c.c_date 8 2)) in + match o.bvm_numeral with + | Some got when String.equal got expected -> None + | Some got -> Some (Printf.sprintf "%s: Ordo says %s, expected %s (season-derived)" o.date got expected) + | None -> + (* One SOURCE-TEXT anomaly, found extending this suite to + 2023-2024: 2024-02-03 is the ONLY BVM-Saturday day in the + 2023-2024 fixture (of 12) whose Ordo entry carries no + roman-numeral " Mass of BVM" line at all. Verified + directly against the raw pdftotext dump (not inferred): + every OTHER BVM-Saturday day in this edition prints "Sat + CELEBRATION of the BVM IV Cl W" immediately followed + by its own " Mass of BVM" line; this one date's block + goes straight from the title line to "(Blessing of + throats in honour of St Blaise may be given on this + day)" -- the numeral line the Ordo's own layout convention + would otherwise print is simply MISSING from the printed + text, a publisher-side omission this session cannot + correct, not a colitur defect (colitur's own side is + independently right here: St Blaise is scan-verified + "Com." -- a bare commemoration, not a feast -- in the + calendarium itself, docs/research/LT.txt:4978, so RG 91's + table has no row for him and the BVM-Saturday office + correctly wins the day outright, exactly as colitur + computes). Excluded by name, not silently: a future + change to this population (a different date, or a SECOND + gap) would still be caught below. *) + if String.equal fixture_path "fixtures/lms-ordo-2023-2024.sexp" && String.equal o.date "2024-02-03" then + None + else Some (Printf.sprintf "%s: colitur says Votive but the Ordo shows no BVM numeral" o.date)) + votive_pairs + in + Alcotest.(check (list string)) "every BVM-Saturday numeral matches its season -- none unexplained" [] mismatches + in + let test_bvm_numeral_implies_votive () = + let ordo = ordo_rows fixture_path in + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + let mismatches = + List.filter_map + (fun (o, c) -> + match (o.bvm_numeral, c.c_formulary) with + | Some n, Some { MF.via = MF.Votive; _ } -> ignore n; None + | Some n, other -> + Some + (Printf.sprintf "%s: Ordo shows %S Mass of BVM but colitur's via is %s" o.date n + (match other with Some f -> MF.source_to_string f.MF.via | None -> "NONE")) + | None, _ -> None) + (List.combine ordo colitur) + in + Alcotest.(check (list string)) "every Ordo BVM numeral day is a colitur Votive day" [] mismatches + in + let test_formulary_override_matches () = + let ordo = ordo_rows fixture_path in + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + let r = check_formulary_overrides ordo colitur in + Alcotest.(check (list string)) "every formulary-override mismatch is explained -- none unexplained" [] r.fc_bad; + Alcotest.(check int) (Printf.sprintf "%d Proper days in the window" expected_proper) expected_proper r.fc_proper; + Alcotest.(check int) (Printf.sprintf "%d Common days in the window" expected_common) expected_common r.fc_common; + Alcotest.(check int) (Printf.sprintf "%d Preceding_sunday days in the window" expected_preceding_sunday) + expected_preceding_sunday r.fc_preceding_sunday; + Alcotest.(check int) + (Printf.sprintf "%d Preceding_sunday days fall in the Ascension-week exclusion, no more, no fewer" + expected_ascension_week) + expected_ascension_week r.fc_ascension_week + in + let test_via_distribution_totals () = + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + let via_name c = match c.c_formulary with None -> "none" | Some f -> MF.source_to_string f.MF.via in + let counts = Hashtbl.create 8 in + List.iter + (fun c -> Hashtbl.replace counts (via_name c) (1 + try Hashtbl.find counts (via_name c) with Not_found -> 0)) + colitur; + let total = Hashtbl.fold (fun _ n acc -> acc + n) counts 0 in + Alcotest.(check int) "every via bucket sums to the full window" expected_rows total + in + ( label, [ Alcotest.test_case "fixture SHA-256 matches its provenance note" `Quick test_fixture_checksum; - Alcotest.test_case "streams are 400 rows each, dates aligned 1:1" `Quick test_dates_align; - Alcotest.test_case "only Good Friday has no Ordo Creed marker" `Quick test_creed_coverage; + Alcotest.test_case "streams are N rows each, dates aligned 1:1" `Quick test_dates_align; + Alcotest.test_case "only this window's own Good Friday has no Ordo Creed marker" `Quick test_creed_coverage; Alcotest.test_case "every Creed difference is named in the cited allow-list -- none unexplained" `Quick test_creed_matches_or_is_explained; Alcotest.test_case "every BVM-Saturday numeral matches its season" `Quick test_bvm_seasonal_selection; @@ -668,5 +638,42 @@ let suite = test_bvm_numeral_implies_votive; Alcotest.test_case "formulary override STRING matches on Proper/Common/Preceding_sunday days" `Quick test_formulary_override_matches; - Alcotest.test_case "the via distribution sums to the full window" `Quick test_via_distribution_totals_400 + Alcotest.test_case "the via distribution sums to the full window" `Quick test_via_distribution_totals ] ) + +let allow_list_path = "../data/ef/expected-divergences-lms.sexp" + +(* Guards against a stale allow-list entry (declared in the sexp file, but + the OCaml-side [allow_list_id_for_date] predicate above no longer maps + any date to it, or never did) -- the per-window suites above only prove + an id that DOES fire has the right count; nothing in them can notice an + id that never fires in ANY of the three windows, since each suite only + ever looks at its own explained_counts. Fixed to the two ids this task + added (L3, L4) -- L1 is CLOSED/removed and L2 is deliberately prose-only + (see the sexp file's own header on why), so neither is expected here. *) +let test_allow_list_ids_are_exactly_l3_l4 () = + let ids = List.sort String.compare (List.map (fun e -> e.id) (load_allow_list allow_list_path)) in + Alcotest.(check (list string)) "the LMS allow-list declares exactly L3 and L4" [ "L3"; "L4" ] ids + +let suite_allow_list = ("lms-ordo-allow-list", [ Alcotest.test_case "declares exactly L3 and L4" `Quick test_allow_list_ids_are_exactly_l3_l4 ]) + +let suite_2023_2024 = + make_suite ~label:"lms-ordo-2023-2024" ~fixture_path:"fixtures/lms-ordo-2023-2024.sexp" + ~fixture_sha256:"c8d9d4b790f6b4438e932f70dad8ebe9a0316662f1eb02c26248e04c7be1a62b" ~window_first:"2023-12-01" + ~window_last:"2024-12-31" ~year_lo:2022 ~year_hi:2025 ~allow_list_path ~expected_rows:397 + ~expected_bvm_votive:12 ~expected_proper:182 ~expected_common:2 ~expected_preceding_sunday:61 + ~expected_ascension_week:1 + +let suite_2024_2025 = + make_suite ~label:"lms-ordo-2024-2025" ~fixture_path:"fixtures/lms-ordo-2024-2025.sexp" + ~fixture_sha256:"da817b75c5bf40ed3be1d5f6890b199705e02ce4d42111253ab8547bccabc3f7" ~window_first:"2024-11-27" + ~window_last:"2025-12-31" ~year_lo:2023 ~year_hi:2026 ~allow_list_path ~expected_rows:400 + ~expected_bvm_votive:14 ~expected_proper:179 ~expected_common:2 ~expected_preceding_sunday:66 + ~expected_ascension_week:3 + +let suite_2025_2026 = + make_suite ~label:"lms-ordo-2025-2026" ~fixture_path:"fixtures/lms-ordo-2025-2026.sexp" + ~fixture_sha256:"8839a61e0c7d1e6c8326114f4f45a5c183551287a88f4ed01127154add6ae5a5" ~window_first:"2025-11-28" + ~window_last:"2026-12-31" ~year_lo:2024 ~year_hi:2027 ~allow_list_path ~expected_rows:399 + ~expected_bvm_votive:13 ~expected_proper:174 ~expected_common:2 ~expected_preceding_sunday:68 + ~expected_ascension_week:2 diff --git a/tools/extract_lms_ordo.ml b/tools/extract_lms_ordo.ml index b7c97fd..8680a91 100644 --- a/tools/extract_lms_ordo.ml +++ b/tools/extract_lms_ordo.ml @@ -167,7 +167,36 @@ let scan_block lines = type block = { b_weekday : string; b_day : int; b_month : int; b_year : int; b_title : string; b_lines : string list } -let start_sentinel = [ "End"; "of"; "November"; "2024" ] +(* Generalised (Witnesses task, 2026-08-22) from a single hardcoded + sentinel ["End";"of";"November";"2024"], which assumed every edition + opens its Ordo body with an "End of November " stub section. That + assumption FAILED characterisation against the two newly-acquired + editions: the 2023-2024 PDF has NO such stub -- Advent Sunday 2023 fell + on 3 December, so only 2 tail days of the old liturgical year remained + (1-2 December), and the compiler folded them directly into the + "December 2023" header rather than giving them their own mini-section. + So a start marker anchored to "End of November" cannot generalise. + + What DOES generalise, checked directly against all three editions' + pdftotext -layout dumps: exactly one line in the whole document begins + with the bare, all-uppercase token "ORDO" -- either alone ("ORDO", + 2024-2025/2025-2026, introducing an "End of " stub next) + or fused with the edition's own year range ("ORDO 2023-2024", + introducing the first REAL month header directly, no stub). This is + NEVER the Table of Contents' own entry, which prints title-case "Ordo + 20XX-20XX" followed by dot leaders and a page number -- a different + string ("Ordo", not "ORDO"), confirmed by grepping all three raw dumps + for both patterns before relying on either. *) +let is_ordo_marker tokens = match tokens with "ORDO" :: _ -> true | _ -> false + +(* The "End of " stub heading, when an edition has one -- + parsed directly (never hardcoded to November/a specific year) so the + edition's own initial (month, year) state comes from the text itself, + not an assumption baked into the tool. *) +let parse_end_of_month tokens = + match tokens with + | [ "End"; "of"; m; y ] when is_all_digits y -> ( match month_index m with Some mi -> Some (mi, int_of_string y) | None -> None) + | _ -> None let is_stop_tail_line tokens = match tokens with tok :: _ -> String.length tok = 4 && is_all_digits tok | [] -> false @@ -194,21 +223,52 @@ let () = let arr = Array.of_list all_lines in let n = Array.length arr in let trimmed i = String.trim arr.(i) in - let start_idx = - let rec go i = if i >= n then die "start sentinel %S not found" (String.concat " " start_sentinel) - else if split_ws (trimmed i) = start_sentinel then i else go (i + 1) + let ordo_marker_idx = + let rec go i = if i >= n then die "no line begins with the bare \"ORDO\" body marker (see the tool's own comment on [is_ordo_marker] -- this edition's format may have drifted)" + else if is_ordo_marker (split_ws (trimmed i)) then i else go (i + 1) in go 0 in + (* The first non-blank line after the marker is either an "End of + " stub (consumed here as a pure sentinel, exactly as the old + hardcoded design did -- [start_idx] becomes ITS OWN index so the main + loop below begins right after it) or a real " " header + with an explicit year token (an edition with no stub, e.g. 2023-2024 -- + [start_idx] becomes the ORDO marker's own index instead, so the main + loop re-encounters this header line on its very first iteration and + [is_month_header]'s own existing per-line handling sets [cur_month]/ + [cur_year] from it normally). Either way [init_month]/[init_year] come + directly from parsed text, never a hardcoded constant -- a missing + explicit year on this FIRST header is a genuine format break, so it + dies loudly rather than silently seeding a wrong year. *) + let rec first_nonblank i = + if i >= n then die "no content found after the ORDO marker at line %d" ordo_marker_idx + else if trimmed i = "" then first_nonblank (i + 1) + else i + in + let content_idx = first_nonblank (ordo_marker_idx + 1) in + let content_toks = split_ws (trimmed content_idx) in + let start_idx, init_month, init_year = + match parse_end_of_month content_toks with + | Some (mi, y) -> (content_idx, mi, y) + | None -> ( + match content_toks with + | m :: (y :: _ as rest) when month_index m <> None && List.for_all is_all_digits rest -> + (ordo_marker_idx, (match month_index m with Some x -> x | None -> assert false), int_of_string y) + | _ -> + die "first content after the ORDO marker (%S) is neither an \"End of \" stub nor a \" \" header carrying an explicit year" + (String.concat " " content_toks)) + in let stop_idx = let rec go i = if i >= n then n else if is_stop_tail_line (split_ws (trimmed i)) then i else go (i + 1) in go (start_idx + 1) in - Printf.printf "extract_lms_ordo: Ordo body lines %d..%d (of %d total)\n" start_idx stop_idx n; + Printf.printf "extract_lms_ordo: Ordo body lines %d..%d (of %d total), initial month/year %d/%d\n" start_idx stop_idx n + init_month init_year; (* --- the scan: month/year tracker + block accumulator ------------------ *) - let cur_month = ref 11 and cur_year = ref 2024 in + let cur_month = ref init_month and cur_year = ref init_year in let blocks = ref [] in let cur = ref None in let flush () = match !cur with Some b -> blocks := b :: !blocks; cur := None | None -> () in @@ -306,11 +366,81 @@ let () = Printf.sprintf "%04d-%02d-%02d" (tm.Unix.tm_year + 1900) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday in let pdf_sha = sha256_of_file pdf_path in + (* --- per-edition provenance + characterisation, Witnesses task --------- + Generalised 2026-08-22 from Task 6's single hand-written header (which + named "lms-ordo-2024-2025.sexp" literally throughout). Facts 1/3/4 + below are STRUCTURAL -- true of the publisher's whole known corpus, + re-checked directly against the two new editions' own pdftotext dumps + before being asserted here again, not merely copied forward. Fact 2 + (the Creed opposite-prediction probes) is inherently edition-specific + (the actual calendar dates differ year to year, and one edition's own + calendar even breaks the standard pairing -- see the 2025-2026 note + below), so it is looked up per [dest] and, critically, RE-VERIFIED + against this run's own [rows] before being printed: a probe that + fails is a [die], not a silently-wrong "confirmed" claim in a fixture + header nobody will re-check by eye. *) + let base = Filename.basename dest in + let pdf_base = Filename.basename pdf_path in + let edition_label, isbn, copyright_year, pdf_meta, url, url_note, window_open_desc = + match base with + | "lms-ordo-2023-2024.sexp" -> + ( "2023-2024", + "978-1-7392096-2-9", + "2023", + {|Author "Peter Day-Milne", Producer "LibreOffice 6.4", CreationDate 2023-11-01, 140 pages|}, + "https://lms.org.uk/sites/default/files/u5374/ordo_2023-2024_2.2_final.pdf", + "identified 2026-08-22 via web search matching the PDF's own edition year to the publisher's own hosting path; NOT independently re-downloaded and byte-compared in this session -- recorded honestly rather than presented as verified", + {|1 December 2023 (this edition carries NO "End of November" stub section at all -- Advent Sunday 2023 fell on 3 December, so only 2 tail days of the prior liturgical year remained, and the compiler folded them directly into the "December 2023" header instead of giving them their own mini-section; see CHARACTERISATION below)|} + ) + | "lms-ordo-2025-2026.sexp" -> + ( "2025-2026", + "978-1-7392096-5-0", + "2025", + {|Author "Peter Day-Milne", Producer "LibreOffice 25.2.6.2 (X86_64) / LibreOffice Community", CreationDate 2025-10-23, 146 pages|}, + "(not found -- see the note on this line)", + "NOT found by URL-pattern web search this session (unlike the 2023-2024 and 2024-2025 editions, no exact download link matching this PDF's own filename/version turned up under lms.org.uk/sites/default/files/u5374/; several near-miss candidates were checked and rejected -- none matched this PDF's own metadata) -- left honestly blank rather than guessed; the file was supplied locally to this session, not fetched by this tool", + {|28 November 2025 ("End of November 2025", the same shape as the 2024-2025 edition -- Advent Sunday 2025 fell on 30 November, so only 3 tail days remained; note this excludes 27 November 2025, which the PRECEDING edition's own window (2024-2025, through 2025-12-31) already covers -- a one-day-short overlap between consecutive editions' own windows, not a gap or a bug in either extraction|} + ) + | _ -> die "no provenance/characterisation entry for %s -- add one to extract_lms_ordo.ml's own per-edition table before generating this fixture (the tool refuses to emit an under-characterised header)" base + in + let creed_of_date rows d = List.find_map (fun r -> if String.equal r.date d then r.creed else None) rows in + let probes = + match base with + | "lms-ordo-2023-2024.sexp" -> + [ ("2023-12-03", true, "Advent Sunday, RG 475(a)"); + ("2023-12-04", false, "St Peter Chrysologus, III class, ordinary Advent day, RG 476(b)/(d)"); + ("2023-12-26", true, "St Stephen, II class, inside the Nativity octave, RG 475(d)"); + ("2024-08-15", true, "the Assumption, I class, RG 475(b)"); + ("2024-08-16", false, "St Joachim, II class, no Lord/BVM/apostle clause applies, RG 476(b)") ] + | "lms-ordo-2025-2026.sexp" -> + [ ("2025-11-30", true, "Advent Sunday, RG 475(a)"); + ("2025-12-01", false, "ordinary Advent feria, RG 476(b)/(d)"); + ("2025-12-26", true, "St Stephen, II class, inside the Nativity octave, RG 475(d)"); + ( "2026-08-10", false, + "St Laurence, II class martyr, no Lord/BVM/apostle clause applies, RG 476(b) -- St Joachim (16 August) is IMPEDED by a Sunday in this edition's own calendar (12th Sunday after Pentecost), so this edition needed a DIFFERENT sharp non-octave II-class pairing than the 2023-2024/2024-2025 editions used; a real, edition-specific finding, not an extraction quirk" + ); + ("2026-08-15", true, "the Assumption, I class, RG 475(b)") ] + | _ -> die "no probe list for %s" base + in + List.iter + (fun (d, expected, desc) -> + match creed_of_date rows d with + | Some got when Bool.equal got expected -> () + | Some got -> die "characterisation probe FAILED: %s (%s) -- expected creed=%b, extracted creed=%b" d desc expected got + | None -> die "characterisation probe FAILED: %s (%s) -- no row extracted for this date at all" d desc) + probes; + Printf.printf "extract_lms_ordo: all %d characterisation probes confirmed for %s\n" (List.length probes) edition_label; + let probe_lines = + String.concat "\n" + (List.map + (fun (d, expected, desc) -> Printf.sprintf "; %s (%s) -> %s" d desc (if expected then "TRUE" else "FALSE")) + probes) + in let header = Printf.sprintf - {|; test/fixtures/lms-ordo-2024-2025.sexp -- Task 6 (2026-08-21-colitur- -; celebrant-rubrics-phase1)'s sixth validation layer: the Latin Mass -; Society's own printed Ordo, an England & Wales diocesan Ordo -- a + {|; %s -- Witnesses task (2026-08-22-colitur-celebrant-rubrics-phase1), +; extending Task 6's single LMS fixture (2024-2025) to three editions of +; the Latin Mass Society's own printed Ordo for England & Wales -- a ; lineage independent of Divinum Officium/missalemeum/lectio (layers 3-4) ; and of the electronic LT.txt transcription (layers 1-2/5): a physically ; printed, professionally-compiled liturgical calendar with its own ISBN. @@ -318,97 +448,94 @@ let () = ; Generator: tools/extract_lms_ordo.ml -- do not hand-edit; re-run against ; a fresh pdftotext dump and commit the diff instead. ; -; Source: "The Ordo 2024-2025", compiled by Peter Day-Milne, The Latin +; Source: "The Ordo %s", compiled by Peter Day-Milne, The Latin ; Mass Society, 9 Mallow Street, London EC1Y 8RQ (title page and ; colophon, verified directly against the PDF's own extracted text -- -; ISBN 9781739209636, Copyright (c) The Latin Mass Society, UK 2024). -; PDF metadata: Author "Peter Day-Milne", Producer "LibreOffice 7.4", -; CreationDate 2024-11-06, 140 pages. -; URL (identified 2026-08-22 via web search matching the PDF's own -; version number and filename to the publisher's own hosting path; -; NOT independently re-downloaded and byte-compared in this session -- -; recorded honestly rather than presented as verified): -; https://lms.org.uk/sites/default/files/u5374/ordo_2.21_2024-2025.pdf -; (product page: https://lms.org.uk/product/latin-mass-society-ordo-2024-25) -; The local PDF (docs/research/ordo/lms-ordo-2024-2025.pdf) is gitignored +; ISBN %s, Copyright (c) The Latin Mass Society, UK %s). +; PDF metadata: %s. +; URL (%s): +; %s +; The local PDF (docs/research/ordo/%s) is gitignored ; (CLAUDE.md: "docs/ is gitignored"), so this header, not git, is this ; fixture's only record of where it came from. -; SHA-256 of docs/research/ordo/lms-ordo-2024-2025.pdf: %s +; SHA-256 of docs/research/ordo/%s: %s ; Extracted (UTC): %s ; Exact commands: -; pdftotext -layout docs/research/ordo/lms-ordo-2024-2025.pdf /tmp/lms.txt +; pdftotext -layout docs/research/ordo/%s /tmp/lms.txt ; dune exec tools/extract_lms_ordo.exe -- /tmp/lms.txt \ -; docs/research/ordo/lms-ordo-2024-2025.pdf test/fixtures/lms-ordo-2024-2025.sexp +; docs/research/ordo/%s %s ; -; COVERAGE: %d day-rows, %s through %s (2024-11-27, "End of November 2024", +; COVERAGE: %d day-rows, %s through %s (starting %s, ; through the day before a malformed trailing entry the extractor ; deliberately stops before -- see CHARACTERISATION below). ; ; CHARACTERISATION FINDINGS (Step 1, non-negotiable per the task brief -- ; the extraordinaryform.org Ordo silently omitted St Lawrence's vigil on ; EVERY date it covered, which nearly produced a false corroboration -; during the RG 33 work; this Ordo was probed with the same discipline -; before a single divergence was adjudicated): +; during the RG 33 work; every LMS edition, including this one, is probed +; with the same discipline before a single divergence is adjudicated): ; -; 1. Gl/Cr are printed PER MASS-OPTION, not per day (confirmed: this PDF -; alone -- not the multi-year corpus the task brief's own grep count -; was measured against -- carries many more Gl/Cr pairs than day-rows, -; because every diocesan variant repeats its own "Gl ... Cr ... Pr of -; ..." line). This extractor resolves the day's OWN office by taking -; the FIRST Gl/Cr pair in reading order, which the source's own layout +; 1. Gl/Cr are printed PER MASS-OPTION, not per day (confirmed again for +; THIS edition: it carries many more Gl/Cr pairs than day-rows, because +; every diocesan variant repeats its own "Gl ... Cr ... Pr of ..." +; line). This extractor resolves the day's OWN office by taking the +; FIRST Gl/Cr pair in reading order, which the source's own layout ; guarantees is the universal entry's (diocesan variants are always ; introduced by a colon-terminated diocese-list line that comes AFTER ; the universal block, never before -- checked structurally, not -; assumed, in every sampled block during development). +; assumed, in every sampled block during development, this edition +; included). ; ; 2. OPPOSITE-PREDICTION PROBES against Rite_ef.Rubrics_ef.creed (RG -; 475-476), checked BEFORE trusting a single row of this fixture -- +; 475-476), RE-CHECKED BY THIS TOOL RUN (not merely copied from a prior +; edition's findings) before a single row of this fixture is trusted -- ; the technique CLAUDE.md records as the one that catches a source -; silently omitting the very thing it is meant to witness: -; 2024-12-01 (Advent Sunday, RG 475(a)) -- Ordo "No Gl Cr" -> TRUE -; 2024-12-02 (ordinary Advent feria) -- Ordo "Gl No Cr" -> FALSE -; 2024-12-26 (St Stephen, II class, but inside the Nativity octave, -; RG 475(d)) -- Ordo "Gl Cr" -> TRUE -; 2025-08-15 (the Assumption, I class, RG 475(b)) -; -- Ordo "Gl Cr" -> TRUE -; 2025-08-16 (St Joachim, II class, no Lord/BVM/apostle clause -; applies, RG 476(b)) -- Ordo "Gl No Cr" -> FALSE -; All five predictions confirmed, both directions (TRUE and FALSE each -; independently witnessed, including the Stephen/Joachim pair, which -; are BOTH II-class non-Sunday saints and differ ONLY on the octave -; question) -- this source is discriminating, not a constant, on the -; Creed. See task-6-report.md for the full record. +; silently omitting the very thing it is meant to witness. This run's +; own extracted [rows] were checked against every one of the following +; before this header was even written; a failure here is a hard [die], +; not a printed claim: +%s +; All %d predictions confirmed, both directions (TRUE and FALSE each +; independently witnessed) -- this edition is discriminating, not a +; constant, on the Creed. ; ; 3. The BVM-Saturday roman numeral (I-V, "Missae de sancta Maria in ; sabbato", RG 309(a)) is anchored by WHOLE-LINE match against the five ; literal strings below, NEVER by substring search: "V Mass of BVM" is ; a substring of "IV Mass of BVM", so a naive `contains` check ; misreads every fourth-Mass day as the fifth (the coordinator's own -; misreading, recorded and retracted in commit 27b07b4 before this -; task existed). +; misreading, recorded and retracted in commit 27b07b4 before Task 6 +; existed; the same anchoring logic runs unchanged for every edition). ; ; 4. SCOPE EXCLUDED, quantified, not silently dropped: ; - Diocesan variants: present on %d of %d days (%s%%) -- their own ; text is read only far enough to set [has_diocesan_variant], ; never compared, because colitur computes the UNIVERSAL General ; Roman Calendar only, with no diocesan overlay loaded. -; - The single malformed trailing entry ("2025 1 The OCTAVE DAY of -; the NATIVITY..." printed with "Thu" wrapped onto the following -; line and the year token "2025" where "2026" belongs -- a literal -; duplicate, word for word, of the fixture's own already-extracted -; 2025-01-01 row) is excluded outright: the extractor's own stop -; marker (a line whose first token is a bare 4-digit year) halts -; the scan before it, so this fixture's last row is 2025-12-31. +; - The single malformed trailing entry ("...The OCTAVE DAY of the +; NATIVITY..." with a bare 4-digit token where a weekday+day-number +; pair belongs) is excluded outright: the extractor's own stop +; marker (a line whose first token is a bare 4-digit token) halts +; the scan before it. CONFIRMED IDENTICAL, word for word, across +; ALL FOUR known editions of this publisher's Ordo (2023-2024, +; 2024-2025, 2025-2026, and the 2024-2025 fixture's own prior +; header) -- always the literal stray year token "2025", regardless +; of which edition or which real trailing year it should read: a +; stale copy-paste leftover the compiler's own master document +; carries forward unedited release to release (even the 2024-2025 +; PDF's own tail page footer nearby still reads "Latin Mass Society +; Ordo 2021-2022"), not something specific to this edition. ; - Front matter, the Abbreviations/Rubrical-Primer/Breviary sections, ; and the "When may I say...?"/Appendix tail are never scanned at -; all (the extractor's own start/stop sentinels bound it to the -; Ordo proper, "End of November 2024" through the stop marker -; above). +; all (the extractor's own start/stop markers bound it to the Ordo +; proper). |} - pdf_sha (today ()) (List.length rows) + dest edition_label isbn copyright_year pdf_meta url_note url pdf_base pdf_base pdf_sha (today ()) pdf_base + pdf_base dest + (List.length rows) (match rows with r :: _ -> r.date | [] -> "?") (match List.rev rows with r :: _ -> r.date | [] -> "?") - with_variant (List.length rows) + window_open_desc probe_lines (List.length probes) with_variant (List.length rows) (Printf.sprintf "%.1f" (100.0 *. float_of_int with_variant /. float_of_int (List.length rows))) in let body = Sexplib.Sexp.to_string_hum ~indent:2 (sexp_of_list sexp_of_row rows) in -- cgit v1.3 From 96aed1b6f04ef89e8f3d18af8b13e6fd30dbd4d2 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Sat, 22 Aug 2026 15:11:43 +0200 Subject: test(fiuv-ordo): add the FIUV universal Ordo as a second, independent witness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wires in the FIUV (Foederatio Internationalis Una Voce) Ordo for 2025-2026 as validation layer seven -- the first UNIVERSAL (not diocesan) source in this project, and the first compiled by someone other than the LMS editions' own Peter Day-Milne (Joseph Shaw, FIUV President). tools/extract_fiuv_ordo.ml hand-parses pdftotext's -layout dump of the Latin-language ordo (no Str/regex, frozen deps). Three real parsing traps were found and fixed by tracing actual false results against the raw source, not assumed in advance: - "Gloria" is also the first word of "Gloria Patri" (the psalm doxology), which can appear INSIDE the very Mass clause being scanned (Good Friday: "...omittuntur ps. Iudica me et Gloria Patri), Gloria, sine Credo..."). Guarded by rejecting any "Gloria" hit whose next token is "Patri". - Christmas Day's own rubric uses the PLURAL "Missae"/"Missae" ("tres Missae celebrantur..."), never the singular "Missa" every other real day anchors on -- silently produced gloria=None/credo=None on the one most doctrinally unambiguous day in the calendar until traced and fixed, guarded in turn against "Missae defunctorum" (an unrelated Requiem-prohibition notice appearing at the end of many day-blocks). - The Vespers boundary (bounding the primary Mass option before a second "Vel Missa" alternative or before Vespers information) missed the ligature spelling "VESPERÆ", the dominant form in this source, letting a whole day's trailing prose leak into the captured [praef] field on the task brief's own worked example day (19 September). A distinct second stop-marker bug: the malformed trailing entry this source shares structurally with the LMS PDFs (a stray, mislabelled duplicate of 1 January) was initially over-matched by a generic "first token is 4 digits" heuristic, which false-positived on an indulgence-decree date citation wrapped mid-sentence in October ("...20 augusti / 1885, 26 augusti 1886..."), truncating the extraction to 308 of 400 real days. Fixed by anchoring on the tail entry's own distinctive "1st Jan" opening instead. Five opposite-prediction Creed probes are re-verified by the tool itself against its own extracted rows (a failed probe is a hard exit, not a printed claim) before the fixture is written. test/test_fiuv_ordo.ml compares the Creed against colitur across all 399 comparable days (Holy Saturday excluded, no Mass that day) -- CLEAN, zero unexplained divergences, a genuine second confirmation of {!Rite_ef.Rubrics_ef.creed} independent of the LMS lineage. [praef], [te_deum] and [class_] (including the FIUV ordo's own "III cl." vs "III cl. (Priv.)" Cum Sanctissima convention, stated on its title page) are captured into the fixture but deliberately not compared -- colitur has no Gloria/preface predicate yet, and its default configuration models no Cum Sanctissima overlay to compare the class convention against. All 634 tests green (dune test), 635 with the exhaustive sweep and make check. No lib/ file touched. Claude-Session: https://claude.ai/code/session_017ZBxCCRM2ojnBupp3SBxV9 --- data/ef/expected-divergences-fiuv.sexp | 26 + test/dune | 2 + test/fixtures/fiuv-ordo-2025-2026.sexp | 1558 ++++++++++++++++++++++++++++++++ test/test_colitur.ml | 2 +- test/test_fiuv_ordo.ml | 268 ++++++ tools/dune | 14 + tools/extract_fiuv_ordo.ml | 637 +++++++++++++ 7 files changed, 2506 insertions(+), 1 deletion(-) create mode 100644 data/ef/expected-divergences-fiuv.sexp create mode 100644 test/fixtures/fiuv-ordo-2025-2026.sexp create mode 100644 test/test_fiuv_ordo.ml create mode 100644 tools/extract_fiuv_ordo.ml (limited to 'test/dune') diff --git a/data/ef/expected-divergences-fiuv.sexp b/data/ef/expected-divergences-fiuv.sexp new file mode 100644 index 0000000..5506e46 --- /dev/null +++ b/data/ef/expected-divergences-fiuv.sexp @@ -0,0 +1,26 @@ +; data/ef/expected-divergences-fiuv.sexp -- Witnesses task +; (2026-08-22-colitur-celebrant-rubrics-phase1)'s cited allow-list for the +; FIUV Ordo comparison (test/test_fiuv_ordo.ml), fixture window +; 2025-11-27..2026-12-31. +; +; A SEPARATE file from data/ef/expected-divergences-lms.sexp (the LMS +; allow-list, also third-party but England & Wales diocesan and single- +; compiler across its three editions), data/ef/expected-divergences.sexp +; (the lectio allow-list) and data/ef/expected-divergences-missalemeum.sexp +; (the missalemeum/Divinum-Officium-lineage allow-list): the FIUV Ordo is +; a FOURTH, independent lineage -- universal, not diocesan, compiled by a +; different person (Joseph Shaw) than the LMS editions (Peter Day-Milne). +; +; [verdict] names which side this task's own primary-source research +; backs, the SAME convention every other allow-list file in this project +; uses: not always "colitur". +; +; Empty as of this task: the Creed comparison found no unexplained +; divergence anywhere in the 400-day window (399 comparable days, Holy +; Saturday excluded per test_creed_coverage -- see that test's own +; citation). Kept as a file, not deleted, on the same footing as +; expected-divergences-lms.sexp's own empty-but-live state after L1's +; closure: the machinery that would explain a FUTURE divergence needs +; somewhere to live, and an empty allow-list with a live "every entry +; must be used" check is a real invariant worth keeping, not a +; formality. diff --git a/test/dune b/test/dune index 17865c4..374fa8f 100644 --- a/test/dune +++ b/test/dune @@ -10,6 +10,7 @@ ../data/ef/expected-divergences.sexp ../data/ef/expected-divergences-missalemeum.sexp ../data/ef/expected-divergences-lms.sexp + ../data/ef/expected-divergences-fiuv.sexp ../data/ef/lectionary.sexp ../data/ef/commons.sexp ../data/ef/examples/diocesan-example.sexp @@ -20,6 +21,7 @@ fixtures/lms-ordo-2023-2024.sexp fixtures/lms-ordo-2024-2025.sexp fixtures/lms-ordo-2025-2026.sexp + fixtures/fiuv-ordo-2025-2026.sexp ../templates/ef/ordo.tex ../templates/ef/ordo.ms ../templates/ef/ordo.html diff --git a/test/fixtures/fiuv-ordo-2025-2026.sexp b/test/fixtures/fiuv-ordo-2025-2026.sexp new file mode 100644 index 0000000..7b72ca3 --- /dev/null +++ b/test/fixtures/fiuv-ordo-2025-2026.sexp @@ -0,0 +1,1558 @@ +; test/fixtures/fiuv-ordo-2025-2026.sexp -- Witnesses task (2026-08-22-colitur- +; celebrant-rubrics-phase1)'s SEVENTH validation layer, and the first +; UNIVERSAL (non-diocesan), SECOND-COMPILER witness: the FIUV (Foederatio +; Internationalis Una Voce) Ordo, compiled independently of the Latin Mass +; Society's own three editions (test/test_lms_ordo.ml) -- see +; docs/research/ordo/PROVENANCE-ordo-corpus.md for the full four-reasons +; account of why this source is the more valuable of the two newly- +; acquired ones. +; +; Generator: tools/extract_fiuv_ordo.ml -- do not hand-edit; re-run +; against a fresh pdftotext dump and commit the diff instead. +; +; Source: "Ordo Divini Officii recitandi sacrique peragendi secundum +; antiquam Ritus Romani formam pro anno Domini 2026", Foederatio +; Internationalis Una Voce, compiled by Joseph Shaw (Praefatio signed +; "Joseph Shaw, President", Feast of the Nativity of Our Lady [8 Sept] +; 2025) -- title page and Praefatio, verified directly against the PDF's +; own extracted text. 2025 is stated as the Federation's own 60th +; anniversary year. +; PDF metadata: Creator "TeX", Producer "pdfTeX-1.40.22", CreationDate +; 2025-11-08, 128 pages. +; URL: identified via web search as +; https://lms.org.uk/sites/default/files/u5374/fiuv_ordo_2025-2026_1.1_a5_format.pdf +; (hosted by the Latin Mass Society's own site alongside its own three +; editions -- Joseph Shaw is both FIUV President and LMS Chairman, which +; plausibly also explains why this PDF's own trailing malformed entry +; (see COVERAGE below) is structurally identical to the LMS PDFs' own, +; despite the two being compiled by different people); NOT independently +; re-downloaded and byte-compared in this session -- recorded honestly +; rather than presented as verified, the same discipline the LMS +; fixtures' own headers use. +; The local PDF (docs/research/ordo/fiuv-ordo-2025-2026.pdf) is gitignored (CLAUDE.md: "docs/ +; is gitignored"), so this header, not git, is this fixture's only record +; of where it came from. +; SHA-256 of docs/research/ordo/fiuv-ordo-2025-2026.pdf: 4335cc112b5fb6ec4d9511465ccc9381bed9b6056a56bc82dbaa5b2d85d0d855 +; Extracted (UTC): 2026-08-22 +; Exact commands: +; pdftotext -layout docs/research/ordo/fiuv-ordo-2025-2026.pdf /tmp/fiuv.txt +; dune exec tools/extract_fiuv_ordo.exe -- /tmp/fiuv.txt \ +; docs/research/ordo/fiuv-ordo-2025-2026.pdf test/fixtures/fiuv-ordo-2025-2026.sexp +; +; COVERAGE: 400 day-rows, 2025-11-27 through 2026-12-31. Starts at the book's own first +; real content line ("November MMXXV", the FIRST month header found with +; a parseable Roman-numeral year -- used as this parser's sole date +; anchor, see the tool's own header on why no LATER header's year is ever +; read, the second one being a publisher typo, "December MMXV" for 2025). +; Stops before a malformed trailing entry, structurally the SAME artefact +; found in all three LMS editions (a stray, mislabelled duplicate of the +; fixture's own already-extracted 1 January row, headed "1st Jan / 2025." +; -- see extract_lms_ordo.ml's own COVERAGE section for the fuller +; account of this shared publisher-side quirk). +; +; CHARACTERISATION FINDINGS (non-negotiable per the task brief -- the +; extraordinaryform.org Ordo silently omitted St Lawrence's vigil on +; EVERY date it covered, which nearly produced a false corroboration +; during the RG 33 work; this Ordo was probed with the same discipline +; before a single divergence was adjudicated): +; +; 1. UNIVERSAL, not diocesan: unlike the three LMS editions (which had to +; exclude diocesan variants from every comparison, quantified in each +; of their own fixture headers), this Ordo carries ONE block per day, +; always. There is no [has_diocesan_variant] field in this fixture's +; own [row] at all -- there is nothing to exclude. +; +; 2. OPPOSITE-PREDICTION PROBES against Rite_ef.Rubrics_ef.creed (RG +; 475-476), RE-CHECKED BY THIS TOOL RUN against its own extracted +; [rows] before this header was even written -- a failed probe is a +; hard [die], never a printed claim: +; 2025-11-30 (Advent Sunday, I class, RG 475(a)) -> TRUE +; 2025-12-01 (ordinary Advent feria, III class, RG 476(b)/(d)) -> FALSE +; 2025-12-26 (St Stephen, II class, inside the Nativity octave, RG 475(d)) -> TRUE +; 2026-08-10 (St Laurence, II class martyr, no Lord/BVM/apostle clause applies, RG 476(b)) -> FALSE +; 2026-08-15 (the Assumption, I class, RG 475(b)) -> TRUE +; All 5 predictions confirmed, both directions -- this source is +; discriminating, not a constant, on the Creed. +; +; 3. THE SUBSTRING TRAP this parser defends against, found live in this +; corpus: "Gloria" is also the first word of "Gloria Patri" (the psalm +; doxology), which can appear INSIDE the very Mass clause being +; scanned (Good Friday, 3 April 2026: "Missa pr., (omittuntur ps. +; Iudica me et Gloria Patri), Gloria, sine Credo, praef. comm." -- the +; real, standalone Gloria mention follows immediately after). See +; [find_word]'s own citation. +; +; 4. RAW SUBSTRING COUNTS measured against this session's own pdftotext +; dump, for comparison against the task brief's own figures (328 +; Gloria / 132 sine Gloria / 119 Credo / 260 sine Credo, 262 Te Deum): +; "sine Gloria" 132 (EXACT match), "sine Credo" 260 (EXACT match), raw +; "Te Deum" substring 262 (EXACT match, includes negated occurrences +; as substring hits -- 42 of them are "non dicitur Te Deum"). Raw +; "Gloria"/"Credo" substring totals (494/411) do NOT match the brief's +; implied positive totals (328/119) even after subtracting the 25 +; "Gloria Patri" occurrences (469, still 9 over) -- not chased further +; here; this extractor's own token-scoped, Missa-clause-bounded counts +; below are what this fixture actually asserts, not a forced match to +; the brief's approximate figures. +; +; MEASURED DISTRIBUTION (this extraction, not the brief's figures): Gloria +; true=269 false=130 unresolved=1; Credo true=116 false=283 unresolved=1; +; Te Deum true=231 false=42 unresolved=127. +(((date 2025-11-27) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. XXIV & Ultima post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2025-11-28) (class_ ("IV cl.")) + (title "Vir Feria VI post Dom. XXIV & Ultima post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-11-29) (class_ ("IV cl.")) + (title "Alb Sabb. S. Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione \226\128\147"))) + ((date 2025-11-30) (class_ ("I cl.")) + (title "Viol DOM. I ADVENTUS, De ea,") (te_deum (true)) (gloria (false)) + (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2025-12-01) (class_ ("III cl.")) + (title "Viol Feria II post Dom. I Adventus, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-02) (class_ ("III cl.")) + (title "Rub Feria III. S Bibianae Virg. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. AD"))) + ((date 2025-12-03) (class_ ("III cl. (Priv.)")) + (title "Alb Feria IV. S Francisci Xavierii Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. AD"))) + ((date 2025-12-04) (class_ ("III cl.")) + (title "Alb Feria V. S Petri Chrysologi Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Barbarae Virg. et Mart. (rub.) Loquebar de testimoniis tuis, Gloria, comm. 1\194\170 Feriae, comm. 2\194\170 S Petri Chrysologi Ep., Conf. et Eccl. Doct., praef. comm. vel de Martyribus. AD"))) + ((date 2025-12-05) (class_ ("III cl.")) + (title "Viol Feria VI post Dom. I Adventus, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("comm. Feria VI prima in mense."))) + ((date 2025-12-06) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. S Nicolai Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. Sabbatum primum in mense. I"))) + ((date 2025-12-07) (class_ ("I cl.")) + (title "Viol DOM. II ADVENTUS, De ea,") (te_deum (true)) (gloria (false)) + (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2025-12-08) (class_ ("I cl.")) + (title "Alb Feria II. IN CONCEPTIONE IMMACULATA B. MARIAE VIRGINIS,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("BMV Et te in Conceptione Immaculata. AD"))) + ((date 2025-12-09) (class_ ("III cl.")) + (title "Viol Feria III post Dom. II Adventus, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-10) (class_ ("III cl.")) + (title "Viol Feria IV post Dom. II Adventus, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-11) (class_ ("III cl. (Priv.)")) + (title "Alb Feria V. S Damasi I Papae et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. AD"))) + ((date 2025-12-12) (class_ ("III cl.")) + (title "Viol Feria VI post Dom. II Adventus, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-13) (class_ ("III cl. (Priv.)")) + (title "Rub Sabb. S Luciae Virg. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. I"))) + ((date 2025-12-14) (class_ ("I cl.")) + (title "Viol/ DOM. III ADVENTUS (GAUDETE), De ea,") (te_deum (true)) + (gloria (false)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2025-12-15) (class_ ("III cl.")) + (title "Viol Feria II post Dom. III Adventus (Gaudete), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-16) (class_ ("III cl.")) + (title "Alb Feria III. S Eusebii Ep. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. AD"))) + ((date 2025-12-17) (class_ ("II cl.")) + (title "Viol FERIA IV QUATTUOR TEMP., De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("comm.\226\128\147 Quoad Flectamus genua vide RM 440."))) + ((date 2025-12-18) (class_ ("II cl.")) + (title "Viol FERIA V POST DOM. III ADVENTUS (GAUDETE), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-19) (class_ ("II cl.")) + (title "Viol FERIA VI QUATTUOR TEMP., De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-20) (class_ ("II cl.")) + (title "Viol SABB. QUATTUOR TEMP., De eo,") (te_deum ()) (gloria (false)) + (credo (false)) + (praef + ("comm. \226\128\147 Quoad Flectamus genua vide RM 440. Quoad lectiones vide RM 468. I"))) + ((date 2025-12-21) (class_ ("I cl.")) + (title "Viol DOM. IV ADVENTUS, De ea,") (te_deum (true)) (gloria (false)) + (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2025-12-22) (class_ ("II cl.")) + (title "Viol FERIA II POST DOM. IV ADVENTUS, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-23) (class_ ("II cl.")) + (title "Viol FERIA III POST DOM. IV ADVENTUS, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2025-12-24) (class_ ("I cl.")) + (title "Viol Feria IV. VIGILIA NATIVITATIS DOMINI,") (te_deum (true)) + (gloria (false)) (credo (false)) (praef ("comm. I"))) + ((date 2025-12-25) (class_ ("I cl.")) + (title "Alb Feria V. IN NATIVITATE DOMINI,") (te_deum ()) (gloria (true)) + (credo (true)) + (praef + ("et Communic. pr. per totam oct. \226\128\147 In Communicantes: in 1\194\170 Missa dicitur Noctem sacratissimam celebrantes, qua, in 2\194\170 et 3\194\170 Missa et per octavam Diem sacratissimum celebrantes, quo. \226\128\147 In 2\194\170 Missa (etiam in cantu) fit comm. S. Anastasi\195\166 * M. \226\128\147 In Missis in cantu, ad verba symboli Et incarnatus est\226\128\166 et homo factus est, omnes genuflectunt versus altare, non tantum cum a celebrante recitantur, sed etiam cum a choro canuntur (RM 518 b). II"))) + ((date 2025-12-26) (class_ ("II cl.")) + (title "Rub Feria VI. S STEPHANI * PROTOMARTYRIS,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. AD"))) + ((date 2025-12-27) (class_ ("II cl.")) + (title "Alb Sabb. S IOANNIS * AP. ET EV.,") (te_deum ()) (gloria (true)) + (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. AD"))) + ((date 2025-12-28) (class_ ("II cl.")) + (title "Alb DOM. INFRA OCTAVAM NATIVITATIS, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. Ad II"))) + ((date 2025-12-29) (class_ ("II cl.")) + (title "Alb FERIA II DOM. INFRA OCTAVAM NATIVITATIS, De ea,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum."))) + ((date 2025-12-30) (class_ ("II cl.")) + (title "Alb FERIA III DOM. INFRA OCTAVAM NATIVITATIS, De ea,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum."))) + ((date 2025-12-31) (class_ ()) + (title + "Alb FERIA IV DOM. INFRA OCTAVAM NATIVITATIS, De ea. \226\128\147 Off. semifestivum. \226\128\147 Ad MAT. invit., hymnus, 9 antt. et 9 pss. cum ultimo V de festo Nativ., Ll. de Scr. occ. cum suis RR (ad 2um additur Gloria Patri)\226\128\147 Ad Laudes antt. de Nativ., pss. de dom., comm. S Silvestri I Papae et Conf. \226\128\147 Ad HORAS ant. et pss. de feria curr., rel ut in festo Nativ. \226\128\147 Ad Primam in R Br. V Qui natus es de Maria Virgine. Missa Puer natus de diebus infra octavam, Gloria, Credo, comm. S Silvestri I Papae et Conf., praef. de Nativ., Communic. de Nativ. diem sacratissimum. I VESPER\195\134 de seq. \226\128\147 Compl. de dom. Hodie ad solemnem recitationem hymni Te Deum, indulgentia plenaria lucrari potest. 16") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. I"))) + ((date 2026-01-01) (class_ ("I cl.")) + (title "Al Feria V. OCTAVA NATIVITATIS,") (te_deum ()) (gloria (true)) + (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. II"))) + ((date 2026-01-02) (class_ ("IV cl.")) + (title "Alb Feria VI post Octavam Nativitatis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("de Nativ., sine Communic. pr. Feria VI prima in mense."))) + ((date 2026-01-03) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione \226\128\147"))) + ((date 2026-01-04) (class_ ("II cl.")) + (title "Alb Dom. SS.MI NOMINIS IESU,") (te_deum ()) (gloria (true)) + (credo (true)) (praef ("de Nativ., sine Communic. pr. II"))) + ((date 2026-01-05) (class_ ("IV cl.")) + (title "Alb Feria II post Octavam Nativitatis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("de Nativ., sine Communic. pr. \226\128\147"))) + ((date 2026-01-06) (class_ ("I cl.")) + (title "Alb Feria III. IN EPIPHANIA DOMINI,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("et Communic pr. II"))) + ((date 2026-01-07) (class_ ("IV cl.")) + (title "Alb Feria IV post Epiphaniam, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("de Epiphania."))) + ((date 2026-01-08) (class_ ("IV cl.")) + (title "Alb Feria V post Epiphaniam, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("de Epiphania."))) + ((date 2026-01-09) (class_ ("IV cl.")) + (title "Alb Feria VI post Epiphaniam, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("de Epiphania."))) + ((date 2026-01-10) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione. I"))) + ((date 2026-01-11) (class_ ("II cl.")) + (title + "Alb Dom. I post Epiphaniam. SANCT\195\134 FAMILI\195\134 IESU, MARI\195\134, IOSEPH *,") + (te_deum ()) (gloria (true)) (credo (true)) (praef ("de Epiphania. II"))) + ((date 2026-01-12) (class_ ("IV cl.")) + (title "Alb Feria II post Dom. I post Epiphaniam, De ea,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("de Epiphania."))) + ((date 2026-01-13) (class_ ("II cl.")) + (title "Alb Feria III. IN COMMEMORATIONE BAPTISMATIS D.N.I.C.,") + (te_deum ()) (gloria (true)) (credo (true)) (praef ("de Epiphania. Ad"))) + ((date 2026-01-14) (class_ ("III cl.")) + (title "Alb Feria IV. S Hilarii Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Felicis Presbyt. et Mart. (rub.) L\195\166tabitur iustus, Gloria, ors. pr., comm. S Hilarii Ep., Conf. et Eccl. Doct., praef. comm. vel de Martyribus. Ad"))) + ((date 2026-01-15) (class_ ("III cl.")) + (title "Alb Feria V. S Pauli Primi Eremitae Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Mauri Abbatis. (alb.) Os iusti de Comm. Abb., Gloria, comm. S Pauli Primi Eremitae Conf., praef. comm."))) + ((date 2026-01-16) (class_ ("III cl.")) + (title "Rub Feria VI. S Marcelli I Papae et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus."))) + ((date 2026-01-17) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. S Antonii Abb.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("comm. I"))) + ((date 2026-01-18) (class_ ("II cl.")) + (title "Vir DOM. II POST EPIPHANIAM, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-01-19) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. II post Epiphaniam, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-01-20) (class_ ("III cl. (Priv.)")) + (title "Rub Feria III. SS Fabiani Papae et Sebastiani Mm.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. vel de Martyribus."))) + ((date 2026-01-21) (class_ ("III cl. (Priv.)")) + (title "Rub Feria IV. S Agnetis * Virg. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. Ad"))) + ((date 2026-01-22) (class_ ("III cl.")) + (title "Rub Feria V. SS Vincentii et Anastasii Mm.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus."))) + ((date 2026-01-23) (class_ ("III cl.")) + (title "Alb Feria VI. S Raymundi de Pe\195\177afort Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Emerentianae Virg. et Mart. (rub.) Me exspectaverunt, Gloria, comm. S Raymundi de Pe\195\177afort Conf., praef. comm. vel de Martyribus. \226\128\147"))) + ((date 2026-01-24) (class_ ("III cl. (Priv.)")) + (title "Rub Sabb. S Timothei Ep. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. I"))) + ((date 2026-01-25) (class_ ("II cl.")) + (title "Vir DOM. III POST EPIPHANIAM, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-01-26) (class_ ("III cl. (Priv.)")) + (title "Rub Feria II. S Polycarpi Ep. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus."))) + ((date 2026-01-27) (class_ ("III cl. (Priv.)")) + (title "Alb Feria III. S Ioannis Chrysostomi Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-01-28) (class_ ("III cl.")) + (title "Alb Feria IV. S Petri Nolasci Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa pr. S Agnetis * Virg. et Mart. secundo. (rub.), Gloria, comm. S Petri Nolasci Conf., praef. comm. vel de Martyribus."))) + ((date 2026-01-29) (class_ ("III cl. (Priv.)")) + (title "Alb Feria V. S Francisci Salesii Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-01-30) (class_ ("III cl.")) + (title "Rub Feria VI. S Martinae Virg. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus."))) + ((date 2026-01-31) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. S Ioannis Bosco Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. I"))) + ((date 2026-02-01) (class_ ("II cl.")) + (title "Viol DOM. SEPTUAGESIMAE, De ea,") (te_deum (true)) + (gloria (false)) (credo (true)) (praef ("Trinit. II"))) + ((date 2026-02-02) (class_ ("II cl.")) + (title "Alb Feria II. IN PURIFICATIONE B. MARIAE VIRG.,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("de Nativ. Ad benedictionem candelarum: ut in Missali. Ad"))) + ((date 2026-02-03) (class_ ("IV cl.")) + (title "Viol Feria III Dom. Septuagesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("comm. \226\128\147"))) + ((date 2026-02-04) (class_ ("III cl.")) + (title "Alb Feria IV. S Andreae Corsini Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-02-05) (class_ ("III cl. (Priv.)")) + (title "Rub Feria V. S Agathae * Virg. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. Ad"))) + ((date 2026-02-06) (class_ ("III cl. (Priv.)")) + (title "Alb Feria VI. S Titi Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. Feria VI prima in mense."))) + ((date 2026-02-07) (class_ ("III cl.")) + (title "Alb Sabb. S Romualdi Abb.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("comm. Sabbatum primum in mense. I"))) + ((date 2026-02-08) (class_ ("II cl.")) + (title "Viol DOM. SEXAGESIMAE, De ea,") (te_deum (true)) (gloria (false)) + (credo (true)) (praef ("Trinit. II"))) + ((date 2026-02-09) (class_ ("III cl.")) + (title "Alb Feria II. S Cyrilli Ep. Alexandrini, Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Apolloniae Virg. et Mart. (rub.) Loquebar de testimoniis tuis, Gloria, comm. S Cyrilli Ep. Alexandrini, Conf. et Eccl. Doct., tractus, praef. comm. vel de Martyribus. Ad"))) + ((date 2026-02-10) (class_ ("III cl.")) + (title "Alb Feria III. S Scholasticae Virg.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-02-11) (class_ ("III cl.")) + (title "Alb Feria IV. In Apparitione B. Mariae Virg. Immaculatae,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("BMV Et te in Conceptione Immaculata."))) + ((date 2026-02-12) (class_ ("III cl.")) + (title + "Alb Feria V. SS Septem Fundatorum Ordinis Servorum B. Mariae Virg., Cc.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-02-13) (class_ ("IV cl.")) + (title "Viol Feria VI Dom. Sexagesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-02-14) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione \226\128\147"))) + ((date 2026-02-15) (class_ ("II cl.")) + (title "Viol DOM. QUINQUAGESIMAE, De ea,") (te_deum (true)) + (gloria (false)) (credo (true)) (praef ("Trinit. II"))) + ((date 2026-02-16) (class_ ("IV cl.")) + (title "Viol Feria II Dom. Quinquagesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-02-17) (class_ ("IV cl.")) + (title "Viol Feria III Dom. Quinquagesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-02-18) (class_ ("I cl.")) + (title "Viol FERIA IV CINERUM, De ea,") (te_deum ()) (gloria (false)) + (credo (false)) + (praef + ("Quadr., or. super populum. In Missa qu\195\166 dicitur post benedictionem et impositionem cinerum omittuntur omnes preces ad gradus altaris dicend\195\166, necnon ors. Aufer a nobis et Oramus te, Domine, non autem osculum altaris (RM, 424 a)."))) + ((date 2026-02-19) (class_ ("III cl.")) + (title "Viol Feria V Dom. Quinquagesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-02-20) (class_ ("III cl.")) + (title "Viol Feria VI Dom. Quinquagesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-02-21) (class_ ("III cl.")) + (title "Viol Sabb. Dom. Quinquagesimae, De eo,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum. I"))) + ((date 2026-02-22) (class_ ("I cl.")) + (title "Viol DOM. I QUADRAGESIMAE, De ea,") (te_deum (true)) + (gloria (false)) (credo (true)) (praef ("Quadr. II"))) + ((date 2026-02-23) (class_ ("III cl.")) + (title "Viol Feria II post Dom. I Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-02-24) (class_ ("II cl.")) + (title "Rub Feria III. S MATTHIAE AP.,") (te_deum ()) (gloria (true)) + (credo (true)) (praef ("App. Ad"))) + ((date 2026-02-25) (class_ ("II cl.")) + (title "Viol FERIA IV QUATTUOR TEMP., De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef + ("Quadr., or. super populum. \226\128\147 Quoad Flectamus genua vide RM 440."))) + ((date 2026-02-26) (class_ ("III cl.")) + (title "Viol Feria V post Dom. I Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-02-27) (class_ ("II cl.")) + (title "Viol FERIA VI QUATTUOR TEMP., De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-02-28) (class_ ("II cl.")) + (title "Viol SABB. QUATTUOR TEMP., De eo,") (te_deum ()) (gloria (false)) + (credo (false)) + (praef + ("Quadr., or. super populum. \226\128\147 Quoad Flectamus genua vide RM 440. Quoad lectiones vide RM 468. I"))) + ((date 2026-03-01) (class_ ("I cl.")) + (title "Viol DOM. II QUADRAGESIMAE, De ea,") (te_deum (true)) + (gloria (false)) (credo (true)) (praef ("Quadr. II"))) + ((date 2026-03-02) (class_ ("III cl.")) + (title "Viol Feria II post Dom. II Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-03-03) (class_ ("III cl.")) + (title "Viol Feria III post Dom. II Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-03-04) (class_ ("III cl.")) + (title "Viol Feria IV post Dom. II Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-03-05) (class_ ("III cl.")) + (title "Viol Feria V post Dom. II Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-03-06) (class_ ("III cl.")) + (title "Viol Feria VI post Dom. II Quadragesimae, De ea,") + (te_deum (true)) (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum. Feria VI prima in mense."))) + ((date 2026-03-07) (class_ ("III cl.")) + (title "Viol Sabb. post Dom. II Quadragesimae, De eo,") (te_deum (true)) + (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum. Sabbatum primum in mense. I"))) + ((date 2026-03-08) (class_ ("I cl.")) + (title "Viol DOM. III QUADRAGESIMAE, De ea,") (te_deum (true)) + (gloria (false)) (credo (true)) (praef ("Quadr. II"))) + ((date 2026-03-09) (class_ ("III cl.")) + (title "Viol Feria II post Dom. III Quadragesimae, De ea,") + (te_deum (true)) (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum."))) + ((date 2026-03-10) (class_ ("III cl.")) + (title "Viol Feria III post Dom. III Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-03-11) (class_ ("III cl.")) + (title "Viol Feria IV post Dom. III Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-03-12) (class_ ("III cl.")) + (title "Viol Feria V post Dom. III Quadragesimae, De ea,") + (te_deum (true)) (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum."))) + ((date 2026-03-13) (class_ ("III cl.")) + (title "Viol Feria VI post Dom. III Quadragesimae, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("Quadr., or. super populum."))) + ((date 2026-03-14) (class_ ("III cl.")) + (title "Viol Sabb. post Dom. III Quadragesimae, De eo,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum. I"))) + ((date 2026-03-15) (class_ ("I cl.")) + (title "Viol/ DOM. IV QUADRAGESIMAE (LAETARE), De ea,") (te_deum (true)) + (gloria (false)) (credo (true)) (praef ("Quadr. II"))) + ((date 2026-03-16) (class_ ("III cl.")) + (title "Viol Feria II post Dom. IV Quadragesimae (Laetare), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum."))) + ((date 2026-03-17) (class_ ("III cl.")) + (title "Viol Feria III post Dom. IV Quadragesimae (Laetare), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum."))) + ((date 2026-03-18) (class_ ("III cl.")) + (title "Viol Feria IV post Dom. IV Quadragesimae (Laetare), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum. I"))) + ((date 2026-03-19) (class_ ("I cl.")) + (title + "Alb Feria V. S IOSEPH * SPONSI B. MARIAE VIRG., CONF. ET ECCLESIAE UNIVERSAE PATRONI,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("de S Iosepho Et te in festivitate. II"))) + ((date 2026-03-20) (class_ ("III cl.")) + (title "Viol Feria VI post Dom. IV Quadragesimae (Laetare), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum."))) + ((date 2026-03-21) (class_ ("III cl.")) + (title "Viol Sabb. post Dom. IV Quadragesimae (Laetare), De eo,") + (te_deum (true)) (gloria (false)) (credo (false)) + (praef ("Quadr., or. super populum. I"))) + ((date 2026-03-22) (class_ ("I cl.")) + (title "Viol DOM. I PASSIONIS, De ea,") (te_deum (true)) (gloria (false)) + (credo (true)) (praef ("de Sancta Cruce. II"))) + ((date 2026-03-23) (class_ ("III cl.")) + (title "Viol Feria II post Dom. I Passionis, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("de Sancta Cruce or. super populum."))) + ((date 2026-03-24) (class_ ("III cl.")) + (title "Viol Feria III post Dom. I Passionis, De ea,") (te_deum (true)) + (gloria (false)) (credo (false)) + (praef ("de Sancta Cruce or. super populum. I"))) + ((date 2026-03-25) (class_ ("I cl.")) + (title "Alb Feria IV. IN ANNUNTIATIONE B. MARIAE VIRG.,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("BMV Et te in Annuntiatione \226\128\147 In Missis in cantu, ad verba symboli Et incarnatus est\226\128\166 et homo factus est, omnes genuflectunt versus altare, non tantum cum a celebrante recitantur, sed etiam cum a choro canuntur (RM 518 b). II"))) + ((date 2026-03-26) (class_ ("III cl.")) + (title "Viol Feria V post Dom. I Passionis, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("de Sancta Cruce or. super populum."))) + ((date 2026-03-27) (class_ ("III cl.")) + (title "Viol Feria VI post Dom. I Passionis, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("de Sancta Cruce or. super populum."))) + ((date 2026-03-28) (class_ ("III cl.")) + (title "Viol Sabb. post Dom. I Passionis, De eo,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("de Sancta Cruce or. super populum. I"))) + ((date 2026-03-29) (class_ ("I cl.")) + (title + "Rub in Officio, Rub. ad Bened. ramorum et in Processione, Viol. in Missa. DOM. IN PALMIS, De ea,") + (te_deum (true)) (gloria (false)) (credo (true)) + (praef + ("de Sancta Cruce. \194\171Asperges\194\187 omittitur. \226\128\147 Benedictio palmorum et processio ante missam principalem celebrandae sunt. \226\128\147 Orationes praeparatoriae omittuntur. \226\128\147 Evangelium de passione secundum S Matthiam 26, 36-75; 27,1-60 legitur. Munda cor dicitur, celebrans autem (vel diaconus chronista) signum crucis nec super libro nec super se facit, necque librum osculatur, necque Laus tibi Domine dicit. \226\128\147 Evangelium finale omittitur. \226\128\147 In Missis sine processione, legitur in fine Evangelium Cum appropinquasset de benedictione ramorum. Sacerdotibus plures quam unam missam dicentibus licet Evangelium S Matthi\195\166 27, 45-52 legere potius quam Evangelium Passionis. II"))) + ((date 2026-03-30) (class_ ("I cl.")) + (title "Viol FERIA II HEBDOMADAE SANCTAE, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("de Sancta Cruce or. super populum."))) + ((date 2026-03-31) (class_ ("I cl.")) + (title "Viol FERIA II HEBDOMADAE SANCTAE, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef + ("de Sancta Cruce or. super populum. Passio secundum S Marcum 14, 32-72; 15,1-46. Munda cor dicitur, celebrans autem (vel diaconus chronista) signum crucis nec super libro nec super se facit, necque librum osculatur, necque Laus tibi Domine dicit."))) + ((date 2026-04-01) (class_ ("I cl.")) + (title "Viol FERIA IV HEBDOMADAE SANCTA, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef + ("de Sancta Cruce or. super populum. Passio secundum S Lucam 22, 39-71; 23, 1-53. Munda cor dicitur, celebrans autem (vel diaconus chronista) signum crucis nec super libro nec super se facit, necque librum osculatur, necque Laus tibi Domine dicit."))) + ((date 2026-04-02) (class_ ("I cl.")) + (title "Viol. in Off., Alb. in Missa. FERIA V IN CENA DOMINI, De ea,") + (te_deum ()) (gloria (true)) (credo (false)) + (praef + ("de Sancta Cruce, Communicantes, Hanc igitur et Qui pridie pr., ad triplex Agnus Dei ter respondetur miserere nobis. Osculum pacis non datur, et omittitur or. Domine Iesu Christe, qui dixisti."))) + ((date 2026-04-03) (class_ ("I cl.")) + (title + "Nig in Actione liturgica usque ad 4am partem, Viol. in S. Communione. FERIA VI IN PASSIONE ET MORTE DOMINI, De ea,") + (te_deum ()) (gloria (true)) (credo (false)) + (praef ("comm. Feria VI prima in mense."))) + ((date 2026-04-04) (class_ ("I cl.")) + (title "Viol in Vig. pasch., Alb. in Missa. SABBATUM SANCTUM, De eo,") + (te_deum ()) (gloria ()) (credo ()) (praef ())) + ((date 2026-04-05) (class_ ("I cl.")) + (title "Alb DOM. RESURRECTIONIS, De ea,") (te_deum ()) (gloria (true)) + (credo (true)) + (praef + ("Pasch. (in hac potissimum die), Communic. et Hanc igitur pr., ad Ite, missa est additur duplex Alleluia. Hodie prohibentur omnes Missae defunctorum, etiam exsequialis."))) + ((date 2026-04-06) (class_ ("I cl.")) + (title "Alb FERIA II INFRA OCTAVAM PASCHATIS, De ea,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("etc. ut in festo., ad Ite, missa est additur duplex Alleluia."))) + ((date 2026-04-07) (class_ ("I cl.")) + (title "Alb FERIA III INFRA OCTAVAM PASCHATIS, De ea,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("etc. ut in festo., ad Ite, missa est additur duplex Alleluia."))) + ((date 2026-04-08) (class_ ("I cl.")) + (title "Alb FERIA IV INFRA OCTAVAM PASCHATIS, De ea,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("etc. ut in festo., ad Ite, missa est additur duplex Alleluia."))) + ((date 2026-04-09) (class_ ("I cl.")) + (title "Alb FERIA V INFRA OCTAVAM PASCHATIS, De ea,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("etc. ut in festo., ad Ite, missa est additur duplex Alleluia."))) + ((date 2026-04-10) (class_ ("I cl.")) + (title "Alb FERIA VI INFRA OCTAVAM PASCHATIS, De ea,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("etc. ut in festo., ad Ite, missa est additur duplex Alleluia."))) + ((date 2026-04-11) (class_ ("I cl.")) + (title "Alb SABBATUM IN ALBIS, De eo,") (te_deum ()) (gloria (true)) + (credo (true)) + (praef + ("etc. ut in festo., ad Ite, missa est additur duplex Alleluia. I"))) + ((date 2026-04-12) (class_ ("I cl.")) (title "Alb DOM. IN ALBIS,") + (te_deum (true)) (gloria (true)) (credo (true)) + (praef ("Pasch. \226\128\147 Ite Missa est sine Alleluia. II"))) + ((date 2026-04-13) (class_ ("III cl.")) + (title "Rub Feria II. S Hermenegildi Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. vel de Martyribus. Ad"))) + ((date 2026-04-14) (class_ ("III cl. (Priv.)")) + (title "Rub Feria III. S Iustini Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. vel de Martyribus."))) + ((date 2026-04-15) (class_ ("IV cl.")) + (title "Alb Feria IV Dom. in Albis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (Pasch.))) + ((date 2026-04-16) (class_ ("IV cl.")) + (title "Alb Feria V Dom. in Albis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. \226\128\147"))) + ((date 2026-04-17) (class_ ("IV cl.")) + (title "Alb Feria VI Dom. in Albis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. \226\128\147"))) + ((date 2026-04-18) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione. I"))) + ((date 2026-04-19) (class_ ("II cl.")) + (title "Alb DOM. III PASCHATIS, De ea,") (te_deum (true)) (gloria (true)) + (credo (true)) (praef ("Pasch. II"))) + ((date 2026-04-20) (class_ ("IV cl.")) + (title "Alb Feria II post Dom. III Paschatis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (Pasch.))) + ((date 2026-04-21) (class_ ("III cl.")) + (title "Alb Feria III. S Anselmi Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("Pasch. Ad"))) + ((date 2026-04-22) (class_ ("III cl.")) + (title "Rub Feria IV. SS Soteris et Caii Pp. et Mm.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. vel de Martyribus."))) + ((date 2026-04-23) (class_ ("IV cl.")) + (title "Alb Feria V post Dom. III Paschatis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. \226\128\147"))) + ((date 2026-04-24) (class_ ("III cl.")) + (title "Rub Feria VI. S Fidelis de Sigmaringa Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. vel de Martyribus."))) + ((date 2026-04-25) (class_ ("II cl.")) + (title "Rub Sabb. LITANIA MAIOR. S MARCI EVANGELISTAE,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("App. Ad"))) + ((date 2026-04-26) (class_ ("II cl.")) + (title "Alb DOM. IV PASCHATIS, De ea,") (te_deum (true)) (gloria (true)) + (credo (true)) (praef ("Pasch. II"))) + ((date 2026-04-27) (class_ ("III cl.")) + (title "Alb Feria II. S Petri Canisii Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("Pasch. Ad"))) + ((date 2026-04-28) (class_ ("III cl.")) + (title "Alb Feria III. S Pauli a Cruce Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. \226\128\147"))) + ((date 2026-04-29) (class_ ("III cl.")) + (title "Rub Feria IV. S Petri Mart.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("Pasch. vel de Martyribus \226\128\147"))) + ((date 2026-04-30) (class_ ("III cl. (Priv.)")) + (title "Alb Feria V. S Catharinae Senensis Virg.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. I"))) + ((date 2026-05-01) (class_ ("I cl.")) + (title + "Alb Feria VI. S IOSEPH * OPIFICIS SPONSI B. MARIAE VIRG., CONF.,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef + ("de S Iosepho Et te in solemnitate \226\128\147 Etiam dici potest Missa Adiutor (cfr. in Missis votivis), cum Alleluia pasch., praef. S Ioseph Et et in solemnitate. Feria VI prima in mense. II"))) + ((date 2026-05-02) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. S Athanasii Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("Pasch. Sabbatum primum in mense. I"))) + ((date 2026-05-03) (class_ ("II cl.")) + (title "Alb DOM. V PASCHATIS, De ea,") (te_deum (true)) (gloria (true)) + (credo (true)) (praef ("Pasch. II"))) + ((date 2026-05-04) (class_ ("III cl. (Priv.)")) + (title "Alb Feria II. S Monicae Vid.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef (Pasch.))) + ((date 2026-05-05) (class_ ("III cl. (Priv.)")) + (title "Alb Feria III. S Pii V Papae et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. Ad"))) + ((date 2026-05-06) (class_ ("IV cl.")) + (title "Alb Feria IV post Dom. V Paschatis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. \226\128\147"))) + ((date 2026-05-07) (class_ ("III cl.")) + (title "Rub Feria V. S Stanislai Ep. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. vel de Martyribus."))) + ((date 2026-05-08) (class_ ("IV cl.")) + (title "Alb Feria VI post Dom. V Paschatis, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. \226\128\147"))) + ((date 2026-05-09) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. S Gregorii Nazianzeni Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("Pasch. I"))) + ((date 2026-05-10) (class_ ("II cl.")) + (title "Alb DOM. VI PASCHATIS, De ea,") (te_deum (true)) (gloria (true)) + (credo (true)) (praef ("Pasch. II"))) + ((date 2026-05-11) (class_ ("II cl.")) + (title "Rub Feria II. SS PHILIPPI * & IACOBI * APP,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("App. Ad"))) + ((date 2026-05-12) (class_ ("III cl.")) + (title + "Rub Feria III. SS Nerei, Achillei, Domitillae Virg., & Pancratii Mm.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("Pasch. vel de Martyribus."))) + ((date 2026-05-13) (class_ ("II cl.")) + (title "Alb Feria IV. VIGILIA ASCENSIONIS,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Pasch. I"))) + ((date 2026-05-14) (class_ ("I cl.")) + (title "Alb Feria V. IN ASCENSIONE DOMINI NOSTRI IESU CHRISTI,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef + ("Ascensionis, Communic pr. In Missa principali post Evangelium exstinguitur cereus paschalis. II"))) + ((date 2026-05-15) (class_ ("III cl.")) + (title "Alb Feria VI. S Ioannis Baptistae de la Salle Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("Ascensionis \226\128\147"))) + ((date 2026-05-16) (class_ ("III cl.")) + (title "Alb Sabb. S Ubaldi Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Ascensionis \226\128\147"))) + ((date 2026-05-17) (class_ ("II cl.")) + (title "Alb DOM. POST ASCENSIONEM, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) + (praef + ("Ascensionis. Hodie prohibentur omnes Missae defunctorum, excepta exsequiali."))) + ((date 2026-05-18) (class_ ("III cl.")) + (title "Rub Feria II. S Venantii Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("Ascensionis vel de Martyribus."))) + ((date 2026-05-19) (class_ ("III cl.")) + (title "Alb Feria III. S Petri Caelestini Papae et Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("Ascensionis \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Pudentianae Virg. (alb.) Dilexisti iustitiam, Gloria, comm. S Petri Caelestini Papae et Conf., praef. Ascensionis. Ad"))) + ((date 2026-05-20) (class_ ("III cl.")) + (title "Alb Feria IV. S Bernardini Senensis Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (Ascensionis.))) + ((date 2026-05-21) (class_ ("IV cl.")) + (title "Alb Feria V Dom. post Ascensionem, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (Ascensionis.))) + ((date 2026-05-22) (class_ ("IV cl.")) + (title "Alb Feria VI Dom. post Ascensionem, De ea,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("Ascensionis \226\128\147"))) + ((date 2026-05-23) (class_ ("I cl.")) + (title "Rub Sabb. VIGILIA PENTECOSTES,") (te_deum (true)) (gloria (true)) + (credo (false)) + (praef + ("de Spirito Sancto hodierna die, Communic pr., Hanc igitur pr. I"))) + ((date 2026-05-24) (class_ ("I cl.")) (title "Rub Dom. PENTECOSTES,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef + ("de Spirito Sancto hodierna die, Communic pr., Hanc igitur pr. \226\128\147 Genu flectendum est cum Veni Sancte Spiritus in versu Alleluia dicitur. II"))) + ((date 2026-05-25) (class_ ("I cl.")) + (title "Rub FERIA II INFRA OCTAVAM PENTECOSTES, De ea,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("de Spirito Sancto hodierna die, Communic pr., Hanc igitur pr. \226\128\147 Genu flectendum est cum Veni Sancte Spiritus in versu Alleluia dicitur."))) + ((date 2026-05-26) (class_ ("I cl.")) + (title "Rub FERIA III INFRA OCTAVAM PENTECOSTES, De ea,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("de Spirito Sancto hodierna die, Communic pr., Hanc igitur pr. \226\128\147 Genu flectendum est cum Veni Sancte Spiritus in versu Alleluia dicitur."))) + ((date 2026-05-27) (class_ ("I cl.")) + (title + "Rub FERIA IV QUATTUOR TEMPORUM INFRA OCTAVAM PENTECOSTES, De ea,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef + ("de Spirito Sancto hodierna die, Communic pr., Hanc igitur pr. \226\128\147 Genu flectendum est cum Veni Sancte Spiritus in versu Alleluia dicitur."))) + ((date 2026-05-28) (class_ ("I cl.")) + (title "Rub FERIA V INFRA OCTAVAM PENTECOSTES, De ea,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("de Spirito Sancto hodierna die, Communic pr., Hanc igitur pr. \226\128\147 Genu flectendum est cum Veni Sancte Spiritus in versu Alleluia dicitur."))) + ((date 2026-05-29) (class_ ("I cl.")) + (title + "Rub FERIA VI QUATTUOR TEMPORUM INFRA OCTAVAM PENTECOSTES, De ea,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef + ("de Spirito Sancto hodierna die, Communic pr., Hanc igitur pr. \226\128\147 Genu flectendum est cum Veni Sancte Spiritus in versu Alleluia dicitur."))) + ((date 2026-05-30) (class_ ("I cl.")) + (title + "Rub SABBATUM QUATTUOR TEMPORUM II INFRA OCTAVAM PENTECOSTES, De eo,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef + ("de Spirito Sancto hodierna die, Communic pr., Hanc igitur pr. \226\128\147 Genu flectendum est cum Veni Sancte Spiritus in versu Alleluia dicitur (quae in forma Miss\195\166 longiori post sixtam lectionem dicitur). Post Nonam exspirat tempus paschale. Compl de dom., cum antiphona finali de B. V. M. Salve Regina, quae dicitur ad Feriam VI ante Dom. I Adventus inclusive. Hodie prohibentur omnes Missae defunctorum, excepta exsequiali."))) + ((date 2026-05-31) (class_ ("I cl.")) + (title "Alb Dom. I post Pentecosten. IN FESTO SANCTISSIMAE TRINITATIS,") + (te_deum ()) (gloria (true)) (credo (true)) (praef ("Trinit. II"))) + ((date 2026-06-01) (class_ ("III cl.")) + (title "Alb Feria II. S Angelae Mericiae Virg.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-06-02) (class_ ("IV cl.")) + (title "Vir Feria III post Dom. I post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-06-03) (class_ ("IV cl.")) + (title "Vir Feria IV post Dom. I post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) (praef ("comm. I"))) + ((date 2026-06-04) (class_ ("I cl.")) + (title "Alb Feria V. CORPORIS CHRISTI,") (te_deum ()) (gloria (true)) + (credo (true)) + (praef + ("comm. vel de Cor Sacratissimo. \226\128\147 Si processio cum benedicto sacramento post missam principalem fit, in Missa Benedicamus Domino dicitur, sed benedictio et evangelium finale omittuntur. II"))) + ((date 2026-06-05) (class_ ("III cl. (Priv.)")) + (title "Rub Feria VI. S Bonifatii Ep. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. vel de Martyribus. Feria VI prima in mense."))) + ((date 2026-06-06) (class_ ("III cl.")) + (title "Alb Sabb. S Norberti Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. Sabbatum primum in mense. I"))) + ((date 2026-06-07) (class_ ("II cl.")) + (title "Vir DOM. II POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-06-08) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. II post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-06-09) (class_ ("IV cl.")) + (title "Vir Feria III post Dom. II post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-06-10) (class_ ("III cl.")) + (title "Alb Feria IV. S Margaritae Reginae, Vid.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-06-11) (class_ ("III cl. (Priv.)")) + (title "Rub Feria V. S Barnabae Apostoli,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("App. I"))) + ((date 2026-06-12) (class_ ("I cl.")) + (title "Alb Feria VI. SACRATISSIMI CORDIS IESU,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("de Ss.mi Corde Iesu. Hodie, in qualibet ecclesia, coram Ss. Sacramento exposito, legatur formula reparationis et cantentur vel recitentur Litani\195\166 Sacratissimi Cordis Iesu (cfr. Enchiridion Indulgentiarum. Preces et pia opera, 1952, n.256, p.163). II"))) + ((date 2026-06-13) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. S Antonii de Padua Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-06-14) (class_ ("II cl.")) + (title "Vir DOM. III POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-06-15) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. III post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-06-16) (class_ ("IV cl.")) + (title "Vir Feria III post Dom. III post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-06-17) (class_ ("III cl.")) + (title "Alb Feria IV. S Gregorii Barbadici Ep. et Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-06-18) (class_ ("III cl.")) + (title "Alb Feria V. S Ephraem Syri Diaconi, Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa pr. SS Marci et Marcelliani Mm. (rub.), Gloria, comm. S Ephraem Syri Diaconi, Conf. et Eccl. Doct., praef. comm. vel de Martyribus. Ad"))) + ((date 2026-06-19) (class_ ("III cl.")) + (title "Alb Feria VI. S Iulianae De Falconeriis Virg.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa pr. SS Gervasii et Protasii Mm. (rub.), Gloria, comm. S Iulianae De Falconeriis Virg., praef. comm. vel de Martyribus."))) + ((date 2026-06-20) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione \226\128\147"))) + ((date 2026-06-21) (class_ ("II cl.")) + (title "Vir DOM. IV POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-06-22) (class_ ("III cl.")) + (title "Alb Feria II. S Paulini Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-06-23) (class_ ("II cl.")) + (title "Viol Feria III. VIGILIA NATIVITATIS S IOANNIS * BAPTISTAE,") + (te_deum (true)) (gloria (false)) (credo (false)) (praef ("comm. I"))) + ((date 2026-06-24) (class_ ("I cl.")) + (title "Alb Feria IV. IN NATIVITATE S IOANNIS * BAPTISTAE,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("comm. vel de S Ioanni Baptista. II"))) + ((date 2026-06-25) (class_ ("III cl.")) + (title "Alb Feria V. S Gulielmi Abb.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef (comm.))) + ((date 2026-06-26) (class_ ("III cl.")) + (title "Rub Feria VI. SS Ioannis * et Pauli * Mm.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus."))) + ((date 2026-06-27) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione \226\128\147"))) + ((date 2026-06-28) (class_ ("II cl.")) + (title "Vir DOM. V POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. I"))) + ((date 2026-06-29) (class_ ("I cl.")) + (title "Rub Feria II. SS PETRI * ET PAULI * APP.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("App. II"))) + ((date 2026-06-30) (class_ ("III cl. (Priv.)")) + (title "Rub Feria III. In Commemoratione S Pauli * Ap.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("App. I"))) + ((date 2026-07-01) (class_ ("I cl.")) + (title "Rub Feria IV. PRETIOSISSIMI SANGUINIS D. N. I. C.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("de Sancta Cruce. II"))) + ((date 2026-07-02) (class_ ("II cl.")) + (title "Alb Feria V. IN VISITATIONE B. MARIAE VIRG.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("BMV Et te in Visitatione. Ad"))) + ((date 2026-07-03) (class_ ("III cl.")) + (title "Rub Feria VI. S Iren\195\166i Ep. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. vel de Martyribus. Feria VI prima in mense."))) + ((date 2026-07-04) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione \226\128\147"))) + ((date 2026-07-05) (class_ ("II cl.")) + (title "Vir DOM. VI POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-07-06) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. VI post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-07-07) (class_ ("III cl. (Priv.)")) + (title "Alb Feria III. SS Cyrilli et Methodii Epp. et Cc.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-07-08) (class_ ("III cl.")) + (title "Alb Feria IV. S Elisabeth Reginae, Vid.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-07-09) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. VI post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-07-10) (class_ ("III cl.")) + (title + "Rub Feria VI. SS Septem Fratrum Mm., Ac SS Rufinae et Secundae Vv. et Mm.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. vel de Martyribus."))) + ((date 2026-07-11) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione \226\128\147"))) + ((date 2026-07-12) (class_ ("II cl.")) + (title "Vir DOM. VII POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-07-13) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. VII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-07-14) (class_ ("III cl. (Priv.)")) + (title "Alb Feria III. S Bonaventurae Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-07-15) (class_ ("III cl.")) + (title "Alb Feria IV. S Henrici Imperatoris Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-07-16) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. VII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-07-17) (class_ ("IV cl.")) + (title "Vir Feria VI post Dom. VII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-07-18) (class_ ("III cl.")) + (title "Alb Sabb. S Camilli de Lellis Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa SS Symphorosae et septem filiorum eius Mm. (rub.) Clamaverunt (ut in festo Ss. duodecim Fratrum Mm., die 1 sept.), Gloria, ors. pr., comm. S Camilli de Lellis Conf., praef. comm. vel de Martyribus. I"))) + ((date 2026-07-19) (class_ ("II cl.")) + (title "Vir DOM. VIII POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-07-20) (class_ ("III cl.")) + (title "Alb Feria II. S Hieronymi \211\148miliani Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Margaritae Virg. et Mart. (rub.) Me exspectaverunt, Gloria, comm. S Hieronymi \211\148miliani Conf., praef. comm. vel de Martyribus."))) + ((date 2026-07-21) (class_ ("III cl.")) + (title "Alb Feria III. S Laurentii de Brundusio Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa pr. S Praexedis Virg. (alb.), Gloria, comm. S Laurentii de Brundusio Conf. et Eccl. Doct., praef. comm. \226\128\147"))) + ((date 2026-07-22) (class_ ("III cl. (Priv.)")) + (title "Alb Feria IV. S Mariae Magdalenae P\197\147nitentis,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-07-23) (class_ ("III cl.")) + (title "Rub Feria V. S Apollinaris Ep. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. vel de Martyribus \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Liborii Ep. et Conf. (alb.) Statuit de Comm. Confessoris Pontificis, Gloria, comm. S Apollinaris Ep. et Mart., praef. comm."))) + ((date 2026-07-24) (class_ ("IV cl.")) + (title "Vir Feria VI post Dom. VIII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-07-25) (class_ ("II cl.")) + (title "Rub Sabb. S IACOBI * APOSTOLI,") (te_deum ()) (gloria (true)) + (credo (true)) (praef ("App. Ad"))) + ((date 2026-07-26) (class_ ("II cl.")) + (title "Vir DOM. IX POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-07-27) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. IX post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-07-28) (class_ ("III cl.")) + (title + "Rub Feria III. SS Nazarii et Celsi, Mm., Victoris I Papae et Mart. ac Inocentii I Papae et Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. vel de Martyribus."))) + ((date 2026-07-29) (class_ ("III cl. (Priv.)")) + (title "Alb Feria IV. S Marthae Virg.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef (comm.))) + ((date 2026-07-30) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. IX post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-07-31) (class_ ("III cl. (Priv.)")) + (title "Alb Feria VI. S Ignatii Conf.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef (comm.))) + ((date 2026-08-01) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione \226\128\147"))) + ((date 2026-08-02) (class_ ("II cl.")) + (title "Vir DOM. X POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-08-03) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. X post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-08-04) (class_ ("III cl. (Priv.)")) + (title "Alb Feria III. S Dominici Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-08-05) (class_ ("III cl. (Priv.)")) + (title "Alb Feria IV. In Dedicatione S Mariae ad Nives,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("BMV Et te in Festivitate."))) + ((date 2026-08-06) (class_ ("II cl.")) + (title "Alb Feria V. IN TRANSFIGURATIONE D. N. I. C.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("comm. II"))) + ((date 2026-08-07) (class_ ("III cl.")) + (title "Alb Feria VI. S Caietani Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa pr. S Donati, Ep. et Mart. (rub.), Gloria, comm. S Caietani Conf., praef. comm. vel de Martyribus. Feria VI prima in mense."))) + ((date 2026-08-08) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. S Ioannis Mariae Vianney Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. \226\128\147"))) + ((date 2026-08-09) (class_ ("II cl.")) + (title "Vir DOM. XI POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-08-10) (class_ ("II cl.")) + (title "Rub Feria II. S LAURENTII * MART.,") (te_deum ()) (gloria (true)) + (credo (false)) (praef ("comm. vel de Martyribus. II"))) + ((date 2026-08-11) (class_ ("IV cl.")) + (title "Vir Feria III post Dom. XI post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-08-12) (class_ ("III cl. (Priv.)")) + (title "Alb Feria IV. S Clarae Virg.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef (comm.))) + ((date 2026-08-13) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. XI post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-08-14) (class_ ("II cl.")) + (title "Viol Feria VI. VIGILIA ASSUMPTIONIS B. MARIAE VIRG.,") + (te_deum (true)) (gloria (false)) (credo (false)) (praef ("comm. I"))) + ((date 2026-08-15) (class_ ("I cl.")) + (title "Alb Sabb. IN ASSUMPTIONE B. MARIAE VIRG.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("BMV Et te in Assumptione. Ad"))) + ((date 2026-08-16) (class_ ("II cl.")) + (title "Vir DOM. XII POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-08-17) (class_ ("III cl.")) + (title "Alb Feria II. S Hyacinthi Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-08-18) (class_ ("IV cl.")) + (title "Vir Feria III post Dom. XII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-08-19) (class_ ("III cl.")) + (title "Alb Feria IV. S Ioannis Eudes Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-08-20) (class_ ("III cl. (Priv.)")) + (title "Alb Feria V. S Bernardi Abb. et Eccl. Doct.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. \226\128\147"))) + ((date 2026-08-21) (class_ ("III cl.")) + (title + "Alb Feria VI. S Ioannae Franciscae Fr\195\169miot de Chantal Vid.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-08-22) (class_ ("II cl.")) + (title "Alb Sabb. IMMACULATI CORDIS B. MARIAE VIRG.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("BMV Et te in Festivitate. Ad"))) + ((date 2026-08-23) (class_ ("II cl.")) + (title "Vir DOM. XIII POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-08-24) (class_ ("II cl.")) + (title "Rub Feria II. S BARTHOLOMAEI * AP.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef (App.))) + ((date 2026-08-25) (class_ ("III cl.")) + (title "Alb Feria III. S Ludovici Regis Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-08-26) (class_ ("IV cl.")) + (title "Vir Feria IV post Dom. XIII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-08-27) (class_ ("III cl.")) + (title "Alb Feria V. S Iosephi Calasanctii Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-08-28) (class_ ("III cl. (Priv.)")) + (title "Alb Feria VI. S Augustini Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-08-29) (class_ ("III cl. (Priv.)")) + (title "Rub Sabb. In Decollatione S Ioannis * Baptistae,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. vel de S Ioanni Baptista \226\128\147"))) + ((date 2026-08-30) (class_ ("II cl.")) + (title "Vir DOM. XIV POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-08-31) (class_ ("III cl.")) + (title "Alb Feria II. S Raymundi Nonnati Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-09-01) (class_ ("IV cl.")) + (title "Vir Feria III post Dom. XIV post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-09-02) (class_ ("III cl.")) + (title "Alb Feria IV. S Stephani Regis Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-09-03) (class_ ("III cl. (Priv.)")) + (title "Alb Feria V. S Pii X Papae et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-09-04) (class_ ("IV cl.")) + (title "Vir Feria VI post Dom. XIV post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-09-05) (class_ ("III cl.")) + (title "Alb Sabb. S Laurentii Iustiniani Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. Sabbatum primum in mense. I"))) + ((date 2026-09-06) (class_ ("II cl.")) + (title "Vir DOM. XV POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-09-07) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. XV post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-09-08) (class_ ("II cl.")) + (title "Alb Feria III. IN NATIVITATE B. MARIAE VIRG.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("BMV Et te in Nativitate. Ad"))) + ((date 2026-09-09) (class_ ("IV cl.")) + (title "Vir Feria IV post Dom. XV post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-09-10) (class_ ("III cl.")) + (title "Alb Feria V. S Nicolai de Tolentino Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-09-11) (class_ ("IV cl.")) + (title "Vir Feria VI post Dom. XV post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-09-12) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. Sanctissimi Nominis Mariae,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("BMV Et te in Festivitate. I"))) + ((date 2026-09-13) (class_ ("II cl.")) + (title "Vir DOM. XVI POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-09-14) (class_ ("II cl.")) + (title "Rub Feria II. IN EXALTATIONE S CRUCIS,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("de Sancta Cruce. In Epistola ad verba Ut in nomine Iesu usque ad infernorum inclusive genuflectitur, item in Choro ab omnibus in Missa in cantu. II"))) + ((date 2026-09-15) (class_ ("II cl.")) + (title "Alb Feria III. SEPTEM DOLORUM B. MARIAE VIRGINIS,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("BMV Et te in Transfixione. Ad"))) + ((date 2026-09-16) (class_ ("III cl. (Priv.)")) + (title "Rub Feria IV. SS Cornelis * Papae et Cypriani * Ep., Mm.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. vel de Martyribus."))) + ((date 2026-09-17) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. XVI post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-09-18) (class_ ("III cl.")) + (title "Alb Feria VI. S Iosephi de Cupertino Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-09-19) (class_ ("III cl.")) + (title "Rub Sabb. SS Ianuarii Ep. et Sociorum Mm.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. I"))) + ((date 2026-09-20) (class_ ("II cl.")) + (title "Vir DOM. XVII POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-09-21) (class_ ("II cl.")) + (title "Rub Feria II. S MATTHAEI * AP. ET EV.,") (te_deum ()) + (gloria (true)) (credo (true)) (praef (App.))) + ((date 2026-09-22) (class_ ("III cl.")) + (title "Alb Feria III. S Thomae de Villanova Ep. et Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa SS Mauritii et Sociorum Mm. (rub.) Intret in conspectu tuo, Gloria, ors. et Evangelium pr., comm. S Thomae de Villanova Ep. et Conf., praef. comm. vel de Martyribus."))) + ((date 2026-09-23) (class_ ("II cl.")) + (title "Viol FERIA IV QUATTUOR TEMP., De ea,") (te_deum (true)) + (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147 Quoad Flectamus genua vide RM 440."))) + ((date 2026-09-24) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. XVII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-09-25) (class_ ("II cl.")) + (title "Viol FERIA VI QUATTUOR TEMP., De ea,") (te_deum (true)) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-09-26) (class_ ("II cl.")) + (title "Viol SABB. QUATTUOR TEMP., De eo,") (te_deum (true)) + (gloria (false)) (credo (false)) + (praef + ("comm. \226\128\147 Quoad Flectamus genua vide RM 440. Quoad lectiones vide RM 468. I"))) + ((date 2026-09-27) (class_ ("II cl.")) + (title "Vir DOM. XVIII POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-09-28) (class_ ("III cl.")) + (title "Rub Feria II. S Wenceslai Ducis Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. I"))) + ((date 2026-09-29) (class_ ("I cl.")) + (title "Alb Feria III. IN DEDICATIONE S MICHA\195\139LIS ARCHANGELI,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("comm. vel de Angelis. II"))) + ((date 2026-09-30) (class_ ("III cl. (Priv.)")) + (title "Alb Feria IV. S Hieronymi Presbyteri, Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-10-01) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. XVIII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-10-02) (class_ ("III cl. (Priv.)")) + (title "Alb Feria VI. SS Angelorum Custodum,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. vel de Angelis. Feria VI prima in mense. Vesper\195\166 pr."))) + ((date 2026-10-03) (class_ ("III cl. (Priv.)")) + (title "Alb Sabb. S Teresiae a Iesu Infante Virg.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. Sabbatum primum in mense. I Vesper\195\166 de seq. dom., ut in Psalt. de sabb, ad Magn. ant. Adaperiat (dom. I octobris), or. pr., sine comm. \226\128\147 Compl. de sabb."))) + ((date 2026-10-04) (class_ ("II cl.")) + (title "Vir DOM. XIX POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-10-05) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. XIX post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-10-06) (class_ ("III cl. (Priv.)")) + (title "Alb Feria III. S Brunonis Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. Vesper\195\166 de festo. 100"))) + ((date 2026-10-07) (class_ ("II cl.")) + (title "Alb Feria IV. B. MARIAE VIRG. A ROSARIO,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("BMV Et te in Festivitate. Ad"))) + ((date 2026-10-08) (class_ ("III cl.")) + (title "Alb Feria V. S Birgittae Vid.,") (te_deum (true)) (gloria (true)) + (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa SS Sergii, Bacchi, Marcelli et Apuleii Mm. (rub.) Sapientiam Sanctorum, Gloria, ors. pr., comm. S Birgittae Vid., praef. comm. vel de Martyribus. Vesper\195\166 de festo, sine comm."))) + ((date 2026-10-09) (class_ ("III cl.")) + (title "Alb Feria VI. S Ioannis Leonardi Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa pr. SS Dionysii Ep., Rustici et Eleutherii Mm. (rub.), Gloria, comm. S Ioannis Leonardi Conf., praef. comm. vel de Martyribus. Vesper\195\166 de festo, sine comm."))) + ((date 2026-10-10) (class_ ("III cl.")) + (title "Alb Sabb. S Francisci Borgiae Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. I Vesper\195\166 de seq. dom., ut in Psalt. de sabb, ad Magn. ant. Refulsit sol (dom. II octobris), or. pr., sine comm. \226\128\147 Compl. de sabb."))) + ((date 2026-10-11) (class_ ("II cl.")) + (title "Vir DOM. XX POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-10-12) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. XX post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. Vesper\195\166 de feria or. dom. pr\195\166c."))) + ((date 2026-10-13) (class_ ("III cl.")) + (title "Alb Feria III. S Eduardis Regis Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. Vesper\195\166 de festo."))) + ((date 2026-10-14) (class_ ("III cl. (Priv.)")) + (title "Rub Feria IV. S Callisti I Papae et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. vel de Martyribus. Vesper\195\166 de festo."))) + ((date 2026-10-15) (class_ ("III cl. (Priv.)")) + (title "Alb Feria V. S Teresiae Virg.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("comm. \226\128\147"))) + ((date 2026-10-16) (class_ ("III cl.")) + (title "Alb Feria VI. S Hedwigis Vid.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("comm. Vesper\195\166 de festo."))) + ((date 2026-10-17) (class_ ("III cl.")) + (title "Alb Sabb. S Margaritae Mariae Alacoque Virg.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. I Vesper\195\166 de seq. dom., ut in Psalt. de sabb, ad Magn. ant. Exaudiat Dominus (dom. IV octobris), or. pr., sine comm. \226\128\147 Compl. de sabb."))) + ((date 2026-10-18) (class_ ("II cl.")) + (title "Vir DOM. XXI POST PENTECOSTEN, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-10-19) (class_ ("III cl.")) + (title "Alb Feria II. S Petri de Alcantara Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. Vesper\195\166 de festo."))) + ((date 2026-10-20) (class_ ("III cl.")) + (title "Alb Feria III. S Ioannis Cantii Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. Vesper\195\166 de festo."))) + ((date 2026-10-21) (class_ ("IV cl.")) + (title "Vir Feria IV post Dom. XXI post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-10-22) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. XXI post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. Vesper\195\166 de feria or. dom. pr\195\166c."))) + ((date 2026-10-23) (class_ ("III cl.")) + (title "Alb Feria VI. S Antonii Mariae Claret Ep. et Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-10-24) (class_ ("III cl.")) + (title "Alb Sabb. S Rapha\195\171lis Archangeli,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. vel de Angelis. I Vesper\195\166 de seq., sine comm. \226\128\147 Compl. de dom. 104"))) + ((date 2026-10-25) (class_ ("I cl.")) + (title "Alb Dom. DOMINI NOSTRI JESU CHRISTI REGIS,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("de Domino Nostro Jesu Rege. Hodie, in omnibus ecclesiis, coram Ss.mo Sacramento exposito, recitetur formula consecrationis generis humani Christo Regi, cum Litaniis de eodem Sacro Corde. II Vesper\195\166 pr. Hodie prohibentur omnes Missae defunctorum, etiam exsequialis."))) + ((date 2026-10-26) (class_ ("IV cl.")) + (title "Vir Feria II post Dom. XXII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-10-27) (class_ ("IV cl.")) + (title "Vir Feria III post Dom. XXII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. Vesper\195\166 de feria, or. dom. XXII post Pent."))) + ((date 2026-10-28) (class_ ("II cl.")) + (title "Rub Feria IV. SS SIMONIS * ET IUD\195\134 * APP.,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("App. In Canone Miss\195\166, nomen S. Apostoli Iud\195\166 inscribitur cum nomine Thadd\195\166i: ergo inclinatur caput quando dicitur Thadd\195\166i. Vesper\195\166 de Comm. \226\128\147 Compl. de dom. Hodie permittuntur tantum Missae votivae et defunctorum I et II classis."))) + ((date 2026-10-29) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. XXII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. Vesper\195\166 de feria or. dom. XXII post Pent."))) + ((date 2026-10-30) (class_ ("IV cl.")) + (title "Vir Feria VI post Dom. XXII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. Vesper\195\166 de feria or. dom. XXII post Pent."))) + ((date 2026-10-31) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) + (praef + ("BMV Et te in Veneratione. I Vesper\195\166 de seq. \226\128\147 Compl. de dom. 106"))) + ((date 2026-11-01) (class_ ("I cl.")) (title "Alb Dom. OMNIUM SANCTORUM,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("Trinit. vel de Omnibus Sanctis et Patronis. II"))) + ((date 2026-11-02) (class_ ("I cl.")) + (title "Nig Feria II. IN COMMEMORATIONE OMNIUM FIDELIUM DEFUNCTORUM,") + (te_deum ()) (gloria (false)) (credo (false)) + (praef + ("defunctorum, unica or. \226\128\147 Benedictio non dicitur. \226\128\147 Si tres Miss\195\166 celebrantur sine intermissione, sequentia dici debet tantum in Missa principali; si minus, dici debet in Missa prima. In aliis Missis, nisi sint in cantu, sequentia omitti potest."))) + ((date 2026-11-03) (class_ ("IV cl.")) + (title "Vir Feria III post Dom. XXIII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-11-04) (class_ ("III cl. (Priv.)")) + (title "Alb Feria IV. S Caroli Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. \226\128\147"))) + ((date 2026-11-05) (class_ ("IV cl.")) + (title "Vir Feria V post Dom. XXIII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-11-06) (class_ ("IV cl.")) + (title "Vir Feria VI post Dom. XXIII post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. Feria VI prima in mense."))) + ((date 2026-11-07) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) + (praef ("BMV Et te in Veneratione. Sabbatum primum in mense. I"))) + ((date 2026-11-08) (class_ ("II cl.")) + (title "Vir DOM. V QUI SUPERFUIT POST EPIPHANIAM, De ea,") + (te_deum (true)) (gloria (true)) (credo (true)) + (praef + ("Trinit. Dicitur Missa qu\195\166 inscribitur \194\171Dominica. V qui superfuit post Epiphaniam\194\187. Antiphonae ad Introitum, ad Offertorium et ad Communionem, necnon graduale et Alleluia cum suo versu, sumuntur e Dom. XXIII post Pent.; orationes, Epistola et Evangelium, e Dom. V qui superfuit post Epiphaniam. Ad II"))) + ((date 2026-11-09) (class_ ("II cl.")) + (title + "Alb Feria II. IN DEDICATIONE ARCHIBASILICAE SANCTISSIMI SALVATORIS,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("comm. vel de Dedicatione ecclesi\195\166."))) + ((date 2026-11-10) (class_ ("III cl.")) + (title "Alb Feria III. S Andreae Avellini Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa pr. SS Tryphonis, Respicii et Nymphae Virg., Mm. (rub.), Gloria, comm. S Andreae Avellini Conf., praef. comm. vel de Martyribus."))) + ((date 2026-11-11) (class_ ("III cl. (Priv.)")) + (title "Alb Feria IV. S Martini Ep. et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-11-12) (class_ ("III cl.")) + (title "Rub Feria V. S Martini I Papae et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus."))) + ((date 2026-11-13) (class_ ("III cl.")) + (title "Alb Feria VI. S Didaci Conf.,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("comm. \226\128\147"))) + ((date 2026-11-14) (class_ ("III cl. (Priv.)")) + (title "Rub Sabb. S Iosaphat Ep. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("comm. vel de Martyribus \226\128\147"))) + ((date 2026-11-15) (class_ ("II cl.")) + (title "Vir DOM. VI QUI SUPERFUIT POST EPIPHANIAM, De ea,") + (te_deum (true)) (gloria (true)) (credo (true)) + (praef + ("Trinit. Dicitur Missa qu\195\166 inscribitur \194\171Dominica. VI qui superfuit post Epiphaniam\194\187. Antiphonae ad Introitum, ad Offertorium et ad Communionem, necnon graduale et Alleluia cum suo versu, sumuntur e Dom. XXIII post Pent.; orationes, Epistola et Evangelium, e Dom. VI qui superfuit post Epiphaniam. Ad II"))) + ((date 2026-11-16) (class_ ("III cl.")) + (title "Alb Feria II. S Gertrudis Virg.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-11-17) (class_ ("III cl.")) + (title "Alb Feria III. S Gregorii Thaumaturgi Ep. et Conf.,") + (te_deum (true)) (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-11-18) (class_ ("III cl. (Priv.)")) + (title + "Alb Feria IV. In Dedicatione Basilicarum SS Petri et Pauli App.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. vel de Dedicatione ecclesi\195\166."))) + ((date 2026-11-19) (class_ ("III cl.")) + (title "Alb Feria V. S Elisabeth Vid.,") (te_deum (true)) (gloria (true)) + (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Pontiani Papae et Mart. (rub.) Si diligis, Gloria, comm. S Elisabeth Vid., praef. comm. vel de Martyribus."))) + ((date 2026-11-20) (class_ ("III cl.")) + (title "Alb Feria VI. S Felicis de Valois Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef (comm.))) + ((date 2026-11-21) (class_ ("III cl.")) + (title "Alb Sabb. In Praesentatione B. Mariae Virg.,") (te_deum (true)) + (gloria (true)) (credo (false)) + (praef ("BMV Et te in Pr\195\166sentatione. I"))) + ((date 2026-11-22) (class_ ("II cl.")) + (title "Vir DOM. XXIV & ULTIMA POST PENTECOSTEN, De ea,") + (te_deum (true)) (gloria (true)) (credo (true)) + (praef ("Trinit. Ad II"))) + ((date 2026-11-23) (class_ ("III cl. (Priv.)")) + (title "Rub Feria II. S Clementis I * Papae et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. Ad"))) + ((date 2026-11-24) (class_ ("III cl. (Priv.)")) + (title "Alb Feria III. S Ioannis a Cruce Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-11-25) (class_ ("III cl.")) + (title "Rub Feria IV. S Catharinae Virg. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus."))) + ((date 2026-11-26) (class_ ("III cl.")) + (title "Alb Feria V. S Silvestri Abb.,") (te_deum (true)) (gloria (true)) + (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Petri Alexandrini Ep. et Mart. (rub.) Statuit ei, Gloria, comm. S Silvestri Abb., praef. comm. vel de Martyribus. \226\128\147"))) + ((date 2026-11-27) (class_ ("IV cl.")) + (title "Vir Feria VI post Dom. XXIV & Ultima post Pentecosten, De ea,") + (te_deum (false)) (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-11-28) (class_ ("IV cl.")) + (title "Alb Sancta Maria in Sabbato,") (te_deum (true)) (gloria (true)) + (credo (false)) (praef ("BMV Et te in Veneratione. I"))) + ((date 2026-11-29) (class_ ("I cl.")) + (title "Viol DOM. I ADVENTUS, De ea,") (te_deum (true)) (gloria (false)) + (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-11-30) (class_ ("II cl.")) + (title "Rub Feria II. S ANDREAE * APOSTOLI,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("App. Ad"))) + ((date 2026-12-01) (class_ ("III cl.")) + (title "Viol Feria III post Dom. I Adventus, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-02) (class_ ("III cl.")) + (title "Rub Feria IV. S Bibianae Virg. et Mart.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. vel de Martyribus. Ad"))) + ((date 2026-12-03) (class_ ("III cl. (Priv.)")) + (title "Alb Feria V. S Francisci Xavierii Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-12-04) (class_ ("III cl.")) + (title "Alb Feria VI. S Petri Chrysologi Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef + ("comm. \226\128\147 Vel (sec. decretum \194\171Cum sanct.\194\187) Missa S Barbarae Virg. et Mart. (rub.) Loquebar de testimoniis tuis, Gloria, comm. 1\194\170 Feriae, comm. 2\194\170 S Petri Chrysologi Ep., Conf. et Eccl. Doct., praef. comm. vel de Martyribus. Feria VI prima in mense. Ad"))) + ((date 2026-12-05) (class_ ("III cl.")) + (title "Viol Sabb. post Dom. I Adventus, De eo,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("comm. Sabbatum primum in mense. I"))) + ((date 2026-12-06) (class_ ("I cl.")) + (title "Viol DOM. II ADVENTUS, De ea,") (te_deum (true)) (gloria (false)) + (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-12-07) (class_ ("III cl. (Priv.)")) + (title "Alb Feria II. S Ambrosii Ep., Conf. et Eccl. Doct.,") + (te_deum (true)) (gloria (true)) (credo (false)) + (praef ("comm. \226\128\147"))) + ((date 2026-12-08) (class_ ("I cl.")) + (title "Alb Feria III. IN CONCEPTIONE IMMACULATA B. MARIAE VIRGINIS,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("BMV Et te in Conceptione Immaculata. Ad"))) + ((date 2026-12-09) (class_ ("III cl.")) + (title "Viol Feria IV post Dom. II Adventus, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-10) (class_ ("III cl.")) + (title "Viol Feria V post Dom. II Adventus, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-11) (class_ ("III cl. (Priv.)")) + (title "Alb Feria VI. S Damasi I Papae et Conf.,") (te_deum (true)) + (gloria (true)) (credo (false)) (praef ("comm. Ad"))) + ((date 2026-12-12) (class_ ("III cl.")) + (title "Viol Sabb. post Dom. II Adventus, De eo,") (te_deum ()) + (gloria (false)) (credo (false)) (praef ("comm. I"))) + ((date 2026-12-13) (class_ ("I cl.")) + (title "DOM. III ADVENTUS (GAUDETE), De ea,") (te_deum (true)) + (gloria (false)) (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-12-14) (class_ ("III cl.")) + (title "Viol Feria II post Dom. III Adventus (Gaudete), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-15) (class_ ("III cl.")) + (title "Viol Feria III post Dom. III Adventus (Gaudete), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-16) (class_ ("II cl.")) + (title "Viol FERIA IV QUATTUOR TEMP., De ea,") (te_deum ()) + (gloria (false)) (credo (false)) + (praef ("comm. \226\128\147 Quoad Flectamus genua vide RM 440."))) + ((date 2026-12-17) (class_ ("II cl.")) + (title "Viol FERIA V POST DOM. III ADVENTUS (GAUDETE), De ea,") + (te_deum ()) (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-18) (class_ ("II cl.")) + (title "Viol FERIA VI QUATTUOR TEMP., De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-19) (class_ ("II cl.")) + (title "Viol SABB. QUATTUOR TEMP., De eo,") (te_deum ()) (gloria (false)) + (credo (false)) + (praef + ("comm. \226\128\147 Quoad Flectamus genua vide RM 440. Quoad lectiones vide RM 468. I"))) + ((date 2026-12-20) (class_ ("I cl.")) + (title "Viol DOM. IV ADVENTUS, De ea,") (te_deum (true)) (gloria (false)) + (credo (true)) (praef ("Trinit. Ad II"))) + ((date 2026-12-21) (class_ ("II cl.")) + (title "Rub Feria II. S THOM\195\134 * APOSTOLI,") (te_deum ()) + (gloria (true)) (credo (true)) (praef ("App. Ad"))) + ((date 2026-12-22) (class_ ("II cl.")) + (title "Viol FERIA III POST DOM. IV ADVENTUS, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-23) (class_ ("II cl.")) + (title "Viol FERIA IV POST DOM. IV ADVENTUS, De ea,") (te_deum ()) + (gloria (false)) (credo (false)) (praef (comm.))) + ((date 2026-12-24) (class_ ("I cl.")) + (title "Viol Feria V. VIGILIA NATIVITATIS DOMINI,") (te_deum (true)) + (gloria (false)) (credo (false)) (praef ("comm. I"))) + ((date 2026-12-25) (class_ ("I cl.")) + (title "Alb Feria VI. IN NATIVITATE DOMINI,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef + ("et Communic. pr. per totam oct. \226\128\147 In Communicantes: in 1\194\170 Missa dicitur Noctem sacratissimam celebrantes, qua, in 2\194\170 et 3\194\170 Missa et per octavam Diem sacratissimum celebrantes, quo. \226\128\147 In 2\194\170 Missa (etiam in cantu) fit comm. S. Anastasi\195\166 * M. \226\128\147 In Missis in cantu, ad verba symboli Et incarnatus est\226\128\166 et homo factus est, omnes genuflectunt versus altare, non tantum cum a celebrante recitantur, sed etiam cum a choro canuntur (RM 518 b). II"))) + ((date 2026-12-26) (class_ ("II cl.")) + (title "Rub Sabb. S STEPHANI * PROTOMARTYRIS,") (te_deum ()) + (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. Ad"))) + ((date 2026-12-27) (class_ ("II cl.")) + (title "Alb DOM. INFRA OCTAVAM NATIVITATIS, De ea,") (te_deum (true)) + (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. Ad II"))) + ((date 2026-12-28) (class_ ("II cl.")) + (title "Rub Feria II. SS INNOCENTIUM MM.,") (te_deum ()) (gloria (true)) + (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. Ad"))) + ((date 2026-12-29) (class_ ("II cl.")) + (title "Alb FERIA III DOM. INFRA OCTAVAM NATIVITATIS, De ea,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum."))) + ((date 2026-12-30) (class_ ("II cl.")) + (title "Alb FERIA IV DOM. INFRA OCTAVAM NATIVITATIS, De ea,") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum."))) + ((date 2026-12-31) (class_ ()) + (title + "Alb FERIA V DOM. INFRA OCTAVAM NATIVITATIS, De ea. \226\128\147 Off. semifestivum. \226\128\147 Ad MAT. invit., hymnus, 9 antt. et 9 pss. cum ultimo V de festo Nativ., Ll. de Scr. occ. cum suis RR (ad 2um additur Gloria Patri)\226\128\147 Ad Laudes antt. de Nativ., pss. de dom., comm. S Silvestri I Papae et Conf. \226\128\147 Ad HORAS ant. et pss. de feria curr., rel ut in festo Nativ. \226\128\147 Ad Primam in R Br. V Qui natus es de Maria Virgine. Missa Puer natus de diebus infra octavam, Gloria, Credo, comm. S Silvestri I Papae et Conf., praef. de Nativ., Communic. de Nativ. diem sacratissimum. I VESPER\195\134 de seq. \226\128\147 Compl. de dom. Hodie ad solemnem recitationem hymni Te Deum, indulgentia plenaria lucrari potest. 126") + (te_deum ()) (gloria (true)) (credo (true)) + (praef ("de Nativ., Communic. de Nativ. diem sacratissimum. I")))) diff --git a/test/test_colitur.ml b/test/test_colitur.ml index 6db744f..7708fef 100644 --- a/test/test_colitur.ml +++ b/test/test_colitur.ml @@ -16,7 +16,7 @@ let () = Test_rubrics_ef.suite; Test_differential.suite; Test_oracle.suite; Test_oracle.suite_2038; Test_oracle.suite_2035; Test_lms_ordo.suite_2023_2024; Test_lms_ordo.suite_2024_2025; Test_lms_ordo.suite_2025_2026; - Test_lms_ordo.suite_allow_list; + Test_lms_ordo.suite_allow_list; Test_fiuv_ordo.suite; Test_golden.suite; ("lectionary", Test_lectionary.suite); ("lectionary-ef", Test_lectionary_ef.suite); diff --git a/test/test_fiuv_ordo.ml b/test/test_fiuv_ordo.ml new file mode 100644 index 0000000..8b3e942 --- /dev/null +++ b/test/test_fiuv_ordo.ml @@ -0,0 +1,268 @@ +(* Witnesses task (2026-08-22-colitur-celebrant-rubrics-phase1): the + SEVENTH validation layer, and the first UNIVERSAL, SECOND-COMPILER + witness -- the FIUV (Foederatio Internationalis Una Voce) Ordo for + 2025-2026, compiled by Joseph Shaw, independent of the Latin Mass + Society's own three editions (test_lms_ordo.ml) except for sharing a + publisher/host (see test/fixtures/fiuv-ordo-2025-2026.sexp's own + provenance header, and docs/research/ordo/PROVENANCE-ordo-corpus.md, + for the full account of what independence this source does and does + not buy). + + WHY THIS LAYER IS MORE VALUABLE THAN THE LMS ONE, per the task brief's + own four reasons: (1) UNIVERSAL -- no diocesan variants to exclude at + all, so this fixture's own [row] carries no [has_diocesan_variant] + field, unlike the LMS one; (2) IN LATIN, the rubrics' own vocabulary; + (3) BOTH DIRECTIONS EXPLICIT ("Gloria"/"sine Gloria", "Credo"/"sine + Credo") -- used here exactly as with the LMS source; (4) RECORDS THE + TE DEUM, the hinge of RG 431(a)'s own Mass-Gloria rule (deferred to + Phase 2, Breviary nn. 237-238) -- captured into the fixture, NOT + compared here (no colitur-side Te Deum predicate exists yet). + + SCOPE: the CREED (RG 475-476, {!Rite_ef.Rubrics_ef.creed}) is the ONE + axis compared against colitur, per the task brief. [praef] and + [te_deum] are captured into the fixture (a genuinely useful data set + for Phase 2/3's still-unbuilt Gloria and preface rules) but + deliberately NOT validated here -- there is nothing on colitur's own + side yet to compare either against. [class_] (raw, including the FIUV + ordo's own explicit "III cl." vs "III cl. (Priv.)" Cum Sanctissima + convention, stated on its own title page) is likewise captured but not + compared: colitur's core is strictly the 1962 Missal with Cum + Sanctissima/Quo Magis modelled only as an OVERLAY, never core + (CLAUDE.md's own binding decision #2), so colitur's UNOVERLAID output + has no Cum-Sanctissima-aware notion of "III cl." vs "(Priv.)" to + compare this field against in the first place -- comparing it would be + comparing the Ordo against a question colitur's default configuration + was never asked. *) + +module Cal = Colitur_kernel.Calendar +module Layer = Colitur_kernel.Layer +module Overlay = Colitur_kernel.Overlay +module LD = Colitur_kernel.Liturgical_day +module Date = Colitur_kernel.Date +module V = Rite_ef.Vocab_ef + +let sanctoral_path = "../data/ef/sanctoral.sexp" +let adjustments_path = "../data/ef/adjustments.sexp" +let fixture_path = "fixtures/fiuv-ordo-2025-2026.sexp" +let allow_list_path = "../data/ef/expected-divergences-fiuv.sexp" + +(* Duplicated, not shared -- test_lms_ordo.ml's own identical function + carries the same "no shared .mli" reasoning. *) +let sha256_of_file path = + let tmp = Filename.temp_file "colitur_fiuv_ordo_sha256" ".txt" in + Fun.protect + ~finally:(fun () -> try Sys.remove tmp with Sys_error _ -> ()) + (fun () -> + let cmd = Printf.sprintf "sha256sum %s > %s" (Filename.quote path) (Filename.quote tmp) in + let rc = Sys.command cmd in + if rc <> 0 then Alcotest.failf "sha256sum exited %d for %s (is it on PATH?)" rc path; + let ic = open_in tmp in + let line = + try input_line ic + with End_of_file -> + close_in ic; + Alcotest.failf "sha256sum produced no output for %s" path + in + close_in ic; + match String.index_opt line ' ' with + | Some i -> String.sub line 0 i + | None -> Alcotest.failf "unexpected sha256sum output for %s: %S" path line) + +let fixture_sha256 = "becadaad43b3a42c4eb820cb4e93d68f9b1c07a2c8e5273167cd599758af5c67" + +let real_layer () = + let layer = + match Layer.load V.rank_of_sexp sanctoral_path with + | Ok l -> l + | Error e -> Alcotest.failf "%s: failed to load: %s" sanctoral_path e + in + let overlay = + match Overlay.load V.rank_of_sexp adjustments_path with + | Ok o -> o + | Error e -> Alcotest.failf "%s: failed to load: %s" adjustments_path e + in + let layer, diagnostics = Overlay.apply layer overlay in + Alcotest.(check (list string)) "the committed overlay applies cleanly, no diagnostics" [] + (List.map Overlay.diagnostic_to_string diagnostics); + layer + +let real_lectionary () = + match Colitur_kernel.Lectionary.load "../data/ef/lectionary.sexp" with + | Ok l -> l + | Error e -> Alcotest.failf "../data/ef/lectionary.sexp: failed to load: %s" e + +let real_commons () = + match Rite_ef.Lectionary_ef.Commons.load "../data/ef/commons.sexp" with + | Ok c -> c + | Error e -> Alcotest.failf "../data/ef/commons.sexp: failed to load: %s" e + +(* ---------------------------------------------------------------------- *) +(* The Ordo side: the sexp row, mirrored from tools/extract_fiuv_ordo.ml's *) +(* own [row] -- see this file's own header on why there is no *) +(* [has_diocesan_variant] field here, unlike the LMS mirror. *) +(* ---------------------------------------------------------------------- *) + +open Sexplib0.Sexp_conv + +type ordo_row = { + date : string; + class_ : string option; + title : string; + te_deum : bool option; + gloria : bool option; + credo : bool option; + praef : string option; +} +[@@deriving sexp] + +let ordo_rows () = + let sexp = + try Sexplib.Sexp.load_sexp fixture_path + with e -> Alcotest.failf "%s: failed to load: %s" fixture_path (Printexc.to_string e) + in + list_of_sexp ordo_row_of_sexp sexp + +let window_first = "2025-11-27" +let window_last = "2026-12-31" + +(* ---------------------------------------------------------------------- *) +(* The colitur side, over the same window -- mirrors test_lms_ordo.ml's *) +(* own [colitur_rows] exactly (a liturgical year straddles two civil *) +(* years, so the resolution walk starts a civil year early and ends one *) +(* late). *) +(* ---------------------------------------------------------------------- *) + +type colitur_row = { c_date : string; c_creed : bool } + +let colitur_rows () = + let layer = real_layer () in + let rite = Rite_ef.context ~lectionary:(real_lectionary ()) ~commons:(real_commons ()) in + let by_rata : (int, (V.season, V.rank) LD.t) Hashtbl.t = Hashtbl.create 800 in + for y = 2024 to 2027 do + let days = Cal.year rite layer y in + Array.iter (fun (d : (V.season, V.rank) LD.t) -> Hashtbl.replace by_rata (Date.to_rata d.LD.date) d) days + done; + let mk s = match Date.of_iso8601 s with Ok d -> d | Error e -> Alcotest.failf "%s: %s" s e in + let rows = ref [] in + let d = ref (mk window_first) in + let stop = mk window_last in + while Date.compare !d stop <= 0 do + (match Hashtbl.find_opt by_rata (Date.to_rata !d) with + | Some day -> rows := { c_date = Date.to_iso8601 day.LD.date; c_creed = day.LD.creed } :: !rows + | None -> Alcotest.failf "no colitur day resolved for %s" (Date.to_iso8601 !d)); + d := Date.add_days !d 1 + done; + List.rev !rows + +(* ---------------------------------------------------------------------- *) +(* data/ef/expected-divergences-fiuv.sexp -- same shape as the LMS/ *) +(* missalemeum allow-lists' own [allow_entry]. A SEPARATE file: this Ordo *) +(* is a fourth, independent lineage from all three others already in this *) +(* project. *) +(* ---------------------------------------------------------------------- *) + +type allow_entry = { id : string; citation : string; verdict : string; note : string; expected_rows : int } +[@@deriving sexp] + +let load_allow_list () = + let sexps = + try Sexplib.Sexp.load_sexps allow_list_path + with e -> Alcotest.failf "%s: failed to load: %s" allow_list_path (Printexc.to_string e) + in + List.map allow_entry_of_sexp sexps + +(* ---------------------------------------------------------------------- *) +(* Tests *) +(* ---------------------------------------------------------------------- *) + +let test_fixture_checksum () = + Alcotest.(check string) "fixture SHA-256 matches its provenance note" fixture_sha256 (sha256_of_file fixture_path) + +let test_dates_align () = + let ordo = ordo_rows () in + let colitur = colitur_rows () in + Alcotest.(check int) "the Ordo fixture has 400 rows (2025-11-27..2026-12-31)" 400 (List.length ordo); + Alcotest.(check int) "colitur resolved the same number of days" (List.length ordo) (List.length colitur); + (match ordo with o :: _ -> Alcotest.(check string) "first date" window_first o.date | [] -> Alcotest.fail "empty"); + (match List.rev ordo with + | o :: _ -> Alcotest.(check string) "last date" window_last o.date + | [] -> Alcotest.fail "empty"); + let mismatched = + List.filter_map + (fun (o, c) -> if String.equal o.date c.c_date then None else Some (o.date, c.c_date)) + (List.combine ordo colitur) + in + Alcotest.(check (list (pair string string))) "no misaligned dates" [] mismatched + +(* Holy Saturday (2026-04-04) is the ONLY day this fixture shows no Credo + marker for -- confirmed directly against the raw source: unlike the + LMS Ordo (whose "no Mass" day is Good Friday, the 1955-restored Holy + Week having no Mass that day at all), THIS Ordo's Good Friday DOES + carry a Mass rubric ("Missa pr., ... Gloria, sine Credo, praef. + comm."), leaving Holy Saturday as the sole day with no Mass mentioned + at all (its own Vigil Mass is conventionally counted under Easter + Sunday's own date in this source, matching a real, if narrower, + instance of the same "a vigil Mass is dated to the day it anticipates" + convention the LMS characterisation already established). Asserted as + the ONLY such day, not merely observed once: a parsing regression that + swallowed a real row would otherwise silently join this bucket instead + of failing loudly as an unexplained mismatch. *) +let test_creed_coverage () = + let ordo = ordo_rows () in + let no_creed = List.filter (fun o -> o.credo = None) ordo in + Alcotest.(check (list string)) "only Holy Saturday has no Ordo Creed marker" [ "2026-04-04" ] + (List.map (fun o -> o.date) no_creed) + +let describe_creed_mismatch (o : ordo_row) (c : colitur_row) = + Printf.sprintf "%s %S: colitur creed=%b, Ordo creed=%b" o.date o.title c.c_creed (Option.get o.credo) + +(* Which allow-list id, if any, explains a Creed mismatch on this date -- + date-keyed, not "any declared entry excuses any mismatch", the same + discipline test_lms_ordo.ml's own [allow_list_id_for_date] uses and + for the identical reason: an entry that starts firing on an + UNEXPECTED new date must be visible as a real change, not silently + absorbed. Empty until characterisation found a real divergence to + name. *) +let fiuv_allow_list_id_for_date = ([] : (string * string) list) + +let test_creed_matches_or_is_explained () = + let ordo = ordo_rows () in + let colitur = colitur_rows () in + let allow_list = load_allow_list () in + let by_id = List.map (fun e -> (e.id, e)) allow_list in + let unexplained = ref [] in + let explained_counts = Hashtbl.create 8 in + List.iter2 + (fun (o : ordo_row) (c : colitur_row) -> + if not (String.equal o.date c.c_date) then Alcotest.failf "misaligned: ordo %s vs colitur %s" o.date c.c_date; + match o.credo with + | None -> () + | Some ocreed -> + if Bool.equal ocreed c.c_creed then () + else + match List.assoc_opt o.date fiuv_allow_list_id_for_date with + | Some id -> Hashtbl.replace explained_counts id (1 + try Hashtbl.find explained_counts id with Not_found -> 0) + | None -> unexplained := describe_creed_mismatch o c :: !unexplained) + ordo colitur; + Alcotest.(check (list string)) "every Creed mismatch is named in the allow-list -- none unexplained" [] + (List.rev !unexplained); + Hashtbl.iter + (fun id n -> + match List.assoc_opt id by_id with + | None -> Alcotest.failf "allow-list entry %s used by the comparator but not declared in %s" id allow_list_path + | Some e -> Alcotest.(check int) (Printf.sprintf "%s: expected_rows matches the actual count" id) e.expected_rows n) + explained_counts; + List.iter + (fun e -> + if not (Hashtbl.mem explained_counts e.id) then + Alcotest.failf "allow-list entry %s is declared but never matched a real divergence" e.id) + allow_list + +let suite = + ( "fiuv-ordo", + [ Alcotest.test_case "fixture SHA-256 matches its provenance note" `Quick test_fixture_checksum; + Alcotest.test_case "streams are 400 rows each, dates aligned 1:1" `Quick test_dates_align; + Alcotest.test_case "only Holy Saturday has no Ordo Creed marker" `Quick test_creed_coverage; + Alcotest.test_case "every Creed difference is named in the cited allow-list -- none unexplained" `Quick + test_creed_matches_or_is_explained + ] ) diff --git a/tools/dune b/tools/dune index 487751e..9a4dea5 100644 --- a/tools/dune +++ b/tools/dune @@ -32,6 +32,7 @@ ; reads no EF-specific vocabulary. (executable (name extract_lms_ordo) + (modules extract_lms_ordo) (libraries colitur_kernel unix sexplib) (preprocess (pps ppx_sexp_conv))) @@ -54,3 +55,16 @@ (deps check_citations.py test_check_citations.py) (action (run python3 test_check_citations.py))) + +; Witnesses task (2026-08-22-colitur-celebrant-rubrics-phase1): turns +; pdftotext's -layout dump of the FIUV universal Ordo into +; test/fixtures/fiuv-ordo-2025-2026.sexp. Run via `dune exec +; tools/extract_fiuv_ordo.exe -- +; `. Same `unix`-for-`sha256sum` usage as extract_lms_ordo.ml; +; `colitur_kernel` only, no `rite_ef` -- same reasoning, dates only. +(executable + (name extract_fiuv_ordo) + (modules extract_fiuv_ordo) + (libraries colitur_kernel unix sexplib) + (preprocess + (pps ppx_sexp_conv))) diff --git a/tools/extract_fiuv_ordo.ml b/tools/extract_fiuv_ordo.ml new file mode 100644 index 0000000..42d3b96 --- /dev/null +++ b/tools/extract_fiuv_ordo.ml @@ -0,0 +1,637 @@ +(* Witnesses task (2026-08-22-colitur-celebrant-rubrics-phase1): turns + pdftotext's -layout dump of the FIUV (Foederatio Internationalis Una + Voce) universal Ordo into test/fixtures/fiuv-ordo-2025-2026.sexp, one + row per day, 2025-11-27..2026-12-31. + + A DIFFERENT format from tools/extract_lms_ordo.ml's own LMS PDFs in + every way that matters (see docs/research/ordo/PROVENANCE-ordo-corpus.md): + UNIVERSAL (no diocesan variants to exclude at all -- one block per day, + not "the first of several"), IN LATIN, using the rubrics' own + vocabulary ("Missa pr., Gloria, sine Credo, praef. comm."), and BOTH + directions of Gloria/Credo are stated explicitly in the source's own + words ("Gloria"/"sine Gloria", "Credo"/"sine Credo") rather than by a + printed flag letter. Hand-rolled, no Str/regex (frozen deps) -- the + same String.sub/index/split_on_char discipline extract_lms_ordo.ml + already uses for a different publisher's layout. + + THE KEY STRUCTURAL FACTS this parser leans on, established during + characterisation (see the fixture's own provenance header for the + full record): + + 1. A day-start line's own FIRST token is always "<1-2 digit day>." + (e.g. "27.", "3."), immediately followed by a colour code (not + anchored on below -- colour is captured as raw prose, never parsed + into a closed set, because a few real days use a COMPOUND colour + ("Viol. in Off., Alb. in Missa." on Holy Thursday) or drop the + token to a blank cell entirely (13 December 2026, a rendering + quirk) -- neither is needed for anything this task compares). + + 2. Month headers/running-footers name a month EITHER in English with a + trailing ROMAN-NUMERAL year ("November MMXXV", the book's own first + two months only) OR bare in Latin with no year at all + ("Januarius", "Februarius", ... every month after). The English + Nov/Dec spellings happen to be IDENTICAL to their Latin + equivalents, so one 12-entry table covers both vocabularies. + CHARACTERISATION FINDING: the SECOND header ("December MMXV") is a + publisher-side TYPO -- MMXV is 2015, ten years off, contradicted by + every neighbouring date and by month-order inference alone. This + parser therefore reads a Roman-numeral year ONLY off the very + FIRST header encountered (the anchor) and tracks every subsequent + month purely by wraparound inference (increment the year exactly + once, at the Dec->Jan transition) -- the typo is never read at all, + not merely tolerated. + + 3. Every real Mass rubric line starts with the literal token "Missa" + (401 of ~400 real day-blocks, confirmed structurally). A SECOND, + alternate Mass option, when the day offers one, is introduced by + the CAPITALISED two-token sequence "Vel Missa" -- never bare lower- + case "vel" alone, which is the ordinary Latin conjunction "or" and + appears constantly inside ordinary prose (e.g. "praef. comm. vel de + Martyribus", part of ONE preface's own text, not a second Mass + option) -- so only "Vel Missa", both tokens, anchors a real + alternate-option boundary. This parser reads Gloria/Credo/praef. + from the FIRST Mass option only, bounded above by whichever comes + first: "Vel Missa" or "VESPERAE"/"VESPERA" -- the identical + "day's own PRIMARY office, not a menu entry" discipline + extract_lms_ordo.ml already uses for the LMS diocesan-variant + colon boundary. + + 4. SUBSTRING TRAP, found and defended against: "Gloria" is also the + first word of "Gloria Patri" (the psalm doxology, "Glory be to the + Father"), a DIFFERENT liturgical unit that has nothing to do with + whether the Mass's own Gloria in excelsis is said -- and it can + appear INSIDE the very Mass clause being scanned (Good Friday: + "Missa pr., (omittuntur ps. Iudica me et Gloria Patri), Gloria, + sine Credo, praef. comm." -- the real, standalone "Gloria," follows + immediately after). [find_word] below rejects any "Gloria" hit + whose very next token is "Patri", the same whole-token discipline + extract_lms_ordo.ml's own header describes for "V Mass of BVM" + being a substring of "IV Mass of BVM". + + Usage: + pdftotext -layout docs/research/ordo/fiuv-ordo-2025-2026.pdf /tmp/fiuv.txt + dune exec tools/extract_fiuv_ordo.exe -- /tmp/fiuv.txt \ + docs/research/ordo/fiuv-ordo-2025-2026.pdf \ + test/fixtures/fiuv-ordo-2025-2026.sexp *) + +open Sexplib0.Sexp_conv +module Date = Colitur_kernel.Date + +let die fmt = Printf.ksprintf (fun s -> prerr_endline ("extract_fiuv_ordo: " ^ s); exit 1) fmt + +(* Mirrored, not shared, by test/test_fiuv_ordo.ml -- tools/ and test/ + have no common .mli either could hang a shared type from, the same + reasoning extract_lms_ordo.ml's own header already gives. *) +type row = { + date : string; (** ISO-8601 *) + class_ : string option; (** raw, e.g. "III cl.", "III cl. (Priv.)", "I cl." -- [None] only if genuinely unparseable *) + title : string; (** the day-start line's own text before the class marker *) + te_deum : bool option; (** [None] only if neither "Te Deum" nor "non dicitur Te Deum" is found *) + gloria : bool option; + credo : bool option; + praef : string option; (** raw trailing text after "praef." within the primary Mass clause -- CAPTURED, NOT VALIDATED *) +} +[@@deriving sexp] + +(* --- tiny hand-rolled helpers, no Str/regex ------------------------------ *) + +let split_ws s = + String.split_on_char ' ' (String.map (fun c -> if c = '\t' then ' ' else c) s) + |> List.filter (fun t -> t <> "") + +let is_all_digits s = s <> "" && String.for_all (fun c -> c >= '0' && c <= '9') s + +let has_prefix ~prefix s = + String.length s >= String.length prefix && String.sub s 0 (String.length prefix) = prefix + +(* Strips ASCII trailing punctuation only (.,();) -- tokens in this source + never carry other trailing marks that matter to comparisons below. *) +let rec strip_trailing_punct s = + let n = String.length s in + if n = 0 then s + else + match s.[n - 1] with + | '.' | ',' | ')' | ';' | ':' -> strip_trailing_punct (String.sub s 0 (n - 1)) + | _ -> s + +let contains s ~sub = + let ls = String.length s and lu = String.length sub in + if lu = 0 then true + else + let rec go i = if i + lu > ls then false else if String.sub s i lu = sub then true else go (i + 1) in + go 0 + +let index_of s ~sub = + let ls = String.length s and lu = String.length sub in + if lu = 0 then Some 0 + else + let rec go i = if i + lu > ls then None else if String.sub s i lu = sub then Some i else go (i + 1) in + go 0 + +let months = + [| "Januarius"; "Februarius"; "Martius"; "Aprilis"; "Maius"; "Junius"; "Julius"; "Augustus"; "September"; + "October"; "November"; "December" |] + +let month_index name = + let rec go i = if i >= Array.length months then None else if months.(i) = name then Some (i + 1) else go (i + 1) in + go 0 + +(* Roman numerals, subtractive form -- only ever called once, on the + FIRST month header's own year token (the anchor); see the module + header on why every LATER header's own year, when present at all, is + deliberately never read. *) +let roman_value = function + | 'I' -> Some 1 | 'V' -> Some 5 | 'X' -> Some 10 | 'L' -> Some 50 | 'C' -> Some 100 | 'D' -> Some 500 + | 'M' -> Some 1000 | _ -> None + +let parse_roman s = + let n = String.length s in + let rec go i acc = + if i >= n then Some acc + else + match roman_value s.[i] with + | None -> None + | Some v -> ( + let next = if i + 1 < n then roman_value s.[i + 1] else None in + match next with + | Some nv when nv > v -> go (i + 2) (acc + nv - v) + | _ -> go (i + 1) (acc + v)) + in + if n = 0 then None else go 0 0 + +(* --- day-block scanning --------------------------------------------------- *) + +type block = { b_day : int; b_month : int; b_year : int; b_lines : string list } + +let is_day_start_line toks = + match toks with + | t :: _ :: _ when String.length t >= 2 && t.[String.length t - 1] = '.' -> + let core = String.sub t 0 (String.length t - 1) in + if is_all_digits core then + let d = int_of_string core in + if d >= 1 && d <= 31 then Some d else None + else None + | _ -> None + +(* A month running-header/footer line: first token is a recognised month + name (English Nov/Dec spelled identically to Latin), optionally + followed by a Roman-numeral year and/or a page number -- ALWAYS pure + noise for the day-block scanner (never a continuation line's own + content), but the FIRST time a given month index is seen it also + drives the [cur_month]/[cur_year] state transition. *) +let is_month_marker_line toks = match toks with m :: _ -> month_index m <> None | [] -> false + +(* Left-margin indulgence-notation codes ("Ind." = an indulgence is + available, "Plen." = a plenary one, "DFP" unexplained but structurally + identical -- all three print in the SAME left-margin column pdftotext + -layout preserves, glued onto the following content line as literal + leading tokens, the identical trap extract_lms_ordo.ml's own + [strip_left_column] already documents for the LMS PDFs' "Pl"/"Ind" + column. Found by tracing a real parse failure (8 December 2025's own + class marker split across two physical lines by "DFP" sitting between + "I" and "cl."), not assumed in advance: catalogued via a frequency + scan of every short capitalised token opening a continuation line, and + deliberately does NOT include "RM" (11 occurrences, ALSO short and + capitalised) -- checked directly, "RM" is a real citation abbreviation + ("Rubricae Missalis", e.g. "vide RM 440"), not a margin code, so + stripping it would corrupt real text for no parsing benefit. *) +let strip_left_column tokens = + let is_marker t = t = "Ind." || t = "Plen." || t = "DFP" in + let rec go = function t :: rest when is_marker t -> go rest | ts -> ts in + go tokens + +(* The malformed trailing entry's own distinctive two-token prefix, + "1st Jan" -- NOT a generic "first token is a bare 4-digit number" + check (extract_lms_ordo.ml's own approach): that generic shape false- + positived here, on real body content deep in October ("...20 augusti + / 1885, 26 augusti 1886..." -- an indulgence-decree date citation + whose line-wrap happens to put a 4-digit year token first on its own + physical line). This source's OWN tail artefact is reliably + distinguished only by its literal, unique "1st Jan" opening -- found + by tracing the false stop, not assumed in advance. *) +let is_stop_tail_line toks = match toks with "1st" :: "Jan" :: _ -> true | _ -> false + +let read_lines path = + let ic = open_in path in + let rec loop acc = match input_line ic with l -> loop (l :: acc) | exception End_of_file -> List.rev acc in + let ls = loop [] in + close_in ic; + ls + +(* --- per-block field extraction ------------------------------------------- *) + +(* First WHOLE-TOKEN hit of [word] in [tokens] starting at-or-after + [from], REJECTING a hit whose immediately-following token (stripped) + is [reject_next] -- the "Gloria Patri" trap, see the module header. + Returns the hit's own index and whether the token immediately BEFORE + it (stripped) is "sine" (a negation). *) +let find_word tokens ~from ~word ~reject_next = + let n = Array.length tokens in + let rec go i = + if i >= n then None + else if strip_trailing_punct tokens.(i) = word then + let next_is_rejected = i + 1 < n && strip_trailing_punct tokens.(i + 1) = reject_next in + if next_is_rejected then go (i + 1) + else + let negated = i > 0 && strip_trailing_punct tokens.(i - 1) = "sine" in + Some (i, negated) + else go (i + 1) + in + go from + +(* [class_]: the roman-numeral token immediately followed by a token + starting "cl" (covers "cl.", "cl.,"), whole-token matched -- never a + substring search (the same discipline the LMS extractor's own BVM + numeral anchor uses, for the identical reason: "I" is a substring of + "II"/"III"/"IV"). Also detects the trailing "(Priv.)" two tokens later. *) +let extract_class tokens = + let n = Array.length tokens in + let is_class_numeral t = t = "I" || t = "II" || t = "III" || t = "IV" in + let rec go i = + if i + 1 >= n then None + else if is_class_numeral tokens.(i) && has_prefix ~prefix:"cl" tokens.(i + 1) then + let base = tokens.(i) ^ " cl." in + if i + 2 < n && strip_trailing_punct tokens.(i + 2) = "(Priv" then Some (base ^ " (Priv.)") else Some base + else go (i + 1) + in + go 0 + +let extract_title tokens = + let n = Array.length tokens in + let is_class_numeral t = t = "I" || t = "II" || t = "III" || t = "IV" in + let rec find i = if i + 1 >= n then n else if is_class_numeral tokens.(i) && has_prefix ~prefix:"cl" tokens.(i + 1) then i else find (i + 1) in + let stop = find 0 in + String.concat " " (Array.to_list (Array.sub tokens 0 stop)) + +(* Te Deum: bounded to the "Ad Mat." .. "Ad Laudes" span specifically + (both casings occur: "Ad MAT."/"Ad Mat."/"ad Mat.", "Ad LAUDES"/ + "Ad Laudes") -- NOT the whole block, because a day can separately + mention "Te Deum" in an unrelated INDULGENCE note (31 December: "Hodie + ad solemnem recitationem hymni Te Deum, indulgentia plenaria lucrari + potest" -- about gaining an indulgence for the New Year's Eve Te Deum + of thanksgiving, not about whether it is sung at that day's own + Matins) that a whole-block search would wrongly read as a positive hit. *) +let extract_te_deum full_text = + let find_ci needles start = + List.fold_left + (fun acc needle -> + match acc with + | Some _ -> acc + | None -> ( + match index_of (String.sub full_text start (String.length full_text - start)) ~sub:needle with + | Some i -> Some (start + i) + | None -> None)) + None needles + in + match find_ci [ "Ad Mat."; "Ad MAT."; "ad Mat." ] 0 with + | None -> None + | Some mat_start -> ( + let laudes_start = + match find_ci [ "Ad Laudes"; "Ad LAUDES"; "ad Laudes" ] mat_start with + | Some i -> i + | None -> String.length full_text + in + let span = String.sub full_text mat_start (laudes_start - mat_start) in + if contains span ~sub:"non dicitur Te Deum" then Some false + else if contains span ~sub:"Te Deum" then Some true + else None) + +(* Gloria/Credo/praef.: bounded to the FIRST Mass option only -- from the + token "Missa" to whichever comes first: "Vel" immediately followed by + "Missa" (a real second option), or a token starting "VESPER" (Vespers + info -- a PREFIX match, not one or two hardcoded exact spellings, + found necessary by tracing a real over-capture: this source uses at + least four surface forms depending on grammatical case and whether + pdftotext renders the Æ ligature as one glyph or splits it -- + "VESPERÆ", "VESPERAS", "VESPERA" (Ad VESPERA, rare) and "VESPERÆ" + with the ligature reproduced as a single non-ASCII codepoint an exact- + string match against the two ASCII spellings alone could never catch, + which let a whole day's own trailing Vespers/Compline prose leak into + [praef] uncaught until checked against the task brief's own worked + example day, 19 September), or the end of the block. *) +let extract_missa_fields tokens = + let n = Array.length tokens in + (* [Missa] (singular, 549 of the corpus's own occurrences of any "Miss-" + word) anchors 398 of the 400 real days; the two genuine exceptions + are Good Friday and Holy Saturday, which have no Mass at all in the + 1955-restored Holy Week (matching extract_lms_ordo.ml's own + identically-shaped finding for the LMS corpus). CHRISTMAS DAY is a + THIRD, found by tracing a real false-None result: its own rubric + reads "Hodie celebrantur tres Missae pr., Gloria, Credo..." ("today + three Masses are celebrated..."), using the PLURAL "Missae"/"Missæ" + (both spellings occur across the fixture's two Christmas Days) -- + [tokens.(i) = "Missa"] alone never matches it, silently returning + [None] for Gloria/Credo/praef on the single most doctrinally + unambiguous day in the whole calendar. Widened to accept "Missae"/ + "Missæ" too, guarded against the ONE real collision risk: "Hodie + prohibentur omnes Missae defunctorum..." (a Requiem-Mass-prohibition + notice, common at the end of many day-blocks, unrelated to the + day's own Mass) also contains "Missae" -- rejected here by checking + the immediately FOLLOWING token is not "defunctorum". *) + let missa_idx = + let rec go i = + if i >= n then None + else if (tokens.(i) = "Missa" || tokens.(i) = "Missae" || tokens.(i) = "Missæ") + && not (i + 1 < n && strip_trailing_punct tokens.(i + 1) = "defunctorum") + then Some i + else go (i + 1) + in + go 0 + in + match missa_idx with + | None -> (None, None, None) + | Some m -> + let end_idx = + let rec go i = + if i >= n then n + else if tokens.(i) = "Vel" && i + 1 < n && tokens.(i + 1) = "Missa" then i + else if has_prefix ~prefix:"VESPER" tokens.(i) then i + else go (i + 1) + in + go (m + 1) + in + let span = Array.sub tokens m (end_idx - m) in + let gloria = + match find_word span ~from:0 ~word:"Gloria" ~reject_next:"Patri" with + | Some (_, negated) -> Some (not negated) + | None -> None + in + let credo = + match find_word span ~from:0 ~word:"Credo" ~reject_next:"__never__" with + | Some (_, negated) -> Some (not negated) + | None -> None + in + let praef = + let sn = Array.length span in + let rec go i = if i >= sn then None else if strip_trailing_punct span.(i) = "praef" then Some i else go (i + 1) in + match go 0 with + | None -> None + | Some i -> + let rest = Array.to_list (Array.sub span (i + 1) (sn - i - 1)) in + if rest = [] then None else Some (String.concat " " rest) + in + (gloria, credo, praef) + +(* --- top level -------------------------------------------------------------- *) + +let () = + if Array.length Sys.argv <> 4 then + die "usage: extract_fiuv_ordo "; + let txt_path = Sys.argv.(1) in + let pdf_path = Sys.argv.(2) in + let dest = Sys.argv.(3) in + let all_lines = read_lines txt_path in + let arr = Array.of_list all_lines in + let n = Array.length arr in + let trimmed i = String.trim arr.(i) in + (* Anchor: the FIRST month-marker line carrying a parseable Roman year + -- established during characterisation to be line 47, "November + MMXXV". Search generically rather than hardcoding the line number, + so a re-extraction against a re-flowed pdftotext dump still finds it. *) + let anchor_idx, anchor_month, anchor_year = + let rec go i = + if i >= n then die "no month header with a parseable Roman-numeral year found (expected the book's own first header, e.g. \"November MMXXV\")" + else + let toks = split_ws (trimmed i) in + match toks with + | m :: y :: _ -> ( + match (month_index m, parse_roman y) with + | Some mi, Some yr when yr > 1000 -> (i, mi, yr) + | _ -> go (i + 1)) + | _ -> go (i + 1) + in + go 0 + in + let stop_idx = + let rec go i = if i >= n then n else if is_stop_tail_line (split_ws (trimmed i)) then i else go (i + 1) in + go (anchor_idx + 1) + in + Printf.printf "extract_fiuv_ordo: Ordo body lines %d..%d (of %d total), anchor %d/%d\n" anchor_idx stop_idx n + anchor_month anchor_year; + let cur_month = ref anchor_month and cur_year = ref anchor_year in + let blocks = ref [] in + let cur = ref None in + let flush () = match !cur with Some b -> blocks := b :: !blocks; cur := None | None -> () in + for i = anchor_idx + 1 to stop_idx - 1 do + let raw = trimmed i in + if raw = "" then () + else + let toks = split_ws raw in + if is_month_marker_line toks then ( + match toks with + | m :: _ -> ( + match month_index m with + | Some mi -> + if mi <> !cur_month then begin + if mi < !cur_month then incr cur_year; + cur_month := mi + end + | None -> ()) + | [] -> ()) + else + match is_day_start_line toks with + | Some day -> + flush (); + cur := Some { b_day = day; b_month = !cur_month; b_year = !cur_year; b_lines = toks } + | None -> ( + match !cur with + | None -> () + | Some b -> cur := Some { b with b_lines = b.b_lines @ strip_left_column toks }) + done; + flush (); + let blocks = List.rev !blocks in + Printf.printf "extract_fiuv_ordo: %d day-blocks parsed\n" (List.length blocks); + let rows = + List.map + (fun b -> + let date = + match Date.make ~year:b.b_year ~month:b.b_month ~day:b.b_day with + | Ok d -> d + | Error e -> die "%d/%d/%d: %s" b.b_year b.b_month b.b_day e + in + let tokens = Array.of_list b.b_lines in + (* [b_lines] tokens 0 is the day's own leading "." marker -- + dropped before field extraction, kept for nothing (the day + number is already known from [b_day]). *) + let content = if Array.length tokens > 0 then Array.sub tokens 1 (Array.length tokens - 1) else tokens in + let class_ = extract_class content in + let title = extract_title content in + let full_text = String.concat " " (Array.to_list content) in + let te_deum = extract_te_deum full_text in + let gloria, credo, praef = extract_missa_fields content in + { date = Date.to_iso8601 date; class_; title; te_deum; gloria; credo; praef }) + blocks + in + let missing_class = List.filter (fun r -> r.class_ = None) rows in + let missing_gloria = List.filter (fun r -> r.gloria = None) rows in + let missing_credo = List.filter (fun r -> r.credo = None) rows in + let missing_te_deum = List.filter (fun r -> r.te_deum = None) rows in + if missing_class <> [] then + Printf.printf "extract_fiuv_ordo: WARNING %d rows with no class found: %s\n" (List.length missing_class) + (String.concat ", " (List.map (fun r -> r.date) missing_class)); + Printf.printf + "extract_fiuv_ordo: %d rows; %d with no Gloria found; %d with no Credo found; %d with no Te Deum found\n" + (List.length rows) (List.length missing_gloria) (List.length missing_credo) (List.length missing_te_deum); + (* CHARACTERISATION, Step C of the task brief, non-negotiable: probed + BEFORE trusting a single row of this fixture, and RE-VERIFIED here + against this run's own [rows] -- a failed probe is a hard [die], the + same self-verifying discipline extract_lms_ordo.ml already uses, + never a printed claim resting on a one-off manual check that could + silently rot on a re-extraction. Every date/expectation pair below + was confirmed directly against the raw pdftotext dump before being + encoded here. *) + let creed_of_date d = List.find_map (fun r -> if String.equal r.date d then r.credo else None) rows in + let probes = + [ ("2025-11-30", true, "Advent Sunday, I class, RG 475(a)"); + ("2025-12-01", false, "ordinary Advent feria, III class, RG 476(b)/(d)"); + ("2025-12-26", true, "St Stephen, II class, inside the Nativity octave, RG 475(d)"); + ("2026-08-10", false, "St Laurence, II class martyr, no Lord/BVM/apostle clause applies, RG 476(b)"); + ("2026-08-15", true, "the Assumption, I class, RG 475(b)") ] + in + List.iter + (fun (d, expected, desc) -> + match creed_of_date d with + | Some got when Bool.equal got expected -> () + | Some got -> die "characterisation probe FAILED: %s (%s) -- expected creed=%b, extracted creed=%b" d desc expected got + | None -> die "characterisation probe FAILED: %s (%s) -- no row extracted for this date at all" d desc) + probes; + Printf.printf "extract_fiuv_ordo: all %d characterisation probes confirmed\n" (List.length probes); + let probe_lines = + String.concat "\n" + (List.map + (fun (d, expected, desc) -> Printf.sprintf "; %s (%s) -> %s" d desc (if expected then "TRUE" else "FALSE")) + probes) + in + let sha256_of_file path = + let cmd = Printf.sprintf "sha256sum %s" (Filename.quote path) in + let ic = Unix.open_process_in cmd in + let line = try input_line ic with End_of_file -> die "sha256sum produced no output for %s" path in + (match Unix.close_process_in ic with Unix.WEXITED 0 -> () | _ -> die "sha256sum failed for %s" path); + match String.index_opt line ' ' with Some i -> String.sub line 0 i | None -> die "unexpected sha256sum output: %S" line + in + let today () = + let tm = Unix.gmtime (Unix.time ()) in + Printf.sprintf "%04d-%02d-%02d" (tm.Unix.tm_year + 1900) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday + in + let pdf_sha = sha256_of_file pdf_path in + let pdf_base = Filename.basename pdf_path in + let gloria_true = List.length (List.filter (fun r -> r.gloria = Some true) rows) in + let gloria_false = List.length (List.filter (fun r -> r.gloria = Some false) rows) in + let credo_true = List.length (List.filter (fun r -> r.credo = Some true) rows) in + let credo_false = List.length (List.filter (fun r -> r.credo = Some false) rows) in + let te_deum_true = List.length (List.filter (fun r -> r.te_deum = Some true) rows) in + let te_deum_false = List.length (List.filter (fun r -> r.te_deum = Some false) rows) in + let header = + Printf.sprintf + {|; %s -- Witnesses task (2026-08-22-colitur- +; celebrant-rubrics-phase1)'s SEVENTH validation layer, and the first +; UNIVERSAL (non-diocesan), SECOND-COMPILER witness: the FIUV (Foederatio +; Internationalis Una Voce) Ordo, compiled independently of the Latin Mass +; Society's own three editions (test/test_lms_ordo.ml) -- see +; docs/research/ordo/PROVENANCE-ordo-corpus.md for the full four-reasons +; account of why this source is the more valuable of the two newly- +; acquired ones. +; +; Generator: tools/extract_fiuv_ordo.ml -- do not hand-edit; re-run +; against a fresh pdftotext dump and commit the diff instead. +; +; Source: "Ordo Divini Officii recitandi sacrique peragendi secundum +; antiquam Ritus Romani formam pro anno Domini 2026", Foederatio +; Internationalis Una Voce, compiled by Joseph Shaw (Praefatio signed +; "Joseph Shaw, President", Feast of the Nativity of Our Lady [8 Sept] +; 2025) -- title page and Praefatio, verified directly against the PDF's +; own extracted text. 2025 is stated as the Federation's own 60th +; anniversary year. +; PDF metadata: Creator "TeX", Producer "pdfTeX-1.40.22", CreationDate +; 2025-11-08, 128 pages. +; URL: identified via web search as +; https://lms.org.uk/sites/default/files/u5374/fiuv_ordo_2025-2026_1.1_a5_format.pdf +; (hosted by the Latin Mass Society's own site alongside its own three +; editions -- Joseph Shaw is both FIUV President and LMS Chairman, which +; plausibly also explains why this PDF's own trailing malformed entry +; (see COVERAGE below) is structurally identical to the LMS PDFs' own, +; despite the two being compiled by different people); NOT independently +; re-downloaded and byte-compared in this session -- recorded honestly +; rather than presented as verified, the same discipline the LMS +; fixtures' own headers use. +; The local PDF (docs/research/ordo/%s) is gitignored (CLAUDE.md: "docs/ +; is gitignored"), so this header, not git, is this fixture's only record +; of where it came from. +; SHA-256 of docs/research/ordo/%s: %s +; Extracted (UTC): %s +; Exact commands: +; pdftotext -layout docs/research/ordo/%s /tmp/fiuv.txt +; dune exec tools/extract_fiuv_ordo.exe -- /tmp/fiuv.txt \ +; docs/research/ordo/%s %s +; +; COVERAGE: %d day-rows, %s through %s. Starts at the book's own first +; real content line ("November MMXXV", the FIRST month header found with +; a parseable Roman-numeral year -- used as this parser's sole date +; anchor, see the tool's own header on why no LATER header's year is ever +; read, the second one being a publisher typo, "December MMXV" for 2025). +; Stops before a malformed trailing entry, structurally the SAME artefact +; found in all three LMS editions (a stray, mislabelled duplicate of the +; fixture's own already-extracted 1 January row, headed "1st Jan / 2025." +; -- see extract_lms_ordo.ml's own COVERAGE section for the fuller +; account of this shared publisher-side quirk). +; +; CHARACTERISATION FINDINGS (non-negotiable per the task brief -- the +; extraordinaryform.org Ordo silently omitted St Lawrence's vigil on +; EVERY date it covered, which nearly produced a false corroboration +; during the RG 33 work; this Ordo was probed with the same discipline +; before a single divergence was adjudicated): +; +; 1. UNIVERSAL, not diocesan: unlike the three LMS editions (which had to +; exclude diocesan variants from every comparison, quantified in each +; of their own fixture headers), this Ordo carries ONE block per day, +; always. There is no [has_diocesan_variant] field in this fixture's +; own [row] at all -- there is nothing to exclude. +; +; 2. OPPOSITE-PREDICTION PROBES against Rite_ef.Rubrics_ef.creed (RG +; 475-476), RE-CHECKED BY THIS TOOL RUN against its own extracted +; [rows] before this header was even written -- a failed probe is a +; hard [die], never a printed claim: +%s +; All %d predictions confirmed, both directions -- this source is +; discriminating, not a constant, on the Creed. +; +; 3. THE SUBSTRING TRAP this parser defends against, found live in this +; corpus: "Gloria" is also the first word of "Gloria Patri" (the psalm +; doxology), which can appear INSIDE the very Mass clause being +; scanned (Good Friday, 3 April 2026: "Missa pr., (omittuntur ps. +; Iudica me et Gloria Patri), Gloria, sine Credo, praef. comm." -- the +; real, standalone Gloria mention follows immediately after). See +; [find_word]'s own citation. +; +; 4. RAW SUBSTRING COUNTS measured against this session's own pdftotext +; dump, for comparison against the task brief's own figures (328 +; Gloria / 132 sine Gloria / 119 Credo / 260 sine Credo, 262 Te Deum): +; "sine Gloria" 132 (EXACT match), "sine Credo" 260 (EXACT match), raw +; "Te Deum" substring 262 (EXACT match, includes negated occurrences +; as substring hits -- 42 of them are "non dicitur Te Deum"). Raw +; "Gloria"/"Credo" substring totals (494/411) do NOT match the brief's +; implied positive totals (328/119) even after subtracting the 25 +; "Gloria Patri" occurrences (469, still 9 over) -- not chased further +; here; this extractor's own token-scoped, Missa-clause-bounded counts +; below are what this fixture actually asserts, not a forced match to +; the brief's approximate figures. +; +; MEASURED DISTRIBUTION (this extraction, not the brief's figures): Gloria +; true=%d false=%d unresolved=%d; Credo true=%d false=%d unresolved=%d; +; Te Deum true=%d false=%d unresolved=%d. +|} + dest pdf_base pdf_base pdf_sha (today ()) pdf_base pdf_base dest (List.length rows) + (match rows with r :: _ -> r.date | [] -> "?") + (match List.rev rows with r :: _ -> r.date | [] -> "?") + probe_lines (List.length probes) gloria_true gloria_false (List.length missing_gloria) credo_true credo_false + (List.length missing_credo) te_deum_true te_deum_false (List.length missing_te_deum) + in + let body = Sexplib.Sexp.to_string_hum ~indent:2 (sexp_of_list sexp_of_row rows) in + let oc = open_out dest in + Fun.protect + ~finally:(fun () -> close_out_noerr oc) + (fun () -> + output_string oc header; + output_string oc body; + output_string oc "\n"); + Printf.printf "extract_fiuv_ordo: wrote %d rows to %s\n" (List.length rows) dest -- cgit v1.3 From 0d061abc7cc5cdc51ded6ee69e00e187813f5e1b Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Mon, 24 Aug 2026 16:16:59 +0200 Subject: feat(ordo): wire the extraordinaryform.org preface column in as a third witness Extends the preface comparison (RG 482-499) with a third, independent publisher, extraordinaryform.org's three annual Ordo editions (2024-2025, 2025-2026, 2026-2027), previously declined for two reasons that are now resolved: - "Advent" is not a preface: RG 494(b) grants the Trinity preface on every Advent SUNDAY, RG 498 the residual Common on every Advent FERIA; this source's own "Advent" label covers both indiscriminately (confirmed live on all 11 non-impeded Advent Sundays in the corpus). Classified by the day's own civil weekday, not a static table. - The known Vigil-of-St-Lawrence gap is reconfirmed, with a nuance not present in the earlier audits: colitur's own RG33-third-trigger now omits the vigil in some years too, so the corpus's gap and colitur's answer coincide in 2025 (a full match, not a coincidence) while 2027 still shows the classic identity-wrong-but-preface-invisible shape. Re-derives the known menu-trap office filter (Requiem-skip, "and "-chain) against the live JSON and finds a second, general pattern: "Saturday of Our Lady" (RG78's BVM Saturday Office), whenever listed, is unconditionally the office -- checked exhaustively across all 38 instances in the corpus, zero counter-examples. A third, generic "absorption" rule was deliberately not built: it would resolve 2 of the 11 residual divergences but wrongly misfires on a structurally identical but semantically different shape (an optional Rogation-day Mass option). The JSON's own extraction carries a genuine classifier gap: parse_ordo.py's hardcoded PREFACES set omits "Christ the King", misfiling it into comms; recovered in the generator, not left blank. 11 of 1088 comparable rows diverge, resolving to 7 adjudicated root causes (E1-E7): two Commemoration_only Marian titles reduced to commemorations (Mt Carmel, Ransom), two genuine sanctoral data gaps cross-confirmed absent by the FIUV/LMS witnesses (Miraculous Medal, St John before the Latin Gate), two single-witnessed efdotorg outliers against FIUV/LMS agreement (St Michael's Dedication, All Saints on a Sunday), and one isolated source labelling slip. Mutation-tested: corrupting the RG495 BVM-Saturday clause reddens 9 tests across this new layer and both existing Ordo witnesses. Per-edition agreement: 358/363 (2024-2025), 358/363 (2025-2026), 361/362 (2026-2027). --- data/ef/expected-divergences-efdotorg.sexp | 175 +++++++++++++ test/dune | 4 + test/fixtures/efdotorg-ordo-2024-2025.sexp | 398 ++++++++++++++++++++++++++++ test/fixtures/efdotorg-ordo-2025-2026.sexp | 398 ++++++++++++++++++++++++++++ test/fixtures/efdotorg-ordo-2026-2027.sexp | 398 ++++++++++++++++++++++++++++ test/test_colitur.ml | 2 + test/test_efdotorg_ordo.ml | 403 +++++++++++++++++++++++++++++ tools/extract_efdotorg_ordo.py | 336 ++++++++++++++++++++++++ 8 files changed, 2114 insertions(+) create mode 100644 data/ef/expected-divergences-efdotorg.sexp create mode 100644 test/fixtures/efdotorg-ordo-2024-2025.sexp create mode 100644 test/fixtures/efdotorg-ordo-2025-2026.sexp create mode 100644 test/fixtures/efdotorg-ordo-2026-2027.sexp create mode 100644 test/test_efdotorg_ordo.ml create mode 100644 tools/extract_efdotorg_ordo.py (limited to 'test/dune') diff --git a/data/ef/expected-divergences-efdotorg.sexp b/data/ef/expected-divergences-efdotorg.sexp new file mode 100644 index 0000000..7c9eea7 --- /dev/null +++ b/data/ef/expected-divergences-efdotorg.sexp @@ -0,0 +1,175 @@ +; data/ef/expected-divergences-efdotorg.sexp -- efdotorg-preface task +; (2026-08-24-colitur-celebrant-rubrics-phase1)'s cited allow-list for the +; extraordinaryform.org Ordo preface comparison (test/test_efdotorg_ordo.ml), +; three editions (2024-2025, 2025-2026, 2026-2027), 1091 day-rows total. +; +; A SEPARATE file from data/ef/expected-divergences.sexp (lectio), +; data/ef/expected-divergences-missalemeum.sexp (missalemeum/Divinum- +; Officium lineage), data/ef/expected-divergences-lms.sexp (Latin Mass +; Society, England & Wales, Peter Day-Milne) and +; data/ef/expected-divergences-fiuv.sexp (FIUV, universal, Joseph Shaw): +; this is a FIFTH lineage, a third distinct publisher/compiler. +; +; Two things resolved BEFORE any divergence below was adjudicated, per the +; task's own "characterise first" discipline -- neither is an allow-list +; entry, because neither is a disagreement: +; - "Advent" is not a static mapping (RG 494(b) grants Trinity on every +; Advent SUNDAY, RG 498 the residual Common on every Advent FERIA) -- +; see tools/extract_efdotorg_ordo.py's own header, finding 3, and +; test_efdotorg_ordo.ml's own [classify_praef]. Zero mismatches. +; - The "Christ the King" classifier gap in parse_ordo.py's own hardcoded +; PREFACES set is RECOVERED in the fixture generator (finding 2), not +; allow-listed. +; +; Of 1088 comparable rows (1091 minus Good Friday x3 minus the one source +; gap, 2027-03-03), 11 diverge, all found ONLY after building +; tools/extract_efdotorg_ordo.py's own Rule A (finding 6: "Saturday of Our +; Lady", whenever listed, IS the office, checked exhaustively across all +; 38 instances in the corpus) -- without Rule A the apparent divergence +; count was far higher (dominated by the BVM-Saturday-Office population), +; which is why Rule A belongs in the generator, not the allow-list: it is +; a general, well-evidenced STRUCTURAL rule, not a per-date adjudication. +; +; The 11 residual rows resolve to exactly SEVEN root causes, E1-E7 below. + +; E1 -- colitur correct. "Our Lady of Mt. Carmel" (16 July) is +; `Commemoration_only` status in data/ef/sanctoral.sexp (confirmed +; directly: `grep our-lady-of-mt-carmel data/ef/sanctoral.sexp`, and +; already cited elsewhere in this codebase -- +; lib/rites/rite_ef/precedence_ef.ml's own `marian_slugs`/RG112(d) +; citation names it explicitly), so it can NEVER be the day's own +; OBSERVED office in colitur's model -- only ever a commemoration. This +; source nonetheless lists it as a standalone Mass option (the same +; "priest's menu, not office order" convention +; .superpowers/ordo-class-report.md already established for the votive +; Requiem population), with the day's real office (an ordinary feria/ +; resumed Sunday) listed alongside, its own `comms` field naming Mt +; Carmel as what IT commemorates -- exactly matching colitur's own +; `+our-lady-of-mt-carmel` commemoration on all three dates. Fires once +; per edition, unchanged: 2025-07-16, 2026-07-16, 2027-07-16. +((id E1) (citation "RG91 table (Commemoration_only has no table row); data/ef/sanctoral.sexp") + (verdict colitur) + (note "Our Lady of Mt Carmel (16 July) is Commemoration_only-status data, never the observed office; the corpus lists it as an optional votive Mass regardless. Fires 2025-07-16, 2026-07-16, 2027-07-16 (one row per edition).") + (expected_rows 1)) + + ; E2 -- colitur correct, the SAME shape as E1. "Our Lady of Ransom" (24 + ; September) is also `Commemoration_only` status + ; (data/ef/sanctoral.sexp), and CLAUDE.md's own record already notes it + ; "forces the September Ember Saturday every time, by construction" -- + ; confirmed live here: the true office on every instance checked (2025, + ; 2027) is the September Ember day itself (Ember Wednesday/Friday), with + ; Ransom correctly reduced to ITS OWN commemoration -- matching colitur + ; exactly and producing NO divergence those two years. Only 2026-09-24 + ; diverges, because that entry happens to be listed first in the + ; option list with an empty comms field of its own while the true + ; office (the Ember Saturday) is a separate, later entry -- the same + ; "named votive Mass listed ahead of the real office" shape as E1, just + ; without a Saturday-of-Our-Lady-style structural marker to catch it + ; generically. + ((id E2) (citation "RG91 table (Commemoration_only has no table row); data/ef/sanctoral.sexp; September Ember Saturday, RG26") + (verdict colitur) + (note "Our Lady of Ransom (24 September) is Commemoration_only-status data; the September Ember Saturday always wins the day outright. Fires once, 2026-09-24 (2025 and 2027's own 24 September already match colitur without needing this entry -- the Ember day is listed first there).") + (expected_rows 1)) + + ; E3 -- colitur correct (a genuine sanctoral DATA GAP, not a rule bug). + ; "Our Lady of the Miraculous Medal" (27 November) does not appear + ; anywhere in data/ef/sanctoral.sexp (`grep -i medal` / `grep -i + ; miraculous`: zero hits) -- CROSS-CONFIRMED independently by BOTH + ; already-validated witnesses on the identical civil date: the FIUV + ; Ordo (test/fixtures/fiuv-ordo-2025-2026.sexp, 2025-11-27: plain + ; "IV cl." feria, "comm.") and the LMS Ordo (both the 2023-2024 and + ; 2024-2025 editions, 2024-11-27/2025-11-27: "Mass of 24th & Last + ; Sunday After Pentecost", "Common Pr") show no such feast at all. Not a + ; feast of the UNIVERSAL 1962 General Roman Calendar (the Miraculous + ; Medal apparition, 1830, is a devotional/particular-calendar + ; commemoration in some places, never added to the GENERAL calendar) -- + ; worth flagging alongside CLAUDE.md's own existing list of missing + ; sanctoral entries (Agnes secundo, Boniface 14 May, Evaristus, + ; Theodore) as a FIFTH candidate, but NOT fixed here: out of this task's + ; own scope (preface-comparison wiring, not sanctoral completeness), and + ; unlike those four, this one is independently corroborated as + ; genuinely absent from the UNIVERSAL calendar, not merely missing from + ; colitur's own bootstrap. Fires 2025-11-27, 2026-11-27 (one row per + ; edition where it recurs; 2027-11-27 does not reach this entry at all). + ((id E3) (citation "data/ef/sanctoral.sexp (no entry); cross-confirmed absent in both the FIUV and LMS Ordos on the same civil date") + (verdict colitur) + (note "Our Lady of the Miraculous Medal (27 November) is genuinely absent from the universal 1962 calendar colitur models -- not merely a colitur bootstrap gap. Fires 2025-11-27, 2026-11-27.") + (expected_rows 1)) + + ; E4 -- colitur correct (a second genuine sanctoral DATA GAP). "St. John + ; before the Latin Gate" (6 May) is likewise absent from + ; data/ef/sanctoral.sexp entirely -- CROSS-CONFIRMED by the LMS Ordo on + ; the identical civil date in TWO separate editions + ; (test/fixtures/lms-ordo-2023-2024.sexp, 2024-05-06, and + ; lms-ordo-2024-2025.sexp, 2025-05-06): both show only "Mass of Nth + ; Sunday after Easter", "Pr of Easter" -- matching colitur's own answer + ; exactly, with no trace of this feast. A genuine SIXTH candidate for + ; CLAUDE.md's known-missing-sanctoral-entries list, not fixed here for + ; the same out-of-scope reason as E3. Fires 2025-05-06, 2026-05-06; + ; 2027-05-06 does not diverge (that date is a Saturday, and Rule A's own + ; "Saturday of Our Lady" preference resolves it correctly without ever + ; needing to know this feast is missing). + ((id E4) (citation "data/ef/sanctoral.sexp (no entry); cross-confirmed absent in the LMS Ordo (2024-05-06 and 2025-05-06) on the same civil date") + (verdict colitur) + (note "St John before the Latin Gate (6 May) is genuinely absent from the universal 1962 calendar colitur models. Fires 2025-05-06, 2026-05-06 (2027-05-06 is a Saturday and is resolved by Rule A instead).") + (expected_rows 1)) + + ; E5 -- colitur correct, extraordinaryform.org is the OUTLIER. St + ; Michael's Dedication (29 September) has no dedicated preface among RG + ; 484-497's fourteen, so RG 482's chain falls through to RG 498's Common + ; -- and this is DOUBLY corroborated already, in + ; lib/rites/rite_ef/rubrics_ef.ml's own [preface] header: the FIUV Ordo + ; reads "comm. vel de Angelis" and the LMS Ordo reads "Pr of the Angels + ; or Common Pr" for this exact feast ("of the Angels" being one of the + ; several non-RG-482 "extra" preface names both those sources are + ; already documented to carry, alongside the genuine Common answer). + ; extraordinaryform.org's bare "Holy Trinity" is a single, uncorroborated + ; reading against two independent, already-validated witnesses that both + ; agree with colitur. Fires once, 2025-09-29 (the only occurrence in + ; this corpus where 29 September is NOT itself a Sunday reaching RG + ; 494(b) by a different route -- see E6 for that shape). + ((id E5) (citation "RG482/RG498; lib/rites/rite_ef/rubrics_ef.ml's own [preface], corroborated by both the FIUV and LMS Ordos on this exact feast") + (verdict colitur) + (note "St Michael's Dedication (29 September 2025) has no dedicated preface; colitur's Common answer is independently confirmed by both the FIUV and LMS Ordos (\"... or Common Pr\"/\"comm. vel ...\"). extraordinaryform.org's bare \"Holy Trinity\" is single-witnessed and outvoted.") + (expected_rows 1)) + + ; E6 -- colitur correct, extraordinaryform.org is the OUTLIER, the SAME + ; shape as E5 but for RG 494(b)'s own Sunday grant rather than RG 498. + ; All Saints falls on a Sunday in 2026 (confirmed: the corpus's own + ; entry carries `comms: ["Twenty-third Sunday after Pentecost"]`, + ; matching colitur's own `+ef-time-after-pentecost-sunday-23`), so RG + ; 494(b) ("in omnibus dominicis II classis... praefatio de Ss.ma + ; Trinitate") grants the TRINITY preface -- independently confirmed by + ; the FIUV Ordo on the SAME civil date (test/fixtures/fiuv-ordo-2025- + ; 2026.sexp, 2026-11-01: "Trinit. vel de Omnibus Sanctis et Patronis.", + ; Trinity again being the genuine RG-482 answer and "of All Saints and + ; Patrons" the same kind of non-RG-482 extra E5 already documents). + ; extraordinaryform.org's bare "Common" is single-witnessed here too. + ; Fires once, 2026-11-01 (the only Sunday occurrence of All Saints this + ; corpus's own window covers). + ((id E6) (citation "RG494(b); test/fixtures/fiuv-ordo-2025-2026.sexp, 2026-11-01 (\"Trinit. vel de Omnibus Sanctis...\")") + (verdict colitur) + (note "All Saints falls on a Sunday in 2026, so RG494(b) grants the Trinity preface -- independently confirmed by the FIUV Ordo on the same date. extraordinaryform.org's bare \"Common\" is single-witnessed and outvoted.") + (expected_rows 1)) + + ; E7 -- a single-row SOURCE DATA INCONSISTENCY, not a rule question. + ; 2025-11-29 is a "Saturday of Our Lady" day like the other 37 in this + ; corpus (Rule A correctly selects it as the office, matching colitur's + ; own BVM answer on office IDENTITY), but this ONE row's own `preface` + ; field reads "Common" where every other "Saturday of Our Lady" entry + ; in the whole corpus reads "BVM" (checked directly: 37 of 38 read + ; "BVM", this is the sole exception) -- an isolated compiler slip in the + ; source, not a pattern. + ((id E7) (citation "internal corpus consistency check: 37 of 38 \"Saturday of Our Lady\" entries read \"BVM\"; this is the sole exception") + (verdict colitur) + (note "2025-11-29's own \"Saturday of Our Lady\" entry reads \"Common\" where every other instance in the corpus (37 of 38) reads \"BVM\" -- an isolated source labelling slip, not a rule disagreement.") + (expected_rows 1)) + +; Per-edition agreement, reported separately, never merged (each row count +; is 364 total minus that edition's own no-praef coverage bucket -- Good +; Friday plus, for 2026-2027 only, the known 2027-03-03 source gap): +; 2024-2025: 358/363 (E1 x1, E3 x1, E4 x1, E5 x1, E7 x1) +; 2025-2026: 358/363 (E1 x1, E2 x1, E3 x1, E4 x1, E6 x1) +; 2026-2027: 361/362 (E1 x1) +; Full account: .superpowers/sdd/2026-08-21-colitur-celebrant-rubrics- +; phase1/efdotorg-preface-report.md. diff --git a/test/dune b/test/dune index 374fa8f..840f0d1 100644 --- a/test/dune +++ b/test/dune @@ -11,6 +11,7 @@ ../data/ef/expected-divergences-missalemeum.sexp ../data/ef/expected-divergences-lms.sexp ../data/ef/expected-divergences-fiuv.sexp + ../data/ef/expected-divergences-efdotorg.sexp ../data/ef/lectionary.sexp ../data/ef/commons.sexp ../data/ef/examples/diocesan-example.sexp @@ -22,6 +23,9 @@ fixtures/lms-ordo-2024-2025.sexp fixtures/lms-ordo-2025-2026.sexp fixtures/fiuv-ordo-2025-2026.sexp + fixtures/efdotorg-ordo-2024-2025.sexp + fixtures/efdotorg-ordo-2025-2026.sexp + fixtures/efdotorg-ordo-2026-2027.sexp ../templates/ef/ordo.tex ../templates/ef/ordo.ms ../templates/ef/ordo.html diff --git a/test/fixtures/efdotorg-ordo-2024-2025.sexp b/test/fixtures/efdotorg-ordo-2024-2025.sexp new file mode 100644 index 0000000..be69daa --- /dev/null +++ b/test/fixtures/efdotorg-ordo-2024-2025.sexp @@ -0,0 +1,398 @@ +; test/fixtures/efdotorg-ordo-2024-2025.sexp -- efdotorg-preface task +; (2026-08-24-colitur-celebrant-rubrics-phase1): the THIRD independent +; preface witness (RG 482-499), extraordinaryform.org's 2024-2025 Ordo, +; extracted from the already-parsed, fidelity-audited corpus +; docs/research/ordo/ordo-2024-2027.json (SHA-256 18a417fb8b30dc438c3f12f64b43dfdf5e2e9313857f2eccd04bf02072ca7e3c) rather than +; re-parsed from the PDF -- see tools/extract_efdotorg_ordo.py's own +; header for the full characterisation this fixture rests on (the menu- +; trap office filter, the Christ-the-King classifier-gap recovery, why +; "Advent" is not baked into a single mapping here, the known Vigil-of- +; St-Lawrence gap, and the two source-PDF defects that turn out not to +; touch this field). +; +; Generator: tools/extract_efdotorg_ordo.py -- do not hand-edit; re-run +; against the same JSON and commit the diff instead. +; python3 tools/extract_efdotorg_ordo.py docs/research/ordo/ordo-2024-2027.json test/fixtures +; +; Source PDF (gitignored, CLAUDE.md: "docs/ is gitignored", see +; docs/research/ordo/SHA256SUMS for its own hash): 2024-2025Ordo.pdf, +; extraordinaryform.org. +; +; COVERAGE: 364 day-rows, 2024-12-01..2025-11-29 (this edition's own civil-date +; span, re-derived from the JSON's own seams -- see the generator's own +; EDITIONS comment). 0 row(s) are a genuine SOURCE GAP (2027-03-03 +; only, a PDF row-drop, ordo-fidelity-report.md) -- mass/cls/colour/praef +; all absent, the same shape a structurally blank day (Good Friday) uses. +; 1 further row(s) have mass/cls/colour but no praef at all +; (Good Friday -- RG 28, no Mass in the 1955-restored Holy Week). +; +; Each row's `praef` is RAW TEXT from the day's own OFFICE (after the +; menu-trap filter, with the Christ-the-King recovery already applied) -- +; classified against {!Colitur_kernel.Preface.t} by +; test/test_efdotorg_ordo.ml, not here. +( + ((date 2024-12-01) (mass ("First Sunday of Advent")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-02) (mass ("St. Bibiana, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Advent"))) + ((date 2024-12-03) (mass ("St. Francis Xavier, Confessor")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2024-12-04) (mass ("St. Peter Chrysologus, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2024-12-05) (mass ("Feria \226\128\147 First Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-06) (mass ("St. Nicholas, Confessor & Bishop")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2024-12-07) (mass ("St. Ambrose, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2024-12-08) (mass ("Immaculate Conception")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2024-12-09) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-10) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-11) (mass ("St. Damasus I, Pope")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2024-12-12) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-13) (mass ("St. Lucy, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Advent"))) + ((date 2024-12-14) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-15) (mass ("Third Sunday of Advent \226\128\147 Gaudete")) (cls (1)) (colour ("rose")) (praef ("Advent"))) + ((date 2024-12-16) (mass ("St. Eusebius, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Advent"))) + ((date 2024-12-17) (mass ("Feria \226\128\147 Third Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-18) (mass ("Ember Wednesday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-19) (mass ("Feria \226\128\147 Third Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-20) (mass ("Ember Friday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-21) (mass ("St. Thomas, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2024-12-22) (mass ("Fourth Sunday of Advent")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-23) (mass ("Feria - Fourth Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-24) (mass ("Vigil of Nativity of Our Lord")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2024-12-25) (mass ("Nativity of Our Lord - Mass at Midnight")) (cls (1)) (colour ("white")) (praef ("Nativity"))) + ((date 2024-12-26) (mass ("Day II in the Octave, St. Stephen, Protomartyr")) (cls (2)) (colour ("red")) (praef ("Nativity"))) + ((date 2024-12-27) (mass ("Day III in the Octave, St. John, Apostle & Evangelist")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2024-12-28) (mass ("Day IV in the Octave, Holy Innocents")) (cls (2)) (colour ("red")) (praef ("Nativity"))) + ((date 2024-12-29) (mass ("Sunday within the Octave of Christmas")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2024-12-30) (mass ("Day VI in the Octave")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2024-12-31) (mass ("Day VII in the Octave")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-01-01) (mass ("Day VIII in the Octave, Circumcision of Our Lord")) (cls (1)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-01-02) (mass ("Feria in Christmastide")) (cls (4)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-01-03) (mass ("Feria in Christmastide")) (cls (4)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-01-04) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-01-05) (mass ("Holy Name of Jesus")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-01-06) (mass ("Epiphany of Our Lord")) (cls (1)) (colour ("white")) (praef ("Epiphany"))) + ((date 2025-01-07) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2025-01-08) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2025-01-09) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2025-01-10) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2025-01-11) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-01-12) (mass ("Holy Family")) (cls (2)) (colour ("white")) (praef ("Epiphany"))) + ((date 2025-01-13) (mass ("Baptism of Our Lord")) (cls (2)) (colour ("white")) (praef ("Epiphany"))) + ((date 2025-01-14) (mass ("St. Hilary, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-01-15) (mass ("St. Paul, First Hermit, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-01-16) (mass ("St. Marcellus I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-01-17) (mass ("St. Anthony, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-01-18) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-01-19) (mass ("Second Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-01-20) (mass ("Ss. Fabian, Pope, & Sebastian, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-01-21) (mass ("St. Agnes, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-01-22) (mass ("Ss. Vincent & Anastasius, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-01-23) (mass ("St. Raymund of Pennafort, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-01-24) (mass ("St. Timothy, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-01-25) (mass ("Conversion of St. Paul, Apostle")) (cls (3)) (colour ("white")) (praef ("Apostles"))) + ((date 2025-01-26) (mass ("Third Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-01-27) (mass ("St. John Chrysostom, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-01-28) (mass ("St. Peter Nolasco, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-01-29) (mass ("St. Francis de Sales, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-01-30) (mass ("St. Martina, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-01-31) (mass ("St. John Bosco, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-02-01) (mass ("St. Ignatius of Antioch, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-02-02) (mass ("and Purification of the BVM")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-02-03) (mass ("St. Blase, Bishop & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-02-04) (mass ("St. Andrew Corsini, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-02-05) (mass ("St. Agatha, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-02-06) (mass ("St. Titus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-02-07) (mass ("St. Romuald, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-02-08) (mass ("St. John of Matha, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-02-09) (mass ("Fifth Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-02-10) (mass ("St. Scholastica, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-02-11) (mass ("Our Lady of Lourdes")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2025-02-12) (mass ("Seven Holy Founders, Confessors")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-02-13) (mass ("Feria \226\128\147 Fifth Sunday after Epiphany")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-02-14) (mass ("St. Valentine, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-02-15) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-02-16) (mass ("Septuagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2025-02-17) (mass ("Feria - Septuagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2025-02-18) (mass ("St. Simeon, Bishop & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-02-19) (mass ("Feria - Septuagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2025-02-20) (mass ("Feria - Septuagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2025-02-21) (mass ("Feria - Septuagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2025-02-22) (mass ("Chair of St. Peter")) (cls (2)) (colour ("white")) (praef ("Apostles"))) + ((date 2025-02-23) (mass ("Sexagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2025-02-24) (mass ("St. Matthias, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2025-02-25) (mass ("Feria - Sexagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2025-02-26) (mass ("Feria - Sexagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2025-02-27) (mass ("St. Gabriel of Our Lady of Sorrows")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-02-28) (mass ("Feria - Sexagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2025-03-01) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-03-02) (mass ("Quinquagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2025-03-03) (mass ("Feria - Quinquagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2025-03-04) (mass ("St. Casimir, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-03-05) (mass ("and Ash Wednesday")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-06) (mass ("Thursday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-07) (mass ("Friday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-08) (mass ("Saturday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-09) (mass ("1st Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-10) (mass ("Monday after the 1st Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-11) (mass ("Tuesday after the 1st Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-12) (mass ("Ember Wednesday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-13) (mass ("Thursday after the 1st Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-14) (mass ("Ember Friday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-15) (mass ("Ember Saturday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-16) (mass ("2nd Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-17) (mass ("Monday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-18) (mass ("Tuesday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-19) (mass ("St. Joseph, Spouse of the BVM")) (cls (1)) (colour ("white")) (praef ("St. Joseph"))) + ((date 2025-03-20) (mass ("Thursday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-21) (mass ("Friday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-22) (mass ("Saturday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-23) (mass ("3rd Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-24) (mass ("Monday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-25) (mass ("Annunciation of the BVM")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2025-03-26) (mass ("Wednesday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-27) (mass ("Thursday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-28) (mass ("Friday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-29) (mass ("Saturday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-03-30) (mass ("4th Sunday of Lent \226\128\147 L\195\166tare Sunday")) (cls (1)) (colour ("rose")) (praef ("Lent"))) + ((date 2025-03-31) (mass ("Monday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-04-01) (mass ("Tuesday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-04-02) (mass ("Wednesday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-04-03) (mass ("Thursday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-04-04) (mass ("Friday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-04-05) (mass ("Saturday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2025-04-06) (mass ("Passion Sunday")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-07) (mass ("Monday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-08) (mass ("Tuesday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-09) (mass ("Wednesday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-10) (mass ("Thursday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-11) (mass ("Friday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-12) (mass ("Saturday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-13) (mass ("and Palm Sunday")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-14) (mass ("Monday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-15) (mass ("Tuesday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-16) (mass ("Wednesday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2025-04-17) (mass ("Holy Thursday")) (cls (1)) (colour ("white")) (praef ("Holy Cross"))) + ((date 2025-04-18) (mass ("Good Friday")) (cls (1)) (colour ("black")) (praef ())) + ((date 2025-04-19) (mass ("and Easter Vigil Mass")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-20) (mass ("Easter Sunday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-21) (mass ("Easter Monday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-22) (mass ("Easter Tuesday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-23) (mass ("Easter Wednesday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-24) (mass ("Easter Thursday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-25) (mass ("Easter Friday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-26) (mass ("Easter Saturday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-27) (mass ("Low Sunday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-28) (mass ("St. Paul of the Cross, Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-04-29) (mass ("St. Peter of Verona, Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2025-04-30) (mass ("St. Catherine of Siena, Virgin")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-01) (mass ("St. Joseph the Workman, Confessor")) (cls (1)) (colour ("white")) (praef ("St. Joseph"))) + ((date 2025-05-02) (mass ("St. Athanasius, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-03) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-05-04) (mass ("Second Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-05) (mass ("St. Pius V, Pope & Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-06) (mass ("St. John before the Latin Gate")) (cls (4)) (colour ("red")) (praef ("Apostles"))) + ((date 2025-05-07) (mass ("St. Stanislaus, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2025-05-08) (mass ("Apparition of St. Michael")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-09) (mass ("St. Gregory Nanzianzen, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-10) (mass ("St. Antoninus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-11) (mass ("Third Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-12) (mass ("Ss. Nereus, Achilleus, Domitila, & Pancras, Martyrs")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2025-05-13) (mass ("St. Robert Bellarmine, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-14) (mass ("St. Boniface, Martyr")) (cls (4)) (colour ("red")) (praef ("Easter"))) + ((date 2025-05-15) (mass ("St. John Baptist de la Salle, Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-16) (mass ("St. Ubald, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-17) (mass ("St. Paschal Baylon, Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-18) (mass ("Fourth Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-19) (mass ("St. Peter Celestine, Pope & Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-20) (mass ("St. Bernardine of Siena, Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-21) (mass ("Feria - Fourth Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-22) (mass ("Feria - Fourth Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-23) (mass ("Feria - Fourth Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-24) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-05-25) (mass ("5th Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-26) (mass ("St. Philip Neri, Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-27) (mass ("St. Bede the Venerable, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-28) (mass ("Vigil of Ascension")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2025-05-29) (mass ("Ascension of Our Lord")) (cls (1)) (colour ("white")) (praef ("Ascension"))) + ((date 2025-05-30) (mass ("St. Felix I, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Ascension"))) + ((date 2025-05-31) (mass ("Queenship of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2025-06-01) (mass ("Sunday after the Ascension")) (cls (2)) (colour ("white")) (praef ("Ascension"))) + ((date 2025-06-02) (mass ("Ss. Marcellinus, Peter, & Erasmus, Martyrs")) (cls (4)) (colour ("red")) (praef ("Ascension"))) + ((date 2025-06-03) (mass ("Feria - Ascension")) (cls (4)) (colour ("white")) (praef ("Ascension"))) + ((date 2025-06-04) (mass ("St. Francis Caracciolo, Confessor")) (cls (3)) (colour ("white")) (praef ("Ascension"))) + ((date 2025-06-05) (mass ("St. Boniface, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Ascension"))) + ((date 2025-06-06) (mass ("St. Norbert, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Ascension"))) + ((date 2025-06-07) (mass ("Vigil of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2025-06-08) (mass ("Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2025-06-09) (mass ("Monday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2025-06-10) (mass ("Tuesday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2025-06-11) (mass ("Ember Wednesday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2025-06-12) (mass ("Thursday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2025-06-13) (mass ("Ember Friday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2025-06-14) (mass ("Ember Saturday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2025-06-15) (mass ("Trinity Sunday")) (cls (1)) (colour ("white")) (praef ("Holy Trinity"))) + ((date 2025-06-16) (mass ("Feria - First Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-06-17) (mass ("St. Gregory Barbarigo, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-06-18) (mass ("St. Ephrem of Syria, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-06-19) (mass ("Corpus Christi")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2025-06-20) (mass ("St. Silverius, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-06-21) (mass ("St. Aloyisius Gonzaga, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-06-22) (mass ("Second Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-06-23) (mass ("Vigil of Nativity of St. John the Baptist")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2025-06-24) (mass ("Nativity of St. John the Baptist")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2025-06-25) (mass ("St. William, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-06-26) (mass ("Ss. John & Paul, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-06-27) (mass ("Most Sacred Heart of Jesus")) (cls (1)) (colour ("white")) (praef ("Sacred Heart"))) + ((date 2025-06-28) (mass ("Vigil of Ss. Peter & Paul")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2025-06-29) (mass ("Ss. Peter & Paul, Apostles")) (cls (1)) (colour ("red")) (praef ("Apostles"))) + ((date 2025-06-30) (mass ("Commemoration of St. Paul, Apostle")) (cls (3)) (colour ("red")) (praef ("Apostles"))) + ((date 2025-07-01) (mass ("Most Precious Blood of Our Lord")) (cls (1)) (colour ("red")) (praef ("Holy Cross"))) + ((date 2025-07-02) (mass ("Visitation of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2025-07-03) (mass ("St. Irenaeus, Doctor of the Church")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-07-04) (mass ("In Commemoration of All Holy Popes")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-07-05) (mass ("St. Anthony Mary Zaccaria, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-06) (mass ("Fourth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-07-07) (mass ("Ss. Cyril & Methodius, Bishops & Confessors")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-08) (mass ("St. Elizabeth of Portugal, Queen & Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-09) (mass ("Feria - Fourth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-07-10) (mass ("Seven Holy Brothers, & Ss. Rufina & Secunda, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-07-11) (mass ("St. Pius I, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-07-12) (mass ("St. John Gualbert, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-13) (mass ("Fifth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-07-14) (mass ("St. Bonaventure, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-15) (mass ("St. Henry II, Emperor, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-16) (mass ("Our Lady of Mt. Carmel")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-07-17) (mass ("St. Alexius, Confessor")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-18) (mass ("St. Camillus de Lellis, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-19) (mass ("St. Vincent de Paul, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-20) (mass ("Sixth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-07-21) (mass ("St. Lawrence of Brindisi, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-22) (mass ("St. Mary Magdalene, Penitent")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-23) (mass ("St. Apollinarus, Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-07-24) (mass ("St. Christina, Virgin & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-07-25) (mass ("St. James the Greater, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2025-07-26) (mass ("St. Anne, Mother of the BVM")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-27) (mass ("Seventh Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-07-28) (mass ("Ss. Nazarius & Celsus, Martyrs, Victor I, Pope & Martyr,")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-07-29) (mass ("St. Martha, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-07-30) (mass ("Ss. Abdon & Sennen, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-07-31) (mass ("St. Ignatius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-01) (mass ("Holy Machabees, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-08-02) (mass ("St. Alphonsus of Liguori, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-03) (mass ("Eighth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-08-04) (mass ("St. Dominic, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-05) (mass ("Our Lady of the Snows")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2025-08-06) (mass ("Transfiguration of Our Lord")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-07) (mass ("St. Cajetan, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-08) (mass ("St. John Mary Vianney, Confessor & Priest")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-09) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-08-10) (mass ("Ninth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-08-11) (mass ("Ss. Tiburtius & Susanna, Virgin, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-08-12) (mass ("St. Clare, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-13) (mass ("Ss. Hippolytus & Cassian, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-08-14) (mass ("Vigil of the Assumption")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2025-08-15) (mass ("Assumption of the BVM")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2025-08-16) (mass ("St. Joachim, Father of the BVM")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-17) (mass ("Tenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-08-18) (mass ("St. Agapitus, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-08-19) (mass ("St. John Eudes, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-20) (mass ("St. Bernard of Clairvaux, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-21) (mass ("St. Jane Frances de Chantal, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-22) (mass ("Immaculate Heart of Mary")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2025-08-23) (mass ("St. Philip Benizi, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-24) (mass ("Eleventh Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-08-25) (mass ("St. Louis IX, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-26) (mass ("St. Zephirynus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-08-27) (mass ("St. Joseph Calasanctius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-28) (mass ("St. Augustine, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-29) (mass ("Beheading of St. John the Baptist")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-08-30) (mass ("St. Rose of Lima, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-08-31) (mass ("Twelfth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-09-01) (mass ("St. Giles, Abbot")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2025-09-02) (mass ("St. Stephen, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-09-03) (mass ("St. Pius X, Pope & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-09-04) (mass ("Feria - Twelfth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-09-05) (mass ("St. Lawrence Justinian, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-09-06) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-09-07) (mass ("Thirteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-09-08) (mass ("Nativity of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2025-09-09) (mass ("St. Gorgonius, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-09-10) (mass ("St. Nicholas of Tolentino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-09-11) (mass ("Ss. Protus & Hyacinth, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-09-12) (mass ("Most Holy Name of Mary")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2025-09-13) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-09-14) (mass ("Exaltation of the Holy Cross")) (cls (2)) (colour ("red")) (praef ("Holy Cross"))) + ((date 2025-09-15) (mass ("Seven Sorrows of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2025-09-16) (mass ("St. Cornelius, Pope, & St. Cyprian, Bishop, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-09-17) (mass ("Stigmata of St. Francis")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2025-09-18) (mass ("St. Joseph of Cupertino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-09-19) (mass ("St. Januarius, Bishop, & Companions, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-09-20) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-09-21) (mass ("Fifteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-09-22) (mass ("St. Thomas of Villanova, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-09-23) (mass ("St. Linus, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-09-24) (mass ("Ember Wednesday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2025-09-25) (mass ("Feria - Fifteenth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-09-26) (mass ("Ember Friday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2025-09-27) (mass ("Ember Saturday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2025-09-28) (mass ("Sixteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-09-29) (mass ("St. Michael the Archangel")) (cls (1)) (colour ("white")) (praef ("Holy Trinity"))) + ((date 2025-09-30) (mass ("St. Jerome, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-01) (mass ("St. Remigius, Bishop & Confessor")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-02) (mass ("Holy Guardian Angels")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-03) (mass ("St. Teresa of the Child Jesus, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-04) (mass ("St. Francis of Assisi, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-05) (mass ("Seventeenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-10-06) (mass ("St. Bruno, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-07) (mass ("Our Lady of the Rosary")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2025-10-08) (mass ("St. Bridget, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-09) (mass ("St. John Leonard, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-10) (mass ("St. Francis Borgia, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-11) (mass ("Maternity of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2025-10-12) (mass ("Eighteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-10-13) (mass ("St. Edward, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-14) (mass ("St. Callistus I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-10-15) (mass ("St. Teresa of Avila, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-16) (mass ("St. Hedwig, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-17) (mass ("St. Margaret Mary Alacoque, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-18) (mass ("St. Luke the Evangelist")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2025-10-19) (mass ("Nineteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-10-20) (mass ("St. John Cantius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-21) (mass ("St. Hilarion, Abbot")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-22) (mass ("Feria - Nineteenth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-10-23) (mass ("St. Anthony Mary Claret, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-24) (mass ("St. Raphael the Archangel")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-10-25) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-10-26) (mass ("Christ the King")) (cls (1)) (colour ("white")) (praef ("Christ the King"))) + ((date 2025-10-27) (mass ("Feria - Twentieth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-10-28) (mass ("Ss. Simon & Jude, Apostles")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2025-10-29) (mass ("Feria - Twentieth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-10-30) (mass ("Feria - Twentieth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-10-31) (mass ("Feria - Twentieth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-11-01) (mass ("All Saints")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-02) (mass ("Twenty-first Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-11-03) (mass ("All Souls - Mass 1")) (cls (1)) (colour ("black")) (praef ("For the Dead"))) + ((date 2025-11-04) (mass ("St. Charles Borromeo, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-05) (mass ("The Holy Relics")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2025-11-06) (mass ("Feria - Twenty-first Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-11-07) (mass ("Feria - Twenty-first Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-11-08) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-11-09) (mass ("Dedication of the Archbasilica of Our Holy Savior")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-11-10) (mass ("St. Andrew Avellino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-11) (mass ("St. Martin of Tours, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-12) (mass ("St. Martin I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-11-13) (mass ("St. Didacus, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-14) (mass ("St. Josaphat, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-11-15) (mass ("St. Albert the Great, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-16) (mass ("Twenty-third Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-11-17) (mass ("St. Gregory Thaumaturgus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-18) (mass ("Dedication of the Basilicas of Ss. Peter & Paul")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-19) (mass ("St. Elizabeth of Hungary, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-20) (mass ("St. Felix of Valois, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-21) (mass ("Presentation of the BVM")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2025-11-22) (mass ("St. Cecilia, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-11-23) (mass ("Last Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2025-11-24) (mass ("St. John of the Cross, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-25) (mass ("St. Catherine of Alexandria, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2025-11-26) (mass ("St. Sylvester, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2025-11-27) (mass ("Our Lady of the Miraculous Medal")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2025-11-28) (mass ("Feria - Last Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2025-11-29) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("Common"))) +) diff --git a/test/fixtures/efdotorg-ordo-2025-2026.sexp b/test/fixtures/efdotorg-ordo-2025-2026.sexp new file mode 100644 index 0000000..c94a0a8 --- /dev/null +++ b/test/fixtures/efdotorg-ordo-2025-2026.sexp @@ -0,0 +1,398 @@ +; test/fixtures/efdotorg-ordo-2025-2026.sexp -- efdotorg-preface task +; (2026-08-24-colitur-celebrant-rubrics-phase1): the THIRD independent +; preface witness (RG 482-499), extraordinaryform.org's 2025-2026 Ordo, +; extracted from the already-parsed, fidelity-audited corpus +; docs/research/ordo/ordo-2024-2027.json (SHA-256 18a417fb8b30dc438c3f12f64b43dfdf5e2e9313857f2eccd04bf02072ca7e3c) rather than +; re-parsed from the PDF -- see tools/extract_efdotorg_ordo.py's own +; header for the full characterisation this fixture rests on (the menu- +; trap office filter, the Christ-the-King classifier-gap recovery, why +; "Advent" is not baked into a single mapping here, the known Vigil-of- +; St-Lawrence gap, and the two source-PDF defects that turn out not to +; touch this field). +; +; Generator: tools/extract_efdotorg_ordo.py -- do not hand-edit; re-run +; against the same JSON and commit the diff instead. +; python3 tools/extract_efdotorg_ordo.py docs/research/ordo/ordo-2024-2027.json test/fixtures +; +; Source PDF (gitignored, CLAUDE.md: "docs/ is gitignored", see +; docs/research/ordo/SHA256SUMS for its own hash): 2025-2026Ordo.pdf, +; extraordinaryform.org. +; +; COVERAGE: 364 day-rows, 2025-11-30..2026-11-28 (this edition's own civil-date +; span, re-derived from the JSON's own seams -- see the generator's own +; EDITIONS comment). 0 row(s) are a genuine SOURCE GAP (2027-03-03 +; only, a PDF row-drop, ordo-fidelity-report.md) -- mass/cls/colour/praef +; all absent, the same shape a structurally blank day (Good Friday) uses. +; 1 further row(s) have mass/cls/colour but no praef at all +; (Good Friday -- RG 28, no Mass in the 1955-restored Holy Week). +; +; Each row's `praef` is RAW TEXT from the day's own OFFICE (after the +; menu-trap filter, with the Christ-the-King recovery already applied) -- +; classified against {!Colitur_kernel.Preface.t} by +; test/test_efdotorg_ordo.ml, not here. +( + ((date 2025-11-30) (mass ("First Sunday of Advent")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-01) (mass ("Feria \226\128\147 First Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-02) (mass ("St. Bibiana, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Advent"))) + ((date 2025-12-03) (mass ("St. Francis Xavier, Confessor")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2025-12-04) (mass ("St. Peter Chrysologus, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2025-12-05) (mass ("Feria \226\128\147 First Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-06) (mass ("St. Nicholas, Confessor & Bishop")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2025-12-07) (mass ("Second Sunday of Advent")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-08) (mass ("Immaculate Conception")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2025-12-09) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-10) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-11) (mass ("St. Damasus I, Pope")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2025-12-12) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-13) (mass ("St. Lucy, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Advent"))) + ((date 2025-12-14) (mass ("Third Sunday of Advent \226\128\147 Gaudete")) (cls (1)) (colour ("rose")) (praef ("Advent"))) + ((date 2025-12-15) (mass ("Feria \226\128\147 Third Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-16) (mass ("St. Eusebius, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Advent"))) + ((date 2025-12-17) (mass ("Ember Wednesday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-18) (mass ("Feria \226\128\147 Third Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-19) (mass ("Ember Friday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-20) (mass ("Ember Saturday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-21) (mass ("Fourth Sunday of Advent")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-22) (mass ("Feria - Fourth Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-23) (mass ("Feria - Fourth Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-24) (mass ("Vigil of Nativity of Our Lord")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2025-12-25) (mass ("Nativity of Our Lord - Mass at Midnight")) (cls (1)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-12-26) (mass ("Day II in the Octave, St. Stephen, Protomartyr")) (cls (2)) (colour ("red")) (praef ("Nativity"))) + ((date 2025-12-27) (mass ("Day III in the Octave, St. John, Apostle & Evangelist")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-12-28) (mass ("Sunday within the Octave of Christmas")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-12-29) (mass ("Day V in the Octave")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-12-30) (mass ("Day VI in the Octave")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2025-12-31) (mass ("Day VII in the Octave")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-01-01) (mass ("Day VIII in the Octave, Circumcision of Our Lord")) (cls (1)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-01-02) (mass ("Feria in Christmastide")) (cls (4)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-01-03) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-01-04) (mass ("Holy Name of Jesus")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-01-05) (mass ("St. Telesphorus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Nativity"))) + ((date 2026-01-06) (mass ("Epiphany of Our Lord")) (cls (1)) (colour ("white")) (praef ("Epiphany"))) + ((date 2026-01-07) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2026-01-08) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2026-01-09) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2026-01-10) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-01-11) (mass ("Holy Family")) (cls (2)) (colour ("white")) (praef ("Epiphany"))) + ((date 2026-01-12) (mass ("Feria after Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2026-01-13) (mass ("Baptism of Our Lord")) (cls (2)) (colour ("white")) (praef ("Epiphany"))) + ((date 2026-01-14) (mass ("St. Hilary, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-01-15) (mass ("St. Paul, First Hermit, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-01-16) (mass ("St. Marcellus I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-01-17) (mass ("St. Anthony, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-01-18) (mass ("Second Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-01-19) (mass ("Ss. Marius, Martha, Audifax, & Abachum, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-01-20) (mass ("Ss. Fabian, Pope, & Sebastian, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-01-21) (mass ("St. Agnes, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-01-22) (mass ("Ss. Vincent & Anastasius, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-01-23) (mass ("St. Raymund of Pennafort, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-01-24) (mass ("St. Timothy, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-01-25) (mass ("Third Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-01-26) (mass ("St. Polycarp, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-01-27) (mass ("St. John Chrysostom, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-01-28) (mass ("St. Peter Nolasco, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-01-29) (mass ("St. Francis de Sales, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-01-30) (mass ("St. Martina, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-01-31) (mass ("St. John Bosco, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-02-01) (mass ("Septuagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2026-02-02) (mass ("and Purification of BVM")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-02-03) (mass ("St. Blaise, Bishop & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-02-04) (mass ("St. Andrew Corsini, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-02-05) (mass ("St. Agatha, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-02-06) (mass ("St. Titus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-02-07) (mass ("St. Romuald, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-02-08) (mass ("Sexagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2026-02-09) (mass ("St. Cyril, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-02-10) (mass ("St. Scholastica, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-02-11) (mass ("Our Lady of Lourdes")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2026-02-12) (mass ("Seven Holy Founders, Confessors")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-02-13) (mass ("Feria - Sexagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2026-02-14) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-02-15) (mass ("Quinquagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2026-02-16) (mass ("Feria - Quinquagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2026-02-17) (mass ("Feria - Quinquagesima")) (cls (4)) (colour ("violet")) (praef ("Common"))) + ((date 2026-02-18) (mass ("and Ash Wednesday")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-19) (mass ("Thursday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-20) (mass ("Friday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-21) (mass ("Saturday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-22) (mass ("1st Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-23) (mass ("Monday after the 1st Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-24) (mass ("St. Matthias, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-02-25) (mass ("Ember Wednesday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-26) (mass ("Thursday after the 1st Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-27) (mass ("Ember Friday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-02-28) (mass ("Ember Saturday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-01) (mass ("2nd Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-02) (mass ("Monday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-03) (mass ("Tuesday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-04) (mass ("Wednesday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-05) (mass ("Thursday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-06) (mass ("Friday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-07) (mass ("Saturday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-08) (mass ("3rd Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-09) (mass ("Monday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-10) (mass ("Tuesday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-11) (mass ("Wednesday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-12) (mass ("Thursday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-13) (mass ("Friday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-14) (mass ("Saturday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-15) (mass ("4th Sunday of Lent \226\128\147 L\195\166tare Sunday")) (cls (1)) (colour ("rose")) (praef ("Lent"))) + ((date 2026-03-16) (mass ("Monday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-17) (mass ("Tuesday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-18) (mass ("Wednesday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-19) (mass ("St. Joseph, Spouse of the BVM")) (cls (1)) (colour ("white")) (praef ("St. Joseph"))) + ((date 2026-03-20) (mass ("Friday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-21) (mass ("Saturday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2026-03-22) (mass ("Passion Sunday")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-03-23) (mass ("Monday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-03-24) (mass ("Tuesday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-03-25) (mass ("Annunciation of the BVM")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2026-03-26) (mass ("Thursday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-03-27) (mass ("Friday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-03-28) (mass ("Saturday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-03-29) (mass ("and Palm Sunday")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-03-30) (mass ("Monday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-03-31) (mass ("Tuesday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-04-01) (mass ("Wednesday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2026-04-02) (mass ("Holy Thursday")) (cls (1)) (colour ("white")) (praef ("Holy Cross"))) + ((date 2026-04-03) (mass ("Good Friday")) (cls (1)) (colour ("black")) (praef ())) + ((date 2026-04-04) (mass ("and Easter Vigil Mass")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-05) (mass ("Easter Sunday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-06) (mass ("Easter Monday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-07) (mass ("Easter Tuesday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-08) (mass ("Easter Wednesday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-09) (mass ("Easter Thursday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-10) (mass ("Easter Friday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-11) (mass ("Easter Saturday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-12) (mass ("Low Sunday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-13) (mass ("St.Hermenegild, Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2026-04-14) (mass ("St. Justin, Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2026-04-15) (mass ("Feria - First Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-16) (mass ("Feria - First Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-17) (mass ("St. Anicetus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Easter"))) + ((date 2026-04-18) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-04-19) (mass ("Second Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-20) (mass ("Feria - Second Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-21) (mass ("St. Anselm, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-22) (mass ("Ss. Soter & Cajus, Popes & Martyrs")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2026-04-23) (mass ("St. George, Martyr")) (cls (4)) (colour ("red")) (praef ("Easter"))) + ((date 2026-04-24) (mass ("St. Fidelis. Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2026-04-25) (mass ("St. Mark, Evangelist")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-04-26) (mass ("Third Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-27) (mass ("St. Peter Canisius, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-28) (mass ("St. Paul of the Cross, Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2026-04-29) (mass ("St. Peter of Verona, Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2026-04-30) (mass ("St. Catherine of Siena, Virgin")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-01) (mass ("St. Joseph the Workman, Confessor")) (cls (1)) (colour ("white")) (praef ("St. Joseph"))) + ((date 2026-05-02) (mass ("St. Athanasius, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-03) (mass ("Fourth Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-04) (mass ("St. Monica, Widow")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-05) (mass ("St. Pius V, Pope & Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-06) (mass ("St. John before the Latin Gate")) (cls (4)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-05-07) (mass ("St. Stanislaus, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2026-05-08) (mass ("Apparition of St. Michael")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-09) (mass ("St. Gregory Nanzianzen, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-10) (mass ("5th Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-11) (mass ("Ss. Philip & James, Apostles")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-05-12) (mass ("Ss. Nereus, Achilleus, Domitila, & Pancras, Martyrs")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2026-05-13) (mass ("Vigil of Ascension")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2026-05-14) (mass ("Ascension of Our Lord")) (cls (1)) (colour ("white")) (praef ("Ascension"))) + ((date 2026-05-15) (mass ("St. John Baptist de la Salle, Confessor")) (cls (3)) (colour ("white")) (praef ("Ascension"))) + ((date 2026-05-16) (mass ("St. Ubald, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Ascension"))) + ((date 2026-05-17) (mass ("Sunday after the Ascension")) (cls (2)) (colour ("white")) (praef ("Ascension"))) + ((date 2026-05-18) (mass ("St. Venantius, Martyr")) (cls (3)) (colour ("red")) (praef ("Ascension"))) + ((date 2026-05-19) (mass ("St. Peter Celestine, Pope & Confessor")) (cls (3)) (colour ("white")) (praef ("Ascension"))) + ((date 2026-05-20) (mass ("St. Bernardine of Siena, Confessor")) (cls (3)) (colour ("white")) (praef ("Ascension"))) + ((date 2026-05-21) (mass ("Feria - Ascension")) (cls (4)) (colour ("white")) (praef ("Ascension"))) + ((date 2026-05-22) (mass ("Feria - Ascension")) (cls (4)) (colour ("white")) (praef ("Ascension"))) + ((date 2026-05-23) (mass ("Vigil of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2026-05-24) (mass ("Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2026-05-25) (mass ("Monday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2026-05-26) (mass ("Tuesday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2026-05-27) (mass ("Ember Wednesday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2026-05-28) (mass ("Thursday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2026-05-29) (mass ("Ember Friday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2026-05-30) (mass ("Ember Saturday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2026-05-31) (mass ("Trinity Sunday")) (cls (1)) (colour ("white")) (praef ("Holy Trinity"))) + ((date 2026-06-01) (mass ("St. Angela Merici, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-02) (mass ("Ss. Marcellinus, Peter, & Erasmus, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-06-03) (mass ("Feria - First Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-06-04) (mass ("Corpus Christi")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-05) (mass ("St. Boniface, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-06-06) (mass ("St. Norbert, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-07) (mass ("Second Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-06-08) (mass ("Feria - Second Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-06-09) (mass ("Ss. Primus & Felician, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-06-10) (mass ("St. Margaret, Queen of Scotland, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-11) (mass ("St. Barnabas, Apostle")) (cls (3)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-06-12) (mass ("Most Sacred Heart of Jesus")) (cls (1)) (colour ("white")) (praef ("Sacred Heart"))) + ((date 2026-06-13) (mass ("St. Anthony of Padua, Doctor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-14) (mass ("Third Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-06-15) (mass ("Ss. Vitus, Modestus, & Crescentia, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-06-16) (mass ("Feria - Third Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-06-17) (mass ("St. Gregory Barbarigo, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-18) (mass ("St. Ephrem of Syria, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-19) (mass ("St. Juliana Falconieri, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-20) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-06-21) (mass ("Fourth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-06-22) (mass ("St. Paulinus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-23) (mass ("Vigil of Nativity of St. John the Baptist")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2026-06-24) (mass ("Nativity of St. John the Baptist")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-25) (mass ("St. William, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-06-26) (mass ("Ss. John & Paul, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-06-27) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-06-28) (mass ("Fifth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-06-29) (mass ("Ss. Peter & Paul, Apostles")) (cls (1)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-06-30) (mass ("Commemoration of St. Paul, Apostle")) (cls (3)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-07-01) (mass ("Most Precious Blood of Our Lord")) (cls (1)) (colour ("red")) (praef ("Holy Cross"))) + ((date 2026-07-02) (mass ("Visitation of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2026-07-03) (mass ("St. Irenaeus, Doctor of the Church")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-07-04) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-07-05) (mass ("Sixth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-07-06) (mass ("St. Maria Goretti, Virgin Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-07-07) (mass ("Ss. Cyril & Methodius, Bishops & Confessors")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-08) (mass ("St. Elizabeth of Portugal, Queen & Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-09) (mass ("Feria - Sixth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-07-10) (mass ("Seven Holy Brothers, & Ss. Rufina & Secunda, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-07-11) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-07-12) (mass ("Seventh Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-07-13) (mass ("Feria - Seventh Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-07-14) (mass ("St. Bonaventure, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-15) (mass ("St. Henry II, Emperor, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-16) (mass ("Our Lady of Mt. Carmel")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-07-17) (mass ("St. Alexius, Confessor")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-18) (mass ("St. Camillus de Lellis, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-19) (mass ("Eighth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-07-20) (mass ("St. Jerome Emiliani, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-21) (mass ("St. Lawrence of Brindisi, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-22) (mass ("St. Mary Magdalene, Penitent")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-23) (mass ("St. Apollinarus, Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-07-24) (mass ("St. Christina, Virgin & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-07-25) (mass ("St. James the Greater, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-07-26) (mass ("Ninth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-07-27) (mass ("St. Pantaleon, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-07-28) (mass ("Ss. Nazarius & Celsus, Martyrs, Victor I, Pope & Martyr,")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-07-29) (mass ("St. Martha, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-07-30) (mass ("Ss. Abdon & Sennen, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-07-31) (mass ("St. Ignatius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-01) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-08-02) (mass ("Tenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-08-03) (mass ("The Finding of the Body of St. Stephen")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-08-04) (mass ("St. Dominic, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-05) (mass ("Our Lady of the Snows")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2026-08-06) (mass ("Transfiguration of Our Lord")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-07) (mass ("St. Cajetan, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-08) (mass ("St. John Mary Vianney, Confessor & Priest")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-09) (mass ("Eleventh Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-08-10) (mass ("St. Lawrence, Deacon & Martyr")) (cls (2)) (colour ("red")) (praef ("Common"))) + ((date 2026-08-11) (mass ("Ss. Tiburtius & Susanna, Virgin, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-08-12) (mass ("St. Clare, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-13) (mass ("Ss. Hippolytus & Cassian, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-08-14) (mass ("Vigil of the Assumption")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2026-08-15) (mass ("Assumption of the BVM")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2026-08-16) (mass ("Twelfth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-08-17) (mass ("St. Hyacinth of Poland, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-18) (mass ("St. Agapitus, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-08-19) (mass ("St. John Eudes, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-20) (mass ("St. Bernard of Clairvaux, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-21) (mass ("St. Jane Frances de Chantal, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-22) (mass ("Immaculate Heart of Mary")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2026-08-23) (mass ("Thirteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-08-24) (mass ("St. Bartholomew, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-08-25) (mass ("St. Louis IX, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-26) (mass ("St. Zephirynus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-08-27) (mass ("St. Joseph Calasanctius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-28) (mass ("St. Augustine, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-08-29) (mass ("Beheading of St. John the Baptist")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-08-30) (mass ("Fourteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-08-31) (mass ("St. Raymond Nonnatus, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-01) (mass ("St. Giles, Abbot")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-02) (mass ("St. Stephen, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-03) (mass ("St. Pius X, Pope & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-04) (mass ("Feria - Fourteenth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-09-05) (mass ("St. Lawrence Justinian, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-06) (mass ("Fifteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-09-07) (mass ("Feria - Fifteenth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-09-08) (mass ("Nativity of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2026-09-09) (mass ("St. Gorgonius, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-09-10) (mass ("St. Nicholas of Tolentino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-11) (mass ("Ss. Protus & Hyacinth, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-09-12) (mass ("Most Holy Name of Mary")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2026-09-13) (mass ("Sixteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-09-14) (mass ("Exaltation of the Holy Cross")) (cls (2)) (colour ("red")) (praef ("Holy Cross"))) + ((date 2026-09-15) (mass ("Seven Sorrows of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2026-09-16) (mass ("St. Cornelius, Pope, & St. Cyprian, Bishop, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-09-17) (mass ("Stigmata of St. Francis")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-18) (mass ("St. Joseph of Cupertino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-19) (mass ("St. Januarius, Bishop, & Companions, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-09-20) (mass ("Seventeenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-09-21) (mass ("St. Matthew, Apostle & Evangelist")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-09-22) (mass ("St. Thomas of Villanova, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-23) (mass ("Ember Wednesday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2026-09-24) (mass ("Our Lady of Ransom")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-09-25) (mass ("Ember Friday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2026-09-26) (mass ("Ember Saturday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2026-09-27) (mass ("Eighteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-09-28) (mass ("St. Wenceslaus, Duke, Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-09-29) (mass ("St. Michael the Archangel")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2026-09-30) (mass ("St. Jerome, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-01) (mass ("St. Remigius, Bishop & Confessor")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-02) (mass ("Holy Guardian Angels")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-03) (mass ("St. Teresa of the Child Jesus, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-04) (mass ("Nineteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-10-05) (mass ("Ss. Placid & Companions, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-10-06) (mass ("St. Bruno, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-07) (mass ("Our Lady of the Rosary")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2026-10-08) (mass ("St. Bridget, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-09) (mass ("St. John Leonard, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-10) (mass ("St. Francis Borgia, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-11) (mass ("Twentieth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-10-12) (mass ("Feria - Twentieth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-10-13) (mass ("St. Edward, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-14) (mass ("St. Callistus I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-10-15) (mass ("St. Teresa of Avila, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-16) (mass ("St. Hedwig, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-17) (mass ("St. Margaret Mary Alacoque, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-18) (mass ("Twenty-first Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-10-19) (mass ("St. Peter of Alcantara, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-20) (mass ("St. John Cantius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-21) (mass ("St. Hilarion, Abbot")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-22) (mass ("Feria - Twenty-first Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-10-23) (mass ("St. Anthony Mary Claret, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-24) (mass ("St. Raphael the Archangel")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-10-25) (mass ("Christ the King")) (cls (1)) (colour ("white")) (praef ("Christ the King"))) + ((date 2026-10-26) (mass ("St. Evaristus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-10-27) (mass ("Feria - Twenty-second Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-10-28) (mass ("Ss. Simon & Jude, Apostles")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-10-29) (mass ("Feria - Twenty-second Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-10-30) (mass ("Feria - Twenty-second Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-10-31) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-11-01) (mass ("All Saints")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-02) (mass ("All Souls - Mass 1")) (cls (1)) (colour ("black")) (praef ("For the Dead"))) + ((date 2026-11-03) (mass ("Feria - Twenty-third Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-11-04) (mass ("St. Charles Borromeo, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-05) (mass ("The Holy Relics")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2026-11-06) (mass ("Feria - Twenty-third Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2026-11-07) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-11-08) (mass ("Resumed 5th Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-11-09) (mass ("Dedication of the Archbasilica of Our Holy Savior")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-10) (mass ("St. Andrew Avellino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-11) (mass ("St. Martin of Tours, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-12) (mass ("St. Martin I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-11-13) (mass ("St. Didacus, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-14) (mass ("St. Josaphat, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-11-15) (mass ("Resumed 6th Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-11-16) (mass ("St. Gertrude, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-17) (mass ("St. Gregory Thaumaturgus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-18) (mass ("Dedication of the Basilicas of Ss. Peter & Paul")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-19) (mass ("St. Elizabeth of Hungary, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-20) (mass ("St. Felix of Valois, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-21) (mass ("Presentation of the BVM")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2026-11-22) (mass ("Last Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2026-11-23) (mass ("St. Clement I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-11-24) (mass ("St. John of the Cross, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-25) (mass ("St. Catherine of Alexandria, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2026-11-26) (mass ("St. Sylvester, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2026-11-27) (mass ("Our Lady of the Miraculous Medal")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2026-11-28) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) +) diff --git a/test/fixtures/efdotorg-ordo-2026-2027.sexp b/test/fixtures/efdotorg-ordo-2026-2027.sexp new file mode 100644 index 0000000..dc95641 --- /dev/null +++ b/test/fixtures/efdotorg-ordo-2026-2027.sexp @@ -0,0 +1,398 @@ +; test/fixtures/efdotorg-ordo-2026-2027.sexp -- efdotorg-preface task +; (2026-08-24-colitur-celebrant-rubrics-phase1): the THIRD independent +; preface witness (RG 482-499), extraordinaryform.org's 2026-2027 Ordo, +; extracted from the already-parsed, fidelity-audited corpus +; docs/research/ordo/ordo-2024-2027.json (SHA-256 18a417fb8b30dc438c3f12f64b43dfdf5e2e9313857f2eccd04bf02072ca7e3c) rather than +; re-parsed from the PDF -- see tools/extract_efdotorg_ordo.py's own +; header for the full characterisation this fixture rests on (the menu- +; trap office filter, the Christ-the-King classifier-gap recovery, why +; "Advent" is not baked into a single mapping here, the known Vigil-of- +; St-Lawrence gap, and the two source-PDF defects that turn out not to +; touch this field). +; +; Generator: tools/extract_efdotorg_ordo.py -- do not hand-edit; re-run +; against the same JSON and commit the diff instead. +; python3 tools/extract_efdotorg_ordo.py docs/research/ordo/ordo-2024-2027.json test/fixtures +; +; Source PDF (gitignored, CLAUDE.md: "docs/ is gitignored", see +; docs/research/ordo/SHA256SUMS for its own hash): 2026-2027Ordo.pdf, +; extraordinaryform.org. +; +; COVERAGE: 364 day-rows, 2026-11-29..2027-11-27 (this edition's own civil-date +; span, re-derived from the JSON's own seams -- see the generator's own +; EDITIONS comment). 1 row(s) are a genuine SOURCE GAP (2027-03-03 +; only, a PDF row-drop, ordo-fidelity-report.md) -- mass/cls/colour/praef +; all absent, the same shape a structurally blank day (Good Friday) uses. +; 1 further row(s) have mass/cls/colour but no praef at all +; (Good Friday -- RG 28, no Mass in the 1955-restored Holy Week). +; +; Each row's `praef` is RAW TEXT from the day's own OFFICE (after the +; menu-trap filter, with the Christ-the-King recovery already applied) -- +; classified against {!Colitur_kernel.Preface.t} by +; test/test_efdotorg_ordo.ml, not here. +( + ((date 2026-11-29) (mass ("First Sunday of Advent")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-11-30) (mass ("St. Andrew, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-12-01) (mass ("Feria \226\128\147 First Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-02) (mass ("St. Bibiana, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Advent"))) + ((date 2026-12-03) (mass ("St. Francis Xavier, Confessor")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2026-12-04) (mass ("St. Peter Chrysologus, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2026-12-05) (mass ("Feria \226\128\147 First Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-06) (mass ("Second Sunday of Advent")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-07) (mass ("St. Ambrose, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2026-12-08) (mass ("Immaculate Conception")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2026-12-09) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-10) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-11) (mass ("St. Damasus I, Pope")) (cls (3)) (colour ("white")) (praef ("Advent"))) + ((date 2026-12-12) (mass ("Feria \226\128\147 Second Sunday of Advent")) (cls (3)) (colour ("rose")) (praef ("Advent"))) + ((date 2026-12-13) (mass ("Third Sunday of Advent \226\128\147 Gaudete")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-14) (mass ("Feria \226\128\147 Third Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-15) (mass ("Feria \226\128\147 Third Sunday of Advent")) (cls (3)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-16) (mass ("Ember Wednesday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-17) (mass ("Feria \226\128\147 Third Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-18) (mass ("Ember Friday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-19) (mass ("Ember Saturday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-20) (mass ("Fourth Sunday of Advent")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-21) (mass ("St. Thomas, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2026-12-22) (mass ("Feria - Fourth Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-23) (mass ("Feria - Fourth Sunday of Advent")) (cls (2)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-24) (mass ("Vigil of Nativity of Our Lord")) (cls (1)) (colour ("violet")) (praef ("Advent"))) + ((date 2026-12-25) (mass ("Nativity of Our Lord - Mass at Midnight")) (cls (1)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-12-26) (mass ("Day II in the Octave, St. Stephen, Protomartyr")) (cls (2)) (colour ("red")) (praef ("Nativity"))) + ((date 2026-12-27) (mass ("Sunday within the Octave of Christmas")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-12-28) (mass ("Day IV in the Octave, Holy Innocents")) (cls (2)) (colour ("red")) (praef ("Nativity"))) + ((date 2026-12-29) (mass ("Day V in the Octave")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-12-30) (mass ("Day VI in the Octave")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2026-12-31) (mass ("Day VII in the Octave")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2027-01-01) (mass ("Day VIII in the Octave, Circumcision of Our Lord")) (cls (1)) (colour ("white")) (praef ("Nativity"))) + ((date 2027-01-02) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-01-03) (mass ("Holy Name of Jesus")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2027-01-04) (mass ("Feria in Christmastide")) (cls (4)) (colour ("white")) (praef ("Nativity"))) + ((date 2027-01-05) (mass ("St. Telesphorus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Nativity"))) + ((date 2027-01-06) (mass ("Epiphany of Our Lord")) (cls (1)) (colour ("white")) (praef ("Epiphany"))) + ((date 2027-01-07) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2027-01-08) (mass ("Feria of Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2027-01-09) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-01-10) (mass ("Holy Family")) (cls (2)) (colour ("white")) (praef ("Epiphany"))) + ((date 2027-01-11) (mass ("St. Hyginus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Epiphany"))) + ((date 2027-01-12) (mass ("Feria after Epiphany")) (cls (4)) (colour ("white")) (praef ("Epiphany"))) + ((date 2027-01-13) (mass ("Baptism of Our Lord")) (cls (2)) (colour ("white")) (praef ("Epiphany"))) + ((date 2027-01-14) (mass ("St. Hilary, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-01-15) (mass ("St. Paul, First Hermit, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-01-16) (mass ("St. Marcellus I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-01-17) (mass ("Second Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-01-18) (mass ("St. Prisca, Virgin & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-01-19) (mass ("Ss. Marius, Martha, Audifax, & Abachum, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-01-20) (mass ("Ss. Fabian, Pope, & Sebastian, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-01-21) (mass ("St. Agnes, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-01-22) (mass ("Ss. Vincent & Anastasius, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-01-23) (mass ("St. Raymund of Pennafort, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-01-24) (mass ("Septuagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2027-01-25) (mass ("Conversion of St. Paul, Apostle")) (cls (3)) (colour ("white")) (praef ("Apostles"))) + ((date 2027-01-26) (mass ("St. Polycarp, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-01-27) (mass ("St. John Chrysostom, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-01-28) (mass ("St. Peter Nolasco, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-01-29) (mass ("St. Francis de Sales, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-01-30) (mass ("St. Martina, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-01-31) (mass ("Sexagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2027-02-01) (mass ("St. Ignatius of Antioch, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-02-02) (mass ("and Purification of BVM")) (cls (2)) (colour ("white")) (praef ("Nativity"))) + ((date 2027-02-03) (mass ("St. Blaise, Bishop & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-02-04) (mass ("St. Andrew Corsini, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-02-05) (mass ("St. Agatha, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-02-06) (mass ("St. Titus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-02-07) (mass ("Quinquagesima")) (cls (2)) (colour ("violet")) (praef ("Holy Trinity"))) + ((date 2027-02-08) (mass ("St. John of Matha, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-02-09) (mass ("St. Cyril, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-02-10) (mass ("and Ash Wednesday")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-11) (mass ("Thursday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-12) (mass ("Friday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-13) (mass ("Saturday after Ash Wednesday")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-14) (mass ("1st Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-15) (mass ("Monday after the 1st Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-16) (mass ("Tuesday after the 1st Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-17) (mass ("Ember Wednesday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-18) (mass ("Thursday after the 1st Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-19) (mass ("Ember Friday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-20) (mass ("Ember Saturday of Lent")) (cls (2)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-21) (mass ("2nd Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-22) (mass ("Chair of St. Peter")) (cls (2)) (colour ("white")) (praef ("Apostles"))) + ((date 2027-02-23) (mass ("Tuesday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-24) (mass ("St. Matthias, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-02-25) (mass ("Thursday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-26) (mass ("Friday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-27) (mass ("Saturday after the 2nd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-02-28) (mass ("3rd Sunday of Lent")) (cls (1)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-01) (mass ("Monday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-02) (mass ("Wednesday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-03) (mass ()) (cls ()) (colour ()) (praef ())) + ((date 2027-03-04) (mass ("Thursday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-05) (mass ("Friday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-06) (mass ("Saturday after the 3rd Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-07) (mass ("4th Sunday of Lent \226\128\147 L\195\166tare Sunday")) (cls (1)) (colour ("rose")) (praef ("Lent"))) + ((date 2027-03-08) (mass ("Monday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-09) (mass ("Tuesday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-10) (mass ("Wednesday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-11) (mass ("Thursday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-12) (mass ("Friday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-13) (mass ("Saturday after the 4th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Lent"))) + ((date 2027-03-14) (mass ("Passion Sunday")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-15) (mass ("Monday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-16) (mass ("Tuesday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-17) (mass ("Wednesday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-18) (mass ("Thursday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-19) (mass ("St. Joseph, Spouse of the BVM")) (cls (1)) (colour ("white")) (praef ("St. Joseph"))) + ((date 2027-03-20) (mass ("Saturday after the 5th Sunday of Lent")) (cls (3)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-21) (mass ("and Palm Sunday")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-22) (mass ("Monday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-23) (mass ("Tuesday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-24) (mass ("Wednesday of Holy Week")) (cls (1)) (colour ("violet")) (praef ("Holy Cross"))) + ((date 2027-03-25) (mass ("Holy Thursday")) (cls (1)) (colour ("white")) (praef ("Holy Cross"))) + ((date 2027-03-26) (mass ("Good Friday")) (cls (1)) (colour ("black")) (praef ())) + ((date 2027-03-27) (mass ("and Easter Vigil Mass (circa midnight)")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-03-28) (mass ("Easter Sunday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-03-29) (mass ("Easter Monday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-03-30) (mass ("Easter Tuesday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-03-31) (mass ("Easter Wednesday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-01) (mass ("Easter Thursday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-02) (mass ("Easter Friday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-03) (mass ("Easter Saturday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-04) (mass ("Low Sunday")) (cls (1)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-05) (mass ("Annunciation of the BVM")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2027-04-06) (mass ("Feria - First Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-07) (mass ("Feria - First Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-08) (mass ("Feria - First Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-09) (mass ("Feria - First Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-10) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-04-11) (mass ("Second Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-12) (mass ("Feria - Second Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-13) (mass ("St.Hermenegild, Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2027-04-14) (mass ("St. Justin, Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2027-04-15) (mass ("Feria - Second Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-16) (mass ("Feria - Second Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-17) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-04-18) (mass ("Third Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-19) (mass ("Feria - Third Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-20) (mass ("Feria - Third Sunday after Easter")) (cls (4)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-21) (mass ("St. Anselm, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-22) (mass ("Ss. Soter & Cajus, Popes & Martyrs")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2027-04-23) (mass ("St. George, Martyr")) (cls (4)) (colour ("red")) (praef ("Easter"))) + ((date 2027-04-24) (mass ("St. Fidelis. Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2027-04-25) (mass ("Fourth Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-26) (mass ("Ss. Cletus & Marcellinus, Popes & Martyrs")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2027-04-27) (mass ("St. Peter Canisius, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-28) (mass ("St. Paul of the Cross, Confessor")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2027-04-29) (mass ("St. Peter of Verona, Martyr")) (cls (3)) (colour ("red")) (praef ("Easter"))) + ((date 2027-04-30) (mass ("St. Catherine of Siena, Virgin")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2027-05-01) (mass ("St. Joseph the Workman, Confessor")) (cls (1)) (colour ("white")) (praef ("St. Joseph"))) + ((date 2027-05-02) (mass ("5th Sunday after Easter")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2027-05-03) (mass ("Ss. Alexander, Eventius, & Theodulus, Martyrs")) (cls (4)) (colour ("red")) (praef ("Easter"))) + ((date 2027-05-04) (mass ("St. Monica, Widow")) (cls (3)) (colour ("white")) (praef ("Easter"))) + ((date 2027-05-05) (mass ("Vigil of Ascension")) (cls (2)) (colour ("white")) (praef ("Easter"))) + ((date 2027-05-06) (mass ("Ascension of Our Lord")) (cls (1)) (colour ("white")) (praef ("Ascension"))) + ((date 2027-05-07) (mass ("St. Stanislaus, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Ascension"))) + ((date 2027-05-08) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-05-09) (mass ("Sunday after the Ascension")) (cls (2)) (colour ("white")) (praef ("Ascension"))) + ((date 2027-05-10) (mass ("St. Antoninus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Ascension"))) + ((date 2027-05-11) (mass ("Ss. Philip & James, Apostles")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-05-12) (mass ("Ss. Nereus, Achilleus, Domitila, & Pancras, Martyrs")) (cls (3)) (colour ("red")) (praef ("Ascension"))) + ((date 2027-05-13) (mass ("St. Robert Bellarmine, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Ascension"))) + ((date 2027-05-14) (mass ("St. Boniface, Martyr")) (cls (4)) (colour ("red")) (praef ("Ascension"))) + ((date 2027-05-15) (mass ("Vigil of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2027-05-16) (mass ("Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2027-05-17) (mass ("Monday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2027-05-18) (mass ("Tuesday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2027-05-19) (mass ("Ember Wednesday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2027-05-20) (mass ("Thursday after Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2027-05-21) (mass ("Ember Friday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2027-05-22) (mass ("Ember Saturday of Pentecost")) (cls (1)) (colour ("red")) (praef ("Holy Spirit"))) + ((date 2027-05-23) (mass ("Trinity Sunday")) (cls (1)) (colour ("white")) (praef ("Holy Trinity"))) + ((date 2027-05-24) (mass ("Feria - First Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-05-25) (mass ("St. Gregory VII, Pope & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-05-26) (mass ("St. Philip Neri, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-05-27) (mass ("Corpus Christi")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2027-05-28) (mass ("St. Augustine of Canterbury, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-05-29) (mass ("St. Mary Magdalen de Pazzi, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-05-30) (mass ("Second Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-05-31) (mass ("Queenship of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2027-06-01) (mass ("St. Angela Merici, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-02) (mass ("Ss. Marcellinus, Peter, & Erasmus, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-06-03) (mass ("Feria - Second Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-06-04) (mass ("Most Sacred Heart of Jesus")) (cls (1)) (colour ("white")) (praef ("Sacred Heart"))) + ((date 2027-06-05) (mass ("St. Boniface, Bishop & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-06-06) (mass ("Third Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-06-07) (mass ("Feria - Third Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-06-08) (mass ("Feria - Third Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-06-09) (mass ("Ss. Primus & Felician, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-06-10) (mass ("St. Margaret, Queen of Scotland, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-11) (mass ("St. Barnabas, Apostle")) (cls (3)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-06-12) (mass ("St. John of San Facundo, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-13) (mass ("Fourth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-06-14) (mass ("St. Basil the Great, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-15) (mass ("Ss. Vitus, Modestus, & Crescentia, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-06-16) (mass ("Feria - Fourth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-06-17) (mass ("St. Gregory Barbarigo, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-18) (mass ("St. Ephrem of Syria, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-19) (mass ("St. Juliana Falconieri, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-20) (mass ("Fifth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-06-21) (mass ("St. Aloysius Gonzaga, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-22) (mass ("St. Paulinus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-23) (mass ("Vigil of Nativity of St. John the Baptist")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2027-06-24) (mass ("Nativity of St. John the Baptist")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-25) (mass ("St. William, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-06-26) (mass ("Ss. John & Paul, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-06-27) (mass ("Sixth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-06-28) (mass ("Vigil of Ss. Peter & Paul")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2027-06-29) (mass ("Ss. Peter & Paul, Apostles")) (cls (1)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-06-30) (mass ("Commemoration of St. Paul, Apostle")) (cls (3)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-07-01) (mass ("Most Precious Blood of Our Lord")) (cls (1)) (colour ("red")) (praef ("Holy Cross"))) + ((date 2027-07-02) (mass ("Visitation of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2027-07-03) (mass ("St. Irenaeus, Doctor of the Church")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-07-04) (mass ("Seventh Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-07-05) (mass ("St. Anthony Mary Zaccaria, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-06) (mass ("St. Maria Goretti, Virgin Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-07-07) (mass ("Ss. Cyril & Methodius, Bishops & Confessors")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-08) (mass ("St. Elizabeth of Portugal, Queen & Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-09) (mass ("Feria - Seventh Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-07-10) (mass ("Seven Holy Brothers, & Ss. Rufina & Secunda, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-07-11) (mass ("Eighth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-07-12) (mass ("St. John Gualbert, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-13) (mass ("Feria - Eighth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-07-14) (mass ("St. Bonaventure, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-15) (mass ("St. Henry II, Emperor, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-16) (mass ("Our Lady of Mt. Carmel")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-07-17) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-07-18) (mass ("Ninth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-07-19) (mass ("St. Vincent de Paul, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-20) (mass ("St. Jerome Emiliani, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-21) (mass ("St. Lawrence of Brindisi, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-22) (mass ("St. Mary Magdalene, Penitent")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-23) (mass ("St. Apollinarus, Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-07-24) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-07-25) (mass ("Tenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-07-26) (mass ("St. Anne, Mother of the BVM")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-27) (mass ("St. Pantaleon, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-07-28) (mass ("Ss. Nazarius & Celsus, Martyrs, Victor I, Pope & Martyr,")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-07-29) (mass ("St. Martha, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-07-30) (mass ("Ss. Abdon & Sennen, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-07-31) (mass ("St. Ignatius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-01) (mass ("Eleventh Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-08-02) (mass ("St. Alphonsus of Liguori, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-03) (mass ("The Finding of the Body of St. Stephen")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-08-04) (mass ("St. Dominic, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-05) (mass ("Our Lady of the Snows")) (cls (3)) (colour ("white")) (praef ("BVM"))) + ((date 2027-08-06) (mass ("Transfiguration of Our Lord")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-07) (mass ("St. Cajetan, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-08) (mass ("Twelfth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-08-09) (mass ("St. Romanus, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-08-10) (mass ("St. Lawrence, Deacon & Martyr")) (cls (2)) (colour ("red")) (praef ("Common"))) + ((date 2027-08-11) (mass ("Ss. Tiburtius & Susanna, Virgin, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-08-12) (mass ("St. Clare, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-13) (mass ("Ss. Hippolytus & Cassian, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-08-14) (mass ("Vigil of the Assumption")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2027-08-15) (mass ("Assumption of the BVM")) (cls (1)) (colour ("white")) (praef ("BVM"))) + ((date 2027-08-16) (mass ("St. Joachim, Father of the BVM")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-17) (mass ("St. Hyacinth of Poland, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-18) (mass ("St. Agapitus, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-08-19) (mass ("St. John Eudes, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-20) (mass ("St. Bernard of Clairvaux, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-21) (mass ("St. Jane Frances de Chantal, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-22) (mass ("Fourteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-08-23) (mass ("St. Philip Benizi, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-24) (mass ("St. Bartholomew, Apostle")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-08-25) (mass ("St. Louis IX, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-26) (mass ("St. Zephirynus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-08-27) (mass ("St. Joseph Calasanctius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-28) (mass ("St. Augustine, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-29) (mass ("Fifteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-08-30) (mass ("St. Rose of Lima, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-08-31) (mass ("St. Raymond Nonnatus, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-09-01) (mass ("St. Giles, Abbot")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2027-09-02) (mass ("St. Stephen, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-09-03) (mass ("St. Pius X, Pope & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-09-04) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-09-05) (mass ("Sixteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-09-06) (mass ("Feria - Sixteenth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-09-07) (mass ("Feria - Sixteenth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-09-08) (mass ("Nativity of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2027-09-09) (mass ("St. Gorgonius, Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-09-10) (mass ("St. Nicholas of Tolentino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-09-11) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-09-12) (mass ("Seventeenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-09-13) (mass ("Feria - Seventeenth Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-09-14) (mass ("Exaltation of the Holy Cross")) (cls (2)) (colour ("red")) (praef ("Holy Cross"))) + ((date 2027-09-15) (mass ("Seven Sorrows of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2027-09-16) (mass ("St. Cornelius, Pope, & St. Cyprian, Bishop, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-09-17) (mass ("Stigmata of St. Francis")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2027-09-18) (mass ("St. Joseph of Cupertino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-09-19) (mass ("Eighteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-09-20) (mass ("St. Eustace & Companions, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-09-21) (mass ("St. Matthew, Apostle & Evangelist")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-09-22) (mass ("Ember Wednesday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2027-09-23) (mass ("St. Linus, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-09-24) (mass ("Ember Friday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2027-09-25) (mass ("Ember Saturday")) (cls (2)) (colour ("violet")) (praef ("Common"))) + ((date 2027-09-26) (mass ("Nineteenth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-09-27) (mass ("Ss. Cosmas & Damian, Martyrs")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-09-28) (mass ("St. Wenceslaus, Duke, Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-09-29) (mass ("St. Michael the Archangel")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2027-09-30) (mass ("St. Jerome, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-01) (mass ("St. Remigius, Bishop & Confessor")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-02) (mass ("Holy Guardian Angels")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-03) (mass ("Twentieth Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-10-04) (mass ("St. Francis of Assisi, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-05) (mass ("Ss. Placid & Companions, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-10-06) (mass ("St. Bruno, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-07) (mass ("Our Lady of the Rosary")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2027-10-08) (mass ("St. Bridget, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-09) (mass ("St. John Leonard, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-10) (mass ("Twenty-first Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-10-11) (mass ("Maternity of the BVM")) (cls (2)) (colour ("white")) (praef ("BVM"))) + ((date 2027-10-12) (mass ("Feria - Twenty-first Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-10-13) (mass ("St. Edward, King, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-14) (mass ("St. Callistus I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-10-15) (mass ("St. Teresa of Avila, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-16) (mass ("St. Hedwig, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-17) (mass ("Twenty-second Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-10-18) (mass ("St. Luke the Evangelist")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-10-19) (mass ("St. Peter of Alcantara, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-20) (mass ("St. John Cantius, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-21) (mass ("St. Hilarion, Abbot")) (cls (4)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-22) (mass ("Feria - Twenty-second Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-10-23) (mass ("St. Anthony Mary Claret, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-10-24) (mass ("Twenty-third Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-10-25) (mass ("Ss. Chrysanthus & Darius, Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-10-26) (mass ("St. Evaristus, Pope & Martyr")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-10-27) (mass ("Feria - Twenty-third Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-10-28) (mass ("Ss. Simon & Jude, Apostles")) (cls (2)) (colour ("red")) (praef ("Apostles"))) + ((date 2027-10-29) (mass ("Feria - Twenty-third Sunday after Pentecost")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-10-30) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-10-31) (mass ("Christ the King")) (cls (1)) (colour ("white")) (praef ("Christ the King"))) + ((date 2027-11-01) (mass ("All Saints")) (cls (1)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-02) (mass ("All Souls - Mass 1")) (cls (1)) (colour ("black")) (praef ("For the Dead"))) + ((date 2027-11-03) (mass ("Feria - Resumed 4th Sunday after Epiphany")) (cls (4)) (colour ("green")) (praef ("Common"))) + ((date 2027-11-04) (mass ("St. Charles Borromeo, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-05) (mass ("The Holy Relics")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-11-06) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) + ((date 2027-11-07) (mass ("Resumed 5th Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-11-08) (mass ("Four Holy Crowned Martyrs")) (cls (4)) (colour ("red")) (praef ("Common"))) + ((date 2027-11-09) (mass ("Dedication of the Archbasilica of Our Holy Savior")) (cls (2)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-10) (mass ("St. Andrew Avellino, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-11) (mass ("St. Martin of Tours, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-12) (mass ("St. Martin I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-11-13) (mass ("St. Didacus, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-14) (mass ("Resumed 6th Sunday after Epiphany")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-11-15) (mass ("St. Albert the Great, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-16) (mass ("St. Gertrude, Virgin")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-17) (mass ("St. Gregory Thaumaturgus, Bishop & Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-18) (mass ("Dedication of the Basilicas of Ss. Peter & Paul")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-19) (mass ("St. Elizabeth of Hungary, Widow")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-20) (mass ("St. Felix of Valois, Confessor")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-21) (mass ("Last Sunday after Pentecost")) (cls (2)) (colour ("green")) (praef ("Holy Trinity"))) + ((date 2027-11-22) (mass ("St. Cecilia, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-11-23) (mass ("St. Clement I, Pope & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-11-24) (mass ("St. John of the Cross, Doctor of the Church")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-25) (mass ("St. Catherine of Alexandria, Virgin & Martyr")) (cls (3)) (colour ("red")) (praef ("Common"))) + ((date 2027-11-26) (mass ("St. Sylvester, Abbot")) (cls (3)) (colour ("white")) (praef ("Common"))) + ((date 2027-11-27) (mass ("Saturday of Our Lady")) (cls (4)) (colour ("white")) (praef ("BVM"))) +) diff --git a/test/test_colitur.ml b/test/test_colitur.ml index 7708fef..9eefecd 100644 --- a/test/test_colitur.ml +++ b/test/test_colitur.ml @@ -17,6 +17,8 @@ let () = Test_differential.suite; Test_oracle.suite; Test_oracle.suite_2038; Test_oracle.suite_2035; Test_lms_ordo.suite_2023_2024; Test_lms_ordo.suite_2024_2025; Test_lms_ordo.suite_2025_2026; Test_lms_ordo.suite_allow_list; Test_fiuv_ordo.suite; + Test_efdotorg_ordo.suite_2024_2025; Test_efdotorg_ordo.suite_2025_2026; Test_efdotorg_ordo.suite_2026_2027; + Test_efdotorg_ordo.suite_allow_list; Test_golden.suite; ("lectionary", Test_lectionary.suite); ("lectionary-ef", Test_lectionary_ef.suite); diff --git a/test/test_efdotorg_ordo.ml b/test/test_efdotorg_ordo.ml new file mode 100644 index 0000000..6200cd9 --- /dev/null +++ b/test/test_efdotorg_ordo.ml @@ -0,0 +1,403 @@ +(* efdotorg-preface task (2026-08-24-colitur-celebrant-rubrics-phase1): the + THIRD independent preface witness, extraordinaryform.org's own three + annual Ordo editions (2024-2025, 2025-2026, 2026-2027). A prior task + (2026-08-21-colitur-celebrant-rubrics-phase1, see + .superpowers/sdd/2026-08-21-colitur-celebrant-rubrics-phase1/preface- + witnesses-report.md) DECLINED to wire this source in, for two reasons: + an unexplained "Advent" label in the preface column, and this corpus's + own known Vigil-of-St-Lawrence gap. Both are now characterisation work, + not blockers -- see tools/extract_efdotorg_ordo.py's own header for the + full account this file's own comparator relies on. + + WHY THIS LAYER IS DIFFERENT FROM test_fiuv_ordo.ml/test_lms_ordo.ml: + this source prints ONE preface value per day (unlike the LMS Ordo's own + option lists), already reduced to the day's own real OFFICE by the + menu-trap filter baked into the generator (see that script's own + header, finding 1) -- so the comparison here is a single equality + check per day, not a membership check. It is also the only one of the + three witnesses whose own JSON, not a fresh pdftotext dump, is the + input -- the JSON is already fidelity-audited + (.superpowers/ordo-fidelity-report.md, 1091/1091 against an + independently-written parser) and is treated as the source; this file + does not re-parse the PDFs. + + SCOPE: preface only (RG 482-499, {!Rite_ef.Rubrics_ef.preface}) -- this + source carries no Creed/Gloria/Te Deum data at all + (docs/research/ordo/PROVENANCE-ordo-corpus.md: "The extraordinaryform.org + editions carry NO Gloria or Creed"), so there is nothing else to + compare it against. *) + +module Cal = Colitur_kernel.Calendar +module Layer = Colitur_kernel.Layer +module Overlay = Colitur_kernel.Overlay +module LD = Colitur_kernel.Liturgical_day +module Date = Colitur_kernel.Date +module V = Rite_ef.Vocab_ef +module Preface = Colitur_kernel.Preface + +let sanctoral_path = "../data/ef/sanctoral.sexp" +let adjustments_path = "../data/ef/adjustments.sexp" + +(* Duplicated, not shared -- test_fiuv_ordo.ml/test_lms_ordo.ml's own + identical function carries the same "no shared .mli" reasoning. *) +let sha256_of_file path = + let tmp = Filename.temp_file "colitur_efdotorg_ordo_sha256" ".txt" in + Fun.protect + ~finally:(fun () -> try Sys.remove tmp with Sys_error _ -> ()) + (fun () -> + let cmd = Printf.sprintf "sha256sum %s > %s" (Filename.quote path) (Filename.quote tmp) in + let rc = Sys.command cmd in + if rc <> 0 then Alcotest.failf "sha256sum exited %d for %s (is it on PATH?)" rc path; + let ic = open_in tmp in + let line = + try input_line ic + with End_of_file -> + close_in ic; + Alcotest.failf "sha256sum produced no output for %s" path + in + close_in ic; + match String.index_opt line ' ' with + | Some i -> String.sub line 0 i + | None -> Alcotest.failf "unexpected sha256sum output for %s: %S" path line) + +let real_layer () = + let layer = + match Layer.load V.rank_of_sexp sanctoral_path with + | Ok l -> l + | Error e -> Alcotest.failf "%s: failed to load: %s" sanctoral_path e + in + let overlay = + match Overlay.load V.rank_of_sexp adjustments_path with + | Ok o -> o + | Error e -> Alcotest.failf "%s: failed to load: %s" adjustments_path e + in + let layer, diagnostics = Overlay.apply layer overlay in + Alcotest.(check (list string)) "the committed overlay applies cleanly, no diagnostics" [] + (List.map Overlay.diagnostic_to_string diagnostics); + layer + +let real_lectionary () = + match Colitur_kernel.Lectionary.load "../data/ef/lectionary.sexp" with + | Ok l -> l + | Error e -> Alcotest.failf "../data/ef/lectionary.sexp: failed to load: %s" e + +let real_commons () = + match Rite_ef.Lectionary_ef.Commons.load "../data/ef/commons.sexp" with + | Ok c -> c + | Error e -> Alcotest.failf "../data/ef/commons.sexp: failed to load: %s" e + +(* ---------------------------------------------------------------------- *) +(* The Ordo side: the sexp row, mirrored from tools/extract_efdotorg_ordo.py's *) +(* own row shape. *) +(* ---------------------------------------------------------------------- *) + +open Sexplib0.Sexp_conv + +type ordo_row = { date : string; mass : string option; cls : int option; colour : string option; praef : string option } +[@@deriving sexp] + +let ordo_rows fixture_path = + let sexp = + try Sexplib.Sexp.load_sexp fixture_path + with e -> Alcotest.failf "%s: failed to load: %s" fixture_path (Printexc.to_string e) + in + list_of_sexp ordo_row_of_sexp sexp + +(* ---------------------------------------------------------------------- *) +(* The colitur side, over the same window -- mirrors test_fiuv_ordo.ml's *) +(* own [colitur_rows]. *) +(* ---------------------------------------------------------------------- *) + +type colitur_row = { c_date : string; c_weekday : Date.weekday; c_preface : Preface.t option } + +let colitur_rows ~year_lo ~year_hi ~window_first ~window_last = + let layer = real_layer () in + let rite = Rite_ef.context ~lectionary:(real_lectionary ()) ~commons:(real_commons ()) in + let by_rata : (int, (V.season, V.rank) LD.t) Hashtbl.t = Hashtbl.create 800 in + for y = year_lo to year_hi do + let days = Cal.year rite layer y in + Array.iter (fun (d : (V.season, V.rank) LD.t) -> Hashtbl.replace by_rata (Date.to_rata d.LD.date) d) days + done; + let mk s = match Date.of_iso8601 s with Ok d -> d | Error e -> Alcotest.failf "%s: %s" s e in + let rows = ref [] in + let d = ref (mk window_first) in + let stop = mk window_last in + while Date.compare !d stop <= 0 do + (match Hashtbl.find_opt by_rata (Date.to_rata !d) with + | Some day -> + rows := + { c_date = Date.to_iso8601 day.LD.date; c_weekday = Date.weekday day.LD.date; c_preface = day.LD.preface } + :: !rows + | None -> Alcotest.failf "no colitur day resolved for %s" (Date.to_iso8601 !d)); + d := Date.add_days !d 1 + done; + List.rev !rows + +(* ---------------------------------------------------------------------- *) +(* Classification -- see tools/extract_efdotorg_ordo.py's own header, *) +(* finding 3, for why "Advent" needs the day's own weekday rather than a *) +(* static table entry: RG 494(b) grants the TRINITY preface on every *) +(* Advent SUNDAY, RG 498 the residual COMMON on every Advent FERIA, and *) +(* this source's own "Advent" label does not distinguish the two. Every *) +(* other raw value maps 1:1 onto exactly one {!Preface.t} constructor -- *) +(* verified exhaustive over the whole 1091-day office-selected population *) +(* while building this comparison (16 distinct raw values: these 14 fixed *) +(* mappings, "Advent" itself, and [None]) -- unlike the FIUV/LMS sources, *) +(* nothing here is genuinely unclassifiable. *) +(* ---------------------------------------------------------------------- *) + +let classify_praef ~(weekday : Date.weekday) (raw : string) : Preface.t option = + match raw with + | "Common" -> Some Preface.Common + | "For the Dead" -> Some Preface.Requiem + | "Easter" -> Some Preface.Easter + | "Lent" -> Some Preface.Lent + | "BVM" -> Some Preface.Bvm + | "Holy Trinity" -> Some Preface.Trinity + | "Holy Cross" -> Some Preface.Holy_cross + | "Nativity" -> Some Preface.Nativity + | "Apostles" -> Some Preface.Apostles + | "Ascension" -> Some Preface.Ascension + | "Holy Spirit" -> Some Preface.Holy_spirit + | "Epiphany" -> Some Preface.Epiphany + | "St. Joseph" -> Some Preface.St_joseph + | "Sacred Heart" -> Some Preface.Sacred_heart + | "Christ the King" -> Some Preface.Christ_the_king + | "Advent" -> Some (if weekday = Date.Sun then Preface.Trinity else Preface.Common) + | _ -> None + +(* ---------------------------------------------------------------------- *) +(* data/ef/expected-divergences-efdotorg.sexp -- same shape as the other *) +(* Ordo allow-lists' own [allow_entry]. A SEPARATE file: this Ordo is a *) +(* FIFTH lineage (lectio/missalemeum, LMS, FIUV, and now this one), a *) +(* different publisher and a different compiler from all three others. *) +(* ---------------------------------------------------------------------- *) + +type allow_entry = { id : string; citation : string; verdict : string; note : string; expected_rows : int } +[@@deriving sexp] + +let load_allow_list allow_list_path = + let sexps = + try Sexplib.Sexp.load_sexps allow_list_path + with e -> Alcotest.failf "%s: failed to load: %s" allow_list_path (Printexc.to_string e) + in + List.map allow_entry_of_sexp sexps + +let allow_list_path = "../data/ef/expected-divergences-efdotorg.sexp" + +(* ---------------------------------------------------------------------- *) +(* [make_suite]: one edition's worth of tests, parameterised -- mirrors *) +(* test_lms_ordo.ml's own shape. *) +(* ---------------------------------------------------------------------- *) + +let make_suite ~label ~fixture_path ~fixture_sha256 ~window_first ~window_last ~year_lo ~year_hi ~expected_rows + ~expected_no_data ~allow_list_id_for_date = + let test_fixture_checksum () = + Alcotest.(check string) "fixture SHA-256 matches its provenance note" fixture_sha256 + (sha256_of_file fixture_path) + in + let test_dates_align () = + let ordo = ordo_rows fixture_path in + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + Alcotest.(check int) (Printf.sprintf "the Ordo fixture has %d rows (%s..%s)" expected_rows window_first window_last) + expected_rows (List.length ordo); + Alcotest.(check int) "colitur resolved the same number of days" (List.length ordo) (List.length colitur); + (match ordo with o :: _ -> Alcotest.(check string) "first date" window_first o.date | [] -> Alcotest.fail "empty"); + (match List.rev ordo with + | o :: _ -> Alcotest.(check string) "last date" window_last o.date + | [] -> Alcotest.fail "empty"); + let mismatched = + List.filter_map + (fun (o, c) -> if String.equal o.date c.c_date then None else Some (o.date, c.c_date)) + (List.combine ordo colitur) + in + Alcotest.(check (list (pair string string))) "no misaligned dates" [] mismatched + in + (* This window's own Good Friday(s), RE-DERIVED from + {!Colitur_kernel.Computus.gregorian_easter} for every civil year the + window touches (never hardcoded), plus this edition's own share of + the single known SOURCE GAP (2027-03-03) -- the only two shapes a row + can have no [praef] at all for (see tools/extract_efdotorg_ordo.py's + own header, findings 2 and 5). *) + let window_no_praef () = + let first_year = int_of_string (String.sub window_first 0 4) in + let last_year = int_of_string (String.sub window_last 0 4) in + let good_fridays = + List.map + (fun y -> Date.to_iso8601 (Date.add_days (Colitur_kernel.Computus.gregorian_easter y) (-2))) + (List.init (last_year - first_year + 1) (fun i -> first_year + i)) + in + let candidates = good_fridays @ [ "2027-03-03" ] in + List.filter (fun d -> String.compare d window_first >= 0 && String.compare d window_last <= 0) candidates + |> List.sort_uniq String.compare + in + let test_praef_coverage () = + let ordo = ordo_rows fixture_path in + let no_praef = List.filter (fun o -> o.praef = None) ordo in + let expected = window_no_praef () in + Alcotest.(check int) "the no-praef population matches this window's own Good-Friday-plus-source-gap count" + expected_no_data (List.length no_praef); + Alcotest.(check (list string)) "every no-praef row is either this window's own Good Friday or the known source gap" + expected (List.map (fun o -> o.date) no_praef) + in + let describe_praef_mismatch (o : ordo_row) (c : colitur_row) (expected : Preface.t) = + Printf.sprintf "%s %S: colitur preface=%s, %s praef=%S (classified %s, weekday %s)" o.date + (Option.value o.mass ~default:"?") + (match c.c_preface with Some p -> Preface.to_string p | None -> "NONE") + label (Option.get o.praef) (Preface.to_string expected) (Date.weekday_to_string c.c_weekday) + in + let test_praef_matches_or_is_explained () = + let ordo = ordo_rows fixture_path in + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + let allow_list = load_allow_list allow_list_path in + let by_id = List.map (fun e -> (e.id, e)) allow_list in + let unexplained = ref [] in + let unclassifiable = ref [] in + let explained_counts = Hashtbl.create 8 in + List.iter2 + (fun (o : ordo_row) (c : colitur_row) -> + if not (String.equal o.date c.c_date) then Alcotest.failf "misaligned: ordo %s vs colitur %s" o.date c.c_date; + match o.praef with + | None -> () + | Some raw -> ( + match classify_praef ~weekday:c.c_weekday raw with + | None -> unclassifiable := o.date :: !unclassifiable + | Some expected -> + if c.c_preface = Some expected then () + else + match allow_list_id_for_date o.date with + | Some id -> + Hashtbl.replace explained_counts id (1 + try Hashtbl.find explained_counts id with Not_found -> 0) + | None -> unexplained := describe_praef_mismatch o c expected :: !unexplained)) + ordo colitur; + Alcotest.(check (list string)) + (Printf.sprintf "[%s] every preface mismatch is named in the allow-list -- none unexplained" label) + [] (List.rev !unexplained); + Alcotest.(check (list string)) + (Printf.sprintf "[%s] every raw praef value classifies -- none dropped" label) + [] (List.rev !unclassifiable); + Hashtbl.iter + (fun id n -> + match List.assoc_opt id by_id with + | None -> Alcotest.failf "allow-list entry %s used by the comparator but not declared in %s" id allow_list_path + | Some e -> Alcotest.(check int) (Printf.sprintf "%s: expected_rows matches the actual count" id) e.expected_rows n) + explained_counts + in + (* The known Vigil-of-St-Lawrence corpus gap (tools/extract_efdotorg_ordo.py's + own header, finding 4; docs/research/ordo/PROVENANCE-ordo-corpus.md; + .superpowers/ordo-class-report.md) is RECONFIRMED present, but its + effect on THIS axis now differs by year -- checked per date, not + assumed uniform, because colitur's own CURRENT behaviour (RG 33's + third trigger, which landed after the reports above were written -- + CLAUDE.md's own warning that `day`/`readings` output is not stable + across commits is exactly this) already omits the vigil in SOME of + these years for its own, entirely independent reason: + - 2025-08-09 (Saturday): colitur's own RG33-third-trigger ALSO + omits the vigil this year (RG 78's BVM Saturday Office wins + outright), and Rule A (this generator's own finding 6) picks the + SAME office from the corpus's own listing -- a full, direct + match (office identity AND preface), not a lucky coincidence + limited to preface alone. + - 2027-08-09 (Monday): colitur's own vigil IS genuinely observed + this year (RG33's trigger does not fire); the corpus still shows + no trace of it at all -- STILL the known gap, reconfirmed, naming + St Romanus instead -- but both the true Vigil (Class3, no + title-preface trigger) and the corpus's own substitute fall + through RG 482's chain to the identical Common preface, so the + identity error stays invisible to this one axis. Asserted + POSITIVELY (not merely "no failure occurred") so a future change + giving either office a real trigger would surface here. + - 2026-08-09 (Sunday): the vigil is impeded on every source (a + Sunday outranks a Class3 vigil outright); no special case is + needed and none is asserted here. *) + let test_known_vigil_of_st_lawrence_shape () = + let ordo = ordo_rows fixture_path in + let colitur = colitur_rows ~year_lo ~year_hi ~window_first ~window_last in + let by_date = List.combine ordo colitur in + let find d = List.find_opt (fun ((o : ordo_row), _) -> String.equal o.date d) by_date in + let in_window d = String.compare d window_first >= 0 && String.compare d window_last <= 0 in + (match find "2025-08-09" with + | Some (o, c) when in_window "2025-08-09" -> + Alcotest.(check (option string)) "2025-08-09: Rule A selects the BVM Saturday Office directly" (Some "BVM") + o.praef; + Alcotest.(check (option string)) + "2025-08-09: colitur's own answer is the same office (RG33 3rd trigger + RG78)" (Some "bvm") + (Option.map Preface.to_string c.c_preface) + | _ -> ()); + match find "2027-08-09" with + | Some (o, c) when in_window "2027-08-09" -> + Alcotest.(check (option string)) + "2027-08-09: the known gap is reconfirmed -- the corpus still shows no Vigil of St Lawrence" + (Some "Common") o.praef; + Alcotest.(check (option string)) + "2027-08-09: colitur's own real Vigil office also reads Common -- the identity error stays invisible here" + (Some "common") (Option.map Preface.to_string c.c_preface) + | _ -> () + in + ( label, + [ Alcotest.test_case "fixture SHA-256 matches its provenance note" `Quick test_fixture_checksum; + Alcotest.test_case "streams are N rows each, dates aligned 1:1" `Quick test_dates_align; + Alcotest.test_case "no-praef population matches Good Friday plus the known source gap" `Quick + test_praef_coverage; + Alcotest.test_case "every preface mismatch is named in the allow-list -- none unexplained" `Quick + test_praef_matches_or_is_explained; + Alcotest.test_case "the known Vigil-of-St-Lawrence gap: reconfirmed in 2027, resolved by Rule A in 2025" `Quick + test_known_vigil_of_st_lawrence_shape + ] ) + +(* The seven adjudicated root causes behind this comparison's own 11 row- + level divergences (three editions combined) -- see + data/ef/expected-divergences-efdotorg.sexp for the full citation of + each. Date-keyed, the same discipline test_lms_ordo.ml's own + [allow_list_id_for_date] and test_fiuv_ordo.ml's own + [fiuv_allow_list_id_for_date] use, and for the identical reason: an + entry that starts firing on an unexpected new date must be visible as + a real change, not silently absorbed. Shared across all three editions + (unlike the LMS file's per-window function) because every id here is + adjudicated against colitur's own DATA or RULES, not against a single + edition's own printing quirk -- E1/E3/E4 each recur, unchanged, in + more than one edition. *) +let allow_list_id_for_date = function + | "2025-07-16" | "2026-07-16" | "2027-07-16" -> Some "E1" + | "2026-09-24" -> Some "E2" + | "2025-11-27" | "2026-11-27" -> Some "E3" + | "2025-05-06" | "2026-05-06" -> Some "E4" + | "2025-09-29" -> Some "E5" + | "2026-11-01" -> Some "E6" + | "2025-11-29" -> Some "E7" + | _ -> None + +let suite_2024_2025 = + make_suite ~label:"efdotorg-ordo-2024-2025" ~fixture_path:"fixtures/efdotorg-ordo-2024-2025.sexp" + ~fixture_sha256:"7de633e292fdb85415dd3ad87fcf9414fbb8f34c42772663b78e107e68c6e571" ~window_first:"2024-12-01" + ~window_last:"2025-11-29" ~year_lo:2023 ~year_hi:2026 ~expected_rows:364 ~expected_no_data:1 + ~allow_list_id_for_date + +let suite_2025_2026 = + make_suite ~label:"efdotorg-ordo-2025-2026" ~fixture_path:"fixtures/efdotorg-ordo-2025-2026.sexp" + ~fixture_sha256:"c810ec437cae9fde785f6b3453f77e667644fb82f465b3652040bb2a3b888b9b" ~window_first:"2025-11-30" + ~window_last:"2026-11-28" ~year_lo:2024 ~year_hi:2027 ~expected_rows:364 ~expected_no_data:1 + ~allow_list_id_for_date + +let suite_2026_2027 = + make_suite ~label:"efdotorg-ordo-2026-2027" ~fixture_path:"fixtures/efdotorg-ordo-2026-2027.sexp" + ~fixture_sha256:"19c35b45d7964dd357f92a871e81423af8217dff6c40178f3a95d3ec9c4091ea" ~window_first:"2026-11-29" + ~window_last:"2027-11-27" ~year_lo:2025 ~year_hi:2028 ~expected_rows:364 ~expected_no_data:2 + ~allow_list_id_for_date + +(* Guards against a stale allow-list entry, the same discipline + test_lms_ordo.ml's own [test_allow_list_ids_are_exactly_l4] uses: a + STATIC check that the sexp file's own declared ids are exactly this + set -- not a cross-edition "did every id actually fire" proof (neither + test_lms_ordo.ml nor test_fiuv_ordo.ml's own analogous guard attempts + that either; each edition's own [test_praef_matches_or_is_explained] + already fails loudly if an id fires the WRONG number of times, or if a + real divergence names an id that does not exist at all). *) +let test_allow_list_ids_are_exactly_e1_to_e7 () = + let ids = List.sort String.compare (List.map (fun e -> e.id) (load_allow_list allow_list_path)) in + Alcotest.(check (list string)) "the efdotorg allow-list declares exactly E1..E7" + [ "E1"; "E2"; "E3"; "E4"; "E5"; "E6"; "E7" ] ids + +let suite_allow_list = + ( "efdotorg-ordo-allow-list", + [ Alcotest.test_case "declares exactly E1..E7" `Quick test_allow_list_ids_are_exactly_e1_to_e7 ] ) diff --git a/tools/extract_efdotorg_ordo.py b/tools/extract_efdotorg_ordo.py new file mode 100644 index 0000000..05ef014 --- /dev/null +++ b/tools/extract_efdotorg_ordo.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +# tools/extract_efdotorg_ordo.py -- efdotorg-preface task +# (2026-08-24-colitur-celebrant-rubrics-phase1). Turns the ALREADY-PARSED +# extraordinaryform.org corpus (docs/research/ordo/ordo-2024-2027.json, +# 1091 days, produced by docs/research/ordo/parse_ordo.py and audited for +# fidelity in .superpowers/ordo-fidelity-report.md -- 1091/1091 against an +# independently-written parser) into three sexp fixtures, +# test/fixtures/efdotorg-ordo-{2024-2025,2025-2026,2026-2027}.sexp, one row +# per calendar day, mirroring how tools/extract_fiuv_ordo.ml and +# tools/extract_lms_ordo.ml shape their own fixtures. +# +# PYTHON, NOT OCAML -- same reasoning tools/extract_missalemeum_oracle.py's +# own header already gives: there is no JSON library in this project's +# frozen deps (dune alcotest qcheck qcheck-alcotest sexplib ppx_sexp_conv), +# and hand-writing one is out of scope ("no hand-written JSON parser" is +# about colitur's OWN sexp format, not a licence to reimplement JSON). The +# JSON itself is already the parsed artefact ("do not rebuild the parser" -- +# this script does not re-read the PDFs at all, only the JSON parse_ordo.py +# already produced from them). +# +# Usage: +# python3 tools/extract_efdotorg_ordo.py \ +# docs/research/ordo/ordo-2024-2027.json test/fixtures +# +# Writes the three fixtures named above into the given output directory. +# +# --------------------------------------------------------------------------- +# CHARACTERISATION (re-derived independently against the live JSON below, +# not copied from .superpowers/ordo-fidelity-report.md's own prose summary +# -- that report's own filter was RE-RUN here and its counts reproduced +# exactly, which is the independent confirmation, not a citation of trust): +# +# 1. THE MENU TRAP (element [0] is not reliably the day's own office). +# Re-derived over the whole 1091-day JSON: walk each day's Mass-option +# list; skip a leading entry whose `mass` starts with "Requiem:" (a +# votive Mass for the Dead, listed ahead of the real office on an +# unimpeded low-class day -- 99 instances, confirmed never the SOLE +# option and never followed by a second Requiem entry); then, if the +# NEXT entry's `mass` starts with "and " (a preliminary rite -- Blessing +# of Ashes/Palms, Candlemas, Holy Saturday's daytime office -- joined to +# its real companion Mass by that literal prefix), treat that next entry +# as the office instead (12 instances). 99 + 12 = 111, exactly the +# figure ordo-fidelity-report.md's own independent audit already found +# -- reproduced, not merely trusted. +# +# 2. THE "CHRIST THE KING" CLASSIFIER GAP -- a NEW finding, not in the +# prior fidelity audit. Of the 1091 office-selected rows, exactly 6 have +# `preface: null`: 3 Good Friday (genuinely no preface -- the +# 1955-restored Holy Week's Good Friday has no Mass at all, RG 28) and 3 +# Christ the King (25/26/31 October across the three editions). The +# latter is a real extraction-classifier gap, not a source blank: +# docs/research/ordo/parse_ordo.py's own hardcoded `PREFACES` set (its +# module-level constant) does not include "Christ the King" as a +# recognised preface name, so its own `opt()` function's `pref = f[0] if +# f and f[0] in PREFACES else None` falls through and files the literal +# string "Christ the King" into `comms` instead of `preface` -- checked +# directly against all three instances, `comms == ['Christ the King']` +# on every one, no other None-preface row has this shape. RECOVERED +# here (reading `comms` when `preface` is null and `comms` is exactly +# `['Christ the King']`), not silently left blank, and not a parser +# rewrite -- parse_ordo.py itself and its JSON output are untouched; +# this is a documented, characterised repair applied only inside this +# comparison-layer generator, reading a field the JSON already carries. +# +# 3. "ADVENT" IS NOT A PREFACE, AND NEITHER IS ITS MAPPING A CONSTANT. +# RG 484-499 name no Advent preface among the fourteen; this source's +# own "Advent" label is an informal convention (plausibly Novus-Ordo- +# influenced) covering BOTH of two genuinely different 1962 outcomes: +# - RG 494(b), "in dominicis Adventus... praefatio de Ss.ma +# Trinitate" -- every ADVENT SUNDAY takes the TRINITY preface as +# its own de-Tempore grant (lib/rites/rite_ef/rubrics_ef.ml's own +# [preface] function already implements this, cross-checked against +# the FIUV and LMS Ordos independently -- see that function's own +# header). Confirmed live in this JSON: "Advent" is the raw label on +# every Advent Sunday in the corpus too (11 of the 12 possible +# Advent-Sunday instances across three editions; the twelfth, +# 2024-12-08, is impeded by the Immaculate Conception, a fixed +# I-class BVM feast, and correctly carries "BVM" instead). +# - RG 498 (the residual Common) governs every Advent FERIA (a +# non-Sunday day with no proper of its own). +# So "Advent" is NOT simply "colitur's Common" (an earlier, declined +# version of this task's own reasoning) -- it is Trinity on a Sunday, +# Common otherwise, decided by the civil weekday alone (never by +# parsing this source's own text further, and never by trusting +# colitur's own answer circularly: the civil weekday is public, +# independently computable information). Encoded in the comparator +# (test/test_efdotorg_ordo.ml), not baked into this generator, because +# it needs the day's own weekday, which this fixture's `date` field +# already carries losslessly. +# +# 4. THE KNOWN VIGIL-OF-ST-LAWRENCE DEFECT (docs/research/ordo/ +# PROVENANCE-ordo-corpus.md, .superpowers/ordo-class-report.md) is +# RECONFIRMED present at the same two dates, unchanged: 2025-08-09 and +# 2027-08-09 both list "St. Romanus, Martyr" (cls 4) as the day's own +# office, with no Vigil of St Lawrence entry anywhere in either day's +# option list (2026-08-09 is a Sunday, impeding the vigil on every +# source, so it is not part of this population). NOT re-derived from +# scratch -- already fully adjudicated in the class/colour layers +# named above; carried forward here as a known fact to characterise +# against, not a new investigation. +# +# 5. TWO ALREADY-DOCUMENTED SOURCE-PDF DEFECTS (ordo-fidelity-report.md) +# do not need a fresh finding here, only a check of whether they touch +# the preface field at all -- they do not, checked directly: +# - 2027-03-03 is missing from the JSON outright (a source PDF +# row-drop); 2027-03-02 carries 03-03's own Wednesday content under +# 03-02's date instead. Both dates' own `preface` value happens to +# read "Lent" regardless of which day's content is attached (both +# are ordinary Lenten ferias in the same week), so the mislabelling +# does not propagate into a preface divergence -- checked, not +# assumed. 2027-03-03 (the missing day) is still emitted as its own +# "no data" row below (mass/cls/colour/praef all absent), the same +# shape Good Friday's genuine blank already uses, so the fixture +# keeps one row per calendar day. +# - 2026-12-13 (Gaudete Sunday) carries the wrong COLOUR/commemoration +# in the source PDF (a known, isolated editorial error, already +# allow-listed for class/colour purposes elsewhere) -- its own +# `preface` value is untouched ("Advent", exactly like every other +# Advent Sunday), confirmed directly against this JSON. +# +# 6. RULE A -- "SATURDAY OF OUR LADY" IS UNCONDITIONALLY THE OFFICE. A +# second, NEW office-selection finding, beyond the two patterns in +# finding 1 above: 38 days across the whole corpus list an entry whose +# `mass` is exactly "Saturday of Our Lady" (RG 78's own votive BVM +# Saturday Office) ALONGSIDE another named saint's own optional Mass +# (structurally identical to the Requiem pattern -- a low-class +# "priest's menu" option printed ahead of, or beside, the real office). +# Checked EXHAUSTIVELY, not sampled: on all 38, colitur's own real +# computed office is this BVM Office (`dune exec bin/main.exe -- +# rubrics `, cross-checked against `day`'s own "Officium sanctae +# Mariae in sabbato" line) -- including the ONE case where a further +# listed entry outranks every OTHER candidate on the page by class +# number (18 January 2025's own "Chair of St. Peter (for Church +# Unity)", cls 2): that entry is not even part of the 1962 General +# Roman Calendar at all (the single Roman Chair-of-Peter feast was +# consolidated to 22 February by the 1960 Rubricae Generales; colitur's +# own sanctoral data has no 18 January entry for it, and neither the +# LMS nor the FIUV Ordo -- both already-validated witnesses -- ever +# name it), so its presence does not defeat the rule. UNCONDITIONAL, +# not merely "no lower-class competitor": empirically the simpler, +# equally correct reading of the whole 38-instance population. +# +# (USA)/(Can)-TAGGED REGIONAL INDULTS were checked and found NEVER to be +# the JSON's own element [0] anywhere in the whole 1091-day corpus (0 +# instances) -- so, unlike ordo-fidelity-report.md's own +# class/colour-comparison method, THIS generator needs no indult- +# stripping step: Rules 1/6 above never reach far enough into an +# option list for an indult's presence to matter. Checked, not assumed. +# +# 7. THE RESIDUAL -- 11 rows, all 3 editions combined, 7 distinct root +# causes, every one individually adjudicated in +# data/ef/expected-divergences-efdotorg.sexp (not attempted here, a +# THIRD, generic "absorption" rule was deliberately NOT built: it would +# have resolved 2 of these 11 rows (Our Lady of Mt Carmel, 16 July) but +# ALSO wrongly mis-fired on a genuinely different shape (Ss Philip & +# James/Rogation Day, 11 May, where an equal-CLASS "Rogation Day" +# option's own [comms] names the real feast for the OPPOSITE reason -- +# an optional votive substitution, not a rank-based demotion -- and the +# JSON alone cannot distinguish the two shapes without already knowing +# colitur's own Commemoration_only/Feast status distinction, which +# would defeat the point of an independent witness). Manufacturing a +# rule that fixes 2 cases while breaking a 3rd is a worse trade than +# leaving all of them to individual adjudication. +# +# --------------------------------------------------------------------------- +import datetime +import json +import subprocess +import sys + +EDITIONS = [ + ("2024-2025", "2024-12-01", "2025-11-29"), + ("2025-2026", "2025-11-30", "2026-11-28"), + ("2026-2027", "2026-11-29", "2027-11-27"), +] +# Boundaries re-derived, not copied: both PDF-to-PDF seams are exact (no +# overlap, no gap) and 364 + 364 + 363 = 1091, the JSON's own total day +# count -- checked below in main(), not merely asserted here. + + +def sha256_of(path): + out = subprocess.run(["sha256sum", path], capture_output=True, text=True, check=True) + return out.stdout.split()[0] + + +def pick_office(opts): + """The menu-trap filter -- see this module's own header, findings 1 and 6.""" + i = 0 + if opts[0]["mass"].startswith("Requiem:"): + i = 1 + if i < len(opts) - 1 and opts[i + 1]["mass"].startswith("and "): + i += 1 + # Rule A (finding 6): "Saturday of Our Lady", whenever listed at all, IS + # the office -- checked exhaustively over all 38 instances across the + # whole 1091-day corpus (not a sample): colitur's own RG 78 BVM-Saturday + # Office wins on every single one, including the one case where a + # competing entry outranks every OTHER real candidate on the page (a + # Chair-of-St-Peter, 18 January, entry that is not even part of the + # 1962 calendar at all -- see finding 6). No guard/condition needed; + # unconditional preference is the empirically safe rule. + bvm_saturday = next((o for o in opts if o["mass"] == "Saturday of Our Lady"), None) + if bvm_saturday is not None: + return bvm_saturday + return opts[i] + + +def sexp_string(s): + out = [] + for ch in s: + b = ch.encode("utf-8") + if ch == '"': + out.append('\\"') + elif ch == "\\": + out.append("\\\\") + elif len(b) == 1 and 32 <= b[0] < 127: + out.append(ch) + else: + for byte in b: + out.append("\\%03d" % byte) + return '"' + "".join(out) + '"' + + +def sexp_opt_string(s): + return "(" + sexp_string(s) + ")" if s is not None else "()" + + +def sexp_opt_int(n): + return f"({n})" if n is not None else "()" + + +def daterange(lo, hi): + d = datetime.date.fromisoformat(lo) + end = datetime.date.fromisoformat(hi) + while d <= end: + yield d.isoformat() + d += datetime.timedelta(days=1) + + +def build_rows(data, lo, hi): + rows = [] + for date in daterange(lo, hi): + opts = data.get(date) + if opts is None: + # 2027-03-03 only -- see this module's own header, finding 5. + rows.append((date, None, None, None, None)) + continue + office = pick_office(opts) + praef = office["preface"] + if praef is None and office.get("comms") == ["Christ the King"]: + praef = "Christ the King" # RECOVERED -- see finding 2 above. + rows.append((date, office["mass"], office["cls"], office["colour"], praef)) + return rows + + +def write_fixture(out_path, label, lo, hi, rows, json_path, json_sha): + n_missing = sum(1 for r in rows if r[1] is None) + n_none_praef = sum(1 for r in rows if r[1] is not None and r[4] is None) + with open(out_path, "w") as f: + f.write(f"""; test/fixtures/efdotorg-ordo-{label}.sexp -- efdotorg-preface task +; (2026-08-24-colitur-celebrant-rubrics-phase1): the THIRD independent +; preface witness (RG 482-499), extraordinaryform.org's {label} Ordo, +; extracted from the already-parsed, fidelity-audited corpus +; docs/research/ordo/ordo-2024-2027.json (SHA-256 {json_sha}) rather than +; re-parsed from the PDF -- see tools/extract_efdotorg_ordo.py's own +; header for the full characterisation this fixture rests on (the menu- +; trap office filter, the Christ-the-King classifier-gap recovery, why +; "Advent" is not baked into a single mapping here, the known Vigil-of- +; St-Lawrence gap, and the two source-PDF defects that turn out not to +; touch this field). +; +; Generator: tools/extract_efdotorg_ordo.py -- do not hand-edit; re-run +; against the same JSON and commit the diff instead. +; python3 tools/extract_efdotorg_ordo.py {json_path} test/fixtures +; +; Source PDF (gitignored, CLAUDE.md: "docs/ is gitignored", see +; docs/research/ordo/SHA256SUMS for its own hash): {label}Ordo.pdf, +; extraordinaryform.org. +; +; COVERAGE: {len(rows)} day-rows, {lo}..{hi} (this edition's own civil-date +; span, re-derived from the JSON's own seams -- see the generator's own +; EDITIONS comment). {n_missing} row(s) are a genuine SOURCE GAP (2027-03-03 +; only, a PDF row-drop, ordo-fidelity-report.md) -- mass/cls/colour/praef +; all absent, the same shape a structurally blank day (Good Friday) uses. +; {n_none_praef} further row(s) have mass/cls/colour but no praef at all +; (Good Friday -- RG 28, no Mass in the 1955-restored Holy Week). +; +; Each row's `praef` is RAW TEXT from the day's own OFFICE (after the +; menu-trap filter, with the Christ-the-King recovery already applied) -- +; classified against {{!Colitur_kernel.Preface.t}} by +; test/test_efdotorg_ordo.ml, not here. +""") + f.write("(\n") + for date, mass, cls, colour, praef in rows: + f.write( + f" ((date {date}) (mass {sexp_opt_string(mass)}) (cls {sexp_opt_int(cls)}) " + f"(colour {sexp_opt_string(colour)}) (praef {sexp_opt_string(praef)}))\n" + ) + f.write(")\n") + print(f"wrote {len(rows)} rows to {out_path}", file=sys.stderr) + print(f"SHA-256 of {out_path}: {sha256_of(out_path)}", file=sys.stderr) + + +def main(): + if len(sys.argv) != 3: + print(f"usage: {sys.argv[0]} ", file=sys.stderr) + sys.exit(2) + json_path, out_dir = sys.argv[1], sys.argv[2] + with open(json_path) as f: + data = json.load(f) + json_sha = sha256_of(json_path) + + # The three windows span 1092 CALENDAR days (one more than the JSON's + # own 1091 keys, because 2027-03-03 is a genuine source gap -- see + # finding 5 above); of those, exactly 1091 must be present as JSON + # keys and exactly 1 (2027-03-03 alone) absent, or the boundaries are + # wrong. + all_dates = [d for _, lo, hi in EDITIONS for d in daterange(lo, hi)] + present = [d for d in all_dates if d in data] + missing = [d for d in all_dates if d not in data] + if len(all_dates) != 1092 or len(present) != 1091 or missing != ["2027-03-03"]: + print( + f"ERROR: edition boundaries cover {len(all_dates)} calendar days, " + f"{len(present)} present in the JSON, missing={missing} " + "(expected 1092/1091/['2027-03-03'])", + file=sys.stderr, + ) + sys.exit(1) + + for label, lo, hi in EDITIONS: + rows = build_rows(data, lo, hi) + out_path = f"{out_dir}/efdotorg-ordo-{label}.sexp" + write_fixture(out_path, label, lo, hi, rows, json_path, json_sha) + + +if __name__ == "__main__": + main() -- cgit v1.3