Author Ember days' own Benedictus/Magnificat antiphons

Live-verified (Monastic Tridentinum 1617) that an Ember day's Lauds
psalmody stays on the plain ferial default throughout -- only the
Benedictus antiphon (and, Wednesday/Friday only, the Magnificat
antiphon) is genuinely proper to the day. Adds the 6 Benedictus +
4 Magnificat antiphon files (Ember Saturday's Second Vespers is
always ceded to the following Sunday on both quarters, so no
Magnificat content exists to author there).

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 07:12:01 -04:00
parent bcbc93732f
commit 03d39dc911
12 changed files with 225 additions and 0 deletions
+36
View File
@@ -53,6 +53,42 @@ describe('Ember days', () => {
}
});
it("Lauds' Benedictus antiphon is the Ember day's own proper text on all 6 winning-outright days (2026-08-22 added the mechanism/collect/Matins, but not this -- fixed here)", () => {
// Wed/Fri/Sat winning outright for the September quarter, one per
// weekday (2026's own dates are all saint-outranked, see above) --
// found by scanning forward from 2023, all live-verified against the
// reference engine.
const cases: [string, string][] = [
['2023-09-20', 'Hoc genus'],
['2024-09-20', 'Múlier'],
['2025-09-20', 'Illumináre, Dómine'],
['2026-12-16', 'Missus est Gábriel'],
['2026-12-18', 'Ex quo facta est'],
['2026-12-19', 'Quómodo fiet istud'],
];
for (const [date, expectedStart] of cases) {
const ordo = resolveOrdo('lauds', date);
const idx = ordo.parts.findIndex((p) => p.kind === 'canticle' && p.canticleId === 'benedictus');
const antiphon = ordo.parts[idx + 1] as { text: { text: { la?: string }; status: { la?: string; en?: string } } };
expect(antiphon.text.status.la).toBe('verified');
expect(antiphon.text.status.en).toBe('verified');
expect(antiphon.text.text.la).toContain(expectedStart);
}
});
it("Vespers' Magnificat antiphon is proper on Ember Wednesday (Sept and Advent) where the reference engine actually renders it, not overridden by a Sunday/O-Antiphon", () => {
// September Ember Friday/Saturday and Advent Ember Friday/Saturday
// are excluded here: Saturday's Second Vespers is always ceded to the
// following Sunday (live-verified), and Advent Ember Friday/Saturday
// (always Dec 18/19) are always inside the O Antiphons' own
// unconditional Dec 17-23 window -- both real, not gaps.
const ordo = resolveOrdo('vespers', '2026-12-16');
const idx = ordo.parts.findIndex((p) => p.kind === 'canticle' && p.canticleId === 'magnificat');
const antiphon = ordo.parts[idx + 1] as { text: { status: { la?: string; en?: string } } };
expect(antiphon.text.status.la).toBe('verified');
expect(antiphon.text.status.en).toBe('verified');
});
it('Matins renders 3 real, distinct, verified lessons+responsories for each of the 6 Ember days', () => {
const dates = ['2026-09-16', '2026-09-18', '2026-09-19', '2026-12-16', '2026-12-18', '2026-12-19'];
for (const date of dates) {