Fix Ascensiontide Sunday precedence and give it its own Matins proper
Deploy / deploy (push) Successful in 1m27s
Deploy / deploy (push) Successful in 1m27s
The Sunday within the Octave of Ascension was letting a Duplex saint win outright (ascensiontide's Sunday was miscategorized ordinary-sunday instead of privileged-sunday, the only "great octave" season not already so classed). Live-verified the reference engine keeps the Sunday primary and transfers the saint instead. Fixed the category, then authored the Sunday's own wholly proper Matins (a different psalm scheme entirely, not a seasonal overlay) via a new per-temporalId override layer. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017XMSokiTD2Qc5vPP2YQu3Q
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { resolveOrdo } from '../../src/hours';
|
||||
import { getPsalmsFor } from '../../src/psalter/distribution';
|
||||
import { resolveDay } from '../../src/calendar';
|
||||
|
||||
// Two clean proof dates, one per branch — see hours/matins.ts's own header
|
||||
// and TODO.md for why this is a mechanism build with a small content slice,
|
||||
@@ -318,6 +319,45 @@ describe('resolveOrdo("matins", ...) Paschaltide Sunday Nocturns I-III seasonal
|
||||
});
|
||||
});
|
||||
|
||||
// Real bug (found 2026-09-01, same day the user flagged it): the Sunday
|
||||
// within the Octave of Ascension was letting a Duplex sanctoral candidate
|
||||
// (St. Paschal Baylon, real May 17) win outright, because
|
||||
// data/calendar/temporal-categories.yml had ascensiontide's Sunday coded
|
||||
// `ordinary-sunday` (Duplex+ wins outright) instead of `privileged-sunday`
|
||||
// (nothing wins outright). Live-verified (2026-05-17): the reference
|
||||
// engine titles this day "Dominica infra Octavam Ascensionis ~ Semiduplex
|
||||
// Dominica minor" and gives it its own wholly proper Matins (own psalms —
|
||||
// Ps 8/10/18/20/23/29 for Nocturn I, not the fixed 20-25 — own antiphons,
|
||||
// same 3 canticles as the ordinary-Paschaltide override) with no trace of
|
||||
// the saint, who transfers instead.
|
||||
describe('resolveOrdo("matins", ...) Sunday within the Octave of Ascension (2026-09-01 fix)', () => {
|
||||
it("the Sunday wins outright over St. Paschal Baylon (Duplex), who transfers", () => {
|
||||
const day = resolveDay('2026-05-17');
|
||||
expect(day.winner).toEqual({ kind: 'temporal', id: 'sunday-after-ascension' });
|
||||
});
|
||||
|
||||
it('renders its own genuinely proper Matins, not the fixed 12-psalm scheme', () => {
|
||||
const ordo = resolveOrdo('matins', '2026-05-17');
|
||||
const psalms = ordo.parts.filter((p) => p.kind === 'psalm').map((p) => (p as { psalmNumber: number }).psalmNumber);
|
||||
expect(psalms).toEqual([3, 94, 8, 10, 18, 20, 23, 29, 45, 46, 95, 96, 98, 102]);
|
||||
|
||||
const canticles = ordo.parts.filter((p) => p.kind === 'canticle') as { canticleId: string }[];
|
||||
expect(canticles.map((c) => c.canticleId)).toEqual(['isa-63-1-5', 'osee-6-1-6', 'soph-3-8-13']);
|
||||
|
||||
const antiphons = ordo.parts.filter((p) => p.kind === 'antiphon') as { text: { text: Record<string, string> } }[];
|
||||
expect(antiphons[1]?.text.text.la).toBe('Ant. Eleváta est magnificéntia tua super cælos, Deus, allelúja.');
|
||||
expect(antiphons.at(-1)?.text.text.la).toBe(
|
||||
'Ant. Illi autem profécti prædicavérunt ubíque, Dómino cooperánte, et sermónem confirmánte sequéntibus signis, † allelúja, allelúja.',
|
||||
);
|
||||
|
||||
const versicles = ordo.parts.filter((p) => p.kind === 'versicle') as { text: { text: Record<string, string> } }[];
|
||||
const [, nocturn1, nocturn2, nocturn3] = versicles;
|
||||
expect(nocturn1?.text.text.la).toBe('V. Ascéndit Deus in jubilatióne, allelúja.\nR. Et Dóminus in voce tubæ, allelúja.');
|
||||
expect(nocturn2?.text.text.la).toBe('V. Ascéndens Christus in altum, allelúja.\nR. Captívam duxit captivitátem, allelúja.');
|
||||
expect(nocturn3?.text.text.la).toBe('V. Ascéndo ad Patrem meum, et Patrem vestrum, allelúja.\nR. Deum meum, et Deum vestrum, allelúja.');
|
||||
});
|
||||
});
|
||||
|
||||
describe('resolveOrdo("matins", ...) Duplex+ weekday-feast (3-nocturn, non-Sunday) branch', () => {
|
||||
// 2026-08-17 -- St. Lawrence's own octave closing day ("In Octava S.
|
||||
// Laurentii Martyris ~ Duplex"), live-verified directly against the
|
||||
|
||||
Reference in New Issue
Block a user