Relocate Immaculate Heart of Mary off Aug 22 to Easter+69
Fixed Aug 22 collided outright with the Assumption's own octave-closing day (both this project's blended calendar tracks are kept deliberately, so one shouldn't permanently suppress the other). Moved IHM to the Saturday after the Feast of the Sacred Heart -- its real diocesan date from 1914 until Pius XII's 1944 fixed-date decree, and also the date the 1969 reform returned to. Required real new mechanism, not just a data move: a new bespoke calendar/index.ts override (applyImmaculateHeart, following the existing applyMarianSaturday/applyChristTheKing precedent), a move from the sanctoral saints store to the temporal-feasts store (different propers lookup entirely), and a real bug fix in matins.ts's nocturnReadingIds, which only ever picked up a *sanctoral* winner's own reading file. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VZSAgRi4QE4XRTqVto93zA
This commit is contained in:
@@ -91,18 +91,17 @@ describe('August sanctoral pull (first pass)', () => {
|
||||
// Aug 22 is the Assumption's own octave day (In Octava Assumptionis),
|
||||
// Duplex, blocking Ss. Timothy/Hippolytus/Symphorian the same way --
|
||||
// it's also day 8 of the Assumption's own octave. Those three still
|
||||
// aren't modeled -- but Aug 22 itself is also now the Immaculate
|
||||
// Heart of the Blessed Virgin Mary's own fixed day (Duplex II
|
||||
// Classis, added per the full-year sanctoral import), which wins
|
||||
// outright under the ordinary-feria rule, with the octave still
|
||||
// commemorated alongside her.
|
||||
// aren't modeled. The Immaculate Heart of the Blessed Virgin Mary used
|
||||
// to be fixed here too (Pius XII's 1944 decree), but was relocated
|
||||
// (2026-08-22 user decision, see TODO.md) to Easter+69 -- the
|
||||
// Saturday after the Feast of the Sacred Heart, its own real
|
||||
// historical date on both sides of that fixed-date interlude -- so it
|
||||
// no longer contests this date at all. With no sanctoral candidate
|
||||
// left here, the day's own temporal identity wins outright and the
|
||||
// octave is commemorated alongside it, same shape as St. Lawrence's
|
||||
// own Aug 12 case just above.
|
||||
const assumptionOctaveDay = resolveDay('2025-08-22');
|
||||
expect(assumptionOctaveDay.winner).toEqual({
|
||||
kind: 'sanctoral',
|
||||
id: 'immaculate-heart-of-mary',
|
||||
name: 'The Immaculate Heart of the Blessed Virgin Mary',
|
||||
rank: 'duplex-2-classis',
|
||||
});
|
||||
expect(assumptionOctaveDay.winner.kind).toBe('temporal');
|
||||
expect(assumptionOctaveDay.commemorations).toEqual([
|
||||
{ kind: 'octave', id: 'assumption', name: 'The Assumption of the Blessed Virgin Mary' },
|
||||
]);
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { resolveDay } from '../../src/calendar';
|
||||
import { getDayCollect, getBenedictusAntiphon, getMagnificatAntiphon } from '../../src/hours/resolve-common';
|
||||
|
||||
// Relocated off the fixed Aug 22 date (2026-08-22 user decision, see
|
||||
// TODO.md) -- that date collided outright with the Assumption's own
|
||||
// octave-closing day. Moved to Easter+69: the Saturday after the Feast of
|
||||
// the Sacred Heart (Easter+68, always a Friday), the feast's own real
|
||||
// diocesan date from 1914 until Pius XII's 1944 fixed-date decree, and
|
||||
// also the date the 1969 reform returned to.
|
||||
describe('Immaculate Heart of Mary (applyImmaculateHeart)', () => {
|
||||
it('wins outright on Easter+69, with real content resolved via the temporal propers store', () => {
|
||||
const day = resolveDay('2026-06-13'); // Easter 2026-04-05 + 69 days
|
||||
expect(day.winner).toEqual({ kind: 'temporal', id: 'immaculate-heart-of-mary' });
|
||||
expect(getDayCollect(day).status.en).toBe('verified');
|
||||
expect(getBenedictusAntiphon(day).status.en).toBe('verified');
|
||||
expect(getMagnificatAntiphon(day).status.en).toBe('verified');
|
||||
});
|
||||
|
||||
it('correctly finds Easter+69 in a different year (early Easter)', () => {
|
||||
const day = resolveDay('2027-06-05'); // Easter 2027-03-28 + 69 days
|
||||
expect(day.winner).toEqual({ kind: 'temporal', id: 'immaculate-heart-of-mary' });
|
||||
});
|
||||
|
||||
it('does not apply on the Saturday before or after', () => {
|
||||
const before = resolveDay('2026-06-06');
|
||||
const after = resolveDay('2026-06-20');
|
||||
expect(before.winner).not.toEqual({ kind: 'temporal', id: 'immaculate-heart-of-mary' });
|
||||
expect(after.winner).not.toEqual({ kind: 'temporal', id: 'immaculate-heart-of-mary' });
|
||||
});
|
||||
|
||||
it('no longer wins or appears anywhere on Aug 22, which reverts to the Assumption octave alone', () => {
|
||||
const day = resolveDay('2026-08-22');
|
||||
expect(day.winner).not.toEqual(expect.objectContaining({ id: 'immaculate-heart-of-mary' }));
|
||||
expect(day.commemorations).not.toContainEqual(expect.objectContaining({ id: 'immaculate-heart-of-mary' }));
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user