From d4ec104d59d50c3c9e105c8dd074be60991e99b9 Mon Sep 17 00:00:00 2001 From: Will Estes Date: Sat, 29 Aug 2026 06:22:49 -0400 Subject: [PATCH] Fix Beheading of St. John the Baptist's wrong Common category decollation-of-st-john-baptist.yml's `common` field was set to common-of-an-apostle -- a mistaken placeholder (he isn't an apostle) that leaked into the Aug 29 Matins invitatory and the Lauds/Vespers office bundle. Corrected to common-of-a-martyr, matching the file's own already- correct `minorHoursCommon` field. Also corrected a stale comment in the feast's own nocturn-readings file claiming neither Nocturn 2 nor 3 has a proper responsory: Nocturn 2's own closing responsory is genuine proper text (not a Commune reference like Nocturn 3's), and is now authored. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01WvnBMq7HGfXRyMsVLu2v4D --- .../saints/decollation-of-st-john-baptist.yml | 5 +---- .../decollation-of-st-john-baptist.yml | 12 ++++++++++-- tests/hours/matins.test.ts | 10 ++++++++++ tests/hours/vespers.test.ts | 11 +++++++---- 4 files changed, 28 insertions(+), 10 deletions(-) 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", () => {