Add 4 more fixed Lord's/BVM feasts, and fix Our Lady of the Snows' Nocturn 3
Deploy / deploy (push) Successful in 1m6s

Finding of the Holy Cross (May 3), the Transfiguration (Aug 6), the
Exaltation of the Holy Cross (Sep 14), and Dedication of the Basilica of
the Most Holy Savior (Nov 9, the Lateran) were all excluded under the
same stale "fixed feast of the Lord, not modeled" note that turned out
wrong for Our Lady of the Snows. All four have real, complete content in
the reference engine. Presentation of the BVM (Nov 21) was excluded
under the equivalent "fixed BVM feast" note and is added the same way.

- finding-of-the-holy-cross: fully proprium, own collect/antiphon/Matins
  throughout; now correctly outranks
  ss-alexander-eventius-theodulus-and-juvenal, matching what that
  saint's own file already documented as the live reality.
- transfiguration: same proprium shape. Its subordinate saints (Ss.
  Xystus/Felicissimus/Agapitus) stay excluded -- blocked by the real,
  separate octave/subordination-rendering gap, not by an unmodeled
  Transfiguration.
- exaltation-of-the-holy-cross: reuses the Finding of the Holy Cross's
  content wholesale (ex Sancti/05-03) -- collect/antiphon via a cross-id
  `propers` pointer, Matins nocturn-readings duplicated (no cross-id
  lookup exists for that mechanism).
- dedication-of-the-basilica-of-the-most-holy-savior: reuses the
  existing Common-of-a-Dedication (collect-c8, benedictus-antiphon-
  common-of-a-dedication), real unique Nocturn 2 vita of her own. Her
  secondary, St. Theodore, stays excluded for the same
  octave/subordination reason as above.
- presentation-of-the-bvm: real unique collect of her own; her
  Benedictus antiphon is a substituted Common reference
  (truncate-and-add-alleluia edit specific to this feast), authored as
  her own file.

Also: our-lady-of-the-snows.yml was missing its own Nocturn 3 (she
defers to Commune/C11's own Gospel-incipit-plus-Bede-homily, same as
Presentation of the BVM) -- added.

Test updates (not regressions): three tests had fixed proof dates
colliding with the newly-added feasts, updated to reflect the new,
correct behavior. npm test (365 tests) and tsc --noEmit both pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 14:48:50 -04:00
parent 42d0b21c2a
commit 80f4f935be
21 changed files with 1264 additions and 63 deletions
+18 -2
View File
@@ -50,7 +50,16 @@ describe('getDayLabel — resumed post-Epiphany Sunday (overflow years)', () =>
// Sundays) -- see calendar/temporal-id.test.ts for the id-level
// coverage this label check builds on.
expect(getDayLabel(resolveDay('2026-11-08'))).toBe('The 5th Sunday after Epiphany');
expect(getDayLabel(resolveDay('2026-11-09'))).toBe('Monday in the 5th week after Epiphany');
// 2026-11-09 is also the Dedication of the Basilica of the Most Holy
// Savior (Duplex II Classis, added 2026-08 — see
// dedication-of-the-basilica-of-the-most-holy-savior.yml) — an
// ordinary (non-privileged) Monday fully yields to a real winning
// saint, so the label is just her name, not the ferial fallback; the
// 11-16 assertion below covers that fallback format on a genuinely
// saint-free day instead.
expect(getDayLabel(resolveDay('2026-11-09'))).toBe(
'Dedication of the Basilica of the Most Holy Savior (the Lateran)',
);
expect(getDayLabel(resolveDay('2026-11-15'))).toBe('The 6th Sunday after Epiphany');
expect(getDayLabel(resolveDay('2026-11-16'))).toBe('Monday in the 6th week after Epiphany');
});
@@ -63,7 +72,14 @@ describe('getDayLabel — resumed post-Epiphany Sunday (overflow years)', () =>
// before Advent, so this ordinal is fixed, not overflow-year-specific
// -- confirmed against a non-overflow year (1943) too.
expect(getDayLabel(resolveDay('2026-11-22'))).toBe('The 23rd Sunday after Trinity');
expect(getDayLabel(resolveDay('1943-11-21'))).toBe('The 23rd Sunday after Trinity');
// 1943-11-21 is also the Presentation of the BVM (Duplex Majus, added
// 2026-08 — see presentation-of-the-bvm.yml), which meets this app's
// existing privileged-Sunday rank threshold (commemorations.ts's
// `privileged-sunday` case requires only duplex-majus+) and so wins
// outright rather than being commemorated — a pre-existing rule, not
// new behavior from adding her. 2026-11-22 above (no saint collision)
// still covers the fixed-ordinal label itself.
expect(getDayLabel(resolveDay('1943-11-21'))).toBe('The Presentation of the Blessed Virgin Mary');
});
});
+16 -9
View File
@@ -18,20 +18,27 @@ describe('May sanctoral pull (first pass)', () => {
expect(getDayCollect(day).status.en).toBe('verified');
});
it('two stubs are genuinely unwinnable in the real historical calendar, not just an artifact of the year checked', () => {
it('genuinely unwinnable stubs correctly lose to their real competitor, now that both are modeled', () => {
// Ss. Alexander/Eventius/Theodulus/Juvenal always lose to the Finding
// of the Holy Cross (May 3) in real practice — but that's a fixed
// feast of the Lord, which this app doesn't model at all (same known
// gap as Circumcision/Epiphany/Purification/Annunciation), so the stub
// wins by default here rather than being displaced the way it really
// would be.
// of the Holy Cross (May 3) in real practice — both are now modeled
// (see finding-of-the-holy-cross.yml), so the collision engine
// correctly demotes the stub to a commemoration instead of letting it
// win by default.
const may3 = resolveDay('2033-05-03');
expect(may3.winner).toEqual({
kind: 'sanctoral',
id: 'ss-alexander-eventius-theodulus-and-juvenal',
name: 'Ss. Alexander I, Eventius, and Theodulus, Martyrs, and Juvenal, Bishop and Confessor',
rank: 'simplex',
id: 'finding-of-the-holy-cross',
name: 'The Finding of the Holy Cross',
rank: 'duplex-2-classis',
});
expect(may3.commemorations).toEqual([
{
kind: 'sanctoral',
id: 'ss-alexander-eventius-theodulus-and-juvenal',
name: 'Ss. Alexander I, Eventius, and Theodulus, Martyrs, and Juvenal, Bishop and Confessor',
rank: 'simplex',
},
]);
// St. Pudentiana always loses to St. Peter Celestine (May 19, also fixed-date) —
// this one *is* modeled (both are real sanctoral records), so it