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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LGsATZvfnpQ81HQuoF5JuL
This commit is contained in:
2026-09-05 16:22:02 -04:00
parent cf0ecdf4c5
commit 989a63c05e
3 changed files with 62 additions and 2 deletions
@@ -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."
+9 -1
View File
@@ -33,7 +33,15 @@ export interface LaudsPsalmodyOverride {
groups: { psalms: number[]; antiphon: Partial<Record<string, string>> }[];
// `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<Record<string, string>>; 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<Record<string, string>>; split?: number };
laudate: { antiphon: Partial<Record<string, string>> };
}
export interface LaudsPsalmodyCategory extends LaudsPsalmodyOverride {
+9 -1
View File
@@ -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;