Label Vespers cross-day commemorations and add feast-side privilege

A commemoration that only exists because Vespers/Compline crossed a day
boundary now renders as "(of today)"/"(of tomorrow)" in English and the
real Divino Afflatu "de præcedenti"/"de sequenti" in Latin, instead of
showing silently with no indication it's a cross-day artifact.

Also adds forbidsSuccessorCommemoration to SaintRecord and
TemporalFeastRecord: a feast can now refuse to commemorate whatever wins
the next day at its own kept Second Vespers, the feast-side mirror of the
day-side privilege calendar/commemorations.ts already modeled. Left unset
everywhere for now (a no-op) -- it exists so the next commit's Sacred
Heart record has somewhere to carry the real, live-sourced exclusion
against Most Precious Blood.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014axryJBrRswYh2niA7WCUc
This commit is contained in:
2026-08-26 15:20:10 -04:00
parent 9067faf1fd
commit 2f7b421558
6 changed files with 125 additions and 6 deletions
+12 -1
View File
@@ -168,7 +168,18 @@ export type DayWinner =
*/
export type Commemoration =
| { kind: 'temporal'; id: string }
| ({ kind: 'sanctoral' } & SanctoralIdentity)
| ({
kind: 'sanctoral';
// Set by calendar/vespers.ts's resolveEveningDay when this
// commemoration exists only because Vespers/Compline crossed a day
// boundary (First Vespers anticipation, or a kept Second Vespers
// still noting the displaced neighbor) — 'today' for the real
// Divino Afflatu "commemoratio de præcedenti" case, 'tomorrow' for
// "commemoratio de sequenti". Left unset for an ordinary same-day
// commemoration (a real collision, an octave day, etc.), which
// carries no such qualifier.
vespersNote?: 'today' | 'tomorrow';
} & SanctoralIdentity)
| { kind: 'octave'; id: string; name: string };
export interface LiturgicalDay {