Author full Christmas-Octave Sunday content, fix a temporal-id override gap
Deploy / deploy (push) Successful in 57s

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 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 16:16:33 -04:00
parent bcae61568a
commit 6bab6047c1
14 changed files with 304 additions and 1 deletions
+56
View File
@@ -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` Paschaltide variant at all; a Martyr one would need porting `C2p`/`C3p`
the same way, if and when a saint needing it is authored). 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) ### Overlapping octaves — done (2026-08)
Was: `resolveOfficeWinner`/`getDayLabel` picked whichever active octave Was: `resolveOfficeWinner`/`getDayLabel` picked whichever active octave
@@ -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."
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -4,6 +4,13 @@
# ("post-pentecost-N") rather than Trinity-counted deliberately: this is # ("post-pentecost-N") rather than Trinity-counted deliberately: this is
# content storage, kept scheme-agnostic, independent of whatever counting # content storage, kept scheme-agnostic, independent of whatever counting
# convention calendar/day-label.ts shows on screen for the same Sunday. # 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 id: christmas-octave-sunday-collect
text: text:
la: | la: |
+12 -1
View File
@@ -20,7 +20,7 @@ export function resolveCommon(id: string): ResolvedText {
// override-eligible — see hours/lauds.ts's getPsalmodyOverrideFor, which // override-eligible — see hours/lauds.ts's getPsalmodyOverrideFor, which
// shares this set (imported from here, not duplicated) since it's the // shares this set (imported from here, not duplicated) since it's the
// same "does this temporal identity carry its own real office" question. // 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 * 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, * 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 * 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. * 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 * Returns the id to look up (`${hourId}-antiphon-${id}` etc.), or
* `undefined` when nothing eligible is happening today. * `undefined` when nothing eligible is happening today.
*/ */
export function getMinorHourOverrideId(day: LiturgicalDay): string | undefined { export function getMinorHourOverrideId(day: LiturgicalDay): string | undefined {
const winner = resolveOfficeWinner(day); 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')) { if (winner.kind === 'sanctoral' && isAtLeast(winner.rank, 'duplex-majus')) {
return winner.id; return winner.id;
} }