Compare commits

..

2 Commits

Author SHA1 Message Date
will 88074cdfe6 propers: add April's collect text
Deploy / deploy (push) Successful in 41s
Real collect text for all 8 April saints that have one — same extraction
method as prior months. One correction to St. Robert's own English
translation in the source, which left his name in Latin genitive form
("blessed Robérti") rather than translating it — fixed, flagged in the
file as a transcription artifact, not a deliberate style choice.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:14:12 -04:00
will 1b3d236ef3 calendar: pull April's sanctoral calendar (pre-1955 pull, 4/12)
12 saints for April (11 real + St. Catherine of Siena as a stub), all
winning outright on a clean per-annum date.

Two real methodological findings this month:
- St. Mark (Apr 25, Duplex II. classis) directly confirms the
  privileged-feria-major behavior from the previous fix: he only ever
  gets commemorated within the Easter Octave, never wins there.
- St. Robert/St. Catherine of Siena (Apr 29) is a genuine, year-stable
  monastic-calendar reassignment — this app's own base Latin source data
  files that date's Roman-calendar content under a different saint (Peter
  Martyr) entirely, which a naive raw-file lookup by MM-DD would have
  missed; the live per-date query resolved it correctly regardless, and
  is what these records are actually built from. Worth remembering for
  future months.

New common category: common-of-an-evangelist (St. Mark, an Evangelist
but not an Apostle).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:14:04 -04:00
22 changed files with 346 additions and 0 deletions
@@ -0,0 +1,8 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2042-04-26, no Sunday collision) -- winner outright, Semiduplex.
# No unique Oratio/Antiphon -- Common of Several Martyrs only.
id: ss-cletus-and-marcellinus
name: "Ss. Cletus and Marcellinus, Popes and Martyrs"
rank: semiduplex
common: common-of-several-martyrs
propers: null
@@ -0,0 +1,11 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2042-04-22, no Sunday collision) -- winner outright, Semiduplex.
# The source shows an alternate [Officium] block tagged "(rubrica 196)"
# -- a later rubric renumbering, not this app's target era, so the
# untagged/default block is used, same convention as every other saint in
# this set. No unique Oratio/Antiphon -- Common of Several Martyrs only.
id: ss-soter-and-caius
name: "Ss. Soter and Caius, Popes and Martyrs"
rank: semiduplex
common: common-of-several-martyrs
propers: null
@@ -0,0 +1,9 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2043-04-14, a year St. Francis of Paola doesn't transfer here) --
# winner outright, Simplex. Own proper collect, no unique antiphon of
# their own.
id: ss-tiburtius-valerian-and-maximus
name: "Ss. Tiburtius, Valerian, and Maximus, Martyrs"
rank: simplex
common: common-of-several-martyrs
propers: "ss-tiburtius-valerian-and-maximus"
+8
View File
@@ -0,0 +1,8 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2042-04-17, no Sunday collision) -- winner outright, Simplex. No
# unique Oratio/Antiphon in the source -- Common of a Martyr Bishop only.
id: st-anicetus
name: "St. Anicetus, Pope and Martyr"
rank: simplex
common: common-of-a-martyr-bishop
propers: null
@@ -0,0 +1,13 @@
# Secondary commemoration on 04-29 (loses the day to St. Robert, Abbot --
# see st-robert.yml's note on this being a fixed monastic-calendar
# reassignment, confirmed stable across two different years). Her real
# historical/Roman-calendar date is Apr 30, but in this monastic calendar
# specifically she sits on Apr 29 as Robert's secondary instead. No live
# query exposes a secondary entry's own rank -- simplex here is an
# unverified placeholder, same caveat as every other stub in this set.
# No text pulled at all yet.
id: st-catherine-of-siena
name: "St. Catherine of Siena, Virgin"
rank: simplex
common: common-of-a-virgin
propers: null
@@ -0,0 +1,11 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2042-04-14) -- his native date is Apr 2, but Holy Week blocked him
# that year and he transferred here instead, winning outright against
# Ss. Tiburtius/Valerian/Maximus (his own file's own real content, so still
# reliably read even though the date isn't his usual one) -- Duplex. Own
# proper collect, no unique antiphon of his own.
id: st-francis-of-paola
name: "St. Francis of Paola, Confessor"
rank: duplex
common: common-of-a-confessor
propers: "st-francis-of-paola"
+8
View File
@@ -0,0 +1,8 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2042-04-23, no Sunday collision) -- winner outright, Semiduplex.
# Own proper collect, no unique antiphon of his own.
id: st-george
name: "St. George, Martyr"
rank: semiduplex
common: common-of-a-martyr
propers: "st-george"
+12
View File
@@ -0,0 +1,12 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2043-04-11, clear of the Easter Octave that usually overshadows
# this date, and not a Sunday) -- winner outright, Duplex. Own proper
# collect (marked in the source as used "nisi communi Summorum
# Pontificum" -- unless the Common of Popes formula applies instead; used
# here regardless, matching how every other saint's own proper collect in
# this set is preferred over a Common). No unique antiphon of his own.
id: st-leo-i
name: "St. Leo I, Pope, Confessor and Doctor of the Church"
rank: duplex
common: common-of-a-confessor-bishop
propers: "st-leo-i"
+13
View File
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2042-04-25, no Sunday collision) -- winner outright, Duplex II.
# classis. When this date falls within the Easter Octave instead (see
# calendar/temporal-categories.yml's privileged-feria-major note), he's
# merely commemorated, never wins -- the case that helped verify the
# privileged-feria/privileged-feria-major split. Own proper collect, no
# unique antiphon of his own. An Evangelist but not an Apostle, so a new
# category: "common-of-an-evangelist".
id: st-mark
name: "St. Mark, Evangelist"
rank: duplex-2-classis
common: common-of-an-evangelist
propers: "st-mark"
@@ -0,0 +1,11 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2042-04-30) -- winner outright, Semiduplex. St. Peter of Verona,
# not the Apostle. Own proper collect, no unique antiphon of his own. See
# st-robert.yml's note: this app's base Latin source data files this
# saint's content under 04-29.txt (his Roman-calendar date), even though
# he lands on Apr 30 in this monastic calendar specifically.
id: st-peter-martyr
name: "St. Peter Martyr, Martyr"
rank: semiduplex
common: common-of-a-martyr
propers: "st-peter-martyr"
+17
View File
@@ -0,0 +1,17 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2029-04-29 and again 2043-04-29, confirming this is a fixed
# monastic-calendar reassignment, not year-dependent like St. Francis of
# Paola's transfer) -- winner outright, Duplex, over St. Catherine of
# Siena (see st-catherine-of-siena.yml). Own proper collect, no unique
# antiphon of his own. Genuine methodological note: this app's base Latin
# source data files the Roman-calendar content for this date (04-29.txt)
# under St. Peter Martyr instead -- Robert's own real content lives
# somewhere the monastic-specific delta correctly resolves to, which the
# live-engine query reaches even though a naive raw-file lookup by MM-DD
# wouldn't have. Worth remembering if a future month's raw-file check
# ever seems to contradict what a live query actually shows.
id: st-robert
name: "St. Robert, Abbot"
rank: duplex
common: common-of-an-abbot
propers: "st-robert"
+8
View File
@@ -0,0 +1,8 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), live kalendar
# check (2042-04-28, no Sunday collision) -- winner outright, Simplex. Own
# proper collect, no unique antiphon of his own.
id: st-vitalis
name: "St. Vitalis, Martyr"
rank: simplex
common: common-of-a-martyr
propers: "st-vitalis"
+16
View File
@@ -67,6 +67,22 @@ days:
"03-12": [st-gregory-the-great]
"03-19": [st-joseph]
"03-21": [st-benedict]
# April — 4/12 of the pre-1955 pull. St. Robert/St. Catherine of Siena
# (Apr 29) is a genuine monastic-calendar reassignment, not a mistake —
# see st-robert.yml. St. Francis of Paola's native date (Apr 2) often
# transfers due to Holy Week; that's the existing transfer machinery,
# not something recorded specially here.
"04-02": [st-francis-of-paola]
"04-11": [st-leo-i]
"04-14": [ss-tiburtius-valerian-and-maximus]
"04-17": [st-anicetus]
"04-22": [ss-soter-and-caius]
"04-23": [st-george]
"04-25": [st-mark]
"04-26": [ss-cletus-and-marcellinus]
"04-28": [st-vitalis]
"04-29": [st-robert, st-catherine-of-siena]
"04-30": [st-peter-martyr]
"08-09": [vigil-of-st-lawrence]
"08-10": [st-lawrence]
"08-15": [assumption]
@@ -0,0 +1,18 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2043-04-14).
# Same convention as data/propers/temporal/*-collect.yml.
id: ss-tiburtius-valerian-and-maximus-collect
text:
la: |
Orémus.
Præsta, quǽsumus, omnípotens Deus: ut, qui sanctórum Mártyrum tuórum Tibúrtii, Valeriáni et Máximi sollémnia cólimus; eórum étiam virtútes imité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.
Almighty God, for Whom holy Tiburtius, Valerian, and Maximus uplifted their testimony, grant, we beseech Thee, unto all whosoever call the same to solemn memory, grace to imitate the example of their godly courage.
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,18 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2042-04-14 (his true date, Apr 2, was blocked by Holy Week that year, so he transferred here)).
# Same convention as data/propers/temporal/*-collect.yml.
id: st-francis-of-paola-collect
text:
la: |
Orémus.
Deus, humílium celsitúdo, qui beátum Francíscum Confessórem Sanctórum tuórum glória sublimásti: tríbue, quǽsumus; ut, ejus méritis et imitatióne, promíssa humílibus prǽmia felíciter consequá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.
O God, Who exaltest the meek, and hast raised up thy Blessed Confessor Francis even unto the glory of thy Saints, grant unto us, we beseech thee, for his sake, so to walk after him in lowliness of heart, that in the end we may attain, as he hath, to that great reward which Thou hast promised unto all such as be so minded.
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,18 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2042-04-23).
# Same convention as data/propers/temporal/*-collect.yml.
id: st-george-collect
text:
la: |
Orémus.
Deus, qui nos beáti Geórgii Mártyris tui méritis et intercessióne lætíficas: concéde propítius; ut, qui tua per eum benefícia póscimus, dono tuæ grátiæ consequá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.
O God, Who dost gladden us through the worthy deeds and prayers of thy blessed martyr George, mercifully grant that all they which seek thy mercy through him may effectually obtain the gift of thy grace.
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,18 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2043-04-11).
# Same convention as data/propers/temporal/*-collect.yml.
id: st-leo-i-collect
text:
la: |
Orémus.
Exáudi, quǽsumus, Dómine, preces nostras, quas in beáti Leónis Confessóris tui atque Pontíficis solemnitáte deférimus: et, qui tibi digne méruit famulári, ejus intercedéntibus méritis, ab ómnibus nos absólve peccátis.
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.
Hear, O Lord, we beseech thee, the prayers which we offer thee on this the solemn feast-day of thy blessed Confessor and bishop Leo, and, for the sake of him who so nobly served thee, forgive us our trespasses.
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,18 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2042-04-25).
# Same convention as data/propers/temporal/*-collect.yml.
id: st-mark-collect
text:
la: |
Orémus.
Deus, qui beátum Marcum Evangelístam tuum evangélicæ prædicatiónis grátia sublimásti: tríbue, quǽsumus; ejus nos semper et eruditióne profícere et oratióne deféndi.
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 didst exalt thy blessed Evangelist Mark, by giving him grace to preach thine Evangel, grant unto us, we beseech thee, ever to follow more and more what he teacheth, and ever to be shielded from all evil by his prayers.
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,18 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2042-04-30).
# Same convention as data/propers/temporal/*-collect.yml.
id: st-peter-martyr-collect
text:
la: |
Orémus.
Præsta, quǽsumus, omnípotens Deus: ut beáti Petri Mártyris tui fidem cóngrua devotióne sectémur; qui, pro ejúsdem fídei dilatatióne, martýrii palmam méruit obtinére.
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 us grace, we beseech thee, O Almighty God, to follow with zeal conformable thereto after the pattern of that great example of faith, thy blessed Martyr Peter, who, for the spreading of the same faith, did so run as to obtain the palm of martyrdom.
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,23 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2043-04-29).
# Same convention as data/propers/temporal/*-collect.yml. One correction
# to the source's own English translation: it left his name in the Latin
# genitive ("blessed Robérti") rather than translating it — fixed to
# "Robert" here as an evident transcription artifact, not a deliberate
# stylistic choice (unlike the archaic English kept verbatim elsewhere in
# this project).
id: st-robert-collect
text:
la: |
Orémus.
Intercéssio nos, quǽsumus, Dómine, beáti Robérti Abbátis comméndet: ut, quod nostris méritis non valémus, ejus patrocínio assequá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.
May the pleading of blessed Robert, the Abbot, make us acceptable unto thee, O Lord, we pray; that what we may not have through any merits of ours, we may gain by means of his patronage.
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,18 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617) — read
# directly from the reference engine's own real-date output (2042-04-28).
# Same convention as data/propers/temporal/*-collect.yml.
id: st-vitalis-collect
text:
la: |
Orémus.
Præsta, quǽsumus, omnípotens Deus: ut, qui beáti Vitális Mártyris tui natalítia cólimus, intercessióne ejus in tui nóminis amóre roboré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, almighty God, that we who celebrate the martyrdom of blessed Vitalis, through his intercession be strengthened in your love.
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
+52
View File
@@ -0,0 +1,52 @@
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, and clear of
// the movable Holy Week/Easter Octave that usually overshadows several of
// them) — see data/calendar/saints/*.yml for per-saint source detail.
describe('April sanctoral pull (first pass)', () => {
it('St. Mark wins outright with a real proper collect on an ordinary date', () => {
const day = resolveDay('2042-04-25');
expect(day.winner).toEqual({
kind: 'sanctoral',
id: 'st-mark',
name: 'St. Mark, Evangelist',
rank: 'duplex-2-classis',
});
expect(getDayCollect(day).status.en).toBe('verified');
});
it('St. Mark is only ever commemorated, never wins, within the Easter Octave', () => {
const day = resolveDay('2030-04-25');
expect(day.winner.kind).toBe('temporal');
expect(day.commemorations).toEqual([
{ kind: 'sanctoral', id: 'st-mark', name: 'St. Mark, Evangelist', rank: 'duplex-2-classis' },
]);
});
it('St. Robert beats St. Catherine of Siena on their shared monastic-calendar date', () => {
const day = resolveDay('2043-04-29');
expect(day.winner).toEqual({ kind: 'sanctoral', id: 'st-robert', name: 'St. Robert, Abbot', rank: 'duplex' });
expect(day.commemorations).toEqual([
{ kind: 'sanctoral', id: 'st-catherine-of-siena', name: 'St. Catherine of Siena, Virgin', rank: 'simplex' },
]);
});
it('a privileged Eastertide Sunday bumps even St. Robert (plain Duplex, not Duplex majus) to transfer forward', () => {
// 2029: Apr 29 is a privileged Sunday in Eastertide, so Robert can't
// win or be commemorated there — he transfers to Monday and wins the
// collision against St. Peter Martyr instead.
const sunday = resolveDay('2029-04-29');
expect(sunday.winner).toEqual({ kind: 'temporal', id: 'easter-5' });
expect(sunday.commemorations).toEqual([
{ kind: 'sanctoral', id: 'st-catherine-of-siena', name: 'St. Catherine of Siena, Virgin', rank: 'simplex' },
]);
const monday = resolveDay('2029-04-30');
expect(monday.winner).toEqual({ kind: 'sanctoral', id: 'st-robert', name: 'St. Robert, Abbot', rank: 'duplex' });
expect(monday.commemorations).toEqual([
{ kind: 'sanctoral', id: 'st-peter-martyr', name: 'St. Peter Martyr, Martyr', rank: 'semiduplex' },
]);
});
});