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
+3
View File
@@ -10,9 +10,12 @@ parts:
resolve: by-weekday resolve: by-weekday
- kind: chapter - kind: chapter
textRef: { source: common, id: none-capitulum-per-annum } textRef: { source: common, id: none-capitulum-per-annum }
- kind: preces
textRef: { source: common, id: minor-hour-kyrie-pater }
- kind: preces - kind: preces
textRef: { source: common, id: minor-hour-preces-feriales } textRef: { source: common, id: minor-hour-preces-feriales }
label: Preces label: Preces
ferialOnly: true
- kind: day-collect - kind: day-collect
- kind: preces - kind: preces
textRef: { source: common, id: little-hour-conclusio } textRef: { source: common, id: little-hour-conclusio }
+3
View File
@@ -10,9 +10,12 @@ parts:
resolve: by-weekday resolve: by-weekday
- kind: chapter - kind: chapter
textRef: { source: common, id: sext-capitulum-per-annum } textRef: { source: common, id: sext-capitulum-per-annum }
- kind: preces
textRef: { source: common, id: minor-hour-kyrie-pater }
- kind: preces - kind: preces
textRef: { source: common, id: minor-hour-preces-feriales } textRef: { source: common, id: minor-hour-preces-feriales }
label: Preces label: Preces
ferialOnly: true
- kind: day-collect - kind: day-collect
- kind: preces - kind: preces
textRef: { source: common, id: little-hour-conclusio } textRef: { source: common, id: little-hour-conclusio }
+10 -2
View File
@@ -18,8 +18,13 @@
# Preces (Kyrie/Pater Noster + a short V/R litany) were added after the # Preces (Kyrie/Pater Noster + a short V/R litany) were added after the
# chapter/collect, by deliberate choice, even though real Monastic # chapter/collect, by deliberate choice, even though real Monastic
# Terce/Sext/None has none — see minor-hour-preces-feriales.yml's header # Terce/Sext/None has none — see minor-hour-preces-feriales.yml's header
# for the reference-engine source and the "every day" simplification, # for the reference-engine source, mirroring the same deviation already
# mirroring the same deviation already made for Prime. # made for Prime. Split 2026-09-01, by explicit choice: the Kyrie/Pater
# Noster piece (minor-hour-kyrie-pater) always shows regardless of rank,
# while the further Preces versicles proper (minor-hour-preces-feriales,
# now trimmed to just those) are ferial-only (`ferialOnly: true`) —
# see hours/resolve-common.ts's isFerialOrVigil, the same predicate
# Lauds'/Vespers' own ferial Preces use.
id: terce id: terce
parts: parts:
- kind: opening-versicle - kind: opening-versicle
@@ -29,9 +34,12 @@ parts:
resolve: by-weekday resolve: by-weekday
- kind: chapter - kind: chapter
textRef: { source: common, id: terce-capitulum-per-annum } textRef: { source: common, id: terce-capitulum-per-annum }
- kind: preces
textRef: { source: common, id: minor-hour-kyrie-pater }
- kind: preces - kind: preces
textRef: { source: common, id: minor-hour-preces-feriales } textRef: { source: common, id: minor-hour-preces-feriales }
label: Preces label: Preces
ferialOnly: true
- kind: day-collect - kind: day-collect
- kind: preces - kind: preces
textRef: { source: common, id: little-hour-conclusio } textRef: { source: common, id: little-hour-conclusio }
@@ -0,0 +1,23 @@
# Split out of minor-hour-preces-feriales.yml on 2026-09-01, by explicit
# choice: Terce/Sext/None should always show the Kyrie and Pater Noster
# (with its own "Et ne nos indúcas/Sed líbera nos a malo" completion),
# even on a Sunday or feast, while the further Preces versicles that used
# to follow in the same block (now trimmed down to just those, still under
# minor-hour-preces-feriales's own id) become ferial-only — see that
# file's header and data/hours/terce.yml's for the reasoning. Text
# otherwise unchanged from what was verified there.
id: minor-hour-kyrie-pater
text:
la: |
Kýrie, eléison. Christe, eléison. Kýrie, eléison.
Pater noster, qui es in cælis, sanctificétur nomen tuum: advéniat regnum tuum: fiat volúntas tua, sicut in cælo et in terra. Panem nostrum cotidiánum da nobis hódie: et dimítte nobis débita nostra, sicut et nos dimíttimus debitóribus nostris:
V. Et ne nos indúcas in tentatiónem:
R. Sed líbera nos a malo.
en: |
Lord, have mercy. Christ, have mercy. Lord, have mercy.
Our Father, who art in heaven, hallowed be thy name; thy kingdom come; thy will be done on earth as it is in heaven. Give us this day our daily bread; and forgive us our trespasses, as we forgive those who trespass against us:
V. And lead us not into temptation:
R. But deliver us from evil.
status:
la: verified
en: verified
@@ -5,28 +5,24 @@
# [Preces feriales minora]). Shared by Terce, Sext, and None — the Latin is # [Preces feriales minora]). Shared by Terce, Sext, and None — the Latin is
# identical across all three per the reference engine. # identical across all three per the reference engine.
# #
# Deliberate deviation from real Monastic 1617 (which has no Preces at the # Trimmed 2026-09-01, by explicit choice: this file used to hold the whole
# Little Hours at all) and from the reference engine's own rubric (which # block (Kyrie + Pater Noster + all four V/R pairs) and was shown every
# says the Pater Noster here is "secreto," silent): by explicit choice this # day. The Kyrie/Pater Noster piece was split out into its own always-
# project shows the Kyrie and Pater Noster as spoken text rather than # shown `minor-hour-kyrie-pater` part (see that file) so it keeps
# dropping them the way Prime drops its silently-said opening Pater/Ave — # appearing regardless of rank; what's left here — the three further V/R
# see prime.yml's header for that contrasting precedent. # pairs, the actual "Preces" versicles proper — is now ferial-only
# (`ferialOnly: true` in data/hours/terce.yml etc.), matching real
# historical practice (Preces are dropped on Sundays/feasts) more closely
# than the old "every day" simplification did.
# #
# Also by explicit choice, said on *every* day regardless of rank, not just # Deliberate deviation from real Monastic 1617 (which has no Preces at the
# ferias — mirroring the same "every day" simplification already made for # Little Hours at all): by explicit choice this project still adds them on
# Prime's ferial Preces (see prime-preces-feriales.yml). The reference # ferial days, mirroring the same "every day" simplification originally
# engine's Sunday/feast form for the Little Hours (Kyrie + Pater Noster + # made for Prime's ferial Preces (see prime-preces-feriales.yml) but now
# a silently-said Creed, then a V/R block that's actually reused from # scoped to ferias only, per direct instruction.
# Compline's own dominical Preces) looks like a data-reuse quirk rather
# than genuinely-authored minor-hour content, so it was deliberately not
# imported.
id: minor-hour-preces-feriales id: minor-hour-preces-feriales
text: text:
la: | la: |
Kýrie, eléison. Christe, eléison. Kýrie, eléison.
Pater noster, qui es in cælis, sanctificétur nomen tuum: advéniat regnum tuum: fiat volúntas tua, sicut in cælo et in terra. Panem nostrum cotidiánum da nobis hódie: et dimítte nobis débita nostra, sicut et nos dimíttimus debitóribus nostris:
V. Et ne nos indúcas in tentatiónem:
R. Sed líbera nos a malo.
V. Dómine, Deus virtútum, convérte nos. V. Dómine, Deus virtútum, convérte nos.
R. Et osténde fáciem tuam, et salvi érimus. R. Et osténde fáciem tuam, et salvi érimus.
V. Exsúrge, Christe, ádjuva nos. V. Exsúrge, Christe, ádjuva nos.
@@ -34,10 +30,6 @@ text:
V. Dómine, exáudi oratiónem meam. V. Dómine, exáudi oratiónem meam.
R. Et clamor meus ad te véniat. R. Et clamor meus ad te véniat.
en: | en: |
Lord, have mercy. Christ, have mercy. Lord, have mercy.
Our Father, who art in heaven, hallowed be thy name; thy kingdom come; thy will be done on earth as it is in heaven. Give us this day our daily bread; and forgive us our trespasses, as we forgive those who trespass against us:
V. And lead us not into temptation:
R. But deliver us from evil.
V. O Lord, God of hosts, convert us. V. O Lord, God of hosts, convert us.
R. And show us thy face, and we shall be saved. R. And show us thy face, and we shall be saved.
V. Arise, O Christ, and help us. V. Arise, O Christ, and help us.
+2
View File
@@ -14,6 +14,7 @@ import {
resolveMinorHourAntiphon, resolveMinorHourAntiphon,
resolveMinorHourChapter, resolveMinorHourChapter,
resolveSelfContainedHymn, resolveSelfContainedHymn,
isFerialOrVigil,
} from './resolve-common'; } from './resolve-common';
import noneDefinitionData from '../data/hours/none.yml'; import noneDefinitionData from '../data/hours/none.yml';
import antiphonsData from '../data/hours/none-antiphons.yml'; import antiphonsData from '../data/hours/none-antiphons.yml';
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'day-collect': case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }]; return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces': case 'preces':
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }]; return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': { case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three // Only 'by-weekday' applies here — one antiphon framing all three
+2
View File
@@ -14,6 +14,7 @@ import {
resolveMinorHourAntiphon, resolveMinorHourAntiphon,
resolveMinorHourChapter, resolveMinorHourChapter,
resolveSelfContainedHymn, resolveSelfContainedHymn,
isFerialOrVigil,
} from './resolve-common'; } from './resolve-common';
import sextDefinitionData from '../data/hours/sext.yml'; import sextDefinitionData from '../data/hours/sext.yml';
import antiphonsData from '../data/hours/sext-antiphons.yml'; import antiphonsData from '../data/hours/sext-antiphons.yml';
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'day-collect': case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }]; return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces': case 'preces':
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }]; return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': { case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three // Only 'by-weekday' applies here — one antiphon framing all three
+2
View File
@@ -14,6 +14,7 @@ import {
resolveMinorHourAntiphon, resolveMinorHourAntiphon,
resolveMinorHourChapter, resolveMinorHourChapter,
resolveSelfContainedHymn, resolveSelfContainedHymn,
isFerialOrVigil,
} from './resolve-common'; } from './resolve-common';
import terceDefinitionData from '../data/hours/terce.yml'; import terceDefinitionData from '../data/hours/terce.yml';
import antiphonsData from '../data/hours/terce-antiphons.yml'; import antiphonsData from '../data/hours/terce-antiphons.yml';
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'day-collect': case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }]; return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces': case 'preces':
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }]; return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': { case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three // 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 // both Monastic and secular tracks, drops Compline's Preces to nothing
// on a Double, with no substitute) — the flag still means "not the full // on a Double, with no substitute) — the flag still means "not the full
// text here," just not "nothing here." // 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: 'psalm'; psalmNumber: number; verses?: string; antiphonRef?: PropersRef }
| { kind: 'canticle'; canticleId: string; textRef: PropersRef; antiphonRef?: PropersRef } | { kind: 'canticle'; canticleId: string; textRef: PropersRef; antiphonRef?: PropersRef }
| { | {