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
+20 -14
View File
@@ -159,22 +159,28 @@ export function decideOccurrence(
// Duplex+ wins outright; the Sunday itself is commemorated in return.
return { winner: sanctoralWinner(sanctoral), commemorations: [{ kind: 'temporal', id: temporalId }] };
}
if (sanctoral.rank !== 'vigil') {
// Semiduplex or Simplex: commemorated, not transferred — live-
// verified (both Tridentine 1906 and Divino Afflatu 1954, the two
// calendar tracks this app blends): St. Gregory Thaumaturgus
// (Semiduplex) lands on the 6th Sunday after Epiphany, 2024-11-17,
// and is commemorated right there ("Commemoratio: S. Gregorii
// Thaumaturgi..."), not pushed to the next open day. Corrects an
// earlier, unverified guess that Semiduplex was "too important to
// merely commemorate" — Monastic Tridentinum 1617's own structural
// rubric *does* transfer him, but precedence here follows Divino
// Afflatu, not Monastic 1617's own (see CLAUDE.md).
if (sanctoral.rank === 'simplex') {
// Too minor to warrant its own day, but a plain commemoration
// doesn't cheapen it the way it would a Semiduplex.
return { winner: temporalWinner, commemorations: [sanctoralCommemoration(sanctoral)] };
}
// A Vigil still transfers (backward, per transferDirectionOf) — a
// distinct rule from Semiduplex/Simplex above, not verified against
// this same live case and left as-is.
// Semiduplex or Vigil: no room here at all, in either direction
// per direct instruction, an ordinary Sunday's own standing pushes
// a Semiduplex feast off to the next open day (typically the
// Monday right after) rather than downgrading it to a bare
// commemoration. This `transfer` signal is only half of the
// mechanism: it's just this day noting "I couldn't hold onto this
// candidate." The other half — a later day actually claiming a
// transferred-in candidate — lives entirely in calendar/index.ts's
// resolveDay: for *every* date it resolves, it independently
// recomputes `resolveNativeOccurrence` for both the day before and
// the day after, checks whether *that* neighbor's own native
// occurrence produced a `transfer` pointed this direction, and only
// then folds it in via `applyIncomingTransfer`. So "Monday looks
// back at the sanctoral calendar to see if Sunday's own candidate
// needs a home" isn't a separate mechanism to build — it's the
// existing generic transfer-consumption check, which already runs
// for every day regardless of category.
return {
winner: temporalWinner,
commemorations: [],