From bcae61568a1799d15c771554d5c72b01c4fd53d7 Mon Sep 17 00:00:00 2001 From: Will Estes Date: Wed, 12 Aug 2026 16:03:06 -0400 Subject: [PATCH] Add Paschaltide-variant fallback for minor-hour Commons Confirms and formalizes what TODO.md had flagged as an open question: the reference engine's own source has explicit Paschaltide variants (Commune/C1p.txt, C2p.txt, C3p.txt -- "tempore Paschali") for exactly 3 of its 12 Common categories -- Apostles, a Martyr-Bishop, Several Martyrs -- a real liturgical restriction of Alleluia/victory imagery to apostles and martyrs, not a coincidence. resolveMinorHourAntiphon/resolveMinorHourChapter now try a `${minorHoursCommon}-paschaltide` variant first whenever day.season is eastertide/ascensiontide/pentecost (the same three-season window as Compline's own Regina Caeli table, since "tempore paschali" runs through the Pentecost octave in both), falling back to the plain Common when no variant is authored. common-of-apostles-paschaltide (7 files) ported directly from the reference engine's own Commune/C1p.txt source files rather than live-queried, then cross-checked against st-mark's already-authored, live-queried content -- identical except one antiphon's asterisk, which the source places one word earlier; corrected to match. st-mark and st-john-before-the-latin-gate's duplicate per-saint files removed entirely; ss-philip-and-james's chapter files removed (its antiphons stay proper). Co-Authored-By: Claude Sonnet 5 --- TODO.md | 56 +++++++++++++------ .../calendar/saints/ss-philip-and-james.yml | 1 + .../saints/st-john-before-the-latin-gate.yml | 1 + src/data/calendar/saints/st-mark.yml | 1 + ...ntiphon-common-of-apostles-paschaltide.yml | 12 ++++ ...antiphon-st-john-before-the-latin-gate.yml | 11 ---- .../propers/common/none-antiphon-st-mark.yml | 9 --- ...itulum-common-of-apostles-paschaltide.yml} | 9 ++- .../none-capitulum-ss-philip-and-james.yml | 13 ----- ...apitulum-st-john-before-the-latin-gate.yml | 14 ----- ...ntiphon-common-of-apostles-paschaltide.yml | 19 +++++++ ...antiphon-st-john-before-the-latin-gate.yml | 11 ---- .../propers/common/prime-antiphon-st-mark.yml | 9 --- ...ntiphon-common-of-apostles-paschaltide.yml | 10 ++++ ...antiphon-st-john-before-the-latin-gate.yml | 11 ---- .../propers/common/sext-antiphon-st-mark.yml | 9 --- ...itulum-common-of-apostles-paschaltide.yml} | 9 +-- ...apitulum-st-john-before-the-latin-gate.yml | 14 ----- .../propers/common/sext-capitulum-st-mark.yml | 12 ---- ...ntiphon-common-of-apostles-paschaltide.yml | 14 +++++ ...antiphon-st-john-before-the-latin-gate.yml | 11 ---- .../propers/common/terce-antiphon-st-mark.yml | 13 ----- ...itulum-common-of-apostles-paschaltide.yml} | 12 ++-- ...apitulum-st-john-before-the-latin-gate.yml | 14 ----- .../common/terce-capitulum-st-mark.yml | 12 ---- src/hours/resolve-common.ts | 46 ++++++++++++--- 26 files changed, 151 insertions(+), 202 deletions(-) create mode 100644 src/data/propers/common/none-antiphon-common-of-apostles-paschaltide.yml delete mode 100644 src/data/propers/common/none-antiphon-st-john-before-the-latin-gate.yml delete mode 100644 src/data/propers/common/none-antiphon-st-mark.yml rename src/data/propers/common/{none-capitulum-st-mark.yml => none-capitulum-common-of-apostles-paschaltide.yml} (61%) delete mode 100644 src/data/propers/common/none-capitulum-ss-philip-and-james.yml delete mode 100644 src/data/propers/common/none-capitulum-st-john-before-the-latin-gate.yml create mode 100644 src/data/propers/common/prime-antiphon-common-of-apostles-paschaltide.yml delete mode 100644 src/data/propers/common/prime-antiphon-st-john-before-the-latin-gate.yml delete mode 100644 src/data/propers/common/prime-antiphon-st-mark.yml create mode 100644 src/data/propers/common/sext-antiphon-common-of-apostles-paschaltide.yml delete mode 100644 src/data/propers/common/sext-antiphon-st-john-before-the-latin-gate.yml delete mode 100644 src/data/propers/common/sext-antiphon-st-mark.yml rename src/data/propers/common/{sext-capitulum-ss-philip-and-james.yml => sext-capitulum-common-of-apostles-paschaltide.yml} (61%) delete mode 100644 src/data/propers/common/sext-capitulum-st-john-before-the-latin-gate.yml delete mode 100644 src/data/propers/common/sext-capitulum-st-mark.yml create mode 100644 src/data/propers/common/terce-antiphon-common-of-apostles-paschaltide.yml delete mode 100644 src/data/propers/common/terce-antiphon-st-john-before-the-latin-gate.yml delete mode 100644 src/data/propers/common/terce-antiphon-st-mark.yml rename src/data/propers/common/{terce-capitulum-ss-philip-and-james.yml => terce-capitulum-common-of-apostles-paschaltide.yml} (60%) delete mode 100644 src/data/propers/common/terce-capitulum-st-john-before-the-latin-gate.yml delete mode 100644 src/data/propers/common/terce-capitulum-st-mark.yml diff --git a/TODO.md b/TODO.md index cd20cb6..ca3dc9b 100644 --- a/TODO.md +++ b/TODO.md @@ -122,24 +122,44 @@ assumed from category alone: really is identical, just named honestly rather than dressed up as a Common of Saints class. -**Deliberately left un-extracted — a genuine open question, not an -oversight:** st-mark and st-john-before-the-latin-gate share identical -antiphons *and* chapters across all 4 hours, and ss-philip-and-james -shares just the chapters with those two — but live-checking the season -line on each saint's own queried date showed all three landing *within -Paschaltide* that year ("infra Hebdomadam N post Octavam Paschæ"), for -three otherwise-unrelated saints (an Evangelist and two separate Apostle -feasts) whose overall `common` classification doesn't even agree with -each other. That strongly suggests this shared "Alleluia" text is a -Paschaltide *seasonal* override, not a fixed per-saint-category Common — -meaning the app has no mechanism today to know whether it's still -correct in a year where Easter lands late enough to push these fixed -dates (Apr 25, May 1, May 6) past Pentecost. Left as three small, -individually-authored (already diff-verified) per-saint files rather than -folded into `minorHoursCommon`, which would misrepresent this as -timeless, unconditional content. Fixing it properly needs a real -Paschaltide-awareness mechanism for minor-hour content (this app has none -yet for any hour) — flagged here, not attempted. +### Paschaltide commons — done (2026-08) + +The Mark/John-Before-the-Latin-Gate/Philip-and-James "Alleluia" text +flagged above as an open question is confirmed real, not a coincidence: +the reference engine's own source has explicit Paschaltide variants — +`Commune/C1p.txt`/`C2p.txt`/`C3p.txt` ("Commune Apostolorum/Unius +Martyris Pontificis/Plurimorum Martyrum tempore Paschali") — for exactly +3 of its 12 Common categories: Apostles, a Martyr-Bishop, Several +Martyrs. Confessors/Virgins/Doctors/BVM never get one — Alleluia/victory +imagery is restricted to apostles and martyrs specifically, a real +liturgical distinction, not an app gap. + +Mechanism: `resolveMinorHourAntiphon`/`resolveMinorHourChapter` +(`hours/resolve-common.ts`) now try `${hourId}-antiphon- +${minorHoursCommon}-paschaltide` (etc.) first whenever `day.season` is +`eastertide`, `ascensiontide`, or `pentecost` — the same three-season +window as Compline's own Regina Caeli table +(`data/hours/marian-antiphon-by-season.yml`), not just `eastertide` +alone, since "tempore paschali" runs through the Pentecost octave in +both cases. Falls back to the plain (non-Paschaltide) Common when no +`-paschaltide` variant is authored, same silent-fallback convention as +everywhere else. + +`common-of-apostles-paschaltide` (7 files) ported directly from +`Commune/C1p.txt`/English `Commune/C1p.txt` — not live-queried — and +cross-checked against st-mark's already-authored, live-queried content +(2026-04-25): identical except the source's own Prime-antiphon asterisk +falls one word earlier than the live-rendered incipit had suggested, +corrected here to match the source. st-mark and st-john-before-the- +latin-gate's own duplicate per-saint files removed (all 7 each); +ss-philip-and-james's chapter files removed (its own antiphons stay +proper — its own Gospel-referencing text, not shared even in +Paschaltide). Only `C1p` (Apostles) ported so far, since no currently- +authored saint sits on a Martyr-Bishop or Several-Martyrs common that +could fall in Paschaltide — `common-of-a-confessor-bishop` and any +future Martyr-common saint don't need one (Confessors never get a +Paschaltide variant at all; a Martyr one would need porting `C2p`/`C3p` +the same way, if and when a saint needing it is authored). ### Overlapping octaves — done (2026-08) diff --git a/src/data/calendar/saints/ss-philip-and-james.yml b/src/data/calendar/saints/ss-philip-and-james.yml index 7dac95f..f9ea859 100644 --- a/src/data/calendar/saints/ss-philip-and-james.yml +++ b/src/data/calendar/saints/ss-philip-and-james.yml @@ -6,3 +6,4 @@ name: "Ss. Philip and James, Apostles" rank: duplex-2-classis common: common-of-an-apostle propers: "ss-philip-and-james" +minorHoursCommon: common-of-apostles diff --git a/src/data/calendar/saints/st-john-before-the-latin-gate.yml b/src/data/calendar/saints/st-john-before-the-latin-gate.yml index 3e7e3b1..d4a28ae 100644 --- a/src/data/calendar/saints/st-john-before-the-latin-gate.yml +++ b/src/data/calendar/saints/st-john-before-the-latin-gate.yml @@ -9,3 +9,4 @@ name: "St. John Before the Latin Gate" rank: duplex-majus common: common-of-an-apostle propers: "st-john-before-the-latin-gate" +minorHoursCommon: common-of-apostles diff --git a/src/data/calendar/saints/st-mark.yml b/src/data/calendar/saints/st-mark.yml index b633bda..e0402c1 100644 --- a/src/data/calendar/saints/st-mark.yml +++ b/src/data/calendar/saints/st-mark.yml @@ -11,3 +11,4 @@ name: "St. Mark, Evangelist" rank: duplex-2-classis common: common-of-an-evangelist propers: "st-mark" +minorHoursCommon: common-of-apostles diff --git a/src/data/propers/common/none-antiphon-common-of-apostles-paschaltide.yml b/src/data/propers/common/none-antiphon-common-of-apostles-paschaltide.yml new file mode 100644 index 0000000..7dc3e32 --- /dev/null +++ b/src/data/propers/common/none-antiphon-common-of-apostles-paschaltide.yml @@ -0,0 +1,12 @@ +# Verified against the reference engine's own source data files: +# web/www/horas/Latin/Commune/C1p.txt and English/Commune/C1p.txt, 2026-08 +# -- see prime-antiphon-common-of-apostles-paschaltide.yml's header. C1p's +# own [Ant Vespera] has 5 antiphons cycled across the hours; this is the +# 5th (4th, "Spíritus et ánimæ...", is used elsewhere, not at None). +id: none-antiphon-common-of-apostles-paschaltide +text: + la: "Fulgébunt justi * sicut sol in conspéctu Dei, allelúja." + en: "The just shine * like the sun at the face of God, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-antiphon-st-john-before-the-latin-gate.yml b/src/data/propers/common/none-antiphon-st-john-before-the-latin-gate.yml deleted file mode 100644 index c518ebe..0000000 --- a/src/data/propers/common/none-antiphon-st-john-before-the-latin-gate.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), None -# live query, St. John Before the Latin Gate's own day (2026-05-06, -# clean year) -- same Common-of-Martyrs text as St. Mark's own, confirmed -# identical directly. -id: none-antiphon-st-john-before-the-latin-gate -text: - la: "Fulgébunt justi * sicut sol in conspéctu Dei, allelúja." - en: "The just shine * like the sun at the face of God, alleluia." -status: - la: verified - en: verified diff --git a/src/data/propers/common/none-antiphon-st-mark.yml b/src/data/propers/common/none-antiphon-st-mark.yml deleted file mode 100644 index 2602b5f..0000000 --- a/src/data/propers/common/none-antiphon-st-mark.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), None -# live query, St. Mark's own day (2026-04-25, clean year). -id: none-antiphon-st-mark -text: - la: "Fulgébunt justi * sicut sol in conspéctu Dei, allelúja." - en: "The just shine * like the sun at the face of God, alleluia." -status: - la: verified - en: verified diff --git a/src/data/propers/common/none-capitulum-st-mark.yml b/src/data/propers/common/none-capitulum-common-of-apostles-paschaltide.yml similarity index 61% rename from src/data/propers/common/none-capitulum-st-mark.yml rename to src/data/propers/common/none-capitulum-common-of-apostles-paschaltide.yml index 2b9df39..0eb334f 100644 --- a/src/data/propers/common/none-capitulum-st-mark.yml +++ b/src/data/propers/common/none-capitulum-common-of-apostles-paschaltide.yml @@ -1,6 +1,9 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), None -# live query, St. Mark's own day (2026-04-25, clean year). -id: none-capitulum-st-mark +# Verified against the reference engine's own source data files: +# web/www/horas/Latin/Commune/C1p.txt and English/Commune/C1p.txt, 2026-08 +# -- see prime-antiphon-common-of-apostles-paschaltide.yml's header (C1p's +# own [Lectio Prima]/[Nocturn 3 Versum] sections, reached at None via +# [Capitulum Nona]'s `@:Lectio Prima` reference). +id: none-capitulum-common-of-apostles-paschaltide text: la: "Scimus quóniam diligéntibus Deum ómnia cooperántur in bonum, iis qui secúndum propósitum vocáti sunt sancti. R. Deo grátias. V. Lætítia sempitérna super cápita eórum, allelúja. R. Gáudium et exsultatiónem obtinébunt, allelúja." en: "And we know that to them that love God, all things work together unto good, to such as, according to his purpose, are called to be saints. R. Thanks be to God. V. Everlasting joy shall be upon their heads, alleluia. R. They shall obtain joy and gladness, alleluia." diff --git a/src/data/propers/common/none-capitulum-ss-philip-and-james.yml b/src/data/propers/common/none-capitulum-ss-philip-and-james.yml deleted file mode 100644 index f245580..0000000 --- a/src/data/propers/common/none-capitulum-ss-philip-and-james.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), None -# live query, Ss. Philip and James's own day (2026-05-01, clean year) -- -# same Common-of-Apostles text as St. Mark's own. -id: none-capitulum-ss-philip-and-james -text: - la: "Scimus quóniam diligéntibus Deum ómnia cooperántur in bonum, iis qui secúndum propósitum vocáti sunt sancti. R. Deo grátias. V. Lætítia sempitérna super cápita eórum, allelúja. R. Gáudium et exsultatiónem obtinébunt, allelúja." - en: "And we know that to them that love God, all things work together unto good, to such as, according to his purpose, are called to be saints. R. Thanks be to God. V. Everlasting joy shall be upon their heads, alleluia. R. They shall obtain joy and gladness, alleluia." -citation: - la: "Rom 8:28" - en: "Rom 8:28" -status: - la: verified - en: verified diff --git a/src/data/propers/common/none-capitulum-st-john-before-the-latin-gate.yml b/src/data/propers/common/none-capitulum-st-john-before-the-latin-gate.yml deleted file mode 100644 index fbbf24d..0000000 --- a/src/data/propers/common/none-capitulum-st-john-before-the-latin-gate.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), None -# live query, St. John Before the Latin Gate's own day (2026-05-06, -# clean year) -- same Common-of-Martyrs text as St. Mark's own, confirmed -# identical directly. -id: none-capitulum-st-john-before-the-latin-gate -text: - la: "Scimus quóniam diligéntibus Deum ómnia cooperántur in bonum, iis qui secúndum propósitum vocáti sunt sancti. R. Deo grátias. V. Lætítia sempitérna super cápita eórum, allelúja. R. Gáudium et exsultatiónem obtinébunt, allelúja." - en: "And we know that to them that love God, all things work together unto good, to such as, according to his purpose, are called to be saints. R. Thanks be to God. V. Everlasting joy shall be upon their heads, alleluia. R. They shall obtain joy and gladness, alleluia." -citation: - la: "Rom 8:28" - en: "Rom 8:28" -status: - la: verified - en: verified diff --git a/src/data/propers/common/prime-antiphon-common-of-apostles-paschaltide.yml b/src/data/propers/common/prime-antiphon-common-of-apostles-paschaltide.yml new file mode 100644 index 0000000..45a100d --- /dev/null +++ b/src/data/propers/common/prime-antiphon-common-of-apostles-paschaltide.yml @@ -0,0 +1,19 @@ +# Verified against the reference engine's own source data files (not a +# live query): web/www/horas/Latin/Commune/C1p.txt and English/Commune/ +# C1p.txt ("Commune Apostolorum tempore Paschali"), 2026-08. Cross-checked +# against st-mark's already-authored, live-queried content (2026-04-25) -- +# identical except this source's own asterisk falls one word earlier +# ("Sancti tui, * Dómine..." not "Sancti tui, Dómine, * ...") -- trusted +# over the live-rendered incipit split, per resolveMinorHourAntiphon's own +# Paschaltide-variant fallback (hours/resolve-common.ts) and +# SaintRecord.minorHoursCommon (calendar/feasts.ts). See TODO.md for which +# saints (st-mark, st-john-before-the-latin-gate, ss-philip-and-james) +# reach this file and why only Apostles/Martyr-Bishop/Several-Martyrs +# commons have a Paschaltide variant at all. +id: prime-antiphon-common-of-apostles-paschaltide +text: + la: "Sancti tui, * Dómine, florébunt sicut lílium, allelúja: et sicut odor bálsami erunt ante te, allelúja." + en: "Your saints, O Lord, * flourish like lilies, alleluia: and like the smell of balsam are before you, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/prime-antiphon-st-john-before-the-latin-gate.yml b/src/data/propers/common/prime-antiphon-st-john-before-the-latin-gate.yml deleted file mode 100644 index 443ba12..0000000 --- a/src/data/propers/common/prime-antiphon-st-john-before-the-latin-gate.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Prime -# live query, St. John Before the Latin Gate's own day (2026-05-06, -# clean year) -- same Common-of-Martyrs text as St. Mark's own -# (2026-04-25), confirmed identical directly, not assumed. -id: prime-antiphon-st-john-before-the-latin-gate -text: - la: "Sancti tui, Dómine, * florébunt sicut lílium, allelúja: et sicut odor bálsami erunt ante te, allelúja." - en: "Your saints, O Lord, * flourish like lilies, alleluia: and like the smell of balsam are before you, alleluia." -status: - la: verified - en: verified diff --git a/src/data/propers/common/prime-antiphon-st-mark.yml b/src/data/propers/common/prime-antiphon-st-mark.yml deleted file mode 100644 index 408e435..0000000 --- a/src/data/propers/common/prime-antiphon-st-mark.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Prime -# live query, St. Mark's own day (2026-04-25, clean year). -id: prime-antiphon-st-mark -text: - la: "Sancti tui, Dómine, * florébunt sicut lílium, allelúja: et sicut odor bálsami erunt ante te, allelúja." - en: "Your saints, O Lord, * flourish like lilies, alleluia: and like the smell of balsam are before you, alleluia." -status: - la: verified - en: verified diff --git a/src/data/propers/common/sext-antiphon-common-of-apostles-paschaltide.yml b/src/data/propers/common/sext-antiphon-common-of-apostles-paschaltide.yml new file mode 100644 index 0000000..8211554 --- /dev/null +++ b/src/data/propers/common/sext-antiphon-common-of-apostles-paschaltide.yml @@ -0,0 +1,10 @@ +# Verified against the reference engine's own source data files: +# web/www/horas/Latin/Commune/C1p.txt and English/Commune/C1p.txt, 2026-08 +# -- see prime-antiphon-common-of-apostles-paschaltide.yml's header. +id: sext-antiphon-common-of-apostles-paschaltide +text: + la: "In velaménto * clamábant Sancti tui, Dómine, allelúja, allelúja, allelúja." + en: "Protected by a veil * your saints turn to you, O Lord, alleluia, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-antiphon-st-john-before-the-latin-gate.yml b/src/data/propers/common/sext-antiphon-st-john-before-the-latin-gate.yml deleted file mode 100644 index 3d05b38..0000000 --- a/src/data/propers/common/sext-antiphon-st-john-before-the-latin-gate.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Sext -# live query, St. John Before the Latin Gate's own day (2026-05-06, -# clean year) -- same Common-of-Martyrs text as St. Mark's own, confirmed -# identical directly. -id: sext-antiphon-st-john-before-the-latin-gate -text: - la: "In velaménto * clamábant Sancti tui, Dómine, allelúja, allelúja, allelúja." - en: "Protected by a veil * your saints turn to you, O Lord, alleluia, alleluia." -status: - la: verified - en: verified diff --git a/src/data/propers/common/sext-antiphon-st-mark.yml b/src/data/propers/common/sext-antiphon-st-mark.yml deleted file mode 100644 index 8196b23..0000000 --- a/src/data/propers/common/sext-antiphon-st-mark.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Sext -# live query, St. Mark's own day (2026-04-25, clean year). -id: sext-antiphon-st-mark -text: - la: "In velaménto * clamábant Sancti tui, Dómine, allelúja, allelúja, allelúja." - en: "Protected by a veil * your saints turn to you, O Lord, alleluia, alleluia." -status: - la: verified - en: verified diff --git a/src/data/propers/common/sext-capitulum-ss-philip-and-james.yml b/src/data/propers/common/sext-capitulum-common-of-apostles-paschaltide.yml similarity index 61% rename from src/data/propers/common/sext-capitulum-ss-philip-and-james.yml rename to src/data/propers/common/sext-capitulum-common-of-apostles-paschaltide.yml index 962deef..3a9f5a5 100644 --- a/src/data/propers/common/sext-capitulum-ss-philip-and-james.yml +++ b/src/data/propers/common/sext-capitulum-common-of-apostles-paschaltide.yml @@ -1,7 +1,8 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Sext -# live query, Ss. Philip and James's own day (2026-05-01, clean year) -- -# same Common-of-Apostles text as St. Mark's own. -id: sext-capitulum-ss-philip-and-james +# Verified against the reference engine's own source data files: +# web/www/horas/Latin/Commune/C1p.txt and English/Commune/C1p.txt, 2026-08 +# -- see prime-antiphon-common-of-apostles-paschaltide.yml's header (C1p's +# own [Capitulum Sexta]/[Nocturn 2 Versum] sections). +id: sext-capitulum-common-of-apostles-paschaltide text: la: "Ecce quómodo computáti sunt inter fílios Dei, et inter sanctos sors illórum est. R. Deo grátias. V. Lux perpétua lucébit Sanctis tuis, Dómine, allelúja. R. Et ætérnitas témporum, allelúja." en: "Behold how they are numbered among the children of God, and their lot is among the saints. R. Thanks be to God. V. Eternal light will shine over your saints, O Lord, alleluia. R. And the eternity of times, alleluia." diff --git a/src/data/propers/common/sext-capitulum-st-john-before-the-latin-gate.yml b/src/data/propers/common/sext-capitulum-st-john-before-the-latin-gate.yml deleted file mode 100644 index 28e15b0..0000000 --- a/src/data/propers/common/sext-capitulum-st-john-before-the-latin-gate.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Sext -# live query, St. John Before the Latin Gate's own day (2026-05-06, -# clean year) -- same Common-of-Martyrs text as St. Mark's own, confirmed -# identical directly. -id: sext-capitulum-st-john-before-the-latin-gate -text: - la: "Ecce quómodo computáti sunt inter fílios Dei, et inter sanctos sors illórum est. R. Deo grátias. V. Lux perpétua lucébit Sanctis tuis, Dómine, allelúja. R. Et ætérnitas témporum, allelúja." - en: "Behold how they are numbered among the children of God, and their lot is among the saints. R. Thanks be to God. V. Eternal light will shine over your saints, O Lord, alleluia. R. And the eternity of times, alleluia." -citation: - la: "Sap 5:5" - en: "Wis 5:5" -status: - la: verified - en: verified diff --git a/src/data/propers/common/sext-capitulum-st-mark.yml b/src/data/propers/common/sext-capitulum-st-mark.yml deleted file mode 100644 index 087894e..0000000 --- a/src/data/propers/common/sext-capitulum-st-mark.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Sext -# live query, St. Mark's own day (2026-04-25, clean year). -id: sext-capitulum-st-mark -text: - la: "Ecce quómodo computáti sunt inter fílios Dei, et inter sanctos sors illórum est. R. Deo grátias. V. Lux perpétua lucébit Sanctis tuis, Dómine, allelúja. R. Et ætérnitas témporum, allelúja." - en: "Behold how they are numbered among the children of God, and their lot is among the saints. R. Thanks be to God. V. Eternal light will shine over your saints, O Lord, alleluia. R. And the eternity of times, alleluia." -citation: - la: "Sap 5:5" - en: "Wis 5:5" -status: - la: verified - en: verified diff --git a/src/data/propers/common/terce-antiphon-common-of-apostles-paschaltide.yml b/src/data/propers/common/terce-antiphon-common-of-apostles-paschaltide.yml new file mode 100644 index 0000000..6deb355 --- /dev/null +++ b/src/data/propers/common/terce-antiphon-common-of-apostles-paschaltide.yml @@ -0,0 +1,14 @@ +# Verified against the reference engine's own source data files: +# web/www/horas/Latin/Commune/C1p.txt and English/Commune/C1p.txt, 2026-08 +# -- see prime-antiphon-common-of-apostles-paschaltide.yml's header. The +# source's own English rendering has no asterisk at all for this line (a +# real gap in that file, not a capture error) -- placed here to match the +# Latin split's own sense, same as st-mark's already-authored terce +# antiphon this matches exactly. +id: terce-antiphon-common-of-apostles-paschaltide +text: + la: "In cæléstibus regnis * Sanctórum habitátio est, allelúja: et in ætérnum réquies eórum, allelúja." + en: "In the heavenly kingdom * is the habitation of the saints, alleluia: and they rest in the eternity, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-antiphon-st-john-before-the-latin-gate.yml b/src/data/propers/common/terce-antiphon-st-john-before-the-latin-gate.yml deleted file mode 100644 index cdaa58b..0000000 --- a/src/data/propers/common/terce-antiphon-st-john-before-the-latin-gate.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Terce -# live query, St. John Before the Latin Gate's own day (2026-05-06, -# clean year) -- same Common-of-Martyrs text as St. Mark's own, confirmed -# identical directly. -id: terce-antiphon-st-john-before-the-latin-gate -text: - la: "In cæléstibus regnis * Sanctórum habitátio est, allelúja: et in ætérnum réquies eórum, allelúja." - en: "In the heavenly kingdom * is the habitation of the saints, alleluia: and they rest in the eternity, alleluia." -status: - la: verified - en: verified diff --git a/src/data/propers/common/terce-antiphon-st-mark.yml b/src/data/propers/common/terce-antiphon-st-mark.yml deleted file mode 100644 index 0d5f8aa..0000000 --- a/src/data/propers/common/terce-antiphon-st-mark.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Terce -# live query, St. Mark's own day (2026-04-25, clean year). The source's -# own English rendered the same full sentence for both its "incipit" and -# full lines (no separate truncation there, unlike the Latin) -- the "*" -# position below is placed to match the Latin split's own sense, not a -# second source line. -id: terce-antiphon-st-mark -text: - la: "In cæléstibus regnis * Sanctórum habitátio est, allelúja: et in ætérnum réquies eórum, allelúja." - en: "In the heavenly kingdom * is the habitation of the saints, alleluia: and they rest in the eternity, alleluia." -status: - la: verified - en: verified diff --git a/src/data/propers/common/terce-capitulum-ss-philip-and-james.yml b/src/data/propers/common/terce-capitulum-common-of-apostles-paschaltide.yml similarity index 60% rename from src/data/propers/common/terce-capitulum-ss-philip-and-james.yml rename to src/data/propers/common/terce-capitulum-common-of-apostles-paschaltide.yml index e940951..f90cae1 100644 --- a/src/data/propers/common/terce-capitulum-ss-philip-and-james.yml +++ b/src/data/propers/common/terce-capitulum-common-of-apostles-paschaltide.yml @@ -1,9 +1,9 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Terce -# live query, Ss. Philip and James's own day (2026-05-01, clean year) -- -# same Common-of-Apostles text as St. Mark's own (2026-04-25), a -# separate file per this codebase's usual per-saint convention even -# where the underlying Common produces identical wording. -id: terce-capitulum-ss-philip-and-james +# Verified against the reference engine's own source data files: +# web/www/horas/Latin/Commune/C1p.txt and English/Commune/C1p.txt, 2026-08 +# -- see prime-antiphon-common-of-apostles-paschaltide.yml's header (C1p's +# own [Capitulum Laudes]/[Versum 1] sections -- Terce's chapter equals +# Lauds' in the Monastic tradition). +id: terce-capitulum-common-of-apostles-paschaltide text: la: "Stabunt justi in magna constántia advérsus eos qui se angustiavérunt et qui abstulérunt labóres eórum. R. Deo grátias. V. Sancti et justi in Dómino gaudéte, allelúja. R. Vos elégit Deus in hereditátem sibi, allelúja." en: "Then shall the just stand with great constancy against those that have afflicted them, and taken away their labours. R. Thanks be to God. V. Saints and just, rejoice in the Lord, alleluia. R. The Lord has chosen you for his inheritance, alleluia." diff --git a/src/data/propers/common/terce-capitulum-st-john-before-the-latin-gate.yml b/src/data/propers/common/terce-capitulum-st-john-before-the-latin-gate.yml deleted file mode 100644 index 11c3f46..0000000 --- a/src/data/propers/common/terce-capitulum-st-john-before-the-latin-gate.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Terce -# live query, St. John Before the Latin Gate's own day (2026-05-06, -# clean year) -- same Common-of-Martyrs text as St. Mark's own, confirmed -# identical directly. -id: terce-capitulum-st-john-before-the-latin-gate -text: - la: "Stabunt justi in magna constántia advérsus eos qui se angustiavérunt et qui abstulérunt labóres eórum. R. Deo grátias. V. Sancti et justi in Dómino gaudéte, allelúja. R. Vos elégit Deus in hereditátem sibi, allelúja." - en: "Then shall the just stand with great constancy against those that have afflicted them, and taken away their labours. R. Thanks be to God. V. Saints and just, rejoice in the Lord, alleluia. R. The Lord has chosen you for his inheritance, alleluia." -citation: - la: "Sap 5:1" - en: "Wis 5:1" -status: - la: verified - en: verified diff --git a/src/data/propers/common/terce-capitulum-st-mark.yml b/src/data/propers/common/terce-capitulum-st-mark.yml deleted file mode 100644 index bef4b80..0000000 --- a/src/data/propers/common/terce-capitulum-st-mark.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Verified against Divinum Officium (Monastic Tridentinum 1617), Terce -# live query, St. Mark's own day (2026-04-25, clean year). -id: terce-capitulum-st-mark -text: - la: "Stabunt justi in magna constántia advérsus eos qui se angustiavérunt et qui abstulérunt labóres eórum. R. Deo grátias. V. Sancti et justi in Dómino gaudéte, allelúja. R. Vos elégit Deus in hereditátem sibi, allelúja." - en: "Then shall the just stand with great constancy against those that have afflicted them, and taken away their labours. R. Thanks be to God. V. Saints and just, rejoice in the Lord, alleluia. R. The Lord has chosen you for his inheritance, alleluia." -citation: - la: "Sap 5:1" - en: "Wis 5:1" -status: - la: verified - en: verified diff --git a/src/hours/resolve-common.ts b/src/hours/resolve-common.ts index 673870a..90a99ff 100644 --- a/src/hours/resolve-common.ts +++ b/src/hours/resolve-common.ts @@ -111,14 +111,31 @@ export function getMinorHourOverrideId(day: LiturgicalDay): string | undefined { return undefined; } +/** + * "Tempore Paschali" — the reference engine's own window for a Common's + * Paschaltide variant (Commune/C1p.txt etc.: only Apostles, a Martyr- + * Bishop, and Several Martyrs get one — Confessors/Virgins/Doctors never + * do, matching the real tradition's own restriction of Alleluia/victory + * imagery to apostles and martyrs specifically). Deliberately the same + * three-season set as Compline's own Marian-antiphon table + * (`data/hours/marian-antiphon-by-season.yml`'s `eastertide`/ + * `ascensiontide`/`pentecost` all mapping to Regina Caeli, not just + * `eastertide` alone) — "Paschalis" runs through the end of the Pentecost + * octave in both cases, not just to Ascension. + */ +const PASCHALTIDE_SEASONS = new Set(['eastertide', 'ascensiontide', 'pentecost']); + /** A Little Hour's (or Prime's) plain per-weekday antiphon, overridden by * a duplex-majus+ feast's own proper (`${hourId}-antiphon-${id}`) when * authored, then by that saint's shared Common (`${hourId}-antiphon- - * ${minorHoursCommon}`, see SaintRecord's own doc comment) when a proper - * one hasn't been authored — same honest "not gated behind whether - * content exists, just eligible to override at all" fallback as every - * other override in this codebase: an eligible feast with neither - * authored yet just falls through to the plain weekday default silently. + * ${minorHoursCommon}`, see SaintRecord's own doc comment) — tried first + * in its Paschaltide-variant form (`${minorHoursCommon}-paschaltide`) + * when the day falls in Paschaltide and that variant has been authored, + * per PASCHALTIDE_SEASONS's own doc comment — when a proper one hasn't + * been authored — same honest "not gated behind whether content exists, + * just eligible to override at all" fallback as every other override in + * this codebase: an eligible feast with none of these authored yet just + * falls through to the plain weekday default silently. */ export function resolveMinorHourAntiphon( hourId: string, @@ -133,6 +150,12 @@ export function resolveMinorHourAntiphon( } const commonId = getSaintRecord(overrideId)?.minorHoursCommon; if (commonId) { + if (PASCHALTIDE_SEASONS.has(day.season)) { + const paschal = resolveCommon(`${hourId}-antiphon-${commonId}-paschaltide`); + if (paschal.status.la !== 'missing' || paschal.status.en !== 'missing') { + return paschal; + } + } const common = resolveCommon(`${hourId}-antiphon-${commonId}`); if (common.status.la !== 'missing' || common.status.en !== 'missing') { return common; @@ -147,9 +170,10 @@ export function resolveMinorHourAntiphon( /** Same idea as resolveMinorHourAntiphon, for the chapter * (`${hourId}-capitulum-${id}`, then `${hourId}-capitulum- - * ${minorHoursCommon}`) — falls back to `fallbackId` (the plain - * per-annum/per-weekday one already in place for that hour) when nothing - * eligible is authored, either proper or shared-Common. */ + * ${minorHoursCommon}`, tried Paschaltide-variant-first the same way) — + * falls back to `fallbackId` (the plain per-annum/per-weekday one already + * in place for that hour) when nothing eligible is authored, either + * proper or shared-Common. */ export function resolveMinorHourChapter(hourId: string, day: LiturgicalDay, fallbackId: string): ResolvedText { const overrideId = getMinorHourOverrideId(day); if (overrideId) { @@ -159,6 +183,12 @@ export function resolveMinorHourChapter(hourId: string, day: LiturgicalDay, fall } const commonId = getSaintRecord(overrideId)?.minorHoursCommon; if (commonId) { + if (PASCHALTIDE_SEASONS.has(day.season)) { + const paschal = resolveCommon(`${hourId}-capitulum-${commonId}-paschaltide`); + if (paschal.status.la !== 'missing' || paschal.status.en !== 'missing') { + return paschal; + } + } const common = resolveCommon(`${hourId}-capitulum-${commonId}`); if (common.status.la !== 'missing' || common.status.en !== 'missing') { return common;