Give each day of Easter's octave its own real content
Deploy / deploy (push) Successful in 1m56s

Easter Monday-Saturday previously all inherited Easter Sunday's single
collect and single-nocturn Matins content via the shared `easter-sunday`
temporal id, even though the reference engine gives each of the six days
its own real proper (own title, rank, collect, Gospel+homily). Adds six
new temporal-feasts records (anchor `{kind: easter, offset: 1..6}`, same
mechanism as the Passiontide batch), six new collects transcribed from
each day's own Office Oratio, and six new nocturn-readings files with
each day's own Gospel pericope (from the Missal) and patristic homily.

Also fixes two mechanism gaps this surfaced: hours/matins.ts's 3-nocturn/
Sunday-style gate was keyed by `winner.id` (now per-weekday) instead of
`temporalId` (still shared for the whole octave, which is what actually
supplies the content); and the Wednesday-Saturday ferial antiphon
override was keyed by the old shared `easter-sunday` id.

Fact-checked two adjacent assumptions along the way: commemorations stay
fully suppressed Monday-Saturday (the user's own 2026-09-01 "no
commemoration from Palm Sunday through Low Sunday" instruction already
covers this span, unchanged), and the correct per-day names are "Die N
infra Octavam Paschæ" (Mon-Fri) / "Sabbato in Albis" (Sat only) rather
than a blanket "Hebdomada in Albis" for every day.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W8cttEhwbN3f6hiHQHqCae
This commit is contained in:
2026-09-06 08:38:49 -04:00
parent deebc51f81
commit 7482df1777
24 changed files with 1056 additions and 30 deletions
+13 -2
View File
@@ -34,8 +34,19 @@ describe('April sanctoral pull (first pass)', () => {
// candidate in 2030's own backlog, so he lands the 1st day after Low
// Sunday (Apr 28 that year) outright.
const native = resolveDay('2030-04-25');
expect(native.winner).toEqual({ kind: 'temporal', id: 'easter-sunday' });
expect(native.commemorations).toEqual([]);
// 2030-04-25 is Easter+4 (Thursday of Easter week); `winner.id` is
// this weekday's own real temporal-feasts id since 2026-09-06 (see
// calendar/temporal-feasts/easter-thursday.yml), not the shared
// `easter-sunday` governing-week id. The override mechanism pushes a
// `{kind:'temporal', id:'easter-sunday'}` commemoration for the coarse
// id it replaces, same shape every other movable feast (Ascension,
// Corpus Christi, the Passiontide days) already does; harmless, since
// day-label.ts's collectCommemorations deliberately drops any
// commemoration whose id equals the plain governing weekday (see
// tests/calendar/transfer.test.ts's own Holy Monday case for the same
// shape).
expect(native.winner).toEqual({ kind: 'temporal', id: 'easter-thursday' });
expect(native.commemorations).toEqual([{ kind: 'temporal', id: 'easter-sunday' }]);
expect(native.transferredAway?.candidate.id).toBe('st-mark');
const landing = resolveDay('2030-04-29');