Fix octave-tie precedence, day-label commemorations, and rank display

A tie between an occurring saint's rank and an active octave now favors
the octave only on its own elevated closing day (live-verified: St.
Hyacinth vs. St. Lawrence's own Aug 17 closing day), not on an ordinary
octave day, where a tied saint still wins as before -- confirmed against
two already-tested counterexamples (St. Thomas of Canterbury, St.
Nicholas of Tolentino) that a blanket tie-flip would have broken.

getDayLabel previously dropped every commemoration whenever the day's
winner was a plain saint, and dropped every non-headline active octave
even when an octave itself won -- both fixed. Rank is now shown after
the day's own winner's name (previously not shown anywhere in the UI).

Also authored assumption-octave-day-3.yml, a real content gap (Aug 17,
day 3 of her octave) surfaced while fixing the above.
This commit is contained in:
2026-08-18 06:11:37 -04:00
parent ee3e155bfa
commit 1fc4bd7160
7 changed files with 224 additions and 64 deletions
+6 -1
View File
@@ -27,6 +27,11 @@ export interface ActiveOctave {
wins: FeastClass;
/** 1 on the feast's own day, counting up from there. */
dayNumber: number;
/** Whether `dayNumber` is this octave's own final ("in Octava") day —
* i.e. whether `wins` above came from `closingDayRank` rather than the
* ordinary `wins` config. Used by calendar/index.ts's applyOctaves to
* decide which side a *tied* rank favors — see its own doc comment. */
isClosingDay: boolean;
}
const DEFAULT_DAYS = 8;
@@ -58,7 +63,7 @@ function considerCandidate(
const dayNumber = offset + 1;
const isClosingDay = dayNumber === days;
const wins = isClosingDay ? (octave.closingDayRank ?? DEFAULT_CLOSING_DAY_RANK) : (octave.wins ?? DEFAULT_WINS);
active.push({ id, name, wins, dayNumber });
active.push({ id, name, wins, dayNumber, isClosingDay });
}
/** Every octave (sanctoral or temporal) whose window covers `isoDate`,