Compare commits

..

2 Commits

Author SHA1 Message Date
will cb60039ab2 Fix Sept sanctoral test for Raymond's new semiduplex rank
Deploy / deploy (push) Successful in 1m28s
Raymond's rank deflation (a1ed3d2) changes cascading behavior in years
where Aug 31 is a Sunday: he now loses to the Sunday outright (needs
duplex+ to win, per Divino Afflatu's ordinary-sunday threshold) and
transfers forward onto Sept 1, winning the collision there over St.
Giles. Move the original clean-year Giles test to 2026 and add a new
test documenting the 2025 transfer/collision case explicitly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013g7AsSvMD9oazR17f3BxLz
2026-08-31 08:23:08 -04:00
will a1ed3d2f9c Deflate St. Raymond Nonnatus's rank to semiduplex
Canonized 1657, well past the ~1600 late-canonization threshold; per
project policy his source Duplex rank gets deflated one tier, same
treatment already applied to St. Rose of Lima.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013g7AsSvMD9oazR17f3BxLz
2026-08-31 08:23:02 -04:00
2 changed files with 34 additions and 3 deletions
@@ -5,10 +5,19 @@
# to the plain Common of a Confessor. No Lectio7-9 in his own file # to the plain Common of a Confessor. No Lectio7-9 in his own file
# (only an `[Evangelium]` cross-reference to `@Commune/C5`) -- defers # (only an `[Evangelium]` cross-reference to `@Commune/C5`) -- defers
# to the Common's own Nocturn 3, not transcribed here. # to the Common's own Nocturn 3, not transcribed here.
#
# Rank deliberately deflated one tier from the source (Duplex ->
# semiduplex): canonized 1657 (Alexander VII), so per project policy a
# saint whose own canonization postdates ~1600 gets one tier off the
# nominal source rank, since "new canonization -> automatic Duplex"
# was the papacy's default practice by then and the raw grade no
# longer tracks real devotional weight the way it does for older
# saints (see vu/CLAUDE.md's "Not a reconstruction" section; same
# treatment already applied to St. Rose of Lima, Aug 30).
id: st-raymond-nonnatus id: st-raymond-nonnatus
name: "St. Raymond Nonnatus, Confessor" name: "St. Raymond Nonnatus, Confessor"
nameLa: "Sanctus Raymundus Nonnatus, Confessor" nameLa: "Sanctus Raymundus Nonnatus, Confessor"
rank: duplex rank: semiduplex
common: common-of-a-confessor common: common-of-a-confessor
propers: "st-raymond-nonnatus" propers: "st-raymond-nonnatus"
benedictusCommon: common-of-a-confessor benedictusCommon: common-of-a-confessor
+24 -2
View File
@@ -3,16 +3,38 @@ import { resolveDay } from '../../src/calendar';
import { getDayCollect } from '../../src/hours/resolve-common'; import { getDayCollect } from '../../src/hours/resolve-common';
// Clean per-annum years for these dates (no Sunday collision) — see // Clean per-annum years for these dates (no Sunday collision) — see
// data/calendar/saints/*.yml for per-saint source detail. // data/calendar/saints/*.yml for per-saint source detail. Exception:
// the Sept 1 collision test deliberately uses 2025 *because* Aug 31
// falls on Sunday that year — see its own comment.
describe('September sanctoral pull (first pass)', () => { describe('September sanctoral pull (first pass)', () => {
it('St. Giles wins outright at Simplex over a genuinely unwinnable stub', () => { it('St. Giles wins outright at Simplex over a genuinely unwinnable stub', () => {
const day = resolveDay('2025-09-01'); // 2025-09-01 no longer qualifies as a clean year for this: Aug 31,
// 2025 is a Sunday, and St. Raymond Nonnatus (semiduplex as of the
// rank-deflation fix) loses outright to an ordinary Sunday and
// transfers forward onto Sept 1, winning there instead of Giles
// (semiduplex > simplex) -- see the collision test below.
const day = resolveDay('2026-09-01');
expect(day.winner).toEqual({ kind: 'sanctoral', id: 'st-giles', name: 'St. Giles, Abbot', nameLa: 'Sanctus Ægidius, Abbas', rank: 'simplex' }); expect(day.winner).toEqual({ kind: 'sanctoral', id: 'st-giles', name: 'St. Giles, Abbot', nameLa: 'Sanctus Ægidius, Abbas', rank: 'simplex' });
expect(day.commemorations).toEqual([ expect(day.commemorations).toEqual([
{ kind: 'sanctoral', id: 'ss-twelve-brothers', name: 'Ss. Twelve Brothers, Martyrs', nameLa: 'Duodecim Fratres, Martyres', rank: 'simplex' }, { kind: 'sanctoral', id: 'ss-twelve-brothers', name: 'Ss. Twelve Brothers, Martyrs', nameLa: 'Duodecim Fratres, Martyres', rank: 'simplex' },
]); ]);
}); });
it('in a year where Aug 31 falls on Sunday, St. Raymond Nonnatus (semiduplex) loses outright to the Sunday, transfers forward onto Sept 1, and wins the collision there over both native Simplex candidates', () => {
const day = resolveDay('2025-09-01');
expect(day.winner).toEqual({
kind: 'sanctoral',
id: 'st-raymond-nonnatus',
name: 'St. Raymond Nonnatus, Confessor',
nameLa: 'Sanctus Raymundus Nonnatus, Confessor',
rank: 'semiduplex',
});
expect(day.commemorations).toEqual([
{ kind: 'sanctoral', id: 'ss-twelve-brothers', name: 'Ss. Twelve Brothers, Martyrs', nameLa: 'Duodecim Fratres, Martyres', rank: 'simplex' },
{ kind: 'sanctoral', id: 'st-giles', name: 'St. Giles, Abbot', nameLa: 'Sanctus Ægidius, Abbas', rank: 'simplex' },
]);
});
it('the Nativity of the BVM wins outright with a real proper collect and antiphon, commemorating a real secondary saint blocked by its own day (not its octave)', () => { it('the Nativity of the BVM wins outright with a real proper collect and antiphon, commemorating a real secondary saint blocked by its own day (not its octave)', () => {
const day = resolveDay('2025-09-08'); const day = resolveDay('2025-09-08');
expect(day.winner).toEqual({ expect(day.winner).toEqual({