diff --git a/TODO.md b/TODO.md index 31d12b2..cb6b550 100644 --- a/TODO.md +++ b/TODO.md @@ -2753,12 +2753,32 @@ directly from the reference engine's `Commune/C1.txt` (Latin + English both pres Live-verified: St. Bartholomew (2026-08-24) and St. Andrew (2026-11-30) both now resolve to this Common's text for hymn + invitatory. -**Not authored, logged as explicit backlog**, same incremental-content pattern as everywhere -else in this project: -- Hymn + invitatory Common tiers for: Martyrs (C2), Virgins (C6), Holy Women - (C7), Dedication (C8), General/All Saints (C9) — all confirmed to have their own distinct - `[Invit]`/`[Hymnus Matutinum]` text in the reference source, not yet transcribed. Confessors - (C4) hymn done 2026-08-25, see below — invitatory antiphon still open. +**Invitatory-antiphon Common tier filled in for Confessors/Martyrs/Virgins/Dedication +(2026-08-27)**: `matins-invitatory-common-of-a-confessor{,-bishop,-not-bishop,-doctor,-pope}.yml` +(Commune/C4's own `[Invit]`, "Regem Confessórum Dóminum" — C4a/C4b/C5 all inherit it verbatim, +so duplicated under all 5 confessor ids, same convention as the hymn), `matins-invitatory- +common-of-a-martyr{,-bishop}.yml` + `matins-invitatory-common-of-several-martyrs.yml` +(Commune/C2's own `[Invit]`, "Regem Mártyrum Dóminum" — C3's own `[Invit]` is a literal +`@Commune/C2` redirect), `matins-invitatory-common-of-a-virgin{,-martyr}.yml` (Commune/C6's own +`[Invit]`, "Regem Vírginum Dóminum" — C6a inherits verbatim), and `matins-invitatory-common-of- +a-dedication.yml` (Commune/C8's own `[Invit]`, "Domum Dei decet sanctitúdo"). Directly fixed +St. Joseph Calasanctius (2026-08-27, Confessor, duplex) falling all the way to the plain +ferial invitatory antiphon. + +**Still not authored, logged as explicit backlog**, same incremental-content pattern as +everywhere else in this project: +- Holy Women (C7) invitatory antiphon — Commune/C7.txt's own `[Invit]` ("Laudémus Deum nostrum + * In confessióne beátæ N..") is a name-template text (a literal "N." placeholder, like + `collectCommon`'s `{N}` substitution elsewhere) — this project's invitatory-antiphon files + have no substitution mechanism built yet, so authoring this one needs that groundwork first, + not just a transcription. Only 3 saints use `common-of-a-holy-woman`. +- General/All Saints (C9) invitatory antiphon — re-investigated 2026-08-27: the reference + engine's own `Commune/C9.txt` is actually the Office of the Dead ("Regem, cui ómnia vivunt"), + not a General/All-Saints common — this backlog item's own C-number was mislabeled at the time + it was written. No saint's `common:` field maps to a C9-shaped category currently, so there's + nothing to author against yet; revisit if that changes. +- Hymn Common tiers for: Martyrs (C2), Virgins (C6), Dedication (C8) — invitatory done above, + hymn still open for these three (Confessors' hymn was done 2026-08-25, see above). - Seasonal invitatory-antiphon tier content (Advent/Lent/Passiontide/Paschaltide/Christmastide) — mechanism now exists (same `seasonalOfficeSuffix`-keyed lookup the hymn's own long-standing seasonal tier already uses), but no seasonal invitatory file is authored yet; every season diff --git a/src/data/propers/common/matins-invitatory-common-of-a-confessor-bishop.yml b/src/data/propers/common/matins-invitatory-common-of-a-confessor-bishop.yml new file mode 100644 index 0000000..8ec5dfd --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-confessor-bishop.yml @@ -0,0 +1,11 @@ +# Same Common-of-a-Confessor invitatory antiphon as +# matins-invitatory-common-of-a-confessor.yml — see that file's header +# for full sourcing detail (Commune/C4.txt's own [Invit], inherited +# verbatim by C4a/C4b/C5 alike). +id: matins-invitatory-common-of-a-confessor-bishop +text: + la: "Regem Confessórum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Confessors, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-confessor-doctor.yml b/src/data/propers/common/matins-invitatory-common-of-a-confessor-doctor.yml new file mode 100644 index 0000000..396411e --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-confessor-doctor.yml @@ -0,0 +1,11 @@ +# Same Common-of-a-Confessor invitatory antiphon as +# matins-invitatory-common-of-a-confessor.yml — see that file's header +# for full sourcing detail (Commune/C4.txt's own [Invit], inherited +# verbatim by C4a/C4b/C5 alike; C4a is the Doctor Common specifically). +id: matins-invitatory-common-of-a-confessor-doctor +text: + la: "Regem Confessórum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Confessors, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-confessor-not-bishop.yml b/src/data/propers/common/matins-invitatory-common-of-a-confessor-not-bishop.yml new file mode 100644 index 0000000..a3095f2 --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-confessor-not-bishop.yml @@ -0,0 +1,11 @@ +# Same Common-of-a-Confessor invitatory antiphon as +# matins-invitatory-common-of-a-confessor.yml — see that file's header +# for full sourcing detail (Commune/C4.txt's own [Invit], inherited +# verbatim by C4a/C4b/C5 alike). +id: matins-invitatory-common-of-a-confessor-not-bishop +text: + la: "Regem Confessórum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Confessors, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-confessor-pope.yml b/src/data/propers/common/matins-invitatory-common-of-a-confessor-pope.yml new file mode 100644 index 0000000..4b73dd7 --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-confessor-pope.yml @@ -0,0 +1,12 @@ +# Same Common-of-a-Confessor invitatory antiphon as +# matins-invitatory-common-of-a-confessor.yml — see that file's header +# for full sourcing detail (Commune/C4.txt's own [Invit], inherited +# verbatim by C4a/C4b/C5 alike; C4b is the Pope-Confessor Common +# specifically). +id: matins-invitatory-common-of-a-confessor-pope +text: + la: "Regem Confessórum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Confessors, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-confessor.yml b/src/data/propers/common/matins-invitatory-common-of-a-confessor.yml new file mode 100644 index 0000000..b322ae3 --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-confessor.yml @@ -0,0 +1,19 @@ +# The Common-of-a-Confessor's own invitatory antiphon ("Regem Confessórum +# Dóminum" / "The Lord, the King of Confessors"), read from the reference +# engine's own Commune/C4.txt [Invit] line (both languages) — C4a +# (Doctor) and C4b (Pope-Confessor) both inherit this verbatim (`@Commune/ +# C4`, no own [Invit]), and C5 (Confessor Not a Bishop) does too, matching +# this Common category's existing hymn precedent (matins-hymn-common-of-a- +# confessor.yml and its -bishop/-not-bishop/-doctor/-pope siblings all +# share one text the same way). Duplicated under all 5 confessor ids +# rather than aliased, per this project's established convention for this +# category. Any winning confessor with no proper invitatory antiphon of +# his own authored falls to this Common tier +# (hours/matins.ts's resolveMatinsInvitatoryText). +id: matins-invitatory-common-of-a-confessor +text: + la: "Regem Confessórum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Confessors, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-dedication.yml b/src/data/propers/common/matins-invitatory-common-of-a-dedication.yml new file mode 100644 index 0000000..911b23b --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-dedication.yml @@ -0,0 +1,13 @@ +# The Common of the Dedication of a Church's own invitatory antiphon +# ("Domum Dei decet sanctitúdo" / "Holiness becometh the house of God"), +# read from the reference engine's own Commune/C8.txt [Invit] line (both +# languages). Any winning dedication feast with no proper invitatory +# antiphon of its own authored falls to this Common tier +# (hours/matins.ts's resolveMatinsInvitatoryText). +id: matins-invitatory-common-of-a-dedication +text: + la: "Domum Dei decet sanctitúdo: * Sponsum ejus Christum adorémus in ea." + en: "Holiness becometh the house of God. * In her let us worship her Bridegroom, even Christ." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-martyr-bishop.yml b/src/data/propers/common/matins-invitatory-common-of-a-martyr-bishop.yml new file mode 100644 index 0000000..2f0673a --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-martyr-bishop.yml @@ -0,0 +1,10 @@ +# Same Common-of-a-Martyr invitatory antiphon as +# matins-invitatory-common-of-a-martyr.yml — see that file's header for +# full sourcing detail. +id: matins-invitatory-common-of-a-martyr-bishop +text: + la: "Regem Mártyrum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Martyrs, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-martyr.yml b/src/data/propers/common/matins-invitatory-common-of-a-martyr.yml new file mode 100644 index 0000000..c617fd8 --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-martyr.yml @@ -0,0 +1,19 @@ +# The Common-of-a-Martyr's own invitatory antiphon ("Regem Mártyrum +# Dóminum" / "The Lord, the King of Martyrs"), read from the reference +# engine's own Commune/C2.txt [Invit] line (both languages) — C3 (Several +# Martyrs) inherits this verbatim (`[Invit]` line is a literal +# `@Commune/C2` redirect, no own text), matching this Common's own +# Matins psalmody precedent (matins-psalmody-overrides.ts's own +# Common-of-a-Martyr-Bishop-redirects-to-Common-of-a-Martyr note). +# Duplicated under common-of-a-martyr and common-of-a-martyr-bishop +# (both real SaintRecord.common ids in use) rather than aliased, per this +# project's established convention. Any winning martyr with no proper +# invitatory antiphon of his own authored falls to this Common tier +# (hours/matins.ts's resolveMatinsInvitatoryText). +id: matins-invitatory-common-of-a-martyr +text: + la: "Regem Mártyrum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Martyrs, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-virgin-martyr.yml b/src/data/propers/common/matins-invitatory-common-of-a-virgin-martyr.yml new file mode 100644 index 0000000..f4db57e --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-virgin-martyr.yml @@ -0,0 +1,10 @@ +# Same Common-of-a-Virgin invitatory antiphon as +# matins-invitatory-common-of-a-virgin.yml — see that file's header for +# full sourcing detail. +id: matins-invitatory-common-of-a-virgin-martyr +text: + la: "Regem Vírginum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Virgins, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-a-virgin.yml b/src/data/propers/common/matins-invitatory-common-of-a-virgin.yml new file mode 100644 index 0000000..5e09160 --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-a-virgin.yml @@ -0,0 +1,18 @@ +# The Common-of-a-Virgin's own invitatory antiphon ("Regem Vírginum +# Dóminum" / "The Lord, the King of Virgins"), read from the reference +# engine's own Commune/C6.txt [Invit] line (both languages) — C6a +# (Virgin-Martyr) inherits this verbatim (`@Commune/C6`, no own [Invit]), +# matching this Common's own Matins hymn precedent +# (matins-hymn-common-of-a-virgin.yml / matins-hymn-common-of-a-virgin- +# martyr.yml already share one text the same way). Duplicated under both +# ids rather than aliased, per this project's established convention. +# Any winning virgin with no proper invitatory antiphon of her own +# authored falls to this Common tier +# (hours/matins.ts's resolveMatinsInvitatoryText). +id: matins-invitatory-common-of-a-virgin +text: + la: "Regem Vírginum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Virgins, * O come, let us worship." +status: + la: verified + en: verified diff --git a/src/data/propers/common/matins-invitatory-common-of-several-martyrs.yml b/src/data/propers/common/matins-invitatory-common-of-several-martyrs.yml new file mode 100644 index 0000000..af6f861 --- /dev/null +++ b/src/data/propers/common/matins-invitatory-common-of-several-martyrs.yml @@ -0,0 +1,11 @@ +# Same Common-of-a-Martyr invitatory antiphon as +# matins-invitatory-common-of-a-martyr.yml — Commune/C3.txt's own +# [Invit] is a literal `@Commune/C2` redirect (no distinct text of its +# own for Several Martyrs). +id: matins-invitatory-common-of-several-martyrs +text: + la: "Regem Mártyrum Dóminum, * Veníte, adorémus." + en: "The Lord, the King of Martyrs, * O come, let us worship." +status: + la: verified + en: verified diff --git a/tests/hours/matins.test.ts b/tests/hours/matins.test.ts index eb9c050..1352fb5 100644 --- a/tests/hours/matins.test.ts +++ b/tests/hours/matins.test.ts @@ -585,8 +585,13 @@ describe('resolveOrdo("matins", ...) invitatory antiphon doubling by rank', () = return invitatoryPsalm?.antiphon?.text.la; } - it('a Duplex+ weekday winner opens with the FULL (not incipit-only) invitatory antiphon (St. Lawrence, 2026-08-17: ferial text, no proper/Common of his own; St. Bartholomew, duplex-2-classis, 2026-08-24: Common-of-an-Apostle text)', () => { - expect(openingAntiphonLatin('2026-08-17')).toContain('Exsultémus'); + it('a Duplex+ weekday winner opens with the FULL (not incipit-only) invitatory antiphon (St. Lawrence, 2026-08-17: Common-of-a-Martyr text, no proper of his own; St. Bartholomew, duplex-2-classis, 2026-08-24: Common-of-an-Apostle text)', () => { + // St. Lawrence has his own full proper Matins psalmody + // (matins-psalmody-overrides/saints/st-lawrence.yml) but no proper + // invitatory antiphon of his own -- resolveMatinsInvitatoryText falls + // to his common-of-a-martyr Common tier (matins-invitatory-common-of- + // a-martyr.yml, authored 2026-08-27), not the plain ferial default. + expect(openingAntiphonLatin('2026-08-17')).toContain('Regem Mártyrum Dóminum, * Veníte'); expect(openingAntiphonLatin('2026-08-24')).toContain('Regem Apostolórum Dóminum, * Veníte'); });