Add the Patronage of St. Joseph as a new movable feast with octave
Deploy / deploy (push) Successful in 1m21s

This Duplex I classis feast (instituted by Pius IX, 1847) didn't exist
anywhere in vu's calendar. Dated per the older, pre-1955 reckoning --
Wednesday after the 2nd Sunday after Easter (Easter+17) -- rather than the
1913 Pius X reform's later placement on the 3rd Sunday after Easter
itself, per direct instruction. Mechanism: one new temporal-feast record
plus a new EASTER_OFFSET_STARTS table entry (the only code change --
everything else is the existing generic anchor-driven resolution).

Authored the feast day's own Matins reading and its full 7-day octave
(days 2/3/4/6/7/8; day 5, the Sunday, has no override in the source at
all, correctly left unauthored).

Fixed one real collateral effect: an existing fixed-year calendar test
(St. Pudentiana vs. St. Peter Celestine, 2038-05-19) broke because that
date now falls on this octave's own closing day, tying Celestine's rank
against the octave's threshold -- the app's own documented tie-break
correctly favors the octave that year. Moved the proof date to 2033.
Also bumped the PWA precache file-size cap (6 MiB -> 8 MiB) since this
content pull pushed the main bundle past the previous limit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PhysogLP9eCeKS7JEwRi6y
This commit is contained in:
2026-08-28 07:12:08 -04:00
parent 283bb356d7
commit c25505cdc0
12 changed files with 482 additions and 5 deletions
+9 -2
View File
@@ -42,8 +42,15 @@ describe('May sanctoral pull (first pass)', () => {
// St. Pudentiana always loses to St. Peter Celestine (May 19, also fixed-date) —
// this one *is* modeled (both are real sanctoral records), so it
// resolves correctly.
const may19 = resolveDay('2038-05-19');
// resolves correctly. 2033, not 2038: in 2038 May 19 falls on the
// closing day of the Patronage of St. Joseph's own movable octave
// (data/calendar/temporal-feasts/patronage-of-st-joseph.yml, added
// 2026-08-28), whose Duplex threshold ties Celestine's own rank — the
// app's own documented closing-day tie-break (calendar/index.ts's
// applyOctaves) then favors the octave, correctly displacing Celestine
// into a commemoration that year. Not a bug; just the wrong year to
// prove this particular tie-break with now that a real rival exists.
const may19 = resolveDay('2033-05-19');
expect(may19.winner).toEqual({
kind: 'sanctoral',
id: 'st-peter-celestine',