Give ordinary Paschaltide Sundays their own Matins Nocturn I-III content
Deploy / deploy (push) Successful in 1m26s
Deploy / deploy (push) Successful in 1m26s
Same seasonal-overlay shape as Advent, live-verified against the reference engine across 5 Paschaltide Sundays. Generalized sundayNocturnFor to a season-keyed lookup covering both Advent and Paschaltide. Confirmed two related non-gaps while investigating: Christmastide/post- Epiphany Sundays have no seasonal block in the source, and a Duplex+ saint winning outright on a Sunday deliberately still uses the fixed Sunday psalmody per this app's own documented design (readings still surface the saint via the separate pool) — neither needs a fix. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017XMSokiTD2Qc5vPP2YQu3Q
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
# Sunday Matins Nocturns I-III, ordinary-Paschaltide override — same shape
|
||||
# as matins-sunday-advent-nocturn-overrides.yml (a single season-wide
|
||||
# block, not per-Sunday), covering the ordinary Paschaltide Sundays: Low
|
||||
# Sunday through the Sunday before Ascension (day.season === 'eastertide'
|
||||
# in hours/matins.ts's dispatch) — live-verified identical on Low Sunday
|
||||
# and the 2nd Sunday after Easter (2026 cycle dates 04-12, 04-19) against
|
||||
# the local reference-engine CGI instance (`prayMatutinum`, Monastic
|
||||
# Tridentinum 1617, 2026-09-01). NOT applied to Easter Sunday itself
|
||||
# (which has its own wholly proper Matins, a different and much bigger
|
||||
# gap — see TODO.md's tabled "Easter's own octave" mechanism item) or to
|
||||
# `ascensiontide`, whose one Sunday (within the Octave of Ascension) has
|
||||
# its own genuinely proper content ("Eleváta est...") — a separate named-
|
||||
# Sunday-proper gap, not this seasonal-antiphon-overlay shape at all.
|
||||
#
|
||||
# Structurally different from the Advent override: Nocturns I and II here
|
||||
# each take a SINGLE antiphon covering all 6 psalms of the nocturn (not 3
|
||||
# separate antiphons, one per psalm-pair) — confirmed by the live query,
|
||||
# which showed only one antiphon before/after each whole nocturn's
|
||||
# psalmody, not one per pair. Nocturn III's antiphon is unchanged from the
|
||||
# plain-season default ("Allelúja, allelúja, allelúja" — omitted here,
|
||||
# falls through to matins-sunday-antiphons.yml's own nocturn3.antiphon);
|
||||
# only its canticles and versicle differ.
|
||||
|
||||
nocturn1:
|
||||
groups:
|
||||
- psalms: [20, 21, 22, 23, 24, 25]
|
||||
antiphon:
|
||||
la: "Allelúja, lapis revolútus est, allelúja: ab óstio monuménti, allelúja, allelúja."
|
||||
en: "Alleluia, the stone was rolled back, alleluia, from the door of the sepulchre, alleluia, alleluia."
|
||||
versicle:
|
||||
v: { la: "Surréxit Dóminus de sepúlcro, allelúja.", en: "The Lord is risen from the sepulchre, alleluia." }
|
||||
r: { la: "Qui pro nobis pepéndit in ligno, allelúja.", en: "Who for us was hanged on the tree, alleluia." }
|
||||
|
||||
nocturn2:
|
||||
groups:
|
||||
- psalms: [26, 27, 28, 29, 30, 31]
|
||||
antiphon:
|
||||
la: "Allelúja, quem quæris múlier? allelúja: vivéntem cum mórtuis? allelúja, allelúja."
|
||||
en: "Alleluia, whom seek ye, woman? alleluia: the living among the dead? alleluia, alleluia."
|
||||
versicle:
|
||||
v: { la: "Surréxit Dóminus vere, allelúja.", en: "The Lord is risen indeed, alleluia." }
|
||||
r: { la: "Et appáruit Simóni, allelúja.", en: "And hath appeared to Simon, alleluia." }
|
||||
|
||||
nocturn3:
|
||||
canticles:
|
||||
- refs: [{ book: isa, chapter: 63, verses: "1-5" }]
|
||||
- refs: [{ book: osee, chapter: 6, verses: "1-6" }]
|
||||
- refs: [{ book: soph, chapter: 3, verses: "8-13" }]
|
||||
versicle:
|
||||
v: { la: "Gavísi sunt discípuli, allelúja.", en: "The disciples were glad, alleluia." }
|
||||
r: { la: "Viso Dómino, allelúja.", en: "When they saw the Lord, alleluia." }
|
||||
@@ -0,0 +1,59 @@
|
||||
# Isaiah 63 — verses 1-5 transcribed from a live Divinum Officium query
|
||||
# (Monastic Tridentinum 1617, prayMatutinum, 2026-09-01, ordinary
|
||||
# Paschaltide Sundays — Low Sunday through the Sunday before Ascension,
|
||||
# 2026 cycle — identical on each) — see
|
||||
# data/hours/matins-sunday-paschaltide-nocturn-overrides.yml. Only the
|
||||
# verse range actually used by that Nocturn III canticle is authored.
|
||||
book: isa
|
||||
chapter: 63
|
||||
verses:
|
||||
- n: 1
|
||||
text:
|
||||
la: "Quis est iste, qui venit de Edom, * tinctis véstibus de Bosra?"
|
||||
en: "Who is this that cometh from Edom, * with dyed garments from Bosra,"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 1
|
||||
text:
|
||||
la: "Iste formósus in stola sua, * grádiens in multitúdine fortitúdinis suæ."
|
||||
en: "This beautiful one in his robe, * walking in the greatness of his strength."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 1
|
||||
text:
|
||||
la: "Ego qui loquor justítiam, * et propugnátor sum ad salvándum."
|
||||
en: "I, that speak justice, * and am a defender to save."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 2
|
||||
text:
|
||||
la: "Quare ergo rubrum est induméntum tuum, * et vestiménta tua sicut calcántium in torculári?"
|
||||
en: "Why then is thy apparel red, * and thy garments like theirs that tread in the winepress?"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 3
|
||||
text:
|
||||
la: "Tórcular calcávi solus, * et de géntibus non est vir mecum:"
|
||||
en: "I have trodden the winepress alone, * and of the Gentiles there is not a man with me:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 3
|
||||
text:
|
||||
la: "Calcávi eos in furóre meo, * et conculcávi eos in ira mea:"
|
||||
en: "I have trampled on them in my indignation, * and have trodden them down in my wrath,"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 3
|
||||
text:
|
||||
la: "Et aspérsus est sanguis eorum super vestiménta mea, * et ómnia induménta mea inquinávi."
|
||||
en: "And their blood is sprinkled upon my garments, * and I have stained all my apparel."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 4
|
||||
text:
|
||||
la: "Dies enim ultiónis in corde meo; * annus redemptiónis meæ venit."
|
||||
en: "For the day of vengeance is in my heart, * the year of my redemption is come."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 5
|
||||
text:
|
||||
la: "Circumspéxi, et non erat auxiliátor; * quæsívi, et non fuit qui adjuváret:"
|
||||
en: "I looked about, and there was none to help: * I sought, and there was none to give aid:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 5
|
||||
text:
|
||||
la: "Et salvávit mihi bráchium meum, * et indignátio mea ipsa auxiliáta est mihi."
|
||||
en: "And my own arm hath saved for me, * and my indignation itself hath helped me."
|
||||
status: { la: verified, en: verified }
|
||||
@@ -0,0 +1,46 @@
|
||||
# Osee (Hosea) 6 — verses 1-6 transcribed from a live Divinum Officium
|
||||
# query (Monastic Tridentinum 1617, prayMatutinum, 2026-09-01, ordinary
|
||||
# Paschaltide Sundays — 2026 cycle) — see
|
||||
# data/hours/matins-sunday-paschaltide-nocturn-overrides.yml. Only the
|
||||
# verse range actually used by that Nocturn III canticle is authored;
|
||||
# "osee" (the Vulgate's own name for the book, matching this app's
|
||||
# Latin-abbreviation book-code convention already used for jer/lam/ezek/
|
||||
# sap/sir) is the first content under this book code.
|
||||
book: osee
|
||||
chapter: 6
|
||||
verses:
|
||||
- n: 1
|
||||
text:
|
||||
la: "Veníte, et revertámur ad Dóminum, quia ipse cepit, et sanábit nos; * percútiet, et curábit nos."
|
||||
en: "Come, and let us return to the Lord: for he hath taken us, and he will heal us: * he will strike, and he will cure us."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 3
|
||||
text:
|
||||
la: "Vivificábit nos post duos dies; in die tértia suscitábit nos, * et vivémus in conspéctu ejus."
|
||||
en: "He will revive us after two days: on the third day he will raise us up, * and we shall live in his sight."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 3
|
||||
text:
|
||||
la: "Sciémus, sequemúrque, * ut cognoscámus Dóminum."
|
||||
en: "We shall know, and we shall follow on, * that we may know the Lord."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 3
|
||||
text:
|
||||
la: "Quasi dilúculum præparátus est egréssus ejus, * et véniet quasi imber nobis temporáneus et serótinus terræ."
|
||||
en: "His going forth is prepared as the morning light, * and he will come to us as the early and the latter rain to the earth."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 4
|
||||
text:
|
||||
la: "Quid fáciam tibi, Ephraim? quid fáciam tibi, Juda? misericórdia vestra quasi nubes matutína, * et quasi ros mane pertránsiens."
|
||||
en: "What shall I do to thee, O Ephraim? what shall I do to thee, O Juda? * your mercy is as a morning cloud, and as the dew that goeth away in the morning."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 5
|
||||
text:
|
||||
la: "Propter hoc dolávi in prophétis; occídi eos in verbis oris mei: * et judícia tua quasi lux egrediéntur."
|
||||
en: "For this reason have I hewed them by the prophets, I have slain them by the words of my mouth: * and thy judgments shall go forth as the light."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 6
|
||||
text:
|
||||
la: "Quia misericórdiam vólui, et non sacrifícium; * et sciéntiam Dei plus quam holocáusta."
|
||||
en: "For I desired mercy, and not sacrifice: * and the knowledge of God more than holocausts."
|
||||
status: { la: verified, en: verified }
|
||||
@@ -0,0 +1,60 @@
|
||||
# Sophonias (Zephaniah) 3 — verses 8-13 transcribed from a live Divinum
|
||||
# Officium query (Monastic Tridentinum 1617, prayMatutinum, 2026-09-01,
|
||||
# ordinary Paschaltide Sundays — 2026 cycle) — see
|
||||
# data/hours/matins-sunday-paschaltide-nocturn-overrides.yml. Only the
|
||||
# verse range actually used by that Nocturn III canticle is authored;
|
||||
# "soph" (matching this app's Latin-abbreviation book-code convention) is
|
||||
# the first content under this book code.
|
||||
book: soph
|
||||
chapter: 3
|
||||
verses:
|
||||
- n: 8
|
||||
text:
|
||||
la: "Exspécta me, dicit Dóminus, in die resurrectiónis meæ in futúrum: * quia judícium meum ut cóngregem gentes, et cólligam regna,"
|
||||
en: "Wherefore expect me, saith the Lord, in the day of my resurrection that is to come, * for my judgment is to assemble the Gentiles, and to gather the kingdoms:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 8
|
||||
text:
|
||||
la: "Et effúndam super eos indignatiónem meam, * omnem iram furóris mei:"
|
||||
en: "And to pour upon them my indignation, * all my fierce anger:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 8
|
||||
text:
|
||||
la: "In igne enim zeli mei * devorábitur omnis terra."
|
||||
en: "For with the fire of my jealousy * shall all the earth be devoured."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 9
|
||||
text:
|
||||
la: "Quia tunc reddam pópulis lábium eléctum, ut ínvocent omnes in nómine Dómini, * et sérviant ei húmero uno."
|
||||
en: "Because then I will restore to the people a chosen lip, that all may call upon the name of the Lord, * and may serve him with one shoulder."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 10
|
||||
text:
|
||||
la: "Ultra flúmina Æthiópiæ, inde súpplices mei; * fílii dispersórum meórum déferent munus mihi."
|
||||
en: "From beyond the rivers of Ethiopia, shall my suppliants the children of my dispersed people * bring me an offering."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 11
|
||||
text:
|
||||
la: "In die illa non confundéris super cunctis adinventiónibus tuis, * quibus prævaricáta es in me:"
|
||||
en: "In that day thou shalt not be ashamed for all thy doings, * wherein thou hast transgressed against me:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 11
|
||||
text:
|
||||
la: "Quia tunc áuferam de médio tui magníloquos supérbiæ tuæ, * et non adjícies exaltári ámplius in monte sancto meo."
|
||||
en: "For then I will take away out of the midst of thee thy proud boasters, * and thou shalt no more be lifted up because of my holy mountain."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 12
|
||||
text:
|
||||
la: "Et derelínquam in médio tui pópulum páuperem et egénum: * et sperábunt in nómine Dómini."
|
||||
en: "And I will leave in the midst of thee a poor and needy people: * and they shall hope in the name of the Lord."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 13
|
||||
text:
|
||||
la: "Relíquiæ Israël non fácient iniquitátem, nec loquéntur mendácium, * et non inveniétur in ore eórum lingua dolósa:"
|
||||
en: "The remnant of Israel shall not do iniquity, nor speak lies, * nor shall a deceitful tongue be found in their mouth:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 13
|
||||
text:
|
||||
la: "Quóniam ipsi pascéntur, et accubábunt, * et non erit qui extérreat."
|
||||
en: "For they shall feed, and shall lie down, * and there shall be none to make them afraid."
|
||||
status: { la: verified, en: verified }
|
||||
+22
-13
@@ -96,6 +96,7 @@ import { getMatinsSaintOverride, getMatinsCommonOverride, type MatinsPsalmodySch
|
||||
import matinsSundayAntiphonsData from '../data/hours/matins-sunday-antiphons.yml';
|
||||
import matinsSundayNocturn3OverridesData from '../data/hours/matins-sunday-nocturn3-overrides.yml';
|
||||
import matinsSundayAdventOverridesData from '../data/hours/matins-sunday-advent-nocturn-overrides.yml';
|
||||
import matinsSundayPaschaltideOverridesData from '../data/hours/matins-sunday-paschaltide-nocturn-overrides.yml';
|
||||
import matinsFerialAntiphonsData from '../data/hours/matins-ferial-antiphons.yml';
|
||||
import type { Weekday } from '../calendar/types';
|
||||
|
||||
@@ -146,26 +147,34 @@ function sundayNocturn3For(temporalId: string | undefined): SundayNocturn {
|
||||
};
|
||||
}
|
||||
|
||||
// Advent's own Nocturns I-III override, applied uniformly across all 4
|
||||
// Advent Sundays (unlike sundayNocturn3Overrides above, which is keyed
|
||||
// per-distinct-Sunday for Septuagesima-Palm) — see
|
||||
// data/hours/matins-sunday-advent-nocturn-overrides.yml's own header.
|
||||
interface MatinsSundayAdventOverrides {
|
||||
// Advent's and ordinary-Paschaltide's own Nocturns I-III overrides, each
|
||||
// applied uniformly across every Sunday of the season (unlike
|
||||
// sundayNocturn3Overrides above, which is keyed per-distinct-Sunday for
|
||||
// Septuagesima-Palm) — see matins-sunday-advent-nocturn-overrides.yml's
|
||||
// and matins-sunday-paschaltide-nocturn-overrides.yml's own headers.
|
||||
// Paschaltide here means only `eastertide` (Low Sunday through the Sunday
|
||||
// before Ascension) — Easter Sunday itself has its own wholly proper
|
||||
// Matins (a separate, tabled gap; see TODO.md's "Easter's own octave"),
|
||||
// and `ascensiontide`'s one Sunday (within the Octave of Ascension) has
|
||||
// its own genuinely proper content, not this seasonal-overlay shape.
|
||||
interface MatinsSundayNocturnOverrides {
|
||||
nocturn1: Partial<SundayNocturn>;
|
||||
nocturn2: Partial<SundayNocturn>;
|
||||
nocturn3: Partial<SundayNocturn>;
|
||||
}
|
||||
const sundayAdventOverrides = matinsSundayAdventOverridesData as unknown as MatinsSundayAdventOverrides;
|
||||
const sundayAdventOverrides = matinsSundayAdventOverridesData as unknown as MatinsSundayNocturnOverrides;
|
||||
const sundayPaschaltideOverrides = matinsSundayPaschaltideOverridesData as unknown as MatinsSundayNocturnOverrides;
|
||||
|
||||
/** Sunday Nocturn I/II/III content for a given day — Advent's own
|
||||
* season-wide override (all three nocturns) takes precedence over the
|
||||
* plain-season default; Nocturn III additionally checks the per-Sunday
|
||||
* Septuagesima-Palm override (`sundayNocturn3For`) when Advent doesn't
|
||||
* apply (the two never overlap). */
|
||||
/** Sunday Nocturn I/II/III content for a given day — a season-wide
|
||||
* override (Advent or ordinary Paschaltide, all three nocturns) takes
|
||||
* precedence over the plain-season default; Nocturn III additionally
|
||||
* checks the per-Sunday Septuagesima-Palm override (`sundayNocturn3For`)
|
||||
* when neither season-wide override applies (none of the three ever
|
||||
* overlap). */
|
||||
function sundayNocturnFor(nocturnKey: 'nocturn1' | 'nocturn2' | 'nocturn3', day: LiturgicalDay, temporalId: string | undefined): SundayNocturn {
|
||||
const base = nocturnKey === 'nocturn3' ? sundayNocturn3For(temporalId) : sundayAntiphons[nocturnKey];
|
||||
if (day.season !== 'advent') return base;
|
||||
const override = sundayAdventOverrides[nocturnKey];
|
||||
const seasonOverrides = day.season === 'advent' ? sundayAdventOverrides : day.season === 'eastertide' ? sundayPaschaltideOverrides : undefined;
|
||||
const override = seasonOverrides?.[nocturnKey];
|
||||
if (!override) return base;
|
||||
return {
|
||||
groups: override.groups ?? base.groups,
|
||||
|
||||
Reference in New Issue
Block a user