Author Common-of-a-Martyr(-Bishop) Lauds/Vespers chapter/responsory/hymn/versicle
Deploy / deploy (push) Successful in 1m18s

St. Zephyrinus (Aug 26, common-of-a-martyr-bishop, Simplex) claims First
Vespers over St. Louis's Aug 25, but that evening was showing the plain
ferial hymn instead of a real Common-of-a-Martyr hymn: no content had
been authored yet for this Common category's Lauds/Vespers bundle, so
resolveOfficeBundle's chapter lookup came back missing and the whole
bundle fell through to the ferial default.

Live-verified against Divinum Officium (Monastic Tridentinum 1617)
votive=C2b: chapter Jac 1:12, Lauds hymn "Martyr Dei, qui unicum," Vespers
hymn "Deus tuorum militum," shared versicle "Justus ut palma florebit."
Used the votive-office view rather than a real saint's own day for the
same structural reason as the earlier Confessor-Not-Bishop fix: 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 Vespers (St. Zephyrinus, St. Callistus). Cross-checked votive=C2/C2a/
C2b/C2-1 all render identical text, so the same 7 files were duplicated
under the plain common-of-a-martyr id too (St. Hadrian, St. Hermes, St.
Fidelis of Sigmaringen).

Updates one existing Vespers test whose date (2026-03-03) turned out to
also anticipate St. Lucius I's First Vespers, previously masked by this
same content gap; adds two new proof tests and a TODO.md entry.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014axryJBrRswYh2niA7WCUc
This commit is contained in:
2026-08-26 07:19:02 -04:00
parent 63fd319509
commit 7816450086
17 changed files with 650 additions and 2 deletions
+31
View File
@@ -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 same honest incremental-content gap, now on a mechanism that no longer silently drops to the
ferial default for any rank. 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) ## Known, deliberate simplifications (not bugs — working as designed)
- `getDayCollects`: each collect in a multi-collect day renders as its own - `getDayCollects`: each collect in a multi-collect day renders as its own
@@ -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-<id> 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
@@ -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-<id> 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
+13
View File
@@ -157,6 +157,19 @@ describe('resolveOrdo("lauds", ...)', () => {
expect(canticle?.kind === 'canticle' ? canticle.antiphon?.text.la : undefined).toContain('In cratícula'); 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)', () => { 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 ordo = resolveOrdo('lauds', FERIAL_TUESDAY);
const litanyIndex = ordo.parts.findIndex((p) => p.kind === 'preces' && p.text.text.la?.includes('Kýrie, eléison')); const litanyIndex = ordo.parts.findIndex((p) => p.kind === 'preces' && p.text.text.la?.includes('Kýrie, eléison'));
+30 -2
View File
@@ -198,14 +198,42 @@ describe('resolveOrdo("vespers", ...)', () => {
}); });
it("renders Lent's seasonal office", () => { it("renders Lent's seasonal office", () => {
// 2026-03-03 is a Tuesday in Lent, before Passiontide. // 2026-03-02 is a Monday in Lent, before Passiontide -- deliberately
const ordo = resolveOrdo('vespers', '2026-03-03'); // 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'); const chapter = ordo.parts.find((p) => p.kind === 'chapter');
expect(chapter?.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBe('Joel 2:17'); expect(chapter?.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBe('Joel 2:17');
const hymn = ordo.parts.find((p) => p.kind === 'hymn'); const hymn = ordo.parts.find((p) => p.kind === 'hymn');
expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Audi, benígne Cónditor'); 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", () => { 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 // 2026-03-25 is a Wednesday in Passiontide (Passion Sunday 2026-03-22
// through Holy Saturday 2026-04-04). // through Holy Saturday 2026-04-04).