diff --git a/TODO.md b/TODO.md index 4b1a49c..4327466 100644 --- a/TODO.md +++ b/TODO.md @@ -3022,6 +3022,21 @@ instead (proper content, not a Common fallback), live-verified end-to-end on the `npm test` (495 tests), `tsc --noEmit` both pass. +### Common-of-Several-Confessors Lauds/Vespers bundle authored — last Common category closed (2026-08-26) + +Read straight from the source (`Sancti/02-12.txt`, Ss. Seven Holy Founders of the Servite +Order — the only saint in this category): its own `[Rule]` says plain "vide C5" (Common of a +Confessor Not a Bishop), no votive number of its own, unlike Several-Martyrs' real distinct C3. +Duplicated the same 7 files under `common-of-several-confessors`. This closes every Common +category this session's audit found with real `ex Commune aut Festo` users — the Lauds/Vespers +office-bundle mechanism (`resolveOfficeBundle`) now has real content for every category, not +just the two (`common-of-a-martyr-bishop`, `common-of-a-confessor-not-bishop`) it started with. + +`npm test` (496 tests), `tsc --noEmit` both pass. **Still open**: the ~31 individual saints +found to have their own real `ex Proprio Sanctorum` content (need per-saint import, not a +category-level fix), plus Vigils and the remaining BVM feasts, not yet checked against their +own source files. + ## 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-several-confessors.yml b/src/data/propers/common/lauds-capitulum-common-of-several-confessors.yml new file mode 100644 index 0000000..0cf317a --- /dev/null +++ b/src/data/propers/common/lauds-capitulum-common-of-several-confessors.yml @@ -0,0 +1,28 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# live query -- St. Louis's own day (2026-08-25) and St. Nicholas of +# Tolentino's own day (2026-09-10, `propers: null`) cross-checked +# byte-identical, confirming this is genuine shared Common content, not +# either saint's own proper. Was falling all the way through to the +# plain ferial default before this (see resolve-common.ts's +# resolveOfficeBundle) -- Lauds' chapter/responsory/hymn/versicle bundle +# was previously gated at duplex-majus+ like the psalmody-override table +# it piggybacked eligibility on, wrongly excluding every lower-ranked +# Common-of-a-Confessor-Not-Bishop saint (e.g. St. Louis, Simplex) from +# their own Common's real content. +# +# Duplicated verbatim under this `common-of-several-confessors` id +# (2026-08-26): read directly from the source (Sancti/02-12.txt, Ss. +# Seven Holy Founders of the Servite Order -- the only saint in this +# category) -- its own `[Rule]` says plain "vide C5" (Common of a +# Confessor Not a Bishop), settling the question with no votive number +# of its own, unlike Several-Martyrs' real distinct C3. +id: lauds-capitulum-common-of-several-confessors +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." + 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." +citation: + la: "Sir 31:8-9" + en: "Sir 31:8-9" +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-hymn-common-of-several-confessors.yml b/src/data/propers/common/lauds-hymn-common-of-several-confessors.yml new file mode 100644 index 0000000..4c84200 --- /dev/null +++ b/src/data/propers/common/lauds-hymn-common-of-several-confessors.yml @@ -0,0 +1,101 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# live query -- St. Louis's own day (2026-08-25) and St. Nicholas of +# Tolentino's own day (2026-09-10, `propers: null`) cross-checked +# byte-identical -- see lauds-capitulum-common-of-a-confessor-not- +# bishop.yml's header for the fuller note on this bundle's gap. "Jesu +# coróna célsior" -- self-contained, including its own final doxology +# stanza; distinct from the Common-of-a-Confessor-Bishop's own Lauds hymn +# ("Jesu Redémptor ómnium") -- the reference engine's votive-office +# dropdown separates the two categories as C4 ("Confessoris Pontificis") +# and C5 ("Confessoris non Pontificis"), each with its own full Office +# bundle, not (as CommuneM/C4a.txt's file-inheritance structure might +# suggest at a skim) one category layered as a thin override of the +# other -- C4a.txt is actually "Doctoris Pontificis", unrelated to this +# category despite the superficially similar filename. +id: lauds-hymn-common-of-several-confessors +text: + la: | + Jesu coróna célsior, + Et véritas sublímior, + Qui confiténti sérvulo + Reddis perénne prǽmium: + + Da supplicánti cœ́tui, + Obténtu hujus óptimi, + Remissiónem críminum + Rumpéndo nexum vínculi. + + Anni recúrso témpore, + Dies illúxit lúmine, + Quo Sanctus hic de córpore + Polum migrávit prǽpotens. + + Hic vana terræ gáudia + Et luculénta prǽdia, + Pollúta sorde députans, + Ovans tenet cæléstia. + + Te, Christe Rex piíssime, + Hic confiténdo júgiter, + Calcávit hostem fórtiter, + Supérbum ac satéllitem. + + Virtútum actu et fide, + Confessiónis órdine, + Jejúna membra déferens, + Dapes supérnas óbtinet. + + Proínde te, piíssime, + Precámur omnes súpplices, + Ut hujus almi grátia + Nobis remíttas débita. + + Glória Patri Dómino, + Glória Unigénito, + Una cum Sancto Spíritu, + In sempitérna sǽcula. + Amen. + en: | + Jesu, eternal truth sublime, + Through endless years the same! + Thou crown of those who through all time + Confess thy holy name: + + Thy suppliant people, through the prayer + Of thy blest saint, forgive; + For his dear sake, thy wrath forbear, + And bid our spirits live. + + Again returns the sacred day, + With heavenly glory bright, + Which saw him go upon his way + Into the realms of light. + + All objects of our vain desire, + All earthly joys and gains, + To him were but as filthy mire; + And now with thee he reigns. + + Thee, Jesu, his all-gracious Lord, + Confessing to the last, + He trod beneath him Satan's fraud, + And stood forever fast. + + In holy deeds of faith and love, + In fastings and in prayers, + His days were spent; and now above + Thy heavenly feast he shares. + + Then, for his sake thy wrath lay by, + And hear us while we pray; + And pardon us, O thou most high, + On this his festal day. + + All glory to the Father be; + And sole Incarnate Son; + Praise, holy Paraclete, to thee; + While endless ages run. + Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-responsory-common-of-several-confessors.yml b/src/data/propers/common/lauds-responsory-common-of-several-confessors.yml new file mode 100644 index 0000000..2a486f6 --- /dev/null +++ b/src/data/propers/common/lauds-responsory-common-of-several-confessors.yml @@ -0,0 +1,24 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# live query -- St. Louis's own day (2026-08-25) and St. Nicholas of +# Tolentino's own day (2026-09-10, `propers: null`) cross-checked +# byte-identical -- see lauds-capitulum-common-of-a-confessor-not- +# bishop.yml's header for the fuller note on this bundle's gap. +id: lauds-responsory-common-of-several-confessors +text: + la: | + R.br. Amávit eum Dóminus, * Et ornávit eum. + ℟. Amávit eum Dóminus, * Et ornávit eum. + ℣. Stolam glóriæ índuit eum. + ℟. Et ornávit eum. + ℣. Glória Patri, et Fílio, * et Spirítui Sancto. + ℟. Amávit eum Dóminus, * Et ornávit eum. + en: | + R.br. The Lord loved him, * and beautified him. + ℟. The Lord loved him, * and beautified him. + ℣. He clothed him with a robe of glory. + ℟. And beautified him. + ℣. Glory be to the Father, and to the Son, * and to the Holy Ghost. + ℟. The Lord loved him, * and beautified him. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-versicle-common-of-several-confessors.yml b/src/data/propers/common/lauds-versicle-common-of-several-confessors.yml new file mode 100644 index 0000000..25d82a4 --- /dev/null +++ b/src/data/propers/common/lauds-versicle-common-of-several-confessors.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# live query -- St. Louis's own day (2026-08-25) and St. Nicholas of +# Tolentino's own day (2026-09-10, `propers: null`) cross-checked +# byte-identical -- see lauds-capitulum-common-of-a-confessor-not- +# bishop.yml's header for the fuller note on this bundle's gap. +id: lauds-versicle-common-of-several-confessors +text: + la: "V. Justum dedúxit Dóminus per vias rectas.\nR. Et osténdit illi regnum Dei." + en: "V. The Lord guided the just in right paths.\nR. And showed him the kingdom of God." +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-hymn-common-of-several-confessors.yml b/src/data/propers/common/vespers-hymn-common-of-several-confessors.yml new file mode 100644 index 0000000..9a7cae6 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-common-of-several-confessors.yml @@ -0,0 +1,104 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers, +# `votive=C5` live query, 2026-08 -- see vespers-responsory-common-of-a- +# confessor-not-bishop.yml's header for why the votive-office view was +# used instead of a real saint's own (outranked) Second Vespers. Same +# "Iste Conféssor Dómini sacrátus" hymn (Monastic-track pre-Urban VIII +# text) already authored for this Common's Matins hymn -- see matins- +# hymn-common-of-several-confessors.yml's header for the Monastic- +# vs-secular textual-variant note -- so its Latin and English (an +# original translation, not the reference engine's own, for the same +# reason recorded there) are reused verbatim here rather than +# re-translated, for consistency across hours. +id: vespers-hymn-common-of-several-confessors +text: + la: >- + Iste Conféssor Dómini sacrátus, + + Festa plebs cujus celébrat per orbem, + + Hódie lætus méruit secréta + + Scándere cæli. + + + Qui pius, prudens, húmilis, pudícus, + + Sóbrius, castus fuit et quiétus, + + Vita dum præsens vegetávit ejus + + Córporis artus. + + + Ob sacrum cujus túmulum frequénter + + Membra languéntum modo sanitáti, + + Quólibet morbo fúerint graváta, + + Restituúntur. + + + Unde nunc noster chorus in honórem + + Ipsius, hymnum canit hunc libénter: + + Ut piis ejus méritis juvémur + + Omne per ævum. + + + Sit salus illi, decus atque virtus, + + Qui supra cæli résidens cacúmen, + + Tótius mundi máchinam gubérnat + + Trinus et unus. Amen. + en: >- + This is the Lord's own hallowed confessor, + + Whose feast today the nations round are keeping; + + Joyful, he merited this day to enter + + Heaven's hid glory. + + + Dutiful, prudent, humble, chaste, he flourished, + + Sober and quiet, pure in all his living, + + While in his body yet the breath of this life + + Quickened his members. + + + Often at his consecrated tomb, the + + Limbs of those worn by long and grievous sickness, + + Whatsoever ill had laid them low, are + + Wholly restored. + + + Therefore our choir today, in glad thanksgiving, + + Sings in his honor this our joyful anthem: + + That by his merits, freely won through goodness, + + We may be aided. + + + Praise be to Him, all honor, might, dominion, + + Who from the height of heaven's throne is reigning, + + Governing all the fabric of creation, + + Three and yet One. Amen. +status: + la: verified + en: draft diff --git a/src/data/propers/common/vespers-responsory-common-of-several-confessors.yml b/src/data/propers/common/vespers-responsory-common-of-several-confessors.yml new file mode 100644 index 0000000..4f745b9 --- /dev/null +++ b/src/data/propers/common/vespers-responsory-common-of-several-confessors.yml @@ -0,0 +1,34 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers, +# `votive=C5` ("Commune Confessoris non Pontificis") live query, 2026-08 -- +# bypasses calendar concurrence entirely (every real confessor-not-bishop +# saint's Second Vespers turned out to be outranked by an adjacent fixed +# feast in 2026: St. Louis by St. Zephyrinus's First Vespers, St. Francis +# by SS. Placid and Companions', St. Dominic by Our Lady of the Snows', +# St. Nicholas of Tolentino by the Nativity-of-the-BVM octave's -- a +# structural pattern across this Common category, not a query mistake), +# so the votive-office view was used instead to get the category's true +# content directly. See lauds-capitulum-common-of-a-confessor-not- +# bishop.yml's header for the fuller note on this bundle's gap; the +# chapter itself is byte-identical to the Lauds one (same Sir 31:8-9), +# which is why no separate vespers-capitulum- file was authored -- +# see vespers.ts's vespersCapitulumForOverride, which falls through to +# the Lauds file automatically, same as St. Lawrence's own precedent. +id: vespers-responsory-common-of-several-confessors +text: + la: | + R.br. Os justi * Meditábitur sapiéntiam. + ℟. Os justi * Meditábitur sapiéntiam. + ℣. Et lingua ejus loquétur judícium. + ℟. Meditábitur sapiéntiam. + ℣. Glória Patri, et Fílio, * et Spirítui Sancto. + ℟. Os justi * Meditábitur sapiéntiam. + en: | + R.br. The mouth of the righteous * speaketh wisdom. + ℟. The mouth of the righteous * speaketh wisdom. + ℣. And his tongue talketh judgment. + ℟. The righteous speaketh wisdom. + ℣. Glory be to the Father, and to the Son, * and to the Holy Ghost. + ℟. The mouth of the righteous * speaketh wisdom. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-versicle-common-of-several-confessors.yml b/src/data/propers/common/vespers-versicle-common-of-several-confessors.yml new file mode 100644 index 0000000..72ab689 --- /dev/null +++ b/src/data/propers/common/vespers-versicle-common-of-several-confessors.yml @@ -0,0 +1,11 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers, +# `votive=C5` live query, 2026-08 -- see vespers-responsory-common-of-a- +# confessor-not-bishop.yml's header for why the votive-office view was +# used instead of a real saint's own (outranked) Second Vespers. +id: vespers-versicle-common-of-several-confessors +text: + la: "V. Amávit eum Dóminus, et ornávit eum.\nR. Stolam glóriæ índuit eum." + en: "V. The Lord loved him and beautified him.\nR. He clothed him with a robe of glory." +status: + la: verified + en: verified diff --git a/tests/hours/lauds.test.ts b/tests/hours/lauds.test.ts index be48b6c..e427949 100644 --- a/tests/hours/lauds.test.ts +++ b/tests/hours/lauds.test.ts @@ -266,6 +266,17 @@ describe('resolveOrdo("lauds", ...)', () => { } }); + it("uses common-of-several-confessors's real office bundle (= Confessor-Not-Bishop content) on Ss. Seven Founders' own day", () => { + // Read directly from the source (Sancti/02-12.txt): its own [Rule] + // says plain "vide C5" -- see lauds-capitulum-common-of-several- + // confessors.yml's header. + const ordo = resolveOrdo('lauds', '2026-02-12'); + const chapter = ordo.parts.find((p) => p.kind === 'chapter'); + expect(chapter?.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBe('Sir 31:8-9'); + const hymn = ordo.parts.find((p) => p.kind === 'hymn'); + expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Jesu coróna célsior'); + }); + 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'));