Fix First Vespers rank threshold: any sanctoral winner qualifies
Deploy / deploy (push) Successful in 1m22s

hasFirstVespers() required Semiduplex-or-higher, so a bare Simplex
feast could never anticipate the evening before it. Live-verified
this was too strict: St. Zephyrinus (Aug 26, plain Simplex) claims
First Vespers over St. Louis (Aug 25, also Simplex) in the reference
engine -- "Vespera de sequenti; nihil de præcedenti." A Simplex feast
has no Second Vespers of its own, but it does still get First Vespers;
there's no rank floor at all, only keepsOwnSecondVespers' separate
question of whether the preceding day outranks the claim.

This also surfaces St. Zephyrinus's Magnificat antiphon, which now
actually gets used (St. Louis, previously shown by the old bug, is
permanently boxed out of ever governing real Vespers in this merged
calendar -- Bartholomew outranks him the evening before, Zephyrinus
the evening after, every year -- so his own Magnificat antiphon was
never authored). Added st-zephyrinus-magnificat-antiphon.yml, live-
verified bilingual text ("Iste Sanctus...").

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 06:45:31 -04:00
parent 5298cbe4a3
commit 7fb37f6237
2 changed files with 22 additions and 5 deletions
+10 -5
View File
@@ -40,11 +40,16 @@ function hasFirstVespers(day: LiturgicalDay): boolean {
}
// Live-verified (2026-08): Ss. Cyriacus/Largus/Smaragdus (Aug 8, plain
// Semiduplex) claims First Vespers over St. Donatus's Aug 7 — "Vespera
// de sequenti" in the real Monastic 1617 engine — so Semiduplex clears
// this bar, not duplex-majus as originally guessed (unverified at the
// time). Matches keepsOwnSecondVespers's own privileged-feria-minor
// threshold just below, which uses the same cutoff.
return day.winner.kind === 'sanctoral' && isAtLeast(day.winner.rank, 'semiduplex');
// de sequenti" in the real Monastic 1617 engine. Originally thought
// Semiduplex was the actual cutoff, but re-verified 2026-08-25: St.
// Zephyrinus (Aug 26, plain Simplex) likewise claims First Vespers over
// St. Louis's Aug 25 (also Simplex) — "Vespera de sequenti; nihil de
// præcedenti" — so *any* real sanctoral winner, however low-ranked,
// clears this bar; there's no rank floor at all, only the separate
// keepsOwnSecondVespers question of whether the day *before* it
// outranks the claim. Every FeastClass (including `vigil`, untested
// directly but the same "lowest tier" logic) now qualifies.
return day.winner.kind === 'sanctoral';
}
/** Does this day keep its own Second Vespers regardless of what tomorrow is? */