Model Trinity Sunday as a real feast, not just a cosmetic label

Trinity Sunday wasn't modeled at all: getDayLabel had a purely
cosmetic "Trinity Sunday" label overlay for the Sunday after
Pentecost, but resolveTemporalId just fell back to post-pentecost-01
(ordinary-sunday category), so any Duplex+ saint assigned that date
(e.g. the Queenship of the BVM, fixed May 31) won outright, real
Trinity Sunday content never appearing anywhere.

Added a real temporal-feasts/trinity-sunday.yml record (Easter+56,
Duplex II. classis, live-verified). Per direct instruction,
unconditional: true (same shape as christ-the-king.yml) -- a
principal Sunday shouldn't lose a same-rank fixed-date collision, and
the one real collision case (Queenship of the BVM) isn't
independently verifiable against Monastic 1617 at all (that calendar
doesn't carry the Queenship feast -- May 31 there is St. Petronilla
instead).

Authored the full office and registered trinity-sunday in
ALWAYS_OVERRIDE_TEMPORAL_IDS -- the same generic mechanism already
built for the Pentecost-cluster fix, no new code needed: collect,
Benedictus/Magnificat antiphons, Matins hymn ("Summæ Deus cleméntiæ"),
Lauds/Vespers chapter (shared, Rom 11:33) and hymn (shared, "O lux
beáta Trínitas", already the pre-Urban VIII text), each hour's own
distinct responsory/versicle -- all live-verified 2026-05-31.

Fixed 3 pre-existing tests written around the old cosmetic-label
behavior, two of which had never-verified guesses baked in as if
correct: day-label.test.ts's "names the anchor day itself" test and
its "outranks an active octave" test (was asserting "Duplex I Class",
a guess -- the real live-verified rank is Duplex II);
transfer.test.ts's St. Felix I test.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AGjUyhUZJaSjiniEmnLdak
This commit is contained in:
2026-09-04 14:50:31 -04:00
parent 2a611cc17b
commit aba89dc250
15 changed files with 387 additions and 32 deletions
+11 -13
View File
@@ -88,22 +88,20 @@ describe('transfer mechanism (resolveDay integration)', () => {
// Felix doesn't reach Trinity Sunday at all now. Trinity Sunday 2026
// (May 31) is also the Queenship of the Blessed Virgin Mary's own
// fixed day (Duplex II Classis) -- since this app models Trinitytide
// Sundays as plain `ordinary-sunday` (no special first-class standing
// of their own, see temporal-categories.yml), a Duplex+ sanctoral
// feast wins outright here per the normal ordinary-Sunday rule, with
// both the day's own temporal id and Pentecost's octave commemorated
// in return.
expect(sunday.winner).toEqual({
kind: 'sanctoral',
id: 'queenship-of-the-bvm',
name: 'The Queenship of the Blessed Virgin Mary',
nameLa: 'Beata Maria Virgo Regina',
rank: 'duplex-2-classis',
});
// fixed day (Duplex II Classis). Trinity Sunday used to be modeled as
// plain `ordinary-sunday` (no special first-class standing of its
// own), so the Duplex+ Queenship won outright there -- fixed
// 2026-09-04 with a real `trinity-sunday` temporal-feast record,
// `unconditional: true` (a principal Sunday shouldn't lose to a
// same-rank fixed-date collision, same shape as christ-the-king.yml).
// Trinity Sunday now wins outright; the Queenship, the day's own
// plain temporal id, and Pentecost's octave are all commemorated in
// return.
expect(sunday.winner).toEqual({ kind: 'temporal', id: 'trinity-sunday' });
expect(sunday.commemorations).toEqual([
{ kind: 'temporal', id: 'post-pentecost-01' },
{ kind: 'octave', id: 'pentecost-sunday', name: 'Pentecost', nameLa: 'Dominica Pentecostes' },
{ kind: 'sanctoral', id: 'queenship-of-the-bvm', name: 'The Queenship of the Blessed Virgin Mary', nameLa: 'Beata Maria Virgo Regina', rank: 'duplex-2-classis' },
]);
});
});