From f56fb3bd648d87984905b46553fcd105c9d5e14c Mon Sep 17 00:00:00 2001 From: Will Estes Date: Wed, 26 Aug 2026 16:27:39 -0400 Subject: [PATCH] Add the Circumcision of Our Lord (Jan 1) as a proper temporal feast Jan 1 previously fell through to generic Christmastide-feria content with no identity of its own, despite being Christmas's own Octave Day. Adds a `fixed-date` anchor kind to calendar/movable-feasts.ts's MovableAnchor (the existing easter/nth-sunday kinds can't express "always Jan 1"), plus the feast's collect, Magnificat/Benedictus antiphons, full Lauds psalmody, capitulum, versicle, and two Matins nocturn readings (Leo the Great, Ambrose), sourced from Sancti/01-01.txt. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_014axryJBrRswYh2niA7WCUc --- src/calendar/movable-feasts.ts | 2 + src/calendar/temporal-feasts.ts | 3 +- .../calendar/temporal-feasts/circumcision.yml | 27 +++ .../lauds-psalmody-overrides/circumcision.yml | 31 ++++ .../common/lauds-capitulum-circumcision.yml | 16 ++ .../common/lauds-versicle-circumcision.yml | 9 + .../common/vespers-versicle-circumcision.yml | 11 ++ .../propers/nocturn-readings/circumcision.yml | 166 ++++++++++++++++++ .../circumcision-benedictus-antiphon.yml | 14 ++ .../propers/temporal/circumcision-collect.yml | 20 +++ .../circumcision-magnificat-antiphon.yml | 10 ++ src/hours/resolve-common.ts | 1 + 12 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 src/data/calendar/temporal-feasts/circumcision.yml create mode 100644 src/data/hours/lauds-psalmody-overrides/circumcision.yml create mode 100644 src/data/propers/common/lauds-capitulum-circumcision.yml create mode 100644 src/data/propers/common/lauds-versicle-circumcision.yml create mode 100644 src/data/propers/common/vespers-versicle-circumcision.yml create mode 100644 src/data/propers/nocturn-readings/circumcision.yml create mode 100644 src/data/propers/temporal/circumcision-benedictus-antiphon.yml create mode 100644 src/data/propers/temporal/circumcision-collect.yml create mode 100644 src/data/propers/temporal/circumcision-magnificat-antiphon.yml diff --git a/src/calendar/movable-feasts.ts b/src/calendar/movable-feasts.ts index 5ccbdcc..96308df 100644 --- a/src/calendar/movable-feasts.ts +++ b/src/calendar/movable-feasts.ts @@ -51,6 +51,8 @@ function dateForAnchor(year: number, anchor: MovableAnchor): string { } case 'nth-sunday-of-advent': return addDays(adventStart(year), 7 * (anchor.nth - 1)); + case 'fixed-date': + return toIsoDate({ year, month: anchor.month, day: anchor.day }); } } diff --git a/src/calendar/temporal-feasts.ts b/src/calendar/temporal-feasts.ts index af62e74..ad4acf1 100644 --- a/src/calendar/temporal-feasts.ts +++ b/src/calendar/temporal-feasts.ts @@ -24,7 +24,8 @@ import { easterOffsetOf } from './temporal'; export type MovableAnchor = | { kind: 'easter'; offset: number } | { kind: 'nth-sunday-of-month'; month: number; nth: number } // nth: 1-4, or -1 for "last" - | { kind: 'nth-sunday-of-advent'; nth: number }; // nth: 1-4 (Advent always has exactly 4 Sundays) + | { kind: 'nth-sunday-of-advent'; nth: number } // nth: 1-4 (Advent always has exactly 4 Sundays) + | { kind: 'fixed-date'; month: number; day: number }; // a plain civil-calendar date, not itself Easter- or Advent-anchored (e.g. the Circumcision, Jan 1) export interface TemporalFeastRecord { id: string; diff --git a/src/data/calendar/temporal-feasts/circumcision.yml b/src/data/calendar/temporal-feasts/circumcision.yml new file mode 100644 index 0000000..3db8442 --- /dev/null +++ b/src/data/calendar/temporal-feasts/circumcision.yml @@ -0,0 +1,27 @@ +# Read from the reference engine: web/www/horas/Latin/Sancti/01-01.txt, +# untagged/default [Rank] block — "In Circumcisione Domini;;Duplex II +# classis;;5.09;;ex Sancti/12-25" (the "(rubrica 196)" variant renames the +# day "Die Octavæ Nativitatis Domini" and raises it to Duplex I classis — +# 1960-reform text this project deliberately doesn't follow, see CLAUDE.md's +# pre-1955 calendar/rubrics note). +# +# Previously not modeled at all: Jan 1 fell through to the generic +# `christmastide`/`privileged-feria-minor` treatment with no identity of +# its own, even though it's the Octave Day proper — closing Christmas's own +# octave (data/calendar/temporal-feasts/christmas-day.yml), which keeps +# contributing as a commemoration here the same way it already does on +# Stephen's/John's/Holy Innocents' days within the octave. +# +# `anchor: fixed-date` (2026-08-26 addition to calendar/movable-feasts.ts's +# MovableAnchor, this being its first user) is what actually makes this +# win the day — data/calendar/fixed-date-calendar.yml is a red herring for +# this purpose: it only feeds calendar/temporal.ts's two hardcoded +# season-boundary lookups (`fixedDateFor('christmas-day')`/`('epiphany')`), +# not winner resolution at all. +id: circumcision +name: "The Circumcision of Our Lord" +rank: duplex-2-classis +anchor: + kind: fixed-date + month: 1 + day: 1 diff --git a/src/data/hours/lauds-psalmody-overrides/circumcision.yml b/src/data/hours/lauds-psalmody-overrides/circumcision.yml new file mode 100644 index 0000000..48de3f8 --- /dev/null +++ b/src/data/hours/lauds-psalmody-overrides/circumcision.yml @@ -0,0 +1,31 @@ +# Read from web/www/horas/Latin/Sancti/01-01.txt's own [Ant Vespera] (5 +# antiphons) via its own [Ant Laudes] rule ("@:Ant Vespera:s/;;.*//g" — +# the reference engine's own instruction to reuse the Vespers antiphon +# *text* wholesale at Lauds, stripped of the psalm-number tags that only +# mattered for Vespers' own Ps 109/112/121/126/147 psalmody). Slotted onto +# Lauds' own standard 5-antiphon scheme (Ps 92/99/62, the Canticle, and +# Laudate), matching every other feast's lauds-psalmody-overrides shape — +# see christ-the-king.yml's own file for the same structure. +id: circumcision +groups: + - psalms: [92] + antiphon: + la: "O admirábile commércium: * Creátor géneris humáni, animátum corpus sumens, de Vírgine nasci dignátus est; et procédens homo sine sémine, largítus est nobis suam Deitátem." + en: "O wondrous interchange! * the Creator of mankind, taking upon him a living body, vouchsafed to be born of a pure Virgin: and by his Humanity, which was begotten in no earthly wise, hath made us partakers of his Divinity." + - psalms: [99] + antiphon: + la: "Quando natus es * ineffabíliter ex Vírgine, tunc implétæ sunt Scriptúræ: sicut plúvia in vellus descendísti, ut salvum fáceres genus humánum: te laudámus, Deus noster." + en: "When thou wast born * all ineffably of a Virgin, then were the Scriptures fulfilled; thou camest down like the dew upon the fleece of wool, to bring salvation unto all mankind; we praise thee, O our God." + - psalms: [62] + antiphon: + la: "Rubum, quem víderat Móyses * incombústum, conservátam agnóvimus tuam laudábilem virginitátem: Dei Génetrix, intercéde pro nobis." + en: "In the bush which Moses saw * unconsumed, we recognize the preservation of thy glorious virginity: holy Mother of God, intercede for us." +canticle: + id: canticum-trium-puerorum + antiphon: + la: "Germinávit radix Jesse, * orta est stella ex Jacob: Virgo péperit Salvatórem; te laudámus, Deus noster." + en: "The Root of Jesse hath budded, * the Star hath come out of Jacob, the Virgin hath borne the Saviour: we praise thee, O our God." +laudate: + antiphon: + la: "Ecce María génuit * nobis Salvatórem, quem Joánnes videns, exclamávit, dicens: Ecce Agnus Dei, ecce qui tollit peccáta mundi, allelúja." + en: "Lo, Mary hath brought forth * the Saviour of whom when John saw him, he did proclaim: Behold the Lamb of God that taketh away the sins of the world, alleluia." diff --git a/src/data/propers/common/lauds-capitulum-circumcision.yml b/src/data/propers/common/lauds-capitulum-circumcision.yml new file mode 100644 index 0000000..d8c6645 --- /dev/null +++ b/src/data/propers/common/lauds-capitulum-circumcision.yml @@ -0,0 +1,16 @@ +# Read from web/www/horas/Latin/Sancti/01-01.txt's own [Capitulum Laudes] +# and its English counterpart. Also serves Vespers (see +# hours/vespers.ts's vespersCapitulumForOverride: no distinct +# `vespers-capitulum-circumcision` file exists in the source either — the +# reference engine reuses this same chapter at both hours, same pattern +# already established for every other feast this project has authored). +id: lauds-capitulum-circumcision +text: + la: "Fratres: Appáruit grátia Dei Salvatóris nostri ómnibus homínibus, erúdiens nos, ut abnegántes impietátem, et sæculária desidéria, sóbrie, et juste, et pie vivámus in hoc sǽculo." + en: "Brethren: The grace of God that bringeth salvation hath appeared to all men, teaching us that, denying ungodliness and worldly lusts, we should live soberly, righteously, and godly in this present world." +citation: + la: "Tit 2:11-12" + en: "Tit 2:11-12" +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-versicle-circumcision.yml b/src/data/propers/common/lauds-versicle-circumcision.yml new file mode 100644 index 0000000..1202cf5 --- /dev/null +++ b/src/data/propers/common/lauds-versicle-circumcision.yml @@ -0,0 +1,9 @@ +# See vespers-versicle-circumcision.yml's own note — the source's own +# [Versum 2] is "@:Versum 1", the identical text reused at Lauds. +id: lauds-versicle-circumcision +text: + la: "V. Verbum caro factum est, allelúja.\nR. Et habitávit in nobis, allelúja." + 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/vespers-versicle-circumcision.yml b/src/data/propers/common/vespers-versicle-circumcision.yml new file mode 100644 index 0000000..7d3dcf2 --- /dev/null +++ b/src/data/propers/common/vespers-versicle-circumcision.yml @@ -0,0 +1,11 @@ +# Read from web/www/horas/Latin/Sancti/01-01.txt's own [Versum 1] (a +# cross-file reference to web/www/horas/Latin/Tempora/Nat1-0.txt's own +# [Versum 1]) and its English counterpart. Also serves Lauds — the +# source's own [Versum 2] is "@:Versum 1", the identical text reused. +id: vespers-versicle-circumcision +text: + la: "V. Verbum caro factum est, allelúja.\nR. Et habitávit in nobis, allelúja." + 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/nocturn-readings/circumcision.yml b/src/data/propers/nocturn-readings/circumcision.yml new file mode 100644 index 0000000..91abb61 --- /dev/null +++ b/src/data/propers/nocturn-readings/circumcision.yml @@ -0,0 +1,166 @@ +# Matins Nocturn 2-3 readings for the Circumcision of Our Lord (Jan 1). +# Sourced directly from web/www/horas/Latin/Sancti/01-01.txt, +# English/Sancti/01-01.txt. +# Nocturn 2: Lectio4-6, a sermon of St. Leo the Great on the Nativity +# (this feast's own [Rule] reuses Christmas's own backbone, "ex +# Sancti/12-25" — this is that same sermon), combined into one reading +# per this project's own condensed-Matins convention (see nearby +# immaculate-heart-of-mary.yml). Nocturn 3: the Gospel citation ends +# "Et réliqua"/"And so on" with no full pericope given — per the +# bare-incipit convention, only the homily (Lectio7-9, St. Ambrose) is +# authored, isGospel: false, no citation field. +id: circumcision +readings: + - nocturn: 2 + isGospel: false + source: "St. Leo the Great, Sermon 7 on the Nativity" + text: + la: >- + Festivitátis hodiérnæ, dilectíssimi, verus venerátor est, et pius + cultor, qui nec de Incarnatióne Dómini áliquid falsum, nec de + Deitáte áliquid sentit indígnum. Paris enim perículi malum est, si + illi aut natúræ nostræ véritas, aut Patérnæ glóriæ negátur + æquálitas. Cum ergo ad intellegéndum sacraméntum nativitátis Christi, + qua de Matre vírgine est ortus, accédimus, abigátur procul + terrenárum calígo ratiónum, et ab illuminátæ fídei óculo mundánæ + sapiéntiæ fumus abscédat. + + + Divína est enim auctóritas, cui crédimus: divína est doctrína, quam + séquimur. Quóniam sive legis testificatióni, sive oráculis + prophetárum, sive evangélicæ tubæ interiórem admoveámus audítum; + verum est, quod Joánnes plenus Spíritu Sancto intónuit: In princípio + erat Verbum, et Verbum erat apud Deum, et Deus erat Verbum. Hoc erat + in princípio apud Deum. Omnia per ipsum facta sunt, et sine ipso + factum est nihil. Et simíliter verum est, quod idem prædicátor + adjécit: Verbum caro factum est et habitávit in nobis: et vídimus + glóriam ejus, glóriam quasi Unigéniti a Patre. + + + In utráque ergo natúra idem est Dei Fílius, nostra suscípiens, et + própria non amíttens: in hómine hóminem rénovans, in se + incommutábilis persevérans. Déitas enim, quæ illi cum Patre + commúnis est, nullum detriméntum omnipoténtiæ súbiit, nec Dei formam + servi forma violávit: quia summa et sempitérna esséntia, quæ se ad + humáni géneris inclinávit salútem, nos quidem in suam glóriam + tránstulit, sed quod erat, esse non déstitit. Unde cum Unigénitus + Dei minórem se Patre confitétur, cui se dicit æquálem, veritátem in + se formæ utriúsque demónstrat: ut et humánam probet imparílitas, et + divínam decláret æquálitas. + en: >- + Dearly beloved brethren, whosoever will keep truly and honour piously + this day's festival, it is necessary for him neither to think + falsely of the Lord's Incarnation, nor meanly of the Lord's Godhead. + For as there is danger, on the one hand, of denying the truth of + Christ's participation of our nature, so is there no less danger, on + the other, of doing despite to the equality of his glory with the + glory of the Father. Wherefore, when we draw near to understand the + mystery of Christ's Birth, wherein he was born of the Virgin Mary, + we must leave the clouds of earthly imagination behind and pierce + the fog of human wisdom with the eye of enlightened faith. + + + The authority on which we believe is the authority of God himself; + the teaching which we follow is the teaching of God himself. + Wherefore whether we lend the ear of our mind to the testimony of + the Law, or to the revelations of the Prophets, or to the full + pealing of the Gospel trumpet, that is true, which John the Son of + Thunder uttered, when he was filled with the Holy Ghost, and said: + In the beginning was the Word, and the Word was with God, and the + Word was God. The Same was in the beginning with God. All things + were made by him, and without him was not anything made. True also + is his witness when he saith: The Word was made Flesh, and dwelt + among us, and we beheld his glory, the glory as of the Only-begotten + of the Father. + + + The Person of the Son of God therefore remaineth unchanged and one, + though he have two natures, keeping his own, and taking ours. He + appeareth as man to be the restorer of men, but abideth all the + while in his immutable Godhead. That Godhead which he shareth with + the Father was not a whit the less Almighty, nor did the form of a + servant touch the form of God to derogate from it. The Most High + and Everlasting Being, bending down for man's salvation, took the + Manhood into his glory; he ceased not to be that which he is from + everlasting. Hence we see the Only-begotten Son of God in one place + confessing that the Father is greater than he, and in another + declaring that he and the Father are One. This is an evident proof + of the distinction of his two natures, and the unity of his Person; + for he is inferior to the Father as touching his Manhood, and yet + equal to the Father as touching his Godhead, and yet, though he be + God and Man, he is not two, but One Christ. + status: { la: verified, en: verified } + + - nocturn: 3 + isGospel: false + source: "St. Ambrose, Commentary on Luke, Book II" + text: + la: >- + Circumcíditur ítaque Puer. Quis est iste puer, nisi ille, de quo + dictum est: Puer natus est nobis, Fílius datus est nobis? Factus est + enim sub lege, ut eos, qui sub lege essent, lucrifáceret. Ut sísterent + eum Dómino. Quid sit autem in Jerúsalem sisti Dómino, dícerem, nisi + in Isaíæ comméntis ante dixíssem. Circumcísus enim vítiis, Domínico + dignus judicátur obtútu; quia, Oculi Dómini super justos. Vides + omnem legis véteris sériem fuísse typum futúri: nam et circumcísio + purgatiónem signíficat delictórum. + + + Sed quóniam prona quadam cupiditáte peccándi, humánæ carnis et + mentis fragílitas inextricabílibus vítiis implicátur, eo per + octávum circumcisiónis diem culpæ totíus futúra purgátio, + resurrectiónis præfigurabátur ætáte. Hoc est enim illud: Quia omne + masculínum adapériens vulvam, sanctum Dómino vocábitur. Verbis enim + legis promittebátur Vírginis partus. Et vere sanctus, quia + immaculátus. Dénique ipsum esse, qui lege signétur, in eúndem modum + ab Angelo repetíta verba declárant: Quod nascétur, inquit, Sanctum, + vocábitur Fílius Dei. + + + Solus enim per ómnia ex natis de fémina sanctus Dóminus Jesus, qui + terrénæ contágia corruptélæ, immaculáti partus novitáte non + sénserit, et cælésti majestáte depúlerit. Nam si lítteram sequámur: + quómodo sanctus omnis másculus, cum multos sceleratíssimos fuísse + non láteat? Numquid sanctus Achab? numquid sancti pseudoprophétæ, + quos ad Elíæ preces ultor cæléstis injúriæ ignis absúmpsit? Sed ille + sanctus, quem in figúra futúri mystérii pia legis divínæ præscrípta + signábant; eo quod solus sanctæ Ecclésiæ vírginis ad generándos + pópulos Dei, immaculátæ fecunditátis aperíret genitále secrétum. + en: >- + So the Child is circumcised. This is the Child of whom it is said: + Unto us a Child is born, unto us a Son is given. Made under the law + to redeem them that were under the law. To present him to the Lord. + What it means in Jerusalem to be presented to the Lord I have + already explained in my Commentary on Isaiah, and therefore I will + not enter into the subject again. He that is circumcised in heart + gaineth the protection of God, for the eyes of the Lord are upon the + righteous. Ye will see that as all the ceremonies of the old law + were types of realities in the new, so the circumcision of the body + signified the cleansing of the heart from the guilt of sin. + + + But since the body and mind of man remain yet infected with a + proneness to sin, the circumcision of the eighth day is also a type + of that complete cleansing from sin which we shall have at the + resurrection. This ceremony was also performed in obedience to the + commandment of God: Every male that openeth the womb shall be + called holy unto the Lord. These words were written with especial + reference to the delivery of the Blessed Virgin. Truly he That + opened her womb was holy, for he was altogether without spot, and + we may gather that the law was written specially for him from the + words of the Angel: That Holy Thing which shall be born of thee, + shall be called the Son of God. + + + Among all that are born of women the Lord Jesus Christ stood alone + in holiness. Fresh from his immaculate Birth, he felt no contagion + from human corruption, and his heavenly Majesty drove it away. If we + are to follow the letter and say that every male that openeth the + womb is holy, how shall we explain that so many have been + unrighteous? Was Ahab holy? Were the false prophets holy? Were they + holy on whom Elijah justly called down fire from heaven? But he to + whom the sacred commandment of the law of God is mystically + directed is the Holy One of Israel; who also alone hath opened the + secret womb of his holy Virgin-bride the Church, filling her with a + sinless fruitfulness to give birth to Christian souls. + status: { la: verified, en: verified } diff --git a/src/data/propers/temporal/circumcision-benedictus-antiphon.yml b/src/data/propers/temporal/circumcision-benedictus-antiphon.yml new file mode 100644 index 0000000..944c2d3 --- /dev/null +++ b/src/data/propers/temporal/circumcision-benedictus-antiphon.yml @@ -0,0 +1,14 @@ +# Read from web/www/horas/Latin/Sancti/01-01.txt's own [Ant 2] (the +# antiphon slotted right after Lauds' [Capitulum Laudes]/[Versum 2], i.e. +# Lauds' own Benedictus antiphon) and its English counterpart. The source +# also carries a distinct [Ant 3] ("Magnum hereditátis mystérium...") for +# Second Vespers' own Magnificat antiphon — not modeled here since this +# project's magnificat-antiphon lookup doesn't distinguish First/Second +# Vespers (see hours/resolve-common.ts's getMagnificatAntiphon). +id: circumcision-benedictus-antiphon +text: + la: "Mirábile mystérium * declarátur hódie: innovántur natúræ, Deus homo factus est: id quod fuit permánsit, et quod non erat assúmpsit; non commixtiónem passus, neque divisiónem." + en: "This day is set forth a wonderful mystery, * a new thing hath been created in the earth: God is made man. That which he was, he remaineth; and that which he was not, he taketh; suffering therein neither confusion nor division." +status: + la: verified + en: verified diff --git a/src/data/propers/temporal/circumcision-collect.yml b/src/data/propers/temporal/circumcision-collect.yml new file mode 100644 index 0000000..c8b561e --- /dev/null +++ b/src/data/propers/temporal/circumcision-collect.yml @@ -0,0 +1,20 @@ +# Read from the reference engine: web/www/horas/Latin/Sancti/01-01.txt and +# web/www/horas/English/Sancti/01-01.txt's own [Oratio] — the day's proper +# collect (addressed to the Virgin's fruitful motherhood, not the +# Circumcision itself directly, per the feast's own traditional Marian +# framing in this slot). +id: circumcision-collect +text: + la: | + Orémus. + Deus, qui salútis ætérnæ, beátæ Maríæ virginitáte fecúnda, humáno géneri prǽmia præstitísti: tríbue, quǽsumus; ut ipsam pro nobis intercédere sentiámus, per quam merúimus auctórem vitæ suscípere, Dóminum nostrum Jesum Christum Fílium tuum: + Qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + R. Amen. + en: | + Let us pray. + O God, who, by the fruitful virginity of the Blessed Mary, hast given unto mankind the rewards of everlasting life; grant, we beseech thee, that we may continually feel the might of her intercession, through whom we have worthily received the Author of our life, our Lord Jesus Christ, thy Son: + Who with thee liveth and reigneth, in the unity of the Holy Spirit, God, world without end. + R. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/temporal/circumcision-magnificat-antiphon.yml b/src/data/propers/temporal/circumcision-magnificat-antiphon.yml new file mode 100644 index 0000000..bcd11c9 --- /dev/null +++ b/src/data/propers/temporal/circumcision-magnificat-antiphon.yml @@ -0,0 +1,10 @@ +# Read from web/www/horas/Latin/Sancti/01-01.txt's own [Ant 1] (the +# antiphon slotted between the day's [Versum 1] and [Oratio], i.e. First +# Vespers' own Magnificat antiphon) and its English counterpart. +id: circumcision-magnificat-antiphon +text: + la: "Propter nímiam * caritátem suam, qua diléxit nos Deus, Fílium suum misit in similitúdinem carnis peccáti, allelúja." + en: "God, for his great love * wherewith he loved us, sent his own Son in the likeness of sinful flesh, alleluia." +status: + la: verified + en: verified diff --git a/src/hours/resolve-common.ts b/src/hours/resolve-common.ts index c241f9e..7453bee 100644 --- a/src/hours/resolve-common.ts +++ b/src/hours/resolve-common.ts @@ -49,6 +49,7 @@ export const ALWAYS_OVERRIDE_TEMPORAL_IDS = new Set([ 'christ-the-king', 'christmas-octave-sunday', 'immaculate-heart-of-mary', + 'circumcision', ]); /**