aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/ef/expected-divergences-efdotorg.sexp175
-rw-r--r--test/dune4
-rw-r--r--test/fixtures/efdotorg-ordo-2024-2025.sexp398
-rw-r--r--test/fixtures/efdotorg-ordo-2025-2026.sexp398
-rw-r--r--test/fixtures/efdotorg-ordo-2026-2027.sexp398
-rw-r--r--test/test_colitur.ml2
-rw-r--r--test/test_efdotorg_ordo.ml403
-rw-r--r--tools/extract_efdotorg_ordo.py336
8 files changed, 2114 insertions, 0 deletions
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 <year>`, 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]} <ordo-2024-2027.json> <out-dir>", 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()