Compare commits

...

2 Commits

Author SHA1 Message Date
will 3376036779 propers: add September's collect and antiphon text
Deploy / deploy (push) Successful in 43s
6 collects, 1 antiphon -- including backfilling the pre-existing Nativity
of the BVM entry now that the pulling methodology exists.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 21:20:44 -04:00
will f71b5380b1 calendar: pull September's sanctoral calendar (pre-1955 pull, 9/12)
14 saints (12 real winners + 2 stubs), plus a propers-slug update for the
pre-existing Nativity of the BVM entry. Two monastic-calendar-specific
finds: St. Nicholas of Tolentino (Sep 10) overrides what the base
Tridentine table treats as a plain Nativity-octave continuation, and St.
Januarius (Sep 19) is a monastic-only addition absent from the base table
entirely. Also flags (not yet acted on) that the pre-existing Sep 29 St.
Michael mapping doesn't appear to hold in this pull's actual target
track -- see the sanctoral-calendar.yml comment for detail.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 21:20:37 -04:00
24 changed files with 389 additions and 3 deletions
+5 -2
View File
@@ -1,7 +1,10 @@
# Verified against Divinum Officium (web/www/horas/Latin/Sancti/09-08.txt, # Verified against Divinum Officium (web/www/horas/Latin/Sancti/09-08.txt,
# untagged/default [Rank] block). # untagged/default [Rank] block). Propers backfilled during the September
# pull (live kalendar/prayTertia check, 2025-09-08) now that the
# collect-pulling methodology exists -- own proper collect and antiphon;
# wins outright over the stub St. Hadrian (see st-hadrian.yml).
id: nativity-bvm id: nativity-bvm
name: "The Nativity of the Blessed Virgin Mary" name: "The Nativity of the Blessed Virgin Mary"
rank: duplex-2-classis rank: duplex-2-classis
common: common-of-the-bvm common: common-of-the-bvm
propers: null propers: "nativity-bvm"
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
# kalendar check (2025-09-16, 2026-09-16) -- winner outright, Semiduplex,
# over the stub Ss. Euphemia, Lucy, and Geminianus (see
# ss-euphemia-lucia-and-geminianus.yml). In years where Sep 16 itself
# falls on the movable September Ember Wednesday, that Ember day is
# commemorated instead of Euphemia et al. (confirmed 2026) -- doesn't
# change this saint's own outright win either way. No unique collect: the
# raw file at this MM-DD slot (Sancti/09-16.txt) is empty.
id: ss-cornelius-and-cyprian
name: "Ss. Cornelius, Pope, and Cyprian, Bishop, Martyrs"
rank: semiduplex
common: common-of-several-martyrs
propers: null
@@ -0,0 +1,8 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
# kalendar check (2025-09-27) -- winner outright, Semiduplex, alone. Own
# proper collect, no unique antiphon of their own.
id: ss-cosmas-and-damian
name: "Ss. Cosmas and Damian, Martyrs"
rank: semiduplex
common: common-of-several-martyrs
propers: "ss-cosmas-and-damian"
@@ -0,0 +1,11 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
# kalendar check (2025-09-26) -- winner outright, Simplex, alone. Own
# proper collect, no unique antiphon of their own. A different St.
# Cyprian than the Sep 16 St. Cornelius's companion (see
# ss-cornelius-and-cyprian.yml) -- this Cyprian is paired with St.
# Justina instead, a distinct legend.
id: ss-cyprian-and-justina
name: "Ss. Cyprian and Justina, Martyrs"
rank: simplex
common: common-of-several-martyrs
propers: "ss-cyprian-and-justina"
@@ -0,0 +1,15 @@
# Genuinely unwinnable stub (verified 2025-09-16, a non-Ember year) --
# always commemorated under Ss. Cornelius and Cyprian (see
# ss-cornelius-and-cyprian.yml), never wins outright; both are fixed,
# non-movable dates, so this isn't an artifact of the tested year. In
# years where Sep 16 lands on the movable September Ember Wednesday
# instead (confirmed 2026), this saint doesn't even surface as a
# commemoration at all -- the Ember day takes that slot -- but that's a
# separate, already-modeled temporal interaction (privileged-feria),
# not a change to this saint's own standing. rank/propers unverified
# placeholders.
id: ss-euphemia-lucia-and-geminianus
name: "Ss. Euphemia, Lucy, and Geminianus, Martyrs"
rank: simplex
common: common-of-several-martyrs
propers: null
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
# kalendar check (2025-09-22) -- winner outright, Simplex, alone. No
# unique collect: the raw file at this MM-DD slot (Sancti/09-22.txt) is
# actually St. Thomas of Villanova's, a Bishop (a later, post-1617
# addition to this filename slot, canonized 1658) -- a live prayTertia
# query for the Monastic 1617 track returns no Oratio at all, confirming
# propers: null is correct, same file-naming caution as several of
# August's entries.
id: ss-maurice-and-companions
name: "Ss. Maurice and Companions, Martyrs"
rank: simplex
common: common-of-several-martyrs
propers: null
@@ -0,0 +1,9 @@
# Genuinely unwinnable stub (verified 2025-09-01, 2026-09-01) -- always
# commemorated under St. Giles (see st-giles.yml), never wins outright;
# both are fixed, non-movable dates, so this isn't an artifact of the
# tested year. rank/propers unverified placeholders.
id: ss-twelve-brothers
name: "Ss. Twelve Brothers, Martyrs"
rank: simplex
common: common-of-several-martyrs
propers: null
+10
View File
@@ -0,0 +1,10 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
# kalendar check (2025-09-01, 2026-09-01) -- winner outright, Simplex,
# over the stub Ss. Twelve Brothers (see ss-twelve-brothers.yml). No
# unique collect: the raw file at this MM-DD slot (Sancti/09-01.txt) is
# empty.
id: st-giles
name: "St. Giles, Abbot"
rank: simplex
common: common-of-an-abbot
propers: null
+14
View File
@@ -0,0 +1,14 @@
# Genuinely unwinnable stub (verified 2025-09-08, 2026-09-08) -- always
# commemorated under the Nativity of the BVM (see nativity-bvm.yml),
# never wins outright; both are fixed, non-movable dates, so this isn't
# an artifact of the tested year. Unlike this month's several Nativity-
# octave secondary saints (excluded entirely -- see the sanctoral-
# calendar.yml comment on this month's octave-gap exclusions), this one
# IS representable: the Nativity's own day (Sep 8) is already a normal
# mapped sanctoral entry, so the collision engine resolves it correctly
# without needing octave support. rank/propers unverified placeholders.
id: st-hadrian
name: "St. Hadrian, Martyr"
rank: simplex
common: common-of-a-martyr
propers: null
+11
View File
@@ -0,0 +1,11 @@
# A monastic-calendar-specific addition: not present in the base Tridentine
# table (1570.txt), added by the monastic-specific delta table
# (M1617.txt). Verified live (Monastic Tridentinum 1617, 2025-09-19) --
# winner outright, Semiduplex, alone (the only other candidate that day is
# a September Ember Friday feria, not another saint). No unique collect:
# the raw file at this MM-DD slot (Sancti/09-19.txt) is empty.
id: st-januarius
name: "St. Januarius, Bishop, and Companions, Martyrs"
rank: semiduplex
common: common-of-a-martyr-bishop
propers: null
+8
View File
@@ -0,0 +1,8 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
# kalendar check (2025-09-30) -- winner outright, Duplex, alone. Own
# proper collect, no unique antiphon of his own.
id: st-jerome
name: "St. Jerome, Priest, Confessor and Doctor of the Church"
rank: duplex
common: common-of-a-confessor-not-bishop
propers: "st-jerome"
+9
View File
@@ -0,0 +1,9 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
# kalendar check (2025-09-23, 2026-09-23) -- winner outright, Semiduplex,
# over the stub St. Thecla (see st-thecla.yml). No unique collect: the
# raw file at this MM-DD slot (Sancti/09-23.txt) is empty.
id: st-linus
name: "St. Linus, Pope and Martyr"
rank: semiduplex
common: common-of-a-martyr-bishop
propers: null
+8
View File
@@ -0,0 +1,8 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
# kalendar check (2026-09-21) -- winner outright, Duplex II. classis,
# alone. Own proper collect, no unique antiphon of his own.
id: st-matthew
name: "St. Matthew, Apostle and Evangelist"
rank: duplex-2-classis
common: common-of-an-apostle
propers: "st-matthew"
@@ -0,0 +1,15 @@
# A monastic-calendar-specific reassignment, not a mistake: the base
# Tridentine table (1570.txt) has Sep 10 as a plain continuation of the
# Nativity of the BVM's octave, but the monastic-specific delta table
# (M1617.txt) overrides that day entirely with this saint -- confirmed
# live (Monastic Tridentinum 1617, 2025-09-10), winning outright at
# Semiduplex, alone (the octave continuation is demoted to a mere
# commemoration, itself not independently named so not modeled). Same
# class of finding as April's St. Robert/St. Catherine reassignment. No
# unique collect: the raw file at this MM-DD slot (Sancti/09-10.txt) is
# empty.
id: st-nicholas-of-tolentino
name: "St. Nicholas of Tolentino, Confessor"
rank: semiduplex
common: common-of-a-confessor-not-bishop
propers: null
+9
View File
@@ -0,0 +1,9 @@
# Genuinely unwinnable stub (verified 2025-09-23, 2026-09-23) -- always
# commemorated under St. Linus (see st-linus.yml), never wins outright;
# both are fixed, non-movable dates, so this isn't an artifact of the
# tested year. rank/propers unverified placeholders.
id: st-thecla
name: "St. Thecla, Virgin and Martyr"
rank: simplex
common: common-of-a-virgin-martyr
propers: null
@@ -0,0 +1,17 @@
# A real vigil. Sep 20 sometimes coincides with the movable September
# Ember Saturday (privileged-feria, already modeled -- which specific
# week in September Ember falls in shifts year to year, confirmed by
# comparing 2025, where Sep 20 IS Ember Saturday, against 2026, where
# Sep 20 is an ordinary Sunday instead). In the *real* engine, on an
# Ember-Saturday year this vigil is commemorated Mass-only rather than
# fully displaced (2025-09-20, live check) -- this app doesn't model that
# Office-vs-Mass distinction anywhere, so here it simply transfers per the
# ordinary privileged-feria/vigil rule instead, a known, already-accepted
# simplification (not specific to this saint) rather than a guess. No
# unique collect: the raw file at this MM-DD slot (Sancti/09-20.txt) is
# empty.
id: vigil-of-st-matthew
name: "Vigil of St. Matthew"
rank: vigil
common: common-of-a-vigil
propers: null
+39 -1
View File
@@ -191,7 +191,45 @@ days:
"08-28": [st-augustine, st-hermes] "08-28": [st-augustine, st-hermes]
"08-29": [decollation-of-st-john-baptist, st-sabina] "08-29": [decollation-of-st-john-baptist, st-sabina]
"08-30": [ss-felix-and-adauctus] "08-30": [ss-felix-and-adauctus]
"09-08": [nativity-bvm] # September — 9/12 of the pre-1955 pull. Same octave-gap exclusions as
# August, this time around the Nativity of the BVM's own Sep 8-15
# octave: Ss. Gorgonius (Sep 9), Proti and Hyacinthus (Sep 11), and
# Nicomedes (Sep 15, the octave's own final day) are real named
# secondaries excluded for the same reason St. Clare was in August.
# St. Hadrian (Sep 8) is the one exception -- he's blocked by the
# Nativity's own day, not its octave, and that day IS already a mapped
# sanctoral entry, so the ordinary collision engine handles him
# correctly. The Exaltation of the Holy Cross (Sep 14) is excluded as a
# fixed feast of the Lord, same convention as the Finding of the Holy
# Cross. St. Nicholas of Tolentino (Sep 10) and St. Januarius (Sep 19)
# are both monastic-calendar-specific: the former overrides what the
# base Tridentine table treats as a plain Nativity-octave continuation,
# the latter is added outright, present in neither the base table nor
# (for Nicholas) its own octave slot.
#
# FLAGGED FOR REVIEW: the pre-existing "09-29": [st-michael] mapping
# below (added before this pull initiative, sourced from the raw
# Sancti/09-29.txt file directly rather than a live query) does not
# appear to hold in this pull's actual target track -- a live kalendar
# check across 6 different years (2025-2030) shows nothing at all on
# Sep 29 in "Monastic Tridentinum 1617" (not even a commemoration),
# and that file's own [Rank] block has no untagged/default entry for
# this date, only rubric-tagged alternates (tridentina, cisterciensis).
# The already-correctly-pulled May 8 Apparition of St. Michael (see
# apparition-of-st-michael.yml) may be this tradition's only real
# Michaelmas. Left as-is pending a decision -- see this month's summary.
"09-01": [st-giles, ss-twelve-brothers]
"09-08": [nativity-bvm, st-hadrian]
"09-10": [st-nicholas-of-tolentino]
"09-16": [ss-cornelius-and-cyprian, ss-euphemia-lucia-and-geminianus]
"09-19": [st-januarius]
"09-20": [vigil-of-st-matthew]
"09-21": [st-matthew]
"09-22": [ss-maurice-and-companions]
"09-23": [st-linus, st-thecla]
"09-26": [ss-cyprian-and-justina]
"09-27": [ss-cosmas-and-damian]
"09-29": [st-michael] "09-29": [st-michael]
"09-30": [st-jerome]
"11-01": [all-saints] "11-01": [all-saints]
"12-08": [immaculate-conception] "12-08": [immaculate-conception]
@@ -0,0 +1,12 @@
# Verified against Divinum Officium (Latin/English Sancti/09-08.txt's own
# [Ant 1] — the Lauds-hour antiphon, not Terce's. That file's own
# "(rubrica cisterciensis)" alternate is a different text entirely; the
# plain default is used here for consistency with every other saint file
# in this set.
id: nativity-bvm-antiphon
text:
la: "Gloriósæ * Vírginis Maríæ ortum digníssimum recolámus, quæ et Genitrícis dignitátem obtínuit, et virginálem pudicítiam non amísit."
en: "Let us tell again * of the right worthy Birth of the glorious Virgin Mary, who gained the honour of Motherhood without losing the guilelessness of a Maid."
status:
la: verified
en: verified
@@ -0,0 +1,17 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2025-09-08).
id: nativity-bvm-collect
text:
la: |
Orémus.
Fámulis tuis, quǽsumus, Dómine, cæléstis grátiæ munus impertíre: ut, quibus beátæ Vírginis partus éxstitit salútis exórdium; Nativitátis ejus votíva solémnitas pacis tríbuat increméntum.
Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum.
℟. Amen.
en: |
Let us pray.
Grant unto us thy servants, we beseech thee, O Lord, the gift of thy heavenly grace, unto whom Thou didst give the first sight of a Saviour as the offspring of a Blessed Virgin, and grant that this Feast, which they keep in honour of the same Virgin, may avail them unto the increase of peace.
Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end.
℟. Amen.
status:
la: verified
en: verified
@@ -0,0 +1,17 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2025-09-27).
id: ss-cosmas-and-damian-collect
text:
la: |
Orémus.
Præsta, quǽsumus, omnípotens Deus: ut, qui sanctórum Mártyrum tuórum Cosmæ et Damiáni natalícia cólimus, a cunctis malis imminéntibus, eórum intercessiónibus, liberémur.
Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum.
℟. Amen.
en: |
Let us pray.
Grant, we beseech thee, O Almighty God, that we who keep the birthday of thine holy Martyrs Cosmas and Damian may at their prayers be delivered from all dangers that presently hang over us.
Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end.
℟. Amen.
status:
la: verified
en: verified
@@ -0,0 +1,17 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2025-09-26).
id: ss-cyprian-and-justina-collect
text:
la: |
Orémus.
Beatórum Mártyrum Cypriáni et Justínæ nos, Dómine, fóveant continuáta præsídia: quia non désinis propítius intuéri, quos tálibus auxíliis concésseris adjuvári.
Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum.
℟. Amen.
en: |
Let us pray.
Lord, let the succour of thy blessed martyrs Cyprian and Justina never fail us, since Thou never ceasest to look in mercy upon any unto whom Thou dost grant the stay of such helpers.
Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end.
℟. Amen.
status:
la: verified
en: verified
@@ -0,0 +1,17 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2025-09-30).
id: st-jerome-collect
text:
la: |
Orémus.
Deus, qui Ecclésiæ tuæ in exponéndis sacris Scriptúris beátum Hierónymum, Confessórem tuum, Doctórem máximum providére dignátus es: præsta, quǽsumus; ut, ejus suffragántibus méritis, quod ore simul et ópere dócuit, te adjuvánte, exercére valeámus.
Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum.
℟. Amen.
en: |
Let us pray.
O God, Who wast pleased to give unto thy Church thy blessed Confessor Jerome to be unto her a great teacher in the way of expounding thine Holy Scriptures, be entreated, we beseech thee, for that thy servant's sake, and grant unto us the strength to put in practice what he taught both by his doctrine and by his life.
Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end.
℟. Amen.
status:
la: verified
en: verified
@@ -0,0 +1,17 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2026-09-21).
id: st-matthew-collect
text:
la: |
Orémus.
Beáti Apóstoli et Evangelístæ Matthǽi, Dómine, précibus adjuvémur: ut, quod possibílitas nostra non óbtinet, ejus nobis intercessióne donétur.
Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum.
℟. Amen.
en: |
Let us pray.
Help us, O Lord, by the prayers of thine holy Apostle and Evangelist Matthew, that what for ourselves we are not able to obtain, may be freely given us at his petition.
Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end.
℟. Amen.
status:
la: verified
en: verified
@@ -0,0 +1,78 @@
import { describe, expect, it } from 'vitest';
import { resolveDay } from '../../src/calendar';
import { getDayCollect } from '../../src/hours/resolve-common';
// Clean per-annum years for these dates (no Sunday collision) — see
// data/calendar/saints/*.yml for per-saint source detail.
describe('September sanctoral pull (first pass)', () => {
it('St. Giles wins outright at Simplex over a genuinely unwinnable stub', () => {
const day = resolveDay('2025-09-01');
expect(day.winner).toEqual({ kind: 'sanctoral', id: 'st-giles', name: 'St. Giles, Abbot', rank: 'simplex' });
expect(day.commemorations).toEqual([
{ kind: 'sanctoral', id: 'ss-twelve-brothers', name: 'Ss. Twelve Brothers, Martyrs', 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)', () => {
const day = resolveDay('2025-09-08');
expect(day.winner).toEqual({
kind: 'sanctoral',
id: 'nativity-bvm',
name: 'The Nativity of the Blessed Virgin Mary',
rank: 'duplex-2-classis',
});
expect(day.commemorations).toEqual([
{ kind: 'sanctoral', id: 'st-hadrian', name: 'St. Hadrian, Martyr', rank: 'simplex' },
]);
expect(getDayCollect(day).status.en).toBe('verified');
});
it("dates within the Nativity's own octave are excluded entirely, even where the source names a real secondary saint, pending octave support", () => {
const gorgoniusDay = resolveDay('2025-09-09');
expect(gorgoniusDay.winner.kind).toBe('temporal');
expect(gorgoniusDay.commemorations).toEqual([]);
const nicomedesDay = resolveDay('2025-09-15');
expect(nicomedesDay.winner.kind).toBe('temporal');
expect(nicomedesDay.commemorations).toEqual([]);
});
it('a monastic-calendar-specific reassignment replaces what the base Tridentine table treats as a plain Nativity-octave continuation', () => {
const day = resolveDay('2025-09-10');
expect(day.winner).toEqual({
kind: 'sanctoral',
id: 'st-nicholas-of-tolentino',
name: 'St. Nicholas of Tolentino, Confessor',
rank: 'semiduplex',
});
});
it('St. Matthew wins outright at Duplex II. classis with a real proper collect, distinct from his own Vigil the day before', () => {
const vigil = resolveDay('2029-09-20');
const day = resolveDay('2029-09-21');
expect(vigil.winner).toEqual({
kind: 'sanctoral',
id: 'vigil-of-st-matthew',
name: 'Vigil of St. Matthew',
rank: 'vigil',
});
expect(day.winner).toEqual({
kind: 'sanctoral',
id: 'st-matthew',
name: 'St. Matthew, Apostle and Evangelist',
rank: 'duplex-2-classis',
});
expect(getDayCollect(day).status.en).toBe('verified');
});
it('St. Jerome wins outright at Duplex with a real proper collect, alone', () => {
const day = resolveDay('2025-09-30');
expect(day.winner).toEqual({
kind: 'sanctoral',
id: 'st-jerome',
name: 'St. Jerome, Priest, Confessor and Doctor of the Church',
rank: 'duplex',
});
expect(day.commemorations).toEqual([]);
expect(getDayCollect(day).status.en).toBe('verified');
});
});