From 5c9f2cdbffdff67ec8a1939ed6958767acf406fd Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 12:20:31 +0200 Subject: docs: close the RG16(a) CLAUDE.md item, correct its signature-change claim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mirrors the register §6.0 correction: the carried-item list previously said the fix "needs a signature change -- privilege_of cannot currently see the winner's subject", which was true of privilege_of specifically but wrong about what the fix required -- disposition already took the winner. Marked resolved, with a pointer to the register's own full account (audit, fix, blast radius, allow-list) and to one further sanctoral subject defect this task found but did not fix (13 January, Baptism of the Lord, mistagged Saint). --- CLAUDE.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index 25d3339..f772405 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -199,13 +199,22 @@ nowhere in git (`docs/` is gitignored). **The two behaviour items, in order:** -1. **RG 16(a) — the largest known-wrong output on the branch.** A Feast of the - Lord occurring on a II-class Sunday takes the Sunday's place *"cum omnibus - iuribus et privilegiis: de dominica, proinde, **nulla fit commemoratio**"*. - colitur commemorates the Sunday anyway: **5 996 wrong days over 1583–9999**, - 369 of them in 1583–2100. **Zero** instances fall in the oracle window and none - is pinned, so all five layers miss it. Needs a signature change — `privilege_of` - cannot currently see the winner's `subject`. Register §6.0. +1. **RG 16(a) — RESOLVED (RG16(a) task, branch `ef-rg16a`, 2026-08-12).** Was + the largest known-wrong output on the branch: a Feast of the Lord occurring + on a II-class Sunday takes the Sunday's place *"cum omnibus iuribus et + privilegiis: de dominica, proinde, **nulla fit commemoratio**"*, and colitur + used to commemorate the Sunday anyway (**5 996 wrong days over 1583–9999**, + 369 of them in 1583–2100, re-confirmed exactly by this task's own + independent re-measurement). Fixed in `Rite_ef.Precedence_ef.disposition` + with **no signature change** — `disposition` already took `winner:...` + (RG 33's own vigil-omission branch already read it); the earlier note here + claiming a signature change was needed was itself wrong, corrected in + register §6.0. Landed together with a sanctoral data fix (two of six + `subject = Lord` entries were themselves wrong — the Purification and the + Most Holy Name of Mary are BVM feasts, not the Lord's) via a new + `data/ef/adjustments.sexp` overlay; see register §6.0 for the full account, + the sanctoral audit, and one further `subject` defect found but left open + (13 January, Baptism of the Lord, currently mistagged `Saint`). 2. **Commemoration identity is unasserted** outside ~3 test rows (see the layer caveats above). Related: `compare_dignity` breaks same-rank ties **alphabetically**, with no RG warrant, and over 2005–2050 the admission cut -- cgit v1.3 From 993bec2a77912189e4f678c1fdf2848e0f6f8f92 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 13:35:23 +0200 Subject: docs: fix round 1 -- Purification reversal, the admit fix, RG112, layer blindness CLAUDE.md's own carried-item record, updated to match the register's full account: the Purification retag reversed (follow the oracle, not the calendarium title, per the user's ruling), the admit/~temporal kernel signature change (a genuine one, unlike RG16(a) itself), RG112 recorded as a newly-found, unimplemented rule (a feast/mystery of one Divine Person excludes a commemoration of another of the same Person -- confirmed live on 13 January in seven real differential-window years, independent of the subject question), and the Dedication-of-a-Church classification question (measured, not applied: St Michael's own Dedication, 29 September, may also be a feast of the Lord -- 1200 days domain-wide if so). Extends the existing 'commemoration identity is unasserted' item: this is the exact gap the whole RG16(a) fix round exploited both ways -- the original bug and the review's own catch (Pope Sixtus II wrongly admitted, both golden pins promoted from output) were both invisible to every layer except unit tests and two golden pins. --- CLAUDE.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 17 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index f772405..174bf30 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -199,24 +199,54 @@ nowhere in git (`docs/` is gitignored). **The two behaviour items, in order:** -1. **RG 16(a) — RESOLVED (RG16(a) task, branch `ef-rg16a`, 2026-08-12).** Was - the largest known-wrong output on the branch: a Feast of the Lord occurring - on a II-class Sunday takes the Sunday's place *"cum omnibus iuribus et - privilegiis: de dominica, proinde, **nulla fit commemoratio**"*, and colitur - used to commemorate the Sunday anyway (**5 996 wrong days over 1583–9999**, - 369 of them in 1583–2100, re-confirmed exactly by this task's own - independent re-measurement). Fixed in `Rite_ef.Precedence_ef.disposition` - with **no signature change** — `disposition` already took `winner:...` - (RG 33's own vigil-omission branch already read it); the earlier note here - claiming a signature change was needed was itself wrong, corrected in - register §6.0. Landed together with a sanctoral data fix (two of six - `subject = Lord` entries were themselves wrong — the Purification and the - Most Holy Name of Mary are BVM feasts, not the Lord's) via a new - `data/ef/adjustments.sexp` overlay; see register §6.0 for the full account, - the sanctoral audit, and one further `subject` defect found but left open - (13 January, Baptism of the Lord, currently mistagged `Saint`). +1. **RG 16(a) — RESOLVED (RG16(a) task, branch `ef-rg16a`, 2026-08-12; ONE + FIX ROUND of review after the first pass — see register §6.0 for the full, + corrected account).** Was the largest known-wrong output on the branch: a + Feast of the Lord occurring on a II-class Sunday takes the Sunday's place + *"cum omnibus iuribus et privilegiis: de dominica, proinde, **nulla fit + commemoratio**"*, and colitur used to commemorate the Sunday anyway + (**5 996 wrong days over 1583–9999**, 369 of them in 1583–2100, + re-confirmed exactly, twice, independently). Fixed in + `Rite_ef.Precedence_ef.disposition` with **no signature change** — + `disposition` already took `winner:...` (RG 33's own vigil-omission branch + already read it). A SECOND, related bug needed a genuine kernel signature + change: `Precedence.rules.admit` gained a `~temporal` parameter, because + RG 16(a) also breaks the assumption that `observed` IS the day's own + temporal-cycle office for RG 111(b)'s Sunday rank-floor check (an + unrelated saint could otherwise be wrongly admitted into the freed slot — + confirmed on 1 178 real days, 6 August, before this second fix). + **The sanctoral data question was more contested than the first pass + found**: the Purification (2 Feb) was FIRST retagged `Bvm` (calendarium + title argument), then REVERTED to `Lord` in fix round 1 on the user's own + ruling — follow the oracle, which treats the Purification as taking an + occurring Sunday's place outright, unlike an ordinary Marian feast (real + primary-text counter-evidence, RG 120(b)'s colour rule, remains on record + as the argument the other way). Only `most-holy-name-of-mary` stays + retagged `Bvm`. A related, unresolved primary-source finding: the Common + of the Dedication of a Church's own classification (*"Festum + Dedicationis Ecclesiae est festum Domini"*) means St Michael's Dedication + (29 Sep) may also be `Lord`, not `Saint` — measured, not applied (1 200 + days domain-wide if it were). Two further open items recorded, not fixed: + 13 January (Baptism of the Lord, mistagged `Saint`, and separately, RG 112 + — a feast/mystery of one Divine Person excludes a commemoration of + another of the SAME Person — entirely unimplemented, confirmed live on 7 + real years). 2. **Commemoration identity is unasserted** outside ~3 test rows (see the layer - caveats above). Related: `compare_dignity` breaks same-rank ties + caveats above) — **the exact gap the RG 16(a) fix round exploited**: the + lectio differential compares season/slug/rank/colour only, never + commemorations, so of the 5 996 days RG 16(a) changes, the differential + sees at most the handful where the OBSERVED slug itself also changes (the + Purification's own 1 200, and only because it happens to change who is + observed) — RG 16(a) proper moved ZERO differential rows either round. + The missalemeum oracle window (2026–2027) contains zero live RG 16(a) + instances at all. Every finding in the RG 16(a) fix round, both the + original bug and the fix-round-1 review's own catch (Pope Sixtus II + wrongly admitted, both golden pins promoted from output rather than + independently derived), rested entirely on unit tests and two golden + pins — this is precisely how a defect of this shape gets through + undetected for as long as it did, and precisely how the review's own + correction had to be caught by the same narrow means. Related: + `compare_dignity` breaks same-rank ties **alphabetically**, with no RG warrant, and over 2005–2050 the admission cut falls between two same-rank candidates on **66 days**. -- cgit v1.3 From 76298db9b0fb5409bcfd4276b642f69f4da530e9 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 15:37:08 +0200 Subject: feat(test): oracle layer compares commemoration identity, not just count test_oracle.ml (validation layer 4) used to compare commemoration presence and List.length only -- cardinality, never which candidate is admitted. A reviewer proved this vacuous by reversing admit's dignity sort (the engine admitting the worst commemoration, an outright RG 111 violation) and finding every assertion in this file green across all 730 days. tools/extract_missalemeum_oracle.py now also emits each commemoration's own missalemeum id (field 9, commemoration_ids), parallel to the existing title field; fixture regenerated from the same underlying lectio snapshot (commit d7da4b0, re-verified, first 8 fields byte-identical), read from a scratch copy so ~/git/projects/lectio was never touched. SHA-256 pin and provenance updated. The mapping: colitur identifies a commemoration by slug, missalemeum by an English title string. No hand-built slug<->title table -- colitur's own Celebration.t.names already carries the same English text for every SANCTORAL-origin commemoration (bootstrapped from lectio, verified to match missalemeum's titles character-for-character). This resolves identity for every sanctoral-origin commemoration but cannot resolve a TEMPORAL-origin one (Rite_ef.Temporal_ef never sets a celebration name) -- that case is a new, distinct outcome (Comm_identity_unresolved), counted and allow-listed, never silently skipped: 19 of 227 non-empty-commemoration days over 2026-2027. Two genuine identity mismatches found and adjudicated (new allow-list entries M15-M17, one is the unresolved bucket): M16, 27 March 2026, the already-known unimplemented Seven Sorrows of Passion Friday office (verdict missalemeum); M17, 22 September 2027, the RG 113 same-band tie-break residual (verdict open, per the sibling admit fix). A new corroborating check cross-references missalemeum's own id-embedded rank against colitur's, split by status: Feast-status matches must agree exactly (none reachable in this 2-year window, checked regardless); Commemoration_only-status matches either genuinely agree or fit a known, pre-existing, already-registered convention gap (colitur's bootstrap rank vs missalemeum's own sentinel) -- not a title-matching defect. Perturbation test performed and reverted: reversing admit's dignity- based ordering (compare_precedence's real committed form uses band, not dignity -- this reproduces the historical defect shape directly) turns the oracle layer red: "no differences outside the cited allow-list" fails with an unexplained commemoration-identity-mismatch on 2026-09-23 (colitur admits "St. Thecla" where the rubric and missalemeum both require "St. Linus"). Reverted; diff against the prior commit confirms no residue. CLAUDE.md's "know what each layer cannot see" section updated: the commemoration-identity gap it documented as open is now closed, with the mapping's limits and the RG 113 tie-break finding summarised. 271 -> 273 tests (274 with the exhaustive sweep), all green. --- CLAUDE.md | 38 +- data/ef/expected-divergences-missalemeum.sexp | 37 +- test/fixtures/missalemeum-ef-2026-2027.provenance | 43 +- test/fixtures/missalemeum-ef-2026-2027.txt | 1460 ++++++++++----------- test/test_oracle.ml | 383 +++++- tools/extract_missalemeum_oracle.py | 21 +- 6 files changed, 1188 insertions(+), 794 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index 174bf30..0f18537 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -113,11 +113,39 @@ against missalemeum; layer 5 pins ~30 dates. the week column. It also **shares colitur's own lineage**: colitur's data was bootstrapped from lectio, so an error both inherited is invisible here. Proven: Holy Thursday was violet in both because both were wrong. -- Layer 4 is **two years wide** and compares rank, colour-membership and - commemoration presence/count — **never celebration identity**. -- Together they sleep through **commemoration identity**: reversing `admit`'s - dignity sort, so the engine admits the *worst* commemorations, leaves all eight - differential and oracle assertions green across 17 531 days. +- **Layer 4's commemoration-identity gap is CLOSED** (2026-08-12, Task B, branch + `ef-rg16a`): it used to compare presence/count only, never *which* commemoration + won — reversing `admit`'s dignity sort (the engine admitting the *worst* + commemoration, an outright RG 111 violation) left all eight differential and + oracle assertions green across 17 531 days. Layer 4 now also compares **identity** + — colitur's own resolved English name (`Celebration.t.names`, `en`) against + missalemeum's title text, for every day both streams admit the same count. The + mapping resolves **every SANCTORAL-origin commemoration** (colitur's own name + field, bootstrapped from lectio, verified to match missalemeum's titles + character-for-character); it **cannot resolve a TEMPORAL-origin one** (an + impeded feria/Ember/Rogation day — `Rite_ef.Temporal_ef` never sets a celebration + name) — that case is **never silently skipped**: it is a separate, counted, + allow-listed outcome (`Comm_identity_unresolved`, 19 of 227 non-empty-commemoration + days over 2026–2027), not a silent pass. Two genuine identity mismatches surfaced + and were adjudicated (register §4/§6.1, `data/ef/expected-divergences-missalemeum + .sexp` M16/M17): a known unimplemented office (the Seven Sorrows of Passion + Friday) and the RG 113 same-band tie-break residual (below), the latter left + explicitly OPEN, not defaulted to either side. Proof of teeth: reversing + `admit`'s *dignity*-based sort (the same historical defect shape) now turns + layer 4 red — `test_no_unexplained_differences` reports an unexplained + `commemoration-identity-mismatch` day (colitur admitting "St. Thecla" where both + the rubric and missalemeum require "St. Linus") — reverted after confirming. +- **The `admit` same-rank tie-break is RG 113, not an uncited convention** (same + task): RG 113's own second sentence ("in admittendis et ordinandis aliis + commemorationibus, servetur ordo tabellae praecedentiae"), previously quoted only + in its first half, is the real rule — `admit` now orders/selects by + `Precedence_ef.band` (RG 91's own table), not RG 8's coarse four-class rank. + Measured (not assumed): the fix's blast radius against the pre-change binary is + **zero admitted-commemoration changes across the entire 1583–9999 domain** — a + correctness-of-citation fix, not an answer-changing one, on this codebase's + current data. A narrower residual remains open where two candidates land on the + *identical* RG 91 table entry (RG 113 gives no further instruction there); + `admit` still breaks that alphabetically, still uncited, register §6.1. ## Current state (Plans 1–3 DONE — verify with `git log`) diff --git a/data/ef/expected-divergences-missalemeum.sexp b/data/ef/expected-divergences-missalemeum.sexp index b5a9508..2488cb8 100644 --- a/data/ef/expected-divergences-missalemeum.sexp +++ b/data/ef/expected-divergences-missalemeum.sexp @@ -16,13 +16,19 @@ ; did not build. Those are honestly verdicted [missalemeum] -- colitur is ; short a feature or a row, not correct -- and each is cross-referenced ; into docs/research/rules-register.md §6 as an open item, not silently -; absorbed as if colitur were right. TWO entries (M11 and M13) are -; [verdict open] -- corrected, final fix wave, item 7: this note previously -; said "one entry (M13)", missing M11 (whose own verdict changed from -; [colitur] to [open] in fix round 1, see M11's own entry below). Both are -; adjudicated as UNRESOLVED after real primary-source effort, not defaulted -; past -- see each entry's own note and the task report for the full -; search. +; absorbed as if colitur were right. THREE entries (M11, M13, and, since +; Task B/branch ef-rg16a, M17) are [verdict open] -- corrected, final fix +; wave, item 7: this note previously said "one entry (M13)", missing M11 +; (whose own verdict changed from [colitur] to [open] in fix round 1, see +; M11's own entry below); M17 (the RG 113 same-band tie-break residual) is +; a genuinely new open item from the commemoration-identity task, not a +; stale-comment fix. ONE entry (M15) carries a fourth verdict, +; [unresolvable] -- a LIMIT of this comparator (no English name exists on +; colitur's side for a temporal-origin commemoration to compare), not a +; rubric dispute or a data gap either engine is wrong about; see M15's own +; note. All are adjudicated as UNRESOLVED/UNRESOLVABLE after real +; primary-source effort, not defaulted past -- see each entry's own note +; and the task report for the full search. ; ; [expected_rows] is the exact row count this entry accounts for over the ; fixture's 2026-2027 span: a REGRESSION PIN, not documentation -- @@ -101,5 +107,20 @@ ((id M13) (citation "OPEN -- not adjudicated. 1962 calendarium's March table: \"Feria VI post dominicam I Passionis: Commemoratio septem Dolorum B. Mariæ Virg.\" (confirmed real, every year) -- but RG 91's plain table (entry 11-13, Joseph, I class, vs entry 22, an ordinary III-class Passiontide feria) gives Joseph the day outright, with no RG 96 collision requiring a transfer, so the primary text found here does not by itself explain missalemeum's result") (verdict open) - (note "19 March 2027: St Joseph (I class) falls on the Friday of Passion Week. missalemeum shows Joseph entirely displaced, with the Friday's own III-class violet office observed and the Seven Sorrows commemorated instead. Three possibilities, none confirmed: (a) colitur's plain RG 91 reading is right and missalemeum is wrong; (b) a more specific rubric attached to St Joseph's own Proprium Sanctorum entry (the same shape as the Annunciation's own Attamen clause) overrides the general table for this exact collision, and this task did not find its text; (c) the Seven Sorrows commemoration itself outranks an ordinary I-class feast on this one Friday, unsupported by anything found here either. Extensive but non-exhaustive primary-source search did not settle it -- register §6 open item, explicitly unresolved rather than defaulted to either side. Separately, but confirmed regardless: colitur does not implement the Seven-Sorrows-of-Passion-Friday commemoration at all, in any year -- a real, primary-attested gap on its own.") + (note "19 March 2027: St Joseph (I class) falls on the Friday of Passion Week. missalemeum shows Joseph entirely displaced, with the Friday's own III-class violet office observed and the Seven Sorrows commemorated instead. Three possibilities, none confirmed: (a) colitur's plain RG 91 reading is right and missalemeum is wrong; (b) a more specific rubric attached to St Joseph's own Proprium Sanctorum entry (the same shape as the Annunciation's own Attamen clause) overrides the general table for this exact collision, and this task did not find its text; (c) the Seven Sorrows commemoration itself outranks an ordinary I-class feast on this one Friday, unsupported by anything found here either. Extensive but non-exhaustive primary-source search did not settle it -- register §6 open item, explicitly unresolved rather than defaulted to either side. Separately, but confirmed regardless: colitur does not implement the Seven-Sorrows-of-Passion-Friday commemoration at all, in any year -- a real, primary-attested gap on its own. CORRECTED 2026-08-12 (Task B, branch ef-rg16a, commemoration-identity comparison): this date now ALSO trips [Comm_identity_unresolved] (colitur's own commemorated candidate there, [ef-passiontide-1-friday], is temporal-origin and carries no English name) -- the SAME root cause as M15 below, folded into this entry's own subset check rather than a separate id, since it is the identical Seven-Sorrows gap this note already names, not a new finding.") + (expected_rows 1)) + ((id M15) + (citation "docs/research/rules-register.md §4's own \"THE MAPPING, AND EXACTLY WHAT IT CANNOT RESOLVE\" note (test_oracle.ml's own header) -- not an RG citation, a comparator LIMIT: Rite_ef.Temporal_ef never sets an English [names] field on any candidate it builds (temporal_ef.ml has no \"en ...\" string anywhere in it)") + (verdict unresolvable) + (note "19 rows where colitur's own admitted commemoration is TEMPORAL-origin (an impeded Advent or Lent feria) -- there is no English name on colitur's side to compare against missalemeum's title text at all, so identity cannot be attempted, only reported as unresolved. Not a rubric dispute and not a data gap either engine is wrong about. Every oracle title on these 19 rows reads as a plain prose description of the SAME temporal ferial slot colitur independently computes for that date (e.g. 2 Dec 2026: oracle \"Feria IV after I Sunday of Advent\" against colitur's own ef-advent-1-wednesday; 4 Dec 2027: oracle \"Sabbato after I Sunday of Advent\" against ef-advent-1-saturday) -- suggestive corroboration, recorded for a human reader, NOT claimed as a verified match: this comparator has no mechanism to verify English prose against an opaque slug. Fixing this at the root (an English name on every temporal-cycle candidate) is a data/lectionary-bootstrap task, not something this comparator can do for itself -- register §6, neighbouring the RG 113 tie-break section, records it as an open item. The 19 dates: 2026-02-24, 2026-03-19, 2026-03-25, 2026-12-02, 2026-12-03, 2026-12-04, 2026-12-07, 2026-12-11, 2026-12-21, 2027-02-24, 2027-12-02, 2027-12-03, 2027-12-04, 2027-12-06, 2027-12-07, 2027-12-11, 2027-12-13, 2027-12-16, 2027-12-21.") + (expected_rows 19)) + ((id M16) + (citation "1962 calendarium's March table (same primary text as M13's own citation): \"Feria VI post dominicam I Passionis: Commemoratio septem Dolorum B. Mariae Virg.\" -- a fixed commemoration of Our Lady's Seven Sorrows for the Friday of Passion Week, every year, confirmed real") + (verdict missalemeum) + (note "27 March 2026 (Friday of Passion Week): colitur admits \"St. John Damascene\" (a real Class3 universal feast that genuinely falls that day, data/ef/sanctoral.sexp's own john-damascene entry, 27 March); missalemeum shows \"For Our Lady of the Seven Sorrows\" instead. The SAME standing gap M13 already names: the Seven-Sorrows-of-Passion-Friday commemoration is confirmed real in the primary text but not implemented anywhere in temporal_ef.ml, so colitur has no candidate for it and falls back to whichever ordinary Class3 saint actually wins that Friday. Verdict missalemeum: colitur is missing a real, primary-cited office, not differently opinioned. Register §6 open item (the same one M13's own note already tracks). Only 2026 shows here as an IDENTITY mismatch -- 2027's Friday of Passion Week IS 19 March, M13's own date, where identity comparison cannot even be reached (M13's own rank/colour mismatch already excludes that day from count-matched identity comparison, folded into M13's own widened subset above).") + (expected_rows 1)) + ((id M17) + (citation "RG 113 (docs/research/rules-register.md §4's own RG 113 entry, and §6.1's \"RG 113 same-band residual\" record, Task B/ef-rg16a): \"in admittendis et ordinandis aliis commemorationibus, servetur ordo tabellae praecedentiae\" reaches only the TABLE order (Precedence_ef.band); it supplies no further instruction for two candidates landing on the identical band value") + (verdict open) + (note "22 September 2027 (September Ember Wednesday): colitur admits \"St. Maurice and Companions, Martyrs\" (Commemoration_only, Class3); missalemeum shows \"St. Thomas of Villanova\" (Feast, Class3) instead -- both land on Precedence_ef.band entry 24 (III-class universal feasts), a genuine tie RG 113 does not resolve. colitur's own residual tie-break (alphabetical by slug, register §6.1's own uncited-convention record) picks \"maurice...\" over \"thomas...\" purely because 'm' < 't' in ASCII -- no rubrical warrant either way. NOT adjudicated colitur or missalemeum: verdict OPEN, the same explicit permission the brief gives M11/M13 (\"say so as an open item rather than absorbing it\"). Only 2027 shows this exact collision in this window -- 2026's 22 September is an ordinary (non-Ember) Tuesday, where Thomas of Villanova simply wins the day outright on both sides (colitur: observed; missalemeum: title) with Maurice commemorated alongside him identically on both, no tie to observe that year.") (expected_rows 1)) diff --git a/test/fixtures/missalemeum-ef-2026-2027.provenance b/test/fixtures/missalemeum-ef-2026-2027.provenance index 576093d..adae533 100644 --- a/test/fixtures/missalemeum-ef-2026-2027.provenance +++ b/test/fixtures/missalemeum-ef-2026-2027.provenance @@ -1,20 +1,30 @@ Fixture: missalemeum-ef-2026-2027.txt Task: 2026-08-11-colitur-plan3-resolution-engine, Task 16 (oracle harness + -data audit) +data audit); field 9 (commemoration_ids) added 2026-08-12, Task B +(branch ef-rg16a, commemoration-identity comparison). Source: missalemeum.com (Divinum Officium data), archived by the sibling project ~/git/projects/lectio at: commit d7da4b0 "sources: store the snapshot as one compressed archive" path sources/snapshot.tar.gz, entries missalemeum/en/YYYY-MM-DD.json (lectio/sources/README.md: "First archived 2026-07-29") +Re-verified 2026-08-12 (Task B): sources/snapshot.tar.gz is still at commit +d7da4b0 (git log -1 -- sources/snapshot.tar.gz, working tree clean for that +path) -- the underlying data has not moved. Re-extracted into a scratch +copy OUTSIDE ~/git/projects/lectio (that repo was not read via its own +working commands and was not modified -- another agent was working there +concurrently), and confirmed the first 8 fields are byte-identical to the +fixture's own prior content before field 9 was appended. -SHA-256 of the extracted fixture: 718eff1a03fa09c3927ef18d19fe7921c2d4d7611890c22566058b81fd7cc5ea -(same digest as [fixture_sha256] in test/test_oracle.ml, ASSERTED by that -suite's own "fixture SHA-256 matches its provenance note" test -- this line -documents the pin for a reader who never runs the suite; that test is what -actually enforces it. Regenerate both together, deliberately, after -re-running the exact command below -- never by copying a mismatch's actual -value back in, which would defeat the pin's purpose.) +SHA-256 of the extracted fixture: 4162e79d7a0bc03b81a34ce6cd3b074e2d32570217759bc3b4058ada75ea8781 +(previously 718eff1a03fa09c3927ef18d19fe7921c2d4d7611890c22566058b81fd7cc5ea, +before field 9 was appended -- same digest as [fixture_sha256] in +test/test_oracle.ml, ASSERTED by that suite's own "fixture SHA-256 matches +its provenance note" test -- this line documents the pin for a reader who +never runs the suite; that test is what actually enforces it. Regenerate +both together, deliberately, after re-running the exact command below -- +never by copying a mismatch's actual value back in, which would defeat the +pin's purpose.) Exact commands: cd ~/git/projects/lectio && sh scripts/snapshot-sources.sh unpack @@ -24,16 +34,17 @@ Exact commands: Output: one line per civil day, 2026-01-01 through 2027-12-31 inclusive (730 lines = 365 + 365, both non-leap years), pipe-separated: - date|rank|colors|title|tempora|commemorations|displaced|n_masses + date|rank|colors|title|tempora|commemorations|displaced|n_masses|commemoration_ids See tools/extract_missalemeum_oracle.py's own header for the exact field semantics (info.rank/colors/title/tempora/commemorations/displaced, -verbatim English strings, not translated or slugified) and the two things -verified during extraction, not merely assumed: no field collides with the -"|"/";" delimiters, and all 4 multi-Mass days (info is an array on -2026-11-02, 2026-12-25, 2027-11-02, 2027-12-25) carry an IDENTICAL info -block (rank/colors/tempora/commemorations/displaced) across every Mass of -the day, so taking entry[0] throughout (this fixture's own convention) -loses nothing the comparator or a human auditor needs. +verbatim English strings, not translated or slugified; commemoration_ids is +info.commemorations[*].id, ";"-joined, index-aligned with commemorations) +and the two things verified during extraction, not merely assumed: no +field collides with the "|"/";" delimiters, and all 4 multi-Mass days (info +is an array on 2026-11-02, 2026-12-25, 2027-11-02, 2027-12-25) carry an +IDENTICAL info block (rank/colors/tempora/commemorations/displaced) across +every Mass of the day, so taking entry[0] throughout (this fixture's own +convention) loses nothing the comparator or a human auditor needs. Regenerate with the same commands if the missalemeum snapshot is refreshed and the fixture needs updating; do not hand-edit this file or the fixture. diff --git a/test/fixtures/missalemeum-ef-2026-2027.txt b/test/fixtures/missalemeum-ef-2026-2027.txt index d000212..50057a6 100644 --- a/test/fixtures/missalemeum-ef-2026-2027.txt +++ b/test/fixtures/missalemeum-ef-2026-2027.txt @@ -1,730 +1,730 @@ -2026-01-01|1|w|Octave Day of Christmas|-|-|-|1 -2026-01-02|4|w|Feria|-|-|-|1 -2026-01-03|4|w|II Mass of the B. V. M. – Vultum Tuum|-|-|-|1 -2026-01-04|2|w|Holy Name of Jesus|-|-|-|1 -2026-01-05|4|w|Feria|-|St. Telesphorus Pope and Martyr|-|1 -2026-01-06|1|w|Epiphany of the Lord|-|-|-|1 -2026-01-07|4|w|Feria|-|-|-|1 -2026-01-08|4|w|Feria|-|-|-|1 -2026-01-09|4|w|Feria|-|-|-|1 -2026-01-10|4|w|II Mass of the B. V. M. – Vultum Tuum|-|-|-|1 -2026-01-11|2|w|The Holy Family: Jesus, Mary & Joseph|-|-|St. Hyginus Pope and Martyr|1 -2026-01-12|4|w|Feria|Feria_II_after_Epiphany|-|-|1 -2026-01-13|2|w|Commemoration of the Baptism of the Lord|Feria_III_after_Epiphany|-|-|1 -2026-01-14|3|w|St. Hilary|Feria_IV_after_Epiphany|S. Felicis|-|1 -2026-01-15|3|w|St. Paul, the First Hermit|Feria_V_after_Epiphany|St. Maur, Abbot|-|1 -2026-01-16|3|r|St. Marcellus I|Feria_VI_after_Epiphany|-|-|1 -2026-01-17|3|w|St. Anthony|Saturday_after_Epiphany|-|-|1 -2026-01-18|2|g|II Sunday after Epiphany|-|-|St. Prisca|1 -2026-01-19|4|g|Feria|Feria_II_after_II_Sunday_after_Epiphany|Sts. Marius, Martha, Audifax & Abachum;St. Canute, Martyr|-|1 -2026-01-20|3|r|Sts. Fabian & Sebastian|Feria_III_after_II_Sunday_after_Epiphany|-|-|1 -2026-01-21|3|r|St. Agnes|Feria_IV_after_II_Sunday_after_Epiphany|-|-|1 -2026-01-22|3|r|Sts. Vincent & Anastasius|Feria_V_after_II_Sunday_after_Epiphany|-|-|1 -2026-01-23|3|w|St. Raymond of Peñafort|Feria_VI_after_II_Sunday_after_Epiphany|St. Emerentiana|-|1 -2026-01-24|3|r|St. Timothy|Saturday_after_II_Sunday_after_Epiphany|-|-|1 -2026-01-25|2|g|III Sunday after Epiphany|-|-|Conversion of St. Paul;St. Peter|1 -2026-01-26|3|r|St. Polycarp|Feria_II_after_III_Sunday_after_Epiphany|-|-|1 -2026-01-27|3|w|St. John Chrysostom|Feria_III_after_III_Sunday_after_Epiphany|-|-|1 -2026-01-28|3|w|St. Peter Nolasco|Feria_IV_after_III_Sunday_after_Epiphany|St. Agnes|-|1 -2026-01-29|3|w|St. Francis de Sales|Feria_V_after_III_Sunday_after_Epiphany|-|-|1 -2026-01-30|3|r|St. Martina|Feria_VI_after_III_Sunday_after_Epiphany|-|-|1 -2026-01-31|3|w|St. John Bosco|Saturday_after_III_Sunday_after_Epiphany|-|-|1 -2026-02-01|2|v|Septuagesima Sunday|-|-|St. Ignatius of Antioch|1 -2026-02-02|2|w|Purification of the Blessed Virgin Mary|Feria_II_after_Septuagesima|-|-|1 -2026-02-03|4|v|Feria|Feria_III_after_Septuagesima|St. Blaise|-|1 -2026-02-04|3|w|St. Andrew Corsini|Feria_IV_after_Septuagesima|-|-|1 -2026-02-05|3|r|St. Agatha|Feria_V_after_Septuagesima|-|-|1 -2026-02-06|3|w|St. Titus|Feria_VI_after_Septuagesima|St. Dorothy|-|1 -2026-02-07|3|w|St. Romuald|Saturday_after_Septuagesima|-|-|1 -2026-02-08|2|v|Sexagesima Sunday|-|-|St. John of Matha|1 -2026-02-09|3|w|St. Cyril of Alexandria|Feria_II_after_Sexagesima|St. Appollonia|-|1 -2026-02-10|3|w|St. Scholastica|Feria_III_after_Sexagesimæ|-|-|1 -2026-02-11|3|w|Our Lady of Lourdes|Feria_IV_after_Sexagesimæ|-|-|1 -2026-02-12|3|w|Seven Holy Servite Founders|Feria_V_after_Sexagesimæ|-|-|1 -2026-02-13|4|v|Feria|Feria_VI_after_Sexagesimæ|-|-|1 -2026-02-14|4|w|III Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_Sexagesimæ|St. Valentine|-|1 -2026-02-15|2|v|Quinquagesima Sunday|-|-|Sts. Faustinus & Jovita|1 -2026-02-16|4|v|Feria|Feria_II_after_Quinquagesima|-|-|1 -2026-02-17|4|v|Feria|Feria_III_after_Quinquagesima|-|-|1 -2026-02-18|1|v|Ash Wednesday|-|-|St. Simeon|1 -2026-02-19|3|v|Feria V after Ash Wednesday|-|-|-|1 -2026-02-20|3|v|Feria VI after Ash Wednesday|-|-|-|1 -2026-02-21|3|v|Saturday after Ash Wednesday|-|-|-|1 -2026-02-22|1|v|I Sunday of Lent|-|-|Chair of St. Peter;St. Paul|1 -2026-02-23|3|v|Feria II after the I Sunday of Lent|-|St. Peter Damien|-|1 -2026-02-24|2|r|St. Matthias|Feria_III_after_the_I_Sunday_of_Lent|Feria III after the I Sunday of Lent|-|1 -2026-02-25|2|v|Ember Wednesday of Lent|-|-|-|1 -2026-02-26|3|v|Feria V after the I Sunday of Lent|-|-|-|1 -2026-02-27|2|v|Ember Friday of Lent|-|St. Gabriel of Our Lady of Sorrows|-|1 -2026-02-28|2|v|Ember Saturday of Lent|-|-|-|1 -2026-03-01|1|v|II Sunday of Lent|-|-|-|1 -2026-03-02|3|v|Feria II after the II Sunday of Lent|-|-|-|1 -2026-03-03|3|v|Feria III after the II Sunday of Lent|-|-|-|1 -2026-03-04|3|v|Feria IV after the II Sunday of Lent|-|St. Casimir;St. Lucius|-|1 -2026-03-05|3|v|Feria V after the II Sunday of Lent|-|-|-|1 -2026-03-06|3|v|Feria VI after the II Sunday of Lent|-|Sts. Felicitas & Perpetua|-|1 -2026-03-07|3|v|Saturday after the II Sunday of Lent|-|St. Thomas Aquinas|-|1 -2026-03-08|1|v|III Sunday of Lent|-|-|St. John of God|1 -2026-03-09|3|v|Feria II after the III Sunday of Lent|-|St. Frances Rome|-|1 -2026-03-10|3|v|Feria III after the III Sunday of Lent|-|Forty Holy Martyrs of Sebaste|-|1 -2026-03-11|3|v|Feria IV after the III Sunday of Lent|-|-|-|1 -2026-03-12|3|v|Feria V after the III Sunday of Lent|-|St. Gregory the Great|-|1 -2026-03-13|3|v|Feria VI after the III Sunday of Lent|-|-|-|1 -2026-03-14|3|v|Saturday after the III Sunday of Lent|-|-|-|1 -2026-03-15|1|pv|IV Sunday of Lent|-|-|-|1 -2026-03-16|3|v|Feria II after the IV Sunday of Lent|-|-|-|1 -2026-03-17|3|v|Feria III after the IV Sunday of Lent|-|St. Patrick|-|1 -2026-03-18|3|v|Feria IV after the IV Sunday of Lent|-|St. Cyril of Jerusalem|-|1 -2026-03-19|1|w|St. Joseph, Spouse of the Bl. Virgin Mary|Feria_V_after_the_IV_Sunday_of_Lent|Feria V after the IV Sunday of Lent|-|1 -2026-03-20|3|v|Feria VI after the IV Sunday of Lent|-|-|-|1 -2026-03-21|3|v|Saturday after the IV Sunday of Lent|-|St. Benedict|-|1 -2026-03-22|1|v|Passion Sunday|-|-|-|1 -2026-03-23|3|v|Feria II of Passion Week|-|-|-|1 -2026-03-24|3|v|Feria III of Passion Week|-|St. Gabriel the Archangel|-|1 -2026-03-25|1|w|Annunciation of the Blessed Virgin Mary|Feria_IV_of_Passion_Week|Feria IV of Passion Week|-|1 -2026-03-26|3|v|Feria V of Passion Week|-|-|-|1 -2026-03-27|3|v|Feria VI of Passion Week|-|For Our Lady of the Seven Sorrows|St. John Damascene|1 -2026-03-28|3|v|Saturday of Passion Week|-|St. John of Capistrano|-|1 -2026-03-29|1|rv|Palm Sunday|-|-|-|1 -2026-03-30|1|v|Feria II of Holy Week|-|-|-|1 -2026-03-31|1|v|Feria III of Holy Week|-|-|-|1 -2026-04-01|1|v|Feria IV of Holy Week|-|-|-|1 -2026-04-02|1|w|Holy Thursday|-|-|St. Francis of Paola|1 -2026-04-03|1|bv|Good Friday|-|-|-|1 -2026-04-04|1|vw|Holy Saturday|-|-|St. Isidore of Seville|1 -2026-04-05|1|w|Easter Sunday|-|-|St. Vincent Ferrer|1 -2026-04-06|1|w|Monday in the Octave of Easter|-|-|-|1 -2026-04-07|1|w|Tuesday in the Octave of Easter|-|-|-|1 -2026-04-08|1|w|Wednesday in the Octave of Easter|-|-|-|1 -2026-04-09|1|w|Thursday in the Octave of Easter|-|-|-|1 -2026-04-10|1|w|Friday in the Octave of Easter|-|-|-|1 -2026-04-11|1|w|Saturday in the Octave of Easter|-|-|St. Leo the Great|1 -2026-04-12|1|w|Low Sunday|-|-|-|1 -2026-04-13|3|r|St. Hermenegild|Monday_after_I_Sunday_after_Easter|-|-|1 -2026-04-14|3|r|St. Justin|Tuesday_after_I_Sunday_after_Easter|Sts. Tiburtius, Valerian et Maximus, Martyrs|-|1 -2026-04-15|4|w|Feria|Wednesday_after_I_Sunday_after_Easter|-|-|1 -2026-04-16|4|w|Feria|Thursday_after_I_Sunday_after_Easter|-|-|1 -2026-04-17|4|w|Feria|Friday_after_I_Sunday_after_Easter|St. Anicetus|-|1 -2026-04-18|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_I_Sunday_after_Easter|-|-|1 -2026-04-19|2|w|II Sunday after Easter|-|-|-|1 -2026-04-20|4|w|Feria|Monday_after_II_Sunday_after_Easter|-|-|1 -2026-04-21|3|w|St. Anselm|Tuesday_after_II_Sunday_after_Easter|-|-|1 -2026-04-22|3|r|Sts. Soter & Caius|Wednesday_after_II_Sunday_after_Easter|-|-|1 -2026-04-23|4|w|Feria|Thursday_after_II_Sunday_after_Easter|St. George|-|1 -2026-04-24|3|r|St. Fidelis of Sigmaringen|Friday_after_II_Sunday_after_Easter|-|-|1 -2026-04-25|2|r|St. Mark|Saturday_after_II_Sunday_after_Easter|Pro rogationibus|-|1 -2026-04-26|2|w|III Sunday after Easter|-|-|Sts. Cletus & Marcellinus|1 -2026-04-27|3|w|St. Peter Canisius|Monday_after_III_Sunday_after_Easter|-|-|1 -2026-04-28|3|w|St. Paul of the Cross|Tuesday_after_III_Sunday_after_Easter|-|-|1 -2026-04-29|3|r|St. Peter of Verona|Wednesday_after_III_Sunday_after_Easter|-|-|1 -2026-04-30|3|w|St. Catherine of Siena|Thursday_after_III_Sunday_after_Easter|-|-|1 -2026-05-01|1|w|St. Joseph the Workman|Friday_after_III_Sunday_after_Easter|-|-|1 -2026-05-02|3|w|St. Athanasius|Saturday_after_III_Sunday_after_Easter|-|-|1 -2026-05-03|2|w|IV Sunday after Easter|-|-|Sts. Alexander & Companions|1 -2026-05-04|3|w|St. Monica|Monday_after_IV_Sunday_after_Easter|-|-|1 -2026-05-05|3|w|St. Pius V|Tuesday_after_IV_Sunday_after_Easter|-|-|1 -2026-05-06|4|w|Feria|Wednesday_after_IV_Sunday_after_Easter|-|-|1 -2026-05-07|3|r|St. Stanislaus|Thursday_after_IV_Sunday_after_Easter|-|-|1 -2026-05-08|4|w|Feria|Friday_after_IV_Sunday_after_Easter|-|-|1 -2026-05-09|3|w|St. Gregory of Nazianzen|Saturday_after_IV_Sunday_after_Easter|-|-|1 -2026-05-10|2|w|V Sunday after Easter|-|-|St. Antoninus;St. Gordiano and Epimacho|1 -2026-05-11|2|r|Sts. Philip & James|The_Minor_Litanies_–_Rogations|-|-|1 -2026-05-12|3|r|Sts. Nereus, Achilleus, Domitilla, & Pancras|The_Minor_Litanies_–_Rogations|-|-|1 -2026-05-13|2|w|Vigil of the Ascension|-|St. Robert Bellarmine|-|1 -2026-05-14|1|w|Ascension of the Lord|-|-|St. Boniface|1 -2026-05-15|3|w|St. John Baptist de la Salle|Feria_VI_after_the_Ascension|-|-|1 -2026-05-16|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_the_Ascension|St. Ubaldus|-|1 -2026-05-17|2|w|Sunday after the Ascension|-|-|St. Paschal Baylon|1 -2026-05-18|3|r|St. Venantius|Feria_II_after_the_Ascension|-|-|1 -2026-05-19|3|w|St. Peter Celestine|Feria_III_after_the_Ascension|St. Pudentiana Virginis|-|1 -2026-05-20|3|w|St. Bernardine of Siena|Feria_IV_after_the_Ascension|-|-|1 -2026-05-21|4|w|Feria|Feria_V_after_the_Ascension|-|-|1 -2026-05-22|4|w|Feria|Feria_VI_after_the_Ascension|-|-|1 -2026-05-23|1|r|Saturday after the Ascension|-|-|-|1 -2026-05-24|1|r|Pentecost Sunday|-|-|-|1 -2026-05-25|1|r|Monday after Pentecost|-|-|St. Gregory VII;St. Urban, Pope and Martyr|1 -2026-05-26|1|r|Tuesday after Pentecost|-|-|St. Philip Neri;S. Eleutherius|1 -2026-05-27|1|r|Ember Wednesday of Pentecost|-|-|St. Bede the Venerable;St. John I|1 -2026-05-28|1|r|Thursday after Pentecost|-|-|St. Augustine of Canterbury|1 -2026-05-29|1|r|Ember Friday of Pentecost|-|-|St. Mary Magdalene de Pazzi|1 -2026-05-30|1|r|Ember Saturday of Pentecost|-|-|St. Felix I|1 -2026-05-31|1|w|Trinity Sunday|-|-|Queenship of the Blessed Virgin Mary;St. Petronilla|1 -2026-06-01|3|w|St. Angela Merici|Feria_II_after_I_Sunday_after_Pentecost|-|-|1 -2026-06-02|4|g|Feria|Feria_III_after_I_Sunday_after_Pentecost|Sts. Marcellinus, Peter, & Erasmus|-|1 -2026-06-03|4|g|Feria|Feria_IV_after_I_Sunday_after_Pentecost|-|-|1 -2026-06-04|1|w|Corpus Christi|-|-|St. Francis Caracciolo|1 -2026-06-05|3|r|St. Boniface|Feria_V_after_I_Sunday_after_Pentecost|-|-|1 -2026-06-06|3|w|St. Norbert|Saturday_after_I_Sunday_after_Pentecost|-|-|1 -2026-06-07|2|g|II Sunday after Pentecost|-|-|-|1 -2026-06-08|4|g|Feria|Feria_II_after_II_Sunday_after_Pentecost|-|-|1 -2026-06-09|4|g|Feria|Feria_III_after_II_Sunday_after_Pentecost|Sts. Primus & Felicianus|-|1 -2026-06-10|3|w|St. Margaret of Scotland|Feria_IV_after_II_Sunday_after_Pentecost|-|-|1 -2026-06-11|3|r|St. Barnabas|Feria_V_after_II_Sunday_after_Pentecost|-|-|1 -2026-06-12|1|w|Sacred Heart of Jesus|-|-|St. John of San Fecundo;St. Basilidus|1 -2026-06-13|3|w|St. Anthony of Padua|Saturday_after_II_Sunday_after_Pentecost|-|-|1 -2026-06-14|2|g|III Sunday after Pentecost|-|-|St. Basil the Great|1 -2026-06-15|4|g|Feria|Feria_II_after_III_Sunday_after_Pentecost|St. Vitus|-|1 -2026-06-16|4|g|Feria|Feria_III_after_III_Sunday_after_Pentecost|-|-|1 -2026-06-17|3|w|St. Gregory Barbarigo|Feria_IV_after_III_Sunday_after_Pentecost|-|-|1 -2026-06-18|3|r|St. Ephrem of Syria|Feria_V_after_III_Sunday_after_Pentecost|Ss. Marcus and Marcellianus|-|1 -2026-06-19|3|r|St. Julia of Falconieri|Feria_VI_after_III_Sunday_after_Pentecost|Sts. Gervasius and Protasius|-|1 -2026-06-20|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_III_Sunday_after_Pentecost|St. Silverius|-|1 -2026-06-21|2|g|IV Sunday after Pentecost|-|-|St. Aloysius Gongzaga|1 -2026-06-22|3|w|St. Paulinus of Nola|Feria_II_after_IV_Sunday_after_Pentecost|-|-|1 -2026-06-23|2|v|Vigil of the Nativity of St. John the Baptist|Feria_III_after_IV_Sunday_after_Pentecost|-|-|1 -2026-06-24|1|w|Nativity of St. John the Baptist|Feria_IV_after_IV_Sunday_after_Pentecost|-|-|1 -2026-06-25|3|w|St. William|Feria_V_after_IV_Sunday_after_Pentecost|-|-|1 -2026-06-26|3|r|Sts. John & Paul|Feria_VI_after_IV_Sunday_after_Pentecost|-|-|1 -2026-06-27|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_IV_Sunday_after_Pentecost|-|-|1 -2026-06-28|2|g|V Sunday after Pentecost|-|Vigil of Sts. Peter & Paul|-|1 -2026-06-29|1|r|Sts. Peter & Paul|Feria_II_after_V_Sunday_after_Pentecost|-|-|1 -2026-06-30|3|r|In Commemoratione Sancti Pauli Apostoli|Feria_III_after_V_Sunday_after_Pentecost|-|-|1 -2026-07-01|1|r|The Precious Blood of Our Lord Jesus Christ|Feria_IV_after_V_Sunday_after_Pentecost|-|-|1 -2026-07-02|2|w|Visitation of the Blessed Virgin Mary|Feria_V_after_V_Sunday_after_Pentecost|SS. Processus and Martinian|-|1 -2026-07-03|3|r|St. Irenaeus|Feria_VI_after_V_Sunday_after_Pentecost|-|-|1 -2026-07-04|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_V_Sunday_after_Pentecost|-|-|1 -2026-07-05|2|g|VI Sunday after Pentecost|-|-|St. Anthony Mary Zaccariah|1 -2026-07-06|4|g|Feria|Feria_II_after_VI_Sunday_after_Pentecost|-|-|1 -2026-07-07|3|w|Sts. Cyril & Methodius|Feria_III_after_VI_Sunday_after_Pentecost|-|-|1 -2026-07-08|3|w|St. Elizabeth of Portugal|Feria_IV_after_VI_Sunday_after_Pentecost|-|-|1 -2026-07-09|4|g|Feria|Feria_V_after_VI_Sunday_after_Pentecost|-|-|1 -2026-07-10|3|r|Seven Holy Brothers and Sts. Rufina & Secunda|Feria_VI_after_VI_Sunday_after_Pentecost|-|-|1 -2026-07-11|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_VI_Sunday_after_Pentecost|St. Pius I|-|1 -2026-07-12|2|g|VII Sunday after Pentecost|-|-|St. John Gualbert;Ss. Naboris et Felicis|1 -2026-07-13|4|g|Feria|Feria_II_after_VII_Sunday_after_Pentecost|-|-|1 -2026-07-14|3|w|St. Bonaventure|Feria_III_after_VII_Sunday_after_Pentecost|-|-|1 -2026-07-15|3|w|St. Henry the Emperor|Feria_IV_after_VII_Sunday_after_Pentecost|-|-|1 -2026-07-16|4|g|Feria|Feria_V_after_VII_Sunday_after_Pentecost|Our Lady of Mt. Carmel|-|1 -2026-07-17|4|g|Feria|Feria_VI_after_VII_Sunday_after_Pentecost|St. Alexis|-|1 -2026-07-18|3|r|Camillus de Lellis|Saturday_after_VII_Sunday_after_Pentecost|Ss. Symphorosa and sons|-|1 -2026-07-19|2|g|VIII Sunday after Pentecost|-|-|St. Vincent de Paul|1 -2026-07-20|3|r|St. Jerome Emiliani|Feria_II_after_VIII_Sunday_after_Pentecost|St. Margaret|-|1 -2026-07-21|3|w|St. Laurence of Brindisi|Feria_III_after_VIII_Sunday_after_Pentecost|St. Praxedis Virginis|-|1 -2026-07-22|3|w|St. Mary Magdalene|Feria_IV_after_VIII_Sunday_after_Pentecost|-|-|1 -2026-07-23|3|w|St. Apollinaris|Feria_V_after_VIII_Sunday_after_Pentecost|S. Liborii|-|1 -2026-07-24|4|g|Feria|Feria_VI_after_VIII_Sunday_after_Pentecost|St. Christina|-|1 -2026-07-25|2|r|St. James the Greater|Saturday_after_VIII_Sunday_after_Pentecost|St. Christopher|-|1 -2026-07-26|2|g|IX Sunday after Pentecost|-|St. Anne, Mother of the Blessed Virgin|-|1 -2026-07-27|4|g|Feria|Feria_II_after_IX_Sunday_after_Pentecost|St. Pantaleon|-|1 -2026-07-28|3|r|Sts. Nazarius & Celsus, St. Victor I & St. Innocent I|Feria_III_after_IX_Sunday_after_Pentecost|-|-|1 -2026-07-29|3|r|St. Martha|Feria_IV_after_IX_Sunday_after_Pentecost|Ss. Felicis, Simplicii, Faustini et Beatricis|-|1 -2026-07-30|4|g|Feria|Feria_V_after_IX_Sunday_after_Pentecost|Sts. Abdon & Sennen|-|1 -2026-07-31|3|w|St. Ignatius Loyola|Feria_VI_after_IX_Sunday_after_Pentecost|-|-|1 -2026-08-01|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_IX_Sunday_after_Pentecost|Holy Machabees|-|1 -2026-08-02|2|g|X Sunday after Pentecost|-|-|St. Alphonsus Liguori;St. Stephen I, Pope and Martyr|1 -2026-08-03|4|g|Feria|Feria_II_after_X_Sunday_after_Pentecost|-|-|1 -2026-08-04|3|w|St. Dominic|Feria_III_after_X_Sunday_after_Pentecost|-|-|1 -2026-08-05|3|w|Dedication of the Basilica of St. Mary Major|Feria_IV_after_X_Sunday_after_Pentecost|-|-|1 -2026-08-06|2|w|Transfiguration of Our Lord|Feria_V_after_X_Sunday_after_Pentecost|Pope Sixtus II, Felicissimus and Agapitus, Martyrs|-|1 -2026-08-07|3|w|St. Cajetan|Feria_VI_after_X_Sunday_after_Pentecost|St. Donatus|-|1 -2026-08-08|3|w|St. John Mary Vianney|Saturday_after_X_Sunday_after_Pentecost|Ss. Cyriacus, Largus and Smaragdus, Martyrs|-|1 -2026-08-09|3|r|Vigil of St. Lawrence|XI_Sunday_after_Pentecost|St. Romanus|-|1 -2026-08-10|2|r|St. Lawrence|Feria_II_after_XI_Sunday_after_Pentecost|-|-|1 -2026-08-11|4|g|Feria|Feria_III_after_XI_Sunday_after_Pentecost|Sts. Tiburtius & Susanna|-|1 -2026-08-12|3|w|St. Clare|Feria_IV_after_XI_Sunday_after_Pentecost|-|-|1 -2026-08-13|4|g|Feria|Feria_V_after_XI_Sunday_after_Pentecost|Sts. Hippolytus & Cassian|-|1 -2026-08-14|2|w|Vigil of the Assumption|Feria_VI_after_XI_Sunday_after_Pentecost|St. Eusebius|-|1 -2026-08-15|1|w|Assumption of the Blessed Virgin Mary|Saturday_after_XI_Sunday_after_Pentecost|-|-|1 -2026-08-16|2|g|XII Sunday after Pentecost|-|St. Joachim, Father of the Blessed Virgin|-|1 -2026-08-17|3|w|St. Hyacinth|Feria_II_after_XII_Sunday_after_Pentecost|-|-|1 -2026-08-18|4|g|Feria|Feria_III_after_XII_Sunday_after_Pentecost|St. Agapitus|-|1 -2026-08-19|3|w|St. John Eudes|Feria_IV_after_XII_Sunday_after_Pentecost|-|-|1 -2026-08-20|3|w|St. Bernard of Clairvaux|Feria_V_after_XII_Sunday_after_Pentecost|-|-|1 -2026-08-21|3|w|St. Jane Frances de Chantal|Feria_VI_after_XII_Sunday_after_Pentecost|-|-|1 -2026-08-22|2|w|Immaculate Heart of Mary|Saturday_after_XII_Sunday_after_Pentecost|Sts. Timothy, Hippolytus and Symphorianus, Martyrs|-|1 -2026-08-23|2|g|XIII Sunday after Pentecost|-|-|St. Philip Benizi|1 -2026-08-24|2|r|St. Bartholomew|Feria_II_after_XIII_Sunday_after_Pentecost|-|-|1 -2026-08-25|3|w|St. Louis IX|Feria_III_after_XIII_Sunday_after_Pentecost|-|-|1 -2026-08-26|4|g|Feria|Feria_IV_after_XIII_Sunday_after_Pentecost|St. Zephyrinus|-|1 -2026-08-27|3|w|St. Joseph Calasance|Feria_V_after_XIII_Sunday_after_Pentecost|-|-|1 -2026-08-28|3|r|St. Augustine|Feria_VI_after_XIII_Sunday_after_Pentecost|St. Hermes|-|1 -2026-08-29|3|r|Beheading of St. John the Baptist|Saturday_after_XIII_Sunday_after_Pentecost|St. Sabina|-|1 -2026-08-30|2|g|XIV Sunday after Pentecost|-|-|St. Rose of Lima;Sts. Felix and Adauctus|1 -2026-08-31|3|w|St. Raymond Nonnatus|Feria_II_after_XIV_Sunday_after_Pentecost|-|-|1 -2026-09-01|4|g|Feria|Feria_III_after_XIV_Sunday_after_Pentecost|St. Giles;Twelve Holy Brothers, Martyrs|-|1 -2026-09-02|3|w|St. Stephen of Hungary|Feria_IV_after_XIV_Sunday_after_Pentecost|-|-|1 -2026-09-03|3|w|St. Pius X|Feria_V_after_XIV_Sunday_after_Pentecost|-|-|1 -2026-09-04|4|g|Feria|Feria_VI_after_XIV_Sunday_after_Pentecost|-|-|1 -2026-09-05|3|w|St. Lawrence Justinian|Saturday_after_XIV_Sunday_after_Pentecost|-|-|1 -2026-09-06|2|g|XV Sunday after Pentecost|-|-|-|1 -2026-09-07|4|g|Feria|Feria_II_after_XV_Sunday_after_Pentecost|-|-|1 -2026-09-08|2|w|Nativity of the Blessed Virgin Mary|Feria_III_after_XV_Sunday_after_Pentecost|S. Hadriani|-|1 -2026-09-09|4|g|Feria|Feria_IV_after_XV_Sunday_after_Pentecost|St. Gorgonius|-|1 -2026-09-10|3|w|St. Nicholas of Tolentino|Feria_V_after_XV_Sunday_after_Pentecost|-|-|1 -2026-09-11|4|g|Feria|Feria_VI_after_XV_Sunday_after_Pentecost|Sts. Protus & Hyacinth|-|1 -2026-09-12|3|w|Most Holy Name of Mary|Saturday_after_XV_Sunday_after_Pentecost|-|-|1 -2026-09-13|2|g|XVI Sunday after Pentecost|-|-|-|1 -2026-09-14|2|r|Exaltation of the Holy Cross|Feria_II_after_XVI_Sunday_after_Pentecost|-|-|1 -2026-09-15|2|w|Seven Sorrows of the Blessed Virgin Mary|Feria_III_after_XVI_Sunday_after_Pentecost|S. Nicomedes|-|1 -2026-09-16|3|r|Sts. Cornelius & Cyprian|Feria_IV_after_XVI_Sunday_after_Pentecost|Sts. Euphemia, Lucy and Geminianus|-|1 -2026-09-17|4|g|Feria|Feria_V_after_XVI_Sunday_after_Pentecost|Stigmata of St. Francis|-|1 -2026-09-18|3|w|St. Joseph of Cupertino|Feria_VI_after_XVI_Sunday_after_Pentecost|-|-|1 -2026-09-19|3|r|St. Januarius & Companions|Saturday_after_XVI_Sunday_after_Pentecost|-|-|1 -2026-09-20|2|g|XVII Sunday after Pentecost|-|-|Sts. Eustace & Companions|1 -2026-09-21|2|r|St. Matthew|Feria_II_after_XVII_Sunday_after_Pentecost|-|-|1 -2026-09-22|3|w|St. Thomas of Villanova|Feria_III_after_XVII_Sunday_after_Pentecost|St. Maurice and Companions, Martyrs|-|1 -2026-09-23|2|v|Ember Wednesday of September|-|St. Linus|St. Thecla|1 -2026-09-24|4|g|Feria|Feria_V_after_XVII_Sunday_after_Pentecost|Our Lady of Ransom|-|1 -2026-09-25|2|v|Ember Friday of September|-|-|-|1 -2026-09-26|2|v|Ember Saturday of September|-|Sts. Cyprian & Justina|-|1 -2026-09-27|2|g|XVIII Sunday after Pentecost|-|-|Sts. Cosmas & Damian|1 -2026-09-28|3|r|St. Wenceslaus|Feria_II_after_XVIII_Sunday_after_Pentecost|-|-|1 -2026-09-29|1|w|Dedication of St. Michael the Archangel|Feria_III_after_XVIII_Sunday_after_Pentecost|-|-|1 -2026-09-30|3|w|St. Jerome|Feria_IV_after_XVIII_Sunday_after_Pentecost|-|-|1 -2026-10-01|4|g|Feria|Feria_V_after_XVIII_Sunday_after_Pentecost|St. Remigius|-|1 -2026-10-02|3|w|Holy Guardian Angels|Feria_VI_after_XVIII_Sunday_after_Pentecost|-|-|1 -2026-10-03|3|w|St. Theresa of the Infant Jesus|Saturday_after_XVIII_Sunday_after_Pentecost|-|-|1 -2026-10-04|2|g|XIX Sunday after Pentecost|-|-|St. Francis of Assisi|1 -2026-10-05|4|g|Feria|Feria_II_after_XIX_Sunday_after_Pentecost|St. Placid & Companions|-|1 -2026-10-06|3|w|St. Bruno|Feria_III_after_XIX_Sunday_after_Pentecost|-|-|1 -2026-10-07|2|w|Our Lady of the Rosary|Feria_IV_after_XIX_Sunday_after_Pentecost|St. Mark I|-|1 -2026-10-08|3|w|St. Bridget of Sweden|Feria_V_after_XIX_Sunday_after_Pentecost|Ss. Sergio, Baccho, Marcello and Apulejo Martyrs|-|1 -2026-10-09|3|w|St. John Leonardi|Feria_VI_after_XIX_Sunday_after_Pentecost|St. Dionysius and companions|-|1 -2026-10-10|3|w|St. Francis Borgia|Saturday_after_XIX_Sunday_after_Pentecost|-|-|1 -2026-10-11|2|g|XX Sunday after Pentecost|-|Maternity of the Blessed Virgin Mary|-|1 -2026-10-12|4|g|Feria|Feria_II_after_XX_Sunday_after_Pentecost|-|-|1 -2026-10-13|3|w|St. Edward|Feria_III_after_XX_Sunday_after_Pentecost|-|-|1 -2026-10-14|3|r|St. Callistus I|Feria_IV_after_XX_Sunday_after_Pentecost|-|-|1 -2026-10-15|3|w|St. Teresa of Avila|Feria_V_after_XX_Sunday_after_Pentecost|-|-|1 -2026-10-16|3|w|St. Hedwig|Feria_VI_after_XX_Sunday_after_Pentecost|-|-|1 -2026-10-17|3|w|St. Margaret Mary Alacoque|Saturday_after_XX_Sunday_after_Pentecost|-|-|1 -2026-10-18|2|g|XXI Sunday after Pentecost|-|St. Luke the Evangelist|-|1 -2026-10-19|3|w|St. Peter of Alcantara|Feria_II_after_XXI_Sunday_after_Pentecost|-|-|1 -2026-10-20|3|w|St. John Cantius|Feria_III_after_XXI_Sunday_after_Pentecost|-|-|1 -2026-10-21|4|g|Feria|Feria_IV_after_XXI_Sunday_after_Pentecost|St. Hilarion;St. Ursula and Companions|-|1 -2026-10-22|4|g|Feria|Feria_V_after_XXI_Sunday_after_Pentecost|-|-|1 -2026-10-23|3|w|St. Anthony Mary Claret|Feria_VI_after_XXI_Sunday_after_Pentecost|-|-|1 -2026-10-24|3|w|St. Raphael the Archangel|Saturday_after_XXI_Sunday_after_Pentecost|-|-|1 -2026-10-25|1|w|Christ the King|XXII_Sunday_after_Pentecost|-|Sts. Chrysanthus & Daria|1 -2026-10-26|4|g|Feria|Feria_II_after_XXII_Sunday_after_Pentecost|St. Evaristus|-|1 -2026-10-27|4|g|Feria|Feria_III_after_XXII_Sunday_after_Pentecost|-|-|1 -2026-10-28|2|r|Sts. Simon & Jude|Feria_IV_after_XXII_Sunday_after_Pentecost|-|-|1 -2026-10-29|4|g|Feria|Feria_V_after_XXII_Sunday_after_Pentecost|-|-|1 -2026-10-30|4|g|Feria|Feria_VI_after_XXII_Sunday_after_Pentecost|-|-|1 -2026-10-31|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXII_Sunday_after_Pentecost|-|-|1 -2026-11-01|1|w|All Saints|XXIII_Sunday_after_Pentecost|-|-|1 -2026-11-02|1|b|Commemoration of All Souls|Feria_II_after_XXIII_Sunday_after_Pentecost|-|-|3 -2026-11-03|4|g|Feria|Feria_III_after_XXIII_Sunday_after_Pentecost|-|-|1 -2026-11-04|3|w|St. Charles Borromeo|Feria_IV_after_XXIII_Sunday_after_Pentecost|Sts. Vitalis and Agricola, Martyrs|-|1 -2026-11-05|4|g|Feria|Feria_V_after_XXIII_Sunday_after_Pentecost|-|-|1 -2026-11-06|4|g|Feria|Feria_VI_after_XXIII_Sunday_after_Pentecost|-|-|1 -2026-11-07|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXIII_Sunday_after_Pentecost|-|-|1 -2026-11-08|2|g|V Sunday after Epiphany|-|-|Four Holy Crowned Martyrs|1 -2026-11-09|2|w|Dedication of the Archbasilica of Our Holy Savior|Feria_II_after_V_Sunday_after_Epiphany|St. Theodore|-|1 -2026-11-10|3|w|St. Andrew Avellino|Feria_III_after_V_Sunday_after_Epiphany|Sts. Tryphonis, Respicii, et Nymphae|-|1 -2026-11-11|3|w|St. Martin of Tours|Feria_IV_after_V_Sunday_after_Epiphany|St. Menna|-|1 -2026-11-12|3|r|St. Martin I|Feria_V_after_V_Sunday_after_Epiphany|-|-|1 -2026-11-13|4|g|Feria|Feria_VI_after_V_Sunday_after_Epiphany|St. Didacus|-|1 -2026-11-14|3|w|St. Josaphat|Saturday_after_V_Sunday_after_Epiphany|-|-|1 -2026-11-15|2|g|VI Sunday after Epiphany|-|-|St. Albert the Great|1 -2026-11-16|3|w|St. Gertrude the Great|Feria_II_after_VI_Sunday_after_Epiphany|-|-|1 -2026-11-17|3|w|St. Gregory the Wonderworker|Feria_III_after_VI_Sunday_after_Epiphany|-|-|1 -2026-11-18|3|w|Dedication of the Basilicas of Sts. Peter & Paul|Feria_IV_after_VI_Sunday_after_Epiphany|-|-|1 -2026-11-19|3|w|St. Elizabeth of Hungary|Feria_V_after_VI_Sunday_after_Epiphany|St. Pontian|-|1 -2026-11-20|3|w|St. Felix of Valois|Feria_VI_after_VI_Sunday_after_Epiphany|-|-|1 -2026-11-21|3|w|Presentation of the Blessed Virgin Mary|Saturday_after_VI_Sunday_after_Epiphany|-|-|1 -2026-11-22|2|g|XXIV Sunday after Pentecost|-|-|St. Cecilia|1 -2026-11-23|3|r|St. Clement I|Feria_II_after_XXIV_Sunday_after_Pentecost|St. Felicity|-|1 -2026-11-24|3|w|St. John of the Cross|Feria_III_after_XXIV_Sunday_after_Pentecost|St. Chrysogonus|-|1 -2026-11-25|3|r|St. Catherine of Alexandria|Feria_IV_after_XXIV_Sunday_after_Pentecost|-|-|1 -2026-11-26|3|w|St. Sylvester|Feria_V_after_XXIV_Sunday_after_Pentecost|St. Peter of Alexandria|-|1 -2026-11-27|4|g|Feria|Feria_VI_after_XXIV_Sunday_after_Pentecost|-|-|1 -2026-11-28|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXIV_Sunday_after_Pentecost|-|-|1 -2026-11-29|1|v|I Sunday of Advent|-|-|St. Saturninus|1 -2026-11-30|2|r|St. Andrew|Feria_II_after_I_Sunday_of_Advent|-|-|1 -2026-12-01|3|v|Feria III after I Sunday of Advent|-|-|-|1 -2026-12-02|3|r|St. Vivian|Feria_IV_after_I_Sunday_of_Advent|Feria IV after I Sunday of Advent|-|1 -2026-12-03|3|w|St. Francis Xavier|Feria_V_after_I_Sunday_of_Advent|Feria V after I Sunday of Advent|-|1 -2026-12-04|3|w|St. Peter Chrysologus|Feria_VI_after_I_Sunday_of_Advent|Feria VI after I Sunday of Advent|-|1 -2026-12-05|3|v|Sabbato after I Sunday of Advent|-|St. Sabbas|-|1 -2026-12-06|1|v|II Sunday of Advent|-|-|St. Nicholas|1 -2026-12-07|3|w|St. Ambrose|Feria_II_after_II_Sunday_of_Advent|Feria II after II Sunday of Advent|-|1 -2026-12-08|1|w|Immaculate Conception of the Blessed Virgin Mary|Feria_III_after_II_Sunday_of_Advent|-|-|1 -2026-12-09|3|v|Feria IV after II Sunday of Advent|-|-|-|1 -2026-12-10|3|v|Feria V after II Sunday of Advent|-|St. Melchiades|-|1 -2026-12-11|3|w|St. Damasus I|Feria_VI_after_II_Sunday_of_Advent|Feria VI after II Sunday of Advent|-|1 -2026-12-12|3|v|Sabbato after II Sunday of Advent|-|-|-|1 -2026-12-13|1|pv|III Sunday of Advent|-|-|St. Lucy|1 -2026-12-14|3|pv|Feria II after III Sunday of Advent|-|-|-|1 -2026-12-15|3|pv|Feria III after III Sunday of Advent|-|-|-|1 -2026-12-16|2|v|Ember Wednesday of Advent|-|St. Eusebius|-|1 -2026-12-17|2|pv|Feria V after III Sunday of Advent|-|-|-|1 -2026-12-18|2|v|Ember Friday of Advent|-|-|-|1 -2026-12-19|2|v|Ember Saturday of Advent|-|-|-|1 -2026-12-20|1|v|IV Sunday of Advent|-|-|-|1 -2026-12-21|2|r|St. Thomas|Feria_II_after_IV_Sunday_of_Advent|Feria II after IV Sunday of Advent|-|1 -2026-12-22|2|v|Feria III after IV Sunday of Advent|-|-|-|1 -2026-12-23|2|v|Feria IV after IV Sunday of Advent|-|-|-|1 -2026-12-24|1|v|Vigil of Christmas|-|-|-|1 -2026-12-25|1|w|The Nativity of Our Lord|-|-|-|3 -2026-12-26|2|r|St. Stephen|-|For Octave of the Nativity|-|1 -2026-12-27|2|w|Sunday in the Octave of Christmas|-|St. John the Evangelist|For Octave of the Nativity|1 -2026-12-28|2|r|Holy Innocents|-|For Octave of the Nativity|-|1 -2026-12-29|2|w|Feria in the Octave of Christmas|-|St. Thomas Becket|-|1 -2026-12-30|2|w|Feria in the Octave of Christmas|-|-|-|1 -2026-12-31|2|w|Feria in the Octave of Christmas|-|St. Silvester|-|1 -2027-01-01|1|w|Octave Day of Christmas|-|-|-|1 -2027-01-02|4|w|II Mass of the B. V. M. – Vultum Tuum|-|-|-|1 -2027-01-03|2|w|Holy Name of Jesus|-|-|-|1 -2027-01-04|4|w|Feria|-|-|-|1 -2027-01-05|4|w|Feria|-|St. Telesphorus Pope and Martyr|-|1 -2027-01-06|1|w|Epiphany of the Lord|-|-|-|1 -2027-01-07|4|w|Feria|-|-|-|1 -2027-01-08|4|w|Feria|-|-|-|1 -2027-01-09|4|w|II Mass of the B. V. M. – Vultum Tuum|-|-|-|1 -2027-01-10|2|w|The Holy Family: Jesus, Mary & Joseph|-|-|-|1 -2027-01-11|4|w|Feria|Feria_II_after_Epiphany|St. Hyginus Pope and Martyr|-|1 -2027-01-12|4|w|Feria|Feria_III_after_Epiphany|-|-|1 -2027-01-13|2|w|Commemoration of the Baptism of the Lord|Feria_IV_after_Epiphany|-|-|1 -2027-01-14|3|w|St. Hilary|Feria_V_after_Epiphany|S. Felicis|-|1 -2027-01-15|3|w|St. Paul, the First Hermit|Feria_VI_after_Epiphany|St. Maur, Abbot|-|1 -2027-01-16|3|r|St. Marcellus I|Saturday_after_Epiphany|-|-|1 -2027-01-17|2|g|II Sunday after Epiphany|-|-|St. Anthony|1 -2027-01-18|4|g|Feria|Feria_II_after_II_Sunday_after_Epiphany|St. Prisca|-|1 -2027-01-19|4|g|Feria|Feria_III_after_II_Sunday_after_Epiphany|Sts. Marius, Martha, Audifax & Abachum;St. Canute, Martyr|-|1 -2027-01-20|3|r|Sts. Fabian & Sebastian|Feria_IV_after_II_Sunday_after_Epiphany|-|-|1 -2027-01-21|3|r|St. Agnes|Feria_V_after_II_Sunday_after_Epiphany|-|-|1 -2027-01-22|3|r|Sts. Vincent & Anastasius|Feria_VI_after_II_Sunday_after_Epiphany|-|-|1 -2027-01-23|3|w|St. Raymond of Peñafort|Saturday_after_II_Sunday_after_Epiphany|St. Emerentiana|-|1 -2027-01-24|2|v|Septuagesima Sunday|-|-|St. Timothy|1 -2027-01-25|3|w|Conversion of St. Paul|Feria_II_after_Septuagesima|St. Peter|-|1 -2027-01-26|3|r|St. Polycarp|Feria_III_after_Septuagesima|-|-|1 -2027-01-27|3|w|St. John Chrysostom|Feria_IV_after_Septuagesima|-|-|1 -2027-01-28|3|w|St. Peter Nolasco|Feria_V_after_Septuagesima|St. Agnes|-|1 -2027-01-29|3|w|St. Francis de Sales|Feria_VI_after_Septuagesima|-|-|1 -2027-01-30|3|r|St. Martina|Saturday_after_Septuagesima|-|-|1 -2027-01-31|2|v|Sexagesima Sunday|-|-|St. John Bosco|1 -2027-02-01|3|r|St. Ignatius of Antioch|Feria_II_after_Sexagesima|-|-|1 -2027-02-02|2|w|Purification of the Blessed Virgin Mary|Feria_III_after_Sexagesimæ|-|-|1 -2027-02-03|4|v|Feria|Feria_IV_after_Sexagesimæ|St. Blaise|-|1 -2027-02-04|3|w|St. Andrew Corsini|Feria_V_after_Sexagesimæ|-|-|1 -2027-02-05|3|r|St. Agatha|Feria_VI_after_Sexagesimæ|-|-|1 -2027-02-06|3|w|St. Titus|Saturday_after_Sexagesimæ|St. Dorothy|-|1 -2027-02-07|2|v|Quinquagesima Sunday|-|-|St. Romuald|1 -2027-02-08|3|w|St. John of Matha|Feria_II_after_Quinquagesima|-|-|1 -2027-02-09|3|w|St. Cyril of Alexandria|Feria_III_after_Quinquagesima|St. Appollonia|-|1 -2027-02-10|1|v|Ash Wednesday|-|-|St. Scholastica|1 -2027-02-11|3|v|Feria V after Ash Wednesday|-|Our Lady of Lourdes|-|1 -2027-02-12|3|v|Feria VI after Ash Wednesday|-|Seven Holy Servite Founders|-|1 -2027-02-13|3|v|Saturday after Ash Wednesday|-|-|-|1 -2027-02-14|1|v|I Sunday of Lent|-|-|St. Valentine|1 -2027-02-15|3|v|Feria II after the I Sunday of Lent|-|Sts. Faustinus & Jovita|-|1 -2027-02-16|3|v|Feria III after the I Sunday of Lent|-|-|-|1 -2027-02-17|2|v|Ember Wednesday of Lent|-|-|-|1 -2027-02-18|3|v|Feria V after the I Sunday of Lent|-|St. Simeon|-|1 -2027-02-19|2|v|Ember Friday of Lent|-|-|-|1 -2027-02-20|2|v|Ember Saturday of Lent|-|-|-|1 -2027-02-21|1|v|II Sunday of Lent|-|-|-|1 -2027-02-22|2|w|Chair of St. Peter|Feria_II_after_the_II_Sunday_of_Lent|St. Paul;Feria II after the II Sunday of Lent|-|1 -2027-02-23|3|v|Feria III after the II Sunday of Lent|-|St. Peter Damien|-|1 -2027-02-24|2|r|St. Matthias|Feria_IV_after_the_II_Sunday_of_Lent|Feria IV after the II Sunday of Lent|-|1 -2027-02-25|3|v|Feria V after the II Sunday of Lent|-|-|-|1 -2027-02-26|3|v|Feria VI after the II Sunday of Lent|-|-|-|1 -2027-02-27|3|v|Saturday after the II Sunday of Lent|-|St. Gabriel of Our Lady of Sorrows|-|1 -2027-02-28|1|v|III Sunday of Lent|-|-|-|1 -2027-03-01|3|v|Feria II after the III Sunday of Lent|-|-|-|1 -2027-03-02|3|v|Feria III after the III Sunday of Lent|-|-|-|1 -2027-03-03|3|v|Feria IV after the III Sunday of Lent|-|-|-|1 -2027-03-04|3|v|Feria V after the III Sunday of Lent|-|St. Casimir;St. Lucius|-|1 -2027-03-05|3|v|Feria VI after the III Sunday of Lent|-|-|-|1 -2027-03-06|3|v|Saturday after the III Sunday of Lent|-|Sts. Felicitas & Perpetua|-|1 -2027-03-07|1|pv|IV Sunday of Lent|-|-|St. Thomas Aquinas|1 -2027-03-08|3|v|Feria II after the IV Sunday of Lent|-|St. John of God|-|1 -2027-03-09|3|v|Feria III after the IV Sunday of Lent|-|St. Frances Rome|-|1 -2027-03-10|3|v|Feria IV after the IV Sunday of Lent|-|Forty Holy Martyrs of Sebaste|-|1 -2027-03-11|3|v|Feria V after the IV Sunday of Lent|-|-|-|1 -2027-03-12|3|v|Feria VI after the IV Sunday of Lent|-|St. Gregory the Great|-|1 -2027-03-13|3|v|Saturday after the IV Sunday of Lent|-|-|-|1 -2027-03-14|1|v|Passion Sunday|-|-|-|1 -2027-03-15|3|v|Feria II of Passion Week|-|-|-|1 -2027-03-16|3|v|Feria III of Passion Week|-|-|-|1 -2027-03-17|3|v|Feria IV of Passion Week|-|St. Patrick|-|1 -2027-03-18|3|v|Feria V of Passion Week|-|St. Cyril of Jerusalem|-|1 -2027-03-19|3|v|Feria VI of Passion Week|-|For Our Lady of the Seven Sorrows|St. Joseph, Spouse of the Bl. Virgin Mary|1 -2027-03-20|3|v|Saturday of Passion Week|-|-|-|1 -2027-03-21|1|rv|Palm Sunday|-|-|St. Benedict|1 -2027-03-22|1|v|Feria II of Holy Week|-|-|-|1 -2027-03-23|1|v|Feria III of Holy Week|-|-|-|1 -2027-03-24|1|v|Feria IV of Holy Week|-|-|St. Gabriel the Archangel|1 -2027-03-25|1|w|Holy Thursday|-|-|Annunciation of the Blessed Virgin Mary|1 -2027-03-26|1|bv|Good Friday|-|-|-|1 -2027-03-27|1|vw|Holy Saturday|-|-|St. John Damascene|1 -2027-03-28|1|w|Easter Sunday|-|-|St. John of Capistrano|1 -2027-03-29|1|w|Monday in the Octave of Easter|-|-|-|1 -2027-03-30|1|w|Tuesday in the Octave of Easter|-|-|-|1 -2027-03-31|1|w|Wednesday in the Octave of Easter|-|-|-|1 -2027-04-01|1|w|Thursday in the Octave of Easter|-|-|-|1 -2027-04-02|1|w|Friday in the Octave of Easter|-|-|St. Francis of Paola|1 -2027-04-03|1|w|Saturday in the Octave of Easter|-|-|-|1 -2027-04-04|1|w|Low Sunday|-|-|St. Isidore of Seville|1 -2027-04-05|1|w|Annunciation of the Blessed Virgin Mary|Monday_after_I_Sunday_after_Easter|-|St. Vincent Ferrer|1 -2027-04-06|4|w|Feria|Tuesday_after_I_Sunday_after_Easter|-|-|1 -2027-04-07|4|w|Feria|Wednesday_after_I_Sunday_after_Easter|-|-|1 -2027-04-08|4|w|Feria|Thursday_after_I_Sunday_after_Easter|-|-|1 -2027-04-09|4|w|Feria|Friday_after_I_Sunday_after_Easter|-|-|1 -2027-04-10|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_I_Sunday_after_Easter|-|-|1 -2027-04-11|2|w|II Sunday after Easter|-|-|St. Leo the Great|1 -2027-04-12|4|w|Feria|Monday_after_II_Sunday_after_Easter|-|-|1 -2027-04-13|3|r|St. Hermenegild|Tuesday_after_II_Sunday_after_Easter|-|-|1 -2027-04-14|3|r|St. Justin|Wednesday_after_II_Sunday_after_Easter|Sts. Tiburtius, Valerian et Maximus, Martyrs|-|1 -2027-04-15|4|w|Feria|Thursday_after_II_Sunday_after_Easter|-|-|1 -2027-04-16|4|w|Feria|Friday_after_II_Sunday_after_Easter|-|-|1 -2027-04-17|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_II_Sunday_after_Easter|St. Anicetus|-|1 -2027-04-18|2|w|III Sunday after Easter|-|-|-|1 -2027-04-19|4|w|Feria|Monday_after_III_Sunday_after_Easter|-|-|1 -2027-04-20|4|w|Feria|Tuesday_after_III_Sunday_after_Easter|-|-|1 -2027-04-21|3|w|St. Anselm|Wednesday_after_III_Sunday_after_Easter|-|-|1 -2027-04-22|3|r|Sts. Soter & Caius|Thursday_after_III_Sunday_after_Easter|-|-|1 -2027-04-23|4|w|Feria|Friday_after_III_Sunday_after_Easter|St. George|-|1 -2027-04-24|3|r|St. Fidelis of Sigmaringen|Saturday_after_III_Sunday_after_Easter|-|-|1 -2027-04-25|2|w|IV Sunday after Easter|-|St. Mark|Pro rogationibus|1 -2027-04-26|3|r|Sts. Cletus & Marcellinus|Monday_after_IV_Sunday_after_Easter|-|-|1 -2027-04-27|3|w|St. Peter Canisius|Tuesday_after_IV_Sunday_after_Easter|-|-|1 -2027-04-28|3|w|St. Paul of the Cross|Wednesday_after_IV_Sunday_after_Easter|-|-|1 -2027-04-29|3|r|St. Peter of Verona|Thursday_after_IV_Sunday_after_Easter|-|-|1 -2027-04-30|3|w|St. Catherine of Siena|Friday_after_IV_Sunday_after_Easter|-|-|1 -2027-05-01|1|w|St. Joseph the Workman|Saturday_after_IV_Sunday_after_Easter|-|-|1 -2027-05-02|2|w|V Sunday after Easter|-|-|St. Athanasius|1 -2027-05-03|4|w|Feria|The_Minor_Litanies_–_Rogations|Sts. Alexander & Companions|-|1 -2027-05-04|3|w|St. Monica|The_Minor_Litanies_–_Rogations|-|-|1 -2027-05-05|2|w|Vigil of the Ascension|-|St. Pius V|-|1 -2027-05-06|1|w|Ascension of the Lord|-|-|-|1 -2027-05-07|3|r|St. Stanislaus|Feria_VI_after_the_Ascension|-|-|1 -2027-05-08|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_the_Ascension|-|-|1 -2027-05-09|2|w|Sunday after the Ascension|-|-|St. Gregory of Nazianzen|1 -2027-05-10|3|w|St. Antoninus|Feria_II_after_the_Ascension|St. Gordiano and Epimacho|-|1 -2027-05-11|2|r|Sts. Philip & James|Feria_III_after_the_Ascension|-|-|1 -2027-05-12|3|r|Sts. Nereus, Achilleus, Domitilla, & Pancras|Feria_IV_after_the_Ascension|-|-|1 -2027-05-13|3|w|St. Robert Bellarmine|Feria_V_after_the_Ascension|-|-|1 -2027-05-14|4|w|Feria|Feria_VI_after_the_Ascension|St. Boniface|-|1 -2027-05-15|1|r|Saturday after the Ascension|-|-|St. John Baptist de la Salle|1 -2027-05-16|1|r|Pentecost Sunday|-|-|St. Ubaldus|1 -2027-05-17|1|r|Monday after Pentecost|-|-|St. Paschal Baylon|1 -2027-05-18|1|r|Tuesday after Pentecost|-|-|St. Venantius|1 -2027-05-19|1|r|Ember Wednesday of Pentecost|-|-|St. Peter Celestine;St. Pudentiana Virginis|1 -2027-05-20|1|r|Thursday after Pentecost|-|-|St. Bernardine of Siena|1 -2027-05-21|1|r|Ember Friday of Pentecost|-|-|-|1 -2027-05-22|1|r|Ember Saturday of Pentecost|-|-|-|1 -2027-05-23|1|w|Trinity Sunday|-|-|-|1 -2027-05-24|4|g|Feria|Feria_II_after_I_Sunday_after_Pentecost|-|-|1 -2027-05-25|3|w|St. Gregory VII|Feria_III_after_I_Sunday_after_Pentecost|St. Urban, Pope and Martyr|-|1 -2027-05-26|3|w|St. Philip Neri|Feria_IV_after_I_Sunday_after_Pentecost|S. Eleutherius|-|1 -2027-05-27|1|w|Corpus Christi|-|-|St. Bede the Venerable;St. John I|1 -2027-05-28|3|w|St. Augustine of Canterbury|Feria_V_after_I_Sunday_after_Pentecost|-|-|1 -2027-05-29|3|w|St. Mary Magdalene de Pazzi|Saturday_after_I_Sunday_after_Pentecost|-|-|1 -2027-05-30|2|g|II Sunday after Pentecost|-|-|St. Felix I|1 -2027-05-31|2|w|Queenship of the Blessed Virgin Mary|Feria_II_after_II_Sunday_after_Pentecost|St. Petronilla|-|1 -2027-06-01|3|w|St. Angela Merici|Feria_III_after_II_Sunday_after_Pentecost|-|-|1 -2027-06-02|4|g|Feria|Feria_IV_after_II_Sunday_after_Pentecost|Sts. Marcellinus, Peter, & Erasmus|-|1 -2027-06-03|4|g|Feria|Feria_V_after_II_Sunday_after_Pentecost|-|-|1 -2027-06-04|1|w|Sacred Heart of Jesus|-|-|St. Francis Caracciolo|1 -2027-06-05|3|r|St. Boniface|Saturday_after_II_Sunday_after_Pentecost|-|-|1 -2027-06-06|2|g|III Sunday after Pentecost|-|-|St. Norbert|1 -2027-06-07|4|g|Feria|Feria_II_after_III_Sunday_after_Pentecost|-|-|1 -2027-06-08|4|g|Feria|Feria_III_after_III_Sunday_after_Pentecost|-|-|1 -2027-06-09|4|g|Feria|Feria_IV_after_III_Sunday_after_Pentecost|Sts. Primus & Felicianus|-|1 -2027-06-10|3|w|St. Margaret of Scotland|Feria_V_after_III_Sunday_after_Pentecost|-|-|1 -2027-06-11|3|r|St. Barnabas|Feria_VI_after_III_Sunday_after_Pentecost|-|-|1 -2027-06-12|3|r|St. John of San Fecundo|Saturday_after_III_Sunday_after_Pentecost|St. Basilidus|-|1 -2027-06-13|2|g|IV Sunday after Pentecost|-|-|St. Anthony of Padua|1 -2027-06-14|3|w|St. Basil the Great|Feria_II_after_IV_Sunday_after_Pentecost|-|-|1 -2027-06-15|4|g|Feria|Feria_III_after_IV_Sunday_after_Pentecost|St. Vitus|-|1 -2027-06-16|4|g|Feria|Feria_IV_after_IV_Sunday_after_Pentecost|-|-|1 -2027-06-17|3|w|St. Gregory Barbarigo|Feria_V_after_IV_Sunday_after_Pentecost|-|-|1 -2027-06-18|3|r|St. Ephrem of Syria|Feria_VI_after_IV_Sunday_after_Pentecost|Ss. Marcus and Marcellianus|-|1 -2027-06-19|3|r|St. Julia of Falconieri|Saturday_after_IV_Sunday_after_Pentecost|Sts. Gervasius and Protasius|-|1 -2027-06-20|2|g|V Sunday after Pentecost|-|-|St. Silverius|1 -2027-06-21|3|w|St. Aloysius Gongzaga|Feria_II_after_V_Sunday_after_Pentecost|-|-|1 -2027-06-22|3|w|St. Paulinus of Nola|Feria_III_after_V_Sunday_after_Pentecost|-|-|1 -2027-06-23|2|v|Vigil of the Nativity of St. John the Baptist|Feria_IV_after_V_Sunday_after_Pentecost|-|-|1 -2027-06-24|1|w|Nativity of St. John the Baptist|Feria_V_after_V_Sunday_after_Pentecost|-|-|1 -2027-06-25|3|w|St. William|Feria_VI_after_V_Sunday_after_Pentecost|-|-|1 -2027-06-26|3|r|Sts. John & Paul|Saturday_after_V_Sunday_after_Pentecost|-|-|1 -2027-06-27|2|g|VI Sunday after Pentecost|-|-|-|1 -2027-06-28|2|v|Vigil of Sts. Peter & Paul|Feria_II_after_VI_Sunday_after_Pentecost|-|-|1 -2027-06-29|1|r|Sts. Peter & Paul|Feria_III_after_VI_Sunday_after_Pentecost|-|-|1 -2027-06-30|3|r|In Commemoratione Sancti Pauli Apostoli|Feria_IV_after_VI_Sunday_after_Pentecost|-|-|1 -2027-07-01|1|r|The Precious Blood of Our Lord Jesus Christ|Feria_V_after_VI_Sunday_after_Pentecost|-|-|1 -2027-07-02|2|w|Visitation of the Blessed Virgin Mary|Feria_VI_after_VI_Sunday_after_Pentecost|SS. Processus and Martinian|-|1 -2027-07-03|3|r|St. Irenaeus|Saturday_after_VI_Sunday_after_Pentecost|-|-|1 -2027-07-04|2|g|VII Sunday after Pentecost|-|-|-|1 -2027-07-05|3|w|St. Anthony Mary Zaccariah|Feria_II_after_VII_Sunday_after_Pentecost|-|-|1 -2027-07-06|4|g|Feria|Feria_III_after_VII_Sunday_after_Pentecost|-|-|1 -2027-07-07|3|w|Sts. Cyril & Methodius|Feria_IV_after_VII_Sunday_after_Pentecost|-|-|1 -2027-07-08|3|w|St. Elizabeth of Portugal|Feria_V_after_VII_Sunday_after_Pentecost|-|-|1 -2027-07-09|4|g|Feria|Feria_VI_after_VII_Sunday_after_Pentecost|-|-|1 -2027-07-10|3|r|Seven Holy Brothers and Sts. Rufina & Secunda|Saturday_after_VII_Sunday_after_Pentecost|-|-|1 -2027-07-11|2|g|VIII Sunday after Pentecost|-|-|St. Pius I|1 -2027-07-12|3|r|St. John Gualbert|Feria_II_after_VIII_Sunday_after_Pentecost|Ss. Naboris et Felicis|-|1 -2027-07-13|4|g|Feria|Feria_III_after_VIII_Sunday_after_Pentecost|-|-|1 -2027-07-14|3|w|St. Bonaventure|Feria_IV_after_VIII_Sunday_after_Pentecost|-|-|1 -2027-07-15|3|w|St. Henry the Emperor|Feria_V_after_VIII_Sunday_after_Pentecost|-|-|1 -2027-07-16|4|g|Feria|Feria_VI_after_VIII_Sunday_after_Pentecost|Our Lady of Mt. Carmel|-|1 -2027-07-17|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_VIII_Sunday_after_Pentecost|St. Alexis|-|1 -2027-07-18|2|g|IX Sunday after Pentecost|-|-|Camillus de Lellis;Ss. Symphorosa and sons|1 -2027-07-19|3|w|St. Vincent de Paul|Feria_II_after_IX_Sunday_after_Pentecost|-|-|1 -2027-07-20|3|r|St. Jerome Emiliani|Feria_III_after_IX_Sunday_after_Pentecost|St. Margaret|-|1 -2027-07-21|3|w|St. Laurence of Brindisi|Feria_IV_after_IX_Sunday_after_Pentecost|St. Praxedis Virginis|-|1 -2027-07-22|3|w|St. Mary Magdalene|Feria_V_after_IX_Sunday_after_Pentecost|-|-|1 -2027-07-23|3|w|St. Apollinaris|Feria_VI_after_IX_Sunday_after_Pentecost|S. Liborii|-|1 -2027-07-24|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_IX_Sunday_after_Pentecost|St. Christina|-|1 -2027-07-25|2|g|X Sunday after Pentecost|-|St. James the Greater|St. Christopher|1 -2027-07-26|2|w|St. Anne, Mother of the Blessed Virgin|Feria_II_after_X_Sunday_after_Pentecost|-|-|1 -2027-07-27|4|g|Feria|Feria_III_after_X_Sunday_after_Pentecost|St. Pantaleon|-|1 -2027-07-28|3|r|Sts. Nazarius & Celsus, St. Victor I & St. Innocent I|Feria_IV_after_X_Sunday_after_Pentecost|-|-|1 -2027-07-29|3|r|St. Martha|Feria_V_after_X_Sunday_after_Pentecost|Ss. Felicis, Simplicii, Faustini et Beatricis|-|1 -2027-07-30|4|g|Feria|Feria_VI_after_X_Sunday_after_Pentecost|Sts. Abdon & Sennen|-|1 -2027-07-31|3|w|St. Ignatius Loyola|Saturday_after_X_Sunday_after_Pentecost|-|-|1 -2027-08-01|2|g|XI Sunday after Pentecost|-|-|Holy Machabees|1 -2027-08-02|3|r|St. Alphonsus Liguori|Feria_II_after_XI_Sunday_after_Pentecost|St. Stephen I, Pope and Martyr|-|1 -2027-08-03|4|g|Feria|Feria_III_after_XI_Sunday_after_Pentecost|-|-|1 -2027-08-04|3|w|St. Dominic|Feria_IV_after_XI_Sunday_after_Pentecost|-|-|1 -2027-08-05|3|w|Dedication of the Basilica of St. Mary Major|Feria_V_after_XI_Sunday_after_Pentecost|-|-|1 -2027-08-06|2|w|Transfiguration of Our Lord|Feria_VI_after_XI_Sunday_after_Pentecost|Pope Sixtus II, Felicissimus and Agapitus, Martyrs|-|1 -2027-08-07|3|w|St. Cajetan|Saturday_after_XI_Sunday_after_Pentecost|St. Donatus|-|1 -2027-08-08|2|g|XII Sunday after Pentecost|-|-|St. John Mary Vianney;Ss. Cyriacus, Largus and Smaragdus, Martyrs|1 -2027-08-09|3|r|Vigil of St. Lawrence|Feria_II_after_XII_Sunday_after_Pentecost|St. Romanus|-|1 -2027-08-10|2|r|St. Lawrence|Feria_III_after_XII_Sunday_after_Pentecost|-|-|1 -2027-08-11|4|g|Feria|Feria_IV_after_XII_Sunday_after_Pentecost|Sts. Tiburtius & Susanna|-|1 -2027-08-12|3|w|St. Clare|Feria_V_after_XII_Sunday_after_Pentecost|-|-|1 -2027-08-13|4|g|Feria|Feria_VI_after_XII_Sunday_after_Pentecost|Sts. Hippolytus & Cassian|-|1 -2027-08-14|2|w|Vigil of the Assumption|Saturday_after_XII_Sunday_after_Pentecost|St. Eusebius|-|1 -2027-08-15|1|w|Assumption of the Blessed Virgin Mary|XIII_Sunday_after_Pentecost|-|-|1 -2027-08-16|2|w|St. Joachim, Father of the Blessed Virgin|Feria_II_after_XIII_Sunday_after_Pentecost|-|-|1 -2027-08-17|3|w|St. Hyacinth|Feria_III_after_XIII_Sunday_after_Pentecost|-|-|1 -2027-08-18|4|g|Feria|Feria_IV_after_XIII_Sunday_after_Pentecost|St. Agapitus|-|1 -2027-08-19|3|w|St. John Eudes|Feria_V_after_XIII_Sunday_after_Pentecost|-|-|1 -2027-08-20|3|w|St. Bernard of Clairvaux|Feria_VI_after_XIII_Sunday_after_Pentecost|-|-|1 -2027-08-21|3|w|St. Jane Frances de Chantal|Saturday_after_XIII_Sunday_after_Pentecost|-|-|1 -2027-08-22|2|g|XIV Sunday after Pentecost|-|Immaculate Heart of Mary|Sts. Timothy, Hippolytus and Symphorianus, Martyrs|1 -2027-08-23|3|w|St. Philip Benizi|Feria_II_after_XIV_Sunday_after_Pentecost|-|-|1 -2027-08-24|2|r|St. Bartholomew|Feria_III_after_XIV_Sunday_after_Pentecost|-|-|1 -2027-08-25|3|w|St. Louis IX|Feria_IV_after_XIV_Sunday_after_Pentecost|-|-|1 -2027-08-26|4|g|Feria|Feria_V_after_XIV_Sunday_after_Pentecost|St. Zephyrinus|-|1 -2027-08-27|3|w|St. Joseph Calasance|Feria_VI_after_XIV_Sunday_after_Pentecost|-|-|1 -2027-08-28|3|r|St. Augustine|Saturday_after_XIV_Sunday_after_Pentecost|St. Hermes|-|1 -2027-08-29|2|g|XV Sunday after Pentecost|-|-|Beheading of St. John the Baptist;St. Sabina|1 -2027-08-30|3|r|St. Rose of Lima|Feria_II_after_XV_Sunday_after_Pentecost|Sts. Felix and Adauctus|-|1 -2027-08-31|3|w|St. Raymond Nonnatus|Feria_III_after_XV_Sunday_after_Pentecost|-|-|1 -2027-09-01|4|g|Feria|Feria_IV_after_XV_Sunday_after_Pentecost|St. Giles;Twelve Holy Brothers, Martyrs|-|1 -2027-09-02|3|w|St. Stephen of Hungary|Feria_V_after_XV_Sunday_after_Pentecost|-|-|1 -2027-09-03|3|w|St. Pius X|Feria_VI_after_XV_Sunday_after_Pentecost|-|-|1 -2027-09-04|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XV_Sunday_after_Pentecost|-|-|1 -2027-09-05|2|g|XVI Sunday after Pentecost|-|-|St. Lawrence Justinian|1 -2027-09-06|4|g|Feria|Feria_II_after_XVI_Sunday_after_Pentecost|-|-|1 -2027-09-07|4|g|Feria|Feria_III_after_XVI_Sunday_after_Pentecost|-|-|1 -2027-09-08|2|w|Nativity of the Blessed Virgin Mary|Feria_IV_after_XVI_Sunday_after_Pentecost|S. Hadriani|-|1 -2027-09-09|4|g|Feria|Feria_V_after_XVI_Sunday_after_Pentecost|St. Gorgonius|-|1 -2027-09-10|3|w|St. Nicholas of Tolentino|Feria_VI_after_XVI_Sunday_after_Pentecost|-|-|1 -2027-09-11|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XVI_Sunday_after_Pentecost|Sts. Protus & Hyacinth|-|1 -2027-09-12|2|g|XVII Sunday after Pentecost|-|-|Most Holy Name of Mary|1 -2027-09-13|4|g|Feria|Feria_II_after_XVII_Sunday_after_Pentecost|-|-|1 -2027-09-14|2|r|Exaltation of the Holy Cross|Feria_III_after_XVII_Sunday_after_Pentecost|-|-|1 -2027-09-15|2|w|Seven Sorrows of the Blessed Virgin Mary|Feria_IV_after_XVII_Sunday_after_Pentecost|S. Nicomedes|-|1 -2027-09-16|3|r|Sts. Cornelius & Cyprian|Feria_V_after_XVII_Sunday_after_Pentecost|Sts. Euphemia, Lucy and Geminianus|-|1 -2027-09-17|4|g|Feria|Feria_VI_after_XVII_Sunday_after_Pentecost|Stigmata of St. Francis|-|1 -2027-09-18|3|w|St. Joseph of Cupertino|Saturday_after_XVII_Sunday_after_Pentecost|-|-|1 -2027-09-19|2|g|XVIII Sunday after Pentecost|-|-|St. Januarius & Companions|1 -2027-09-20|4|g|Feria|Feria_II_after_XVIII_Sunday_after_Pentecost|Sts. Eustace & Companions|-|1 -2027-09-21|2|r|St. Matthew|Feria_III_after_XVIII_Sunday_after_Pentecost|-|-|1 -2027-09-22|2|v|Ember Wednesday of September|-|St. Thomas of Villanova|St. Maurice and Companions, Martyrs|1 -2027-09-23|3|r|St. Linus|Feria_V_after_XVIII_Sunday_after_Pentecost|St. Thecla|-|1 -2027-09-24|2|v|Ember Friday of September|-|Our Lady of Ransom|-|1 -2027-09-25|2|v|Ember Saturday of September|-|-|-|1 -2027-09-26|2|g|XIX Sunday after Pentecost|-|-|Sts. Cyprian & Justina|1 -2027-09-27|3|r|Sts. Cosmas & Damian|Feria_II_after_XIX_Sunday_after_Pentecost|-|-|1 -2027-09-28|3|r|St. Wenceslaus|Feria_III_after_XIX_Sunday_after_Pentecost|-|-|1 -2027-09-29|1|w|Dedication of St. Michael the Archangel|Feria_IV_after_XIX_Sunday_after_Pentecost|-|-|1 -2027-09-30|3|w|St. Jerome|Feria_V_after_XIX_Sunday_after_Pentecost|-|-|1 -2027-10-01|4|g|Feria|Feria_VI_after_XIX_Sunday_after_Pentecost|St. Remigius|-|1 -2027-10-02|3|w|Holy Guardian Angels|Saturday_after_XIX_Sunday_after_Pentecost|-|-|1 -2027-10-03|2|g|XX Sunday after Pentecost|-|-|St. Theresa of the Infant Jesus|1 -2027-10-04|3|w|St. Francis of Assisi|Feria_II_after_XX_Sunday_after_Pentecost|-|-|1 -2027-10-05|4|g|Feria|Feria_III_after_XX_Sunday_after_Pentecost|St. Placid & Companions|-|1 -2027-10-06|3|w|St. Bruno|Feria_IV_after_XX_Sunday_after_Pentecost|-|-|1 -2027-10-07|2|w|Our Lady of the Rosary|Feria_V_after_XX_Sunday_after_Pentecost|St. Mark I|-|1 -2027-10-08|3|w|St. Bridget of Sweden|Feria_VI_after_XX_Sunday_after_Pentecost|Ss. Sergio, Baccho, Marcello and Apulejo Martyrs|-|1 -2027-10-09|3|w|St. John Leonardi|Saturday_after_XX_Sunday_after_Pentecost|St. Dionysius and companions|-|1 -2027-10-10|2|g|XXI Sunday after Pentecost|-|-|St. Francis Borgia|1 -2027-10-11|2|w|Maternity of the Blessed Virgin Mary|Feria_II_after_XXI_Sunday_after_Pentecost|-|-|1 -2027-10-12|4|g|Feria|Feria_III_after_XXI_Sunday_after_Pentecost|-|-|1 -2027-10-13|3|w|St. Edward|Feria_IV_after_XXI_Sunday_after_Pentecost|-|-|1 -2027-10-14|3|r|St. Callistus I|Feria_V_after_XXI_Sunday_after_Pentecost|-|-|1 -2027-10-15|3|w|St. Teresa of Avila|Feria_VI_after_XXI_Sunday_after_Pentecost|-|-|1 -2027-10-16|3|w|St. Hedwig|Saturday_after_XXI_Sunday_after_Pentecost|-|-|1 -2027-10-17|2|g|XXII Sunday after Pentecost|-|-|St. Margaret Mary Alacoque|1 -2027-10-18|2|r|St. Luke the Evangelist|Feria_II_after_XXII_Sunday_after_Pentecost|-|-|1 -2027-10-19|3|w|St. Peter of Alcantara|Feria_III_after_XXII_Sunday_after_Pentecost|-|-|1 -2027-10-20|3|w|St. John Cantius|Feria_IV_after_XXII_Sunday_after_Pentecost|-|-|1 -2027-10-21|4|g|Feria|Feria_V_after_XXII_Sunday_after_Pentecost|St. Hilarion;St. Ursula and Companions|-|1 -2027-10-22|4|g|Feria|Feria_VI_after_XXII_Sunday_after_Pentecost|-|-|1 -2027-10-23|3|w|St. Anthony Mary Claret|Saturday_after_XXII_Sunday_after_Pentecost|-|-|1 -2027-10-24|2|g|XXIII Sunday after Pentecost|-|-|St. Raphael the Archangel|1 -2027-10-25|4|g|Feria|Feria_II_after_XXIII_Sunday_after_Pentecost|Sts. Chrysanthus & Daria|-|1 -2027-10-26|4|g|Feria|Feria_III_after_XXIII_Sunday_after_Pentecost|St. Evaristus|-|1 -2027-10-27|4|g|Feria|Feria_IV_after_XXIII_Sunday_after_Pentecost|-|-|1 -2027-10-28|2|r|Sts. Simon & Jude|Feria_V_after_XXIII_Sunday_after_Pentecost|-|-|1 -2027-10-29|4|g|Feria|Feria_VI_after_XXIII_Sunday_after_Pentecost|-|-|1 -2027-10-30|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXIII_Sunday_after_Pentecost|-|-|1 -2027-10-31|1|w|Christ the King|IV_Sunday_after_Epiphany|-|-|1 -2027-11-01|1|w|All Saints|Feria_II_after_IV_Sunday_after_Epiphany|-|-|1 -2027-11-02|1|b|Commemoration of All Souls|Feria_III_after_IV_Sunday_after_Epiphany|-|-|3 -2027-11-03|4|g|Feria|Feria_IV_after_IV_Sunday_after_Epiphany|-|-|1 -2027-11-04|3|w|St. Charles Borromeo|Feria_V_after_IV_Sunday_after_Epiphany|Sts. Vitalis and Agricola, Martyrs|-|1 -2027-11-05|4|g|Feria|Feria_VI_after_IV_Sunday_after_Epiphany|-|-|1 -2027-11-06|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_IV_Sunday_after_Epiphany|-|-|1 -2027-11-07|2|g|V Sunday after Epiphany|-|-|-|1 -2027-11-08|4|g|Feria|Feria_II_after_V_Sunday_after_Epiphany|Four Holy Crowned Martyrs|-|1 -2027-11-09|2|w|Dedication of the Archbasilica of Our Holy Savior|Feria_III_after_V_Sunday_after_Epiphany|St. Theodore|-|1 -2027-11-10|3|w|St. Andrew Avellino|Feria_IV_after_V_Sunday_after_Epiphany|Sts. Tryphonis, Respicii, et Nymphae|-|1 -2027-11-11|3|w|St. Martin of Tours|Feria_V_after_V_Sunday_after_Epiphany|St. Menna|-|1 -2027-11-12|3|r|St. Martin I|Feria_VI_after_V_Sunday_after_Epiphany|-|-|1 -2027-11-13|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_V_Sunday_after_Epiphany|St. Didacus|-|1 -2027-11-14|2|g|VI Sunday after Epiphany|-|-|St. Josaphat|1 -2027-11-15|3|w|St. Albert the Great|Feria_II_after_VI_Sunday_after_Epiphany|-|-|1 -2027-11-16|3|w|St. Gertrude the Great|Feria_III_after_VI_Sunday_after_Epiphany|-|-|1 -2027-11-17|3|w|St. Gregory the Wonderworker|Feria_IV_after_VI_Sunday_after_Epiphany|-|-|1 -2027-11-18|3|w|Dedication of the Basilicas of Sts. Peter & Paul|Feria_V_after_VI_Sunday_after_Epiphany|-|-|1 -2027-11-19|3|w|St. Elizabeth of Hungary|Feria_VI_after_VI_Sunday_after_Epiphany|St. Pontian|-|1 -2027-11-20|3|w|St. Felix of Valois|Saturday_after_VI_Sunday_after_Epiphany|-|-|1 -2027-11-21|2|g|XXIV Sunday after Pentecost|-|-|Presentation of the Blessed Virgin Mary|1 -2027-11-22|3|r|St. Cecilia|Feria_II_after_XXIV_Sunday_after_Pentecost|-|-|1 -2027-11-23|3|r|St. Clement I|Feria_III_after_XXIV_Sunday_after_Pentecost|St. Felicity|-|1 -2027-11-24|3|w|St. John of the Cross|Feria_IV_after_XXIV_Sunday_after_Pentecost|St. Chrysogonus|-|1 -2027-11-25|3|r|St. Catherine of Alexandria|Feria_V_after_XXIV_Sunday_after_Pentecost|-|-|1 -2027-11-26|3|w|St. Sylvester|Feria_VI_after_XXIV_Sunday_after_Pentecost|St. Peter of Alexandria|-|1 -2027-11-27|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXIV_Sunday_after_Pentecost|-|-|1 -2027-11-28|1|v|I Sunday of Advent|-|-|-|1 -2027-11-29|3|v|Feria II after I Sunday of Advent|-|St. Saturninus|-|1 -2027-11-30|2|r|St. Andrew|Feria_III_after_I_Sunday_of_Advent|-|-|1 -2027-12-01|3|v|Feria IV after I Sunday of Advent|-|-|-|1 -2027-12-02|3|r|St. Vivian|Feria_V_after_I_Sunday_of_Advent|Feria V after I Sunday of Advent|-|1 -2027-12-03|3|w|St. Francis Xavier|Feria_VI_after_I_Sunday_of_Advent|Feria VI after I Sunday of Advent|-|1 -2027-12-04|3|w|St. Peter Chrysologus|Sabbato_after_I_Sunday_of_Advent|Sabbato after I Sunday of Advent|-|1 -2027-12-05|1|v|II Sunday of Advent|-|-|St. Sabbas|1 -2027-12-06|3|w|St. Nicholas|Feria_II_after_II_Sunday_of_Advent|Feria II after II Sunday of Advent|-|1 -2027-12-07|3|w|St. Ambrose|Feria_III_after_II_Sunday_of_Advent|Feria III after II Sunday of Advent|-|1 -2027-12-08|1|w|Immaculate Conception of the Blessed Virgin Mary|Feria_IV_after_II_Sunday_of_Advent|-|-|1 -2027-12-09|3|v|Feria V after II Sunday of Advent|-|-|-|1 -2027-12-10|3|v|Feria VI after II Sunday of Advent|-|St. Melchiades|-|1 -2027-12-11|3|w|St. Damasus I|Sabbato_after_II_Sunday_of_Advent|Sabbato after II Sunday of Advent|-|1 -2027-12-12|1|pv|III Sunday of Advent|-|-|-|1 -2027-12-13|3|r|St. Lucy|Feria_II_after_III_Sunday_of_Advent|Feria II after III Sunday of Advent|-|1 -2027-12-14|3|pv|Feria III after III Sunday of Advent|-|-|-|1 -2027-12-15|2|v|Ember Wednesday of Advent|-|-|-|1 -2027-12-16|3|r|St. Eusebius|Feria_V_after_III_Sunday_of_Advent|Feria V after III Sunday of Advent|-|1 -2027-12-17|2|v|Ember Friday of Advent|-|-|-|1 -2027-12-18|2|v|Ember Saturday of Advent|-|-|-|1 -2027-12-19|1|v|IV Sunday of Advent|-|-|-|1 -2027-12-20|2|v|Feria II after IV Sunday of Advent|-|-|-|1 -2027-12-21|2|r|St. Thomas|Feria_III_after_IV_Sunday_of_Advent|Feria III after IV Sunday of Advent|-|1 -2027-12-22|2|v|Feria IV after IV Sunday of Advent|-|-|-|1 -2027-12-23|2|v|Feria V after IV Sunday of Advent|-|-|-|1 -2027-12-24|1|v|Vigil of Christmas|-|-|-|1 -2027-12-25|1|w|The Nativity of Our Lord|-|-|-|3 -2027-12-26|2|w|Sunday in the Octave of Christmas|-|St. Stephen|For Octave of the Nativity|1 -2027-12-27|2|w|St. John the Evangelist|-|For Octave of the Nativity|-|1 -2027-12-28|2|r|Holy Innocents|-|For Octave of the Nativity|-|1 -2027-12-29|2|w|Feria in the Octave of Christmas|-|St. Thomas Becket|-|1 -2027-12-30|2|w|Feria in the Octave of Christmas|-|-|-|1 -2027-12-31|2|w|Feria in the Octave of Christmas|-|St. Silvester|-|1 +2026-01-01|1|w|Octave Day of Christmas|-|-|-|1|- +2026-01-02|4|w|Feria|-|-|-|1|- +2026-01-03|4|w|II Mass of the B. V. M. – Vultum Tuum|-|-|-|1|- +2026-01-04|2|w|Holy Name of Jesus|-|-|-|1|- +2026-01-05|4|w|Feria|-|St. Telesphorus Pope and Martyr|-|1|sancti:01-05:4:r +2026-01-06|1|w|Epiphany of the Lord|-|-|-|1|- +2026-01-07|4|w|Feria|-|-|-|1|- +2026-01-08|4|w|Feria|-|-|-|1|- +2026-01-09|4|w|Feria|-|-|-|1|- +2026-01-10|4|w|II Mass of the B. V. M. – Vultum Tuum|-|-|-|1|- +2026-01-11|2|w|The Holy Family: Jesus, Mary & Joseph|-|-|St. Hyginus Pope and Martyr|1|- +2026-01-12|4|w|Feria|Feria_II_after_Epiphany|-|-|1|- +2026-01-13|2|w|Commemoration of the Baptism of the Lord|Feria_III_after_Epiphany|-|-|1|- +2026-01-14|3|w|St. Hilary|Feria_IV_after_Epiphany|S. Felicis|-|1|sancti:01-14cc:4:r +2026-01-15|3|w|St. Paul, the First Hermit|Feria_V_after_Epiphany|St. Maur, Abbot|-|1|sancti:01-15cc:4:w +2026-01-16|3|r|St. Marcellus I|Feria_VI_after_Epiphany|-|-|1|- +2026-01-17|3|w|St. Anthony|Saturday_after_Epiphany|-|-|1|- +2026-01-18|2|g|II Sunday after Epiphany|-|-|St. Prisca|1|- +2026-01-19|4|g|Feria|Feria_II_after_II_Sunday_after_Epiphany|Sts. Marius, Martha, Audifax & Abachum;St. Canute, Martyr|-|1|sancti:01-19:4:r;sancti:01-19o:4:r +2026-01-20|3|r|Sts. Fabian & Sebastian|Feria_III_after_II_Sunday_after_Epiphany|-|-|1|- +2026-01-21|3|r|St. Agnes|Feria_IV_after_II_Sunday_after_Epiphany|-|-|1|- +2026-01-22|3|r|Sts. Vincent & Anastasius|Feria_V_after_II_Sunday_after_Epiphany|-|-|1|- +2026-01-23|3|w|St. Raymond of Peñafort|Feria_VI_after_II_Sunday_after_Epiphany|St. Emerentiana|-|1|sancti:01-23o:4:r +2026-01-24|3|r|St. Timothy|Saturday_after_II_Sunday_after_Epiphany|-|-|1|- +2026-01-25|2|g|III Sunday after Epiphany|-|-|Conversion of St. Paul;St. Peter|1|- +2026-01-26|3|r|St. Polycarp|Feria_II_after_III_Sunday_after_Epiphany|-|-|1|- +2026-01-27|3|w|St. John Chrysostom|Feria_III_after_III_Sunday_after_Epiphany|-|-|1|- +2026-01-28|3|w|St. Peter Nolasco|Feria_IV_after_III_Sunday_after_Epiphany|St. Agnes|-|1|sancti:01-28t:4:r +2026-01-29|3|w|St. Francis de Sales|Feria_V_after_III_Sunday_after_Epiphany|-|-|1|- +2026-01-30|3|r|St. Martina|Feria_VI_after_III_Sunday_after_Epiphany|-|-|1|- +2026-01-31|3|w|St. John Bosco|Saturday_after_III_Sunday_after_Epiphany|-|-|1|- +2026-02-01|2|v|Septuagesima Sunday|-|-|St. Ignatius of Antioch|1|- +2026-02-02|2|w|Purification of the Blessed Virgin Mary|Feria_II_after_Septuagesima|-|-|1|- +2026-02-03|4|v|Feria|Feria_III_after_Septuagesima|St. Blaise|-|1|sancti:02-03:4:r +2026-02-04|3|w|St. Andrew Corsini|Feria_IV_after_Septuagesima|-|-|1|- +2026-02-05|3|r|St. Agatha|Feria_V_after_Septuagesima|-|-|1|- +2026-02-06|3|w|St. Titus|Feria_VI_after_Septuagesima|St. Dorothy|-|1|sancti:02-06o:4:r +2026-02-07|3|w|St. Romuald|Saturday_after_Septuagesima|-|-|1|- +2026-02-08|2|v|Sexagesima Sunday|-|-|St. John of Matha|1|- +2026-02-09|3|w|St. Cyril of Alexandria|Feria_II_after_Sexagesima|St. Appollonia|-|1|sancti:02-09o:4:r +2026-02-10|3|w|St. Scholastica|Feria_III_after_Sexagesimæ|-|-|1|- +2026-02-11|3|w|Our Lady of Lourdes|Feria_IV_after_Sexagesimæ|-|-|1|- +2026-02-12|3|w|Seven Holy Servite Founders|Feria_V_after_Sexagesimæ|-|-|1|- +2026-02-13|4|v|Feria|Feria_VI_after_Sexagesimæ|-|-|1|- +2026-02-14|4|w|III Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_Sexagesimæ|St. Valentine|-|1|sancti:02-14:4:r +2026-02-15|2|v|Quinquagesima Sunday|-|-|Sts. Faustinus & Jovita|1|- +2026-02-16|4|v|Feria|Feria_II_after_Quinquagesima|-|-|1|- +2026-02-17|4|v|Feria|Feria_III_after_Quinquagesima|-|-|1|- +2026-02-18|1|v|Ash Wednesday|-|-|St. Simeon|1|- +2026-02-19|3|v|Feria V after Ash Wednesday|-|-|-|1|- +2026-02-20|3|v|Feria VI after Ash Wednesday|-|-|-|1|- +2026-02-21|3|v|Saturday after Ash Wednesday|-|-|-|1|- +2026-02-22|1|v|I Sunday of Lent|-|-|Chair of St. Peter;St. Paul|1|- +2026-02-23|3|v|Feria II after the I Sunday of Lent|-|St. Peter Damien|-|1|sancti:02-23r:3:w +2026-02-24|2|r|St. Matthias|Feria_III_after_the_I_Sunday_of_Lent|Feria III after the I Sunday of Lent|-|1|tempora:Quad1-2:3:v +2026-02-25|2|v|Ember Wednesday of Lent|-|-|-|1|- +2026-02-26|3|v|Feria V after the I Sunday of Lent|-|-|-|1|- +2026-02-27|2|v|Ember Friday of Lent|-|St. Gabriel of Our Lady of Sorrows|-|1|sancti:02-27:3:w +2026-02-28|2|v|Ember Saturday of Lent|-|-|-|1|- +2026-03-01|1|v|II Sunday of Lent|-|-|-|1|- +2026-03-02|3|v|Feria II after the II Sunday of Lent|-|-|-|1|- +2026-03-03|3|v|Feria III after the II Sunday of Lent|-|-|-|1|- +2026-03-04|3|v|Feria IV after the II Sunday of Lent|-|St. Casimir;St. Lucius|-|1|sancti:03-04:3:w;sancti:03-04cc:4:r +2026-03-05|3|v|Feria V after the II Sunday of Lent|-|-|-|1|- +2026-03-06|3|v|Feria VI after the II Sunday of Lent|-|Sts. Felicitas & Perpetua|-|1|sancti:03-06:3:r +2026-03-07|3|v|Saturday after the II Sunday of Lent|-|St. Thomas Aquinas|-|1|sancti:03-07:3:w +2026-03-08|1|v|III Sunday of Lent|-|-|St. John of God|1|- +2026-03-09|3|v|Feria II after the III Sunday of Lent|-|St. Frances Rome|-|1|sancti:03-09:3:w +2026-03-10|3|v|Feria III after the III Sunday of Lent|-|Forty Holy Martyrs of Sebaste|-|1|sancti:03-10:3:r +2026-03-11|3|v|Feria IV after the III Sunday of Lent|-|-|-|1|- +2026-03-12|3|v|Feria V after the III Sunday of Lent|-|St. Gregory the Great|-|1|sancti:03-12:3:w +2026-03-13|3|v|Feria VI after the III Sunday of Lent|-|-|-|1|- +2026-03-14|3|v|Saturday after the III Sunday of Lent|-|-|-|1|- +2026-03-15|1|pv|IV Sunday of Lent|-|-|-|1|- +2026-03-16|3|v|Feria II after the IV Sunday of Lent|-|-|-|1|- +2026-03-17|3|v|Feria III after the IV Sunday of Lent|-|St. Patrick|-|1|sancti:03-17:3:w +2026-03-18|3|v|Feria IV after the IV Sunday of Lent|-|St. Cyril of Jerusalem|-|1|sancti:03-18:3:w +2026-03-19|1|w|St. Joseph, Spouse of the Bl. Virgin Mary|Feria_V_after_the_IV_Sunday_of_Lent|Feria V after the IV Sunday of Lent|-|1|tempora:Quad4-4:3:v +2026-03-20|3|v|Feria VI after the IV Sunday of Lent|-|-|-|1|- +2026-03-21|3|v|Saturday after the IV Sunday of Lent|-|St. Benedict|-|1|sancti:03-21:3:w +2026-03-22|1|v|Passion Sunday|-|-|-|1|- +2026-03-23|3|v|Feria II of Passion Week|-|-|-|1|- +2026-03-24|3|v|Feria III of Passion Week|-|St. Gabriel the Archangel|-|1|sancti:03-24:3:w +2026-03-25|1|w|Annunciation of the Blessed Virgin Mary|Feria_IV_of_Passion_Week|Feria IV of Passion Week|-|1|tempora:Quad5-3:3:v +2026-03-26|3|v|Feria V of Passion Week|-|-|-|1|- +2026-03-27|3|v|Feria VI of Passion Week|-|For Our Lady of the Seven Sorrows|St. John Damascene|1|tempora:Quad5-5Feriac:4:w +2026-03-28|3|v|Saturday of Passion Week|-|St. John of Capistrano|-|1|sancti:03-28:3:w +2026-03-29|1|rv|Palm Sunday|-|-|-|1|- +2026-03-30|1|v|Feria II of Holy Week|-|-|-|1|- +2026-03-31|1|v|Feria III of Holy Week|-|-|-|1|- +2026-04-01|1|v|Feria IV of Holy Week|-|-|-|1|- +2026-04-02|1|w|Holy Thursday|-|-|St. Francis of Paola|1|- +2026-04-03|1|bv|Good Friday|-|-|-|1|- +2026-04-04|1|vw|Holy Saturday|-|-|St. Isidore of Seville|1|- +2026-04-05|1|w|Easter Sunday|-|-|St. Vincent Ferrer|1|- +2026-04-06|1|w|Monday in the Octave of Easter|-|-|-|1|- +2026-04-07|1|w|Tuesday in the Octave of Easter|-|-|-|1|- +2026-04-08|1|w|Wednesday in the Octave of Easter|-|-|-|1|- +2026-04-09|1|w|Thursday in the Octave of Easter|-|-|-|1|- +2026-04-10|1|w|Friday in the Octave of Easter|-|-|-|1|- +2026-04-11|1|w|Saturday in the Octave of Easter|-|-|St. Leo the Great|1|- +2026-04-12|1|w|Low Sunday|-|-|-|1|- +2026-04-13|3|r|St. Hermenegild|Monday_after_I_Sunday_after_Easter|-|-|1|- +2026-04-14|3|r|St. Justin|Tuesday_after_I_Sunday_after_Easter|Sts. Tiburtius, Valerian et Maximus, Martyrs|-|1|sancti:04-14t:4:r +2026-04-15|4|w|Feria|Wednesday_after_I_Sunday_after_Easter|-|-|1|- +2026-04-16|4|w|Feria|Thursday_after_I_Sunday_after_Easter|-|-|1|- +2026-04-17|4|w|Feria|Friday_after_I_Sunday_after_Easter|St. Anicetus|-|1|sancti:04-17:4:r +2026-04-18|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_I_Sunday_after_Easter|-|-|1|- +2026-04-19|2|w|II Sunday after Easter|-|-|-|1|- +2026-04-20|4|w|Feria|Monday_after_II_Sunday_after_Easter|-|-|1|- +2026-04-21|3|w|St. Anselm|Tuesday_after_II_Sunday_after_Easter|-|-|1|- +2026-04-22|3|r|Sts. Soter & Caius|Wednesday_after_II_Sunday_after_Easter|-|-|1|- +2026-04-23|4|w|Feria|Thursday_after_II_Sunday_after_Easter|St. George|-|1|sancti:04-23:4:r +2026-04-24|3|r|St. Fidelis of Sigmaringen|Friday_after_II_Sunday_after_Easter|-|-|1|- +2026-04-25|2|r|St. Mark|Saturday_after_II_Sunday_after_Easter|Pro rogationibus|-|1|sancti:04-25c:4:r +2026-04-26|2|w|III Sunday after Easter|-|-|Sts. Cletus & Marcellinus|1|- +2026-04-27|3|w|St. Peter Canisius|Monday_after_III_Sunday_after_Easter|-|-|1|- +2026-04-28|3|w|St. Paul of the Cross|Tuesday_after_III_Sunday_after_Easter|-|-|1|- +2026-04-29|3|r|St. Peter of Verona|Wednesday_after_III_Sunday_after_Easter|-|-|1|- +2026-04-30|3|w|St. Catherine of Siena|Thursday_after_III_Sunday_after_Easter|-|-|1|- +2026-05-01|1|w|St. Joseph the Workman|Friday_after_III_Sunday_after_Easter|-|-|1|- +2026-05-02|3|w|St. Athanasius|Saturday_after_III_Sunday_after_Easter|-|-|1|- +2026-05-03|2|w|IV Sunday after Easter|-|-|Sts. Alexander & Companions|1|- +2026-05-04|3|w|St. Monica|Monday_after_IV_Sunday_after_Easter|-|-|1|- +2026-05-05|3|w|St. Pius V|Tuesday_after_IV_Sunday_after_Easter|-|-|1|- +2026-05-06|4|w|Feria|Wednesday_after_IV_Sunday_after_Easter|-|-|1|- +2026-05-07|3|r|St. Stanislaus|Thursday_after_IV_Sunday_after_Easter|-|-|1|- +2026-05-08|4|w|Feria|Friday_after_IV_Sunday_after_Easter|-|-|1|- +2026-05-09|3|w|St. Gregory of Nazianzen|Saturday_after_IV_Sunday_after_Easter|-|-|1|- +2026-05-10|2|w|V Sunday after Easter|-|-|St. Antoninus;St. Gordiano and Epimacho|1|- +2026-05-11|2|r|Sts. Philip & James|The_Minor_Litanies_–_Rogations|-|-|1|- +2026-05-12|3|r|Sts. Nereus, Achilleus, Domitilla, & Pancras|The_Minor_Litanies_–_Rogations|-|-|1|- +2026-05-13|2|w|Vigil of the Ascension|-|St. Robert Bellarmine|-|1|sancti:05-13:3:w +2026-05-14|1|w|Ascension of the Lord|-|-|St. Boniface|1|- +2026-05-15|3|w|St. John Baptist de la Salle|Feria_VI_after_the_Ascension|-|-|1|- +2026-05-16|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_the_Ascension|St. Ubaldus|-|1|sancti:05-16:4:w +2026-05-17|2|w|Sunday after the Ascension|-|-|St. Paschal Baylon|1|- +2026-05-18|3|r|St. Venantius|Feria_II_after_the_Ascension|-|-|1|- +2026-05-19|3|w|St. Peter Celestine|Feria_III_after_the_Ascension|St. Pudentiana Virginis|-|1|sancti:05-19o:4:w +2026-05-20|3|w|St. Bernardine of Siena|Feria_IV_after_the_Ascension|-|-|1|- +2026-05-21|4|w|Feria|Feria_V_after_the_Ascension|-|-|1|- +2026-05-22|4|w|Feria|Feria_VI_after_the_Ascension|-|-|1|- +2026-05-23|1|r|Saturday after the Ascension|-|-|-|1|- +2026-05-24|1|r|Pentecost Sunday|-|-|-|1|- +2026-05-25|1|r|Monday after Pentecost|-|-|St. Gregory VII;St. Urban, Pope and Martyr|1|- +2026-05-26|1|r|Tuesday after Pentecost|-|-|St. Philip Neri;S. Eleutherius|1|- +2026-05-27|1|r|Ember Wednesday of Pentecost|-|-|St. Bede the Venerable;St. John I|1|- +2026-05-28|1|r|Thursday after Pentecost|-|-|St. Augustine of Canterbury|1|- +2026-05-29|1|r|Ember Friday of Pentecost|-|-|St. Mary Magdalene de Pazzi|1|- +2026-05-30|1|r|Ember Saturday of Pentecost|-|-|St. Felix I|1|- +2026-05-31|1|w|Trinity Sunday|-|-|Queenship of the Blessed Virgin Mary;St. Petronilla|1|- +2026-06-01|3|w|St. Angela Merici|Feria_II_after_I_Sunday_after_Pentecost|-|-|1|- +2026-06-02|4|g|Feria|Feria_III_after_I_Sunday_after_Pentecost|Sts. Marcellinus, Peter, & Erasmus|-|1|sancti:06-02:4:r +2026-06-03|4|g|Feria|Feria_IV_after_I_Sunday_after_Pentecost|-|-|1|- +2026-06-04|1|w|Corpus Christi|-|-|St. Francis Caracciolo|1|- +2026-06-05|3|r|St. Boniface|Feria_V_after_I_Sunday_after_Pentecost|-|-|1|- +2026-06-06|3|w|St. Norbert|Saturday_after_I_Sunday_after_Pentecost|-|-|1|- +2026-06-07|2|g|II Sunday after Pentecost|-|-|-|1|- +2026-06-08|4|g|Feria|Feria_II_after_II_Sunday_after_Pentecost|-|-|1|- +2026-06-09|4|g|Feria|Feria_III_after_II_Sunday_after_Pentecost|Sts. Primus & Felicianus|-|1|sancti:06-09:4:r +2026-06-10|3|w|St. Margaret of Scotland|Feria_IV_after_II_Sunday_after_Pentecost|-|-|1|- +2026-06-11|3|r|St. Barnabas|Feria_V_after_II_Sunday_after_Pentecost|-|-|1|- +2026-06-12|1|w|Sacred Heart of Jesus|-|-|St. John of San Fecundo;St. Basilidus|1|- +2026-06-13|3|w|St. Anthony of Padua|Saturday_after_II_Sunday_after_Pentecost|-|-|1|- +2026-06-14|2|g|III Sunday after Pentecost|-|-|St. Basil the Great|1|- +2026-06-15|4|g|Feria|Feria_II_after_III_Sunday_after_Pentecost|St. Vitus|-|1|sancti:06-15:4:w +2026-06-16|4|g|Feria|Feria_III_after_III_Sunday_after_Pentecost|-|-|1|- +2026-06-17|3|w|St. Gregory Barbarigo|Feria_IV_after_III_Sunday_after_Pentecost|-|-|1|- +2026-06-18|3|r|St. Ephrem of Syria|Feria_V_after_III_Sunday_after_Pentecost|Ss. Marcus and Marcellianus|-|1|sancti:06-18t:4:r +2026-06-19|3|r|St. Julia of Falconieri|Feria_VI_after_III_Sunday_after_Pentecost|Sts. Gervasius and Protasius|-|1|sancti:06-19o:4:r +2026-06-20|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_III_Sunday_after_Pentecost|St. Silverius|-|1|sancti:06-20:4:r +2026-06-21|2|g|IV Sunday after Pentecost|-|-|St. Aloysius Gongzaga|1|- +2026-06-22|3|w|St. Paulinus of Nola|Feria_II_after_IV_Sunday_after_Pentecost|-|-|1|- +2026-06-23|2|v|Vigil of the Nativity of St. John the Baptist|Feria_III_after_IV_Sunday_after_Pentecost|-|-|1|- +2026-06-24|1|w|Nativity of St. John the Baptist|Feria_IV_after_IV_Sunday_after_Pentecost|-|-|1|- +2026-06-25|3|w|St. William|Feria_V_after_IV_Sunday_after_Pentecost|-|-|1|- +2026-06-26|3|r|Sts. John & Paul|Feria_VI_after_IV_Sunday_after_Pentecost|-|-|1|- +2026-06-27|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_IV_Sunday_after_Pentecost|-|-|1|- +2026-06-28|2|g|V Sunday after Pentecost|-|Vigil of Sts. Peter & Paul|-|1|sancti:06-28r:2:v +2026-06-29|1|r|Sts. Peter & Paul|Feria_II_after_V_Sunday_after_Pentecost|-|-|1|- +2026-06-30|3|r|In Commemoratione Sancti Pauli Apostoli|Feria_III_after_V_Sunday_after_Pentecost|-|-|1|- +2026-07-01|1|r|The Precious Blood of Our Lord Jesus Christ|Feria_IV_after_V_Sunday_after_Pentecost|-|-|1|- +2026-07-02|2|w|Visitation of the Blessed Virgin Mary|Feria_V_after_V_Sunday_after_Pentecost|SS. Processus and Martinian|-|1|sancti:07-02cc:4:r +2026-07-03|3|r|St. Irenaeus|Feria_VI_after_V_Sunday_after_Pentecost|-|-|1|- +2026-07-04|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_V_Sunday_after_Pentecost|-|-|1|- +2026-07-05|2|g|VI Sunday after Pentecost|-|-|St. Anthony Mary Zaccariah|1|- +2026-07-06|4|g|Feria|Feria_II_after_VI_Sunday_after_Pentecost|-|-|1|- +2026-07-07|3|w|Sts. Cyril & Methodius|Feria_III_after_VI_Sunday_after_Pentecost|-|-|1|- +2026-07-08|3|w|St. Elizabeth of Portugal|Feria_IV_after_VI_Sunday_after_Pentecost|-|-|1|- +2026-07-09|4|g|Feria|Feria_V_after_VI_Sunday_after_Pentecost|-|-|1|- +2026-07-10|3|r|Seven Holy Brothers and Sts. Rufina & Secunda|Feria_VI_after_VI_Sunday_after_Pentecost|-|-|1|- +2026-07-11|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_VI_Sunday_after_Pentecost|St. Pius I|-|1|sancti:07-11:4:r +2026-07-12|2|g|VII Sunday after Pentecost|-|-|St. John Gualbert;Ss. Naboris et Felicis|1|- +2026-07-13|4|g|Feria|Feria_II_after_VII_Sunday_after_Pentecost|-|-|1|- +2026-07-14|3|w|St. Bonaventure|Feria_III_after_VII_Sunday_after_Pentecost|-|-|1|- +2026-07-15|3|w|St. Henry the Emperor|Feria_IV_after_VII_Sunday_after_Pentecost|-|-|1|- +2026-07-16|4|g|Feria|Feria_V_after_VII_Sunday_after_Pentecost|Our Lady of Mt. Carmel|-|1|sancti:07-16:4:w +2026-07-17|4|g|Feria|Feria_VI_after_VII_Sunday_after_Pentecost|St. Alexis|-|1|sancti:07-17:4:w +2026-07-18|3|r|Camillus de Lellis|Saturday_after_VII_Sunday_after_Pentecost|Ss. Symphorosa and sons|-|1|sancti:07-18cc:4:r +2026-07-19|2|g|VIII Sunday after Pentecost|-|-|St. Vincent de Paul|1|- +2026-07-20|3|r|St. Jerome Emiliani|Feria_II_after_VIII_Sunday_after_Pentecost|St. Margaret|-|1|sancti:07-20o:4:w +2026-07-21|3|w|St. Laurence of Brindisi|Feria_III_after_VIII_Sunday_after_Pentecost|St. Praxedis Virginis|-|1|sancti:07-21:4:w +2026-07-22|3|w|St. Mary Magdalene|Feria_IV_after_VIII_Sunday_after_Pentecost|-|-|1|- +2026-07-23|3|w|St. Apollinaris|Feria_V_after_VIII_Sunday_after_Pentecost|S. Liborii|-|1|sancti:07-23cc:4:r +2026-07-24|4|g|Feria|Feria_VI_after_VIII_Sunday_after_Pentecost|St. Christina|-|1|sancti:07-24r:4:r +2026-07-25|2|r|St. James the Greater|Saturday_after_VIII_Sunday_after_Pentecost|St. Christopher|-|1|sancti:07-25cc:4:r +2026-07-26|2|g|IX Sunday after Pentecost|-|St. Anne, Mother of the Blessed Virgin|-|1|sancti:07-26:2:w +2026-07-27|4|g|Feria|Feria_II_after_IX_Sunday_after_Pentecost|St. Pantaleon|-|1|sancti:07-27:4:r +2026-07-28|3|r|Sts. Nazarius & Celsus, St. Victor I & St. Innocent I|Feria_III_after_IX_Sunday_after_Pentecost|-|-|1|- +2026-07-29|3|r|St. Martha|Feria_IV_after_IX_Sunday_after_Pentecost|Ss. Felicis, Simplicii, Faustini et Beatricis|-|1|sancti:07-29cc:4:r +2026-07-30|4|g|Feria|Feria_V_after_IX_Sunday_after_Pentecost|Sts. Abdon & Sennen|-|1|sancti:07-30:4:r +2026-07-31|3|w|St. Ignatius Loyola|Feria_VI_after_IX_Sunday_after_Pentecost|-|-|1|- +2026-08-01|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_IX_Sunday_after_Pentecost|Holy Machabees|-|1|sancti:08-01r:4:r +2026-08-02|2|g|X Sunday after Pentecost|-|-|St. Alphonsus Liguori;St. Stephen I, Pope and Martyr|1|- +2026-08-03|4|g|Feria|Feria_II_after_X_Sunday_after_Pentecost|-|-|1|- +2026-08-04|3|w|St. Dominic|Feria_III_after_X_Sunday_after_Pentecost|-|-|1|- +2026-08-05|3|w|Dedication of the Basilica of St. Mary Major|Feria_IV_after_X_Sunday_after_Pentecost|-|-|1|- +2026-08-06|2|w|Transfiguration of Our Lord|Feria_V_after_X_Sunday_after_Pentecost|Pope Sixtus II, Felicissimus and Agapitus, Martyrs|-|1|sancti:08-06cc:4:r +2026-08-07|3|w|St. Cajetan|Feria_VI_after_X_Sunday_after_Pentecost|St. Donatus|-|1|sancti:08-07o:4:r +2026-08-08|3|w|St. John Mary Vianney|Saturday_after_X_Sunday_after_Pentecost|Ss. Cyriacus, Largus and Smaragdus, Martyrs|-|1|sancti:08-08c:4:r +2026-08-09|3|r|Vigil of St. Lawrence|XI_Sunday_after_Pentecost|St. Romanus|-|1|sancti:08-09cc:4:r +2026-08-10|2|r|St. Lawrence|Feria_II_after_XI_Sunday_after_Pentecost|-|-|1|- +2026-08-11|4|g|Feria|Feria_III_after_XI_Sunday_after_Pentecost|Sts. Tiburtius & Susanna|-|1|sancti:08-11:4:r +2026-08-12|3|w|St. Clare|Feria_IV_after_XI_Sunday_after_Pentecost|-|-|1|- +2026-08-13|4|g|Feria|Feria_V_after_XI_Sunday_after_Pentecost|Sts. Hippolytus & Cassian|-|1|sancti:08-13:4:r +2026-08-14|2|w|Vigil of the Assumption|Feria_VI_after_XI_Sunday_after_Pentecost|St. Eusebius|-|1|sancti:08-14cc:4:r +2026-08-15|1|w|Assumption of the Blessed Virgin Mary|Saturday_after_XI_Sunday_after_Pentecost|-|-|1|- +2026-08-16|2|g|XII Sunday after Pentecost|-|St. Joachim, Father of the Blessed Virgin|-|1|sancti:08-16:2:w +2026-08-17|3|w|St. Hyacinth|Feria_II_after_XII_Sunday_after_Pentecost|-|-|1|- +2026-08-18|4|g|Feria|Feria_III_after_XII_Sunday_after_Pentecost|St. Agapitus|-|1|sancti:08-18r:4:w +2026-08-19|3|w|St. John Eudes|Feria_IV_after_XII_Sunday_after_Pentecost|-|-|1|- +2026-08-20|3|w|St. Bernard of Clairvaux|Feria_V_after_XII_Sunday_after_Pentecost|-|-|1|- +2026-08-21|3|w|St. Jane Frances de Chantal|Feria_VI_after_XII_Sunday_after_Pentecost|-|-|1|- +2026-08-22|2|w|Immaculate Heart of Mary|Saturday_after_XII_Sunday_after_Pentecost|Sts. Timothy, Hippolytus and Symphorianus, Martyrs|-|1|sancti:08-22cc:4:r +2026-08-23|2|g|XIII Sunday after Pentecost|-|-|St. Philip Benizi|1|- +2026-08-24|2|r|St. Bartholomew|Feria_II_after_XIII_Sunday_after_Pentecost|-|-|1|- +2026-08-25|3|w|St. Louis IX|Feria_III_after_XIII_Sunday_after_Pentecost|-|-|1|- +2026-08-26|4|g|Feria|Feria_IV_after_XIII_Sunday_after_Pentecost|St. Zephyrinus|-|1|sancti:08-26:4:r +2026-08-27|3|w|St. Joseph Calasance|Feria_V_after_XIII_Sunday_after_Pentecost|-|-|1|- +2026-08-28|3|r|St. Augustine|Feria_VI_after_XIII_Sunday_after_Pentecost|St. Hermes|-|1|sancti:08-28cc:4:r +2026-08-29|3|r|Beheading of St. John the Baptist|Saturday_after_XIII_Sunday_after_Pentecost|St. Sabina|-|1|sancti:08-29cc:4:r +2026-08-30|2|g|XIV Sunday after Pentecost|-|-|St. Rose of Lima;Sts. Felix and Adauctus|1|- +2026-08-31|3|w|St. Raymond Nonnatus|Feria_II_after_XIV_Sunday_after_Pentecost|-|-|1|- +2026-09-01|4|g|Feria|Feria_III_after_XIV_Sunday_after_Pentecost|St. Giles;Twelve Holy Brothers, Martyrs|-|1|sancti:09-01:4:w;sancti:09-01cc:4:r +2026-09-02|3|w|St. Stephen of Hungary|Feria_IV_after_XIV_Sunday_after_Pentecost|-|-|1|- +2026-09-03|3|w|St. Pius X|Feria_V_after_XIV_Sunday_after_Pentecost|-|-|1|- +2026-09-04|4|g|Feria|Feria_VI_after_XIV_Sunday_after_Pentecost|-|-|1|- +2026-09-05|3|w|St. Lawrence Justinian|Saturday_after_XIV_Sunday_after_Pentecost|-|-|1|- +2026-09-06|2|g|XV Sunday after Pentecost|-|-|-|1|- +2026-09-07|4|g|Feria|Feria_II_after_XV_Sunday_after_Pentecost|-|-|1|- +2026-09-08|2|w|Nativity of the Blessed Virgin Mary|Feria_III_after_XV_Sunday_after_Pentecost|S. Hadriani|-|1|sancti:09-08cc:4:r +2026-09-09|4|g|Feria|Feria_IV_after_XV_Sunday_after_Pentecost|St. Gorgonius|-|1|sancti:09-09:4:r +2026-09-10|3|w|St. Nicholas of Tolentino|Feria_V_after_XV_Sunday_after_Pentecost|-|-|1|- +2026-09-11|4|g|Feria|Feria_VI_after_XV_Sunday_after_Pentecost|Sts. Protus & Hyacinth|-|1|sancti:09-11:4:r +2026-09-12|3|w|Most Holy Name of Mary|Saturday_after_XV_Sunday_after_Pentecost|-|-|1|- +2026-09-13|2|g|XVI Sunday after Pentecost|-|-|-|1|- +2026-09-14|2|r|Exaltation of the Holy Cross|Feria_II_after_XVI_Sunday_after_Pentecost|-|-|1|- +2026-09-15|2|w|Seven Sorrows of the Blessed Virgin Mary|Feria_III_after_XVI_Sunday_after_Pentecost|S. Nicomedes|-|1|sancti:09-15cc:4:r +2026-09-16|3|r|Sts. Cornelius & Cyprian|Feria_IV_after_XVI_Sunday_after_Pentecost|Sts. Euphemia, Lucy and Geminianus|-|1|sancti:09-16cc:4:r +2026-09-17|4|g|Feria|Feria_V_after_XVI_Sunday_after_Pentecost|Stigmata of St. Francis|-|1|sancti:09-17:4:w +2026-09-18|3|w|St. Joseph of Cupertino|Feria_VI_after_XVI_Sunday_after_Pentecost|-|-|1|- +2026-09-19|3|r|St. Januarius & Companions|Saturday_after_XVI_Sunday_after_Pentecost|-|-|1|- +2026-09-20|2|g|XVII Sunday after Pentecost|-|-|Sts. Eustace & Companions|1|- +2026-09-21|2|r|St. Matthew|Feria_II_after_XVII_Sunday_after_Pentecost|-|-|1|- +2026-09-22|3|w|St. Thomas of Villanova|Feria_III_after_XVII_Sunday_after_Pentecost|St. Maurice and Companions, Martyrs|-|1|sancti:09-22o:4:r +2026-09-23|2|v|Ember Wednesday of September|-|St. Linus|St. Thecla|1|sancti:09-23:3:r +2026-09-24|4|g|Feria|Feria_V_after_XVII_Sunday_after_Pentecost|Our Lady of Ransom|-|1|sancti:09-24:4:w +2026-09-25|2|v|Ember Friday of September|-|-|-|1|- +2026-09-26|2|v|Ember Saturday of September|-|Sts. Cyprian & Justina|-|1|sancti:09-26:4:r +2026-09-27|2|g|XVIII Sunday after Pentecost|-|-|Sts. Cosmas & Damian|1|- +2026-09-28|3|r|St. Wenceslaus|Feria_II_after_XVIII_Sunday_after_Pentecost|-|-|1|- +2026-09-29|1|w|Dedication of St. Michael the Archangel|Feria_III_after_XVIII_Sunday_after_Pentecost|-|-|1|- +2026-09-30|3|w|St. Jerome|Feria_IV_after_XVIII_Sunday_after_Pentecost|-|-|1|- +2026-10-01|4|g|Feria|Feria_V_after_XVIII_Sunday_after_Pentecost|St. Remigius|-|1|sancti:10-01:4:w +2026-10-02|3|w|Holy Guardian Angels|Feria_VI_after_XVIII_Sunday_after_Pentecost|-|-|1|- +2026-10-03|3|w|St. Theresa of the Infant Jesus|Saturday_after_XVIII_Sunday_after_Pentecost|-|-|1|- +2026-10-04|2|g|XIX Sunday after Pentecost|-|-|St. Francis of Assisi|1|- +2026-10-05|4|g|Feria|Feria_II_after_XIX_Sunday_after_Pentecost|St. Placid & Companions|-|1|sancti:10-05:4:r +2026-10-06|3|w|St. Bruno|Feria_III_after_XIX_Sunday_after_Pentecost|-|-|1|- +2026-10-07|2|w|Our Lady of the Rosary|Feria_IV_after_XIX_Sunday_after_Pentecost|St. Mark I|-|1|sancti:10-07t:4:r +2026-10-08|3|w|St. Bridget of Sweden|Feria_V_after_XIX_Sunday_after_Pentecost|Ss. Sergio, Baccho, Marcello and Apulejo Martyrs|-|1|sancti:10-08c:4:r +2026-10-09|3|w|St. John Leonardi|Feria_VI_after_XIX_Sunday_after_Pentecost|St. Dionysius and companions|-|1|sancti:10-09t:4:r +2026-10-10|3|w|St. Francis Borgia|Saturday_after_XIX_Sunday_after_Pentecost|-|-|1|- +2026-10-11|2|g|XX Sunday after Pentecost|-|Maternity of the Blessed Virgin Mary|-|1|sancti:10-11:2:w +2026-10-12|4|g|Feria|Feria_II_after_XX_Sunday_after_Pentecost|-|-|1|- +2026-10-13|3|w|St. Edward|Feria_III_after_XX_Sunday_after_Pentecost|-|-|1|- +2026-10-14|3|r|St. Callistus I|Feria_IV_after_XX_Sunday_after_Pentecost|-|-|1|- +2026-10-15|3|w|St. Teresa of Avila|Feria_V_after_XX_Sunday_after_Pentecost|-|-|1|- +2026-10-16|3|w|St. Hedwig|Feria_VI_after_XX_Sunday_after_Pentecost|-|-|1|- +2026-10-17|3|w|St. Margaret Mary Alacoque|Saturday_after_XX_Sunday_after_Pentecost|-|-|1|- +2026-10-18|2|g|XXI Sunday after Pentecost|-|St. Luke the Evangelist|-|1|sancti:10-18:2:r +2026-10-19|3|w|St. Peter of Alcantara|Feria_II_after_XXI_Sunday_after_Pentecost|-|-|1|- +2026-10-20|3|w|St. John Cantius|Feria_III_after_XXI_Sunday_after_Pentecost|-|-|1|- +2026-10-21|4|g|Feria|Feria_IV_after_XXI_Sunday_after_Pentecost|St. Hilarion;St. Ursula and Companions|-|1|sancti:10-21:4:w;sancti:10-21cc:4:r +2026-10-22|4|g|Feria|Feria_V_after_XXI_Sunday_after_Pentecost|-|-|1|- +2026-10-23|3|w|St. Anthony Mary Claret|Feria_VI_after_XXI_Sunday_after_Pentecost|-|-|1|- +2026-10-24|3|w|St. Raphael the Archangel|Saturday_after_XXI_Sunday_after_Pentecost|-|-|1|- +2026-10-25|1|w|Christ the King|XXII_Sunday_after_Pentecost|-|Sts. Chrysanthus & Daria|1|- +2026-10-26|4|g|Feria|Feria_II_after_XXII_Sunday_after_Pentecost|St. Evaristus|-|1|sancti:10-26:4:r +2026-10-27|4|g|Feria|Feria_III_after_XXII_Sunday_after_Pentecost|-|-|1|- +2026-10-28|2|r|Sts. Simon & Jude|Feria_IV_after_XXII_Sunday_after_Pentecost|-|-|1|- +2026-10-29|4|g|Feria|Feria_V_after_XXII_Sunday_after_Pentecost|-|-|1|- +2026-10-30|4|g|Feria|Feria_VI_after_XXII_Sunday_after_Pentecost|-|-|1|- +2026-10-31|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXII_Sunday_after_Pentecost|-|-|1|- +2026-11-01|1|w|All Saints|XXIII_Sunday_after_Pentecost|-|-|1|- +2026-11-02|1|b|Commemoration of All Souls|Feria_II_after_XXIII_Sunday_after_Pentecost|-|-|3|- +2026-11-03|4|g|Feria|Feria_III_after_XXIII_Sunday_after_Pentecost|-|-|1|- +2026-11-04|3|w|St. Charles Borromeo|Feria_IV_after_XXIII_Sunday_after_Pentecost|Sts. Vitalis and Agricola, Martyrs|-|1|sancti:11-04cc:4:r +2026-11-05|4|g|Feria|Feria_V_after_XXIII_Sunday_after_Pentecost|-|-|1|- +2026-11-06|4|g|Feria|Feria_VI_after_XXIII_Sunday_after_Pentecost|-|-|1|- +2026-11-07|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXIII_Sunday_after_Pentecost|-|-|1|- +2026-11-08|2|g|V Sunday after Epiphany|-|-|Four Holy Crowned Martyrs|1|- +2026-11-09|2|w|Dedication of the Archbasilica of Our Holy Savior|Feria_II_after_V_Sunday_after_Epiphany|St. Theodore|-|1|sancti:11-09cc:4:r +2026-11-10|3|w|St. Andrew Avellino|Feria_III_after_V_Sunday_after_Epiphany|Sts. Tryphonis, Respicii, et Nymphae|-|1|sancti:11-10o:4:r +2026-11-11|3|w|St. Martin of Tours|Feria_IV_after_V_Sunday_after_Epiphany|St. Menna|-|1|sancti:11-11cc:4:r +2026-11-12|3|r|St. Martin I|Feria_V_after_V_Sunday_after_Epiphany|-|-|1|- +2026-11-13|4|g|Feria|Feria_VI_after_V_Sunday_after_Epiphany|St. Didacus|-|1|sancti:11-13:4:w +2026-11-14|3|w|St. Josaphat|Saturday_after_V_Sunday_after_Epiphany|-|-|1|- +2026-11-15|2|g|VI Sunday after Epiphany|-|-|St. Albert the Great|1|- +2026-11-16|3|w|St. Gertrude the Great|Feria_II_after_VI_Sunday_after_Epiphany|-|-|1|- +2026-11-17|3|w|St. Gregory the Wonderworker|Feria_III_after_VI_Sunday_after_Epiphany|-|-|1|- +2026-11-18|3|w|Dedication of the Basilicas of Sts. Peter & Paul|Feria_IV_after_VI_Sunday_after_Epiphany|-|-|1|- +2026-11-19|3|w|St. Elizabeth of Hungary|Feria_V_after_VI_Sunday_after_Epiphany|St. Pontian|-|1|sancti:11-19o:4:r +2026-11-20|3|w|St. Felix of Valois|Feria_VI_after_VI_Sunday_after_Epiphany|-|-|1|- +2026-11-21|3|w|Presentation of the Blessed Virgin Mary|Saturday_after_VI_Sunday_after_Epiphany|-|-|1|- +2026-11-22|2|g|XXIV Sunday after Pentecost|-|-|St. Cecilia|1|- +2026-11-23|3|r|St. Clement I|Feria_II_after_XXIV_Sunday_after_Pentecost|St. Felicity|-|1|sancti:11-23cc:4:r +2026-11-24|3|w|St. John of the Cross|Feria_III_after_XXIV_Sunday_after_Pentecost|St. Chrysogonus|-|1|sancti:11-24o:4:r +2026-11-25|3|r|St. Catherine of Alexandria|Feria_IV_after_XXIV_Sunday_after_Pentecost|-|-|1|- +2026-11-26|3|w|St. Sylvester|Feria_V_after_XXIV_Sunday_after_Pentecost|St. Peter of Alexandria|-|1|sancti:11-26t:4:r +2026-11-27|4|g|Feria|Feria_VI_after_XXIV_Sunday_after_Pentecost|-|-|1|- +2026-11-28|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXIV_Sunday_after_Pentecost|-|-|1|- +2026-11-29|1|v|I Sunday of Advent|-|-|St. Saturninus|1|- +2026-11-30|2|r|St. Andrew|Feria_II_after_I_Sunday_of_Advent|-|-|1|- +2026-12-01|3|v|Feria III after I Sunday of Advent|-|-|-|1|- +2026-12-02|3|r|St. Vivian|Feria_IV_after_I_Sunday_of_Advent|Feria IV after I Sunday of Advent|-|1|tempora:Adv1-3:3:v +2026-12-03|3|w|St. Francis Xavier|Feria_V_after_I_Sunday_of_Advent|Feria V after I Sunday of Advent|-|1|tempora:Adv1-4:3:v +2026-12-04|3|w|St. Peter Chrysologus|Feria_VI_after_I_Sunday_of_Advent|Feria VI after I Sunday of Advent|-|1|tempora:Adv1-5:3:v +2026-12-05|3|v|Sabbato after I Sunday of Advent|-|St. Sabbas|-|1|sancti:12-05:4:w +2026-12-06|1|v|II Sunday of Advent|-|-|St. Nicholas|1|- +2026-12-07|3|w|St. Ambrose|Feria_II_after_II_Sunday_of_Advent|Feria II after II Sunday of Advent|-|1|tempora:Adv2-1:3:v +2026-12-08|1|w|Immaculate Conception of the Blessed Virgin Mary|Feria_III_after_II_Sunday_of_Advent|-|-|1|- +2026-12-09|3|v|Feria IV after II Sunday of Advent|-|-|-|1|- +2026-12-10|3|v|Feria V after II Sunday of Advent|-|St. Melchiades|-|1|sancti:12-10o:4:r +2026-12-11|3|w|St. Damasus I|Feria_VI_after_II_Sunday_of_Advent|Feria VI after II Sunday of Advent|-|1|tempora:Adv2-5:3:v +2026-12-12|3|v|Sabbato after II Sunday of Advent|-|-|-|1|- +2026-12-13|1|pv|III Sunday of Advent|-|-|St. Lucy|1|- +2026-12-14|3|pv|Feria II after III Sunday of Advent|-|-|-|1|- +2026-12-15|3|pv|Feria III after III Sunday of Advent|-|-|-|1|- +2026-12-16|2|v|Ember Wednesday of Advent|-|St. Eusebius|-|1|sancti:12-16:3:r +2026-12-17|2|pv|Feria V after III Sunday of Advent|-|-|-|1|- +2026-12-18|2|v|Ember Friday of Advent|-|-|-|1|- +2026-12-19|2|v|Ember Saturday of Advent|-|-|-|1|- +2026-12-20|1|v|IV Sunday of Advent|-|-|-|1|- +2026-12-21|2|r|St. Thomas|Feria_II_after_IV_Sunday_of_Advent|Feria II after IV Sunday of Advent|-|1|tempora:Adv4-1:2:v +2026-12-22|2|v|Feria III after IV Sunday of Advent|-|-|-|1|- +2026-12-23|2|v|Feria IV after IV Sunday of Advent|-|-|-|1|- +2026-12-24|1|v|Vigil of Christmas|-|-|-|1|- +2026-12-25|1|w|The Nativity of Our Lord|-|-|-|3|- +2026-12-26|2|r|St. Stephen|-|For Octave of the Nativity|-|1|sancti:12-26c:4:w +2026-12-27|2|w|Sunday in the Octave of Christmas|-|St. John the Evangelist|For Octave of the Nativity|1|sancti:12-27:2:w +2026-12-28|2|r|Holy Innocents|-|For Octave of the Nativity|-|1|sancti:12-28c:4:w +2026-12-29|2|w|Feria in the Octave of Christmas|-|St. Thomas Becket|-|1|sancti:12-29:4:r +2026-12-30|2|w|Feria in the Octave of Christmas|-|-|-|1|- +2026-12-31|2|w|Feria in the Octave of Christmas|-|St. Silvester|-|1|sancti:12-31:4:w +2027-01-01|1|w|Octave Day of Christmas|-|-|-|1|- +2027-01-02|4|w|II Mass of the B. V. M. – Vultum Tuum|-|-|-|1|- +2027-01-03|2|w|Holy Name of Jesus|-|-|-|1|- +2027-01-04|4|w|Feria|-|-|-|1|- +2027-01-05|4|w|Feria|-|St. Telesphorus Pope and Martyr|-|1|sancti:01-05:4:r +2027-01-06|1|w|Epiphany of the Lord|-|-|-|1|- +2027-01-07|4|w|Feria|-|-|-|1|- +2027-01-08|4|w|Feria|-|-|-|1|- +2027-01-09|4|w|II Mass of the B. V. M. – Vultum Tuum|-|-|-|1|- +2027-01-10|2|w|The Holy Family: Jesus, Mary & Joseph|-|-|-|1|- +2027-01-11|4|w|Feria|Feria_II_after_Epiphany|St. Hyginus Pope and Martyr|-|1|sancti:01-11cc:4:r +2027-01-12|4|w|Feria|Feria_III_after_Epiphany|-|-|1|- +2027-01-13|2|w|Commemoration of the Baptism of the Lord|Feria_IV_after_Epiphany|-|-|1|- +2027-01-14|3|w|St. Hilary|Feria_V_after_Epiphany|S. Felicis|-|1|sancti:01-14cc:4:r +2027-01-15|3|w|St. Paul, the First Hermit|Feria_VI_after_Epiphany|St. Maur, Abbot|-|1|sancti:01-15cc:4:w +2027-01-16|3|r|St. Marcellus I|Saturday_after_Epiphany|-|-|1|- +2027-01-17|2|g|II Sunday after Epiphany|-|-|St. Anthony|1|- +2027-01-18|4|g|Feria|Feria_II_after_II_Sunday_after_Epiphany|St. Prisca|-|1|sancti:01-18r:4:w +2027-01-19|4|g|Feria|Feria_III_after_II_Sunday_after_Epiphany|Sts. Marius, Martha, Audifax & Abachum;St. Canute, Martyr|-|1|sancti:01-19:4:r;sancti:01-19o:4:r +2027-01-20|3|r|Sts. Fabian & Sebastian|Feria_IV_after_II_Sunday_after_Epiphany|-|-|1|- +2027-01-21|3|r|St. Agnes|Feria_V_after_II_Sunday_after_Epiphany|-|-|1|- +2027-01-22|3|r|Sts. Vincent & Anastasius|Feria_VI_after_II_Sunday_after_Epiphany|-|-|1|- +2027-01-23|3|w|St. Raymond of Peñafort|Saturday_after_II_Sunday_after_Epiphany|St. Emerentiana|-|1|sancti:01-23o:4:r +2027-01-24|2|v|Septuagesima Sunday|-|-|St. Timothy|1|- +2027-01-25|3|w|Conversion of St. Paul|Feria_II_after_Septuagesima|St. Peter|-|1|sancti:01-25c:4:w +2027-01-26|3|r|St. Polycarp|Feria_III_after_Septuagesima|-|-|1|- +2027-01-27|3|w|St. John Chrysostom|Feria_IV_after_Septuagesima|-|-|1|- +2027-01-28|3|w|St. Peter Nolasco|Feria_V_after_Septuagesima|St. Agnes|-|1|sancti:01-28t:4:r +2027-01-29|3|w|St. Francis de Sales|Feria_VI_after_Septuagesima|-|-|1|- +2027-01-30|3|r|St. Martina|Saturday_after_Septuagesima|-|-|1|- +2027-01-31|2|v|Sexagesima Sunday|-|-|St. John Bosco|1|- +2027-02-01|3|r|St. Ignatius of Antioch|Feria_II_after_Sexagesima|-|-|1|- +2027-02-02|2|w|Purification of the Blessed Virgin Mary|Feria_III_after_Sexagesimæ|-|-|1|- +2027-02-03|4|v|Feria|Feria_IV_after_Sexagesimæ|St. Blaise|-|1|sancti:02-03:4:r +2027-02-04|3|w|St. Andrew Corsini|Feria_V_after_Sexagesimæ|-|-|1|- +2027-02-05|3|r|St. Agatha|Feria_VI_after_Sexagesimæ|-|-|1|- +2027-02-06|3|w|St. Titus|Saturday_after_Sexagesimæ|St. Dorothy|-|1|sancti:02-06o:4:r +2027-02-07|2|v|Quinquagesima Sunday|-|-|St. Romuald|1|- +2027-02-08|3|w|St. John of Matha|Feria_II_after_Quinquagesima|-|-|1|- +2027-02-09|3|w|St. Cyril of Alexandria|Feria_III_after_Quinquagesima|St. Appollonia|-|1|sancti:02-09o:4:r +2027-02-10|1|v|Ash Wednesday|-|-|St. Scholastica|1|- +2027-02-11|3|v|Feria V after Ash Wednesday|-|Our Lady of Lourdes|-|1|sancti:02-11:3:w +2027-02-12|3|v|Feria VI after Ash Wednesday|-|Seven Holy Servite Founders|-|1|sancti:02-12:3:w +2027-02-13|3|v|Saturday after Ash Wednesday|-|-|-|1|- +2027-02-14|1|v|I Sunday of Lent|-|-|St. Valentine|1|- +2027-02-15|3|v|Feria II after the I Sunday of Lent|-|Sts. Faustinus & Jovita|-|1|sancti:02-15:4:r +2027-02-16|3|v|Feria III after the I Sunday of Lent|-|-|-|1|- +2027-02-17|2|v|Ember Wednesday of Lent|-|-|-|1|- +2027-02-18|3|v|Feria V after the I Sunday of Lent|-|St. Simeon|-|1|sancti:02-18:4:r +2027-02-19|2|v|Ember Friday of Lent|-|-|-|1|- +2027-02-20|2|v|Ember Saturday of Lent|-|-|-|1|- +2027-02-21|1|v|II Sunday of Lent|-|-|-|1|- +2027-02-22|2|w|Chair of St. Peter|Feria_II_after_the_II_Sunday_of_Lent|St. Paul;Feria II after the II Sunday of Lent|-|1|sancti:02-22c:4:r;tempora:Quad2-1:3:v +2027-02-23|3|v|Feria III after the II Sunday of Lent|-|St. Peter Damien|-|1|sancti:02-23r:3:w +2027-02-24|2|r|St. Matthias|Feria_IV_after_the_II_Sunday_of_Lent|Feria IV after the II Sunday of Lent|-|1|tempora:Quad2-3:3:v +2027-02-25|3|v|Feria V after the II Sunday of Lent|-|-|-|1|- +2027-02-26|3|v|Feria VI after the II Sunday of Lent|-|-|-|1|- +2027-02-27|3|v|Saturday after the II Sunday of Lent|-|St. Gabriel of Our Lady of Sorrows|-|1|sancti:02-27:3:w +2027-02-28|1|v|III Sunday of Lent|-|-|-|1|- +2027-03-01|3|v|Feria II after the III Sunday of Lent|-|-|-|1|- +2027-03-02|3|v|Feria III after the III Sunday of Lent|-|-|-|1|- +2027-03-03|3|v|Feria IV after the III Sunday of Lent|-|-|-|1|- +2027-03-04|3|v|Feria V after the III Sunday of Lent|-|St. Casimir;St. Lucius|-|1|sancti:03-04:3:w;sancti:03-04cc:4:r +2027-03-05|3|v|Feria VI after the III Sunday of Lent|-|-|-|1|- +2027-03-06|3|v|Saturday after the III Sunday of Lent|-|Sts. Felicitas & Perpetua|-|1|sancti:03-06:3:r +2027-03-07|1|pv|IV Sunday of Lent|-|-|St. Thomas Aquinas|1|- +2027-03-08|3|v|Feria II after the IV Sunday of Lent|-|St. John of God|-|1|sancti:03-08:3:w +2027-03-09|3|v|Feria III after the IV Sunday of Lent|-|St. Frances Rome|-|1|sancti:03-09:3:w +2027-03-10|3|v|Feria IV after the IV Sunday of Lent|-|Forty Holy Martyrs of Sebaste|-|1|sancti:03-10:3:r +2027-03-11|3|v|Feria V after the IV Sunday of Lent|-|-|-|1|- +2027-03-12|3|v|Feria VI after the IV Sunday of Lent|-|St. Gregory the Great|-|1|sancti:03-12:3:w +2027-03-13|3|v|Saturday after the IV Sunday of Lent|-|-|-|1|- +2027-03-14|1|v|Passion Sunday|-|-|-|1|- +2027-03-15|3|v|Feria II of Passion Week|-|-|-|1|- +2027-03-16|3|v|Feria III of Passion Week|-|-|-|1|- +2027-03-17|3|v|Feria IV of Passion Week|-|St. Patrick|-|1|sancti:03-17:3:w +2027-03-18|3|v|Feria V of Passion Week|-|St. Cyril of Jerusalem|-|1|sancti:03-18:3:w +2027-03-19|3|v|Feria VI of Passion Week|-|For Our Lady of the Seven Sorrows|St. Joseph, Spouse of the Bl. Virgin Mary|1|tempora:Quad5-5Feriac:4:w +2027-03-20|3|v|Saturday of Passion Week|-|-|-|1|- +2027-03-21|1|rv|Palm Sunday|-|-|St. Benedict|1|- +2027-03-22|1|v|Feria II of Holy Week|-|-|-|1|- +2027-03-23|1|v|Feria III of Holy Week|-|-|-|1|- +2027-03-24|1|v|Feria IV of Holy Week|-|-|St. Gabriel the Archangel|1|- +2027-03-25|1|w|Holy Thursday|-|-|Annunciation of the Blessed Virgin Mary|1|- +2027-03-26|1|bv|Good Friday|-|-|-|1|- +2027-03-27|1|vw|Holy Saturday|-|-|St. John Damascene|1|- +2027-03-28|1|w|Easter Sunday|-|-|St. John of Capistrano|1|- +2027-03-29|1|w|Monday in the Octave of Easter|-|-|-|1|- +2027-03-30|1|w|Tuesday in the Octave of Easter|-|-|-|1|- +2027-03-31|1|w|Wednesday in the Octave of Easter|-|-|-|1|- +2027-04-01|1|w|Thursday in the Octave of Easter|-|-|-|1|- +2027-04-02|1|w|Friday in the Octave of Easter|-|-|St. Francis of Paola|1|- +2027-04-03|1|w|Saturday in the Octave of Easter|-|-|-|1|- +2027-04-04|1|w|Low Sunday|-|-|St. Isidore of Seville|1|- +2027-04-05|1|w|Annunciation of the Blessed Virgin Mary|Monday_after_I_Sunday_after_Easter|-|St. Vincent Ferrer|1|- +2027-04-06|4|w|Feria|Tuesday_after_I_Sunday_after_Easter|-|-|1|- +2027-04-07|4|w|Feria|Wednesday_after_I_Sunday_after_Easter|-|-|1|- +2027-04-08|4|w|Feria|Thursday_after_I_Sunday_after_Easter|-|-|1|- +2027-04-09|4|w|Feria|Friday_after_I_Sunday_after_Easter|-|-|1|- +2027-04-10|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_I_Sunday_after_Easter|-|-|1|- +2027-04-11|2|w|II Sunday after Easter|-|-|St. Leo the Great|1|- +2027-04-12|4|w|Feria|Monday_after_II_Sunday_after_Easter|-|-|1|- +2027-04-13|3|r|St. Hermenegild|Tuesday_after_II_Sunday_after_Easter|-|-|1|- +2027-04-14|3|r|St. Justin|Wednesday_after_II_Sunday_after_Easter|Sts. Tiburtius, Valerian et Maximus, Martyrs|-|1|sancti:04-14t:4:r +2027-04-15|4|w|Feria|Thursday_after_II_Sunday_after_Easter|-|-|1|- +2027-04-16|4|w|Feria|Friday_after_II_Sunday_after_Easter|-|-|1|- +2027-04-17|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_II_Sunday_after_Easter|St. Anicetus|-|1|sancti:04-17:4:r +2027-04-18|2|w|III Sunday after Easter|-|-|-|1|- +2027-04-19|4|w|Feria|Monday_after_III_Sunday_after_Easter|-|-|1|- +2027-04-20|4|w|Feria|Tuesday_after_III_Sunday_after_Easter|-|-|1|- +2027-04-21|3|w|St. Anselm|Wednesday_after_III_Sunday_after_Easter|-|-|1|- +2027-04-22|3|r|Sts. Soter & Caius|Thursday_after_III_Sunday_after_Easter|-|-|1|- +2027-04-23|4|w|Feria|Friday_after_III_Sunday_after_Easter|St. George|-|1|sancti:04-23:4:r +2027-04-24|3|r|St. Fidelis of Sigmaringen|Saturday_after_III_Sunday_after_Easter|-|-|1|- +2027-04-25|2|w|IV Sunday after Easter|-|St. Mark|Pro rogationibus|1|sancti:04-25:2:r +2027-04-26|3|r|Sts. Cletus & Marcellinus|Monday_after_IV_Sunday_after_Easter|-|-|1|- +2027-04-27|3|w|St. Peter Canisius|Tuesday_after_IV_Sunday_after_Easter|-|-|1|- +2027-04-28|3|w|St. Paul of the Cross|Wednesday_after_IV_Sunday_after_Easter|-|-|1|- +2027-04-29|3|r|St. Peter of Verona|Thursday_after_IV_Sunday_after_Easter|-|-|1|- +2027-04-30|3|w|St. Catherine of Siena|Friday_after_IV_Sunday_after_Easter|-|-|1|- +2027-05-01|1|w|St. Joseph the Workman|Saturday_after_IV_Sunday_after_Easter|-|-|1|- +2027-05-02|2|w|V Sunday after Easter|-|-|St. Athanasius|1|- +2027-05-03|4|w|Feria|The_Minor_Litanies_–_Rogations|Sts. Alexander & Companions|-|1|sancti:05-03r:4:r +2027-05-04|3|w|St. Monica|The_Minor_Litanies_–_Rogations|-|-|1|- +2027-05-05|2|w|Vigil of the Ascension|-|St. Pius V|-|1|sancti:05-05:3:w +2027-05-06|1|w|Ascension of the Lord|-|-|-|1|- +2027-05-07|3|r|St. Stanislaus|Feria_VI_after_the_Ascension|-|-|1|- +2027-05-08|4|w|IV Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_the_Ascension|-|-|1|- +2027-05-09|2|w|Sunday after the Ascension|-|-|St. Gregory of Nazianzen|1|- +2027-05-10|3|w|St. Antoninus|Feria_II_after_the_Ascension|St. Gordiano and Epimacho|-|1|sancti:05-10o:4:r +2027-05-11|2|r|Sts. Philip & James|Feria_III_after_the_Ascension|-|-|1|- +2027-05-12|3|r|Sts. Nereus, Achilleus, Domitilla, & Pancras|Feria_IV_after_the_Ascension|-|-|1|- +2027-05-13|3|w|St. Robert Bellarmine|Feria_V_after_the_Ascension|-|-|1|- +2027-05-14|4|w|Feria|Feria_VI_after_the_Ascension|St. Boniface|-|1|sancti:05-14:4:r +2027-05-15|1|r|Saturday after the Ascension|-|-|St. John Baptist de la Salle|1|- +2027-05-16|1|r|Pentecost Sunday|-|-|St. Ubaldus|1|- +2027-05-17|1|r|Monday after Pentecost|-|-|St. Paschal Baylon|1|- +2027-05-18|1|r|Tuesday after Pentecost|-|-|St. Venantius|1|- +2027-05-19|1|r|Ember Wednesday of Pentecost|-|-|St. Peter Celestine;St. Pudentiana Virginis|1|- +2027-05-20|1|r|Thursday after Pentecost|-|-|St. Bernardine of Siena|1|- +2027-05-21|1|r|Ember Friday of Pentecost|-|-|-|1|- +2027-05-22|1|r|Ember Saturday of Pentecost|-|-|-|1|- +2027-05-23|1|w|Trinity Sunday|-|-|-|1|- +2027-05-24|4|g|Feria|Feria_II_after_I_Sunday_after_Pentecost|-|-|1|- +2027-05-25|3|w|St. Gregory VII|Feria_III_after_I_Sunday_after_Pentecost|St. Urban, Pope and Martyr|-|1|sancti:05-25o:4:r +2027-05-26|3|w|St. Philip Neri|Feria_IV_after_I_Sunday_after_Pentecost|S. Eleutherius|-|1|sancti:05-26o:4:r +2027-05-27|1|w|Corpus Christi|-|-|St. Bede the Venerable;St. John I|1|- +2027-05-28|3|w|St. Augustine of Canterbury|Feria_V_after_I_Sunday_after_Pentecost|-|-|1|- +2027-05-29|3|w|St. Mary Magdalene de Pazzi|Saturday_after_I_Sunday_after_Pentecost|-|-|1|- +2027-05-30|2|g|II Sunday after Pentecost|-|-|St. Felix I|1|- +2027-05-31|2|w|Queenship of the Blessed Virgin Mary|Feria_II_after_II_Sunday_after_Pentecost|St. Petronilla|-|1|sancti:05-31c:4:w +2027-06-01|3|w|St. Angela Merici|Feria_III_after_II_Sunday_after_Pentecost|-|-|1|- +2027-06-02|4|g|Feria|Feria_IV_after_II_Sunday_after_Pentecost|Sts. Marcellinus, Peter, & Erasmus|-|1|sancti:06-02:4:r +2027-06-03|4|g|Feria|Feria_V_after_II_Sunday_after_Pentecost|-|-|1|- +2027-06-04|1|w|Sacred Heart of Jesus|-|-|St. Francis Caracciolo|1|- +2027-06-05|3|r|St. Boniface|Saturday_after_II_Sunday_after_Pentecost|-|-|1|- +2027-06-06|2|g|III Sunday after Pentecost|-|-|St. Norbert|1|- +2027-06-07|4|g|Feria|Feria_II_after_III_Sunday_after_Pentecost|-|-|1|- +2027-06-08|4|g|Feria|Feria_III_after_III_Sunday_after_Pentecost|-|-|1|- +2027-06-09|4|g|Feria|Feria_IV_after_III_Sunday_after_Pentecost|Sts. Primus & Felicianus|-|1|sancti:06-09:4:r +2027-06-10|3|w|St. Margaret of Scotland|Feria_V_after_III_Sunday_after_Pentecost|-|-|1|- +2027-06-11|3|r|St. Barnabas|Feria_VI_after_III_Sunday_after_Pentecost|-|-|1|- +2027-06-12|3|r|St. John of San Fecundo|Saturday_after_III_Sunday_after_Pentecost|St. Basilidus|-|1|sancti:06-12o:4:r +2027-06-13|2|g|IV Sunday after Pentecost|-|-|St. Anthony of Padua|1|- +2027-06-14|3|w|St. Basil the Great|Feria_II_after_IV_Sunday_after_Pentecost|-|-|1|- +2027-06-15|4|g|Feria|Feria_III_after_IV_Sunday_after_Pentecost|St. Vitus|-|1|sancti:06-15:4:w +2027-06-16|4|g|Feria|Feria_IV_after_IV_Sunday_after_Pentecost|-|-|1|- +2027-06-17|3|w|St. Gregory Barbarigo|Feria_V_after_IV_Sunday_after_Pentecost|-|-|1|- +2027-06-18|3|r|St. Ephrem of Syria|Feria_VI_after_IV_Sunday_after_Pentecost|Ss. Marcus and Marcellianus|-|1|sancti:06-18t:4:r +2027-06-19|3|r|St. Julia of Falconieri|Saturday_after_IV_Sunday_after_Pentecost|Sts. Gervasius and Protasius|-|1|sancti:06-19o:4:r +2027-06-20|2|g|V Sunday after Pentecost|-|-|St. Silverius|1|- +2027-06-21|3|w|St. Aloysius Gongzaga|Feria_II_after_V_Sunday_after_Pentecost|-|-|1|- +2027-06-22|3|w|St. Paulinus of Nola|Feria_III_after_V_Sunday_after_Pentecost|-|-|1|- +2027-06-23|2|v|Vigil of the Nativity of St. John the Baptist|Feria_IV_after_V_Sunday_after_Pentecost|-|-|1|- +2027-06-24|1|w|Nativity of St. John the Baptist|Feria_V_after_V_Sunday_after_Pentecost|-|-|1|- +2027-06-25|3|w|St. William|Feria_VI_after_V_Sunday_after_Pentecost|-|-|1|- +2027-06-26|3|r|Sts. John & Paul|Saturday_after_V_Sunday_after_Pentecost|-|-|1|- +2027-06-27|2|g|VI Sunday after Pentecost|-|-|-|1|- +2027-06-28|2|v|Vigil of Sts. Peter & Paul|Feria_II_after_VI_Sunday_after_Pentecost|-|-|1|- +2027-06-29|1|r|Sts. Peter & Paul|Feria_III_after_VI_Sunday_after_Pentecost|-|-|1|- +2027-06-30|3|r|In Commemoratione Sancti Pauli Apostoli|Feria_IV_after_VI_Sunday_after_Pentecost|-|-|1|- +2027-07-01|1|r|The Precious Blood of Our Lord Jesus Christ|Feria_V_after_VI_Sunday_after_Pentecost|-|-|1|- +2027-07-02|2|w|Visitation of the Blessed Virgin Mary|Feria_VI_after_VI_Sunday_after_Pentecost|SS. Processus and Martinian|-|1|sancti:07-02cc:4:r +2027-07-03|3|r|St. Irenaeus|Saturday_after_VI_Sunday_after_Pentecost|-|-|1|- +2027-07-04|2|g|VII Sunday after Pentecost|-|-|-|1|- +2027-07-05|3|w|St. Anthony Mary Zaccariah|Feria_II_after_VII_Sunday_after_Pentecost|-|-|1|- +2027-07-06|4|g|Feria|Feria_III_after_VII_Sunday_after_Pentecost|-|-|1|- +2027-07-07|3|w|Sts. Cyril & Methodius|Feria_IV_after_VII_Sunday_after_Pentecost|-|-|1|- +2027-07-08|3|w|St. Elizabeth of Portugal|Feria_V_after_VII_Sunday_after_Pentecost|-|-|1|- +2027-07-09|4|g|Feria|Feria_VI_after_VII_Sunday_after_Pentecost|-|-|1|- +2027-07-10|3|r|Seven Holy Brothers and Sts. Rufina & Secunda|Saturday_after_VII_Sunday_after_Pentecost|-|-|1|- +2027-07-11|2|g|VIII Sunday after Pentecost|-|-|St. Pius I|1|- +2027-07-12|3|r|St. John Gualbert|Feria_II_after_VIII_Sunday_after_Pentecost|Ss. Naboris et Felicis|-|1|sancti:07-12o:4:r +2027-07-13|4|g|Feria|Feria_III_after_VIII_Sunday_after_Pentecost|-|-|1|- +2027-07-14|3|w|St. Bonaventure|Feria_IV_after_VIII_Sunday_after_Pentecost|-|-|1|- +2027-07-15|3|w|St. Henry the Emperor|Feria_V_after_VIII_Sunday_after_Pentecost|-|-|1|- +2027-07-16|4|g|Feria|Feria_VI_after_VIII_Sunday_after_Pentecost|Our Lady of Mt. Carmel|-|1|sancti:07-16:4:w +2027-07-17|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_VIII_Sunday_after_Pentecost|St. Alexis|-|1|sancti:07-17:4:w +2027-07-18|2|g|IX Sunday after Pentecost|-|-|Camillus de Lellis;Ss. Symphorosa and sons|1|- +2027-07-19|3|w|St. Vincent de Paul|Feria_II_after_IX_Sunday_after_Pentecost|-|-|1|- +2027-07-20|3|r|St. Jerome Emiliani|Feria_III_after_IX_Sunday_after_Pentecost|St. Margaret|-|1|sancti:07-20o:4:w +2027-07-21|3|w|St. Laurence of Brindisi|Feria_IV_after_IX_Sunday_after_Pentecost|St. Praxedis Virginis|-|1|sancti:07-21:4:w +2027-07-22|3|w|St. Mary Magdalene|Feria_V_after_IX_Sunday_after_Pentecost|-|-|1|- +2027-07-23|3|w|St. Apollinaris|Feria_VI_after_IX_Sunday_after_Pentecost|S. Liborii|-|1|sancti:07-23cc:4:r +2027-07-24|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_IX_Sunday_after_Pentecost|St. Christina|-|1|sancti:07-24r:4:r +2027-07-25|2|g|X Sunday after Pentecost|-|St. James the Greater|St. Christopher|1|sancti:07-25:2:r +2027-07-26|2|w|St. Anne, Mother of the Blessed Virgin|Feria_II_after_X_Sunday_after_Pentecost|-|-|1|- +2027-07-27|4|g|Feria|Feria_III_after_X_Sunday_after_Pentecost|St. Pantaleon|-|1|sancti:07-27:4:r +2027-07-28|3|r|Sts. Nazarius & Celsus, St. Victor I & St. Innocent I|Feria_IV_after_X_Sunday_after_Pentecost|-|-|1|- +2027-07-29|3|r|St. Martha|Feria_V_after_X_Sunday_after_Pentecost|Ss. Felicis, Simplicii, Faustini et Beatricis|-|1|sancti:07-29cc:4:r +2027-07-30|4|g|Feria|Feria_VI_after_X_Sunday_after_Pentecost|Sts. Abdon & Sennen|-|1|sancti:07-30:4:r +2027-07-31|3|w|St. Ignatius Loyola|Saturday_after_X_Sunday_after_Pentecost|-|-|1|- +2027-08-01|2|g|XI Sunday after Pentecost|-|-|Holy Machabees|1|- +2027-08-02|3|r|St. Alphonsus Liguori|Feria_II_after_XI_Sunday_after_Pentecost|St. Stephen I, Pope and Martyr|-|1|sancti:08-02o:4:r +2027-08-03|4|g|Feria|Feria_III_after_XI_Sunday_after_Pentecost|-|-|1|- +2027-08-04|3|w|St. Dominic|Feria_IV_after_XI_Sunday_after_Pentecost|-|-|1|- +2027-08-05|3|w|Dedication of the Basilica of St. Mary Major|Feria_V_after_XI_Sunday_after_Pentecost|-|-|1|- +2027-08-06|2|w|Transfiguration of Our Lord|Feria_VI_after_XI_Sunday_after_Pentecost|Pope Sixtus II, Felicissimus and Agapitus, Martyrs|-|1|sancti:08-06cc:4:r +2027-08-07|3|w|St. Cajetan|Saturday_after_XI_Sunday_after_Pentecost|St. Donatus|-|1|sancti:08-07o:4:r +2027-08-08|2|g|XII Sunday after Pentecost|-|-|St. John Mary Vianney;Ss. Cyriacus, Largus and Smaragdus, Martyrs|1|- +2027-08-09|3|r|Vigil of St. Lawrence|Feria_II_after_XII_Sunday_after_Pentecost|St. Romanus|-|1|sancti:08-09cc:4:r +2027-08-10|2|r|St. Lawrence|Feria_III_after_XII_Sunday_after_Pentecost|-|-|1|- +2027-08-11|4|g|Feria|Feria_IV_after_XII_Sunday_after_Pentecost|Sts. Tiburtius & Susanna|-|1|sancti:08-11:4:r +2027-08-12|3|w|St. Clare|Feria_V_after_XII_Sunday_after_Pentecost|-|-|1|- +2027-08-13|4|g|Feria|Feria_VI_after_XII_Sunday_after_Pentecost|Sts. Hippolytus & Cassian|-|1|sancti:08-13:4:r +2027-08-14|2|w|Vigil of the Assumption|Saturday_after_XII_Sunday_after_Pentecost|St. Eusebius|-|1|sancti:08-14cc:4:r +2027-08-15|1|w|Assumption of the Blessed Virgin Mary|XIII_Sunday_after_Pentecost|-|-|1|- +2027-08-16|2|w|St. Joachim, Father of the Blessed Virgin|Feria_II_after_XIII_Sunday_after_Pentecost|-|-|1|- +2027-08-17|3|w|St. Hyacinth|Feria_III_after_XIII_Sunday_after_Pentecost|-|-|1|- +2027-08-18|4|g|Feria|Feria_IV_after_XIII_Sunday_after_Pentecost|St. Agapitus|-|1|sancti:08-18r:4:w +2027-08-19|3|w|St. John Eudes|Feria_V_after_XIII_Sunday_after_Pentecost|-|-|1|- +2027-08-20|3|w|St. Bernard of Clairvaux|Feria_VI_after_XIII_Sunday_after_Pentecost|-|-|1|- +2027-08-21|3|w|St. Jane Frances de Chantal|Saturday_after_XIII_Sunday_after_Pentecost|-|-|1|- +2027-08-22|2|g|XIV Sunday after Pentecost|-|Immaculate Heart of Mary|Sts. Timothy, Hippolytus and Symphorianus, Martyrs|1|sancti:08-22:2:w +2027-08-23|3|w|St. Philip Benizi|Feria_II_after_XIV_Sunday_after_Pentecost|-|-|1|- +2027-08-24|2|r|St. Bartholomew|Feria_III_after_XIV_Sunday_after_Pentecost|-|-|1|- +2027-08-25|3|w|St. Louis IX|Feria_IV_after_XIV_Sunday_after_Pentecost|-|-|1|- +2027-08-26|4|g|Feria|Feria_V_after_XIV_Sunday_after_Pentecost|St. Zephyrinus|-|1|sancti:08-26:4:r +2027-08-27|3|w|St. Joseph Calasance|Feria_VI_after_XIV_Sunday_after_Pentecost|-|-|1|- +2027-08-28|3|r|St. Augustine|Saturday_after_XIV_Sunday_after_Pentecost|St. Hermes|-|1|sancti:08-28cc:4:r +2027-08-29|2|g|XV Sunday after Pentecost|-|-|Beheading of St. John the Baptist;St. Sabina|1|- +2027-08-30|3|r|St. Rose of Lima|Feria_II_after_XV_Sunday_after_Pentecost|Sts. Felix and Adauctus|-|1|sancti:08-30o:4:r +2027-08-31|3|w|St. Raymond Nonnatus|Feria_III_after_XV_Sunday_after_Pentecost|-|-|1|- +2027-09-01|4|g|Feria|Feria_IV_after_XV_Sunday_after_Pentecost|St. Giles;Twelve Holy Brothers, Martyrs|-|1|sancti:09-01:4:w;sancti:09-01cc:4:r +2027-09-02|3|w|St. Stephen of Hungary|Feria_V_after_XV_Sunday_after_Pentecost|-|-|1|- +2027-09-03|3|w|St. Pius X|Feria_VI_after_XV_Sunday_after_Pentecost|-|-|1|- +2027-09-04|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XV_Sunday_after_Pentecost|-|-|1|- +2027-09-05|2|g|XVI Sunday after Pentecost|-|-|St. Lawrence Justinian|1|- +2027-09-06|4|g|Feria|Feria_II_after_XVI_Sunday_after_Pentecost|-|-|1|- +2027-09-07|4|g|Feria|Feria_III_after_XVI_Sunday_after_Pentecost|-|-|1|- +2027-09-08|2|w|Nativity of the Blessed Virgin Mary|Feria_IV_after_XVI_Sunday_after_Pentecost|S. Hadriani|-|1|sancti:09-08cc:4:r +2027-09-09|4|g|Feria|Feria_V_after_XVI_Sunday_after_Pentecost|St. Gorgonius|-|1|sancti:09-09:4:r +2027-09-10|3|w|St. Nicholas of Tolentino|Feria_VI_after_XVI_Sunday_after_Pentecost|-|-|1|- +2027-09-11|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XVI_Sunday_after_Pentecost|Sts. Protus & Hyacinth|-|1|sancti:09-11:4:r +2027-09-12|2|g|XVII Sunday after Pentecost|-|-|Most Holy Name of Mary|1|- +2027-09-13|4|g|Feria|Feria_II_after_XVII_Sunday_after_Pentecost|-|-|1|- +2027-09-14|2|r|Exaltation of the Holy Cross|Feria_III_after_XVII_Sunday_after_Pentecost|-|-|1|- +2027-09-15|2|w|Seven Sorrows of the Blessed Virgin Mary|Feria_IV_after_XVII_Sunday_after_Pentecost|S. Nicomedes|-|1|sancti:09-15cc:4:r +2027-09-16|3|r|Sts. Cornelius & Cyprian|Feria_V_after_XVII_Sunday_after_Pentecost|Sts. Euphemia, Lucy and Geminianus|-|1|sancti:09-16cc:4:r +2027-09-17|4|g|Feria|Feria_VI_after_XVII_Sunday_after_Pentecost|Stigmata of St. Francis|-|1|sancti:09-17:4:w +2027-09-18|3|w|St. Joseph of Cupertino|Saturday_after_XVII_Sunday_after_Pentecost|-|-|1|- +2027-09-19|2|g|XVIII Sunday after Pentecost|-|-|St. Januarius & Companions|1|- +2027-09-20|4|g|Feria|Feria_II_after_XVIII_Sunday_after_Pentecost|Sts. Eustace & Companions|-|1|sancti:09-20:4:r +2027-09-21|2|r|St. Matthew|Feria_III_after_XVIII_Sunday_after_Pentecost|-|-|1|- +2027-09-22|2|v|Ember Wednesday of September|-|St. Thomas of Villanova|St. Maurice and Companions, Martyrs|1|sancti:09-22:3:w +2027-09-23|3|r|St. Linus|Feria_V_after_XVIII_Sunday_after_Pentecost|St. Thecla|-|1|sancti:09-23cc:4:r +2027-09-24|2|v|Ember Friday of September|-|Our Lady of Ransom|-|1|sancti:09-24:4:w +2027-09-25|2|v|Ember Saturday of September|-|-|-|1|- +2027-09-26|2|g|XIX Sunday after Pentecost|-|-|Sts. Cyprian & Justina|1|- +2027-09-27|3|r|Sts. Cosmas & Damian|Feria_II_after_XIX_Sunday_after_Pentecost|-|-|1|- +2027-09-28|3|r|St. Wenceslaus|Feria_III_after_XIX_Sunday_after_Pentecost|-|-|1|- +2027-09-29|1|w|Dedication of St. Michael the Archangel|Feria_IV_after_XIX_Sunday_after_Pentecost|-|-|1|- +2027-09-30|3|w|St. Jerome|Feria_V_after_XIX_Sunday_after_Pentecost|-|-|1|- +2027-10-01|4|g|Feria|Feria_VI_after_XIX_Sunday_after_Pentecost|St. Remigius|-|1|sancti:10-01:4:w +2027-10-02|3|w|Holy Guardian Angels|Saturday_after_XIX_Sunday_after_Pentecost|-|-|1|- +2027-10-03|2|g|XX Sunday after Pentecost|-|-|St. Theresa of the Infant Jesus|1|- +2027-10-04|3|w|St. Francis of Assisi|Feria_II_after_XX_Sunday_after_Pentecost|-|-|1|- +2027-10-05|4|g|Feria|Feria_III_after_XX_Sunday_after_Pentecost|St. Placid & Companions|-|1|sancti:10-05:4:r +2027-10-06|3|w|St. Bruno|Feria_IV_after_XX_Sunday_after_Pentecost|-|-|1|- +2027-10-07|2|w|Our Lady of the Rosary|Feria_V_after_XX_Sunday_after_Pentecost|St. Mark I|-|1|sancti:10-07t:4:r +2027-10-08|3|w|St. Bridget of Sweden|Feria_VI_after_XX_Sunday_after_Pentecost|Ss. Sergio, Baccho, Marcello and Apulejo Martyrs|-|1|sancti:10-08c:4:r +2027-10-09|3|w|St. John Leonardi|Saturday_after_XX_Sunday_after_Pentecost|St. Dionysius and companions|-|1|sancti:10-09t:4:r +2027-10-10|2|g|XXI Sunday after Pentecost|-|-|St. Francis Borgia|1|- +2027-10-11|2|w|Maternity of the Blessed Virgin Mary|Feria_II_after_XXI_Sunday_after_Pentecost|-|-|1|- +2027-10-12|4|g|Feria|Feria_III_after_XXI_Sunday_after_Pentecost|-|-|1|- +2027-10-13|3|w|St. Edward|Feria_IV_after_XXI_Sunday_after_Pentecost|-|-|1|- +2027-10-14|3|r|St. Callistus I|Feria_V_after_XXI_Sunday_after_Pentecost|-|-|1|- +2027-10-15|3|w|St. Teresa of Avila|Feria_VI_after_XXI_Sunday_after_Pentecost|-|-|1|- +2027-10-16|3|w|St. Hedwig|Saturday_after_XXI_Sunday_after_Pentecost|-|-|1|- +2027-10-17|2|g|XXII Sunday after Pentecost|-|-|St. Margaret Mary Alacoque|1|- +2027-10-18|2|r|St. Luke the Evangelist|Feria_II_after_XXII_Sunday_after_Pentecost|-|-|1|- +2027-10-19|3|w|St. Peter of Alcantara|Feria_III_after_XXII_Sunday_after_Pentecost|-|-|1|- +2027-10-20|3|w|St. John Cantius|Feria_IV_after_XXII_Sunday_after_Pentecost|-|-|1|- +2027-10-21|4|g|Feria|Feria_V_after_XXII_Sunday_after_Pentecost|St. Hilarion;St. Ursula and Companions|-|1|sancti:10-21:4:w;sancti:10-21cc:4:r +2027-10-22|4|g|Feria|Feria_VI_after_XXII_Sunday_after_Pentecost|-|-|1|- +2027-10-23|3|w|St. Anthony Mary Claret|Saturday_after_XXII_Sunday_after_Pentecost|-|-|1|- +2027-10-24|2|g|XXIII Sunday after Pentecost|-|-|St. Raphael the Archangel|1|- +2027-10-25|4|g|Feria|Feria_II_after_XXIII_Sunday_after_Pentecost|Sts. Chrysanthus & Daria|-|1|sancti:10-25:4:r +2027-10-26|4|g|Feria|Feria_III_after_XXIII_Sunday_after_Pentecost|St. Evaristus|-|1|sancti:10-26:4:r +2027-10-27|4|g|Feria|Feria_IV_after_XXIII_Sunday_after_Pentecost|-|-|1|- +2027-10-28|2|r|Sts. Simon & Jude|Feria_V_after_XXIII_Sunday_after_Pentecost|-|-|1|- +2027-10-29|4|g|Feria|Feria_VI_after_XXIII_Sunday_after_Pentecost|-|-|1|- +2027-10-30|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXIII_Sunday_after_Pentecost|-|-|1|- +2027-10-31|1|w|Christ the King|IV_Sunday_after_Epiphany|-|-|1|- +2027-11-01|1|w|All Saints|Feria_II_after_IV_Sunday_after_Epiphany|-|-|1|- +2027-11-02|1|b|Commemoration of All Souls|Feria_III_after_IV_Sunday_after_Epiphany|-|-|3|- +2027-11-03|4|g|Feria|Feria_IV_after_IV_Sunday_after_Epiphany|-|-|1|- +2027-11-04|3|w|St. Charles Borromeo|Feria_V_after_IV_Sunday_after_Epiphany|Sts. Vitalis and Agricola, Martyrs|-|1|sancti:11-04cc:4:r +2027-11-05|4|g|Feria|Feria_VI_after_IV_Sunday_after_Epiphany|-|-|1|- +2027-11-06|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_IV_Sunday_after_Epiphany|-|-|1|- +2027-11-07|2|g|V Sunday after Epiphany|-|-|-|1|- +2027-11-08|4|g|Feria|Feria_II_after_V_Sunday_after_Epiphany|Four Holy Crowned Martyrs|-|1|sancti:11-08r:4:r +2027-11-09|2|w|Dedication of the Archbasilica of Our Holy Savior|Feria_III_after_V_Sunday_after_Epiphany|St. Theodore|-|1|sancti:11-09cc:4:r +2027-11-10|3|w|St. Andrew Avellino|Feria_IV_after_V_Sunday_after_Epiphany|Sts. Tryphonis, Respicii, et Nymphae|-|1|sancti:11-10o:4:r +2027-11-11|3|w|St. Martin of Tours|Feria_V_after_V_Sunday_after_Epiphany|St. Menna|-|1|sancti:11-11cc:4:r +2027-11-12|3|r|St. Martin I|Feria_VI_after_V_Sunday_after_Epiphany|-|-|1|- +2027-11-13|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_V_Sunday_after_Epiphany|St. Didacus|-|1|sancti:11-13:4:w +2027-11-14|2|g|VI Sunday after Epiphany|-|-|St. Josaphat|1|- +2027-11-15|3|w|St. Albert the Great|Feria_II_after_VI_Sunday_after_Epiphany|-|-|1|- +2027-11-16|3|w|St. Gertrude the Great|Feria_III_after_VI_Sunday_after_Epiphany|-|-|1|- +2027-11-17|3|w|St. Gregory the Wonderworker|Feria_IV_after_VI_Sunday_after_Epiphany|-|-|1|- +2027-11-18|3|w|Dedication of the Basilicas of Sts. Peter & Paul|Feria_V_after_VI_Sunday_after_Epiphany|-|-|1|- +2027-11-19|3|w|St. Elizabeth of Hungary|Feria_VI_after_VI_Sunday_after_Epiphany|St. Pontian|-|1|sancti:11-19o:4:r +2027-11-20|3|w|St. Felix of Valois|Saturday_after_VI_Sunday_after_Epiphany|-|-|1|- +2027-11-21|2|g|XXIV Sunday after Pentecost|-|-|Presentation of the Blessed Virgin Mary|1|- +2027-11-22|3|r|St. Cecilia|Feria_II_after_XXIV_Sunday_after_Pentecost|-|-|1|- +2027-11-23|3|r|St. Clement I|Feria_III_after_XXIV_Sunday_after_Pentecost|St. Felicity|-|1|sancti:11-23cc:4:r +2027-11-24|3|w|St. John of the Cross|Feria_IV_after_XXIV_Sunday_after_Pentecost|St. Chrysogonus|-|1|sancti:11-24o:4:r +2027-11-25|3|r|St. Catherine of Alexandria|Feria_V_after_XXIV_Sunday_after_Pentecost|-|-|1|- +2027-11-26|3|w|St. Sylvester|Feria_VI_after_XXIV_Sunday_after_Pentecost|St. Peter of Alexandria|-|1|sancti:11-26t:4:r +2027-11-27|4|w|V Mass of the B. V. M. – Salve, Sancta Parens|Saturday_after_XXIV_Sunday_after_Pentecost|-|-|1|- +2027-11-28|1|v|I Sunday of Advent|-|-|-|1|- +2027-11-29|3|v|Feria II after I Sunday of Advent|-|St. Saturninus|-|1|sancti:11-29r:4:r +2027-11-30|2|r|St. Andrew|Feria_III_after_I_Sunday_of_Advent|-|-|1|- +2027-12-01|3|v|Feria IV after I Sunday of Advent|-|-|-|1|- +2027-12-02|3|r|St. Vivian|Feria_V_after_I_Sunday_of_Advent|Feria V after I Sunday of Advent|-|1|tempora:Adv1-4:3:v +2027-12-03|3|w|St. Francis Xavier|Feria_VI_after_I_Sunday_of_Advent|Feria VI after I Sunday of Advent|-|1|tempora:Adv1-5:3:v +2027-12-04|3|w|St. Peter Chrysologus|Sabbato_after_I_Sunday_of_Advent|Sabbato after I Sunday of Advent|-|1|tempora:Adv1-6:3:v +2027-12-05|1|v|II Sunday of Advent|-|-|St. Sabbas|1|- +2027-12-06|3|w|St. Nicholas|Feria_II_after_II_Sunday_of_Advent|Feria II after II Sunday of Advent|-|1|tempora:Adv2-1:3:v +2027-12-07|3|w|St. Ambrose|Feria_III_after_II_Sunday_of_Advent|Feria III after II Sunday of Advent|-|1|tempora:Adv2-2:3:v +2027-12-08|1|w|Immaculate Conception of the Blessed Virgin Mary|Feria_IV_after_II_Sunday_of_Advent|-|-|1|- +2027-12-09|3|v|Feria V after II Sunday of Advent|-|-|-|1|- +2027-12-10|3|v|Feria VI after II Sunday of Advent|-|St. Melchiades|-|1|sancti:12-10o:4:r +2027-12-11|3|w|St. Damasus I|Sabbato_after_II_Sunday_of_Advent|Sabbato after II Sunday of Advent|-|1|tempora:Adv2-6:3:v +2027-12-12|1|pv|III Sunday of Advent|-|-|-|1|- +2027-12-13|3|r|St. Lucy|Feria_II_after_III_Sunday_of_Advent|Feria II after III Sunday of Advent|-|1|tempora:Adv3-1:3:v +2027-12-14|3|pv|Feria III after III Sunday of Advent|-|-|-|1|- +2027-12-15|2|v|Ember Wednesday of Advent|-|-|-|1|- +2027-12-16|3|r|St. Eusebius|Feria_V_after_III_Sunday_of_Advent|Feria V after III Sunday of Advent|-|1|tempora:Adv3-4:3:v +2027-12-17|2|v|Ember Friday of Advent|-|-|-|1|- +2027-12-18|2|v|Ember Saturday of Advent|-|-|-|1|- +2027-12-19|1|v|IV Sunday of Advent|-|-|-|1|- +2027-12-20|2|v|Feria II after IV Sunday of Advent|-|-|-|1|- +2027-12-21|2|r|St. Thomas|Feria_III_after_IV_Sunday_of_Advent|Feria III after IV Sunday of Advent|-|1|tempora:Adv4-2:2:v +2027-12-22|2|v|Feria IV after IV Sunday of Advent|-|-|-|1|- +2027-12-23|2|v|Feria V after IV Sunday of Advent|-|-|-|1|- +2027-12-24|1|v|Vigil of Christmas|-|-|-|1|- +2027-12-25|1|w|The Nativity of Our Lord|-|-|-|3|- +2027-12-26|2|w|Sunday in the Octave of Christmas|-|St. Stephen|For Octave of the Nativity|1|sancti:12-26:2:r +2027-12-27|2|w|St. John the Evangelist|-|For Octave of the Nativity|-|1|sancti:12-27c:4:w +2027-12-28|2|r|Holy Innocents|-|For Octave of the Nativity|-|1|sancti:12-28c:4:w +2027-12-29|2|w|Feria in the Octave of Christmas|-|St. Thomas Becket|-|1|sancti:12-29:4:r +2027-12-30|2|w|Feria in the Octave of Christmas|-|-|-|1|- +2027-12-31|2|w|Feria in the Octave of Christmas|-|St. Silvester|-|1|sancti:12-31:4:w diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 0aed1b9..07a5634 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -14,11 +14,10 @@ that file's own limit 1). missalemeum is INDEPENDENT of colitur's bootstrap chain, and its JSON carries a real admitted-commemorations array (its own RG 111-shaped selection, not lectio's rejects) -- so this - file compares THREE axes the lectio differential cannot touch at all: - rank, colour (as SET membership, see below), and commemoration presence/ - count. Slug IDENTITY is deliberately NOT compared (the brief: needs a - title->slug mapping, which is the data audit's business -- see the task - report -- not this automated comparator's). + file compares axes the lectio differential cannot touch at all: rank, + colour (as SET membership, see below), commemoration presence, count, + and (CORRECTED 2026-08-12, Task B, branch ef-rg16a -- see below) IDENTITY + -- WHICH commemoration is admitted, not only how many. *** THE FIXTURE'S OWN SHAPE (fixtures/missalemeum-ef-2026-2027.txt, fixtures/missalemeum-ef-2026-2027.provenance, tools/ @@ -29,7 +28,59 @@ between the id-embedded rank and info.rank itself (task brief's own premise was wrong here; the brief's extraction note has been corrected). This file, like the extraction script, reads ONLY info.rank and - info.colors, never parses anything out of info.id. + info.colors for the DAY's own rank/colour, never parses anything out of + info.id for that purpose. + + *** COMMEMORATION IDENTITY (added 2026-08-12, Task B, branch ef-rg16a) + -- CORRECTING the previous header's own "deliberately NOT compared" + claim *** + + The gap this correction closes: layer 4 used to compare commemoration + PRESENCE and List.length ONLY -- cardinality, never identity. A reviewer + proved this was vacuous by reversing admit's own dignity/precedence sort + (Rite_ef.Precedence_ef, so the engine admits the WORST candidate, an + outright RG 111 violation) and finding every assertion in this file + still green across all 730 days (see the perturbation record in the task + report, reproduced and reverted, not left in the tree). This file now + also compares WHICH commemoration is admitted, using two independent + signals from missalemeum's own JSON: the commemoration's title text + (English, exact string) and, for a sancti-origin commemoration, its own + [id]'s embedded rank digit (used only as a corroborating check, never as + the primary signal -- see [Comm_identity] below). + + THE MAPPING, AND EXACTLY WHAT IT CANNOT RESOLVE: missalemeum identifies + a commemoration by an English TITLE string; colitur identifies one by a + SLUG. There is no hand-built slug<->title lookup table here -- colitur's + own {!Celebration.t}.names already carries an English name for every + SANCTORAL-origin celebration (bootstrapped from lectio's own English + titles, which verifiably match missalemeum's titles character-for- + character on every checked row), so the comparison reads that name + directly off colitur's own resolved output, the same field + test_differential.ml already treats as authoritative for OF/EF display + text. This resolves identity for every SANCTORAL-origin commemoration. + It CANNOT resolve a TEMPORAL-origin commemoration (an impeded feria, a + privileged Sunday, an Ember/Rogation day, etc.): {!Rite_ef.Temporal_ef}'s + own [build] never sets a celebration's [names] field (rite_ef/ + temporal_ef.ml has no [en "..."] string anywhere in it), so every such + candidate's own title is empty on colitur's side -- there is nothing to + compare against missalemeum's title text, and no principled way to + invent one without duplicating missalemeum's own English-prose + convention ("Feria III after the I Sunday of Lent") as a second, + unverified source of truth. THIS CASE IS NEVER SILENTLY SKIPPED: see + [Comm_identity_unresolved] below -- it is counted, reported, and must be + named in the allow-list like any other difference, exactly the discipline + the brief demands ("a day whose commemoration cannot be matched must be + visibly counted and reported, not quietly passed"). + + Identity is only even ATTEMPTED once presence and count already agree + (both non-empty, same length) -- a cardinality mismatch is already + [Comm_presence]/[Comm_count]'s own business (see [diff_fields] below), + and comparing SETS of different size would just restate that mismatch + under a third name, not add information. Compared as a SORTED MULTISET + of titles, not a sequence: missalemeum's own [commemorations] array order + is not independently verified against RG 113's own "commemoratio de + Tempore fit primo loco" ordering rule here, so this axis proves WHICH + commemorations are admitted, not what order they are listed in. info.colors is an ARRAY -- 14 of 730 days carry two colours (rose+violet on Gaudete/Laetare per RG 131's indult, red+violet on Palm Sunday, black+ @@ -56,14 +107,19 @@ entries; RG 110's inseparable-Peter/Paul commemoration is unimplemented code, a real feature this task did not build) -- honestly verdicted [missalemeum] (colitur is short a feature or a row, not right), never - silently absorbed as if colitur were correct. TWO entries (M11 and - M13) are [verdict open] -- CORRECTED, final fix wave, item 7: this - comment previously said "one entry (M13)", missing M11, whose own - verdict was changed from [colitur] to [open] in fix round 1 (see M11's - own entry below for why) but this summary was never updated to match. - Both are adjudicated as unresolved, not resolved either way -- the - brief's own explicit permission ("say so as an open item") used for - real, not defaulted past. See the task report for every entry's full + silently absorbed as if colitur were correct. THREE entries (M11, M13 + and, since Task B/ef-rg16a, M17) are [verdict open] -- CORRECTED, final + fix wave, item 7: this comment previously said "one entry (M13)", + missing M11, whose own verdict was changed from [colitur] to [open] in + fix round 1 (see M11's own entry below for why) but this summary was + never updated to match; M17 (the RG 113 same-band tie-break residual, + register §6.1) is a genuinely NEW open item, not a stale-comment fix. + ONE entry (M15) carries its own fourth verdict, [unresolvable] -- not a + rubric dispute or a data gap either engine is wrong about, but a LIMIT + of this comparator itself (see M15's own entry). All are adjudicated as + unresolved/unresolvable, not resolved either way -- the brief's own + explicit permission ("say so as an open item") used for real, not + defaulted past. See the task report for every entry's full reasoning and primary-source citation. *) module Cal = Colitur_kernel.Calendar @@ -74,6 +130,8 @@ module Slug = Colitur_kernel.Slug module Date = Colitur_kernel.Date module Cel = Colitur_kernel.Celebration module Colour = Colitur_kernel.Colour +module Names = Colitur_kernel.Names +module Lang = Colitur_kernel.Lang module V = Rite_ef.Vocab_ef (* Same relative paths test_differential.ml uses: dune test runs from @@ -88,7 +146,16 @@ let allow_list_path = "../data/ef/expected-divergences-missalemeum.sexp" same reason test_differential.ml's own [fixture_sha256] is: a hand-edit or partial re-extraction would otherwise silently turn the oracle into an unlabelled snapshot of whatever someone last ran. *) -let fixture_sha256 = "718eff1a03fa09c3927ef18d19fe7921c2d4d7611890c22566058b81fd7cc5ea" +(* CORRECTED 2026-08-12, Task B (branch ef-rg16a): field 9 + (commemoration_ids) appended to the fixture (tools/ + extract_missalemeum_oracle.py's own header) so this file can compare + commemoration IDENTITY, not merely presence/count -- see this file's own + header comment, rewritten below. Regenerated from the SAME underlying + snapshot (fixtures/missalemeum-ef-2026-2027.provenance: still lectio + commit d7da4b0, re-verified, first 8 fields byte-identical) -- only field + 9 is new content, so this digest changes but the fixture's own data does + not. *) +let fixture_sha256 = "4162e79d7a0bc03b81a34ce6cd3b074e2d32570217759bc3b4058ada75ea8781" (* Identical technique to test_differential.ml's own [sha256_of_file] (that file's own comment explains why: shelling out to [sha256sum] @@ -143,6 +210,7 @@ type oracle_row = { o_colours : char list; o_title : string; o_commemorations : string list; + o_commemoration_ids : string list; (** parallel to [o_commemorations], see field 9's own doc above *) o_displaced : string list; } @@ -150,16 +218,27 @@ let explode s = List.init (String.length s) (String.get s) let split_list_field f = if f = "-" then [] else String.split_on_char ';' f +(* A commemoration id's own trailing "rank" field, e.g. "sancti:01-05:4:r" -> + [Some 4] -- the SECOND, corroborating identity signal this file's own + header describes (test_identity_rank_corroboration, near the bottom of + this file). [None] for any id that does not have exactly 4 ':'-separated + parts (defensive; every id checked so far does). *) +let id_rank id = + match String.split_on_char ':' id with [ _; _; rank; _ ] -> int_of_string_opt rank | _ -> None + +let is_sancti_id id = String.length id >= 7 && String.sub id 0 7 = "sancti:" + let oracle_row_of_line line = match String.split_on_char '|' line with - | [ date; rank; colours; title; _tempora; commemorations; displaced; _n_masses ] -> + | [ date; rank; colours; title; _tempora; commemorations; displaced; _n_masses; commemoration_ids ] -> { o_date = date; o_rank = int_of_string rank; o_colours = explode colours; o_title = title; o_commemorations = split_list_field commemorations; + o_commemoration_ids = split_list_field commemoration_ids; o_displaced = split_list_field displaced } - | _ -> Alcotest.failf "malformed fixture line (expected 8 '|'-separated fields): %S" line + | _ -> Alcotest.failf "malformed fixture line (expected 9 '|'-separated fields): %S" line let read_lines path = let ic = open_in path in @@ -183,7 +262,20 @@ let oracle_rows () = List.map oracle_row_of_line (read_lines fixture_path) (* year, which straddles two civil years). *) (* ---------------------------------------------------------------------- *) -type colitur_row = { c_date : string; c_rank : int; c_colour : char; c_commemorations : string list } +(* [c_commemorations]: one entry per admitted commemoration, carrying its + own slug, RG 8 rank, STATUS, AND its English name if colitur's own + {!Celebration.t}.names has one -- [None] for a TEMPORAL-origin + candidate, which [Rite_ef.Temporal_ef] never names (this file's own + header, "THE MAPPING, AND EXACTLY WHAT IT CANNOT RESOLVE"). The [None] + case is what [Comm_identity_unresolved] below reads; [status] is read by + [test_identity_rank_corroboration]'s own scope guard, see its comment. *) +type colitur_row = { + c_date : string; + c_rank : int; + c_colour : char; + c_commemorations : (string * int * Cel.status * string option) list; + (** slug, rank, status, English name *) +} let rank_to_int = function V.Class1 -> 1 | V.Class2 -> 2 | V.Class3 -> 3 | V.Class4 -> 4 @@ -195,6 +287,8 @@ let colour_to_char = function | Colour.Rose -> 'p' | Colour.Black -> 'b' +let en = Lang.of_string_exn "en" + let colitur_rows_2026_2027 () = let layer = real_layer () in let by_rata : (int, (V.season, V.rank) LD.t) Hashtbl.t = Hashtbl.create 800 in @@ -210,14 +304,17 @@ let colitur_rows_2026_2027 () = (match Hashtbl.find_opt by_rata (Date.to_rata !d) with | Some day -> let cel = day.LD.observed in - let commemoration_slugs = - List.map (fun (c, _) -> Slug.to_string c.Cel.slug) day.LD.commemorations + let commemorations = + List.map + (fun (c, _) -> + (Slug.to_string c.Cel.slug, rank_to_int c.Cel.rank, c.Cel.status, Names.find c.Cel.names en)) + day.LD.commemorations in rows := { c_date = Date.to_iso8601 day.LD.date; c_rank = rank_to_int cel.Cel.rank; c_colour = colour_to_char cel.Cel.colour; - c_commemorations = commemoration_slugs + c_commemorations = commemorations } :: !rows | None -> Alcotest.failf "internal error: no resolved day for %s" (Date.to_iso8601 !d)); @@ -226,18 +323,39 @@ let colitur_rows_2026_2027 () = List.rev !rows (* ---------------------------------------------------------------------- *) -(* Field-diff computation: the four axes the oracle actually supports *) -(* (identity-by-slug is deliberately out of scope, see this file's own *) -(* header). *) +(* Field-diff computation: the axes the oracle supports, RANK/COLOUR/ *) +(* PRESENCE/COUNT as before, plus (Task B) IDENTITY -- see this file's own *) +(* header for the mapping and its exact limits. *) (* ---------------------------------------------------------------------- *) -type field = Rank | Colour_f | Comm_presence | Comm_count +type field = Rank | Colour_f | Comm_presence | Comm_count | Comm_identity_mismatch | Comm_identity_unresolved let field_name = function | Rank -> "rank" | Colour_f -> "colour" | Comm_presence -> "commemoration-presence" | Comm_count -> "commemoration-count" + | Comm_identity_mismatch -> "commemoration-identity-mismatch" + | Comm_identity_unresolved -> "commemoration-identity-unresolved" + +(* Identity (Task B): only even attempted once presence AND count already + agree (both non-empty, same length) -- see this file's own header, + "Identity is only even ATTEMPTED...". Two outcomes beyond a clean match: + [Comm_identity_unresolved] when ANY of colitur's own admitted + commemorations carries no English name to compare (a TEMPORAL-origin + candidate -- counted and reported, never silently skipped, per the + brief); [Comm_identity_mismatch] when every name IS resolvable but the + SORTED MULTISET of titles still disagrees with missalemeum's own. *) +let identity_diff (c : colitur_row) (o : oracle_row) = + let c_has = c.c_commemorations <> [] and o_has = o.o_commemorations <> [] in + if not (c_has && o_has) || List.length c.c_commemorations <> List.length o.o_commemorations then None + else + let unresolved = List.exists (fun (_, _, _, name) -> name = None) c.c_commemorations in + if unresolved then Some Comm_identity_unresolved + else + let c_titles = List.sort compare (List.filter_map (fun (_, _, _, n) -> n) c.c_commemorations) in + let o_titles = List.sort compare o.o_commemorations in + if c_titles = o_titles then None else Some Comm_identity_mismatch let diff_fields (c : colitur_row) (o : oracle_row) = let c_has = c.c_commemorations <> [] and o_has = o.o_commemorations <> [] in @@ -252,7 +370,8 @@ let diff_fields (c : colitur_row) (o : oracle_row) = same disagreement under a second name. *) (if c_has && o_has && List.length c.c_commemorations <> List.length o.o_commemorations then Some Comm_count - else None) + else None); + identity_diff c o ] (* ---------------------------------------------------------------------- *) @@ -491,6 +610,76 @@ let m12_dates = [ "2027-02-22" ] item. *) let m13_dates = [ "2027-03-19" ] +(* M15 -- Task B (branch ef-rg16a), NOT a rubric dispute and NOT a data gap + either engine is wrong about: a genuine LIMIT of this comparator, honestly + counted rather than silently passed (the brief's own explicit + instruction: "a day whose commemoration cannot be matched must be + visibly counted and reported, not quietly passed"). On each of these 19 + rows, colitur's own admitted commemoration is TEMPORAL-origin (an + impeded Advent/Lent feria) -- Rite_ef.Temporal_ef's own [build] + (temporal_ef.ml) never sets a celebration's [names] field, so there is no + English string on colitur's side to compare against missalemeum's title + text at all (this file's own header, "THE MAPPING, AND EXACTLY WHAT IT + CANNOT RESOLVE"). Every one of these 19 oracle titles reads as a plain + prose description of the SAME temporal ferial slot colitur independently + computes for that date (e.g. 2 Dec 2026: oracle "Feria IV after I Sunday + of Advent" against colitur's own [ef-advent-1-wednesday]; 4 Dec 2027: + oracle "Sabbato after I Sunday of Advent" against [ef-advent-1-saturday]) + -- suggestive corroboration, recorded here for a human reader, but NOT + proof: this comparator has no mechanism to verify English prose against + an opaque slug, so it does not claim these as verified matches, only as + unresolved. Fixing this at the ROOT (giving every temporal-cycle + candidate an English name) is a data/lectionary-bootstrap task, not + something this comparator can do for itself -- register §6, "RG 113 + tie-break" section's own neighbour, records it as an open item. *) +let m15_dates = + [ "2026-02-24"; "2026-03-19"; "2026-03-25"; "2026-12-02"; "2026-12-03"; "2026-12-04"; + "2026-12-07"; "2026-12-11"; "2026-12-21"; "2027-02-24"; "2027-12-02"; "2027-12-03"; + "2027-12-04"; "2027-12-06"; "2027-12-07"; "2027-12-11"; "2027-12-13"; "2027-12-16"; + "2027-12-21" ] + +(* M16 -- Task B: a genuine IDENTITY mismatch, both sides otherwise agreeing + on rank/colour/count/presence. 27 March 2026 (Friday of Passion Week): + colitur admits "St. John Damascene" (a real Class3 universal feast that + genuinely falls that day); missalemeum shows "For Our Lady of the Seven + Sorrows" instead. The SAME standing gap M13 above already names ("the + 1962 calendarium's own March table carries... 'Feria VI post dominicam I + Passionis: Commemoratio septem Dolorum B. Mariae Virg.'... a fixed + commemoration... EVERY year") -- confirmed real, and confirmed + UNIMPLEMENTED in this codebase (no candidate for it is ever constructed + in temporal_ef.ml), so colitur has nothing to admit in the Seven + Sorrows' place and falls back to whichever ordinary Class3 saint + actually wins that Friday instead. Verdict missalemeum: colitur is + missing a real, primary-cited office, not differently opinioned. + Register §6 open item (same one M13/M16's own primary-source note + already tracks). Only 2026 shows here -- 2027's Friday of Passion Week + IS 19 March, M13's own date, where the identity axis cannot even be + reached (M13's own rank/colour mismatch already excludes that day from + count-matched identity comparison). *) +let m16_dates = [ "2026-03-27" ] + +(* M17 -- Task B: the SAME-band residual tie-break (docs/research/rules- + register.md §4's own "RG 113" entry, and §6.1's "RG 113 same-band + residual" record) made visible for the first time by identity + comparison. 22 September 2027 (September Ember Wednesday): colitur + admits "St. Maurice and Companions, Martyrs" (Commemoration_only, + Class3); missalemeum shows "St. Thomas of Villanova" (Feast, Class3) + instead -- both land on {!Precedence_ef.band} entry 24 (III-class + universal feasts), a genuine tie RG 113 gives no further instruction for + (its own text only reaches "servetur ordo tabellae praecedentiae", the + TABLE order; nothing in the primary text breaks a tie WITHIN one table + entry). colitur's own residual tie-break (alphabetical by slug, §6.1's + own uncited-convention record) picks "maurice..." over "thomas..." purely + because 'm' < 't' -- no rubrical warrant either way, so this is NOT + adjudicated colitur or missalemeum: verdict OPEN, the same explicit + permission the brief gives M11/M13 ("say so as an open item rather than + absorbing it"), register §6.1. Only 2027 falls in this window with this + EXACT collision -- 2026's 22 September is an ordinary (non-Ember) + Tuesday, so Thomas of Villanova simply wins the day outright on both + sides (colitur: observed; missalemeum: title) with Maurice commemorated + alongside him identically on both -- no tie to observe that year. *) +let m17_dates = [ "2027-09-22" ] + let layer_m_reason (c : colitur_row) (o : oracle_row) diffs = if diffs = [] then None else if List.mem c.c_date m1_dates && subset diffs [ Rank; Colour_f; Comm_presence ] then Some "M1" @@ -506,7 +695,16 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs = else if List.mem c.c_date m10_dates && diffs = [ Comm_presence ] then Some "M10" else if List.mem c.c_date m11_dates && diffs = [ Comm_presence ] then Some "M11" else if List.mem c.c_date m12_dates && diffs = [ Comm_count ] then Some "M12" - else if List.mem c.c_date m13_dates && subset diffs [ Rank; Colour_f ] then Some "M13" + (* M13's own subset widened (Task B): the same underlying gap (the Seven + Sorrows commemoration is never constructed at all) now ALSO surfaces + as [Comm_identity_unresolved] on this date, since colitur's own + admitted commemoration there is temporal-origin (no English name) -- + one root cause, one id, both axes it touches. *) + else if List.mem c.c_date m13_dates && subset diffs [ Rank; Colour_f; Comm_identity_unresolved ] then + Some "M13" + else if List.mem c.c_date m15_dates && diffs = [ Comm_identity_unresolved ] then Some "M15" + else if List.mem c.c_date m16_dates && diffs = [ Comm_identity_mismatch ] then Some "M16" + else if List.mem c.c_date m17_dates && diffs = [ Comm_identity_mismatch ] then Some "M17" else None (* ---------------------------------------------------------------------- *) @@ -550,17 +748,24 @@ let classify oracle colitur = | None -> (c, o, Unexplained diffs)) oracle colitur +let status_to_string = function Cel.Feast -> "Feast" | Cel.Commemoration_only -> "Commemoration_only" + +let describe_comm (slug, rank, status, name) = + Printf.sprintf "%s(rank=%d,status=%s,name=%s)" slug rank (status_to_string status) + (match name with Some n -> Printf.sprintf "%S" n | None -> "NONE") + let describe_unexplained (c : colitur_row) (o : oracle_row) diffs = Printf.sprintf "%s: %s differ -- colitur=(rank=%d colour=%c comms=[%s]) oracle=(rank=%d colours=[%s] \ - title=%S comms=[%s] displaced=[%s])" + title=%S comms=[%s] comm_ids=[%s] displaced=[%s])" c.c_date (String.concat "," (List.map field_name diffs)) c.c_rank c.c_colour - (String.concat ";" c.c_commemorations) + (String.concat ";" (List.map describe_comm c.c_commemorations)) o.o_rank (String.concat "" (List.map (String.make 1) o.o_colours)) o.o_title (String.concat ";" o.o_commemorations) + (String.concat ";" o.o_commemoration_ids) (String.concat ";" o.o_displaced) let test_fixture_checksum () = @@ -578,9 +783,11 @@ let test_dates_align () = in Alcotest.(check (list (pair string string))) "no misaligned dates" [] mismatched -(* The core assertion: every one of the 42 raw differences across all four +(* The core assertion: every one of the 63 raw differences across all six axes (rank, colour-membership, commemoration-presence, commemoration- - count) is named in the cited allow-list. Nothing else passes silently. *) + count, and, since Task B/ef-rg16a, commemoration-identity-mismatch and + commemoration-identity-unresolved) is named in the cited allow-list. + Nothing else passes silently. *) let test_no_unexplained_differences () = let oracle, colitur = compare_streams () in let classified = classify oracle colitur in @@ -616,6 +823,115 @@ let test_layer_m_counts_match_citations () = undeclared" expected actual +(* Corroboration (Task B): for every day where the identity axis is CLEAN + (no [Comm_identity_mismatch]/[Comm_identity_unresolved] -- titles matched + as a set), independently cross-check missalemeum's own id-embedded rank + digit against colitur's OWN candidate rank for that SAME title -- a + SECOND, independent signal beyond string equality (this file's own + header: "used only as a corroborating check, never as the primary + signal"). Restricted to "sancti:"-origin ids (a TEMPORAL-origin oracle + commemoration has no colitur-side name to pair it with in the first + place, see [Comm_identity_unresolved]'s own days, which never reach here + since their identity axis is not clean). + + SPLIT BY STATUS -- a genuine finding from running this check, not the + originally-planned single assertion: EVERY ONE of colitur's 114 + [Commemoration_only] sanctoral entries carries a bootstrap-assigned + [rank Class3] (verified: `grep -c "status Commemoration_only"` and + `grep -B3 ... | grep -oP "rank Class\d" | sort | uniq -c` both give + 114/114 Class3, data/ef/sanctoral.sexp) -- but missalemeum's OWN id-rank + for a [Commemoration_only] match is NOT itself uniform: of the 175 + examined, 17 genuinely AGREE (oracle_rank = colitur_rank = 3, real + corroboration) and 158 show oracle_rank 4 against colitur's bootstrapped + 3 -- CORRECTED after the first version of this comment overclaimed "id + consistently encodes 4 for every entry" from the 158-strong failure list + alone, before the 17 agreeing rows (then hidden inside a too-strict + assertion) were found. Two acceptable shapes, then, not one: either the + ranks genuinely agree, or the specific oracle=4/colitur=3 gap holds. This + is not evidence of a title-matching error, and not new: it independently + corroborates the register's own already-open item (§6, "Commemoration- + only entries' inferred STATUS, not only rank" -- Task 16's own data + audit already flagged these ranks as bootstrap inferences, never + individually Missal-verified). Auditing which of the 114 are genuinely + Class3 and which were silently defaulted to it is that item's own scope, + not this task's -- so rather than either asserting a false universal + equality (which fails on the 158 KNOWN, tracked, out-of-scope rows) or + silently dropping the check, this pins the discovered SHAPE itself: + every [Commemoration_only] match is EITHER a real agreement OR the known + gap, with no THIRD pattern -- a real, falsifiable claim (any other + combination would break it) that stays honest about what remains + unverified. + + [Feast]-status candidates get the ORIGINAL, unrestricted check (any + disagreement at all is unexpected) -- but this window's own data never + actually offers a [Feast]-status LOSING candidate whose identity is + independently clean (checked: 0 in the 2026-2027 fixture -- a [Feast] + candidate here either wins its own day outright, in which case it is + never a commemoration at all, or the one day where it does lose, + 22 September 2027/Thomas of Villanova, is ITSELF the M17 tie-break + mismatch and so is excluded by the [identity_diff = None] guard before + ever reaching this check). Kept anyway, not deleted: a real disagreement + would still be reported the moment one becomes reachable (a wider oracle + window, or a data change), and this project's own vacuity catalogue + flags "an assertion true by construction" as a defect shape to avoid, + not "an assertion whose population happens to be empty in the one + fixture available" -- the CHECK still does real work when its input is + non-empty; it is the DATA, not the code, that is currently silent here. *) +let test_identity_rank_corroboration () = + let oracle, colitur = compare_streams () in + let feast_mismatches = ref [] in + let commemoration_only_checked = ref 0 in + let commemoration_only_surprises = ref [] in + List.iter2 + (fun (o : oracle_row) (c : colitur_row) -> + if + identity_diff c o = None && c.c_commemorations <> [] && o.o_commemorations <> [] + && List.length c.c_commemorations = List.length o.o_commemorations + then + List.iter2 + (fun title id -> + if is_sancti_id id then + match id_rank id with + | None -> () + | Some oracle_rank -> ( + match List.find_opt (fun (_, _, _, n) -> n = Some title) c.c_commemorations with + | Some (slug, colitur_rank, Cel.Feast, _) -> + if colitur_rank <> oracle_rank then + feast_mismatches := + Printf.sprintf "%s: %s oracle-id-rank=%d colitur-rank=%d" c.c_date slug + oracle_rank colitur_rank + :: !feast_mismatches + | Some (slug, colitur_rank, Cel.Commemoration_only, _) -> + incr commemoration_only_checked; + (* Two ACCEPTABLE shapes, not one -- corrected after first running this + check: most Commemoration_only entries genuinely agree + (oracle_rank = colitur_rank, real corroboration, 17 of the + population checked), and the rest show the KNOWN + oracle=4/colitur=3 convention gap (this comment's own header). + Anything OUTSIDE those two shapes (e.g. oracle=2 or a THIRD + colitur rank paired with a non-4 oracle rank) is a genuine + surprise. *) + if not (oracle_rank = colitur_rank || (oracle_rank = 4 && colitur_rank = 3)) then + commemoration_only_surprises := + Printf.sprintf "%s: %s oracle-id-rank=%d colitur-rank=%d (neither agrees nor \ + fits the known oracle=4/colitur=3 pattern)" + c.c_date slug oracle_rank colitur_rank + :: !commemoration_only_surprises + | None -> ())) + o.o_commemorations o.o_commemoration_ids) + oracle colitur; + Alcotest.(check (list string)) + "Feast-status matches: oracle id-rank agrees with colitur's own rank (none reachable in this window, \ + see this test's own comment; the check still runs)" + [] (List.rev !feast_mismatches); + Alcotest.(check (list string)) + "Commemoration_only-status matches: every one fits the KNOWN oracle=4/colitur=3 convention gap -- any \ + other combination would be a genuine, new surprise" + [] (List.rev !commemoration_only_surprises); + (* Vacuity guard for the branch that IS populated in this window. *) + Alcotest.(check bool) "the Commemoration_only population actually examined is non-trivial" true + (!commemoration_only_checked > 50) + let suite = ( "oracle (missalemeum, EF, 2026-2027)", [ Alcotest.test_case "fixture SHA-256 matches its provenance note" `Quick test_fixture_checksum; @@ -623,5 +939,8 @@ let suite = Alcotest.test_case "every difference is named in the cited allow-list -- none unexplained" `Quick test_no_unexplained_differences; Alcotest.test_case "allow-list counts match data/ef/expected-divergences-missalemeum.sexp exactly" - `Quick test_layer_m_counts_match_citations + `Quick test_layer_m_counts_match_citations; + Alcotest.test_case + "identity corroboration: matched titles' oracle id-rank agrees with colitur's own rank" `Quick + test_identity_rank_corroboration ] ) diff --git a/tools/extract_missalemeum_oracle.py b/tools/extract_missalemeum_oracle.py index 044aa54..a010b52 100644 --- a/tools/extract_missalemeum_oracle.py +++ b/tools/extract_missalemeum_oracle.py @@ -18,7 +18,7 @@ # exists for every day. # # One line per day, pipe-separated: -# date|rank|colors|title|tempora|commemorations|displaced|n_masses +# date|rank|colors|title|tempora|commemorations|displaced|n_masses|commemoration_ids # # - rank/colors/title/tempora/commemorations/displaced are info.rank, # info.colors (sorted, concatenated, e.g. "pv"), info.title, info.tempora @@ -31,6 +31,17 @@ # colors/tempora/commemorations/displaced are IDENTICAL across every Mass # of the same day for all 730 days -- checked below, not assumed; see the # task report for why entry[0] loses nothing). +# - commemoration_ids (Task B, branch ef-rg16a) is the ";"-joined info. +# commemorations[*].id, index-aligned with the commemorations field ("-" +# for an empty list, same convention) -- e.g. "sancti:01-05:4:r". Added so +# test_oracle.ml's identity comparison has a second, independent signal +# beyond the title text (the id encodes the commemorated saint's own rank +# and colour too, verified across the whole fixture to always carry the +# SAME calendar date as the day itself -- a commemoration's own natural +# fixed date, by construction, since only a saint impeded on their own day +# is ever commemorated there). Never parsed for its date component by this +# fixture or the comparator (info.rank/colors already give the day's own +# values); kept opaque and compared as a plain string. # - Spaces in tempora are turned to "_" (matching the "no field has an # internal space" convention test/fixtures/lectio-ef-2005-2050.txt already # uses, so this fixture can be read the same simple way -- split on '|', @@ -62,8 +73,9 @@ def main(): if first[k] != o[k]: print(f"WARNING: {date} masses disagree on {k}: {first[k]!r} vs {o[k]!r}", file=sys.stderr) comm_titles = [c["title"] for c in first["commemorations"]] + comm_ids = [c["id"] for c in first["commemorations"]] disp_titles = [d["title"] for d in first["displaced"]] - for t in [first["title"]] + comm_titles + disp_titles: + for t in [first["title"]] + comm_titles + comm_ids + disp_titles: if "|" in t or ";" in t: print(f"ERROR: {date}: field {t!r} contains a delimiter this fixture uses", file=sys.stderr) return 1 @@ -71,7 +83,10 @@ def main(): tempora = (first["tempora"] or "-").replace(" ", "_") comms = ";".join(comm_titles) or "-" disp = ";".join(disp_titles) or "-" - rows.append(f"{date}|{first['rank']}|{colors}|{first['title']}|{tempora}|{comms}|{disp}|{len(data)}") + ids = ";".join(comm_ids) or "-" + rows.append( + f"{date}|{first['rank']}|{colors}|{first['title']}|{tempora}|{comms}|{disp}|{len(data)}|{ids}" + ) if len(rows) != 730: print(f"ERROR: expected 730 days, got {len(rows)}", file=sys.stderr) -- cgit v1.3 From 5d5454208464892e96310efd99ec9db09171f982 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 16:45:58 +0200 Subject: fix(rite-ef): band has no table entry for a bare commemoration, ever MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix round 1 on the commemoration-identity/tie-break work: the "genuine same-band tie" M17 adjudicated as open was not a tie at all. RG 91's table enumerates only "dies liturgici" (real feasts) -- entry 24's own text is "Festa III classis, in calendario Ecclesiae universae inscripta" -- so a Celebration.t.status = Commemoration_only candidate (a saint reduced to a bare commemoration) has no row in the table to begin with. Precedence_ef.band used to read rank alone, so it silently lent such a candidate the same table entry as a genuine Feast of its own rank; the calendarium's own 22 September row confirms the distinction in its own notation ("S. Thomae de Villanova ... III classis. / Commemoratio Ss. Mauritii et Soc. Mm." -- Thomas carries a class number, Maurice carries none). Fixed at the source, not by adding a status tier to compare_precedence: band now checks status first, ahead of every rank-keyed branch, and returns unclassified for any Commemoration_only candidate. M17 deleted (not re-adjudicated) -- 22 September now resolves identically on both sides, with no divergence left to name. Blast radius measured independently (a temporary git worktree at the pre-fix commit): 4451 days change across the whole 1583-9999 domain, exactly 4 verified shapes -- 3576 x maurice-and-companions-martyrs -> thomas-of-villanova and 282 x eleutherius -> philip-neri (admitted set changes), 502 x appollonia/cyril-of-alexandria and 91 x dorothy/titus (order only, independently confirmed against the calendarium's own listing convention). Zero days change who is observed. Further swept the whole domain for a genuine "two different candidates on the identical real table entry" residual -- the shape RG 113 truly gives no instruction for -- and found it empty: of 109201 same-rank ties domain-wide, 83950 now resolve by band alone and the remaining 25251 are exclusively two Commemoration_only candidates tied at unclassified, never two real feasts. The residual admit still breaks alphabetically is real, but narrower than previously documented. The "66 days" figure is reconciled, not merely disputed: 599 is the tie population, 65 (whole-comparator: 67) is the real admitted-set decision count within it (independently reproduced against the pre-Task-B binary), 149 is order-only. Every one of the 65 real decisions traces to the same Commemoration_only/Feast root cause as Maurice/Thomas. Also: validate.ml's admission fixed-point check recovers a commemoration's real origin (by matching its slug against the day's own temporal office) instead of reconstructing every candidate as Sanctoral, since band -- unlike EF's own admit -- does read origin; precedence_ef.ml/.mli's motivating example and blast-radius claims corrected to no longer rest on the fixed Maurice/Thomas case; test_identity_rank_corroboration's own population count corrected now that 22 September (and 21 other Feast-status matches) became reachable; its rank-agreement pin documents exactly what it does and does not prove. Register (§4, §6.1, §6 checklist) and CLAUDE.md corrected in place, including the RG 113 first-sentence gap this exercise surfaced but did not close, recorded as a new open item. 275 -> 276 tests (with the exhaustive sweep), all green. --- CLAUDE.md | 120 ++++++++++++--------- data/ef/expected-divergences-missalemeum.sexp | 34 +++--- lib/kernel/validate.ml | 33 +++++- lib/kernel/validate.mli | 26 +++-- lib/rites/rite_ef/precedence_ef.ml | 86 ++++++++++++--- lib/rites/rite_ef/precedence_ef.mli | 44 ++++++-- test/test_oracle.ml | 146 ++++++++++++++++---------- test/test_precedence_ef.ml | 21 +++- test/test_rite_ef.ml | 44 +++++++- 9 files changed, 402 insertions(+), 152 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index 0f18537..4fb93f9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -114,38 +114,53 @@ against missalemeum; layer 5 pins ~30 dates. bootstrapped from lectio, so an error both inherited is invisible here. Proven: Holy Thursday was violet in both because both were wrong. - **Layer 4's commemoration-identity gap is CLOSED** (2026-08-12, Task B, branch - `ef-rg16a`): it used to compare presence/count only, never *which* commemoration - won — reversing `admit`'s dignity sort (the engine admitting the *worst* - commemoration, an outright RG 111 violation) left all eight differential and - oracle assertions green across 17 531 days. Layer 4 now also compares **identity** - — colitur's own resolved English name (`Celebration.t.names`, `en`) against - missalemeum's title text, for every day both streams admit the same count. The - mapping resolves **every SANCTORAL-origin commemoration** (colitur's own name - field, bootstrapped from lectio, verified to match missalemeum's titles - character-for-character); it **cannot resolve a TEMPORAL-origin one** (an - impeded feria/Ember/Rogation day — `Rite_ef.Temporal_ef` never sets a celebration - name) — that case is **never silently skipped**: it is a separate, counted, - allow-listed outcome (`Comm_identity_unresolved`, 19 of 227 non-empty-commemoration - days over 2026–2027), not a silent pass. Two genuine identity mismatches surfaced - and were adjudicated (register §4/§6.1, `data/ef/expected-divergences-missalemeum - .sexp` M16/M17): a known unimplemented office (the Seven Sorrows of Passion - Friday) and the RG 113 same-band tie-break residual (below), the latter left - explicitly OPEN, not defaulted to either side. Proof of teeth: reversing - `admit`'s *dignity*-based sort (the same historical defect shape) now turns - layer 4 red — `test_no_unexplained_differences` reports an unexplained - `commemoration-identity-mismatch` day (colitur admitting "St. Thecla" where both - the rubric and missalemeum require "St. Linus") — reverted after confirming. + `ef-rg16a`, two fix rounds): it used to compare presence/count only, never + *which* commemoration won — reversing `admit`'s dignity sort (the engine + admitting the *worst* commemoration, an outright RG 111 violation) left all + eight differential and oracle assertions green across 17 531 days. Layer 4 now + also compares **identity** — colitur's own resolved English name + (`Celebration.t.names`, `en`) against missalemeum's title text, for every day + both streams admit the same count. The mapping resolves **every + SANCTORAL-origin commemoration** (colitur's own name field, bootstrapped from + lectio, verified to match missalemeum's titles character-for-character); it + **cannot resolve a TEMPORAL-origin one** (an impeded feria/Ember/Rogation day — + `Rite_ef.Temporal_ef` never sets a celebration name) — that case is **never + silently skipped**: it is a separate, counted, allow-listed outcome + (`Comm_identity_unresolved`, 19 of 227 non-empty-commemoration days over + 2026–2027), not a silent pass. ONE genuine identity mismatch remains adjudicated + open (register §4/§6.1, `data/ef/expected-divergences-missalemeum.sexp` M16): a + known unimplemented office (the Seven Sorrows of Passion Friday). Proof of + teeth, reproduced twice: reversing `admit`'s *dignity*-based sort (the + historical defect shape) turns layer 4 red — an unexplained + `commemoration-identity-mismatch` day (colitur admitting "St. Thecla" where + both the rubric and missalemeum require "St. Linus"); separately, disabling + `band`'s own `Commemoration_only` guard (below) also turns it red, on the same + date this whole gap was originally found through — both reverted after + confirming. - **The `admit` same-rank tie-break is RG 113, not an uncited convention** (same - task): RG 113's own second sentence ("in admittendis et ordinandis aliis - commemorationibus, servetur ordo tabellae praecedentiae"), previously quoted only - in its first half, is the real rule — `admit` now orders/selects by + task, fix round 1): RG 113's own second sentence ("in admittendis et ordinandis + aliis commemorationibus, servetur ordo tabellae praecedentiae"), previously + quoted only in its first half, is the real rule — `admit` now orders/selects by `Precedence_ef.band` (RG 91's own table), not RG 8's coarse four-class rank. - Measured (not assumed): the fix's blast radius against the pre-change binary is - **zero admitted-commemoration changes across the entire 1583–9999 domain** — a - correctness-of-citation fix, not an answer-changing one, on this codebase's - current data. A narrower residual remains open where two candidates land on the - *identical* RG 91 table entry (RG 113 gives no further instruction there); - `admit` still breaks that alphabetically, still uncited, register §6.1. + **`band` itself had a fidelity bug this exercise surfaced**: RG 91's table + enumerates only "dies liturgici" (real feasts), so a `Celebration.t.status = + Commemoration_only` candidate has NO row in it at all — `band` used to read + `rank` alone and silently lent such a candidate the same table entry as a + genuine `Feast` of its own rank, manufacturing ties RG 113 never created (the + original "Maurice vs Thomas of Villanova, both entry 24" example was this bug, + not a real RG 91 tie). Fixed at the source: `band` now returns `unclassified` + for any `Commemoration_only` candidate, checked first. Measured, independently, + twice (`compare_precedence`'s own ordering-criterion change, then `band`'s + fidelity fix): the ORDERING-CRITERION change alone is zero-blast-radius + (byte-identical across the whole 1583–9999 domain — a correctness-of-citation + fix, not an answer-changing one); the `band`-FIDELITY fix has a real, large, + fully-classified effect, **4 451 days across the whole domain, exactly 4 + verified shapes, no surprises** (register §6.1). A genuine "two different + candidates on the identical REAL table entry" residual was searched for + exhaustively across the whole domain and found EMPTY — the tie-break `admit` + still breaks alphabetically is real but narrower than first thought: it is only + ever exercised between two `Commemoration_only` candidates, neither of which has + any RG 91 table position to compare in the first place. ## Current state (Plans 1–3 DONE — verify with `git log`) @@ -214,8 +229,10 @@ dune exec colitur -- day 2026 | head - **Plan 4 — OF rite module** (proves `RITE` generalizes) → the lectionary bootstrap and citations → full output/rendering → hardening and a first tag. - **Open Plan 4 with the two behaviour items below**, before OF: they are the - places the five layers, taken together, currently sleep through a real error. + **Both behaviour items below are now RESOLVED** (RG 16(a) and commemoration + identity, closed on branch `ef-rg16a`) — kept here as the record of what the + five layers, taken together, used to sleep through, and as the shape a + future gap of the same kind would need to be caught by. ### Carried into Plan 4 (read before starting) @@ -259,24 +276,27 @@ nowhere in git (`docs/` is gitignored). — a feast/mystery of one Divine Person excludes a commemoration of another of the SAME Person — entirely unimplemented, confirmed live on 7 real years). -2. **Commemoration identity is unasserted** outside ~3 test rows (see the layer - caveats above) — **the exact gap the RG 16(a) fix round exploited**: the - lectio differential compares season/slug/rank/colour only, never - commemorations, so of the 5 996 days RG 16(a) changes, the differential - sees at most the handful where the OBSERVED slug itself also changes (the - Purification's own 1 200, and only because it happens to change who is - observed) — RG 16(a) proper moved ZERO differential rows either round. - The missalemeum oracle window (2026–2027) contains zero live RG 16(a) - instances at all. Every finding in the RG 16(a) fix round, both the - original bug and the fix-round-1 review's own catch (Pope Sixtus II - wrongly admitted, both golden pins promoted from output rather than - independently derived), rested entirely on unit tests and two golden - pins — this is precisely how a defect of this shape gets through - undetected for as long as it did, and precisely how the review's own - correction had to be caught by the same narrow means. Related: - `compare_dignity` breaks same-rank ties - **alphabetically**, with no RG warrant, and over 2005–2050 the admission cut - falls between two same-rank candidates on **66 days**. +2. **Commemoration identity — RESOLVED (Task B, branch `ef-rg16a`, 2026-08-12; + ONE FIX ROUND of review after the first pass — see register §6.1 for the + full, corrected account).** Was unasserted outside ~3 test rows — **the + exact gap the RG 16(a) fix round above had exploited**: the lectio + differential (layer 3) compares season/slug/rank/colour only, never + commemorations, BY DESIGN (lectio has no RG 111 admission logic of its + own) and still does not — that part of this item is unchanged and remains + the reason layer 4, not layer 3, had to close this gap. Layer 4 + (missalemeum, 2026–2027) now compares commemoration IDENTITY, not only + presence/count (see the "know what each layer cannot see" section above + for the mapping and its limits). While building it, found and fixed a + SECOND, independent bug the exercise surfaced: `Precedence_ef.band` gave a + `Commemoration_only` candidate the same RG 91 table entry as a genuine + `Feast` of its own rank (RG 91's table has no row for a bare commemoration + at all) — **4 451 days wrong across the whole 1583–9999 domain**, exactly + 4 verified shapes, fixed at the source. The `admit` same-rank tie-break + itself is RG 113 (previously uncited), not the alphabetical convention + this item used to describe — reconciled against the Plan-3-era "66 days" + figure: 599 is the tie POPULATION, 65 (or 67) the real ADMITTED-SET + decisions within it, 149 order-only — all now independently reproduced + (register §6.1), not merely asserted. **Structural items, cheapest to fix before OF exists:** diff --git a/data/ef/expected-divergences-missalemeum.sexp b/data/ef/expected-divergences-missalemeum.sexp index 2488cb8..53e93d4 100644 --- a/data/ef/expected-divergences-missalemeum.sexp +++ b/data/ef/expected-divergences-missalemeum.sexp @@ -16,17 +16,22 @@ ; did not build. Those are honestly verdicted [missalemeum] -- colitur is ; short a feature or a row, not correct -- and each is cross-referenced ; into docs/research/rules-register.md §6 as an open item, not silently -; absorbed as if colitur were right. THREE entries (M11, M13, and, since -; Task B/branch ef-rg16a, M17) are [verdict open] -- corrected, final fix -; wave, item 7: this note previously said "one entry (M13)", missing M11 -; (whose own verdict changed from [colitur] to [open] in fix round 1, see -; M11's own entry below); M17 (the RG 113 same-band tie-break residual) is -; a genuinely new open item from the commemoration-identity task, not a -; stale-comment fix. ONE entry (M15) carries a fourth verdict, -; [unresolvable] -- a LIMIT of this comparator (no English name exists on -; colitur's side for a temporal-origin commemoration to compare), not a -; rubric dispute or a data gap either engine is wrong about; see M15's own -; note. All are adjudicated as UNRESOLVED/UNRESOLVABLE after real +; absorbed as if colitur were right. TWO entries (M11 and M13) are +; [verdict open] -- corrected, final fix wave, item 7: this note previously +; said "one entry (M13)", missing M11 (whose own verdict changed from +; [colitur] to [open] in fix round 1, see M11's own entry below). Task B +; (branch ef-rg16a) briefly added a THIRD, M17, adjudicated [open] as a +; "genuine same-band tie RG 113 does not resolve" -- CORRECTED, Task B fix +; round 1: M17 was wrong. The tie was manufactured by Precedence_ef.band +; lending a Commemoration_only candidate the same table entry as a genuine +; Feast of its own rank (RG 91's table has no row for a bare commemoration +; at all); fixed in band itself, and the divergence disappears entirely -- +; M17 was REMOVED, not re-adjudicated to a different verdict. ONE entry +; (M15) carries a fourth verdict, [unresolvable] -- a LIMIT of this +; comparator (no English name exists on colitur's side for a temporal- +; origin commemoration to compare), not a rubric dispute or a data gap +; either engine is wrong about; see M15's own note. All remaining OPEN +; entries are adjudicated as UNRESOLVED/UNRESOLVABLE after real ; primary-source effort, not defaulted past -- see each entry's own note ; and the task report for the full search. ; @@ -117,10 +122,5 @@ ((id M16) (citation "1962 calendarium's March table (same primary text as M13's own citation): \"Feria VI post dominicam I Passionis: Commemoratio septem Dolorum B. Mariae Virg.\" -- a fixed commemoration of Our Lady's Seven Sorrows for the Friday of Passion Week, every year, confirmed real") (verdict missalemeum) - (note "27 March 2026 (Friday of Passion Week): colitur admits \"St. John Damascene\" (a real Class3 universal feast that genuinely falls that day, data/ef/sanctoral.sexp's own john-damascene entry, 27 March); missalemeum shows \"For Our Lady of the Seven Sorrows\" instead. The SAME standing gap M13 already names: the Seven-Sorrows-of-Passion-Friday commemoration is confirmed real in the primary text but not implemented anywhere in temporal_ef.ml, so colitur has no candidate for it and falls back to whichever ordinary Class3 saint actually wins that Friday. Verdict missalemeum: colitur is missing a real, primary-cited office, not differently opinioned. Register §6 open item (the same one M13's own note already tracks). Only 2026 shows here as an IDENTITY mismatch -- 2027's Friday of Passion Week IS 19 March, M13's own date, where identity comparison cannot even be reached (M13's own rank/colour mismatch already excludes that day from count-matched identity comparison, folded into M13's own widened subset above).") - (expected_rows 1)) - ((id M17) - (citation "RG 113 (docs/research/rules-register.md §4's own RG 113 entry, and §6.1's \"RG 113 same-band residual\" record, Task B/ef-rg16a): \"in admittendis et ordinandis aliis commemorationibus, servetur ordo tabellae praecedentiae\" reaches only the TABLE order (Precedence_ef.band); it supplies no further instruction for two candidates landing on the identical band value") - (verdict open) - (note "22 September 2027 (September Ember Wednesday): colitur admits \"St. Maurice and Companions, Martyrs\" (Commemoration_only, Class3); missalemeum shows \"St. Thomas of Villanova\" (Feast, Class3) instead -- both land on Precedence_ef.band entry 24 (III-class universal feasts), a genuine tie RG 113 does not resolve. colitur's own residual tie-break (alphabetical by slug, register §6.1's own uncited-convention record) picks \"maurice...\" over \"thomas...\" purely because 'm' < 't' in ASCII -- no rubrical warrant either way. NOT adjudicated colitur or missalemeum: verdict OPEN, the same explicit permission the brief gives M11/M13 (\"say so as an open item rather than absorbing it\"). Only 2027 shows this exact collision in this window -- 2026's 22 September is an ordinary (non-Ember) Tuesday, where Thomas of Villanova simply wins the day outright on both sides (colitur: observed; missalemeum: title) with Maurice commemorated alongside him identically on both, no tie to observe that year.") + (note "27 March 2026 (Friday of Passion Week): colitur admits \"St. John Damascene\" (a real Class3 universal feast that genuinely falls that day, data/ef/sanctoral.sexp's own john-damascene entry, 27 March); missalemeum shows \"For Our Lady of the Seven Sorrows\" instead. The SAME standing gap M13 already names: the Seven-Sorrows-of-Passion-Friday commemoration is confirmed real in the primary text but not implemented anywhere in temporal_ef.ml, so colitur has no candidate for it and falls back to whichever ordinary Class3 saint actually wins that Friday. Verdict missalemeum: colitur is missing a real, primary-cited office, not differently opinioned. Register §6 open item (the same one M13's own note already tracks). Only 2026 shows here as an IDENTITY mismatch -- 2027's Friday of Passion Week IS 19 March, M13's own date, where identity comparison cannot even be reached (M13's own rank/colour mismatch already excludes that day from count-matched identity comparison, folded into M13's own widened subset above). NOTE for whoever builds the office (fix round 1, coordinator finding 7): 27 March 2026 is a III-class day, where RG 111(d) admits TWO commemorations -- yet missalemeum admits only the Seven Sorrows and DISPLACES John Damascene entirely, not merely drops him to second place. A naive implementation (one more ordinary III-class commemoration competing for the day's two slots) would give colitur two commemorations where missalemeum shows one; whatever privilege the Seven Sorrows carries must itself explain the exclusion, not just win admission.") (expected_rows 1)) diff --git a/lib/kernel/validate.ml b/lib/kernel/validate.ml index 433dc99..24adcd8 100644 --- a/lib/kernel/validate.ml +++ b/lib/kernel/validate.ml @@ -330,12 +330,41 @@ let run (rite : ('s, 'r) Rite.t) (layer : 'r Layer.t) ~year = season = d.Liturgical_day.temporal.Temporal.season; weekday = d.Liturgical_day.temporal.Temporal.weekday } in + (* CORRECTED (Task B fix round 1, coordinator finding 5): [origin] + used to be reconstructed as [Sanctoral] UNCONDITIONALLY, which + was harmless while nothing here called [band] on the result + (the comment this replaces was correct about [PE.admit] itself: + it never reads [origin]) -- but this function ALSO now calls + [rite.rules.Precedence.band day_ctx cand] on every one of these + reconstructed candidates (the line just below), and [band] DOES + read [origin] (its own [is_temporal] test) to choose between its + temporal- and sanctoral-keyed branches. A genuinely + TEMPORAL-origin commemoration (a privileged Advent/Lent/ + Passiontide feria, an Ember day, an impeded Sunday) mislabelled + [Sanctoral] would score the WRONG band entry (e.g. a Lent feria + scoring entry 23, "III-class feasts in particular calendars", + instead of its real entry 22) -- inert today only because + nothing currently asserts on the SCORE [band] returns here, only + on whether re-offering [admit] the same values round-trips + (which happens not to depend on getting [origin] right for any + case this codebase's data reaches -- unverified in general). + [Liturgical_day.t] itself still does not retain a + commemoration's original origin, so it is recovered the only + way available: a commemoration whose SLUG matches the day's own + temporal office is temporal-origin; every other commemoration + is sanctoral-origin. This is exact whenever slugs cannot + collide across the two streams (Task 12's own "observed" check + already assumes this for a different purpose), which is the + same assumption the rest of this codebase already leans on. *) + let temporal_office_slug = d.Liturgical_day.temporal.Temporal.office.Celebration.slug in let as_candidates comms = List.map (fun (c, p) -> - let cand : 'r Precedence.candidate = - { Precedence.cel = c; origin = Precedence.Sanctoral } + let origin = + if Slug.equal c.Celebration.slug temporal_office_slug then Precedence.Temporal + else Precedence.Sanctoral in + let cand : 'r Precedence.candidate = { Precedence.cel = c; origin } in (cand, p, rite.Rite.rules.Precedence.band day_ctx cand)) comms in diff --git a/lib/kernel/validate.mli b/lib/kernel/validate.mli index 5e55fc5..b46ca30 100644 --- a/lib/kernel/validate.mli +++ b/lib/kernel/validate.mli @@ -59,14 +59,24 @@ val failure_to_string : failure -> string fixed point. - ["admission"]: the rite's own [rules.admit] is a fixed point on what it already admitted -- re-offering a day's [commemorations] back to - [admit] (reconstructed with {!Precedence.Sanctoral} origin; the real EF - admit reads only rank and slug, never origin, so this reconstruction is - exact for it) must return exactly that same set. A cap-enforcing - selector that is not idempotent on its own output has, by definition, - admitted something its own rule would not admit if asked again -- the - rite-agnostic form of "the admission limit was not exceeded" available - without embedding a rite's specific numeric caps (RG 111's, for EF) - into kernel code. + [admit] (with [observed]'s own origin reconstructed as + {!Precedence.Sanctoral}; the real EF admit reads only rank and slug + from [observed], never origin, so this reconstruction is exact for + it) must return exactly that same set. Each offered commemoration's + own origin -- CORRECTED, Task B fix round 1 -- is recovered by + comparing its slug against the day's own temporal office, not + reconstructed as [Sanctoral] uniformly: {!Precedence.rules.admit} + (since Task B) is handed each candidate's own {!Precedence.rules.band} + value, computed here exactly as {!Precedence.resolve} computes it, and + [band] DOES read a candidate's origin (temporal- vs sanctoral-keyed + branches) even though EF's own [admit] itself still does not -- a + mislabelled origin would silently score the wrong table entry for a + genuinely temporal-origin commemoration (e.g. a Lent feria) before + this fix. A cap-enforcing selector that is not idempotent on its own + output has, by definition, admitted something its own rule would not + admit if asked again -- the rite-agnostic form of "the admission limit + was not exceeded" available without embedding a rite's specific + numeric caps (RG 111's, for EF) into kernel code. Total over the whole 1583..9999 domain, including [year] = 9999: the liturgical year opening there continues into out-of-domain civil year diff --git a/lib/rites/rite_ef/precedence_ef.ml b/lib/rites/rite_ef/precedence_ef.ml index 861bb1a..8452e69 100644 --- a/lib/rites/rite_ef/precedence_ef.ml +++ b/lib/rites/rite_ef/precedence_ef.ml @@ -110,6 +110,7 @@ let band (ctx : Vocab_ef.season Precedence.context) (c : Vocab_ef.rank Precedenc int = let cel = c.Precedence.cel in let rank = cel.Celebration.rank in + let status = cel.Celebration.status in let subject = cel.Celebration.subject in let layer = cel.Celebration.layer in let slug = Slug.to_string cel.Celebration.slug in @@ -129,8 +130,41 @@ let band (ctx : Vocab_ef.season Precedence.context) (c : Vocab_ef.rank Precedenc binding, not a second literal, so the two can never drift apart. *) let entry_15_band = 15 in let open Vocab_ef in - (* 1: Nativity, Easter Sunday, Pentecost Sunday (I class w/ octave). *) - if is_temporal && rank = Class1 && ((m = 12 && d = 25) || off = 0 || off = 49) then 1 + (* CORRECTED (Task B fix round 1, ef-rg16a): a [Commemoration_only] + celebration has NO row in RG 91's table at all, checked FIRST, ahead of + every rank-keyed branch below -- RG 91's own text enumerates only "dies + liturgici" (entry 24's own wording, e.g., "Festa III classis, in + calendario Ecclesiae universae inscripta" -- FEASTS, inscribed in the + calendar), and the calendarium itself marks the difference in its own + notation: 22 September's row reads "S. Thomae de Villanova Ep. et + Conf., III classis. / Commemoratio Ss. Mauritii et Soc. Mm." -- Thomas + gets a class number (a "festum"); Maurice gets "Commemoratio" and NO + class number at all, because he never had a row in the table for that + occasion to begin with. Before this fix, [band] read [rank] alone, so + a [Commemoration_only] entry silently borrowed the SAME entry number + as a genuine [Feast] of its own rank (a Class3 Commemoration_only + entry banded to 24, indistinguishable from a real Class3 universal + feast) -- manufacturing a "tie" at {!compare_precedence}/RG 113's own + admission ordering that the primary text never creates: RG 113 does + not run out of instruction between two same-rank commemorations; + [band] ran out of fidelity, handing out a table row that does not + exist for one of them. [unclassified] (worse than every real entry) is + the same value already used for a candidate this table's 28 branches + otherwise fail to describe, which is exactly the right answer here + too: "not in this table" for a different reason, same table-position + consequence. Confirmed by the oracle: missalemeum's own commemoration + id embeds a rank that AGREES with the demoted status this represents + (e.g. sancti:09-22o:4:r for Maurice, rank 4, against Thomas's own + sancti:09-22:3:w, rank 3, on the day Thomas is observed -- test_oracle + .ml's own [test_identity_rank_corroboration]). Restricted to [status]; + [rank] itself is untouched, since {!Celebration.status}'s own doc + comment is explicit that a demoted feast "retains a rank" for RG 111's + admission-COUNT purposes (I/II/III/IV class thresholds), which this + guard does not touch -- only ORDERING among candidates already offered + to {!admit} changes. *) + if status = Celebration.Commemoration_only then unclassified + (* 1: Nativity, Easter Sunday, Pentecost Sunday (I class w/ octave). *) + else if is_temporal && rank = Class1 && ((m = 12 && d = 25) || off = 0 || off = 49) then 1 (* 2: Sacred Triduum (Thu-Sat of Holy Week). *) else if is_temporal && rank = Class1 && off >= -3 && off <= -1 then 2 (* 3: Epiphany, Ascension, Holy Trinity, Corpus Christi, Sacred Heart, @@ -769,16 +803,44 @@ let disposition ~(winner : Vocab_ef.rank Precedence.candidate) This REPLACES a previous [compare_dignity], which sorted by RG 8's coarse four-class [rank] ("dignity") and broke same-rank ties alphabetically by - slug -- an engineering convention with no rubrical warrant, silently - deciding 66 days over 2005-2050 (e.g. 22 Sept 2027, an Ember Wednesday: - the alphabetical rule admitted "maurice-and-companions-martyrs" over - "thomas-of-villanova", both Class3/{!band} entry 24 -- missalemeum shows - Thomas). {!band} needs a [context] this function itself does not have - (date/season/weekday) -- unlike [dignity], which read [rank] alone -- - so {!Precedence.resolve} now computes each candidate's own [band] value - once, generically, and hands it to [admit] as the trailing [int] on each - input triple (see {!Precedence.rules.admit}'s own doc). [comms] below is - [(candidate * privilege * int) list], not the pair it used to be. *) + slug -- an engineering convention with no rubrical warrant. Measured, + fix round 1 (2005-2050, a temporary pre-fix [git worktree]): a + same-[rank] tie existed on 599 days, most never reaching a real + decision; reversing the slug tie-break alone changed the ADMITTED SET on + 65 of them and the printed ORDER of an already-admitted pair on a + further 149 (docs/research/rules-register.md §6.1's full account, + correcting this comment's own earlier, unreproduced "66 days" claim). + + CORRECTED, fix round 1 (coordinator finding 1): checking every one of + those 65+149 real decisions against data/ef/sanctoral.sexp found the + SAME underlying shape in all of them, no exceptions -- one candidate is + always [Cel.Commemoration_only] (e.g. "maurice-and-companions-martyrs", + 22 September) and the other always a genuine [Cel.Feast] or a temporal + office of the SAME [rank] (e.g. "thomas-of-villanova", same day; or a + Lent feria, {!band} entry 22, against "paul", 22 February). That is + {!band}'s OWN fidelity bug, fixed separately at its source (see [band]'s + own top-of-branch guard, RG 91's table has no row for a bare + commemoration at all) -- NOT a case RG 113's table-order alone resolves, + since a [Commemoration_only] candidate never had a real table entry to + compare in the first place. With that fixed, none of these 599 days' + real decisions any longer depend on THIS function's own slug fallback: + {!band} alone (a real entry vs {!unclassified}) already decides every + one. What remains genuinely open -- two DIFFERENT candidates landing on + the IDENTICAL real table entry, e.g. two different Class3 universal + feasts both at entry 24 -- was checked and found EMPTY across + 2005-2050 (register §6.1): RG 113's own table-order, once {!band} is + accurate, already decides every real case this codebase's current data + produces; the slug fallback below is exercised only between two + [Commemoration_only] candidates tied at {!unclassified} (138 of the 599, + all order/count-invisible -- RG 91 has no table position for either of + them to compare, so there is nothing more specific RG 113 could supply + here either). {!band} needs a [context] this function itself does not + have (date/season/weekday) -- unlike [dignity], which read [rank] alone + -- so {!Precedence.resolve} now computes each candidate's own [band] + value once, generically, and hands it to [admit] as the trailing [int] + on each input triple (see {!Precedence.rules.admit}'s own doc). [comms] + below is [(candidate * privilege * int) list], not the pair it used to + be. *) let compare_precedence (a, _, ba) (b, _, bb) = if ba <> bb then Int.compare (ba : int) bb else Slug.compare a.Precedence.cel.Celebration.slug b.Precedence.cel.Celebration.slug diff --git a/lib/rites/rite_ef/precedence_ef.mli b/lib/rites/rite_ef/precedence_ef.mli index 49195f9..b283a17 100644 --- a/lib/rites/rite_ef/precedence_ef.mli +++ b/lib/rites/rite_ef/precedence_ef.mli @@ -68,10 +68,21 @@ val unclassified : int text states an exception: entry 8 (All Souls) reads "yields to an occurring Sunday", so on a Sunday this returns a value that loses to entry 15 rather than the literal integer 8 (see the comment on - entry 8 in precedence_ef.ml for the exact value and why). Total over - every candidate {!Precedence.resolve} or {!Calendar} can construct, - including shapes the 1962 table itself does not describe (see - {!unclassified}). *) + entry 8 in precedence_ef.ml for the exact value and why). ALSO + {!unclassified} for any [Cel.Commemoration_only] candidate, checked + first, ahead of every rank-keyed branch -- CORRECTED, Task B fix round + 1 (coordinator finding 1): RG 91's own table enumerates only "dies + liturgici" (entry 24's own text, "Festa III classis..." -- FEASTS), so + a celebration reduced to a bare commemoration was never a row in the + table to begin with, confirmed by the calendarium's own notation (a + genuine feast carries a class number on its occurrence line; a bare + "Commemoratio" carries none). Before this fix, a [Commemoration_only] + candidate silently borrowed the SAME entry number as a genuine [Feast] + of its own [rank] -- manufacturing ties {!Precedence.compare_by} and + {!compare_precedence} both then had to break some other way, that RG 91 + itself never created. Total over every candidate {!Precedence.resolve} + or {!Calendar} can construct, including shapes the 1962 table itself + does not describe (see {!unclassified}). *) val band : Vocab_ef.season Precedence.context -> Vocab_ef.rank Precedence.candidate -> int (** RG 33's marker: every Sunday slug this rite's temporal cycle produces @@ -195,8 +206,16 @@ val september_ember_prefix : string CORRECTED, Task B (branch ef-rg16a): this used to sort by [Vocab_ef.rank] (RG 8's coarse four-class "dignity") and break same-rank ties alphabetically by slug -- an engineering convention with no - rubrical warrant, cited nowhere, silently deciding 66 days over - 2005-2050. RG 113's own second sentence, previously uncited + rubrical warrant, cited nowhere. Measured, fix round 1 (2005-2050, + reproducible via a temporary [git worktree] at the pre-fix commit): + a same-[rank] tie existed in the candidate pool offered to [admit] on + 599 days, most never reaching a real decision (RG 111's own admission + count often has room for both, e.g. a III-class day admits two); of + those, reversing the slug tie-break ALONE actually changed the ADMITTED + SET on 65 days and only the printed ORDER of an already-admitted pair + on a further 149 (docs/research/rules-register.md §6.1's own full + account, superseding this comment's earlier, unreproduced "66 days" + claim). RG 113's own second sentence, previously uncited (docs/research/rules-register.md §4's RG 113 entry), is the real rule: *"in admittendis et ordinandis aliis commemorationibus, servetur ordo tabellae praecedentiae"* -- admitting and ordering commemorations both @@ -205,8 +224,17 @@ val september_ember_prefix : string receive on its own, so {!Precedence.resolve} computes it once, generically, and hands each candidate its own value as the trailing [int] on [comms]'s triples (see {!Precedence.rules.admit}). Ties break - on slug ONLY within one identical [band] value (RG 113 gives no further - instruction there; still an uncited engineering convention, register §6 + on slug ONLY within one identical [band] value -- CORRECTED, fix round + 1 (coordinator finding 1): [band] itself used to hand a + [Cel.Commemoration_only] candidate the same table entry as a genuine + [Cel.Feast] of its own rank (RG 91's table has no row for a bare + commemoration at all), manufacturing most of the "identical [band] + value" ties this comment used to describe as RG 113's own residual. + Fixed in [band] itself; checked afterward (2005-2050 and the full + 1583-9999 domain, register §6.1) and found EMPTY of any remaining + "two different real table entries tied" case -- the slug fallback below + is exercised only between two [Commemoration_only] candidates both at + {!unclassified}, still an uncited engineering convention (register §6 "RG 113 tie-break"), matching {!Precedence.compare_by}'s own fallback, so the result never depends on the order [comms] arrives in. diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 07a5634..2624664 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -107,18 +107,25 @@ entries; RG 110's inseparable-Peter/Paul commemoration is unimplemented code, a real feature this task did not build) -- honestly verdicted [missalemeum] (colitur is short a feature or a row, not right), never - silently absorbed as if colitur were correct. THREE entries (M11, M13 - and, since Task B/ef-rg16a, M17) are [verdict open] -- CORRECTED, final - fix wave, item 7: this comment previously said "one entry (M13)", - missing M11, whose own verdict was changed from [colitur] to [open] in - fix round 1 (see M11's own entry below for why) but this summary was - never updated to match; M17 (the RG 113 same-band tie-break residual, - register §6.1) is a genuinely NEW open item, not a stale-comment fix. - ONE entry (M15) carries its own fourth verdict, [unresolvable] -- not a - rubric dispute or a data gap either engine is wrong about, but a LIMIT - of this comparator itself (see M15's own entry). All are adjudicated as - unresolved/unresolvable, not resolved either way -- the brief's own - explicit permission ("say so as an open item") used for real, not + silently absorbed as if colitur were correct. TWO entries (M11 and M13) + are [verdict open] -- CORRECTED, final fix wave, item 7: this comment + previously said "one entry (M13)", missing M11, whose own verdict was + changed from [colitur] to [open] in fix round 1 (see M11's own entry + below for why) but this summary was never updated to match. Task B + (branch ef-rg16a) briefly added a THIRD, M17 (the same-band tie-break + between Maurice and Thomas of Villanova, 22 September) -- CORRECTED, + fix round 1 of that same task: M17 was itself wrong. The "tie" was + manufactured by {!Precedence_ef.band} lending a [Commemoration_only] + candidate the same table entry as a genuine [Feast] of its own rank + (RG 91's table has no row for a bare commemoration at all -- fixed in + [band] itself, not here); once fixed, 22 September resolves cleanly on + both sides and M17 was deleted, not merely re-adjudicated. ONE entry + (M15) carries its own fourth verdict, [unresolvable] -- not a rubric + dispute or a data gap either engine is wrong about, but a LIMIT of this + comparator itself (see M15's own entry). All remaining OPEN entries are + adjudicated as unresolved/unresolvable, not resolved either way -- the + brief's own explicit permission ("say so as an open item") used for real, + not defaulted past. See the task report for every entry's full reasoning and primary-source citation. *) @@ -655,30 +662,43 @@ let m15_dates = already tracks). Only 2026 shows here -- 2027's Friday of Passion Week IS 19 March, M13's own date, where the identity axis cannot even be reached (M13's own rank/colour mismatch already excludes that day from - count-matched identity comparison). *) + count-matched identity comparison). + + NOTE for whoever builds the office (fix round 1, coordinator finding 7): + 27 March 2026 is a III-class day, where RG 111(d) admits TWO + commemorations, not one -- yet missalemeum admits only the Seven Sorrows + and DISPLACES John Damascene entirely (its own "displaced" list carries + his title that day), not merely drops him to second place. Implementing + the Seven Sorrows candidate naively (as one more ordinary III-class + commemoration competing for the day's two slots) will not reproduce + this: John Damascene would still win one of the two admitted slots by + dignity/band, giving colitur TWO commemorations where missalemeum shows + one. Whatever privilege or precedence the Seven Sorrows commemoration + carries must itself explain the exclusion, not just the admission -- + register §6's own open item for this office should carry this caveat + forward. *) let m16_dates = [ "2026-03-27" ] -(* M17 -- Task B: the SAME-band residual tie-break (docs/research/rules- - register.md §4's own "RG 113" entry, and §6.1's "RG 113 same-band - residual" record) made visible for the first time by identity - comparison. 22 September 2027 (September Ember Wednesday): colitur - admits "St. Maurice and Companions, Martyrs" (Commemoration_only, - Class3); missalemeum shows "St. Thomas of Villanova" (Feast, Class3) - instead -- both land on {!Precedence_ef.band} entry 24 (III-class - universal feasts), a genuine tie RG 113 gives no further instruction for - (its own text only reaches "servetur ordo tabellae praecedentiae", the - TABLE order; nothing in the primary text breaks a tie WITHIN one table - entry). colitur's own residual tie-break (alphabetical by slug, §6.1's - own uncited-convention record) picks "maurice..." over "thomas..." purely - because 'm' < 't' -- no rubrical warrant either way, so this is NOT - adjudicated colitur or missalemeum: verdict OPEN, the same explicit - permission the brief gives M11/M13 ("say so as an open item rather than - absorbing it"), register §6.1. Only 2027 falls in this window with this - EXACT collision -- 2026's 22 September is an ordinary (non-Ember) - Tuesday, so Thomas of Villanova simply wins the day outright on both - sides (colitur: observed; missalemeum: title) with Maurice commemorated - alongside him identically on both -- no tie to observe that year. *) -let m17_dates = [ "2027-09-22" ] +(* M17 was DELETED, fix round 1 (Task B): the "genuine tie" it adjudicated + as [open] was itself wrong. 22 September (any year the September Ember + Wednesday falls on the 22nd -- 2027 in this window): colitur used to + admit "St. Maurice and Companions, Martyrs" (Commemoration_only, Class3) + where missalemeum shows "St. Thomas of Villanova" (Feast, Class3) -- + NOT because RG 113 runs out of instruction between two same-rank + candidates (the framing this entry used to carry), but because + {!Precedence_ef.band} used to lend a [Commemoration_only] candidate the + SAME table entry (24) as a genuine [Feast] of its own rank, manufacturing + a tie the primary text never creates: RG 91's own table enumerates only + "dies liturgici" (entry 24: "Festa III classis..." -- FEASTS), and the + calendarium's own 22 September row confirms it in its own notation -- + "S. Thomae de Villanova Ep. et Conf., III classis. / Commemoratio Ss. + Mauritii et Soc. Mm." -- Thomas carries a class number, Maurice carries + none. Fixed at the source ([band] itself now returns [Precedence_ef + .unclassified] for any [Commemoration_only] candidate, docs/research/ + rules-register.md §6.1's own corrected account) rather than here: 22 + September now resolves identically on both sides with no allow-list + entry needed at all -- removed, not re-adjudicated to a different + verdict, since there is no longer a divergence to name. *) let layer_m_reason (c : colitur_row) (o : oracle_row) diffs = if diffs = [] then None @@ -704,7 +724,6 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs = Some "M13" else if List.mem c.c_date m15_dates && diffs = [ Comm_identity_unresolved ] then Some "M15" else if List.mem c.c_date m16_dates && diffs = [ Comm_identity_mismatch ] then Some "M16" - else if List.mem c.c_date m17_dates && diffs = [ Comm_identity_mismatch ] then Some "M17" else None (* ---------------------------------------------------------------------- *) @@ -862,23 +881,36 @@ let test_layer_m_counts_match_citations () = combination would break it) that stays honest about what remains unverified. + WHAT THIS DOES NOT PIN (coordinator finding 8, fix round 1, honestly + named rather than left implicit): the [oracle_rank = colitur_rank] + branch accepts ANY genuine agreement, including one this check cannot + independently verify is the CORRECT rank -- a regression that silently + flipped some entry's [rank] from [Class3] to [Class4] would land in the + agreement branch and pass cleanly if missalemeum's own id happened to + read 4 for that entry too (data drift on one side coinciding with data + drift on the other is not ruled out by this check, only coincidence + independent of any real cause is). This test pins "no third pattern + appears", not "every individual rank is correct" -- a narrower, still + genuinely useful claim (see the [> 50] population guard below, which + confirms the pinned shape is actually exercised at scale, not vacuously + true over an empty or trivial set), and this comment says so rather than + letting the assertion's own name imply more than it checks. + [Feast]-status candidates get the ORIGINAL, unrestricted check (any - disagreement at all is unexpected) -- but this window's own data never - actually offers a [Feast]-status LOSING candidate whose identity is - independently clean (checked: 0 in the 2026-2027 fixture -- a [Feast] - candidate here either wins its own day outright, in which case it is - never a commemoration at all, or the one day where it does lose, - 22 September 2027/Thomas of Villanova, is ITSELF the M17 tie-break - mismatch and so is excluded by the [identity_diff = None] guard before - ever reaching this check). Kept anyway, not deleted: a real disagreement - would still be reported the moment one becomes reachable (a wider oracle - window, or a data change), and this project's own vacuity catalogue - flags "an assertion true by construction" as a defect shape to avoid, - not "an assertion whose population happens to be empty in the one - fixture available" -- the CHECK still does real work when its input is - non-empty; it is the DATA, not the code, that is currently silent here. *) + disagreement at all is unexpected). CORRECTED (fix round 1, coordinator + finding 1): this comment previously claimed this branch was unreachable + in the 2026-2027 window (checked: 0) because its one candidate, Thomas + of Villanova on 22 September, was M17's own mismatch -- WRONG, once + traced further: M17 itself was wrong (see {!Precedence_ef.band}'s own + fidelity fix, register §6.1), and fixing it made 22 September resolve + cleanly on both sides, reachable here after all. Measured, not assumed: + 22 Feast-status commemorations are now examined by this branch (not + only Thomas of Villanova -- every OTHER genuinely clean Feast-status + match in the window reaches it too, which the earlier version of this + comment did not check for before asserting "0"). All 22 agree. *) let test_identity_rank_corroboration () = let oracle, colitur = compare_streams () in + let feast_checked = ref 0 in let feast_mismatches = ref [] in let commemoration_only_checked = ref 0 in let commemoration_only_surprises = ref [] in @@ -896,6 +928,7 @@ let test_identity_rank_corroboration () = | Some oracle_rank -> ( match List.find_opt (fun (_, _, _, n) -> n = Some title) c.c_commemorations with | Some (slug, colitur_rank, Cel.Feast, _) -> + incr feast_checked; if colitur_rank <> oracle_rank then feast_mismatches := Printf.sprintf "%s: %s oracle-id-rank=%d colitur-rank=%d" c.c_date slug @@ -921,14 +954,21 @@ let test_identity_rank_corroboration () = o.o_commemorations o.o_commemoration_ids) oracle colitur; Alcotest.(check (list string)) - "Feast-status matches: oracle id-rank agrees with colitur's own rank (none reachable in this window, \ - see this test's own comment; the check still runs)" - [] (List.rev !feast_mismatches); + "Feast-status matches: oracle id-rank agrees with colitur's own rank" [] (List.rev !feast_mismatches); Alcotest.(check (list string)) "Commemoration_only-status matches: every one fits the KNOWN oracle=4/colitur=3 convention gap -- any \ other combination would be a genuine, new surprise" [] (List.rev !commemoration_only_surprises); - (* Vacuity guard for the branch that IS populated in this window. *) + (* Vacuity guard: BOTH branches must actually run now. CORRECTED (fix + round 1, coordinator finding 1): the [Feast] branch used to be + unreachable in this window (checked: 0) because its one candidate, + Thomas of Villanova on 22 September, was M17's own mismatch (excluded + by the [identity_diff = None] guard above). Fixing {!Precedence_ef + .band}'s Commemoration_only fidelity (register §6.1) made that day + resolve cleanly, so it is reachable here too -- this guard now expects + at least 1, not merely documents the branch as dormant (measured: 22 + Feast-status commemorations now examined, up from 0). *) + Alcotest.(check bool) "the Feast-status population actually examined is non-trivial" true (!feast_checked > 0); Alcotest.(check bool) "the Commemoration_only population actually examined is non-trivial" true (!commemoration_only_checked > 50) diff --git a/test/test_precedence_ef.ml b/test/test_precedence_ef.ml index ca623d2..2935e40 100644 --- a/test/test_precedence_ef.ml +++ b/test/test_precedence_ef.ml @@ -267,7 +267,26 @@ let cases = (* RG 91's own vigil list (§4, "Vigils / octaves / Rogations / Sunday classes") stops at III class -- there is no IV-class vigil for entry 28's ferial catch-all to absorb. *) ( "unclassified: IV-class candidate marked as a vigil", mk 2026 6 20, - cand ~rank:V.Class4 "ef-second-mystery-vigil", PE.unclassified ) + cand ~rank:V.Class4 "ef-second-mystery-vigil", PE.unclassified ); + (* Task B fix round 1 (coordinator finding 1): RG 91's table enumerates + only "dies liturgici" -- a [Cel.Commemoration_only] candidate is + never a row in the table at all, regardless of what rank it would + otherwise band to. [Class1]/universal-layer is deliberate: absent + the status guard this would band to entry 11, the FIRST, highest- + priority real entry any sanctoral candidate can reach, so this + proves the guard is checked BEFORE and overrides every rank-keyed + branch, not only the low-priority ones an accidental placement + might happen to catch. Real-world witness: "maurice-and-companions- + martyrs" (data/ef/sanctoral.sexp, 22 September, Class3, + Commemoration_only) used to band to entry 24 alongside the genuine + Class3 feast "thomas-of-villanova" -- test_oracle.ml's own former + M17 allow-list entry, deleted once this fix made the divergence it + named disappear. *) + ( "unclassified: a Commemoration_only candidate has no row in RG91's \ + table at all, even at Class1", mk 2026 5 20, + cand ~origin:P.Sanctoral ~status:Cel.Commemoration_only ~layer:PE.universal_layer + "ef-some-commemoration-only", + PE.unclassified ) ] (* Review finding 1's end-to-end proof: on a real Sunday landing on 2 diff --git a/test/test_rite_ef.ml b/test/test_rite_ef.ml index 6fcb25d..2e5d2fd 100644 --- a/test/test_rite_ef.ml +++ b/test/test_rite_ef.ml @@ -298,6 +298,45 @@ let test_search_genuinely_enters_the_window () = "the walked span is at least 8 days -- the octave alone (Easter..Easter+7), not a one-day hop" true (List.length walked >= 8) +(* Task B fix round 1 (coordinator finding 1), end to end with REAL data: + 22 September 2027 is a September Ember Wednesday -- the OBSERVED day is + the Ember office itself ([band] entry 18, RG 91, beats both sanctoral + candidates), and RG 111(c) ("other II class: one") admits exactly ONE + of the two competing losers, "maurice-and-companions-martyrs" + ([Commemoration_only], Class3) and "thomas-of-villanova" ([Feast], + Class3). Before the fix, [Precedence_ef.band] gave Maurice the SAME + table entry (24) as Thomas, so the residual slug tie-break picked + Maurice ('m' < 't') and OMITTED Thomas -- contrary to the calendarium's + own 22 September row ("S. Thomae de Villanova Ep. et Conf., III + classis. / Commemoratio Ss. Mauritii et Soc. Mm.": Thomas is the one + WITH a table entry) and to missalemeum (test/test_oracle.ml's own + former M17 allow-list entry -- oracle "commemorations": Thomas, + "displaced": Maurice -- deleted once this fix made the divergence + disappear). This is the SAME date the oracle harness itself checks, + pinned here too so a regression shows up at the OCaml level, not only + via the fixture comparison. *) +let test_maurice_thomas_band_fidelity_end_to_end () = + let layer = real_layer () in + (* [Calendar.year]'s own liturgical-year convention (Advent-anchored, see + calendar.ml's [year_bounds]): the label [y] spans December of civil + year [y] through November of civil year [y+1], so 22 September 2027 + is reached via [Cal.year ... 2026], not 2027 -- the same + [y-1]/straddling indexing test_oracle.ml's own header comment already + documents for exactly this reason. *) + let days = Cal.year Rite_ef.context layer 2026 in + let day = Array.to_list days |> List.find (fun d -> Date.compare d.LD.date (mk 2027 9 22) = 0) in + Alcotest.(check string) "the September Ember Wednesday office itself is observed (band entry 18)" + "ef-september-ember-wed" (slug_of day.LD.observed); + Alcotest.(check (list string)) + "St Thomas of Villanova (band entry 24, a real table row) is the sole commemoration" + [ "thomas-of-villanova" ] + (List.map (fun (c, _) -> slug_of c) day.LD.commemorations); + Alcotest.(check (list string)) + "St Maurice and Companions (Commemoration_only, unclassified -- no table row) is omitted, not \ + commemorated" + [ "maurice-and-companions-martyrs" ] + (List.map (fun (c, _) -> slug_of c) day.LD.omitted) + let suite = ( "Rite_ef (real data: overlay-in-effect, domain-ceiling)", [ Alcotest.test_case "the overlay suppression is observably in effect" `Quick @@ -311,4 +350,7 @@ let suite = Alcotest.test_case "transfer_target skips the whole Easter octave from inside Holy Week" `Quick test_transfer_target_skips_the_whole_easter_octave; Alcotest.test_case "the search genuinely enters the window (not vacuous)" `Quick - test_search_genuinely_enters_the_window ] ) + test_search_genuinely_enters_the_window; + Alcotest.test_case + "band fidelity end-to-end: Thomas of Villanova observed, Maurice commemorated (2027-09-22)" `Quick + test_maurice_thomas_band_fidelity_end_to_end ] ) -- cgit v1.3