diff --git a/src/data/hours/matins-psalmody-overrides/categories/common-of-a-confessor.yml b/src/data/hours/matins-psalmody-overrides/categories/common-of-a-confessor.yml index 872ffc7..bb81993 100644 --- a/src/data/hours/matins-psalmody-overrides/categories/common-of-a-confessor.yml +++ b/src/data/hours/matins-psalmody-overrides/categories/common-of-a-confessor.yml @@ -16,7 +16,19 @@ # redirect) because the versicles are a real, if small, difference — # `common-of-a-confessor-bishop.yml` is its own full file, duplicating # these same psalm/antiphon groups with its own versicles. +# +# `aliases` also registers `common-of-an-abbot` and +# `common-of-a-confessor-not-bishop` under this same scheme (2026-08), +# live-verified as a genuine full redirect (psalms, antiphons, AND +# versicles all byte-identical, unlike the Bishop case above): St. Maurus +# (2026-01-15, Duplex II. classis) and St. Gall (2026-10-16, Duplex) for +# Abbot; St. Francis of Assisi (2026-10-04, Duplex) and St. Jerome +# (2026-09-30, Duplex) for Confessor-non-Bishop — all four reproduce this +# file's content exactly, confirming vu's own separately-named ids +# collapse to one Matins scheme in the reference engine (Reference votive +# numbers C5/C5b both point here per `horas.dialog`'s `[votives]` index). id: common-of-a-confessor +aliases: [common-of-an-abbot, common-of-a-confessor-not-bishop] nocturn1: groups: - psalms: [1] diff --git a/src/data/hours/matins-psalmody-overrides/categories/common-of-an-apostle.yml b/src/data/hours/matins-psalmody-overrides/categories/common-of-an-apostle.yml index 2c99aa3..7d9e4f2 100644 --- a/src/data/hours/matins-psalmody-overrides/categories/common-of-an-apostle.yml +++ b/src/data/hours/matins-psalmody-overrides/categories/common-of-an-apostle.yml @@ -10,7 +10,15 @@ # pattern already established for Common-of-a-Martyr (see that category # file's own doc comment). # +# `aliases` also registers `common-of-apostles` (plural, vu's separate id +# for feasts of two-or-more Apostles together) under this same scheme +# (2026-08) — live-verified against the Octave of Ss. Peter and Paul +# (2026-07-06, Duplex): psalms, antiphons, and versicles all +# byte-identical to this file, a genuine full redirect (reference votive +# number C1 covers both per `horas.dialog`'s `[votives]` index, which +# doesn't distinguish singular from plural Apostle commons). id: common-of-an-apostle +aliases: [common-of-apostles] nocturn1: groups: - psalms: [18] diff --git a/tests/hours/matins.test.ts b/tests/hours/matins.test.ts index 1352fb5..a69e458 100644 --- a/tests/hours/matins.test.ts +++ b/tests/hours/matins.test.ts @@ -330,16 +330,19 @@ describe('resolveOrdo("matins", ...) Duplex+ weekday-feast (3-nocturn, non-Sunda }); it('falls all the way back to the plain ferial weekday table, redistributed into 3 nocturns, when neither a proper nor a Common entry is authored', () => { - // St. Anthony, Abbot (Duplex, Common of an Abbot -- no - // matins-psalmody-overrides category authored yet for either tier) - // -- 2029-01-17, a Wednesday, confirmed clean (no Sunday collision). - const fallback = resolveOrdo('matins', '2029-01-17'); + // St. Monica, Widow (Duplex, Common of a Widow -- no + // matins-psalmody-overrides category authored yet for either tier; + // Common-of-an-Abbot no longer qualifies for this proof as of + // 2026-08-27, now aliased to Common-of-a-Confessor) -- 2029-05-04, a + // Friday, confirmed clean (no Sunday collision, per her own + // saint-file comment). + const fallback = resolveOrdo('matins', '2029-05-04'); const psalms = fallback.parts.filter((p) => p.kind === 'psalm').map((p) => (p as { psalmNumber: number }).psalmNumber); - // Ps 3 + 94, then Wednesday's own 9-psalm ferial table - // (psalter-distribution.yml), not any Common-of-an-Abbot scheme. + // Ps 3 + 94, then Friday's own 9-psalm ferial table + // (psalter-distribution.yml), not any Common-of-a-Widow scheme. expect(psalms[0]).toBe(3); expect(psalms[1]).toBe(94); - expect(psalms.slice(2)).toEqual(getPsalmsFor('matins', 'wednesday').map((r) => r.number)); + expect(psalms.slice(2)).toEqual(getPsalmsFor('matins', 'friday').map((r) => r.number)); expect(fallback.parts.some((p) => p.kind === 'te-deum')).toBe(true); expect(fallback.parts.some((p) => p.kind === 'canticle')).toBe(false); });