Author Sunday's own Matins hymn and every season's (Advent-Paschaltide)

The "genuinely more complex, not-yet-understood two-hymn mechanism"
flagged for Sunday turned out simple: Day0 Hymnus ("Nocte surgéntes")
is just Sunday's plain per-annum hymn, and Day0 Hymnus1 ("Primo
diérum ómnium") is Septuagesima-tide's own separate seasonal hymn --
the same shape Advent/Lent/Passiontide/Paschaltide each already have.
Live-verified these 4 don't vary by weekday within their season (a
Lenten Sunday and a Lenten feria render identically). None of the 6
were authored at all before this -- every Sunday and every season day
not otherwise overridden by a winning saint/octave silently fell
through to Monday's own ferial placeholder text.

Authored matins-hymn-{sunday,septuagesima,advent,lent,passiontide,
paschaltide}.yml, all live-verified, self-contained with their own
real closing doxology baked in. Septuagesima is checked directly by
day.season in resolveMatinsHymn itself, deliberately not folded into
the shared seasonalOfficeSuffix (Lauds/Vespers have no matching
content yet -- resolveOfficeBundle there is all-or-nothing per feast,
so adding it would silently blank their chapter/hymn instead of
falling through to their current weekday default).

Known, flagged simplification: the generic Paschaltide hymn wrongly
applies during the Ascension octave, whose own real hymn isn't
authored anywhere yet -- a same-shape gap Lauds already has, not a
new regression. Updated 2 FERIAL_DATE (a Tuesday in Advent) hymn
assertions that had been asserting Tuesday's own ferial text --
Advent's own seasonal hymn correctly outranks the weekday cycle now.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AGjUyhUZJaSjiniEmnLdak
This commit is contained in:
2026-09-04 10:38:05 -04:00
parent 8307526f69
commit e7e19c530a
9 changed files with 926 additions and 19 deletions
+28 -2
View File
@@ -450,6 +450,21 @@ function resolveMatinsHymn(day: LiturgicalDay): ResolvedText {
return commonHymn;
}
}
// Septuagesima-tide checked directly by `day.season`, not folded into
// `seasonalOfficeSuffix` — that function is shared with Lauds/Vespers,
// which have no matching Septuagesima content authored yet; adding it
// there would silently blank their own chapter/hymn (resolveOfficeBundle
// requires all-or-nothing) instead of falling through to their current
// weekday default. Scoped to Matins alone until Lauds/Vespers' own
// Septuagesima content exists too (see TODO.md). Its own hymn ("Primo
// diérum ómnium") is a genuinely separate seasonal text from the plain
// Sunday/ferial one below, live-verified 2026-02-01.
if (day.season === 'septuagesima') {
const septuagesima = resolveCommon('matins-hymn-septuagesima');
if (septuagesima.status.la !== 'missing' || septuagesima.status.en !== 'missing') {
return septuagesima;
}
}
const seasonSuffix = seasonalOfficeSuffix(day.season);
if (seasonSuffix) {
const seasonal = resolveCommon(`matins-hymn-${seasonSuffix}`);
@@ -457,6 +472,16 @@ function resolveMatinsHymn(day: LiturgicalDay): ResolvedText {
return seasonal;
}
}
// Sunday's own plain hymn ("Nocte surgéntes"), self-contained (own
// doxology baked in, unlike the shared weekday one below) — checked
// here, after every season/octave/Common tier above but before the
// Monday-Saturday ferial cycle, live-verified 2026-09-04.
if (day.weekday === 'sunday') {
const sunday = resolveCommon('matins-hymn-sunday');
if (sunday.status.la !== 'missing' || sunday.status.en !== 'missing') {
return sunday;
}
}
// The plain ferial hymn's own Monastic source (Day1-6 Hymnus, Psalterium/
// Special/Matutinum Special.txt) carries a real seasonal-doxology
// substitution marker (live-checked 2026-09-03) — unlike the Advent/
@@ -470,8 +495,9 @@ function resolveMatinsHymn(day: LiturgicalDay): ResolvedText {
// text — a real gap uncovered when the user noticed Friday showing
// Monday's own hymn, and Saturday's own gap found the same day by
// asking what actually renders on a real Ember Saturday (see
// matins-hymn-ferial.yml's header for why Sunday alone still falls to
// the plain `matins-hymn-ferial` id as a documented placeholder).
// matins-hymn-ferial.yml's header for why Monday alone still falls to
// the plain `matins-hymn-ferial` id, since Monday's own text simply
// lives there unsuffixed).
const weekdayFerialHymnIds: Partial<Record<Weekday, string>> = {
tuesday: 'matins-hymn-ferial-tuesday',
wednesday: 'matins-hymn-ferial-wednesday',