Redesign the Easter-octave backlog: floor-gated, one per day
Deploy / deploy (push) Successful in 1m28s

Replaced the multi-day cascading queue with the actual intended design:
only candidates at or above duplex-majus are worth carrying out of the
Palm-Sunday-through-Low-Sunday span at all - below that, a candidate
simply lapses for the year. Of those that clear the floor, the Nth day
after Low Sunday celebrates the Nth one (native-date order), winning
outright with no rank fight, demoting whatever's natively there to a
commemoration - one per day, positional, not a free-day search.

Caught a real bug while re-verifying: the ordinary single-hop transfer
check was independently leaking Low Sunday's own signal into the next
day, letting a below-floor candidate bypass the new gate. Fixed by
excluding the whole span from that path.

Inventoried the only duplex-majus+ candidates that can ever fall in the
reachable window (St. Benedict, St. Gabriel the Archangel, the
Annunciation, St. Mark, Ss. Philip & James), then bumped St. Patrick's
own rank to duplex-majus by direct instruction, adding him as the 6th.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017XMSokiTD2Qc5vPP2YQu3Q
This commit is contained in:
2026-09-01 15:06:55 -04:00
parent fc4ac33903
commit 5b3dc2e9d5
6 changed files with 241 additions and 180 deletions
+42
View File
@@ -4796,3 +4796,45 @@ Mar 21; St. Gabriel the Archangel, Duplex majus, native Mar 24) are now also cor
the same span that year and queue ahead of her.
`npm test` (822 passed), `tsc --noEmit`, and `npm run build` all pass.
### Easter-octave backlog redesigned — one-per-day, floor-gated, no rank fight (2026-09-01)
Same day, a real design conversation rather than another live-verification pass: user rejected
the multi-day cascading queue built above ("that's not a plan... we cant do a batch
commemorations. we can do one a day."). New shape, per direct instruction:
- **Gate**: only candidates at or above `duplex-majus` are worth carrying out of the span at
all — below that, a candidate simply lapses for the year, no trace, same as it already gets
none *within* the span itself. (Confirmed as the right floor by inventorying every fixed-date
saint that could ever fall in the whole reachable window, March 15 - May 2: only 5 ever clear
it — St. Benedict, St. Gabriel the Archangel, the Annunciation, St. Mark, Ss. Philip & James
— everything else in that range is plain Duplex or below.)
- **Landing**: the Nth day after Low Sunday celebrates the Nth candidate that cleared the floor
that year, in native-date order — winning outright, no rank comparison against whatever would
natively be there, which is simply demoted to a commemoration. One candidate per day,
positional, not a search for the next free day.
Replaced `resolveForwardTransferLanding`'s generic multi-day queue with two pieces:
`easterOctaveBacklogFor(year)` (computes that year's whole backlog once, filtered to the floor)
and `applyEasterOctaveBacklog` (the Nth-day lookup), both in `calendar/index.ts`. The ordinary
single-hop yesterday/tomorrow transfer check (used everywhere else) is back to its original
form — the whole redesign is now a dedicated, narrowly-scoped mechanism (same architectural
pattern as `applyMarianSaturday`/`applyAdventFourVigilCommemoration`), not a generalized queue.
**Real bug caught while re-verifying**: the ordinary single-hop check was independently picking
up Low Sunday's own transfer signal and landing/commemorating a below-floor candidate (St.
Fidelis, plain Duplex) the very next day — bypassing the new floor entirely. Fixed by excluding
the whole Palm-Sunday-through-Low-Sunday span from that ordinary path (scoped by `easterOffsetOf`,
not by category, so it doesn't also swallow an unrelated privileged Sunday elsewhere in the year
like Advent II).
Rewrote the tests this broke to real, live-verified outcomes for the new shape (2033: nothing
that year clears the floor, so the whole backlog is empty and every impeded candidate lapses;
2035: three candidates clear it and land the 1st/2nd/3rd day after Low Sunday in order). Then,
having inventoried the 5 always-reachable duplex-majus+ candidates together, one more direct
instruction: St. Patrick's own rank is bumped from the source's plain Duplex to duplex-majus
(`data/calendar/saints/st-patrick.yml`) — a deliberate departure, not a transcription, same
category of move as this app's existing late-canonization rank-deflation convention, just in
the other direction — bringing his own count to 6.
`npm test` (821 passed), `tsc --noEmit`, and `npm run build` all pass.