diff --git a/TODO.md b/TODO.md index 8a8f156..450619e 100644 --- a/TODO.md +++ b/TODO.md @@ -272,6 +272,120 @@ all 94 ids via a synthetic sanctoral-winner day, confirming a real (non-`missing`, no leftover `{N}`) collect for every one — not just that the YAML files parse. +### 94 `propers: null` saints — Benedictus antiphon + P/T/S/N Commons (2026-08) + +The natural next step the collects batch unblocked. Two more real gaps +found and fixed along the way, both explained below. + +**Raw `Commune/*.txt` fields don't reliably match what the engine +actually renders per hour, same lesson as the collects pass but for +antiphons this time.** `Commune/C2.txt`'s (Martyr-Bishop) own `[Ant 1]`/ +`[Ant 2]`/`[Ant 3]` fields don't correspond 1:1 to Prime/Terce/Sext/None +the way a naive reading would suggest, and no `CommuneM/*.txt` file +defines explicit `[Ant Prima]`/`[Ant Tertia]`/`[Ant Sexta]`/`[Ant Nona]` +fields for any of the categories this batch needed (only `C10`, BVM +Saturday, has them). Confirmed independently: the already-authored +`common-of-a-confessor-bishop` P/T/S/N content (from the original +29-saint pass) doesn't match `Commune/C4.txt`'s own raw `[Ant 1]` either +— it was live-query-sourced from Chair of St. Peter/St. Martin's own +rendered pages, not read from the Commune file directly, which is +exactly why. Fix: queried `web/cgi-bin/horas/officium.pl` directly +(local Perl, not a network fetch — `prayPrima`/`prayTertia`/`praySexta`/ +`prayNona`/`prayLaudes`, `version=Monastic Tridentinum 1617`) for one +representative `propers: null` saint per Common category, parsing the +antiphon (incipit + full, reconstructing the `*` split point) and +chapter (citation, text, closing versicles) out of the rendered HTML — +new scratchpad tool `query_hours.py`/`batch_hours.py`, not committed, +same one-off-tool convention as the rest of this project's extraction +scripts. Caught its own version of the collects batch's "wrong saint" +bug this way too: St. Emerentiana's stored clean-year comment +(2029-01-23) actually rendered St. Hilary of Poitiers's office by that +year (a stale date after his own earlier Jan 23 → Jan 14 correction, +see above) — every representative's title is now verified against an +accent-insensitive name-stem match before its content is trusted, with a +fallback year search when the stored date doesn't check out. + +**The real liturgical categories are coarser than `SaintRecord.common`'s +naming suggests — verified by cross-querying multiple saints per +category, not assumed.** `common-of-a-martyr-bishop` and +`common-of-a-martyr` render byte-identical P/T/S/N and Benedictus +antiphon content (confirmed: St. Anacletus, St. Simeon, St. Blaise, St. +Pantaleon — four different collect-template variants, one shared minor- +hour Common); so do `common-of-an-abbot`, `common-of-a-confessor-not- +bishop`, and `common-of-a-confessor` (St. Odo, St. John Gualbert, St. +Nicholas of Tolentino, St. Alexius); so do `common-of-a-virgin-martyr`, +`common-of-a-virgin`, and `common-of-a-holy-woman` (St. Justina, St. +Emerentiana, St. Praxedes, St. Martha). `common-of-several-martyrs` +splits further than its own name suggests, though: plain groups of +martyrs (Ss. Cornelius and Cyprian, Ss. Faustinus and Jovita, Ss. Placid +and Companions — the last a real Duplex II. classis feast, not just a +low-rank stub, confirming the fallback isn't only reached by minor +saints) share one Common, but groups of *Pope*-martyrs (Ss. Cletus and +Marcellinus, Ss. Soter and Caius) render distinct, more triumphal, +allelúja-toned text of their own — a real category the collect +templates already knew about (`collect-c3b`) that the `common` field +alone doesn't surface. One saint, the Dedication of the Basilicas of Ss. +Peter and Paul, turned out *not* to share its `common` field's nominal +category (`common-of-an-apostle`) at all: live-verified its P/T/S/N and +Benedictus antiphon are the Dedication-of-a-Church Common instead (about +the building, matching its own `collect-c8`), not shared with any +apostle content. Net result: 7 new shared Common categories +(`common-of-a-martyr`, `common-of-an-abbot`, `common-of-several- +martyrs`, `common-of-pope-martyrs`, `common-of-a-vigil`, `common-of-a- +virgin`, `common-of-a-dedication`) plus the pre-existing `common-of-a- +confessor-bishop` cover 66 of the 94 saints; the 7th confessor-bishop +saint's own Benedictus antiphon Common file was also new (the original +29-saint pass never needed it — Chair of St. Peter/St. Martin both have +their own proper Lauds antiphon, only their chapters were shared). + +**New mechanism**: `SaintRecord.benedictusCommon` (`calendar/feasts.ts`) +— `getBenedictusAntiphon` (`hours/resolve-common.ts`) now falls back to +`benedictus-antiphon-${benedictusCommon}.yml` when a saint has neither a +proper collect-antiphon pair nor... (see below) — deliberately no name- +substitution mechanism built for it (unlike `collectCommon`): every +Common category in current use renders name-free Benedictus-antiphon +text; only the Doctor Common (`C4a`, not used by any saint here) has a +`{N}`-shaped placeholder in the source. + +**Real bug found and fixed while wiring this in**: `getMinorHourOverrideId` +gated *all* Prime/Terce/Sext/None lookup — both the per-saint proper file +and the shared-Common fallback — behind the same duplex-majus+ threshold +Lauds' own *psalmody* override uses, on the assumption that only a +strong feast carries its own minor-hour content at all. Live-querying +this batch proved that wrong: a winning Semiduplex saint (St. Anacletus) +still renders its own proper/Common antiphons at Prime/Terce/Sext/None, +not the plain ferial default — the majus+ gate was only ever a proxy for +"this app has authored proper content," not a real liturgical rule, and +became actively wrong once Common-category content started covering +lower ranks too. Fixed by making `getMinorHourOverrideId` eligible for +*any* sanctoral winner; Lauds' own psalmody override +(`hours/lauds.ts`'s `getPsalmodyOverrideFor`) is unaffected and correctly +stays majus+-gated, since that's a real, much bigger per-saint authored +commitment (the whole psalm-antiphon block), not something this batch +adds a Common fallback for. + +One saint, Ss. Ursula and Companions, deliberately left without +`minorHoursCommon`/`benedictusCommon`: her collect template +(`collect-c6b`, plural Virgins and Martyrs) has no other member on this +app's calendar to verify a shared minor-hour text against, and she can +never be queried directly herself (a genuinely unwinnable stub, always +commemorated under St. Hilarion) — left honestly unauthored rather than +guessed from the singular `common-of-a-virgin` category, moot in +practice since a commemoration's own minor hours are never rendered. + +Verified end-to-end: a runtime smoke test (folded into +`tests/hours/resolve-common.test.ts`) resolving `getBenedictusAntiphon`/ +`resolveMinorHourAntiphon`/`resolveMinorHourChapter` for a sample across +categories, including the Duplex II. classis case to confirm the +majus+-gate fix isn't just a low-rank special case. + +**Not done in this pass**: the other 26 of the 94 (`propers` now set to +their own id, from the collects batch's proper-collect saints) still +need their own individual Benedictus antiphon authored — same shape as +the original 109-saint pass (own `[Ant 1]`/live-rendered text, not a +shared Common), since a saint with a genuine proper collect usually has +a genuine proper antiphon too. Not yet started. + ### Christmas-Octave Sunday content — done (2026-08) Was: only the Benedictus antiphon existed for `christmas-octave-sunday` @@ -608,8 +722,10 @@ correction (confirmed Roman-rite sourced), a handful already matched. (see the section above for method and its own correction). - **94 `propers: null` saints: done (2026-08)** — see the dedicated section below for the collect-authoring pass and the era-specific-calendar - discovery it took to do reliably. Antiphons for these 94 (the natural - next step this unblocks) not yet started. + discovery it took to do reliably. Benedictus antiphon + P/T/S/N: done + for the 66 that draw from a shared Common (own dedicated section + below); the other 26 (own proper collect, from the same batch) still + need their own individually-authored Benedictus antiphon, not started. ### Bug found and fixed while pulling christmas-octave-sunday's antiphon diff --git a/src/calendar/feasts.ts b/src/calendar/feasts.ts index 7fe6d7d..fa14375 100644 --- a/src/calendar/feasts.ts +++ b/src/calendar/feasts.ts @@ -61,6 +61,20 @@ export interface SaintRecord { * have two or more `{N}` placeholders for a group commemorated * together, one array entry per saint in the group. */ collectName?: { la: string[]; en: string[] }; + /** + * Fallback id for Lauds' Benedictus antiphon (`getBenedictusAntiphon`) + * when this saint has no proper `${propers}-antiphon` of their own — + * `data/propers/common/benedictus-antiphon-${id}.yml`. Unlike + * `collectCommon`, no name-substitution template: live-verified every + * Common category's Benedictus antiphon in current use is name-free + * text (the source's own `Commune/C4a.txt`, Doctor, is the one + * exception — has a `{N}`-shaped "beáte N." — but no saint on this + * calendar draws from it yet, so no substitution mechanism was built + * for this field; revisit if that changes). Often, but not always, the + * same category as `minorHoursCommon` below (both were live-verified + * independently per saint, not assumed identical). + */ + benedictusCommon?: string; /** See calendar/types.ts's OctaveConfig doc comment. Absent for the vast * majority of saints — only ones with a real octave declare it. */ octave?: OctaveConfig; diff --git a/src/data/calendar/saints/dedication-of-the-basilicas-of-ss-peter-and-paul.yml b/src/data/calendar/saints/dedication-of-the-basilicas-of-ss-peter-and-paul.yml index c81e92a..8998b09 100644 --- a/src/data/calendar/saints/dedication-of-the-basilicas-of-ss-peter-and-paul.yml +++ b/src/data/calendar/saints/dedication-of-the-basilicas-of-ss-peter-and-paul.yml @@ -15,3 +15,5 @@ collectCommon: collect-c8 collectName: la: [] en: [] +minorHoursCommon: common-of-a-dedication +benedictusCommon: common-of-a-dedication diff --git a/src/data/calendar/saints/ss-cletus-and-marcellinus.yml b/src/data/calendar/saints/ss-cletus-and-marcellinus.yml index e216ca5..84bab09 100644 --- a/src/data/calendar/saints/ss-cletus-and-marcellinus.yml +++ b/src/data/calendar/saints/ss-cletus-and-marcellinus.yml @@ -10,3 +10,5 @@ collectCommon: collect-c3b collectName: la: ["Cletum", "Marcellínum"] en: ["Cletus", "Marcellinus"] +minorHoursCommon: common-of-pope-martyrs +benedictusCommon: common-of-pope-martyrs diff --git a/src/data/calendar/saints/ss-cornelius-and-cyprian.yml b/src/data/calendar/saints/ss-cornelius-and-cyprian.yml index e0cf7f9..1fd23c7 100644 --- a/src/data/calendar/saints/ss-cornelius-and-cyprian.yml +++ b/src/data/calendar/saints/ss-cornelius-and-cyprian.yml @@ -15,3 +15,5 @@ collectCommon: collect-c3 collectName: la: ["Cornélii", "Cypriáni"] en: ["Cornelius", "Cyprian"] +minorHoursCommon: common-of-several-martyrs +benedictusCommon: common-of-several-martyrs diff --git a/src/data/calendar/saints/ss-faustinus-and-jovita.yml b/src/data/calendar/saints/ss-faustinus-and-jovita.yml index 9f746de..95437ed 100644 --- a/src/data/calendar/saints/ss-faustinus-and-jovita.yml +++ b/src/data/calendar/saints/ss-faustinus-and-jovita.yml @@ -11,3 +11,5 @@ collectCommon: collect-c3a-1 collectName: la: ["Faustíni", "Jovítæ"] en: ["Faustinus", "Jovita"] +minorHoursCommon: common-of-several-martyrs +benedictusCommon: common-of-several-martyrs diff --git a/src/data/calendar/saints/ss-placid-and-companions.yml b/src/data/calendar/saints/ss-placid-and-companions.yml index e324830..e7804ad 100644 --- a/src/data/calendar/saints/ss-placid-and-companions.yml +++ b/src/data/calendar/saints/ss-placid-and-companions.yml @@ -17,3 +17,5 @@ collectCommon: collect-c3a collectName: la: ["Plácidi", "Sociórum ejus"] en: ["Placidus", "his companions"] +minorHoursCommon: common-of-several-martyrs +benedictusCommon: common-of-several-martyrs diff --git a/src/data/calendar/saints/ss-soter-and-caius.yml b/src/data/calendar/saints/ss-soter-and-caius.yml index 1350941..4e16d29 100644 --- a/src/data/calendar/saints/ss-soter-and-caius.yml +++ b/src/data/calendar/saints/ss-soter-and-caius.yml @@ -13,3 +13,5 @@ collectCommon: collect-c3b collectName: la: ["Sotérem", "Cajum"] en: ["Soter", "Caius"] +minorHoursCommon: common-of-pope-martyrs +benedictusCommon: common-of-pope-martyrs diff --git a/src/data/calendar/saints/ss-ursula-and-companions.yml b/src/data/calendar/saints/ss-ursula-and-companions.yml index aea2075..8062a8d 100644 --- a/src/data/calendar/saints/ss-ursula-and-companions.yml +++ b/src/data/calendar/saints/ss-ursula-and-companions.yml @@ -2,6 +2,17 @@ # commemorated under St. Hilarion (see st-hilarion.yml), never wins # outright; both are fixed, non-movable dates, so this isn't an artifact # of the tested year. rank/propers unverified placeholders. +# +# No minorHoursCommon/benedictusCommon: her collect template (collect-c6b, +# plural Virgins and Martyrs) has no other member on this app's calendar +# to cross-verify a shared P/T/S/N/Benedictus text against, and she can +# never be queried directly herself (never the day's own winner) -- rather +# than guess she shares common-of-a-virgin's singular text (2026-08's +# live-verified category, built from St. Justina/St. Emerentiana/ +# St. Praxedes/St. Martha, all singular), left unset, same "honestly +# missing" convention as every other unauthored fallback in this codebase. +# Moot in practice: a commemoration's minor hours are never rendered +# anyway (resolveOfficeWinner only ever returns the day's actual winner). id: ss-ursula-and-companions name: "Ss. Ursula and Companions, Virgins and Martyrs" rank: simplex diff --git a/src/data/calendar/saints/st-alexius.yml b/src/data/calendar/saints/st-alexius.yml index ccfd000..54e0444 100644 --- a/src/data/calendar/saints/st-alexius.yml +++ b/src/data/calendar/saints/st-alexius.yml @@ -12,3 +12,5 @@ collectCommon: collect-c5 collectName: la: ["Aléxii"] en: ["Alexis"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-ambrose.yml b/src/data/calendar/saints/st-ambrose.yml index d1cd928..8ad5e99 100644 --- a/src/data/calendar/saints/st-ambrose.yml +++ b/src/data/calendar/saints/st-ambrose.yml @@ -14,3 +14,5 @@ collectCommon: collect-c4a collectName: la: ["Ambrósium"] en: ["Ambrose"] +minorHoursCommon: common-of-a-confessor-bishop +benedictusCommon: common-of-a-confessor-bishop diff --git a/src/data/calendar/saints/st-anacletus.yml b/src/data/calendar/saints/st-anacletus.yml index cb3a2da..78719a7 100644 --- a/src/data/calendar/saints/st-anacletus.yml +++ b/src/data/calendar/saints/st-anacletus.yml @@ -11,3 +11,5 @@ collectCommon: collect-c2b collectName: la: ["Anaclétum"] en: ["Anacletus"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-anicetus.yml b/src/data/calendar/saints/st-anicetus.yml index f84df14..0b6efd1 100644 --- a/src/data/calendar/saints/st-anicetus.yml +++ b/src/data/calendar/saints/st-anicetus.yml @@ -10,3 +10,5 @@ collectCommon: collect-c2b collectName: la: ["Anicétum"] en: ["Anciet"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-anthony-abbot.yml b/src/data/calendar/saints/st-anthony-abbot.yml index cf12ec5..50ecf56 100644 --- a/src/data/calendar/saints/st-anthony-abbot.yml +++ b/src/data/calendar/saints/st-anthony-abbot.yml @@ -14,3 +14,5 @@ collectCommon: collect-c5b collectName: la: ["Antónii"] en: ["Anthony"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-barbara.yml b/src/data/calendar/saints/st-barbara.yml index 144f4e0..3f059cf 100644 --- a/src/data/calendar/saints/st-barbara.yml +++ b/src/data/calendar/saints/st-barbara.yml @@ -15,3 +15,5 @@ collectCommon: collect-c6 collectName: la: ["Bárbaræ"] en: ["Barbara"] +minorHoursCommon: common-of-a-virgin +benedictusCommon: common-of-a-virgin diff --git a/src/data/calendar/saints/st-blaise.yml b/src/data/calendar/saints/st-blaise.yml index e3670b7..6071a59 100644 --- a/src/data/calendar/saints/st-blaise.yml +++ b/src/data/calendar/saints/st-blaise.yml @@ -14,3 +14,5 @@ collectCommon: collect-c2-1 collectName: la: [Blásii] en: [Blaise] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-bonaventure.yml b/src/data/calendar/saints/st-bonaventure.yml index 86c2b1b..9022bd8 100644 --- a/src/data/calendar/saints/st-bonaventure.yml +++ b/src/data/calendar/saints/st-bonaventure.yml @@ -11,3 +11,5 @@ collectCommon: collect-c4a collectName: la: ["Bonaventúram"] en: ["Bonaventure"] +minorHoursCommon: common-of-a-confessor-bishop +benedictusCommon: common-of-a-confessor-bishop diff --git a/src/data/calendar/saints/st-christina.yml b/src/data/calendar/saints/st-christina.yml index 2a8e65b..cf1402a 100644 --- a/src/data/calendar/saints/st-christina.yml +++ b/src/data/calendar/saints/st-christina.yml @@ -16,3 +16,5 @@ collectCommon: collect-c6-1 collectName: la: ["Christína"] en: ["Christina"] +minorHoursCommon: common-of-a-virgin +benedictusCommon: common-of-a-virgin diff --git a/src/data/calendar/saints/st-christopher.yml b/src/data/calendar/saints/st-christopher.yml index 040f668..e4f8f96 100644 --- a/src/data/calendar/saints/st-christopher.yml +++ b/src/data/calendar/saints/st-christopher.yml @@ -16,3 +16,5 @@ collectCommon: collect-c2a collectName: la: ["Christóphori"] en: ["Christopher"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-emerentiana.yml b/src/data/calendar/saints/st-emerentiana.yml index f99d659..27c02ef 100644 --- a/src/data/calendar/saints/st-emerentiana.yml +++ b/src/data/calendar/saints/st-emerentiana.yml @@ -14,3 +14,5 @@ collectCommon: collect-c6-1 collectName: la: ["Emerentiána"] en: ["Emerentiana"] +minorHoursCommon: common-of-a-virgin +benedictusCommon: common-of-a-virgin diff --git a/src/data/calendar/saints/st-emilian.yml b/src/data/calendar/saints/st-emilian.yml index 6e8b23a..ae0ebf5 100644 --- a/src/data/calendar/saints/st-emilian.yml +++ b/src/data/calendar/saints/st-emilian.yml @@ -16,3 +16,5 @@ collectCommon: collect-c5b collectName: la: ["Æmiliani"] en: ["Emilian"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-eusebius-of-vercelli.yml b/src/data/calendar/saints/st-eusebius-of-vercelli.yml index 8641bd7..f5eff67 100644 --- a/src/data/calendar/saints/st-eusebius-of-vercelli.yml +++ b/src/data/calendar/saints/st-eusebius-of-vercelli.yml @@ -18,3 +18,5 @@ collectCommon: collect-c2-1 collectName: la: ["Eusébii"] en: ["Eusebius"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-evaristus.yml b/src/data/calendar/saints/st-evaristus.yml index c5b15ea..fc53732 100644 --- a/src/data/calendar/saints/st-evaristus.yml +++ b/src/data/calendar/saints/st-evaristus.yml @@ -11,3 +11,5 @@ collectCommon: collect-c2b collectName: la: ["Evarístum"] en: ["Evaristus"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-felix-i.yml b/src/data/calendar/saints/st-felix-i.yml index 1ffa467..ba4dee8 100644 --- a/src/data/calendar/saints/st-felix-i.yml +++ b/src/data/calendar/saints/st-felix-i.yml @@ -10,3 +10,5 @@ collectCommon: collect-c2b collectName: la: ["Felícem"] en: ["Felix"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-gall.yml b/src/data/calendar/saints/st-gall.yml index ff02300..b4aa9e8 100644 --- a/src/data/calendar/saints/st-gall.yml +++ b/src/data/calendar/saints/st-gall.yml @@ -16,3 +16,5 @@ collectCommon: collect-c5b collectName: la: ["Galli"] en: ["Gall"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-giles.yml b/src/data/calendar/saints/st-giles.yml index 320290e..a27779a 100644 --- a/src/data/calendar/saints/st-giles.yml +++ b/src/data/calendar/saints/st-giles.yml @@ -12,3 +12,5 @@ collectCommon: collect-c5b collectName: la: ["Ægídii"] en: ["Giles"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-gregory-nazianzen.yml b/src/data/calendar/saints/st-gregory-nazianzen.yml index 550aae9..675e9e6 100644 --- a/src/data/calendar/saints/st-gregory-nazianzen.yml +++ b/src/data/calendar/saints/st-gregory-nazianzen.yml @@ -11,3 +11,5 @@ collectCommon: collect-c4a collectName: la: ["Gregorii Nazianzéni"] en: ["Gregory Nazianzen"] +minorHoursCommon: common-of-a-confessor-bishop +benedictusCommon: common-of-a-confessor-bishop diff --git a/src/data/calendar/saints/st-gregory-thaumaturgus.yml b/src/data/calendar/saints/st-gregory-thaumaturgus.yml index 7a3a5d3..d39d4ec 100644 --- a/src/data/calendar/saints/st-gregory-thaumaturgus.yml +++ b/src/data/calendar/saints/st-gregory-thaumaturgus.yml @@ -11,3 +11,5 @@ collectCommon: collect-c4 collectName: la: ["Gregórii"] en: ["Gregory"] +minorHoursCommon: common-of-a-confessor-bishop +benedictusCommon: common-of-a-confessor-bishop diff --git a/src/data/calendar/saints/st-hadrian.yml b/src/data/calendar/saints/st-hadrian.yml index f547052..5b5adfc 100644 --- a/src/data/calendar/saints/st-hadrian.yml +++ b/src/data/calendar/saints/st-hadrian.yml @@ -16,3 +16,5 @@ collectCommon: collect-c2a collectName: la: ["Hadriáni"] en: ["Adrian"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-hilarion.yml b/src/data/calendar/saints/st-hilarion.yml index ec10655..1e4306e 100644 --- a/src/data/calendar/saints/st-hilarion.yml +++ b/src/data/calendar/saints/st-hilarion.yml @@ -12,3 +12,5 @@ collectCommon: collect-c5b collectName: la: ["Hilariónis"] en: ["Hilarion"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-hyginus.yml b/src/data/calendar/saints/st-hyginus.yml index 3126b7b..77c8711 100644 --- a/src/data/calendar/saints/st-hyginus.yml +++ b/src/data/calendar/saints/st-hyginus.yml @@ -14,3 +14,5 @@ collectCommon: collect-c2b collectName: la: ["Hygínum"] en: ["Hyginus"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-ignatius-of-antioch.yml b/src/data/calendar/saints/st-ignatius-of-antioch.yml index 994b25b..a82a5be 100644 --- a/src/data/calendar/saints/st-ignatius-of-antioch.yml +++ b/src/data/calendar/saints/st-ignatius-of-antioch.yml @@ -13,3 +13,5 @@ collectCommon: collect-c2 collectName: la: ["Ignátii"] en: ["Ignatius"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-januarius.yml b/src/data/calendar/saints/st-januarius.yml index cf14299..37e74df 100644 --- a/src/data/calendar/saints/st-januarius.yml +++ b/src/data/calendar/saints/st-januarius.yml @@ -13,3 +13,5 @@ collectCommon: collect-c3a-1 collectName: la: ["Januárii", "Sociórum ejus"] en: ["Januarius", "companions"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-john-gualbert.yml b/src/data/calendar/saints/st-john-gualbert.yml index 1e5b83b..9708255 100644 --- a/src/data/calendar/saints/st-john-gualbert.yml +++ b/src/data/calendar/saints/st-john-gualbert.yml @@ -12,3 +12,5 @@ collectCommon: collect-c5b collectName: la: ["Joánnis"] en: ["John"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-justina.yml b/src/data/calendar/saints/st-justina.yml index b1e4ebf..6742baa 100644 --- a/src/data/calendar/saints/st-justina.yml +++ b/src/data/calendar/saints/st-justina.yml @@ -18,3 +18,5 @@ collectCommon: collect-c6 collectName: la: ["Justinæ"] en: ["Justina"] +minorHoursCommon: common-of-a-virgin +benedictusCommon: common-of-a-virgin diff --git a/src/data/calendar/saints/st-liborius.yml b/src/data/calendar/saints/st-liborius.yml index 03c9dfb..2a7b5e6 100644 --- a/src/data/calendar/saints/st-liborius.yml +++ b/src/data/calendar/saints/st-liborius.yml @@ -16,3 +16,5 @@ collectCommon: collect-c4 collectName: la: ["Libórii"] en: ["Liborius"] +minorHoursCommon: common-of-a-confessor-bishop +benedictusCommon: common-of-a-confessor-bishop diff --git a/src/data/calendar/saints/st-linus.yml b/src/data/calendar/saints/st-linus.yml index eb461f1..79e6047 100644 --- a/src/data/calendar/saints/st-linus.yml +++ b/src/data/calendar/saints/st-linus.yml @@ -11,3 +11,5 @@ collectCommon: collect-c2b collectName: la: ["Linum"] en: ["Linus"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-martha.yml b/src/data/calendar/saints/st-martha.yml index 995856e..bd0a82f 100644 --- a/src/data/calendar/saints/st-martha.yml +++ b/src/data/calendar/saints/st-martha.yml @@ -19,3 +19,5 @@ collectCommon: collect-c6a collectName: la: ["Marthæ"] en: ["Martha"] +minorHoursCommon: common-of-a-virgin +benedictusCommon: common-of-a-virgin diff --git a/src/data/calendar/saints/st-martin-i.yml b/src/data/calendar/saints/st-martin-i.yml index 7dd54ab..42384cc 100644 --- a/src/data/calendar/saints/st-martin-i.yml +++ b/src/data/calendar/saints/st-martin-i.yml @@ -17,3 +17,5 @@ collectCommon: collect-c2b collectName: la: ["Martínum"] en: ["Martin"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-maurus-abbot.yml b/src/data/calendar/saints/st-maurus-abbot.yml index 35b2847..b6e9899 100644 --- a/src/data/calendar/saints/st-maurus-abbot.yml +++ b/src/data/calendar/saints/st-maurus-abbot.yml @@ -13,3 +13,5 @@ collectCommon: collect-c5b collectName: la: ["Mauri"] en: ["Maurus"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-melchiades.yml b/src/data/calendar/saints/st-melchiades.yml index 74bb177..873744e 100644 --- a/src/data/calendar/saints/st-melchiades.yml +++ b/src/data/calendar/saints/st-melchiades.yml @@ -12,3 +12,5 @@ collectCommon: collect-c2b collectName: la: ["Melchíadem"] en: ["Melchiades"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-menna.yml b/src/data/calendar/saints/st-menna.yml index 7293eeb..ae1d430 100644 --- a/src/data/calendar/saints/st-menna.yml +++ b/src/data/calendar/saints/st-menna.yml @@ -11,3 +11,5 @@ collectCommon: collect-c2a collectName: la: ["Mennæ"] en: ["Menna"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-nicholas-of-tolentino.yml b/src/data/calendar/saints/st-nicholas-of-tolentino.yml index 413ea3c..906dc1b 100644 --- a/src/data/calendar/saints/st-nicholas-of-tolentino.yml +++ b/src/data/calendar/saints/st-nicholas-of-tolentino.yml @@ -17,3 +17,5 @@ collectCommon: collect-c5-1 collectName: la: ["Nicolái"] en: ["Nicolaus"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-odo.yml b/src/data/calendar/saints/st-odo.yml index fa5e74d..9bc71d4 100644 --- a/src/data/calendar/saints/st-odo.yml +++ b/src/data/calendar/saints/st-odo.yml @@ -16,3 +16,5 @@ collectCommon: collect-c5b collectName: la: ["Odónis"] en: ["Odo"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-pantaleon.yml b/src/data/calendar/saints/st-pantaleon.yml index b047332..e8f785c 100644 --- a/src/data/calendar/saints/st-pantaleon.yml +++ b/src/data/calendar/saints/st-pantaleon.yml @@ -10,3 +10,5 @@ collectCommon: collect-c2a-1 collectName: la: ["Pantaleóne"] en: ["Pantaleon"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-peter-of-alexandria.yml b/src/data/calendar/saints/st-peter-of-alexandria.yml index 18defff..8f17a95 100644 --- a/src/data/calendar/saints/st-peter-of-alexandria.yml +++ b/src/data/calendar/saints/st-peter-of-alexandria.yml @@ -13,3 +13,5 @@ collectCommon: collect-c2 collectName: la: ["Petri"] en: ["Peter"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-pius-i.yml b/src/data/calendar/saints/st-pius-i.yml index c9dd026..7d45bc5 100644 --- a/src/data/calendar/saints/st-pius-i.yml +++ b/src/data/calendar/saints/st-pius-i.yml @@ -10,3 +10,5 @@ collectCommon: collect-c2b collectName: la: ["Pii"] en: ["Pius"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-polycarp.yml b/src/data/calendar/saints/st-polycarp.yml index 1cd5fdd..815788f 100644 --- a/src/data/calendar/saints/st-polycarp.yml +++ b/src/data/calendar/saints/st-polycarp.yml @@ -11,3 +11,5 @@ collectCommon: collect-c2-1 collectName: la: ["Polycárpi"] en: ["Polycarp"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-pontian.yml b/src/data/calendar/saints/st-pontian.yml index 0828e9b..5142791 100644 --- a/src/data/calendar/saints/st-pontian.yml +++ b/src/data/calendar/saints/st-pontian.yml @@ -12,3 +12,5 @@ collectCommon: collect-c2b collectName: la: ["Pontiánum"] en: ["Pontianus"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-praxedes.yml b/src/data/calendar/saints/st-praxedes.yml index 77d9e65..0c7204f 100644 --- a/src/data/calendar/saints/st-praxedes.yml +++ b/src/data/calendar/saints/st-praxedes.yml @@ -12,3 +12,5 @@ collectCommon: collect-c6a collectName: la: ["Praxédis"] en: ["Praxedes"] +minorHoursCommon: common-of-a-virgin +benedictusCommon: common-of-a-virgin diff --git a/src/data/calendar/saints/st-pudentiana.yml b/src/data/calendar/saints/st-pudentiana.yml index a2a6793..43f04ef 100644 --- a/src/data/calendar/saints/st-pudentiana.yml +++ b/src/data/calendar/saints/st-pudentiana.yml @@ -16,3 +16,5 @@ collectCommon: collect-c6a collectName: la: ["Pudentiánæ"] en: ["Pudentiana"] +minorHoursCommon: common-of-a-virgin +benedictusCommon: common-of-a-virgin diff --git a/src/data/calendar/saints/st-remigius.yml b/src/data/calendar/saints/st-remigius.yml index a25e845..6873f4e 100644 --- a/src/data/calendar/saints/st-remigius.yml +++ b/src/data/calendar/saints/st-remigius.yml @@ -11,3 +11,5 @@ collectCommon: collect-c4 collectName: la: ["Remígii"] en: ["Remigius"] +minorHoursCommon: common-of-a-confessor-bishop +benedictusCommon: common-of-a-confessor-bishop diff --git a/src/data/calendar/saints/st-romanus-abbot.yml b/src/data/calendar/saints/st-romanus-abbot.yml index 6038674..34bb96b 100644 --- a/src/data/calendar/saints/st-romanus-abbot.yml +++ b/src/data/calendar/saints/st-romanus-abbot.yml @@ -12,3 +12,5 @@ collectCommon: collect-c5b collectName: la: ["Románi"] en: ["Romanus"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-romanus.yml b/src/data/calendar/saints/st-romanus.yml index 5b7e336..6a28602 100644 --- a/src/data/calendar/saints/st-romanus.yml +++ b/src/data/calendar/saints/st-romanus.yml @@ -19,3 +19,5 @@ collectCommon: collect-c2a-1 collectName: la: ["Románo"] en: ["Romanus"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-romuald.yml b/src/data/calendar/saints/st-romuald.yml index 885c27f..af32e7d 100644 --- a/src/data/calendar/saints/st-romuald.yml +++ b/src/data/calendar/saints/st-romuald.yml @@ -10,3 +10,5 @@ collectCommon: collect-c5 collectName: la: ["Romuáldi"] en: ["Romuald"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-sabbas.yml b/src/data/calendar/saints/st-sabbas.yml index 35f9fd7..542caa2 100644 --- a/src/data/calendar/saints/st-sabbas.yml +++ b/src/data/calendar/saints/st-sabbas.yml @@ -12,3 +12,5 @@ collectCommon: collect-c5b collectName: la: ["Sabbæ"] en: ["Sabbas"] +minorHoursCommon: common-of-an-abbot +benedictusCommon: common-of-an-abbot diff --git a/src/data/calendar/saints/st-sabina.yml b/src/data/calendar/saints/st-sabina.yml index 1f8a670..fc7ebc6 100644 --- a/src/data/calendar/saints/st-sabina.yml +++ b/src/data/calendar/saints/st-sabina.yml @@ -12,3 +12,5 @@ collectCommon: collect-c6 collectName: la: ["Sabínæ"] en: ["Sabina"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-silverius.yml b/src/data/calendar/saints/st-silverius.yml index 6e1be67..7d49f5b 100644 --- a/src/data/calendar/saints/st-silverius.yml +++ b/src/data/calendar/saints/st-silverius.yml @@ -10,3 +10,5 @@ collectCommon: collect-c2b collectName: la: ["Silvérii"] en: ["Silverius"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-silvester-i.yml b/src/data/calendar/saints/st-silvester-i.yml index 84b9e60..d1b31ba 100644 --- a/src/data/calendar/saints/st-silvester-i.yml +++ b/src/data/calendar/saints/st-silvester-i.yml @@ -14,3 +14,5 @@ collectCommon: collect-c4 collectName: la: ["Silvéstri"] en: ["Sylvester"] +minorHoursCommon: common-of-a-confessor-bishop +benedictusCommon: common-of-a-confessor-bishop diff --git a/src/data/calendar/saints/st-simeon.yml b/src/data/calendar/saints/st-simeon.yml index 398e9a9..97ab210 100644 --- a/src/data/calendar/saints/st-simeon.yml +++ b/src/data/calendar/saints/st-simeon.yml @@ -10,3 +10,5 @@ collectCommon: collect-c2 collectName: la: ["Simeónis"] en: ["Simeon"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-stephen-i.yml b/src/data/calendar/saints/st-stephen-i.yml index bfd1632..2e9b6c6 100644 --- a/src/data/calendar/saints/st-stephen-i.yml +++ b/src/data/calendar/saints/st-stephen-i.yml @@ -20,3 +20,5 @@ collectCommon: collect-c2b collectName: la: ["Stéphanum"] en: ["Stephen"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-telesphorus.yml b/src/data/calendar/saints/st-telesphorus.yml index b331f7d..48f04c4 100644 --- a/src/data/calendar/saints/st-telesphorus.yml +++ b/src/data/calendar/saints/st-telesphorus.yml @@ -14,3 +14,5 @@ collectCommon: collect-c2b collectName: la: ["Telésphorum"] en: ["Telesphorus"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/st-timothy.yml b/src/data/calendar/saints/st-timothy.yml index 0809840..10b3201 100644 --- a/src/data/calendar/saints/st-timothy.yml +++ b/src/data/calendar/saints/st-timothy.yml @@ -11,3 +11,5 @@ collectCommon: collect-c2 collectName: la: ["Timóthei"] en: ["Timothy"] +minorHoursCommon: common-of-a-martyr +benedictusCommon: common-of-a-martyr diff --git a/src/data/calendar/saints/vigil-of-st-andrew.yml b/src/data/calendar/saints/vigil-of-st-andrew.yml index 4d19357..c864c4c 100644 --- a/src/data/calendar/saints/vigil-of-st-andrew.yml +++ b/src/data/calendar/saints/vigil-of-st-andrew.yml @@ -12,3 +12,5 @@ collectCommon: collect-c1v collectName: la: ["Andreas"] en: ["Andrew"] +minorHoursCommon: common-of-a-vigil +benedictusCommon: common-of-a-vigil diff --git a/src/data/calendar/saints/vigil-of-st-bartholomew.yml b/src/data/calendar/saints/vigil-of-st-bartholomew.yml index b61abe2..184c16b 100644 --- a/src/data/calendar/saints/vigil-of-st-bartholomew.yml +++ b/src/data/calendar/saints/vigil-of-st-bartholomew.yml @@ -14,3 +14,5 @@ collectCommon: collect-c1v collectName: la: ["Bartholomǽi"] en: ["Bartholomeus"] +minorHoursCommon: common-of-a-vigil +benedictusCommon: common-of-a-vigil diff --git a/src/data/calendar/saints/vigil-of-st-james.yml b/src/data/calendar/saints/vigil-of-st-james.yml index 92a3ea5..692bc50 100644 --- a/src/data/calendar/saints/vigil-of-st-james.yml +++ b/src/data/calendar/saints/vigil-of-st-james.yml @@ -12,3 +12,5 @@ collectCommon: collect-c1v collectName: la: ["Jacóbi"] en: ["James"] +minorHoursCommon: common-of-a-vigil +benedictusCommon: common-of-a-vigil diff --git a/src/data/calendar/saints/vigil-of-st-matthew.yml b/src/data/calendar/saints/vigil-of-st-matthew.yml index 0419be9..5b2ddd9 100644 --- a/src/data/calendar/saints/vigil-of-st-matthew.yml +++ b/src/data/calendar/saints/vigil-of-st-matthew.yml @@ -19,3 +19,5 @@ collectCommon: collect-c1v collectName: la: ["Matthǽi"] en: ["Matthew"] +minorHoursCommon: common-of-a-vigil +benedictusCommon: common-of-a-vigil diff --git a/src/data/calendar/saints/vigil-of-st-matthias.yml b/src/data/calendar/saints/vigil-of-st-matthias.yml index 510fd8a..0f053f7 100644 --- a/src/data/calendar/saints/vigil-of-st-matthias.yml +++ b/src/data/calendar/saints/vigil-of-st-matthias.yml @@ -13,3 +13,5 @@ collectCommon: collect-c1v collectName: la: ["Matthíæ"] en: ["Matthias"] +minorHoursCommon: common-of-a-vigil +benedictusCommon: common-of-a-vigil diff --git a/src/data/calendar/saints/vigil-of-st-thomas.yml b/src/data/calendar/saints/vigil-of-st-thomas.yml index c13aab8..a9aac12 100644 --- a/src/data/calendar/saints/vigil-of-st-thomas.yml +++ b/src/data/calendar/saints/vigil-of-st-thomas.yml @@ -17,3 +17,5 @@ collectCommon: collect-c1v collectName: la: ["Thomæ"] en: ["Thomas"] +minorHoursCommon: common-of-a-vigil +benedictusCommon: common-of-a-vigil diff --git a/src/data/propers/common/benedictus-antiphon-common-of-a-confessor-bishop.yml b/src/data/propers/common/benedictus-antiphon-common-of-a-confessor-bishop.yml new file mode 100644 index 0000000..ac99a64 --- /dev/null +++ b/src/data/propers/common/benedictus-antiphon-common-of-a-confessor-bishop.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# live query (St. Gregory Thaumaturgus, 11-17-2025) -- confirms this +# saint's P/T/S/N also matches the already-authored +# {prime,terce,sext,none}-{antiphon,capitulum}-common-of-a-confessor- +# bishop.yml files (from the original 29-saint pass, extracted from Chair +# of St. Peter/St. Martin of Tours) -- no Benedictus-antiphon fallback +# existed yet for this Common, since both of those saints have their own +# proper Lauds antiphon. +id: benedictus-antiphon-common-of-a-confessor-bishop +text: + la: "Euge, serve bone * et fidélis, quia in pauca fuísti fidélis, supra multa te constítuam, dicit Dóminus." + en: "Well done, thou good and faithful servant * thou hast been faithful over a few things, I will make thee ruler over many things, saith the Lord." +status: + la: verified + en: verified diff --git a/src/data/propers/common/benedictus-antiphon-common-of-a-dedication.yml b/src/data/propers/common/benedictus-antiphon-common-of-a-dedication.yml new file mode 100644 index 0000000..289b672 --- /dev/null +++ b/src/data/propers/common/benedictus-antiphon-common-of-a-dedication.yml @@ -0,0 +1,21 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# query (Dedication of the Basilicas of Ss. Peter and Paul, 11-18-2025) -- +# common-of-a-dedication. For the Dedication of a Church (Commune/C8.txt) +# -- currently only one saint on this app's calendar uses it. +# `SaintRecord.common` calls it `common-of-an-apostle` (Peter and Paul's +# own basilicas), but its actual P/T/S/N and Benedictus antiphon draw +# from the Dedication Common instead (about the building, not the +# apostles) -- confirmed live, not assumed from the collect's own +# `collect-c8`. No embedded "*": this feast is Duplex (double-or-higher), +# so its own query shows the antiphon in full at both open and close with +# no separate incipit marker -- correct as-is for its only current user, +# but worth reconstructing from a lower-rank source if this Common ever +# gains a Simplex/Semiduplex member (see the analogous fix in +# benedictus-antiphon-common-of-an-abbot.yml/-a-virgin.yml). +id: benedictus-antiphon-common-of-a-dedication +text: + la: "Zachǽe, festínans descénde, quia hódie in domo tua opórtet me manére. At ille festínans descéndit, et suscépit illum gaudens in domum suam. Hódie huic dómui salus a Deo facta est, allelúja." + en: "Zacchaeus, make haste and come down, for today I must abide at thy house. And he made haste and came down, and received Him joyfully into his house. This day is salvation come from God to this house. Alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/benedictus-antiphon-common-of-a-martyr.yml b/src/data/propers/common/benedictus-antiphon-common-of-a-martyr.yml new file mode 100644 index 0000000..eeff090 --- /dev/null +++ b/src/data/propers/common/benedictus-antiphon-common-of-a-martyr.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Anacletus, 07-13-2028) -- common-of-a-martyr. +# Covers both `common-of-a-martyr-bishop` and `common-of-a-martyr` +# saints (SaintRecord.common) -- live-verified identical P/T/S/N across +# both (the Bishop/non-Bishop distinction only affects the collect's +# own wording, not these Scripture-antiphons), cross-checked against +# St. Anicetus/St. Simeon/St. Blaise/St. Pantaleon. +id: benedictus-antiphon-common-of-a-martyr +text: + la: "Qui odit * ánimam suam in hoc mundo, in vitam ætérnam custódit eam." + en: "He that hateth his life * in this world, shall keep it unto life eternal." +status: + la: verified + en: verified diff --git a/src/data/propers/common/benedictus-antiphon-common-of-a-vigil.yml b/src/data/propers/common/benedictus-antiphon-common-of-a-vigil.yml new file mode 100644 index 0000000..4423f2e --- /dev/null +++ b/src/data/propers/common/benedictus-antiphon-common-of-a-vigil.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Vigil of St. Andrew, 11-29-2025) -- common-of-a-vigil. +# Shared by all 6 vigils on this app's calendar (Andrew, Bartholomew, +# James, Matthew, Matthias, Thomas) -- cross-checked against the +# Vigil of St. Bartholomew. +id: benedictus-antiphon-common-of-a-vigil +text: + la: "Illumináre, Dómine, * his qui in ténebris sedent: et dírige pedes nostros in viam pacis, Deus Israël." + en: "O Lord, give light * to those who sit in darkness and in the shadow of death, and guide our feet into the way of peace." +status: + la: verified + en: verified diff --git a/src/data/propers/common/benedictus-antiphon-common-of-a-virgin.yml b/src/data/propers/common/benedictus-antiphon-common-of-a-virgin.yml new file mode 100644 index 0000000..12f6165 --- /dev/null +++ b/src/data/propers/common/benedictus-antiphon-common-of-a-virgin.yml @@ -0,0 +1,22 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Justina, 10-07-2025) -- common-of-a-virgin. +# Covers `common-of-a-virgin-martyr`, `common-of-a-virgin`, and +# `common-of-a-holy-woman` saints (SaintRecord.common) -- live- +# verified identical P/T/S/N across all three (the Martyr/non-Martyr +# distinction only affects the collect's own wording), cross-checked +# against St. Emerentiana, St. Praxedes, and St. Martha (the sole +# `common-of-a-holy-woman` saint -- her own collect uses the Virgin +# template `collect-c6a` too, same finding). +# Text taken from St. Emerentiana's own rendering, not St. Justina's: +# Justina is Duplex (double-or-higher), so her own query shows this +# antiphon in full at both open and close with no separate incipit +# marker -- Emerentiana (Simplex) renders the same underlying text with +# the incipit/full split visible, which is what splitAntiphon +# (hours/antiphon.ts) needs to find via the embedded "*". +id: benedictus-antiphon-common-of-a-virgin +text: + la: "Símile est regnum cælórum * hómini negotiatóri quærénti bonas margarítas: invénta una pretiósa, dedit ómnia sua, et comparávit eam." + en: "The kingdom of heaven is like unto a merchantman * seeking goodly pearls, who, when he had found one pearl of great price, went and sold all that he had, and bought it." +status: + la: verified + en: verified diff --git a/src/data/propers/common/benedictus-antiphon-common-of-an-abbot.yml b/src/data/propers/common/benedictus-antiphon-common-of-an-abbot.yml new file mode 100644 index 0000000..b085cbe --- /dev/null +++ b/src/data/propers/common/benedictus-antiphon-common-of-an-abbot.yml @@ -0,0 +1,20 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Odo, 11-19-2025) -- common-of-an-abbot. +# Covers `common-of-an-abbot`, `common-of-a-confessor-not-bishop`, and +# `common-of-a-confessor` saints (SaintRecord.common) -- live-verified +# identical P/T/S/N across all three (an Abbot is himself a Confessor; +# the "faithful servant" antiphons apply generically), cross-checked +# against St. John Gualbert/St. Nicholas of Tolentino/St. Alexius. +# Text taken from St. Alexius/St. Nicholas of Tolentino's own rendering, +# not St. Odo's: Odo is Duplex (double-or-higher), so his own query shows +# this antiphon in full at both open and close with no separate incipit +# marker -- Alexius/Nicholas (Simplex/Semiduplex) render the same +# underlying text with the incipit/full split visible, which is what +# splitAntiphon (hours/antiphon.ts) needs to find via the embedded "*". +id: benedictus-antiphon-common-of-an-abbot +text: + la: "Euge, serve bone * et fidélis, quia in pauca fuísti fidélis, supra multa te constítuam, intra in gáudium Dómini tui." + en: "Well done, thou good and faithful servant; * thou hast been faithful over a few things, I will make thee ruler over many things; enter thou into the joy of thy Lord." +status: + la: verified + en: verified diff --git a/src/data/propers/common/benedictus-antiphon-common-of-pope-martyrs.yml b/src/data/propers/common/benedictus-antiphon-common-of-pope-martyrs.yml new file mode 100644 index 0000000..da3bfde --- /dev/null +++ b/src/data/propers/common/benedictus-antiphon-common-of-pope-martyrs.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Soter and Caius, 04-22-2042) -- common-of-pope-martyrs. +# For groups of Pope-Martyrs specifically (Commune/C3b.txt) -- real, +# distinct alleluia-toned text, not just several-martyrs with extra +# words; cross-checked against Ss. Cletus and Marcellinus. +id: benedictus-antiphon-common-of-pope-martyrs +text: + la: "Fíliæ Jerúsalem, * veníte et vidéte Mártyres cum corónis, quibus coronávit eos Dóminus in die solemnitátis et lætítiæ, allelúja, allelúja." + en: "Daughters of Jerusalem, * come and see the crowned martyrs, the Lord crowned them in his solemnity and delight, alleluia, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/benedictus-antiphon-common-of-several-martyrs.yml b/src/data/propers/common/benedictus-antiphon-common-of-several-martyrs.yml new file mode 100644 index 0000000..b20cf0d --- /dev/null +++ b/src/data/propers/common/benedictus-antiphon-common-of-several-martyrs.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Faustinus and Jovita, 02-15-2038) -- common-of-several-martyrs. +# For groups of martyrs who are not Popes (see +# common-of-pope-martyrs.yml for that distinct, allelúja-toned set) -- +# cross-checked against Ss. Cornelius and Cyprian, Ss. Placid and +# Companions (a real Duplex II. classis feast, not just a stub -- +# confirms this fallback applies at any rank, per +# resolveMinorHourAntiphon's own "eligible, not gated" design). +id: benedictus-antiphon-common-of-several-martyrs +text: + la: "Vestri capílli cápitis * omnes numeráti sunt: nolíte timére: multis passéribus melióres estis vos." + en: "Even the very hairs of your head are all numbered: * fear not therefore; ye are of more value than many sparrows." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-antiphon-common-of-a-dedication.yml b/src/data/propers/common/none-antiphon-common-of-a-dedication.yml new file mode 100644 index 0000000..6238bf7 --- /dev/null +++ b/src/data/propers/common/none-antiphon-common-of-a-dedication.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (dedication of the basilicas of ss peter and paul, 11-18-2025) -- common-of-a-dedication. +# For the Dedication of a Church (Commune/C8.txt) -- currently only +# one saint on this app's calendar uses it. `SaintRecord.common` calls +# it `common-of-an-apostle` (Peter and Paul's own basilicas), but its +# actual P/T/S/N and Benedictus antiphon draw from the Dedication +# Common instead (about the building, not the apostles) -- confirmed +# live, not assumed from the collect's own `collect-c8`. +id: none-antiphon-common-of-a-dedication +text: + la: "Lápides pretiósi * omnes muri tui, et turres Jerúsalem gemmis ædificabúntur." + en: "All thy walls are of stones most precious, * and the towers of Jerusalem shall be built up with jewels." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-antiphon-common-of-a-martyr.yml b/src/data/propers/common/none-antiphon-common-of-a-martyr.yml new file mode 100644 index 0000000..81e6f5e --- /dev/null +++ b/src/data/propers/common/none-antiphon-common-of-a-martyr.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Anacletus, 07-13-2028) -- common-of-a-martyr. +# Covers both `common-of-a-martyr-bishop` and `common-of-a-martyr` +# saints (SaintRecord.common) -- live-verified identical P/T/S/N across +# both (the Bishop/non-Bishop distinction only affects the collect's +# own wording, not these Scripture-antiphons), cross-checked against +# St. Anicetus/St. Simeon/St. Blaise/St. Pantaleon. +id: none-antiphon-common-of-a-martyr +text: + la: "Volo Pater, * ut ubi ego sum, illic sit et miníster meus." + en: "Father, I will * that where I am, there shall also My servant be." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-antiphon-common-of-a-vigil.yml b/src/data/propers/common/none-antiphon-common-of-a-vigil.yml new file mode 100644 index 0000000..56395cf --- /dev/null +++ b/src/data/propers/common/none-antiphon-common-of-a-vigil.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Vigil of St. Andrew, 11-29-2025) -- common-of-a-vigil. +# Shared by all 6 vigils on this app's calendar (Andrew, Bartholomew, +# James, Matthew, Matthias, Thomas) -- cross-checked against the +# Vigil of St. Bartholomew. +id: none-antiphon-common-of-a-vigil +text: + la: "Beáti omnes, * qui timent Dóminum." + en: "Blessed are all they * that fear the Lord." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-antiphon-common-of-a-virgin.yml b/src/data/propers/common/none-antiphon-common-of-a-virgin.yml new file mode 100644 index 0000000..8172611 --- /dev/null +++ b/src/data/propers/common/none-antiphon-common-of-a-virgin.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Justina, 10-07-2025) -- common-of-a-virgin. +# Covers `common-of-a-virgin-martyr`, `common-of-a-virgin`, and +# `common-of-a-holy-woman` saints (SaintRecord.common) -- live- +# verified identical P/T/S/N across all three (the Martyr/non-Martyr +# distinction only affects the collect's own wording), cross-checked +# against St. Emerentiana, St. Praxedes, and St. Martha (the sole +# `common-of-a-holy-woman` saint -- her own collect uses the Virgin +# template `collect-c6a` too, same finding). +id: none-antiphon-common-of-a-virgin +text: + la: "Ista est speciósa * inter fílias Jerúsalem." + en: "She is beautiful * among the daughters of Jerusalem." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-antiphon-common-of-an-abbot.yml b/src/data/propers/common/none-antiphon-common-of-an-abbot.yml new file mode 100644 index 0000000..b4fabce --- /dev/null +++ b/src/data/propers/common/none-antiphon-common-of-an-abbot.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Odo, 11-19-2025) -- common-of-an-abbot. +# Covers `common-of-an-abbot`, `common-of-a-confessor-not-bishop`, and +# `common-of-a-confessor` saints (SaintRecord.common) -- live-verified +# identical P/T/S/N across all three (an Abbot is himself a Confessor; +# the "faithful servant" antiphons apply generically), cross-checked +# against St. John Gualbert/St. Nicholas of Tolentino/St. Alexius. +id: none-antiphon-common-of-an-abbot +text: + la: "Serve bone * et fidélis, intra in gáudium Dómini tui." + en: "Thou good and faithful servant, * enter thou into the joy of thy Lord." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-antiphon-common-of-pope-martyrs.yml b/src/data/propers/common/none-antiphon-common-of-pope-martyrs.yml new file mode 100644 index 0000000..d66bc9e --- /dev/null +++ b/src/data/propers/common/none-antiphon-common-of-pope-martyrs.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Soter and Caius, 04-22-2042) -- common-of-pope-martyrs. +# For groups of Pope-Martyrs specifically (Commune/C3b.txt) -- real, +# distinct alleluia-toned text, not just several-martyrs with extra +# words; cross-checked against Ss. Cletus and Marcellinus. +id: none-antiphon-common-of-pope-martyrs +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-common-of-several-martyrs.yml b/src/data/propers/common/none-antiphon-common-of-several-martyrs.yml new file mode 100644 index 0000000..5585684 --- /dev/null +++ b/src/data/propers/common/none-antiphon-common-of-several-martyrs.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Faustinus and Jovita, 02-15-2038) -- common-of-several-martyrs. +# For groups of martyrs who are not Popes (see +# common-of-pope-martyrs.yml for that distinct, allelúja-toned set) -- +# cross-checked against Ss. Cornelius and Cyprian, Ss. Placid and +# Companions (a real Duplex II. classis feast, not just a stub -- +# confirms this fallback applies at any rank, per +# resolveMinorHourAntiphon's own "eligible, not gated" design). +id: none-antiphon-common-of-several-martyrs +text: + la: "Mártyrum chorus * laudáte Dóminum de cælis, allelúja." + en: "O ye Martyrs, * praise ye the Lord from the heavens, praise Him with the dance, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-capitulum-common-of-a-dedication.yml b/src/data/propers/common/none-capitulum-common-of-a-dedication.yml new file mode 100644 index 0000000..4f86003 --- /dev/null +++ b/src/data/propers/common/none-capitulum-common-of-a-dedication.yml @@ -0,0 +1,18 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (dedication of the basilicas of ss peter and paul, 11-18-2025) -- common-of-a-dedication. +# For the Dedication of a Church (Commune/C8.txt) -- currently only +# one saint on this app's calendar uses it. `SaintRecord.common` calls +# it `common-of-an-apostle` (Peter and Paul's own basilicas), but its +# actual P/T/S/N and Benedictus antiphon draw from the Dedication +# Common instead (about the building, not the apostles) -- confirmed +# live, not assumed from the collect's own `collect-c8`. +id: none-capitulum-common-of-a-dedication +text: + la: "Et abstérget Deus omnem lácrimam ab óculis eórum: et mors ultra non erit, neque luctus, neque clamor, neque dolor erit ultra, quia prima abiérunt. Et dixit qui sedébat in throno: Ecce nova fácio ómnia. R. Deo grátias. V. Hæc est domus Dómini fírmiter ædificáta. R. Bene fundáta est supra firmam petram." + en: "And God shall wipe away all tears from their eyes, and there shall be no more death, neither sorrow, nor crying, neither shall there be any more pain; for the former things are passed away. And He That sat upon the throne said: Behold, I make all things new. R. Thanks be to God. V. This is the house of God, stoutly builded. R. Well founded upon a sure rock." +citation: + la: "Apo 21:4-5" + en: "Rev 21:4-4" +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-capitulum-common-of-a-martyr.yml b/src/data/propers/common/none-capitulum-common-of-a-martyr.yml new file mode 100644 index 0000000..369bb69 --- /dev/null +++ b/src/data/propers/common/none-capitulum-common-of-a-martyr.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Anacletus, 07-13-2028) -- common-of-a-martyr. +# Covers both `common-of-a-martyr-bishop` and `common-of-a-martyr` +# saints (SaintRecord.common) -- live-verified identical P/T/S/N across +# both (the Bishop/non-Bishop distinction only affects the collect's +# own wording, not these Scripture-antiphons), cross-checked against +# St. Anicetus/St. Simeon/St. Blaise/St. Pantaleon. +id: none-capitulum-common-of-a-martyr +text: + la: "Justus cor suum trádidit ad vigilándum dilúculo ad Dóminum, qui fecit illum, et in conspéctu Altíssimi deprecábitur. R. Deo grátias. V. Magna est glória ejus in salutári tuo. R. Glóriam et magnum decórem impónes super eum." + en: "He will give his heart to resort early to the Lord that made him, and he will pray in the sight of the most High. R. Thanks be to God. V. His glory is great in thy salvation. R. Honour and great majesty shalt Thou lay upon him." +citation: + la: "Sir 39:6" + en: "Sir 39:6" +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-capitulum-common-of-a-vigil.yml b/src/data/propers/common/none-capitulum-common-of-a-vigil.yml new file mode 100644 index 0000000..1d97bf2 --- /dev/null +++ b/src/data/propers/common/none-capitulum-common-of-a-vigil.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Vigil of St. Andrew, 11-29-2025) -- common-of-a-vigil. +# Shared by all 6 vigils on this app's calendar (Andrew, Bartholomew, +# James, Matthew, Matthias, Thomas) -- cross-checked against the +# Vigil of St. Bartholomew. +id: none-capitulum-common-of-a-vigil +text: + la: "Empti enim estis prétio magno. Glorificáte et portáte Deum in córpore vestro. R. Deo grátias. V. Ab occúltis meis munda me, Dómine. R. Et ab aliénis parce servo tuo." + en: "For you are bought with a great price. Glorify and bear God in your body. R. Thanks be to God. V. From my secret ones cleanse me, O Lord. R. And from those of others spare thy servant." +citation: + la: "1 Cor 6:20" + en: "1 Cor 6:20" +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-capitulum-common-of-a-virgin.yml b/src/data/propers/common/none-capitulum-common-of-a-virgin.yml new file mode 100644 index 0000000..3ddc6ad --- /dev/null +++ b/src/data/propers/common/none-capitulum-common-of-a-virgin.yml @@ -0,0 +1,19 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Justina, 10-07-2025) -- common-of-a-virgin. +# Covers `common-of-a-virgin-martyr`, `common-of-a-virgin`, and +# `common-of-a-holy-woman` saints (SaintRecord.common) -- live- +# verified identical P/T/S/N across all three (the Martyr/non-Martyr +# distinction only affects the collect's own wording), cross-checked +# against St. Emerentiana, St. Praxedes, and St. Martha (the sole +# `common-of-a-holy-woman` saint -- her own collect uses the Virgin +# template `collect-c6a` too, same finding). +id: none-capitulum-common-of-a-virgin +text: + la: "Dómine, Deus meus, exaltásti super terram habitatiónem meam, et pro morte defluénte deprecáta sum. Invocávi Dóminum, Patrem Dómini mei, ut non derelínquat me in die tribulatiónis meæ, et in témpore superbórum sine adjutório. R. Deo grátias. V. Elégit eam Deus, et præelégit eam. R. In tabernáculo suo habitáre facit eam." + en: "O Lord, my God thou hast exalted my dwelling place upon the earth and I have prayed for death to pass away. I called upon the Lord, the father of my Lord, that he would not leave me in the day of my trouble, and in the time of the proud without help. R. Thanks be to God. V. God hath chosen her, and fore-chosen her. R. He hath made her to dwell in His tabernacle." +citation: + la: "Sir 51:13-14" + en: "Sir 51:13-14" +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-capitulum-common-of-an-abbot.yml b/src/data/propers/common/none-capitulum-common-of-an-abbot.yml new file mode 100644 index 0000000..5dd93e9 --- /dev/null +++ b/src/data/propers/common/none-capitulum-common-of-an-abbot.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Odo, 11-19-2025) -- common-of-an-abbot. +# Covers `common-of-an-abbot`, `common-of-a-confessor-not-bishop`, and +# `common-of-a-confessor` saints (SaintRecord.common) -- live-verified +# identical P/T/S/N across all three (an Abbot is himself a Confessor; +# the "faithful servant" antiphons apply generically), cross-checked +# against St. John Gualbert/St. Nicholas of Tolentino/St. Alexius. +id: none-capitulum-common-of-an-abbot +text: + la: "Justum dedúxit Dóminus per vias rectas, et osténdit illi regnum Dei, et dedit illi sciéntiam sanctórum: honestávit illum in labóribus, et complévit labóres illíus. R. Deo grátias. V. Lex Dei ejus in corde ipsíus. R. Et non supplantabúntur gressus ejus." + en: "She conducted the just, when he fled from his brother's wrath, through the right ways, and showed him the kingdom of God, and gave him the knowledge of the holy things, made him honourable in his labours, and accomplished his labours. R. Thanks be to God. V. The law of his God is in his heart. R. None of his steps shall slide." +citation: + la: "Sap 10:10" + en: "Wis 10:10" +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-capitulum-common-of-pope-martyrs.yml b/src/data/propers/common/none-capitulum-common-of-pope-martyrs.yml new file mode 100644 index 0000000..bf30b97 --- /dev/null +++ b/src/data/propers/common/none-capitulum-common-of-pope-martyrs.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Soter and Caius, 04-22-2042) -- common-of-pope-martyrs. +# For groups of Pope-Martyrs specifically (Commune/C3b.txt) -- real, +# distinct alleluia-toned text, not just several-martyrs with extra +# words; cross-checked against Ss. Cletus and Marcellinus. +id: none-capitulum-common-of-pope-martyrs +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-common-of-several-martyrs.yml b/src/data/propers/common/none-capitulum-common-of-several-martyrs.yml new file mode 100644 index 0000000..c663207 --- /dev/null +++ b/src/data/propers/common/none-capitulum-common-of-several-martyrs.yml @@ -0,0 +1,18 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Faustinus and Jovita, 02-15-2038) -- common-of-several-martyrs. +# For groups of martyrs who are not Popes (see +# common-of-pope-martyrs.yml for that distinct, allelúja-toned set) -- +# cross-checked against Ss. Cornelius and Cyprian, Ss. Placid and +# Companions (a real Duplex II. classis feast, not just a stub -- +# confirms this fallback applies at any rank, per +# resolveMinorHourAntiphon's own "eligible, not gated" design). +id: none-capitulum-common-of-several-martyrs +text: + la: "Fulgébunt justi, et tamquam scintíllæ in arundinéto discúrrent. Judicábunt natiónes, et dominabúntur pópulis: et regnábit Dóminus illórum in perpétuum. R. Deo grátias. V. Justi autem in perpétuum vivent. R. Et apud Dóminum est merces eórum." + en: "The just shall shine, and shall run to and fro like sparks among the reeds. They shall judge nations, and rule over people, and their Lord shall reign for ever. R. Thanks be to God. V. The righteous live for evermore. R. Their reward also is with the Lord." +citation: + la: "Sap 3:7-8" + en: "Wis 3:7-8" +status: + la: verified + en: verified diff --git a/src/data/propers/common/prime-antiphon-common-of-a-dedication.yml b/src/data/propers/common/prime-antiphon-common-of-a-dedication.yml new file mode 100644 index 0000000..2235c32 --- /dev/null +++ b/src/data/propers/common/prime-antiphon-common-of-a-dedication.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (dedication of the basilicas of ss peter and paul, 11-18-2025) -- common-of-a-dedication. +# For the Dedication of a Church (Commune/C8.txt) -- currently only +# one saint on this app's calendar uses it. `SaintRecord.common` calls +# it `common-of-an-apostle` (Peter and Paul's own basilicas), but its +# actual P/T/S/N and Benedictus antiphon draw from the Dedication +# Common instead (about the building, not the apostles) -- confirmed +# live, not assumed from the collect's own `collect-c8`. +id: prime-antiphon-common-of-a-dedication +text: + la: "Domum tuam, Dómine, * decet sanctitúdo in longitúdinem diérum." + en: "Holiness becometh thine house, * O Lord, for ever." +status: + la: verified + en: verified diff --git a/src/data/propers/common/prime-antiphon-common-of-a-martyr.yml b/src/data/propers/common/prime-antiphon-common-of-a-martyr.yml new file mode 100644 index 0000000..c164a20 --- /dev/null +++ b/src/data/propers/common/prime-antiphon-common-of-a-martyr.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Anacletus, 07-13-2028) -- common-of-a-martyr. +# Covers both `common-of-a-martyr-bishop` and `common-of-a-martyr` +# saints (SaintRecord.common) -- live-verified identical P/T/S/N across +# both (the Bishop/non-Bishop distinction only affects the collect's +# own wording, not these Scripture-antiphons), cross-checked against +# St. Anicetus/St. Simeon/St. Blaise/St. Pantaleon. +id: prime-antiphon-common-of-a-martyr +text: + la: "Qui me conféssus fúerit * coram homínibus, confitébor et ego eum coram Patre meo." + en: "Whosoever shall confess Me * before men, him will I confess also before My Father." +status: + la: verified + en: verified diff --git a/src/data/propers/common/prime-antiphon-common-of-a-vigil.yml b/src/data/propers/common/prime-antiphon-common-of-a-vigil.yml new file mode 100644 index 0000000..0f14af9 --- /dev/null +++ b/src/data/propers/common/prime-antiphon-common-of-a-vigil.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Vigil of St. Andrew, 11-29-2025) -- common-of-a-vigil. +# Shared by all 6 vigils on this app's calendar (Andrew, Bartholomew, +# James, Matthew, Matthias, Thomas) -- cross-checked against the +# Vigil of St. Bartholomew. +id: prime-antiphon-common-of-a-vigil +text: + la: "Vivit Dóminus, * et benedíctus Deus salútis meæ." + en: "The Lord liveth, and blessed be my God, my salvation * ." +status: + la: verified + en: verified diff --git a/src/data/propers/common/prime-antiphon-common-of-a-virgin.yml b/src/data/propers/common/prime-antiphon-common-of-a-virgin.yml new file mode 100644 index 0000000..ea19f5c --- /dev/null +++ b/src/data/propers/common/prime-antiphon-common-of-a-virgin.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Justina, 10-07-2025) -- common-of-a-virgin. +# Covers `common-of-a-virgin-martyr`, `common-of-a-virgin`, and +# `common-of-a-holy-woman` saints (SaintRecord.common) -- live- +# verified identical P/T/S/N across all three (the Martyr/non-Martyr +# distinction only affects the collect's own wording), cross-checked +# against St. Emerentiana, St. Praxedes, and St. Martha (the sole +# `common-of-a-holy-woman` saint -- her own collect uses the Virgin +# template `collect-c6a` too, same finding). +id: prime-antiphon-common-of-a-virgin +text: + la: "Hæc est Virgo sápiens, * et una de número prudéntum." + en: "This is one of the wise virgins, * one chosen out of the number of the careful." +status: + la: verified + en: verified diff --git a/src/data/propers/common/prime-antiphon-common-of-an-abbot.yml b/src/data/propers/common/prime-antiphon-common-of-an-abbot.yml new file mode 100644 index 0000000..b39a9d5 --- /dev/null +++ b/src/data/propers/common/prime-antiphon-common-of-an-abbot.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Odo, 11-19-2025) -- common-of-an-abbot. +# Covers `common-of-an-abbot`, `common-of-a-confessor-not-bishop`, and +# `common-of-a-confessor` saints (SaintRecord.common) -- live-verified +# identical P/T/S/N across all three (an Abbot is himself a Confessor; +# the "faithful servant" antiphons apply generically), cross-checked +# against St. John Gualbert/St. Nicholas of Tolentino/St. Alexius. +id: prime-antiphon-common-of-an-abbot +text: + la: "Dómine, quinque talénta * tradidísti mihi, ecce ália quinque superlucrátus sum." + en: "Lord, Thou deliverest unto me five talents * behold, I have gained beside them five talents more." +status: + la: verified + en: verified diff --git a/src/data/propers/common/prime-antiphon-common-of-pope-martyrs.yml b/src/data/propers/common/prime-antiphon-common-of-pope-martyrs.yml new file mode 100644 index 0000000..2e83a18 --- /dev/null +++ b/src/data/propers/common/prime-antiphon-common-of-pope-martyrs.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Soter and Caius, 04-22-2042) -- common-of-pope-martyrs. +# For groups of Pope-Martyrs specifically (Commune/C3b.txt) -- real, +# distinct alleluia-toned text, not just several-martyrs with extra +# words; cross-checked against Ss. Cletus and Marcellinus. +id: prime-antiphon-common-of-pope-martyrs +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-common-of-several-martyrs.yml b/src/data/propers/common/prime-antiphon-common-of-several-martyrs.yml new file mode 100644 index 0000000..7140f89 --- /dev/null +++ b/src/data/propers/common/prime-antiphon-common-of-several-martyrs.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Faustinus and Jovita, 02-15-2038) -- common-of-several-martyrs. +# For groups of martyrs who are not Popes (see +# common-of-pope-martyrs.yml for that distinct, allelúja-toned set) -- +# cross-checked against Ss. Cornelius and Cyprian, Ss. Placid and +# Companions (a real Duplex II. classis feast, not just a stub -- +# confirms this fallback applies at any rank, per +# resolveMinorHourAntiphon's own "eligible, not gated" design). +id: prime-antiphon-common-of-several-martyrs +text: + la: "Omnes Sancti, * quanta passi sunt torménta, ut secúri pervenírent ad palmam martýrii." + en: "O how many torments have all the Saints suffered, * that they might attain safely unto the palm of martyrdom." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-antiphon-common-of-a-dedication.yml b/src/data/propers/common/sext-antiphon-common-of-a-dedication.yml new file mode 100644 index 0000000..3bd4789 --- /dev/null +++ b/src/data/propers/common/sext-antiphon-common-of-a-dedication.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (dedication of the basilicas of ss peter and paul, 11-18-2025) -- common-of-a-dedication. +# For the Dedication of a Church (Commune/C8.txt) -- currently only +# one saint on this app's calendar uses it. `SaintRecord.common` calls +# it `common-of-an-apostle` (Peter and Paul's own basilicas), but its +# actual P/T/S/N and Benedictus antiphon draw from the Dedication +# Common instead (about the building, not the apostles) -- confirmed +# live, not assumed from the collect's own `collect-c8`. +id: sext-antiphon-common-of-a-dedication +text: + la: "Hæc est domus Dómini * fírmiter ædificáta, bene fundáta est supra firmam petram." + en: "This is the Lord's house * stoutly builded, well founded upon a sure rock." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-antiphon-common-of-a-martyr.yml b/src/data/propers/common/sext-antiphon-common-of-a-martyr.yml new file mode 100644 index 0000000..72c904d --- /dev/null +++ b/src/data/propers/common/sext-antiphon-common-of-a-martyr.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Anacletus, 07-13-2028) -- common-of-a-martyr. +# Covers both `common-of-a-martyr-bishop` and `common-of-a-martyr` +# saints (SaintRecord.common) -- live-verified identical P/T/S/N across +# both (the Bishop/non-Bishop distinction only affects the collect's +# own wording, not these Scripture-antiphons), cross-checked against +# St. Anicetus/St. Simeon/St. Blaise/St. Pantaleon. +id: sext-antiphon-common-of-a-martyr +text: + la: "Qui mihi minístrat, * me sequátur: et ubi ego sum, illic sit et miníster meus." + en: "If any man serve Me, * let him follow Me and where I am, there shall also My servant be." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-antiphon-common-of-a-vigil.yml b/src/data/propers/common/sext-antiphon-common-of-a-vigil.yml new file mode 100644 index 0000000..47d2889 --- /dev/null +++ b/src/data/propers/common/sext-antiphon-common-of-a-vigil.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Vigil of St. Andrew, 11-29-2025) -- common-of-a-vigil. +# Shared by all 6 vigils on this app's calendar (Andrew, Bartholomew, +# James, Matthew, Matthias, Thomas) -- cross-checked against the +# Vigil of St. Bartholomew. +id: sext-antiphon-common-of-a-vigil +text: + la: "Qui hábitas * in cælis, miserére nobis." + en: "Who dwellest * in heaven, have mercy on us." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-antiphon-common-of-a-virgin.yml b/src/data/propers/common/sext-antiphon-common-of-a-virgin.yml new file mode 100644 index 0000000..fbb8dfa --- /dev/null +++ b/src/data/propers/common/sext-antiphon-common-of-a-virgin.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Justina, 10-07-2025) -- common-of-a-virgin. +# Covers `common-of-a-virgin-martyr`, `common-of-a-virgin`, and +# `common-of-a-holy-woman` saints (SaintRecord.common) -- live- +# verified identical P/T/S/N across all three (the Martyr/non-Martyr +# distinction only affects the collect's own wording), cross-checked +# against St. Emerentiana, St. Praxedes, and St. Martha (the sole +# `common-of-a-holy-woman` saint -- her own collect uses the Virgin +# template `collect-c6a` too, same finding). +id: sext-antiphon-common-of-a-virgin +text: + la: "Hæc est quæ nescívit * torum in delícto: habébit fructum in respectióne animárum sanctárum." + en: "This, is one which hath not known the sinful bed, * she shall have fruit in the visitation of holy souls." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-antiphon-common-of-an-abbot.yml b/src/data/propers/common/sext-antiphon-common-of-an-abbot.yml new file mode 100644 index 0000000..6929fa1 --- /dev/null +++ b/src/data/propers/common/sext-antiphon-common-of-an-abbot.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Odo, 11-19-2025) -- common-of-an-abbot. +# Covers `common-of-an-abbot`, `common-of-a-confessor-not-bishop`, and +# `common-of-a-confessor` saints (SaintRecord.common) -- live-verified +# identical P/T/S/N across all three (an Abbot is himself a Confessor; +# the "faithful servant" antiphons apply generically), cross-checked +# against St. John Gualbert/St. Nicholas of Tolentino/St. Alexius. +id: sext-antiphon-common-of-an-abbot +text: + la: "Fidélis servus * et prudens, quem constítuit Dóminus super famíliam suam." + en: "A faithful and wise servant * whom his Lord hath made ruler over His household." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-antiphon-common-of-pope-martyrs.yml b/src/data/propers/common/sext-antiphon-common-of-pope-martyrs.yml new file mode 100644 index 0000000..08ca981 --- /dev/null +++ b/src/data/propers/common/sext-antiphon-common-of-pope-martyrs.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Soter and Caius, 04-22-2042) -- common-of-pope-martyrs. +# For groups of Pope-Martyrs specifically (Commune/C3b.txt) -- real, +# distinct alleluia-toned text, not just several-martyrs with extra +# words; cross-checked against Ss. Cletus and Marcellinus. +id: sext-antiphon-common-of-pope-martyrs +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-common-of-several-martyrs.yml b/src/data/propers/common/sext-antiphon-common-of-several-martyrs.yml new file mode 100644 index 0000000..8721031 --- /dev/null +++ b/src/data/propers/common/sext-antiphon-common-of-several-martyrs.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Faustinus and Jovita, 02-15-2038) -- common-of-several-martyrs. +# For groups of martyrs who are not Popes (see +# common-of-pope-martyrs.yml for that distinct, allelúja-toned set) -- +# cross-checked against Ss. Cornelius and Cyprian, Ss. Placid and +# Companions (a real Duplex II. classis feast, not just a stub -- +# confirms this fallback applies at any rank, per +# resolveMinorHourAntiphon's own "eligible, not gated" design). +id: sext-antiphon-common-of-several-martyrs +text: + la: "Córpora Sanctórum * in pace sepúlta sunt: et vivent nómina eórum in ætérnum." + en: "The bodies of the Saints are buried in peace, * and their name liveth for evermore." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-capitulum-common-of-a-dedication.yml b/src/data/propers/common/sext-capitulum-common-of-a-dedication.yml new file mode 100644 index 0000000..d17a33c --- /dev/null +++ b/src/data/propers/common/sext-capitulum-common-of-a-dedication.yml @@ -0,0 +1,18 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (dedication of the basilicas of ss peter and paul, 11-18-2025) -- common-of-a-dedication. +# For the Dedication of a Church (Commune/C8.txt) -- currently only +# one saint on this app's calendar uses it. `SaintRecord.common` calls +# it `common-of-an-apostle` (Peter and Paul's own basilicas), but its +# actual P/T/S/N and Benedictus antiphon draw from the Dedication +# Common instead (about the building, not the apostles) -- confirmed +# live, not assumed from the collect's own `collect-c8`. +id: sext-capitulum-common-of-a-dedication +text: + la: "Et audívi vocem magnam de throno dicéntem: Ecce tabernáculum Dei cum homínibus, et habitábit cum eis; et ipsi pópulus ejus erunt, et ipse Deus cum eis erit eórum Deus. R. Deo grátias. V. Locus iste sanctus est, in quo orat sacérdos. R. Pro delíctis et peccátis pópuli." + en: "And I heard a great voice out of the throne, saying Behold, the tabernacle of God is with men, and He will dwell with them. And they shall be His people; and God Himself shall be with them, and be their God. R. Thanks be to God. V. This place is holy, wherein the Priest prayeth. R. For the pardon of the transgressions and offences of the people." +citation: + la: "Apo 21:3" + en: "Rev 21:3" +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-capitulum-common-of-a-martyr.yml b/src/data/propers/common/sext-capitulum-common-of-a-martyr.yml new file mode 100644 index 0000000..c5225e9 --- /dev/null +++ b/src/data/propers/common/sext-capitulum-common-of-a-martyr.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Anacletus, 07-13-2028) -- common-of-a-martyr. +# Covers both `common-of-a-martyr-bishop` and `common-of-a-martyr` +# saints (SaintRecord.common) -- live-verified identical P/T/S/N across +# both (the Bishop/non-Bishop distinction only affects the collect's +# own wording, not these Scripture-antiphons), cross-checked against +# St. Anicetus/St. Simeon/St. Blaise/St. Pantaleon. +id: sext-capitulum-common-of-a-martyr +text: + la: "Cibávit illum pane vitæ et intelléctus, et aqua sapiéntiæ salutáris potávit illum Dóminus Deus noster. R. Deo grátias. V. Posuísti, Dómine, super caput ejus. R. Corónam de lápide pretióso." + en: "With the bread of life and understanding, she shall feed him, and give him the water of wholesome wisdom to drink: and she shall be made strong in him, and he shall not be moved. R. Thanks be to God. V. O Lord, Thou hast set a crown of precious stones. R. Upon his head." +citation: + la: "Sir 15:3" + en: "Sir 15:3" +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-capitulum-common-of-a-vigil.yml b/src/data/propers/common/sext-capitulum-common-of-a-vigil.yml new file mode 100644 index 0000000..4a054b4 --- /dev/null +++ b/src/data/propers/common/sext-capitulum-common-of-a-vigil.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Vigil of St. Andrew, 11-29-2025) -- common-of-a-vigil. +# Shared by all 6 vigils on this app's calendar (Andrew, Bartholomew, +# James, Matthew, Matthias, Thomas) -- cross-checked against the +# Vigil of St. Bartholomew. +id: sext-capitulum-common-of-a-vigil +text: + la: "Alter altérius ónera portáte, et sic adimplébitis legem Christi. R. Deo grátias. V. Dóminus regit me, et nihil mihi déerit. R. In loco páscuæ ibi me collocávit." + en: "Bear ye one another's burdens; and so you shall fulfill the law of Christ. R. Thanks be to God. V. The Lord ruleth me: and I shall want nothing. R. He hath set me in a place of pasture." +citation: + la: "Gal 6:2" + en: "Gal 6:2" +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-capitulum-common-of-a-virgin.yml b/src/data/propers/common/sext-capitulum-common-of-a-virgin.yml new file mode 100644 index 0000000..e9d3b78 --- /dev/null +++ b/src/data/propers/common/sext-capitulum-common-of-a-virgin.yml @@ -0,0 +1,19 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Justina, 10-07-2025) -- common-of-a-virgin. +# Covers `common-of-a-virgin-martyr`, `common-of-a-virgin`, and +# `common-of-a-holy-woman` saints (SaintRecord.common) -- live- +# verified identical P/T/S/N across all three (the Martyr/non-Martyr +# distinction only affects the collect's own wording), cross-checked +# against St. Emerentiana, St. Praxedes, and St. Martha (the sole +# `common-of-a-holy-woman` saint -- her own collect uses the Virgin +# template `collect-c6a` too, same finding). +id: sext-capitulum-common-of-a-virgin +text: + la: "Æmulor enim vos Dei æmulatióne. Despóndi enim vos uni viro vírginem castam exhibére Christo. R. Deo grátias. V. Adjuvábit eam Deus vultu suo. R. Deus in médio ejus, non commovébitur." + en: "For I am jealous of you with the jealousy of God. For I have espoused you to one husband that I may present you as a chaste virgin to Christ. R. Thanks be to God. V. God shall help her with His countenance. R. God is in the midst of her she shall not be moved." +citation: + la: "2 Cor 11:2" + en: "2 Cor 11:2" +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-capitulum-common-of-an-abbot.yml b/src/data/propers/common/sext-capitulum-common-of-an-abbot.yml new file mode 100644 index 0000000..0147f14 --- /dev/null +++ b/src/data/propers/common/sext-capitulum-common-of-an-abbot.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Odo, 11-19-2025) -- common-of-an-abbot. +# Covers `common-of-an-abbot`, `common-of-a-confessor-not-bishop`, and +# `common-of-a-confessor` saints (SaintRecord.common) -- live-verified +# identical P/T/S/N across all three (an Abbot is himself a Confessor; +# the "faithful servant" antiphons apply generically), cross-checked +# against St. John Gualbert/St. Nicholas of Tolentino/St. Alexius. +id: sext-capitulum-common-of-an-abbot +text: + la: "Justus cor suum trádidit ad vigilándum dilúculo ad Dóminum, qui fecit illum, et in conspéctu Altíssimi deprecábitur. R. Deo grátias. V. Os justi meditábitur sapiéntiam. R. Et lingua ejus loquétur judícium." + en: "The righteous will give his heart to resort early to the Lord that made him, and he will pray in the sight of the most High. R. Thanks be to God. V. The mouth of the righteous speaketh wisdom. R. And his tongue talketh judgment." +citation: + la: "Sir 39:6" + en: "Sir 39:6" +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-capitulum-common-of-pope-martyrs.yml b/src/data/propers/common/sext-capitulum-common-of-pope-martyrs.yml new file mode 100644 index 0000000..65c3972 --- /dev/null +++ b/src/data/propers/common/sext-capitulum-common-of-pope-martyrs.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Soter and Caius, 04-22-2042) -- common-of-pope-martyrs. +# For groups of Pope-Martyrs specifically (Commune/C3b.txt) -- real, +# distinct alleluia-toned text, not just several-martyrs with extra +# words; cross-checked against Ss. Cletus and Marcellinus. +id: sext-capitulum-common-of-pope-martyrs +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: null +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-capitulum-common-of-several-martyrs.yml b/src/data/propers/common/sext-capitulum-common-of-several-martyrs.yml new file mode 100644 index 0000000..a6be15c --- /dev/null +++ b/src/data/propers/common/sext-capitulum-common-of-several-martyrs.yml @@ -0,0 +1,18 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Faustinus and Jovita, 02-15-2038) -- common-of-several-martyrs. +# For groups of martyrs who are not Popes (see +# common-of-pope-martyrs.yml for that distinct, allelúja-toned set) -- +# cross-checked against Ss. Cornelius and Cyprian, Ss. Placid and +# Companions (a real Duplex II. classis feast, not just a stub -- +# confirms this fallback applies at any rank, per +# resolveMinorHourAntiphon's own "eligible, not gated" design). +id: sext-capitulum-common-of-several-martyrs +text: + la: "Réddidit Deus mercédem labórum sanctórum suórum, et dedúxit illos in via mirábili: et fuit illis in velaménto diéi, et in luce stellárum nocte. R. Deo grátias. V. Exsúltent justi in conspéctu Dei. R. Et delecténtur in lætítia." + en: "And she rendered to the just the wages of their labours, and conducted them in a wonderful way: and she was to them for a covert by day, and for the light of stars by night. R. Thanks be to God. V. Let the righteous rejoice before God. R. Yea, let them exceedingly rejoice." +citation: + la: "Sap 10:17" + en: "Wis 10:17" +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-antiphon-common-of-a-dedication.yml b/src/data/propers/common/terce-antiphon-common-of-a-dedication.yml new file mode 100644 index 0000000..eb42211 --- /dev/null +++ b/src/data/propers/common/terce-antiphon-common-of-a-dedication.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (dedication of the basilicas of ss peter and paul, 11-18-2025) -- common-of-a-dedication. +# For the Dedication of a Church (Commune/C8.txt) -- currently only +# one saint on this app's calendar uses it. `SaintRecord.common` calls +# it `common-of-an-apostle` (Peter and Paul's own basilicas), but its +# actual P/T/S/N and Benedictus antiphon draw from the Dedication +# Common instead (about the building, not the apostles) -- confirmed +# live, not assumed from the collect's own `collect-c8`. +id: terce-antiphon-common-of-a-dedication +text: + la: "Domus mea, * domus oratiónis vocábitur." + en: "My house * shall be called the house of prayer." +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-antiphon-common-of-a-martyr.yml b/src/data/propers/common/terce-antiphon-common-of-a-martyr.yml new file mode 100644 index 0000000..1ce4cec --- /dev/null +++ b/src/data/propers/common/terce-antiphon-common-of-a-martyr.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Anacletus, 07-13-2028) -- common-of-a-martyr. +# Covers both `common-of-a-martyr-bishop` and `common-of-a-martyr` +# saints (SaintRecord.common) -- live-verified identical P/T/S/N across +# both (the Bishop/non-Bishop distinction only affects the collect's +# own wording, not these Scripture-antiphons), cross-checked against +# St. Anicetus/St. Simeon/St. Blaise/St. Pantaleon. +id: terce-antiphon-common-of-a-martyr +text: + la: "Qui séquitur me, * non ámbulat in ténebris, sed habébit lumen vitæ, dicit Dóminus." + en: "He that followeth Me * walketh not in darkness, but shall have the light of life, saith the Lord." +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-antiphon-common-of-a-vigil.yml b/src/data/propers/common/terce-antiphon-common-of-a-vigil.yml new file mode 100644 index 0000000..3212938 --- /dev/null +++ b/src/data/propers/common/terce-antiphon-common-of-a-vigil.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Vigil of St. Andrew, 11-29-2025) -- common-of-a-vigil. +# Shared by all 6 vigils on this app's calendar (Andrew, Bartholomew, +# James, Matthew, Matthias, Thomas) -- cross-checked against the +# Vigil of St. Bartholomew. +id: terce-antiphon-common-of-a-vigil +text: + la: "Clamávi, * et exaudívit me." + en: "I cried unto the Lord, * and He heard me." +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-antiphon-common-of-a-virgin.yml b/src/data/propers/common/terce-antiphon-common-of-a-virgin.yml new file mode 100644 index 0000000..063304c --- /dev/null +++ b/src/data/propers/common/terce-antiphon-common-of-a-virgin.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Justina, 10-07-2025) -- common-of-a-virgin. +# Covers `common-of-a-virgin-martyr`, `common-of-a-virgin`, and +# `common-of-a-holy-woman` saints (SaintRecord.common) -- live- +# verified identical P/T/S/N across all three (the Martyr/non-Martyr +# distinction only affects the collect's own wording), cross-checked +# against St. Emerentiana, St. Praxedes, and St. Martha (the sole +# `common-of-a-holy-woman` saint -- her own collect uses the Virgin +# template `collect-c6a` too, same finding). +id: terce-antiphon-common-of-a-virgin +text: + la: "Hæc est Virgo sápiens, * quam Dóminus vigilántem invénit." + en: "This is one of the wise virgins, * whom the Lord found watching." +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-antiphon-common-of-an-abbot.yml b/src/data/propers/common/terce-antiphon-common-of-an-abbot.yml new file mode 100644 index 0000000..6c699fa --- /dev/null +++ b/src/data/propers/common/terce-antiphon-common-of-an-abbot.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Odo, 11-19-2025) -- common-of-an-abbot. +# Covers `common-of-an-abbot`, `common-of-a-confessor-not-bishop`, and +# `common-of-a-confessor` saints (SaintRecord.common) -- live-verified +# identical P/T/S/N across all three (an Abbot is himself a Confessor; +# the "faithful servant" antiphons apply generically), cross-checked +# against St. John Gualbert/St. Nicholas of Tolentino/St. Alexius. +id: terce-antiphon-common-of-an-abbot +text: + la: "Euge, serve bone * in módico fidélis, intra in gáudium Dómini tui." + en: "Well done, thou good servant, * thou hast been faithful in a very little, enter thou into the joy of thy Lord." +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-antiphon-common-of-pope-martyrs.yml b/src/data/propers/common/terce-antiphon-common-of-pope-martyrs.yml new file mode 100644 index 0000000..2552e52 --- /dev/null +++ b/src/data/propers/common/terce-antiphon-common-of-pope-martyrs.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Soter and Caius, 04-22-2042) -- common-of-pope-martyrs. +# For groups of Pope-Martyrs specifically (Commune/C3b.txt) -- real, +# distinct alleluia-toned text, not just several-martyrs with extra +# words; cross-checked against Ss. Cletus and Marcellinus. +id: terce-antiphon-common-of-pope-martyrs +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-common-of-several-martyrs.yml b/src/data/propers/common/terce-antiphon-common-of-several-martyrs.yml new file mode 100644 index 0000000..9da76a4 --- /dev/null +++ b/src/data/propers/common/terce-antiphon-common-of-several-martyrs.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Faustinus and Jovita, 02-15-2038) -- common-of-several-martyrs. +# For groups of martyrs who are not Popes (see +# common-of-pope-martyrs.yml for that distinct, allelúja-toned set) -- +# cross-checked against Ss. Cornelius and Cyprian, Ss. Placid and +# Companions (a real Duplex II. classis feast, not just a stub -- +# confirms this fallback applies at any rank, per +# resolveMinorHourAntiphon's own "eligible, not gated" design). +id: terce-antiphon-common-of-several-martyrs +text: + la: "Cum palma * ad regna pervenérunt Sancti, corónas decóris meruérunt de manu Dei." + en: "The Saints have attained unto the kingdom, * with palms in their hands; they have earned crowns of Majesty from the Lord's hand." +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-capitulum-common-of-a-dedication.yml b/src/data/propers/common/terce-capitulum-common-of-a-dedication.yml new file mode 100644 index 0000000..f42b1da --- /dev/null +++ b/src/data/propers/common/terce-capitulum-common-of-a-dedication.yml @@ -0,0 +1,18 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (dedication of the basilicas of ss peter and paul, 11-18-2025) -- common-of-a-dedication. +# For the Dedication of a Church (Commune/C8.txt) -- currently only +# one saint on this app's calendar uses it. `SaintRecord.common` calls +# it `common-of-an-apostle` (Peter and Paul's own basilicas), but its +# actual P/T/S/N and Benedictus antiphon draw from the Dedication +# Common instead (about the building, not the apostles) -- confirmed +# live, not assumed from the collect's own `collect-c8`. +id: terce-capitulum-common-of-a-dedication +text: + la: "Vidi civitátem sanctam, Jerúsalem novam, descendéntem de cælo a Deo, parátam sicut sponsam ornátam viro suo. R. Deo grátias. V. Domum tuam, Dómine, decet sanctitúdo. R. In longitúdinem diérum." + en: "I saw the holy city, New Jerusalem, coming down from God out of heaven, prepared as a Bride adorned for her husband. R. Thanks be to God. V. Holiness becometh thine house, O Lord. R. For ever." +citation: + la: "Apo 21:2" + en: "Rev 21:2" +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-capitulum-common-of-a-martyr.yml b/src/data/propers/common/terce-capitulum-common-of-a-martyr.yml new file mode 100644 index 0000000..0f84b69 --- /dev/null +++ b/src/data/propers/common/terce-capitulum-common-of-a-martyr.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Anacletus, 07-13-2028) -- common-of-a-martyr. +# Covers both `common-of-a-martyr-bishop` and `common-of-a-martyr` +# saints (SaintRecord.common) -- live-verified identical P/T/S/N across +# both (the Bishop/non-Bishop distinction only affects the collect's +# own wording, not these Scripture-antiphons), cross-checked against +# St. Anicetus/St. Simeon/St. Blaise/St. Pantaleon. +id: terce-capitulum-common-of-a-martyr +text: + la: "Beátus vir, qui suffert tentatiónem: quóniam cum probátus fúerit, accípiet corónam vitæ, quam repromísit Deus diligéntibus se. R. Deo grátias. V. Glória et honóre coronásti eum, Dómine. R. Et constituísti eum super ópera mánuum tuárum." + en: "Blessed is the man that endureth temptation; for when he hath been proved, he shall receive a crown of life, which God hath promised to them that love him. R. Thanks be to God. V. Thou hast crowned him with glory and honour, O Lord. R. And madest him to have dominion over the works of thy hands." +citation: + la: "Jac 1:12" + en: "Jas 1:12" +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-capitulum-common-of-a-vigil.yml b/src/data/propers/common/terce-capitulum-common-of-a-vigil.yml new file mode 100644 index 0000000..361b14f --- /dev/null +++ b/src/data/propers/common/terce-capitulum-common-of-a-vigil.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Vigil of St. Andrew, 11-29-2025) -- common-of-a-vigil. +# Shared by all 6 vigils on this app's calendar (Andrew, Bartholomew, +# James, Matthew, Matthias, Thomas) -- cross-checked against the +# Vigil of St. Bartholomew. +id: terce-capitulum-common-of-a-vigil +text: + la: "Sana me, Dómine, et sanábor: salvum me fac, et salvus ero: quóniam laus mea tu es. R. Deo grátias. V. Adjútor meus, esto, ne derelínquas me. R. Neque despícias me, Deus, salutáris meus." + en: "Heal me, O Lord, and I shall be healed: save me, and I shall be saved, for thou art my praise. R. Thanks be to God. V. Be thou my helper, forsake me not. R. Do not thou despise me, O God my Saviour." +citation: + la: "Jer 17:14" + en: "Jer 17:14" +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-capitulum-common-of-a-virgin.yml b/src/data/propers/common/terce-capitulum-common-of-a-virgin.yml new file mode 100644 index 0000000..1c33150 --- /dev/null +++ b/src/data/propers/common/terce-capitulum-common-of-a-virgin.yml @@ -0,0 +1,19 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Justina, 10-07-2025) -- common-of-a-virgin. +# Covers `common-of-a-virgin-martyr`, `common-of-a-virgin`, and +# `common-of-a-holy-woman` saints (SaintRecord.common) -- live- +# verified identical P/T/S/N across all three (the Martyr/non-Martyr +# distinction only affects the collect's own wording), cross-checked +# against St. Emerentiana, St. Praxedes, and St. Martha (the sole +# `common-of-a-holy-woman` saint -- her own collect uses the Virgin +# template `collect-c6a` too, same finding). +id: terce-capitulum-common-of-a-virgin +text: + la: "Fratres: Qui gloriátur, in Dómino gloriétur. Non enim qui seípsum comméndat, ille probátus est; sed quem Deus comméndat. R. Deo grátias. V. Spécie tua et pulchritúdine tua. R. Inténde, próspere procéde, et regna." + en: "Brothers: But he that glorieth, let him glory in the Lord. For not he who commendeth himself, is approved, but he, whom God commendeth. R. Thanks be to God. V. In thy comeliness and thy beauty. R. Go forward, fare prosperously, and reign." +citation: + la: "2 Cor 10:17-18" + en: "2 Cor 10:17-18" +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-capitulum-common-of-an-abbot.yml b/src/data/propers/common/terce-capitulum-common-of-an-abbot.yml new file mode 100644 index 0000000..a17a1d3 --- /dev/null +++ b/src/data/propers/common/terce-capitulum-common-of-an-abbot.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (St. Odo, 11-19-2025) -- common-of-an-abbot. +# Covers `common-of-an-abbot`, `common-of-a-confessor-not-bishop`, and +# `common-of-a-confessor` saints (SaintRecord.common) -- live-verified +# identical P/T/S/N across all three (an Abbot is himself a Confessor; +# the "faithful servant" antiphons apply generically), cross-checked +# against St. John Gualbert/St. Nicholas of Tolentino/St. Alexius. +id: terce-capitulum-common-of-an-abbot +text: + la: "Beátus vir, qui invéntus est sine mácula, et qui post aurum non ábiit, nec sperávit in pecúnia et thesáuris. Quis est hic, et laudábimus eum? fecit enim mirabília in vita sua. R. Deo grátias. V. Amávit eum Dóminus, et ornávit eum. R. Stolam glóriæ índuit eum." + en: "Blessed is the rich man that is found without blemish: and that hath not gone after gold, nor put his trust in money nor in treasures. Who is he, and we will praise him? for he hath done wonderful things in his life. R. Thanks be to God. V. The Lord loved him and beautified him. R. He clothed him with a robe of glory." +citation: + la: "Sir 31:8-9" + en: "Sir 31:8-9" +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-capitulum-common-of-pope-martyrs.yml b/src/data/propers/common/terce-capitulum-common-of-pope-martyrs.yml new file mode 100644 index 0000000..58bd600 --- /dev/null +++ b/src/data/propers/common/terce-capitulum-common-of-pope-martyrs.yml @@ -0,0 +1,15 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Soter and Caius, 04-22-2042) -- common-of-pope-martyrs. +# For groups of Pope-Martyrs specifically (Commune/C3b.txt) -- real, +# distinct alleluia-toned text, not just several-martyrs with extra +# words; cross-checked against Ss. Cletus and Marcellinus. +id: terce-capitulum-common-of-pope-martyrs +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-common-of-several-martyrs.yml b/src/data/propers/common/terce-capitulum-common-of-several-martyrs.yml new file mode 100644 index 0000000..051e376 --- /dev/null +++ b/src/data/propers/common/terce-capitulum-common-of-several-martyrs.yml @@ -0,0 +1,18 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), +# live query (Ss. Faustinus and Jovita, 02-15-2038) -- common-of-several-martyrs. +# For groups of martyrs who are not Popes (see +# common-of-pope-martyrs.yml for that distinct, allelúja-toned set) -- +# cross-checked against Ss. Cornelius and Cyprian, Ss. Placid and +# Companions (a real Duplex II. classis feast, not just a stub -- +# confirms this fallback applies at any rank, per +# resolveMinorHourAntiphon's own "eligible, not gated" design). +id: terce-capitulum-common-of-several-martyrs +text: + la: "Justórum ánimæ in manu Dei sunt, et non tanget illos torméntum mortis. Visi sunt óculis insipiéntium mori: illi autem sunt in pace. R. Deo grátias. V. Lætámini in Dómino, et exsultáte justi. R. Et gloriámini omnes recti corde." + en: "But the souls of the just are in the hand of God, and the torment of death shall not touch them. In the sight of the unwise they seemed to die, but they are in peace. R. Thanks be to God. V. Be glad in the Lord, and rejoice, ye just, R. And glory, all ye right of heart." +citation: + la: "Sap 3:1-3" + en: "Wis 3:1-3" +status: + la: verified + en: verified diff --git a/src/hours/resolve-common.ts b/src/hours/resolve-common.ts index f252522..6a18948 100644 --- a/src/hours/resolve-common.ts +++ b/src/hours/resolve-common.ts @@ -3,7 +3,7 @@ import type { Commemoration, DayWinner, LiturgicalDay } from '../calendar/types' import type { ProperText } from '../propers'; import { getCommonProper, getTemporalProper } from '../propers'; import { getSaintRecord } from '../calendar/feasts'; -import { resolveActiveOctave, isAtLeast } from '../calendar'; +import { resolveActiveOctave } from '../calendar'; import { splitAntiphon } from './antiphon'; function toResolvedText(proper: ProperText): ResolvedText { @@ -93,30 +93,39 @@ export function isSundayOrFeastOffice(day: LiturgicalDay): boolean { } /** - * Whether today's office winner (resolveOfficeWinner) is a strong enough - * feast to carry its own proper minor-hour content (antiphon + chapter) - * — duplex-majus+, the same threshold Lauds' own psalmody override uses - * (hours/lauds.ts's getPsalmodyOverrideFor), kept in sync deliberately: - * as each remaining duplex-majus+ saint gets a Lauds override authored, - * the same id is what Prime/Terce/Sext/None would look for too, so it's - * one shared backlog (see TODO.md), not per-hour lists that can drift. + * The id to look up for today's office winner's (resolveOfficeWinner) + * minor-hour content (antiphon + chapter) — `${hourId}-antiphon-${id}`/ + * `${hourId}-capitulum-${id}` first (a per-saint proper file, only ever + * authored for duplex-majus+ saints in practice), then that saint's + * `minorHoursCommon` fallback (see resolveMinorHourAntiphon/Chapter + * below), tried regardless of rank: live-querying the reference engine + * directly (2026-08, the 94 `propers: null` saints' P/T/S/N pass) + * confirmed a winning Simplex/Semiduplex saint's own minor hours *do* + * carry proper/Common antiphons, not the plain ferial default — a real + * liturgical fact, not an app gap. Any sanctoral winner is therefore + * eligible here; it's `resolveMinorHourAntiphon`/`resolveMinorHourChapter` + * that decide, per hour, whether anything's actually been authored for + * that id (falling through to the weekday default when not). Until + * 2026-08 this was gated at duplex-majus+ (the same threshold Lauds' + * own *psalmody* override uses, hours/lauds.ts's getPsalmodyOverrideFor) + * — that threshold remains correct for the *psalmody* override + * specifically (a much bigger authored-content commitment, still + * majus+-only), but was wrongly reused here as if it were a general + * "is this saint's office strong enough" rule. * Also honors ALWAYS_OVERRIDE_TEMPORAL_IDS the same way * getPsalmodyOverrideFor does — a named temporal feast (`christ-the- * king`, `christmas-octave-sunday`) is eligible regardless of rank, since - * it has no FeastClass to compare against duplex-majus in the first - * place. Missing until 2026-08: this function only checked the sanctoral - * branch, so a temporal id in that set got a Lauds psalmody override but - * silently no Prime/Terce/Sext/None one, however much was authored for - * it — a real gap, not by design. - * Returns the id to look up (`${hourId}-antiphon-${id}` etc.), or - * `undefined` when nothing eligible is happening today. + * it has no FeastClass to compare against in the first place. + * Returns the id to look up, or `undefined` when nothing sanctoral or + * named-temporal is happening today (a plain temporal day just stays on + * its own weekday default, same as always). */ export function getMinorHourOverrideId(day: LiturgicalDay): string | undefined { const winner = resolveOfficeWinner(day); if (winner.kind === 'temporal' && ALWAYS_OVERRIDE_TEMPORAL_IDS.has(winner.id)) { return winner.id; } - if (winner.kind === 'sanctoral' && isAtLeast(winner.rank, 'duplex-majus')) { + if (winner.kind === 'sanctoral') { return winner.id; } return undefined; @@ -329,7 +338,9 @@ export function getDayCollects(day: LiturgicalDay): ResolvedPart[] { * pull, sourced from each saint's own raw [Ant 1] — see e.g. * st-lawrence-antiphon.yml) for a sanctoral winner, `${id}-benedictus- * antiphon` (not authored yet for any temporal id — resolves "missing", - * same pending convention as everywhere else) for a temporal one. Uses + * same pending convention as everywhere else) for a temporal one, then + * `saint.benedictusCommon` (`benedictus-antiphon-${benedictusCommon}.yml`, + * see SaintRecord's own doc comment) when neither exists. Uses * resolveOfficeWinner, not the raw `day.winner` — on an octave day this * is the octave's own feast's antiphon (live-verified: St. Lawrence's * "In cratícula", not the commemorated St. Clare's, and not the plain @@ -343,7 +354,13 @@ export function getBenedictusAntiphon(day: LiturgicalDay): ResolvedText { } const saint = getSaintRecord(winner.id); if (saint?.propers) { - return resolveCommon(`${saint.propers}-antiphon`); + const proper = resolveCommon(`${saint.propers}-antiphon`); + if (proper.status.la !== 'missing' || proper.status.en !== 'missing') { + return proper; + } + } + if (saint?.benedictusCommon) { + return resolveCommon(`benedictus-antiphon-${saint.benedictusCommon}`); } return { text: {}, status: { la: 'missing', en: 'missing' } }; } diff --git a/tests/hours/resolve-common.test.ts b/tests/hours/resolve-common.test.ts index 2f502c6..77e9e99 100644 --- a/tests/hours/resolve-common.test.ts +++ b/tests/hours/resolve-common.test.ts @@ -1,6 +1,12 @@ import { describe, expect, it } from 'vitest'; import { resolveDay } from '../../src/calendar'; -import { getDayCollect, splitNamedAntiphon } from '../../src/hours/resolve-common'; +import { + getDayCollect, + getBenedictusAntiphon, + resolveMinorHourAntiphon, + resolveMinorHourChapter, + splitNamedAntiphon, +} from '../../src/hours/resolve-common'; import type { LiturgicalDay } from '../../src/calendar/types'; describe('getDayCollect', () => { @@ -38,6 +44,33 @@ describe('getDayCollect', () => { }); }); +describe('minorHoursCommon/benedictusCommon fallback (2026-08, the 94 propers:null saints)', () => { + it('a below-duplex-majus saint still gets a real Benedictus antiphon and P/T/S/N content via its Common category', () => { + // St. Anacletus, Semiduplex -- below the duplex-majus+ threshold that + // gates a *proper* psalmody override (hours/lauds.ts's + // getPsalmodyOverrideFor), but getMinorHourOverrideId no longer + // requires that threshold for the shared-Common fallback (see its own + // doc comment for why: live-querying confirmed even a winning Simplex + // saint keeps proper/Common minor-hour content, not the ferial + // default). + const day = resolveDay('2028-07-13'); + expect(day.winner).toMatchObject({ kind: 'sanctoral', id: 'st-anacletus' }); + expect(getBenedictusAntiphon(day).status).toEqual({ la: 'verified', en: 'verified' }); + expect(resolveMinorHourAntiphon('prime', day, {}).status.la).toBe('verified'); + expect(resolveMinorHourChapter('terce', day, 'terce-capitulum-ferial').status.la).toBe('verified'); + }); + + it('a Duplex-II-classis saint with no proper minor-hour content of its own still resolves via the Common, not just below-majus saints', () => { + // Ss. Placid and Companions -- confirms the fallback isn't only + // reached by low ranks; a real major feast with no *proper* + // Prime/Terce/Sext/None file authored falls through to its + // minorHoursCommon (common-of-several-martyrs) exactly the same way. + const day = resolveDay('2025-10-05'); + expect(day.winner).toMatchObject({ kind: 'sanctoral', id: 'ss-placid-and-companions' }); + expect(resolveMinorHourAntiphon('none', day, {}).status.la).toBe('verified'); + }); +}); + describe('splitNamedAntiphon', () => { it('carries a verified status through to both the incipit and full forms', () => { const { incipit, full } = splitNamedAntiphon({