diff --git a/src/data/calendar/saints/decollation-of-st-john-baptist.yml b/src/data/calendar/saints/decollation-of-st-john-baptist.yml index fd378b2..6465cec 100644 --- a/src/data/calendar/saints/decollation-of-st-john-baptist.yml +++ b/src/data/calendar/saints/decollation-of-st-john-baptist.yml @@ -2,14 +2,11 @@ # kalendar check (2025-08-29) -- winner outright, Duplex, over the stub # St. Sabina (see st-sabina.yml). About St. John the Baptist's beheading, # not a feast of the Lord/BVM, so kept in scope like his Nativity in June. -# "common-of-an-apostle" is a loose fit (he isn't one) but the closest -# existing category to "a major male saint honored with his own high -# feast" -- same judgment call as nativity-of-st-john-the-baptist.yml. # Own proper collect and antiphon. id: decollation-of-st-john-baptist name: "The Beheading of St. John the Baptist" rank: duplex -common: common-of-an-apostle +common: common-of-a-martyr propers: "decollation-of-st-john-baptist" # P/T/S/N: no [Ant Prima]/etc of its own in the source (08-29.txt) -- # [Rule]/[Rank] point to Commune/C2a instead, the same C-number family diff --git a/src/data/propers/nocturn-readings/decollation-of-st-john-baptist.yml b/src/data/propers/nocturn-readings/decollation-of-st-john-baptist.yml index 630a330..bdbc9c1 100644 --- a/src/data/propers/nocturn-readings/decollation-of-st-john-baptist.yml +++ b/src/data/propers/nocturn-readings/decollation-of-st-john-baptist.yml @@ -7,13 +7,18 @@ # web/www/horas/Latin/Sancti/08-29.txt, English/Sancti/08-29.txt. # # Nocturn 2: Lectio4-6 (St. Ambrose's treatise On Virgins) combined -# into one reading, one continuous excerpt. +# into one reading, one continuous excerpt. Its closing responsory +# ([Responsory6], marked &Gloria) is genuine proper text, not a +# Commune reference, so it's authored below. # Nocturn 3: Lectio7's Gospel citation (Mark 6:17-29) is a bare # incipit ("Et réliqua") with no full pericope text given, so — per # the pre-1955 pass's convention of not transcribing bare incipits — # only the homily portion is authored (not marked isGospel), combined # with Lectio8 as one continuous excerpt of St. Augustine's sermon. -# No responsory given for either reading. +# [Responsory4], [Responsory7], [Responsory8] are all genuine Commune +# references (@Commune/C2a:Responsory2/5/6 -- Common of a Martyr, per +# decollation-of-st-john-baptist.yml's own `common` field), so Nocturn +# 3 correctly has no proper responsory of its own. id: decollation-of-st-john-baptist readings: - nocturn: 2 @@ -82,6 +87,9 @@ readings: silent now, can repeat no more the denunciation which thou couldest not bear to hear, and still thou art afraid of it. status: { la: verified, en: verified } + responsory: + la: "R. Honéstum fecit illum Dóminus, et custodívit eum ab inimícis, et a seductóribus tutávit illum: * Et dedit illi claritátem ætérnam.\nV. Descendítque cum illo in fóveam, et in vínculis non derelíquit eum.\nR. Et dedit illi claritátem ætérnam." + en: "R. The Lord made him honourable, and kept him from his enemies, and defended him from seducers: * and gave him everlasting glory.\nV. He went down with him into the pit, and left him not in bonds.\nR. And gave him everlasting glory." - nocturn: 3 isGospel: false diff --git a/tests/hours/matins.test.ts b/tests/hours/matins.test.ts index d4d49a3..2522220 100644 --- a/tests/hours/matins.test.ts +++ b/tests/hours/matins.test.ts @@ -596,6 +596,16 @@ describe('resolveOrdo("matins", ...) invitatory antiphon doubling by rank', () = expect(openingAntiphonLatin('2026-08-24')).toContain('Regem Apostolórum Dóminum, * Veníte'); }); + it("the Beheading of St. John the Baptist (2026-08-29, common corrected from apostle to martyr) opens with the martyr Common's invitatory antiphon, not the apostle one", () => { + // Regression test: decollation-of-st-john-baptist.yml's `common` field + // used to be common-of-an-apostle (a mistaken placeholder -- he isn't + // an apostle), which leaked into the Matins invitatory. Corrected to + // common-of-a-martyr, matching the file's own already-correct + // `minorHoursCommon`. + expect(openingAntiphonLatin('2026-08-29')).toContain('Regem Mártyrum Dóminum, * Veníte'); + expect(openingAntiphonLatin('2026-08-29')).not.toContain('Regem Apostolórum'); + }); + it('a plain ferial day opens with the incipit only', () => { expect(openingAntiphonLatin(FERIAL_DATE)).not.toContain('Exsultémus'); }); diff --git a/tests/hours/vespers.test.ts b/tests/hours/vespers.test.ts index db621d2..89e3c3b 100644 --- a/tests/hours/vespers.test.ts +++ b/tests/hours/vespers.test.ts @@ -456,14 +456,17 @@ describe('resolveOrdo("vespers", ...)', () => { expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Iste Conféssor Dómini sacrátus'); }); - it("uses common-of-an-apostle's real office bundle for the Beheading of St. John the Baptist's First Vespers", () => { + it("uses common-of-a-martyr's real office bundle for the Beheading of St. John the Baptist's First Vespers", () => { // Live-verified against Divinum Officium (Monastic Tridentinum 1617) - // votive=C1 -- see vespers-hymn-common-of-an-apostle.yml's header. + // votive=C2 -- see vespers-hymn-common-of-a-martyr.yml's header. + // decollation-of-st-john-baptist.yml's own `common` field was + // corrected from common-of-an-apostle to common-of-a-martyr (he + // isn't an apostle; his own `minorHoursCommon` already agreed). const ordo = resolveOrdo('vespers', '2026-08-28'); const chapter = ordo.parts.find((p) => p.kind === 'chapter'); - expect(chapter?.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBe('Eph 2:19-20'); + 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('Exsúltet cælum láudibus'); + expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Deus tuórum mílitum'); }); it("no longer gives St. Margaret of Scotland First Vespers now that Corpus Christi's own octave is modeled", () => {