Revert ordinary-Sunday Semiduplex to transferring, per direct instruction
Deploy / deploy (push) Successful in 1m9s

Keeps Simplex commemorating in place, but a Semiduplex feast on an
ordinary Sunday goes back to transferring off to the next open day —
this app's own design choice, not a correction against a reference
engine. The transfer mechanism is already generic: this file's `decideOccurrence`
only signals "couldn't hold onto this candidate" for the day itself;
calendar/index.ts's resolveDay is what independently checks each
neighboring day's own native occurrence for an incoming transfer and
claims it — no separate lookback logic needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 11:56:15 -04:00
parent 79372fb274
commit 01667e7926
6 changed files with 71 additions and 85 deletions
+8 -8
View File
@@ -122,16 +122,16 @@ describe('decideOccurrence — ordinary-sunday', () => {
expect(result.transfer).toBeUndefined();
});
it('semiduplex stays and is commemorated, not transferred', () => {
// Live-verified (both Tridentine 1906 and Divino Afflatu 1954): St.
// Gregory Thaumaturgus (Semiduplex) lands on the 6th Sunday after
// Epiphany and is commemorated right there, not pushed to the next
// open day — same treatment as Simplex above, not a separate
// "too important to merely commemorate" tier.
it('semiduplex gets nothing here — transfers forward', () => {
// Per direct instruction: a Semiduplex feast on an ordinary Sunday is
// pushed off to the next open day (typically the Monday right after)
// rather than merely commemorated — see decideOccurrence's own
// `ordinary-sunday` case for the two-part transfer mechanism this
// signal feeds into.
const result = decideOccurrence('ordinary-sunday', 'post-epiphany-2', saint('semiduplex'));
expect(result.winner).toEqual({ kind: 'temporal', id: 'post-epiphany-2' });
expect(result.commemorations).toEqual([{ kind: 'sanctoral', id: 'x', name: 'St. Ereden', rank: 'semiduplex' }]);
expect(result.transfer).toBeUndefined();
expect(result.commemorations).toEqual([]);
expect(result.transfer).toEqual({ candidate: saint('semiduplex'), direction: 'forward' });
});
it('vigil gets nothing here — transfers backward', () => {