Fix Vespers commemoration: a Simplex successor is commemorated too
Deploy / deploy (push) Successful in 1m18s

User-reported: 2026-08-24 Vespers (St. Bartholomew, Duplex II. classis,
keeps his own evening) should have commemorated 2026-08-25's St. Louis
(Simplex), but didn't. This was the exact untested asymmetry the old
commemorationOf's own doc comment flagged as "inferred by symmetry, not
independently live-verified." Live-verifying now shows the two
directions genuinely differ: a Simplex predecessor losing to tomorrow's
First Vespers is correctly excluded (Aug 7 Donatus case, "nihil de
præcedenti"), but a Simplex successor displaced because today keeps its
own Vespers IS still commemorated (Aug 24->25, "commemoratio de
sequenti").

Split the one shared commemorationOf into
commemorationOfDisplacedPredecessor (keeps the Simplex exclusion) and
commemorationOfDisplacedSuccessor (drops it).

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 08:57:03 -04:00
parent b7036edb35
commit dde539d2e4
3 changed files with 75 additions and 32 deletions
+19 -5
View File
@@ -40,11 +40,11 @@ describe('resolveEveningDay', () => {
}
});
// The three cases below are live-verified against the real Monastic
// Tridentinum 1617 engine (see commemorationOf's own doc comment in
// calendar/vespers.ts) — "commemoratio de præcedenti/sequenti" vs.
// "nihil de præcedenti" in the raw output, not just inferred from the
// daytime rule.
// The cases below are live-verified against the real Monastic
// Tridentinum 1617 engine (see commemorationOfDisplacedPredecessor/
// -Successor's own doc comments in calendar/vespers.ts) —
// "commemoratio de præcedenti/sequenti" vs. "nihil de præcedenti" in
// the raw output, not just inferred from the daytime rule.
it('a Semiduplex loser is still commemorated when tomorrow claims First Vespers', () => {
// Aug 8, 2026 (Ss. Cyriacus/Largus/Smaragdus, Semiduplex) loses the
// evening to Aug 9 (Sunday); still commemorated.
@@ -72,4 +72,18 @@ describe('resolveEveningDay', () => {
expect(day.date).toBe('2026-07-25');
expect(day.commemorations).toContainEqual(expect.objectContaining({ kind: 'sanctoral', id: 'st-anne' }));
});
it('a winning day still commemorates a Simplex loser on the other side (asymmetric with the reverse direction)', () => {
// Aug 24, 2026 (St. Bartholomew, Duplex II. classis) keeps its own
// Second Vespers outright, but still commemorates Aug 25 (St. Louis,
// Simplex) -- live-verified "commemoratio de sequenti," unlike the
// reverse direction (a Simplex predecessor losing to tomorrow's First
// Vespers, see the Donatus case above) where Simplex IS excluded.
// Reported by the user 2026-08-26; previously both directions shared
// one Simplex-excluding commemorationOf, inferred symmetric but never
// independently verified for this direction.
const day = resolveEveningDay('2026-08-24');
expect(day.date).toBe('2026-08-24');
expect(day.commemorations).toContainEqual(expect.objectContaining({ kind: 'sanctoral', id: 'st-louis' }));
});
});