From aba89dc250e14f6a26d47b448882d4d9a905a6aa Mon Sep 17 00:00:00 2001 From: Will Estes Date: Fri, 4 Sep 2026 14:50:31 -0400 Subject: [PATCH] Model Trinity Sunday as a real feast, not just a cosmetic label MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Trinity Sunday wasn't modeled at all: getDayLabel had a purely cosmetic "Trinity Sunday" label overlay for the Sunday after Pentecost, but resolveTemporalId just fell back to post-pentecost-01 (ordinary-sunday category), so any Duplex+ saint assigned that date (e.g. the Queenship of the BVM, fixed May 31) won outright, real Trinity Sunday content never appearing anywhere. Added a real temporal-feasts/trinity-sunday.yml record (Easter+56, Duplex II. classis, live-verified). Per direct instruction, unconditional: true (same shape as christ-the-king.yml) -- a principal Sunday shouldn't lose a same-rank fixed-date collision, and the one real collision case (Queenship of the BVM) isn't independently verifiable against Monastic 1617 at all (that calendar doesn't carry the Queenship feast -- May 31 there is St. Petronilla instead). Authored the full office and registered trinity-sunday in ALWAYS_OVERRIDE_TEMPORAL_IDS -- the same generic mechanism already built for the Pentecost-cluster fix, no new code needed: collect, Benedictus/Magnificat antiphons, Matins hymn ("Summæ Deus cleméntiæ"), Lauds/Vespers chapter (shared, Rom 11:33) and hymn (shared, "O lux beáta Trínitas", already the pre-Urban VIII text), each hour's own distinct responsory/versicle -- all live-verified 2026-05-31. Fixed 3 pre-existing tests written around the old cosmetic-label behavior, two of which had never-verified guesses baked in as if correct: day-label.test.ts's "names the anchor day itself" test and its "outranks an active octave" test (was asserting "Duplex I Class", a guess -- the real live-verified rank is Duplex II); transfer.test.ts's St. Felix I test. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01AGjUyhUZJaSjiniEmnLdak --- .../temporal-feasts/trinity-sunday.yml | 31 +++++++++ .../common/lauds-capitulum-trinity-sunday.yml | 16 +++++ .../common/lauds-hymn-trinity-sunday.yml | 65 ++++++++++++++++++ .../lauds-responsory-trinity-sunday.yml | 25 +++++++ .../common/lauds-versicle-trinity-sunday.yml | 12 ++++ .../common/matins-hymn-trinity-sunday.yml | 67 +++++++++++++++++++ .../common/vespers-hymn-trinity-sunday.yml | 61 +++++++++++++++++ .../vespers-responsory-trinity-sunday.yml | 25 +++++++ .../vespers-versicle-trinity-sunday.yml | 12 ++++ .../trinity-sunday-benedictus-antiphon.yml | 9 +++ .../temporal/trinity-sunday-collect.yml | 17 +++++ .../trinity-sunday-magnificat-antiphon.yml | 9 +++ src/hours/resolve-common.ts | 1 + tests/calendar/day-label.test.ts | 45 +++++++------ tests/calendar/transfer.test.ts | 24 +++---- 15 files changed, 387 insertions(+), 32 deletions(-) create mode 100644 src/data/calendar/temporal-feasts/trinity-sunday.yml create mode 100644 src/data/propers/common/lauds-capitulum-trinity-sunday.yml create mode 100644 src/data/propers/common/lauds-hymn-trinity-sunday.yml create mode 100644 src/data/propers/common/lauds-responsory-trinity-sunday.yml create mode 100644 src/data/propers/common/lauds-versicle-trinity-sunday.yml create mode 100644 src/data/propers/common/matins-hymn-trinity-sunday.yml create mode 100644 src/data/propers/common/vespers-hymn-trinity-sunday.yml create mode 100644 src/data/propers/common/vespers-responsory-trinity-sunday.yml create mode 100644 src/data/propers/common/vespers-versicle-trinity-sunday.yml create mode 100644 src/data/propers/temporal/trinity-sunday-benedictus-antiphon.yml create mode 100644 src/data/propers/temporal/trinity-sunday-collect.yml create mode 100644 src/data/propers/temporal/trinity-sunday-magnificat-antiphon.yml diff --git a/src/data/calendar/temporal-feasts/trinity-sunday.yml b/src/data/calendar/temporal-feasts/trinity-sunday.yml new file mode 100644 index 0000000..7a274dd --- /dev/null +++ b/src/data/calendar/temporal-feasts/trinity-sunday.yml @@ -0,0 +1,31 @@ +# Read from the reference engine: web/www/horas/Latin/Tempora/Pent01-0.txt +# ("In Festo Sanctissimæ Trinitatis"), Duplex II. classis — live-verified +# 2026-05-31 (Trinity Sunday itself that year). Previously not modeled as +# its own record at all: `resolveTemporalId` just fell back to +# `post-pentecost-01`, so this Sunday — one of the principal Sundays of +# the whole year — displayed as a generic ordinary post-Pentecost Sunday, +# with whatever saint happened to be assigned that date (if any) winning +# outright per the plain `ordinary-sunday` rule. Found and fixed 2026-09-04 +# after the user asked about a display-only-looking gap that turned out to +# be this much bigger mechanism gap. +id: trinity-sunday +name: "The Most Holy Trinity" +# Reference engine's own [Officium] title is a prepositional phrase ("In +# Festo Sanctissimæ Trinitatis"); adapted to this app's nominative-noun- +# phrase convention. +nameLa: "Sanctissima Trinitas" +rank: duplex-2-classis +anchor: + kind: easter + offset: 56 +# Per direct instruction (2026-09-04): always wins, same as christ-the- +# king.yml's own `unconditional: true` — one of the year's principal +# Sundays shouldn't lose to a same-rank fixed-date collision. The one +# real case this matters for: the Queenship of the BVM (1954 addition, +# fixed May 31, also Duplex II. classis) lands on the same date as +# Trinity Sunday in rare years (e.g. 2026) — not verifiable against the +# Monastic Tridentinum 1617 track directly, since that calendar doesn't +# carry the Queenship feast at all (confirmed live: May 31 1617-track +# shows St. Petronilla instead, this app's own blended-calendar-only +# collision). +unconditional: true diff --git a/src/data/propers/common/lauds-capitulum-trinity-sunday.yml b/src/data/propers/common/lauds-capitulum-trinity-sunday.yml new file mode 100644 index 0000000..4831501 --- /dev/null +++ b/src/data/propers/common/lauds-capitulum-trinity-sunday.yml @@ -0,0 +1,16 @@ +# Trinity Sunday's own Lauds chapter (Rom 11:33) — shared with Vespers +# via vespersCapitulumForOverride's own cross-hour fallback (see +# hours/vespers.ts), not duplicated into a separate vespers-capitulum- +# trinity-sunday.yml. Live-verified against Divinum Officium (Monastic +# Tridentinum 1617), Lauds/Vespers live query, 2026-05-31 (Trinity Sunday +# itself). +id: lauds-capitulum-trinity-sunday +text: + la: "O Altitúdo divitiárum sapiéntiæ, et sciéntiæ Dei, quam incomprehensibília sunt judícia ejus, et investigábiles viæ ejus!" + en: "O the depth of the riches of the wisdom and of the knowledge of God! How incomprehensible are his judgments, and how unsearchable his ways!" +citation: + la: "Rom 11:33" + en: "Rom 11:33" +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-hymn-trinity-sunday.yml b/src/data/propers/common/lauds-hymn-trinity-sunday.yml new file mode 100644 index 0000000..4e9614d --- /dev/null +++ b/src/data/propers/common/lauds-hymn-trinity-sunday.yml @@ -0,0 +1,65 @@ +# Trinity Sunday's own Lauds hymn ("O lux beáta Trínitas") — identical +# text to Vespers' own (vespers-hymn-trinity-sunday.yml). Already the +# pre-Urban VIII text (this project's own standing preference — see +# CLAUDE.md) as the reference source's own default, not a separate +# choice made here. Live-verified against Divinum Officium (Monastic +# Tridentinum 1617), Lauds live query, 2026-05-31 (Trinity Sunday +# itself). Self-contained — its own final stanza is a fixed, unique +# doxology, not the shared weekday one. +id: lauds-hymn-trinity-sunday +text: + la: >- + O lux beáta Trínitas, + + Et principális Únitas, + + Jam sol recédit ígneus, + + Infúnde lumen córdibus. + + + Te mane laudum cármine, + + Te deprecémur véspere: + + Te nostra supplex glória + + Per cuncta laudet sǽcula. + + + Deo Patri sit glória, + + Ejúsque soli Fílio, + + Cum Spíritu Paráclito, + + Et nunc, et in perpétuum. Amen. + en: >- + O Trinity of blessed Light, + + O Unity of sovereign might, + + as now the fiery sun departs, + + shed Thou Thy beams within our hearts. + + + To Thee our morning song of praise, + + to Thee our evening prayer we raise; + + Thee may our glory evermore + + in lowly reverence adore. + + + All laud to God the Father be; + + all praise, Eternal Son, to Thee; + + all glory, as is ever meet, + + to God the Holy Paraclete. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-responsory-trinity-sunday.yml b/src/data/propers/common/lauds-responsory-trinity-sunday.yml new file mode 100644 index 0000000..8e22d71 --- /dev/null +++ b/src/data/propers/common/lauds-responsory-trinity-sunday.yml @@ -0,0 +1,25 @@ +# Trinity Sunday's own Lauds responsory ("Benedíctus es, Dómine, in +# firmaménto cæli") — distinct from Vespers' own ("Benedicámus Patrem et +# Fílium cum Sancto Spíritu", see +# vespers-responsory-trinity-sunday.yml). Live-verified against Divinum +# Officium (Monastic Tridentinum 1617), Lauds live query, 2026-05-31 +# (Trinity Sunday itself). +id: lauds-responsory-trinity-sunday +text: + la: | + R.br. Benedíctus es, Dómine, * In firmaménto cæli. + R. Benedíctus es, Dómine, * In firmaménto cæli. + V. Et laudábilis et gloriósus in sǽcula. + R. In firmaménto cæli. + V. Glória Patri, et Fílio, * et Spirítui Sancto. + R. Benedíctus es, Dómine, * In firmaménto cæli. + en: | + R.br. Blessed art Thou, O Lord, * In the firmament of heaven. + R. Blessed art Thou, O Lord, * In the firmament of heaven. + V. And to be praised and glorified for ever. + R. In the firmament of heaven. + V. Glory be to the Father, and to the Son, * and to the Holy Ghost. + R. Blessed art Thou, O Lord, * In the firmament of heaven. +status: + la: verified + en: verified diff --git a/src/data/propers/common/lauds-versicle-trinity-sunday.yml b/src/data/propers/common/lauds-versicle-trinity-sunday.yml new file mode 100644 index 0000000..0d922d8 --- /dev/null +++ b/src/data/propers/common/lauds-versicle-trinity-sunday.yml @@ -0,0 +1,12 @@ +# Trinity Sunday's own Lauds versicle — distinct from Vespers' own +# ("Benedíctus es, Dómine, in firmaménto cæli", see +# vespers-versicle-trinity-sunday.yml). Live-verified against Divinum +# Officium (Monastic Tridentinum 1617), Lauds live query, 2026-05-31 +# (Trinity Sunday itself). +id: lauds-versicle-trinity-sunday +text: + la: "V. Benedicámus Patrem et Fílium cum Sancto Spíritu.\nR. Laudémus et superexaltémus eum in sǽcula." + en: "V. Bless we the Father, and the Son, and the Holy Ghost.\nR. Let us praise Him and exalt Him above all for ever." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-hymn-trinity-sunday.yml b/src/data/propers/common/matins-hymn-trinity-sunday.yml new file mode 100644 index 0000000..fe964d2 --- /dev/null +++ b/src/data/propers/common/matins-hymn-trinity-sunday.yml @@ -0,0 +1,67 @@ +# Trinity Sunday's own Matins hymn ("Summæ Deus cleméntiæ") — shares its +# opening stanza with the plain ferial Saturday hymn +# (matins-hymn-ferial-saturday.yml's "Summæ Deus cleméntiæ, Mundíque +# Factor máchinæ..."), but diverges completely from its second stanza +# onward and is shorter overall (2 body stanzas + its own doxology, +# not 4 + the shared weekday doxology) — a genuinely different hymn, not +# a mislabeled duplicate. Live-verified against Divinum Officium +# (Monastic Tridentinum 1617), Matins live query, 2026-05-31 (Trinity +# Sunday itself). Self-contained — its own final stanza is a fixed, +# unique doxology, not the shared weekday one. +id: matins-hymn-trinity-sunday +text: + la: >- + Summæ Deus cleméntiæ, + + Mundíque Factor máchinæ, + + Unus potentiáliter, + + Trinúsque personáliter. + + + Da déxteram surgéntibus, + + Exsúrgat ut mens sóbria, + + Flagrans et in laudem Dei, + + Grates repéndet débitas. + + + Glória Patri Dómino, + + Glória Unigénito, + + Una cum Sancto Spíritu, + + In sempitérna sǽcula. Amen. + en: >- + O God, by whose command is swayed + + This ordered world which thou hast made; + + Parent of heavenly clemency, + + In nature One, in persons Three; + + + Assist us while our minds we raise, + + Inflamed with thy immortal praise; + + That with our sober thoughts, we may + + Forever our thanksgiving pay. + + + May age by age thy wonders tell, + + Eternal praise thy works reveal, + + And sing with the celestial host + + The Father, Son, and Holy Ghost. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-hymn-trinity-sunday.yml b/src/data/propers/common/vespers-hymn-trinity-sunday.yml new file mode 100644 index 0000000..514e3e5 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-trinity-sunday.yml @@ -0,0 +1,61 @@ +# Trinity Sunday's own Vespers hymn ("O lux beáta Trínitas") — identical +# text to Lauds' own (lauds-hymn-trinity-sunday.yml). Live-verified +# against Divinum Officium (Monastic Tridentinum 1617), Vespers live +# query, 2026-05-31 (Trinity Sunday itself). +id: vespers-hymn-trinity-sunday +text: + la: >- + O lux beáta Trínitas, + + Et principális Únitas, + + Jam sol recédit ígneus, + + Infúnde lumen córdibus. + + + Te mane laudum cármine, + + Te deprecémur véspere: + + Te nostra supplex glória + + Per cuncta laudet sǽcula. + + + Deo Patri sit glória, + + Ejúsque soli Fílio, + + Cum Spíritu Paráclito, + + Et nunc, et in perpétuum. Amen. + en: >- + O Trinity of blessed Light, + + O Unity of sovereign might, + + as now the fiery sun departs, + + shed Thou Thy beams within our hearts. + + + To Thee our morning song of praise, + + to Thee our evening prayer we raise; + + Thee may our glory evermore + + in lowly reverence adore. + + + All laud to God the Father be; + + all praise, Eternal Son, to Thee; + + all glory, as is ever meet, + + to God the Holy Paraclete. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-responsory-trinity-sunday.yml b/src/data/propers/common/vespers-responsory-trinity-sunday.yml new file mode 100644 index 0000000..0abb123 --- /dev/null +++ b/src/data/propers/common/vespers-responsory-trinity-sunday.yml @@ -0,0 +1,25 @@ +# Trinity Sunday's own Vespers responsory ("Benedicámus Patrem et +# Fílium cum Sancto Spíritu") — distinct from Lauds' own ("Benedíctus +# es, Dómine, in firmaménto cæli", see +# lauds-responsory-trinity-sunday.yml). Live-verified against Divinum +# Officium (Monastic Tridentinum 1617), Vespers live query, 2026-05-31 +# (Trinity Sunday itself). +id: vespers-responsory-trinity-sunday +text: + la: | + R.br. Benedicámus Patrem et Fílium * Cum Sancto Spíritu. + R. Benedicámus Patrem et Fílium * Cum Sancto Spíritu. + V. Laudémus et superexaltémus eum in sǽcula. + R. Cum Sancto Spíritu. + V. Glória Patri, et Fílio, * et Spirítui Sancto. + R. Benedicámus Patrem et Fílium * Cum Sancto Spíritu. + en: | + R.br. Bless we the Father, and the Son, * And the Holy Ghost. + R. Bless we the Father, and the Son, * And the Holy Ghost. + V. Let us praise and exalt Him above all for ever. + R. And the Holy Ghost. + V. Glory be to the Father, and to the Son, * and to the Holy Ghost. + R. Bless we the Father, and the Son, * And the Holy Ghost. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vespers-versicle-trinity-sunday.yml b/src/data/propers/common/vespers-versicle-trinity-sunday.yml new file mode 100644 index 0000000..72fa370 --- /dev/null +++ b/src/data/propers/common/vespers-versicle-trinity-sunday.yml @@ -0,0 +1,12 @@ +# Trinity Sunday's own Vespers versicle — distinct from Lauds' own +# ("Benedicámus Patrem et Fílium cum Sancto Spíritu", see +# lauds-versicle-trinity-sunday.yml). Live-verified against Divinum +# Officium (Monastic Tridentinum 1617), Vespers live query, 2026-05-31 +# (Trinity Sunday itself). +id: vespers-versicle-trinity-sunday +text: + la: "V. Benedíctus es, Dómine, in firmaménto cæli.\nR. Et laudábilis et gloriósus in sǽcula." + en: "V. Blessed art Thou, O Lord, in the firmament of heaven.\nR. And to be praised and glorified for ever." +status: + la: verified + en: verified diff --git a/src/data/propers/temporal/trinity-sunday-benedictus-antiphon.yml b/src/data/propers/temporal/trinity-sunday-benedictus-antiphon.yml new file mode 100644 index 0000000..cb5a076 --- /dev/null +++ b/src/data/propers/temporal/trinity-sunday-benedictus-antiphon.yml @@ -0,0 +1,9 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# live query, 2026-05-31 (Trinity Sunday itself). +id: trinity-sunday-benedictus-antiphon +text: + la: "Benedícta sit * sancta creátrix et gubernátrix ómnium, sancta et indivídua Trínitas, nunc, et semper, et per infiníta sǽcula sæculórum." + en: "Blessed be the Holy One, * the Maker and Lord of all things: blessed be the Holy and Undivided Trinity, now and always, and unto unending ages of ages." +status: + la: verified + en: verified diff --git a/src/data/propers/temporal/trinity-sunday-collect.yml b/src/data/propers/temporal/trinity-sunday-collect.yml new file mode 100644 index 0000000..27db4fa --- /dev/null +++ b/src/data/propers/temporal/trinity-sunday-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# live query, 2026-05-31 (Trinity Sunday itself). +id: trinity-sunday-collect +text: + la: | + Orémus. + Omnípotens sempitérne Deus, qui dedísti fámulis tuis in confessióne veræ fídei, ætérnæ Trinitátis glóriam agnóscere, et in poténtia majestátis adoráre Unitátem: quǽsumus; ut, ejúsdem fídei firmitáte, ab ómnibus semper muniámur advérsis. + Per 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. + Almighty and everlasting God, who hast given thy servants in the confession of the true faith, to acknowledge the glory of the Eternal Trinity, and to adore the Unity in the power of thy Majesty: grant that, by steadfastness in this faith, we may ever be defended from all adversities. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + R. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/temporal/trinity-sunday-magnificat-antiphon.yml b/src/data/propers/temporal/trinity-sunday-magnificat-antiphon.yml new file mode 100644 index 0000000..679a4a0 --- /dev/null +++ b/src/data/propers/temporal/trinity-sunday-magnificat-antiphon.yml @@ -0,0 +1,9 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers +# live query, 2026-05-31 (Trinity Sunday itself). +id: trinity-sunday-magnificat-antiphon +text: + la: "Te Deum * Patrem ingénitum, te Fílium unigénitum, te Spíritum Sanctum Paráclitum, sanctam et indivíduam Trinitátem, toto corde et ore confitémur, laudámus, atque benedícimus: tibi glória in sǽcula." + en: "With all our heart * and with all our voice do we acknowledge thee, praise thee, and bless thee: O God the Father Unbegotten, O God the Only-Begotten Son, O God the Holy Ghost the Comforter, one Holy and Undivided Trinity: to thee be glory for ever." +status: + la: verified + en: verified diff --git a/src/hours/resolve-common.ts b/src/hours/resolve-common.ts index 20cd137..36e17d9 100644 --- a/src/hours/resolve-common.ts +++ b/src/hours/resolve-common.ts @@ -64,6 +64,7 @@ export const ALWAYS_OVERRIDE_TEMPORAL_IDS = new Set([ 'pentecost-sunday', 'corpus-christi', 'sacred-heart', + 'trinity-sunday', 'circumcision', 'holy-name-of-jesus', 'vigil-of-christmas', diff --git a/tests/calendar/day-label.test.ts b/tests/calendar/day-label.test.ts index 3247130..1d35542 100644 --- a/tests/calendar/day-label.test.ts +++ b/tests/calendar/day-label.test.ts @@ -21,18 +21,19 @@ describe('getDayLabel — ordinal temporal label', () => { it('names the anchor day itself, not "day after itself"', () => { // Trinity Sunday 2026 (May 31) is now also the Queenship of the // Blessed Virgin Mary's own fixed day (Duplex II Classis, added per - // the full-year sanctoral import) — since this app models Trinitytide - // Sundays as plain `ordinary-sunday` with no special first-class - // standing of their own, the Duplex+ sanctoral feast wins outright - // here per the normal ordinary-Sunday rule (see - // tests/calendar/transfer.test.ts's own May 31 case for the full - // winner/commemorations breakdown), so the label now reflects her, - // not Trinity Sunday itself — but Trinity Sunday is still - // commemorated in return (`decideOccurrence`'s own `ordinary-sunday` - // branch), by bare name only — a commemoration never carries a rank - // parenthetical, only the day's own winner does. + // the full-year sanctoral import). Trinity Sunday itself used to be + // modeled as plain `ordinary-sunday` with no special first-class + // standing of its own, purely a cosmetic label overlay -- fixed + // 2026-09-04 with a real `trinity-sunday` temporal-feast record + // (calendar/data/calendar/temporal-feasts/trinity-sunday.yml), + // `unconditional: true` per direct instruction (a principal Sunday + // shouldn't lose to a same-rank fixed-date collision, same shape as + // christ-the-king.yml). Trinity Sunday now wins outright and the + // Queenship is commemorated instead, by bare name only — a + // commemoration never carries a rank parenthetical, only the day's + // own winner does. expect(getDayLabel(resolveDay('2026-05-31')).en).toBe( - 'The Queenship of the Blessed Virgin Mary (Duplex II Class) — Trinity Sunday', + 'The Most Holy Trinity (Duplex II Class) — The Queenship of the Blessed Virgin Mary', ); expect(getDayLabel(resolveDay('2026-04-05')).en).toBe( "Easter (Duplex I Class) — St. Vincent Ferrer, Confessor (transferred away)", @@ -41,12 +42,12 @@ describe('getDayLabel — ordinal temporal label', () => { "Ash Wednesday — St. Simeon, Bishop and Martyr (transferred away)", ); // Latin: the winner now has a real authored nameLa (see - // calendar/data/calendar/saints/queenship-of-the-bvm.yml), so this is - // real Latin throughout — the rank label ("Duplex II. Classis") and - // the commemorated Sunday's own name ("Dominica Sanctissimae - // Trinitatis") were already real Latin before this. + // calendar/data/calendar/saints/queenship-of-the-bvm.yml and + // temporal-feasts/trinity-sunday.yml's own "Sanctissima Trinitas"), + // so this is real Latin throughout — the rank label ("Duplex II. + // Classis") was already real Latin before this. expect(getDayLabel(resolveDay('2026-05-31')).la).toBe( - 'Beata Maria Virgo Regina (Duplex II. Classis) — Dominica Sanctissimae Trinitatis', + 'Sanctissima Trinitas (Duplex II. Classis) — Beata Maria Virgo Regina', ); expect(getDayLabel(resolveDay('2026-04-05')).la).toBe( 'Pascha (Duplex I. Classis) — Sanctus Vincentius Ferrerius, Confessor (translata alio)', @@ -233,14 +234,20 @@ describe('getDayLabel — active octave', () => { expect(getDayLabel(resolveDay('2028-11-03')).en).toBe('3rd Day within the Octave of All Saints (Semiduplex)'); }); - it("a season's own named anchor day outranks an active octave, even though Trinity Sunday is technically also day 8 of Pentecost's own octave", () => { + it("Trinity Sunday itself outranks Pentecost's own octave, which is technically still active on the same day (day 8)", () => { // Not 2026 (May 31, the Queenship of the Blessed Virgin Mary's own // fixed day, see tests/calendar/transfer.test.ts) and not 2023 // (June 4, now St. Francis Caracciolo's own fixed day) -- both would // muddy this specifically octave-vs-anchor-day check with a sanctoral // winner. 2030's Trinity Sunday (June 16) has no sanctoral entry at - // all, isolating the octave interaction cleanly. - expect(getDayLabel(resolveDay('2030-06-16')).en).toBe('Trinity Sunday (Duplex I Class)'); + // all, isolating the octave interaction cleanly. Since 2026-09-04, + // Trinity Sunday is a real, unconditional-winning temporal-feast + // (see the test above) rather than a purely cosmetic label overlay, + // so this is now a real occurrence result, not just a label choice -- + // Duplex II Class, its own live-verified rank, not the earlier + // (never-verified) "Duplex I Class" placeholder this test used to + // assert. + expect(getDayLabel(resolveDay('2030-06-16')).en).toBe('The Most Holy Trinity (Duplex II Class)'); }); it("a temporal day with real standing of its own (not ordinary-feria) never shows an octave name at all, even with one active -- live-verified counterexample: the Christmas Octave's own stack (Dec 30) titles itself off the Sunday, never any of the four octaves layered on top of it", () => { diff --git a/tests/calendar/transfer.test.ts b/tests/calendar/transfer.test.ts index 664ef2b..81a7568 100644 --- a/tests/calendar/transfer.test.ts +++ b/tests/calendar/transfer.test.ts @@ -88,22 +88,20 @@ describe('transfer mechanism (resolveDay integration)', () => { // Felix doesn't reach Trinity Sunday at all now. Trinity Sunday 2026 // (May 31) is also the Queenship of the Blessed Virgin Mary's own - // fixed day (Duplex II Classis) -- since this app models Trinitytide - // Sundays as plain `ordinary-sunday` (no special first-class standing - // of their own, see temporal-categories.yml), a Duplex+ sanctoral - // feast wins outright here per the normal ordinary-Sunday rule, with - // both the day's own temporal id and Pentecost's octave commemorated - // in return. - expect(sunday.winner).toEqual({ - kind: 'sanctoral', - id: 'queenship-of-the-bvm', - name: 'The Queenship of the Blessed Virgin Mary', - nameLa: 'Beata Maria Virgo Regina', - rank: 'duplex-2-classis', - }); + // fixed day (Duplex II Classis). Trinity Sunday used to be modeled as + // plain `ordinary-sunday` (no special first-class standing of its + // own), so the Duplex+ Queenship won outright there -- fixed + // 2026-09-04 with a real `trinity-sunday` temporal-feast record, + // `unconditional: true` (a principal Sunday shouldn't lose to a + // same-rank fixed-date collision, same shape as christ-the-king.yml). + // Trinity Sunday now wins outright; the Queenship, the day's own + // plain temporal id, and Pentecost's octave are all commemorated in + // return. + expect(sunday.winner).toEqual({ kind: 'temporal', id: 'trinity-sunday' }); expect(sunday.commemorations).toEqual([ { kind: 'temporal', id: 'post-pentecost-01' }, { kind: 'octave', id: 'pentecost-sunday', name: 'Pentecost', nameLa: 'Dominica Pentecostes' }, + { kind: 'sanctoral', id: 'queenship-of-the-bvm', name: 'The Queenship of the Blessed Virgin Mary', nameLa: 'Beata Maria Virgo Regina', rank: 'duplex-2-classis' }, ]); }); });