diff --git a/TODO.md b/TODO.md index b508d64..1c7ae34 100644 --- a/TODO.md +++ b/TODO.md @@ -2829,6 +2829,37 @@ categories in the "still open" list above have no Lauds/Vespers bundle authored same honest incremental-content gap, now on a mechanism that no longer silently drops to the ferial default for any rank. +### Common-of-a-Martyr(-Bishop) Lauds/Vespers bundle authored (2026-08-26) + +**Bug flagged by the user, live**: St. Zephyrinus (Aug 26, `common-of-a-martyr-bishop`, +Simplex) claims First Vespers over St. Louis's Aug 25 (see `calendar/vespers.ts`'s +`hasFirstVespers`), but that evening's Vespers/Compline were showing the plain Tuesday ferial +hymn ("Cæli Deus sanctíssime") instead of a real Common-of-a-Martyr hymn — the same +rank-agnostic Common-fallback mechanism from the entry above, just with no content authored yet +for this category, so `resolveOfficeBundle` fell all the way through. + +**Proof authored, next category in the "still open" list**: `common-of-a-martyr-bishop`'s full +Lauds bundle (chapter Jac 1:12, short responsory "Glória et honóre," hymn "Martyr Dei, qui +únicum," versicle "Justus ut palma florébit") and Vespers bundle (chapter reused from Lauds, +short responsory "Posuísti, Dómine," hymn "Deus tuórum mílitum," versicle same as Lauds's), +live-verified against Divinum Officium (Monastic Tridentinum 1617) `votive=C2b` — the +votive-office view was needed for the same structural reason as Confessor-Not-Bishop's own +Vespers bundle: every real Common-of-a-Martyr-Bishop saint on this app's calendar either has +proper content of his own (St. Lawrence, St. Stephen) or never reaches the rank needed to keep +his own evening (St. Zephyrinus and St. Callistus, Simplex and plain Duplex respectively — both +live-checked: Callistus's own real Vespers query resolved to "Vespera de Tempore occurente," +i.e. his own Second Vespers is itself always lost, confirming this isn't just a Simplex-rank +quirk). Cross-checked `votive=C2`/`C2a`/`C2b`/`C2-1` all render byte-identical Vespers/Lauds +hymn text, confirming the earlier Matins-psalmody finding (`common-of-a-martyr-bishop` and +`common-of-a-martyr` share real content) extends to this bundle too — so the same 7 files were +duplicated verbatim under the plain `common-of-a-martyr` id as well (St. Hadrian, St. Hermes, +St. Fidelis of Sigmaringen), since `resolveOfficeBundle` has no alias mechanism the way the +Matins-psalmody category tier does. + +`npm test` (479 tests), `tsc --noEmit` both pass. **Still open**: 9 Common categories remain +with no Lauds/Vespers bundle authored (Confessor, Confessor-Bishop, Virgin, Virgin-Martyr, +Doctor, Apostle, Several-Martyrs, Several-Confessors, Holy Woman/Widow). + ## Known, deliberate simplifications (not bugs — working as designed) - `getDayCollects`: each collect in a multi-collect day renders as its own diff --git a/src/data/propers/common/lauds-capitulum-common-of-a-martyr-bishop.yml b/src/data/propers/common/lauds-capitulum-common-of-a-martyr-bishop.yml new file mode 100644 index 0000000..121197e --- /dev/null +++ b/src/data/propers/common/lauds-capitulum-common-of-a-martyr-bishop.yml @@ -0,0 +1,23 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# `votive=C2b` live query, 2026-08 -- used instead of a real saint's own +# day for the same reason recorded in vespers-hymn-common-of-a-martyr- +# bishop.yml's header (every real Common-of-a-Martyr-Bishop saint either +# has proper content of his own -- St. Lawrence, St. Stephen -- or never +# reaches the rank needed to keep his own hour un-outranked -- St. +# Zephyrinus, St. Callistus). Byte-identical to `votive=C2`/`C2a` (plain +# Common of a Martyr), confirming TODO.md's earlier finding that these +# categories share real content, not just their Matins psalmody. Same +# chapter reused for Vespers -- no separate vespers-capitulum- file +# authored, per vespers.ts's vespersCapitulumForOverride fallback (see +# its own doc comment) -- same convention as Common-of-a-Confessor-Not- +# Bishop's identical Lauds/Vespers chapter. +id: lauds-capitulum-common-of-a-martyr-bishop +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." + 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." +citation: + la: "Jac 1:12" + en: "Jas 1:12" +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-capitulum-common-of-a-martyr.yml b/src/data/propers/common/lauds-capitulum-common-of-a-martyr.yml new file mode 100644 index 0000000..6f02665 --- /dev/null +++ b/src/data/propers/common/lauds-capitulum-common-of-a-martyr.yml @@ -0,0 +1,23 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# `votive=C2` live query, 2026-08 -- used instead of a real saint's own +# day for the same reason recorded in vespers-hymn-common-of-a-martyr- +# bishop.yml's header (every real Common-of-a-Martyr-Bishop saint either +# has proper content of his own -- St. Lawrence, St. Stephen -- or never +# reaches the rank needed to keep his own hour un-outranked -- St. +# Zephyrinus, St. Callistus). Byte-identical to `votive=C2`/`C2a` (plain +# Common of a Martyr), confirming TODO.md's earlier finding that these +# categories share real content, not just their Matins psalmody. Same +# chapter reused for Vespers -- no separate vespers-capitulum- file +# authored, per vespers.ts's vespersCapitulumForOverride fallback (see +# its own doc comment) -- same convention as Common-of-a-Confessor-Not- +# Bishop's identical Lauds/Vespers chapter. +id: lauds-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." + 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." +citation: + la: "Jac 1:12" + en: "Jas 1:12" +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-hymn-common-of-a-martyr-bishop.yml b/src/data/propers/common/lauds-hymn-common-of-a-martyr-bishop.yml new file mode 100644 index 0000000..686ffdf --- /dev/null +++ b/src/data/propers/common/lauds-hymn-common-of-a-martyr-bishop.yml @@ -0,0 +1,81 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# `votive=C2b` live query, 2026-08 -- see lauds-capitulum-common-of-a- +# martyr-bishop.yml's header for why the votive-office view was used. +# "Martyr Dei, qui únicum" -- the classic Common-of-a-Martyr Lauds hymn, +# a single genuine recension (no Urban VIII variant text found for this +# one in the reference engine, unlike Iste Confessor's). +id: lauds-hymn-common-of-a-martyr-bishop +text: + la: >- + Martyr Dei, qui únicum + + Patris sequéndo Fílium, + + Victis triúmphas hóstibus, + + Victor fruens cæléstibus. + + + Tui precátus múnere + + Nostrum reátum dílue, + + Arcens mali contágium, + + Vitæ rémovens tǽdium. + + + Solúta sunt jam víncula + + Tui sacráti córporis: + + Nos solve vinclis sǽculi, + + Amóre Fílii Dei. + + + Deo Patri sit glória, + + Ejúsque soli Fílio, + + Cum Spíritu Paráclito, + + Et nunc, et in perpétuum. Amen. + en: >- + Martyr of God, whose strength was steeled + + To follow close God's only Son, + + Well didst thou brave thy battlefield, + + And well thy heavenly bliss was won! + + + Now join thy prayers with ours, who pray + + That God may pardon us and bless; + + For prayer keeps evil's plague away, + + And draws from life its weariness. + + + Long, long ago, were loosed the chains + + That held thy body once in thrall; + + For us how many a bond remains! + + O love of God release us all. + + + All praise to God the Father be, + + All praise to thee, Eternal Son; + + All praise, O Holy Ghost, to thee, + + While never-ending ages run. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-hymn-common-of-a-martyr.yml b/src/data/propers/common/lauds-hymn-common-of-a-martyr.yml new file mode 100644 index 0000000..2ba6328 --- /dev/null +++ b/src/data/propers/common/lauds-hymn-common-of-a-martyr.yml @@ -0,0 +1,81 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# `votive=C2` live query, 2026-08 -- see lauds-capitulum-common-of-a- +# martyr-bishop.yml's header for why the votive-office view was used. +# "Martyr Dei, qui únicum" -- the classic Common-of-a-Martyr Lauds hymn, +# a single genuine recension (no Urban VIII variant text found for this +# one in the reference engine, unlike Iste Confessor's). +id: lauds-hymn-common-of-a-martyr +text: + la: >- + Martyr Dei, qui únicum + + Patris sequéndo Fílium, + + Victis triúmphas hóstibus, + + Victor fruens cæléstibus. + + + Tui precátus múnere + + Nostrum reátum dílue, + + Arcens mali contágium, + + Vitæ rémovens tǽdium. + + + Solúta sunt jam víncula + + Tui sacráti córporis: + + Nos solve vinclis sǽculi, + + Amóre Fílii Dei. + + + Deo Patri sit glória, + + Ejúsque soli Fílio, + + Cum Spíritu Paráclito, + + Et nunc, et in perpétuum. Amen. + en: >- + Martyr of God, whose strength was steeled + + To follow close God's only Son, + + Well didst thou brave thy battlefield, + + And well thy heavenly bliss was won! + + + Now join thy prayers with ours, who pray + + That God may pardon us and bless; + + For prayer keeps evil's plague away, + + And draws from life its weariness. + + + Long, long ago, were loosed the chains + + That held thy body once in thrall; + + For us how many a bond remains! + + O love of God release us all. + + + All praise to God the Father be, + + All praise to thee, Eternal Son; + + All praise, O Holy Ghost, to thee, + + While never-ending ages run. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-responsory-common-of-a-martyr-bishop.yml b/src/data/propers/common/lauds-responsory-common-of-a-martyr-bishop.yml new file mode 100644 index 0000000..e3e4fe3 --- /dev/null +++ b/src/data/propers/common/lauds-responsory-common-of-a-martyr-bishop.yml @@ -0,0 +1,22 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# `votive=C2b` live query, 2026-08 -- see lauds-capitulum-common-of-a- +# martyr-bishop.yml's header for why the votive-office view was used. +id: lauds-responsory-common-of-a-martyr-bishop +text: + la: | + R.br. Glória et honóre * Coronásti eum, Dómine. + ℟. Glória et honóre * Coronásti eum, Dómine. + ℣. Et constituísti eum super ópera mánuum tuárum. + ℟. Coronásti eum, Dómine. + ℣. Glória Patri, et Fílio, * et Spirítui Sancto. + ℟. Glória et honóre * Coronásti eum, Dómine. + en: | + R.br. Thou hast crowned him * with glory and honour, O Lord. + ℟. Thou hast crowned him * with glory and honour, O Lord. + ℣. And madest him to have dominion over the works of thy hands. + ℟. With glory and honour, O Lord. + ℣. Glory be to the Father, and to the Son, * and to the Holy Ghost. + ℟. Thou hast crowned him * with glory and honour, O Lord. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-responsory-common-of-a-martyr.yml b/src/data/propers/common/lauds-responsory-common-of-a-martyr.yml new file mode 100644 index 0000000..2b60eac --- /dev/null +++ b/src/data/propers/common/lauds-responsory-common-of-a-martyr.yml @@ -0,0 +1,22 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# `votive=C2` live query, 2026-08 -- see lauds-capitulum-common-of-a- +# martyr-bishop.yml's header for why the votive-office view was used. +id: lauds-responsory-common-of-a-martyr +text: + la: | + R.br. Glória et honóre * Coronásti eum, Dómine. + ℟. Glória et honóre * Coronásti eum, Dómine. + ℣. Et constituísti eum super ópera mánuum tuárum. + ℟. Coronásti eum, Dómine. + ℣. Glória Patri, et Fílio, * et Spirítui Sancto. + ℟. Glória et honóre * Coronásti eum, Dómine. + en: | + R.br. Thou hast crowned him * with glory and honour, O Lord. + ℟. Thou hast crowned him * with glory and honour, O Lord. + ℣. And madest him to have dominion over the works of thy hands. + ℟. With glory and honour, O Lord. + ℣. Glory be to the Father, and to the Son, * and to the Holy Ghost. + ℟. Thou hast crowned him * with glory and honour, O Lord. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-versicle-common-of-a-martyr-bishop.yml b/src/data/propers/common/lauds-versicle-common-of-a-martyr-bishop.yml new file mode 100644 index 0000000..030fd6e --- /dev/null +++ b/src/data/propers/common/lauds-versicle-common-of-a-martyr-bishop.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# `votive=C2b` live query, 2026-08 -- see lauds-capitulum-common-of-a- +# martyr-bishop.yml's header for why the votive-office view was used. +# Same versicle as Vespers -- see vespers-versicle-common-of-a-martyr- +# bishop.yml's header. +id: lauds-versicle-common-of-a-martyr-bishop +text: + la: | + ℣. Justus ut palma florébit. + ℟. Sicut cedrus Líbani multiplicábitur. + en: | + ℣. The righteous shall flourish like the palm-tree. + ℟. He shall grow like a cedar in Lebanon. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-versicle-common-of-a-martyr.yml b/src/data/propers/common/lauds-versicle-common-of-a-martyr.yml new file mode 100644 index 0000000..f516461 --- /dev/null +++ b/src/data/propers/common/lauds-versicle-common-of-a-martyr.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# `votive=C2` live query, 2026-08 -- see lauds-capitulum-common-of-a- +# martyr-bishop.yml's header for why the votive-office view was used. +# Same versicle as Vespers -- see vespers-versicle-common-of-a-martyr- +# bishop.yml's header. +id: lauds-versicle-common-of-a-martyr +text: + la: | + ℣. Justus ut palma florébit. + ℟. Sicut cedrus Líbani multiplicábitur. + en: | + ℣. The righteous shall flourish like the palm-tree. + ℟. He shall grow like a cedar in Lebanon. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-hymn-common-of-a-martyr-bishop.yml b/src/data/propers/common/vespers-hymn-common-of-a-martyr-bishop.yml new file mode 100644 index 0000000..d68841b --- /dev/null +++ b/src/data/propers/common/vespers-hymn-common-of-a-martyr-bishop.yml @@ -0,0 +1,115 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers +# `votive=C2b` live query, 2026-08 -- the classic "Deus tuórum mílitum" +# Common-of-a-Martyr Vespers hymn, previously entirely missing from this +# app (no `vespers-hymn-common-of-a-martyr-bishop.yml`/`-common-of-a- +# martyr.yml` at all), so any Vespers/Compline landing on an unauthored +# Common-of-a-Martyr(-Bishop) saint fell all the way through to the plain +# ferial default -- the gap this app's user flagged live, on St. +# Zephyrinus's own Aug 26/25 evening (see calendar/vespers.ts's First- +# Vespers-anticipation comments for that saint's own history). Bypasses +# calendar concurrence entirely, same reasoning as Common-of-a-Confessor- +# Not-Bishop's own Vespers file (see its header): no real Common-of-a- +# Martyr(-Bishop) saint's own Second Vespers is ever un-outranked on this +# app's merged calendar -- every real candidate either has proper content +# of his own (St. Lawrence, St. Stephen) or never reaches the rank needed +# to keep his own evening (St. Zephyrinus, St. Callistus both Simplex/ +# plain Duplex). Byte-identical to `votive=C2`/`C2a` (plain Common of a +# Martyr), confirming TODO.md's earlier Matins-psalmody finding +# (`common-of-a-martyr-bishop` and `common-of-a-martyr` share real +# content) extends to this bundle too -- authored as two separate files +# rather than an alias redirect only because this bundle's lookup +# (`resolveOfficeBundle`) has no alias mechanism the way the Matins- +# psalmody category tier does. +id: vespers-hymn-common-of-a-martyr-bishop +text: + la: >- + Deus tuórum mílitum + + Sors, et córona, prǽmium, + + Laudes canéntes Mártyris + + Absólve nexu críminis. + + + Hic nempe mundi gáudia, + + Et blandiménta nóxia + + Cadúca rite députans, + + Pervénit ad cæléstia. + + + Pœnas cucúrrit fórtiter, + + Et sústulit viríliter, + + Pro te effúndens sánguinem, + + Ætérna dona póssidet. + + + Ob hoc precátu súpplici + + Te póscimus, piíssime; + + In hoc triúmpho Mártyris + + Dimítte noxam sérvulis. + + + Laus et perénnis glória + + Deo Patri, et Fílio, + + Sancto simul Paráclito, + + In sempitérna sǽcula. Amen. + en: >- + O God, of those that fought thy fight, + + Portion, and prize, and crown of light, + + Break every bond of sin and shame + + As now we praise thy martyr's name. + + + He recked not of the world's allure, + + But sin and pomp of sin forswore: + + Knew all their gall, and passed them by, + + And reached the throne prepared on high. + + + Bravely the course of pain he ran, + + And bare his torments as a man: + + For love of thee his blood outpoured, + + And thus obtained the great reward. + + + With humble voice and suppliant word + + We pray thee therefore, holy Lord, + + While we thy martyr's feast-day keep, + + Forgive thy loved and erring sheep. + + + Glory and praise for aye be done + + To God the Father, and the Son, + + And Holy Ghost, who reign on high, + + One God, to all eternity. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-hymn-common-of-a-martyr.yml b/src/data/propers/common/vespers-hymn-common-of-a-martyr.yml new file mode 100644 index 0000000..5291556 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-common-of-a-martyr.yml @@ -0,0 +1,103 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers +# `votive=C2` live query, 2026-08 -- the classic "Deus tuórum mílitum" +# Common-of-a-Martyr Vespers hymn, byte-identical to `votive=C2b` (Common +# of a Martyr Bishop) -- see vespers-hymn-common-of-a-martyr-bishop.yml's +# header for the fuller gap/sourcing writeup (the bug report that +# surfaced this, why the votive-office view was used instead of a real +# saint's day, and why this is a separate file rather than an alias +# redirect). Duplicated verbatim into this plain `common-of-a-martyr` id +# for St. Hadrian/St. Hermes/St. Fidelis of Sigmaringen, who use it +# directly (not the `-bishop` id). +id: vespers-hymn-common-of-a-martyr +text: + la: >- + Deus tuórum mílitum + + Sors, et córona, prǽmium, + + Laudes canéntes Mártyris + + Absólve nexu críminis. + + + Hic nempe mundi gáudia, + + Et blandiménta nóxia + + Cadúca rite députans, + + Pervénit ad cæléstia. + + + Pœnas cucúrrit fórtiter, + + Et sústulit viríliter, + + Pro te effúndens sánguinem, + + Ætérna dona póssidet. + + + Ob hoc precátu súpplici + + Te póscimus, piíssime; + + In hoc triúmpho Mártyris + + Dimítte noxam sérvulis. + + + Laus et perénnis glória + + Deo Patri, et Fílio, + + Sancto simul Paráclito, + + In sempitérna sǽcula. Amen. + en: >- + O God, of those that fought thy fight, + + Portion, and prize, and crown of light, + + Break every bond of sin and shame + + As now we praise thy martyr's name. + + + He recked not of the world's allure, + + But sin and pomp of sin forswore: + + Knew all their gall, and passed them by, + + And reached the throne prepared on high. + + + Bravely the course of pain he ran, + + And bare his torments as a man: + + For love of thee his blood outpoured, + + And thus obtained the great reward. + + + With humble voice and suppliant word + + We pray thee therefore, holy Lord, + + While we thy martyr's feast-day keep, + + Forgive thy loved and erring sheep. + + + Glory and praise for aye be done + + To God the Father, and the Son, + + And Holy Ghost, who reign on high, + + One God, to all eternity. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-responsory-common-of-a-martyr-bishop.yml b/src/data/propers/common/vespers-responsory-common-of-a-martyr-bishop.yml new file mode 100644 index 0000000..438c4bd --- /dev/null +++ b/src/data/propers/common/vespers-responsory-common-of-a-martyr-bishop.yml @@ -0,0 +1,23 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers +# `votive=C2b` live query, 2026-08 -- see vespers-hymn-common-of-a-martyr- +# bishop.yml's header for why the votive-office view was used instead of +# a real saint's own day. +id: vespers-responsory-common-of-a-martyr-bishop +text: + la: | + R.br. Posuísti, Dómine, * Super caput ejus. + ℟. Posuísti, Dómine, * Super caput ejus. + ℣. Corónam de lápide pretióso. + ℟. Super caput ejus. + ℣. Glória Patri, et Fílio, * et Spirítui Sancto. + ℟. Posuísti, Dómine, * Super caput ejus. + en: | + R.br. O Lord, Thou hast set * Upon his head. + ℟. O Lord, Thou hast set * Upon his head. + ℣. A Crown of precious stones. + ℟. Upon his head. + ℣. Glory be to the Father, and to the Son, * and to the Holy Ghost. + ℟. O Lord, Thou hast set * Upon his head. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-responsory-common-of-a-martyr.yml b/src/data/propers/common/vespers-responsory-common-of-a-martyr.yml new file mode 100644 index 0000000..002a7d1 --- /dev/null +++ b/src/data/propers/common/vespers-responsory-common-of-a-martyr.yml @@ -0,0 +1,23 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers +# `votive=C2` live query, 2026-08 -- see vespers-hymn-common-of-a-martyr- +# bishop.yml's header for why the votive-office view was used instead of +# a real saint's own day. +id: vespers-responsory-common-of-a-martyr +text: + la: | + R.br. Posuísti, Dómine, * Super caput ejus. + ℟. Posuísti, Dómine, * Super caput ejus. + ℣. Corónam de lápide pretióso. + ℟. Super caput ejus. + ℣. Glória Patri, et Fílio, * et Spirítui Sancto. + ℟. Posuísti, Dómine, * Super caput ejus. + en: | + R.br. O Lord, Thou hast set * Upon his head. + ℟. O Lord, Thou hast set * Upon his head. + ℣. A Crown of precious stones. + ℟. Upon his head. + ℣. Glory be to the Father, and to the Son, * and to the Holy Ghost. + ℟. O Lord, Thou hast set * Upon his head. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-versicle-common-of-a-martyr-bishop.yml b/src/data/propers/common/vespers-versicle-common-of-a-martyr-bishop.yml new file mode 100644 index 0000000..5da6a0b --- /dev/null +++ b/src/data/propers/common/vespers-versicle-common-of-a-martyr-bishop.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers +# `votive=C2b` live query, 2026-08 -- same versicle as Lauds (see lauds- +# versicle-common-of-a-martyr-bishop.yml). +id: vespers-versicle-common-of-a-martyr-bishop +text: + la: | + ℣. Justus ut palma florébit. + ℟. Sicut cedrus Líbani multiplicábitur. + en: | + ℣. The righteous shall flourish like the palm-tree. + ℟. He shall grow like a cedar in Lebanon. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-versicle-common-of-a-martyr.yml b/src/data/propers/common/vespers-versicle-common-of-a-martyr.yml new file mode 100644 index 0000000..2ec60b4 --- /dev/null +++ b/src/data/propers/common/vespers-versicle-common-of-a-martyr.yml @@ -0,0 +1,14 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers +# `votive=C2` live query, 2026-08 -- same versicle as Lauds (see lauds- +# versicle-common-of-a-martyr.yml). +id: vespers-versicle-common-of-a-martyr +text: + la: | + ℣. Justus ut palma florébit. + ℟. Sicut cedrus Líbani multiplicábitur. + en: | + ℣. The righteous shall flourish like the palm-tree. + ℟. He shall grow like a cedar in Lebanon. +status: + la: verified + en: verified diff --git a/tests/hours/lauds.test.ts b/tests/hours/lauds.test.ts index c113849..7abeaa4 100644 --- a/tests/hours/lauds.test.ts +++ b/tests/hours/lauds.test.ts @@ -157,6 +157,19 @@ describe('resolveOrdo("lauds", ...)', () => { expect(canticle?.kind === 'canticle' ? canticle.antiphon?.text.la : undefined).toContain('In cratícula'); }); + it("uses Common-of-a-Martyr-Bishop's real office bundle on St. Zephyrinus's own day, not the ferial default", () => { + // St. Zephyrinus (Aug 26, Simplex, common-of-a-martyr-bishop) has no + // proper Lauds content of his own; before this Common's Lauds bundle + // was authored, the missing chapter made the whole bundle resolve to + // undefined and fall through to the plain ferial default -- see + // lauds-hymn-common-of-a-martyr-bishop.yml's header. + const ordo = resolveOrdo('lauds', '2026-08-26'); + const chapter = ordo.parts.find((p) => p.kind === 'chapter'); + expect(chapter?.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBe('Jas 1:12'); + const hymn = ordo.parts.find((p) => p.kind === 'hymn'); + expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Martyr Dei, qui únicum'); + }); + it('includes the Kyrie + Our Father lead-in right after the Benedictus, before the day collect (either form)', () => { const ordo = resolveOrdo('lauds', FERIAL_TUESDAY); const litanyIndex = ordo.parts.findIndex((p) => p.kind === 'preces' && p.text.text.la?.includes('Kýrie, eléison')); diff --git a/tests/hours/vespers.test.ts b/tests/hours/vespers.test.ts index 869aa36..fa3faad 100644 --- a/tests/hours/vespers.test.ts +++ b/tests/hours/vespers.test.ts @@ -198,14 +198,42 @@ describe('resolveOrdo("vespers", ...)', () => { }); it("renders Lent's seasonal office", () => { - // 2026-03-03 is a Tuesday in Lent, before Passiontide. - const ordo = resolveOrdo('vespers', '2026-03-03'); + // 2026-03-02 is a Monday in Lent, before Passiontide -- deliberately + // not 03-03, whose own evening (as of the Common-of-a-Martyr-Bishop + // office-bundle authoring below) now correctly anticipates St. Lucius + // I's First Vespers on 03-04 instead of falling through to this + // seasonal default; 03-02's own evening has no adjacent sanctoral + // saint at all, so it stays a clean plain-Lent proof. + const ordo = resolveOrdo('vespers', '2026-03-02'); const chapter = ordo.parts.find((p) => p.kind === 'chapter'); expect(chapter?.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBe('Joel 2:17'); const hymn = ordo.parts.find((p) => p.kind === 'hymn'); expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Audi, benígne Cónditor'); }); + it("uses Common-of-a-Martyr-Bishop's real office bundle, not the ferial default, for a Simplex saint's First Vespers", () => { + // St. Zephyrinus (Aug 26, Simplex, common-of-a-martyr-bishop) claims + // First Vespers over St. Louis's Aug 25 -- see calendar/vespers.ts's + // hasFirstVespers comments. Before this Common's Lauds/Vespers bundle + // was authored, the missing chapter/hymn made the whole bundle + // resolve to undefined, silently falling through to the plain ferial + // default -- live-verified against Divinum Officium's `votive=C2b` + // view instead of a real saint's own day, same reasoning as Common- + // of-a-Confessor-Not-Bishop's own proof (see vespers-hymn-common-of- + // a-martyr-bishop.yml's header). + const ordo = resolveOrdo('vespers', '2026-08-25'); + const chapter = ordo.parts.find((p) => p.kind === 'chapter'); + expect(chapter?.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBe('Jas 1:12'); + const hymn = ordo.parts.find((p) => p.kind === 'hymn'); + expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Deus tuórum mílitum'); + for (const part of ordo.parts) { + if (part.kind === 'chapter' || part.kind === 'responsory' || part.kind === 'hymn' || part.kind === 'versicle') { + expect(part.text.status.la).toBe('verified'); + expect(part.text.status.en).toBe('verified'); + } + } + }); + it("renders Passiontide's seasonal office, with the Gloria Patri omitted from the responsory", () => { // 2026-03-25 is a Wednesday in Passiontide (Passion Sunday 2026-03-22 // through Holy Saturday 2026-04-04).