Split Terce/Sext/None Preces into always-shown Kyrie/Pater + ferial-only versicles

Kyrie eleison and Pater Noster now render every day regardless of rank
(minor-hour-kyrie-pater); the further Preces V/R versicle pairs are
ferial-only, dropped on Sunday and any sanctoral winner.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017XMSokiTD2Qc5vPP2YQu3Q
This commit is contained in:
2026-09-01 06:39:10 -04:00
parent 45c1f4e958
commit b050e523ec
9 changed files with 67 additions and 25 deletions
+2
View File
@@ -14,6 +14,7 @@ import {
resolveMinorHourAntiphon,
resolveMinorHourChapter,
resolveSelfContainedHymn,
isFerialOrVigil,
} from './resolve-common';
import noneDefinitionData from '../data/hours/none.yml';
import antiphonsData from '../data/hours/none-antiphons.yml';
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces':
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three
+2
View File
@@ -14,6 +14,7 @@ import {
resolveMinorHourAntiphon,
resolveMinorHourChapter,
resolveSelfContainedHymn,
isFerialOrVigil,
} from './resolve-common';
import sextDefinitionData from '../data/hours/sext.yml';
import antiphonsData from '../data/hours/sext-antiphons.yml';
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces':
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three
+2
View File
@@ -14,6 +14,7 @@ import {
resolveMinorHourAntiphon,
resolveMinorHourChapter,
resolveSelfContainedHymn,
isFerialOrVigil,
} from './resolve-common';
import terceDefinitionData from '../data/hours/terce.yml';
import antiphonsData from '../data/hours/terce-antiphons.yml';
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces':
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three
+8 -1
View File
@@ -43,7 +43,14 @@ export type HourPart =
// both Monastic and secular tracks, drops Compline's Preces to nothing
// on a Double, with no substitute) — the flag still means "not the full
// text here," just not "nothing here."
| { kind: 'preces'; textRef: PropersRef; label?: string; omitOnDouble?: true }
// `ferialOnly` marks a part that's dropped outright (not substituted)
// on a Sunday/feast day — Terce/Sext/None's own trailing Preces
// versicles (minor-hour-preces-feriales, trimmed 2026-09-01 to just
// those versicles) are the only current user: the Kyrie/Pater Noster
// that used to precede them in the same block was split out into its
// own always-shown `minor-hour-kyrie-pater` part instead of following
// suit, by explicit choice — see data/hours/terce.yml's header.
| { kind: 'preces'; textRef: PropersRef; label?: string; omitOnDouble?: true; ferialOnly?: true }
| { kind: 'psalm'; psalmNumber: number; verses?: string; antiphonRef?: PropersRef }
| { kind: 'canticle'; canticleId: string; textRef: PropersRef; antiphonRef?: PropersRef }
| {