From 6bab6047c1c1f975f062136962ef34739fee624e Mon Sep 17 00:00:00 2001 From: Will Estes Date: Wed, 12 Aug 2026 16:16:33 -0400 Subject: [PATCH] Author full Christmas-Octave Sunday content, fix a temporal-id override gap christmas-octave-sunday previously had only its Benedictus antiphon authored -- no Lauds psalmody override or office bundle, no Prime/Terce/ Sext/None content at all. Adds the full set: Lauds psalmody (3 psalms + Canticle of the Three Young Men + Laudate, all distinct antiphons), Lauds capitulum/versicle/hymn ("A solis ortus cardine"), and Prime/Terce/ Sext/None antiphons+chapters (Terce/Sext/None only, matching Gal 4:1-2/4:4-5/4:7 -- the same reading the raw Monastic Tridentinum 1617 source file gives for this Sunday). Real code gap found and fixed along the way: getMinorHourOverrideId (hours/resolve-common.ts) only checked the sanctoral branch of resolveOfficeWinner's result, so a named temporal feast in ALWAYS_OVERRIDE_TEMPORAL_IDS (marian-saturday, christ-the-king) got a Lauds psalmody override but silently never a Prime/Terce/Sext/None one, however much was authored for it. Fixed by mirroring getPsalmodyOverrideFor's own temporal-id branch (hours/lauds.ts), and christmas-octave-sunday added to that set. Content sourced from a "Divino Afflatu 1954" live query rather than Monastic Tridentinum 1617, since 1617 has no real identity of its own for this Sunday under its own calendar rules on most Dec 26-29 dates (only the collect, already authored separately, happened to be pulled from a date where 1617 did render it) -- consistent with this app's stated precedent of following D.A. for calendar/precedence even while keeping 1617's shape for the hours themselves elsewhere. Co-Authored-By: Claude Sonnet 5 --- TODO.md | 56 ++++++++++++ .../christmas-octave-sunday.yml | 30 ++++++ ...auds-capitulum-christmas-octave-sunday.yml | 16 ++++ .../lauds-hymn-christmas-octave-sunday.yml | 91 +++++++++++++++++++ ...lauds-versicle-christmas-octave-sunday.yml | 10 ++ .../none-antiphon-christmas-octave-sunday.yml | 10 ++ ...none-capitulum-christmas-octave-sunday.yml | 13 +++ ...prime-antiphon-christmas-octave-sunday.yml | 10 ++ .../sext-antiphon-christmas-octave-sunday.yml | 10 ++ ...sext-capitulum-christmas-octave-sunday.yml | 13 +++ ...terce-antiphon-christmas-octave-sunday.yml | 10 ++ ...erce-capitulum-christmas-octave-sunday.yml | 16 ++++ .../christmas-octave-sunday-collect.yml | 7 ++ src/hours/resolve-common.ts | 13 ++- 14 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 src/data/hours/lauds-psalmody-overrides/christmas-octave-sunday.yml create mode 100644 src/data/propers/common/lauds-capitulum-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/lauds-hymn-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/lauds-versicle-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/none-antiphon-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/none-capitulum-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/prime-antiphon-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/sext-antiphon-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/sext-capitulum-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/terce-antiphon-christmas-octave-sunday.yml create mode 100644 src/data/propers/common/terce-capitulum-christmas-octave-sunday.yml diff --git a/TODO.md b/TODO.md index ca3dc9b..c7f6a0a 100644 --- a/TODO.md +++ b/TODO.md @@ -161,6 +161,62 @@ future Martyr-common saint don't need one (Confessors never get a Paschaltide variant at all; a Martyr one would need porting `C2p`/`C3p` the same way, if and when a saint needing it is authored). +### Christmas-Octave Sunday content — done (2026-08) + +Was: only the Benedictus antiphon existed for `christmas-octave-sunday` +(`christmas-octave-sunday-benedictus-antiphon.yml`) — no collect (a +separate, older file, `christmas-octave-sunday-collect.yml`, did already +exist and was untouched here), no Lauds psalmody override or office +bundle, no Prime/Terce/Sext/None content at all. + +Real code gap found and fixed along the way: `getMinorHourOverrideId` +(`hours/resolve-common.ts`) only ever checked the *sanctoral* branch of +`resolveOfficeWinner`'s result — a named temporal feast in +`ALWAYS_OVERRIDE_TEMPORAL_IDS` (`marian-saturday`, `christ-the-king`) got +a Lauds psalmody override via `getPsalmodyOverrideFor`'s own separate +check of that set, but silently *never* a Prime/Terce/Sext/None one, +however much content got authored for it — nothing had actually +exercised that path until now. Fixed by mirroring `getPsalmodyOverrideFor` +`hours/lauds.ts`'s own temporal-id branch. + +Content itself needed a different source than every other pull this +session: Monastic Tridentinum 1617 has no real "Dominica Infra Octavam +Nativitatis" identity of its own under its own calendar rules on most +Dec 26-29 Sundays (verified live: 2026-12-27 renders as "S. Joannis +Apostoli," not the Sunday, under `version=Monastic Tridentinum 1617` — +only the collect happens to be old enough to have been pulled from a +date, 2029-12-30, where 1617 *did* render it outright). Lauds psalmody, +office bundle, and Prime/Terce/Sext/None content instead pulled live +under `version=Divino Afflatu 1954` (2026-12-27), consistent with this +app's own stated precedent of following D.A. for the calendar/precedence +layer even while keeping Monastic 1617's shape for the hours themselves — +this is one of the rare days where that split genuinely can't be +maintained, since 1617 has nothing of its own to shape. `christmas- +octave-sunday-collect.yml`'s existing 1617-sourced text was kept as-is +(cross-checked identical against both the new D.A. query and the raw +Monastic Tridentinum 1617 source file, `Tempora/Nat1-0.txt`'s own +`[Oratio]`) rather than replaced. + +Files: `lauds-psalmody-overrides/christmas-octave-sunday.yml` (3 psalms + +Canticle of the Three Young Men + Laudate, all distinct antiphons), +`lauds-capitulum-/-versicle-/-hymn-christmas-octave-sunday.yml` ("A solis +ortus cardine"). No `lauds-responsory-christmas-octave-sunday.yml` +authored — genuinely absent from the live rendering (hymn leads straight +into the versicle, no short responsory in between), not an oversight; +left "missing" honestly rather than invented. Prime/Terce/Sext/None all +four get a proper antiphon (a short "Allelúia, ..." set drawn from the +day psalter, distinct per hour); Terce/Sext/None each get a proper +chapter (Gal 4:1-2/4:4-5/4:7, matching the raw 1617 source's own +`Nat1-0.txt` exactly) with its own versicle per the D.A. live rendering +(not the 1617 source's own versicle, which reuses one versicle across +all three hours — a cross-era mismatch flagged here, not silently +papered over, since this whole day's content already mixes eras out of +necessity). + +Not attempted: `Nat2-0` (Feast of the Holy Name of Jesus) isn't in this +app's sanctoral/temporal calendar at all yet — a separate, bigger ask if +wanted (see the original scoping discussion this session). + ### Overlapping octaves — done (2026-08) Was: `resolveOfficeWinner`/`getDayLabel` picked whichever active octave diff --git a/src/data/hours/lauds-psalmody-overrides/christmas-octave-sunday.yml b/src/data/hours/lauds-psalmody-overrides/christmas-octave-sunday.yml new file mode 100644 index 0000000..c74a683 --- /dev/null +++ b/src/data/hours/lauds-psalmody-overrides/christmas-octave-sunday.yml @@ -0,0 +1,30 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954" -- not Monastic +# Tridentinum 1617, which has no real "Dominica Infra Octavam Nativitatis" +# identity of its own under its own calendar rules; see christmas-octave- +# sunday-benedictus-antiphon.yml's header and TODO.md for the Dec 26-30 +# Sunday rule this is a deliberate remix around), Lauds live query, +# 2026-12-27 (the actual Sunday that year, St. John's own day commemorated +# in return). +id: christmas-octave-sunday +groups: + - psalms: [92] + antiphon: + la: "Quem vidístis, * pastóres? dícite, annuntiáte nobis, in terris quis appáruit? Natum vídimus, et choros Angelórum collaudántes Dóminum, allelúia, allelúia." + en: "O ye shepherds, speak, * and tell us what ye have seen; who is appeared in the earth? We saw the newborn Child, and angels singing praise to the Lord, alleluia, alleluia." + - psalms: [99] + antiphon: + la: "Génuit puérpera * Regem, cui nomen ætérnum, et gáudia matris habens cum virginitátis honóre: nec primam símilem visa est, nec habére sequéntem, allelúia." + en: "The Mother brought forth the King, * Whose name is called The Eternal; the joy of a Mother was hers, remaining a Virgin unsullied; neither before nor henceforth hath there been or shall be such another, alleluia." + - psalms: [62] + antiphon: + la: "Angelus ad pastóres * ait: Annúntio vobis gáudium magnum: quia natus est vobis hódie Salvátor mundi, allelúia." + en: "The Angel said unto the shepherds * I bring you good tidings of great joy; for unto you is born this day a Saviour of the world, alleluia." +canticle: + id: canticum-trium-puerorum + antiphon: + la: "Facta est cum Angelo * multitúdo cæléstis exércitus laudántium Deum, et dicéntium: Glória in excélsis Deo, et in terra pax homínibus bonæ voluntátis, allelúia." + en: "There was with the Angel a multitude of the heavenly host, * praising God, and saying Glory to God in the highest, and on earth peace, to men of good will, alleluia." +laudate: + antiphon: + la: "Párvulus fílius * hódie natus est nobis: et vocábitur Deus, Fortis, allelúia, allelúia." + en: "Unto us this day a little Child is born, * and His name shall be called the Mighty God, alleluia, alleluia." diff --git a/src/data/propers/common/lauds-capitulum-christmas-octave-sunday.yml b/src/data/propers/common/lauds-capitulum-christmas-octave-sunday.yml new file mode 100644 index 0000000..5648bcf --- /dev/null +++ b/src/data/propers/common/lauds-capitulum-christmas-octave-sunday.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), Lauds live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. Matches Terce's own capitulum reading (Gal 4:1-2) +# -- Terce's chapter equals Lauds' in the Monastic tradition, same pattern +# already seen in the Common of Apostles (terce-capitulum-common-of- +# apostles.yml). +id: lauds-capitulum-christmas-octave-sunday +text: + la: "Fratres: Quanto témpore heres párvulus est, nihil differt a servo, cum sit dóminus ómnium: sed sub tutóribus et actóribus est usque ad præfínitum tempus a patre." + en: "Brothers: As long as the heir is a child, he differeth nothing from a servant, though he be lord of all; But is under tutors and governors until the time appointed by the father." +citation: + la: "Gal 4:1-2" + en: "Gal 4:1-2" +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-hymn-christmas-octave-sunday.yml b/src/data/propers/common/lauds-hymn-christmas-octave-sunday.yml new file mode 100644 index 0000000..217624a --- /dev/null +++ b/src/data/propers/common/lauds-hymn-christmas-octave-sunday.yml @@ -0,0 +1,91 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), Lauds live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. "A solis ortus cardine" -- self-contained, +# including its own final doxology stanza. +id: lauds-hymn-christmas-octave-sunday +text: + la: | + A solis ortus cárdine + Ad usque terræ límitem, + Christum canámus Príncipem, + Natum María Vírgine. + + Beátus auctor sǽculi + Servíle corpus índuit: + Ut carne carnem líberans, + Ne pérderet quos cóndidit. + + Castæ Paréntis víscera + Cæléstis intrat grátia: + Venter Puéllæ báiulat + Secréta, quæ non nóverat. + + Domus pudíci péctoris + Templum repénte fit Dei: + Intácta nésciens virum, + Concépit alvo Fílium. + + Enítitur puérpera, + Quem Gábriel prædíxerat, + Quem ventre Matris géstiens, + Baptísta clausum sénserat. + + Fœno iacére pértulit: + Præsépe non abhórruit: + Et lacte módico pastus est, + Per quem nec ales ésurit. + + Gaudet chorus cæléstium, + Et Angeli canunt Deo; + Palámque fit pastóribus + Pastor, Creátor ómnium. + + Iesu, tibi sit glória, + Qui natus es de Vírgine, + Cum Patre, et almo Spíritu, + In sempitérna sǽcula. + Amen. + en: | + From lands that see the sun arise + To earth's remotest boundaries, + The Virgin-born today we sing, + The Son of Mary, Christ the King. + + Blest Author of this earthly frame, + To take a servant's form He came, + That, liberating flesh by flesh, + Whom He had made might live afresh. + + In that chaste parent's holy womb + Celestial grace hath found its home; + And she, as earthly bride unknown, + Yet calls that Offspring blest her own. + + The mansion of the modest breast + Becomes a shrine where God shall rest: + The pure and undefilèd one + Conceived in her womb the Son. + + That Son, that Royal Son she bore, + Whom Gabriel's voice had told afore; + Whom, in His mother yet concealed, + The infant Baptist had revealed. + + The manger and the straw He bore, + The cradle did He not abhor; + By milk in infant portions fed, + Who gives e'en fowls their daily bread. + + The heavenly chorus filled the sky, + The Angels sang to God on high, + What time to shepherds, watching lone, + They made creation's Shepherd known. + + All honor, laud, and glory be, + O Jesu, Virgin-born to thee: + All glory, as is ever meet, + To Father and to Paraclete. + Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-versicle-christmas-octave-sunday.yml b/src/data/propers/common/lauds-versicle-christmas-octave-sunday.yml new file mode 100644 index 0000000..13c7f2b --- /dev/null +++ b/src/data/propers/common/lauds-versicle-christmas-octave-sunday.yml @@ -0,0 +1,10 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), Lauds live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. +id: lauds-versicle-christmas-octave-sunday +text: + la: "V. Verbum caro factum est, allelúia.\nR. Et habitávit in nobis, allelúia." + en: "V. The Word was made flesh, alleluia.\nR. And dwelt among us, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-antiphon-christmas-octave-sunday.yml b/src/data/propers/common/none-antiphon-christmas-octave-sunday.yml new file mode 100644 index 0000000..c328b15 --- /dev/null +++ b/src/data/propers/common/none-antiphon-christmas-octave-sunday.yml @@ -0,0 +1,10 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), None live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. +id: none-antiphon-christmas-octave-sunday +text: + la: "Allelúia, * fáciem tuam, Dómine, illúmina super servum tuum, allelúia, allelúia." + en: "Alleluia, * make thy face to shine upon thy servant, alleluia, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/none-capitulum-christmas-octave-sunday.yml b/src/data/propers/common/none-capitulum-christmas-octave-sunday.yml new file mode 100644 index 0000000..1b8de4c --- /dev/null +++ b/src/data/propers/common/none-capitulum-christmas-octave-sunday.yml @@ -0,0 +1,13 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), None live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. +id: none-capitulum-christmas-octave-sunday +text: + la: "Itaque iam non est servus, sed fílius: quod si fílius, et hæres per Deum. R. Deo grátias. V. Verbum caro factum est, allelúia. R. Et habitávit in nobis, allelúia." + en: "Therefore now he is not a servant, but a son. And if a son, an heir also through God. R. Thanks be to God. V. The Word was made flesh, alleluia. R. And dwelt among us, alleluia." +citation: + la: "Gal 4:7" + en: "Gal 4:7" +status: + la: verified + en: verified diff --git a/src/data/propers/common/prime-antiphon-christmas-octave-sunday.yml b/src/data/propers/common/prime-antiphon-christmas-octave-sunday.yml new file mode 100644 index 0000000..a3dc92a --- /dev/null +++ b/src/data/propers/common/prime-antiphon-christmas-octave-sunday.yml @@ -0,0 +1,10 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), Prime live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. +id: prime-antiphon-christmas-octave-sunday +text: + la: "Allelúia, * confitémini Dómino, quóniam in sǽculum misericórdia eius, allelúia, allelúia." + en: "Alleluia, * Give glory to the Lord, for his mercy endureth for ever, alleluia, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-antiphon-christmas-octave-sunday.yml b/src/data/propers/common/sext-antiphon-christmas-octave-sunday.yml new file mode 100644 index 0000000..decebdb --- /dev/null +++ b/src/data/propers/common/sext-antiphon-christmas-octave-sunday.yml @@ -0,0 +1,10 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), Sext live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. +id: sext-antiphon-christmas-octave-sunday +text: + la: "Allelúia, * tuus sum ego, salvum me fac, Dómine, allelúia, allelúia." + en: "Alleluia, * I am thine, save thou me, O Lord, alleluia, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/sext-capitulum-christmas-octave-sunday.yml b/src/data/propers/common/sext-capitulum-christmas-octave-sunday.yml new file mode 100644 index 0000000..4faa5ef --- /dev/null +++ b/src/data/propers/common/sext-capitulum-christmas-octave-sunday.yml @@ -0,0 +1,13 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), Sext live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. +id: sext-capitulum-christmas-octave-sunday +text: + la: "At ubi venit plenitúdo témporis, misit Deus Fílium suum factum ex mulíere, factum sub lege, ut eos, qui sub lege erant, redímeret, ut adoptiónem filiórum reciperémus. R. Deo grátias. V. Vidérunt omnes fines terræ, allelúia. R. Salutáre Dei nostri, allelúia." + en: "But when the fulness of the time was come, God sent his Son, made of a woman, made under the law: That he might redeem them who were under the law: that we might receive the adoption of sons. R. Thanks be to God. V. All the ends of the earth have seen, alleluia. R. The salvation of our God, alleluia." +citation: + la: "Gal 4:4-5" + en: "Gal 4:4-5" +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-antiphon-christmas-octave-sunday.yml b/src/data/propers/common/terce-antiphon-christmas-octave-sunday.yml new file mode 100644 index 0000000..fc9cafc --- /dev/null +++ b/src/data/propers/common/terce-antiphon-christmas-octave-sunday.yml @@ -0,0 +1,10 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), Terce live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. +id: terce-antiphon-christmas-octave-sunday +text: + la: "Allelúia, * deduc me, Dómine, in sémitam mandatórum tuórum, allelúia, allelúia." + en: "Alleluia, * Lead me into the path of thy commandments, alleluia, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/common/terce-capitulum-christmas-octave-sunday.yml b/src/data/propers/common/terce-capitulum-christmas-octave-sunday.yml new file mode 100644 index 0000000..bd14d3d --- /dev/null +++ b/src/data/propers/common/terce-capitulum-christmas-octave-sunday.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium ("Divino Afflatu 1954"), Terce live +# query, 2026-12-27 -- see lauds-psalmody-overrides/christmas-octave- +# sunday.yml's header. Reading matches Lauds' own capitulum (Gal 4:1-2, +# lauds-capitulum-christmas-octave-sunday.yml) -- Terce's chapter equals +# Lauds' in the Monastic tradition -- but with its own distinct closing +# versicle here, per the live rendering. +id: terce-capitulum-christmas-octave-sunday +text: + la: "Fratres: Quanto témpore heres párvulus est, nihil differt a servo, cum sit dóminus ómnium: sed sub tutóribus et actóribus est usque ad præfínitum tempus a patre. R. Deo grátias. V. Ipse invocábit me, allelúia. R. Pater meus es tu, allelúia." + en: "Brothers: As long as the heir is a child, he differeth nothing from a servant, though he be lord of all; But is under tutors and governors until the time appointed by the father. R. Thanks be to God. V. He shall cry unto Me, alleluia. R. Thou art My Father, alleluia." +citation: + la: "Gal 4:1-2" + en: "Gal 4:1-2" +status: + la: verified + en: verified diff --git a/src/data/propers/temporal/christmas-octave-sunday-collect.yml b/src/data/propers/temporal/christmas-octave-sunday-collect.yml index fd88794..bcbbd10 100644 --- a/src/data/propers/temporal/christmas-octave-sunday-collect.yml +++ b/src/data/propers/temporal/christmas-octave-sunday-collect.yml @@ -4,6 +4,13 @@ # ("post-pentecost-N") rather than Trinity-counted deliberately: this is # content storage, kept scheme-agnostic, independent of whatever counting # convention calendar/day-label.ts shows on screen for the same Sunday. +# Cross-checked (2026-08) against a "Divino Afflatu 1954" live query, +# 2026-12-27, and against the raw Monastic Tridentinum 1617 source file +# (web/www/horas/Latin/Tempora/Nat1-0.txt's own [Oratio]) -- identical in +# both, despite 1617 not rendering this Sunday's identity live on most +# dates under its own calendar rules; see lauds-psalmody-overrides/ +# christmas-octave-sunday.yml's header for why the rest of this Sunday's +# newly-authored content (2026-08) had to come from Divino Afflatu instead. id: christmas-octave-sunday-collect text: la: | diff --git a/src/hours/resolve-common.ts b/src/hours/resolve-common.ts index 90a99ff..52d9632 100644 --- a/src/hours/resolve-common.ts +++ b/src/hours/resolve-common.ts @@ -20,7 +20,7 @@ export function resolveCommon(id: string): ResolvedText { // override-eligible — see hours/lauds.ts's getPsalmodyOverrideFor, which // shares this set (imported from here, not duplicated) since it's the // same "does this temporal identity carry its own real office" question. -export const ALWAYS_OVERRIDE_TEMPORAL_IDS = new Set(['marian-saturday', 'christ-the-king']); +export const ALWAYS_OVERRIDE_TEMPORAL_IDS = new Set(['marian-saturday', 'christ-the-king', 'christmas-octave-sunday']); /** * Which identity's own propers actually supply the office's content @@ -100,11 +100,22 @@ export function isSundayOrFeastOffice(day: LiturgicalDay): boolean { * as each remaining duplex-majus+ saint gets a Lauds override authored, * the same id is what Prime/Terce/Sext/None would look for too, so it's * one shared backlog (see TODO.md), not per-hour lists that can drift. + * Also honors ALWAYS_OVERRIDE_TEMPORAL_IDS the same way + * getPsalmodyOverrideFor does — a named temporal feast (`christ-the- + * king`, `christmas-octave-sunday`) is eligible regardless of rank, since + * it has no FeastClass to compare against duplex-majus in the first + * place. Missing until 2026-08: this function only checked the sanctoral + * branch, so a temporal id in that set got a Lauds psalmody override but + * silently no Prime/Terce/Sext/None one, however much was authored for + * it — a real gap, not by design. * Returns the id to look up (`${hourId}-antiphon-${id}` etc.), or * `undefined` when nothing eligible is happening today. */ export function getMinorHourOverrideId(day: LiturgicalDay): string | undefined { const winner = resolveOfficeWinner(day); + if (winner.kind === 'temporal' && ALWAYS_OVERRIDE_TEMPORAL_IDS.has(winner.id)) { + return winner.id; + } if (winner.kind === 'sanctoral' && isAtLeast(winner.rank, 'duplex-majus')) { return winner.id; }