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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WvnBMq7HGfXRyMsVLu2v4D
This commit is contained in:
2026-08-29 06:22:49 -04:00
parent a2d082e608
commit d4ec104d59
4 changed files with 28 additions and 10 deletions
@@ -2,14 +2,11 @@
# kalendar check (2025-08-29) -- winner outright, Duplex, over the stub # kalendar check (2025-08-29) -- winner outright, Duplex, over the stub
# St. Sabina (see st-sabina.yml). About St. John the Baptist's beheading, # 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. # 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. # Own proper collect and antiphon.
id: decollation-of-st-john-baptist id: decollation-of-st-john-baptist
name: "The Beheading of St. John the Baptist" name: "The Beheading of St. John the Baptist"
rank: duplex rank: duplex
common: common-of-an-apostle common: common-of-a-martyr
propers: "decollation-of-st-john-baptist" propers: "decollation-of-st-john-baptist"
# P/T/S/N: no [Ant Prima]/etc of its own in the source (08-29.txt) -- # 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 # [Rule]/[Rank] point to Commune/C2a instead, the same C-number family
@@ -7,13 +7,18 @@
# web/www/horas/Latin/Sancti/08-29.txt, English/Sancti/08-29.txt. # web/www/horas/Latin/Sancti/08-29.txt, English/Sancti/08-29.txt.
# #
# Nocturn 2: Lectio4-6 (St. Ambrose's treatise On Virgins) combined # 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 # 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 # incipit ("Et réliqua") with no full pericope text given, so — per
# the pre-1955 pass's convention of not transcribing bare incipits — # the pre-1955 pass's convention of not transcribing bare incipits —
# only the homily portion is authored (not marked isGospel), combined # only the homily portion is authored (not marked isGospel), combined
# with Lectio8 as one continuous excerpt of St. Augustine's sermon. # 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 id: decollation-of-st-john-baptist
readings: readings:
- nocturn: 2 - nocturn: 2
@@ -82,6 +87,9 @@ readings:
silent now, can repeat no more the denunciation which thou couldest not bear to hear, and silent now, can repeat no more the denunciation which thou couldest not bear to hear, and
still thou art afraid of it. still thou art afraid of it.
status: { la: verified, en: verified } 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 - nocturn: 3
isGospel: false isGospel: false
+10
View File
@@ -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'); 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', () => { it('a plain ferial day opens with the incipit only', () => {
expect(openingAntiphonLatin(FERIAL_DATE)).not.toContain('Exsultémus'); expect(openingAntiphonLatin(FERIAL_DATE)).not.toContain('Exsultémus');
}); });
+7 -4
View File
@@ -456,14 +456,17 @@ describe('resolveOrdo("vespers", ...)', () => {
expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Iste Conféssor Dómini sacrátus'); 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) // 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 ordo = resolveOrdo('vespers', '2026-08-28');
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('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'); 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", () => { it("no longer gives St. Margaret of Scotland First Vespers now that Corpus Christi's own octave is modeled", () => {