From 989a63c05e238e92ff03be7f314feddca9fa3201 Mon Sep 17 00:00:00 2001 From: Will Estes Date: Sat, 5 Sep 2026 16:22:02 -0400 Subject: [PATCH] Author Common-of-a-Dedication Lauds psalmody, closing 10/10 sweep Live-verified the real scheme against Divinum Officium (Monastic Tridentinum 1617, votive=C8) across all 7 weekdays: proper antiphons on Ps 50/5/35, plus a canticle slot whose antiphon is fixed to this Common but whose underlying text follows the plain ferial weekday rotation (all 7 already authored). Required making LaudsPsalmodyOverride.canticle.id optional and having resolvePsalmody splice in the day's own ferial canticle when a category omits it. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01LGsATZvfnpQ81HQuoF5JuL --- .../categories/common-of-a-dedication.yml | 44 +++++++++++++++++++ src/hours/lauds-psalmody-overrides.ts | 10 ++++- src/hours/lauds.ts | 10 ++++- 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/data/hours/lauds-psalmody-overrides/categories/common-of-a-dedication.yml diff --git a/src/data/hours/lauds-psalmody-overrides/categories/common-of-a-dedication.yml b/src/data/hours/lauds-psalmody-overrides/categories/common-of-a-dedication.yml new file mode 100644 index 0000000..d9d8805 --- /dev/null +++ b/src/data/hours/lauds-psalmody-overrides/categories/common-of-a-dedication.yml @@ -0,0 +1,44 @@ +# Generic Common-of-a-Dedication (of a Church) Lauds psalmody, live- +# verified against Divinum Officium (Monastic Tridentinum 1617, command= +# prayLaudes, votive=C8, 2026-09-05 — all 7 weekdays checked, 11-09 through +# 11-15-2026). Genuinely its own scheme, unlike most Commons: proper psalms +# 50/5/35 (not the usual 92/99/62), same "own numbers, not the standard +# duplex-majus set" pattern already noted in this Common's own Vespers file +# (109/110/111/147). +# +# The canticle slot is unusual again, in a different way: its *antiphon* is +# this Common's own fixed text ("Bene fundáta est...", confirmed identical +# on every weekday tested), but the underlying canticle *text* is not +# proper to Dedication at all -- it's simply whichever plain ferial +# weekday canticle the day already uses (Isaiah Mon, Ezechias Tue, Anna +# Wed, Moses/Exodus Thu, Habacuc Fri, Moses/Deuteronomy split Sat, Three +# Young Men Sun) -- all 7 already authored, hours/lauds-canticles.ts. This +# supersedes the earlier (2026-08-28) note on this file's Vespers sibling +# claiming a "Canticum Ieremiæ" was needed and never transcribed -- that +# was a live-verify session that captured a plain ferial Thursday's output +# instead of actually passing votive=C8; no such canticle appears anywhere +# in the real Dedication scheme on any weekday. `canticle.id` is +# intentionally omitted here -- see hours/lauds.ts's resolvePsalmody and +# hours/lauds-psalmody-overrides.ts's own doc comment for the fallback. +id: common-of-a-dedication +groups: + - psalms: [50] + antiphon: + la: "Domum tuam, Dómine, * decet sanctitúdo in longitúdinem diérum." + en: "Holiness becometh thine house, * O Lord, for ever." + - psalms: [5] + antiphon: + la: "Domus mea, * domus oratiónis vocábitur." + en: "My house * shall be called the house of prayer." + - psalms: [35] + antiphon: + la: "Hæc est domus Dómini * fírmiter ædificáta, bene fundáta est supra firmam petram." + en: "This is the Lord's house * stoutly builded, well founded upon a sure rock." +canticle: + antiphon: + la: "Bene fundáta est * domus Dómini supra firmam petram." + en: "The Lord's house is well founded * upon a sure rock." +laudate: + antiphon: + la: "Lápides pretiósi * omnes muri tui, et turres Ierúsalem gemmis ædificabúntur." + en: "All thy walls are of stones most precious, * and the towers of Jerusalem shall be built up with jewels." diff --git a/src/hours/lauds-psalmody-overrides.ts b/src/hours/lauds-psalmody-overrides.ts index ab1fcc3..48c90cc 100644 --- a/src/hours/lauds-psalmody-overrides.ts +++ b/src/hours/lauds-psalmody-overrides.ts @@ -33,7 +33,15 @@ export interface LaudsPsalmodyOverride { groups: { psalms: number[]; antiphon: Partial> }[]; // `split`: see hours/lauds.ts's PsalmodyBlock — no current override // needs it, but the shape stays aligned with the plain weekday default. - canticle: { id: string; antiphon: Partial>; split?: number }; + // + // `id` is optional: every category so far uses the same canticle + // regardless of weekday (so authors it directly), but Common-of-a- + // Dedication's own canticle *antiphon* is fixed while the underlying + // canticle text rotates through the plain weekday cycle exactly like + // ferial Lauds (live-verified against votive=C8 across all 7 weekdays, + // 2026-09-05) — omitting `id` here signals hours/lauds.ts's + // resolvePsalmody to splice in that day's own ferial canticle id/split. + canticle: { id?: string; antiphon: Partial>; split?: number }; laudate: { antiphon: Partial> }; } export interface LaudsPsalmodyCategory extends LaudsPsalmodyOverride { diff --git a/src/hours/lauds.ts b/src/hours/lauds.ts index 4dadf4a..6e64edf 100644 --- a/src/hours/lauds.ts +++ b/src/hours/lauds.ts @@ -216,7 +216,15 @@ function resolvePsalmody(day: LiturgicalDay): ResolvedPart[] { const ferial = laudsAntiphons[day.weekday]; let wd: PsalmodyBlock; if (getOfficeOverrideId(day)) { - wd = getPsalmodyOverrideFor(day) ?? ferial; + const override = getPsalmodyOverrideFor(day); + wd = override + ? { + ...override, + canticle: override.canticle.id + ? { id: override.canticle.id, antiphon: override.canticle.antiphon, split: override.canticle.split } + : { ...ferial.canticle, antiphon: override.canticle.antiphon }, + } + : ferial; } else { const properId = getPsalmodyProperOverrideId(day); const proper = properId ? getLaudsSaintOverride(properId) : undefined;