Give Ascension its own hymnody at Matins/Lauds/Vespers, all octave
`ascension` is a temporal-feast id, not a saint record, so
resolveOfficeWinner's octave-synthesis (which already handles
saint-based octaves like Assumption's/St. Lawrence's) never
recognized it -- Ascension Day itself and its whole octave silently
rendered the generic Paschaltide hymn at every hour.
Fixed the mechanism: added `ascension` to ALWAYS_OVERRIDE_TEMPORAL_IDS
(covers the feast day itself), and taught resolveOfficeWinner to also
synthesize a {kind:'temporal'} winner from an active octave with no
saint record but a real temporal-feast record (covers ordinary-feria
octave days; a real winning saint within the octave still correctly
keeps priority).
A third gap surfaced testing this: octaveGoverningPrivilegedDay's
correct-by-design "a privileged Sunday never accepts an octave
override" rule is live-verified wrong specifically for "Dominica
infra Octavam Ascensionis" (keeps the octave's own hymn/responsory,
just with its own distinct proper chapter). Rather than loosen that
shared gate for every octave, gave resolveLaudsHymn/resolveVespersHymn
a narrow, hymn-only intercept guarded to saint-less octaves, checked
before the season/weekday default.
Authored matins-hymn-ascension.yml, lauds-{capitulum,responsory,hymn,
versicle}-ascension.yml, and vespers-{responsory,hymn,versicle}-
ascension.yml (Vespers reuses Lauds' chapter via the existing
cross-hour fallback) -- all live-verified against Divinum Officium
(Monastic Tridentinum 1617), 2026-05-14.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AGjUyhUZJaSjiniEmnLdak
This commit is contained in:
@@ -60,6 +60,7 @@ export const ALWAYS_OVERRIDE_TEMPORAL_IDS = new Set([
|
||||
'christ-the-king',
|
||||
'christmas-octave-sunday',
|
||||
'immaculate-heart-of-mary',
|
||||
'ascension',
|
||||
'circumcision',
|
||||
'holy-name-of-jesus',
|
||||
'vigil-of-christmas',
|
||||
@@ -124,6 +125,16 @@ export function resolveOfficeWinner(day: LiturgicalDay): DayWinner {
|
||||
if (saint) {
|
||||
return { kind: 'sanctoral', id: saint.id, name: saint.name, rank: saint.rank };
|
||||
}
|
||||
// A temporal-feast-only octave (Ascension's own — no saint record to
|
||||
// synthesize from, unlike Assumption's/St. Lawrence's) still needs its
|
||||
// own content recognized on interior octave days, the same way its own
|
||||
// feast day already is via the `ALWAYS_OVERRIDE_TEMPORAL_IDS` check
|
||||
// above — found 2026-09-04 via the Matins seasonal-hymn fallback
|
||||
// silently rendering the generic Paschaltide text throughout the whole
|
||||
// Ascension octave, not just a missing-content gap on the day itself.
|
||||
if (ALWAYS_OVERRIDE_TEMPORAL_IDS.has(activeOctave.id) && getTemporalFeastRecord(activeOctave.id)) {
|
||||
return { kind: 'temporal', id: activeOctave.id };
|
||||
}
|
||||
}
|
||||
return day.winner;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user