Add Lauds' ferial Preces (Tridentine 1906/1910), shown on ferial/vigil days
Deploy / deploy (push) Successful in 53s

Monastic 1617 has no Preces feriales at Lauds at all -- content sourced
from Tridentine 1906/1910 per direct instruction, same track as the
Cross suffrage and St. Joseph's suffrage. New lauds-preces-feriales.yml
(Kyrie, Pater noster, the full versicle litany, Psalm 129, closing
versicles) transcribed from a live query against a clean Advent feria,
matching what actually rendered rather than the underlying template's
own conditional markup (the Pope/Bishop and benefactors' versicles are
both dropped live despite being present in the template; the King/nation
versicle pair is kept despite the template's own rubric note suggesting
otherwise).

New `lauds-preces` part kind (hours/types.ts) picks between this and the
existing short Sunday/feast litany (lauds-short-litany.yml, unchanged
content) on a ferial-or-vigil day. Deliberately not the shared
`isSundayOrFeast` predicate, which treats a Vigil as a "feast" -- here a
Vigil needs to land on the ferial side instead, per direct instruction.
Also deliberately wider than the real 1906/1910 rubric itself, which
restricts the fuller form to Advent/Lent/Ember days specifically -- shown
on *every* ferial or vigil day instead, mirroring the identical explicit
choice already made for Prime's own ferial Preces.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 07:12:27 -04:00
parent 2f8f744cd1
commit 9c9811a9ed
12 changed files with 209 additions and 8 deletions
+1
View File
@@ -90,6 +90,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'lauds-office':
case 'benedictus':
case 'suffrages':
case 'lauds-preces':
case 'day-collects':
throw new Error(`Compline's ordo doesn't support a '${part.kind}' part`);
}
+16
View File
@@ -301,6 +301,22 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
const id = getMarianAntiphonId(day);
return [{ kind: 'preces', text: resolveCommon(id), label: getMarianAntiphonLabel(id) }];
}
case 'lauds-preces': {
// Deliberately not `isSundayOrFeast` -- that treats any sanctoral
// winner, Vigils included, as a "feast." Here a Vigil needs to land
// on the ferial side instead (per direct instruction), so it's
// checked for explicitly: a Vigil-ranked sanctoral winner, or a
// bare temporal winner that isn't Sunday and isn't a named
// temporal identity like Marian Saturday or Christ the King (which
// aren't Sunday or a sanctoral winner either, but still aren't a
// bare ferial office -- same reasoning as the Cross suffrage's own
// gate just above).
const isVigil = day.winner.kind === 'sanctoral' && day.winner.rank === 'vigil';
const isBareFeria = day.winner.kind === 'temporal' && !getTemporalFeastRecord(day.winner.id);
const isFerialOrVigil = day.weekday !== 'sunday' && (isVigil || isBareFeria);
const id = isFerialOrVigil ? 'lauds-preces-feriales' : 'lauds-short-litany';
return [{ kind: 'preces', text: resolveCommon(id) }];
}
// Not used by Lauds.
case 'hymn':
case 'lesson':
+1
View File
@@ -58,6 +58,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'lauds-office':
case 'benedictus':
case 'suffrages':
case 'lauds-preces':
case 'day-collects':
throw new Error(`None's ordo doesn't support a '${part.kind}' part`);
}
+1
View File
@@ -116,6 +116,7 @@ function resolvePart(part: HourPart, date: string, day: LiturgicalDay): Resolved
case 'lauds-office':
case 'benedictus':
case 'suffrages':
case 'lauds-preces':
case 'day-collects':
throw new Error(`Prime's ordo doesn't support a '${part.kind}' part`);
}
+1
View File
@@ -58,6 +58,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'lauds-office':
case 'benedictus':
case 'suffrages':
case 'lauds-preces':
case 'day-collects':
throw new Error(`Sext's ordo doesn't support a '${part.kind}' part`);
}
+1
View File
@@ -58,6 +58,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'lauds-office':
case 'benedictus':
case 'suffrages':
case 'lauds-preces':
case 'day-collects':
throw new Error(`Terce's ordo doesn't support a '${part.kind}' part`);
}
+14
View File
@@ -118,6 +118,20 @@ export type HourPart =
// feast) — an honest simplification, see hours/lauds.ts for the caveat
// on what real practice also suppresses them for that isn't modeled.
| { kind: 'suffrages'; omitOnDouble?: true }
// Lauds only. The Tridentine 1906/1910 "Preces feriales" litany (Kyrie,
// Pater noster, a long chain of versicles, Psalm 129, closing versicles)
// -- content Monastic 1617 doesn't have at Lauds at all, sourced from a
// different track per direct instruction, same as lauds-suffrage-
// joseph.yml. Real 1906/1910 practice restricts this further still
// (Advent/Lent/Ember days, or an explicit day's own rubric flag) --
// deliberately widened here to *every* ferial or vigil day, mirroring
// the same explicit choice already made for Prime's own ferial Preces
// (see data/hours/prime.yml's header). Replaces `lauds-short-litany` on
// those days rather than stacking with it -- see hours/lauds.ts's
// 'lauds-preces' case for the exact ferial-or-vigil predicate, which is
// deliberately not the shared `isSundayOrFeast` (a Vigil counts as a
// "feast" there; here it needs to count as ferial-like instead).
| { kind: 'lauds-preces' }
// Lauds/Vespers. The day's own collect *and* one more per commemoration
// (calendar/types.ts's LiturgicalDay.commemorations) — see hours/
// resolve-common.ts's getDayCollects. Distinct from the singular