From 2785aa2a4e43b374fe59e7181192135a7c4bd828 Mon Sep 17 00:00:00 2001 From: Will Estes Date: Tue, 11 Aug 2026 06:34:37 -0400 Subject: [PATCH] calendar: pull December's sanctoral calendar (pre-1955 pull, 12/12 -- complete) 16 saints, plus a propers-slug update for the pre-existing Immaculate Conception entry. Also extends the Advent temporal-category fix (previous commit) to Christmastide: St. Thomas of Canterbury, only Semiduplex, wins outright within the Christmas Octave in the real Monastic 1617 engine, which the stronger privileged-feria tier would have wrongly forbidden -- Christmastide now shares Advent's privileged-feria-minor tier instead. Every real winner this month falls within one of these two newly-corrected seasons. This completes the first pass of the pre-1955 sanctoral calendar pull across all twelve months. Co-Authored-By: Claude Sonnet 5 --- src/data/calendar/saints/holy-innocents.yml | 11 +++++++ .../calendar/saints/immaculate-conception.yml | 6 ++-- src/data/calendar/saints/st-ambrose.yml | 12 +++++++ src/data/calendar/saints/st-barbara.yml | 13 ++++++++ src/data/calendar/saints/st-bibiana.yml | 11 +++++++ src/data/calendar/saints/st-damasus.yml | 11 +++++++ .../saints/st-eusebius-of-vercelli.yml | 16 ++++++++++ src/data/calendar/saints/st-john-apostle.yml | 9 ++++++ src/data/calendar/saints/st-lucy.yml | 12 +++++++ src/data/calendar/saints/st-melchiades.yml | 10 ++++++ src/data/calendar/saints/st-nicholas.yml | 12 +++++++ src/data/calendar/saints/st-sabbas.yml | 10 ++++++ src/data/calendar/saints/st-silvester-i.yml | 12 +++++++ .../saints/st-stephen-protomartyr.yml | 12 +++++++ .../calendar/saints/st-thomas-apostle.yml | 9 ++++++ src/data/calendar/saints/st-thomas-becket.yml | 13 ++++++++ .../calendar/saints/vigil-of-st-thomas.yml | 15 +++++++++ src/data/calendar/sanctoral-calendar.yml | 32 +++++++++++++++++++ src/data/calendar/temporal-categories.yml | 13 +++++--- 19 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 src/data/calendar/saints/holy-innocents.yml create mode 100644 src/data/calendar/saints/st-ambrose.yml create mode 100644 src/data/calendar/saints/st-barbara.yml create mode 100644 src/data/calendar/saints/st-bibiana.yml create mode 100644 src/data/calendar/saints/st-damasus.yml create mode 100644 src/data/calendar/saints/st-eusebius-of-vercelli.yml create mode 100644 src/data/calendar/saints/st-john-apostle.yml create mode 100644 src/data/calendar/saints/st-lucy.yml create mode 100644 src/data/calendar/saints/st-melchiades.yml create mode 100644 src/data/calendar/saints/st-nicholas.yml create mode 100644 src/data/calendar/saints/st-sabbas.yml create mode 100644 src/data/calendar/saints/st-silvester-i.yml create mode 100644 src/data/calendar/saints/st-stephen-protomartyr.yml create mode 100644 src/data/calendar/saints/st-thomas-apostle.yml create mode 100644 src/data/calendar/saints/st-thomas-becket.yml create mode 100644 src/data/calendar/saints/vigil-of-st-thomas.yml diff --git a/src/data/calendar/saints/holy-innocents.yml b/src/data/calendar/saints/holy-innocents.yml new file mode 100644 index 0000000..81bf371 --- /dev/null +++ b/src/data/calendar/saints/holy-innocents.yml @@ -0,0 +1,11 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2026-12-28) -- wins outright, Duplex II. classis, within +# Christmas's Octave (privileged-feria-minor), Octave day commemorated in +# return. About the Innocents slain at Christ's birth, not a feast of the +# Lord/BVM directly, so kept in scope like every other real saint's day +# this pull has found. Own proper collect and antiphon. +id: holy-innocents +name: "The Holy Innocents, Martyrs" +rank: duplex-2-classis +common: common-of-several-martyrs +propers: "holy-innocents" diff --git a/src/data/calendar/saints/immaculate-conception.yml b/src/data/calendar/saints/immaculate-conception.yml index 41a8a9c..07c7707 100644 --- a/src/data/calendar/saints/immaculate-conception.yml +++ b/src/data/calendar/saints/immaculate-conception.yml @@ -1,7 +1,9 @@ # Verified against Divinum Officium (web/www/horas/Latin/Sancti/12-08.txt, -# untagged/default [Rank] block). +# untagged/default [Rank] block). Propers backfilled during the December +# pull now that the collect-pulling methodology exists -- own proper +# collect and antiphon. id: immaculate-conception name: "The Immaculate Conception of the Blessed Virgin Mary" rank: duplex-1-classis common: common-of-the-bvm -propers: null +propers: "immaculate-conception" diff --git a/src/data/calendar/saints/st-ambrose.yml b/src/data/calendar/saints/st-ambrose.yml new file mode 100644 index 0000000..d5d9500 --- /dev/null +++ b/src/data/calendar/saints/st-ambrose.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2026-12-07) -- an ordinary Advent feria +# (privileged-feria-minor), Duplex easily wins outright, feria +# commemorated in return. No unique collect: the raw file's own [Rule] is +# a plain cross-reference to a generic Common formula ("vide C4a"), not +# unique text -- genuinely his own file, just entirely Common-based, not +# a naming mismatch this time. +id: st-ambrose +name: "St. Ambrose, Bishop, Confessor and Doctor of the Church" +rank: duplex +common: common-of-a-confessor-bishop +propers: null diff --git a/src/data/calendar/saints/st-barbara.yml b/src/data/calendar/saints/st-barbara.yml new file mode 100644 index 0000000..a7f22ad --- /dev/null +++ b/src/data/calendar/saints/st-barbara.yml @@ -0,0 +1,13 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-04) -- an ordinary Advent feria +# (privileged-feria-minor), so this Simplex saint is only ever +# commemorated here, the feria staying primary. No unique collect: the +# raw file at this MM-DD slot (Sancti/12-04.txt) is actually St. Peter +# Chrysologus's (a later Doctor-of-the-Church addition to this filename +# slot) -- a live prayTertia query for the Monastic 1617 track returns no +# Oratio at all, confirming propers: null is correct. +id: st-barbara +name: "St. Barbara, Virgin and Martyr" +rank: simplex +common: common-of-a-virgin-martyr +propers: null diff --git a/src/data/calendar/saints/st-bibiana.yml b/src/data/calendar/saints/st-bibiana.yml new file mode 100644 index 0000000..fdde434 --- /dev/null +++ b/src/data/calendar/saints/st-bibiana.yml @@ -0,0 +1,11 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-02) -- an ordinary (non-Ember) Advent feria +# (privileged-feria-minor, see calendar/types.ts), so this Simplex saint +# is only ever commemorated here, the feria itself staying primary; the +# concrete case that led to this month's temporal-category fix. Own +# proper collect, no unique antiphon of her own. +id: st-bibiana +name: "St. Bibiana, Virgin and Martyr" +rank: simplex +common: common-of-a-virgin-martyr +propers: "st-bibiana" diff --git a/src/data/calendar/saints/st-damasus.yml b/src/data/calendar/saints/st-damasus.yml new file mode 100644 index 0000000..b8300dd --- /dev/null +++ b/src/data/calendar/saints/st-damasus.yml @@ -0,0 +1,11 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-11) -- an ordinary Advent feria +# (privileged-feria-minor), Semiduplex wins outright, feria commemorated +# in return. Own proper collect (Latin only -- see +# propers/common/st-damasus-collect.yml for the missing-English note), no +# unique antiphon of his own. +id: st-damasus +name: "St. Damasus I, Pope and Confessor" +rank: semiduplex +common: common-of-a-confessor-bishop +propers: "st-damasus" diff --git a/src/data/calendar/saints/st-eusebius-of-vercelli.yml b/src/data/calendar/saints/st-eusebius-of-vercelli.yml new file mode 100644 index 0000000..7b2c9e7 --- /dev/null +++ b/src/data/calendar/saints/st-eusebius-of-vercelli.yml @@ -0,0 +1,16 @@ +# A monastic-calendar-specific placement: the base Tridentine table +# (1570.txt) doesn't have this saint at all; the monastic-specific delta +# table (M1617.txt) places him here via a same-day redirect notation +# ("12-15=12-16=..."). Verified live (Monastic Tridentinum 1617, +# 2025-12-15) -- an ordinary Advent feria (privileged-feria-minor), +# Semiduplex wins outright, feria commemorated in return. No unique +# collect: the raw file actually found at this MM-DD slot +# (Sancti/12-15.txt) is the later (post-1854) Octave of the Immaculate +# Conception's, not this saint's at all -- a live prayTertia query for +# the Monastic 1617 track returns no Oratio, confirming propers: null is +# correct. +id: st-eusebius-of-vercelli +name: "St. Eusebius of Vercelli, Bishop and Martyr" +rank: semiduplex +common: common-of-a-martyr-bishop +propers: null diff --git a/src/data/calendar/saints/st-john-apostle.yml b/src/data/calendar/saints/st-john-apostle.yml new file mode 100644 index 0000000..f8c56c3 --- /dev/null +++ b/src/data/calendar/saints/st-john-apostle.yml @@ -0,0 +1,9 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-27) -- wins outright, Duplex II. classis, within +# Christmas's Octave (privileged-feria-minor), Octave day commemorated in +# return. Own proper collect and antiphon. +id: st-john-apostle +name: "St. John, Apostle and Evangelist" +rank: duplex-2-classis +common: common-of-an-evangelist +propers: "st-john-apostle" diff --git a/src/data/calendar/saints/st-lucy.yml b/src/data/calendar/saints/st-lucy.yml new file mode 100644 index 0000000..f432924 --- /dev/null +++ b/src/data/calendar/saints/st-lucy.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-13) -- an ordinary Advent feria +# (privileged-feria-minor), Duplex wins outright, feria commemorated in +# return. Own proper antiphon; its own [Oratio] is a plain cross- +# reference to a generic Common formula (@Commune/C7a), not unique text, +# so getDayCollect resolves honestly missing for her despite propers +# being set -- same pattern as February's St. Agatha. +id: st-lucy +name: "St. Lucy, Virgin and Martyr" +rank: duplex +common: common-of-a-virgin-martyr +propers: "st-lucy" diff --git a/src/data/calendar/saints/st-melchiades.yml b/src/data/calendar/saints/st-melchiades.yml new file mode 100644 index 0000000..5a7ead9 --- /dev/null +++ b/src/data/calendar/saints/st-melchiades.yml @@ -0,0 +1,10 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-10) -- an ordinary Advent feria +# (privileged-feria-minor), so this Simplex saint is only ever +# commemorated here, the feria staying primary. No unique collect: no raw +# file exists at all at this MM-DD slot (Sancti/12-10.txt). +id: st-melchiades +name: "St. Melchiades, Pope and Martyr" +rank: simplex +common: common-of-a-martyr-bishop +propers: null diff --git a/src/data/calendar/saints/st-nicholas.yml b/src/data/calendar/saints/st-nicholas.yml new file mode 100644 index 0000000..1a7c152 --- /dev/null +++ b/src/data/calendar/saints/st-nicholas.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-06) -- an ordinary Advent feria +# (privileged-feria-minor); Semiduplex is enough to win outright here +# (unlike the stricter privileged-feria/Ember tier), with the feria +# itself commemorated in return -- the concrete case that revealed this +# month's temporal-category fix. Own proper collect, no unique antiphon +# of his own. +id: st-nicholas +name: "St. Nicholas, Bishop and Confessor" +rank: semiduplex +common: common-of-a-confessor-bishop +propers: "st-nicholas" diff --git a/src/data/calendar/saints/st-sabbas.yml b/src/data/calendar/saints/st-sabbas.yml new file mode 100644 index 0000000..a812408 --- /dev/null +++ b/src/data/calendar/saints/st-sabbas.yml @@ -0,0 +1,10 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-05) -- an ordinary Advent feria +# (privileged-feria-minor), so this Simplex saint is only ever +# commemorated here, the feria staying primary. No unique collect: the +# raw file at this MM-DD slot (Sancti/12-05.txt) is empty. +id: st-sabbas +name: "St. Sabbas, Abbot" +rank: simplex +common: common-of-an-abbot +propers: null diff --git a/src/data/calendar/saints/st-silvester-i.yml b/src/data/calendar/saints/st-silvester-i.yml new file mode 100644 index 0000000..4c12f0c --- /dev/null +++ b/src/data/calendar/saints/st-silvester-i.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-31) -- wins outright, Duplex, within Christmas's +# Octave (privileged-feria-minor), Octave day commemorated in return. +# Distinct from November's St. Silvester, Abbot (st-silvester-abbot.yml, +# Sylvester Gozzolini) -- this is Pope St. Sylvester I. No unique collect: +# the raw file's own [Oratio] is a plain cross-reference to a generic +# Common formula (@Commune/C4), not unique text. +id: st-silvester-i +name: "St. Silvester I, Pope and Confessor" +rank: duplex +common: common-of-a-confessor-bishop +propers: null diff --git a/src/data/calendar/saints/st-stephen-protomartyr.yml b/src/data/calendar/saints/st-stephen-protomartyr.yml new file mode 100644 index 0000000..2138709 --- /dev/null +++ b/src/data/calendar/saints/st-stephen-protomartyr.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-26) -- wins outright, Duplex II. classis, within +# Christmas's own Octave (privileged-feria-minor, see this month's +# temporal-category fix), with the Octave day itself commemorated in +# return. Own proper collect and antiphon -- his Dec 26 own feast, the +# canonical source August's finding-of-st-stephen.yml and this pull's +# other Stephen-related feasts cross-reference or duplicate from. +id: st-stephen-protomartyr +name: "St. Stephen, Protomartyr" +rank: duplex-2-classis +common: common-of-a-martyr +propers: "st-stephen-protomartyr" diff --git a/src/data/calendar/saints/st-thomas-apostle.yml b/src/data/calendar/saints/st-thomas-apostle.yml new file mode 100644 index 0000000..77027bd --- /dev/null +++ b/src/data/calendar/saints/st-thomas-apostle.yml @@ -0,0 +1,9 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2026-12-21) -- an ordinary Advent feria +# (privileged-feria-minor), Duplex II. classis wins outright easily, feria +# commemorated in return. Own proper collect and antiphon. +id: st-thomas-apostle +name: "St. Thomas, Apostle" +rank: duplex-2-classis +common: common-of-an-apostle +propers: "st-thomas-apostle" diff --git a/src/data/calendar/saints/st-thomas-becket.yml b/src/data/calendar/saints/st-thomas-becket.yml new file mode 100644 index 0000000..2c2a6f9 --- /dev/null +++ b/src/data/calendar/saints/st-thomas-becket.yml @@ -0,0 +1,13 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), live +# kalendar check (2025-12-29) -- wins outright, Semiduplex, within +# Christmas's Octave (privileged-feria-minor) -- the concrete case that +# revealed this month's temporal-category fix (Semiduplex, not just +# Duplex+, wins outright here, which the original single-tier +# `privileged-feria` model would have wrongly forbidden). Octave day +# commemorated in return. Own proper collect, no unique antiphon of his +# own. +id: st-thomas-becket +name: "St. Thomas of Canterbury, Bishop and Martyr" +rank: semiduplex +common: common-of-a-martyr-bishop +propers: "st-thomas-becket" diff --git a/src/data/calendar/saints/vigil-of-st-thomas.yml b/src/data/calendar/saints/vigil-of-st-thomas.yml new file mode 100644 index 0000000..fe70af6 --- /dev/null +++ b/src/data/calendar/saints/vigil-of-st-thomas.yml @@ -0,0 +1,15 @@ +# A real vigil, landing on Advent's Ember Saturday every year (Dec 20 is +# fixed, and Advent Ember Saturday is defined relative to it -- see the +# raw table's own "(in missa tantum)" tag, meaning the *real* engine +# commemorates this vigil at Mass only, keeping Ember Saturday +# (privileged-feria, see calendar/types.ts) as the Office's primary. This +# app doesn't model the Mass-vs-Office distinction anywhere (same known +# simplification as September's Vigil of St. Matthew), so here it simply +# follows the ordinary privileged-feria/vigil transfer rule instead. No +# unique collect: the raw file at this MM-DD slot (Sancti/12-20.txt) is +# empty. +id: vigil-of-st-thomas +name: "Vigil of St. Thomas" +rank: vigil +common: common-of-a-vigil +propers: null diff --git a/src/data/calendar/sanctoral-calendar.yml b/src/data/calendar/sanctoral-calendar.yml index 0c995f1..f262b17 100644 --- a/src/data/calendar/sanctoral-calendar.yml +++ b/src/data/calendar/sanctoral-calendar.yml @@ -304,4 +304,36 @@ days: "11-26": [st-silvester-abbot, st-peter-of-alexandria] "11-29": [vigil-of-st-andrew, st-saturninus] "11-30": [st-andrew] + # December — 12/12, the final month of the pre-1955 pull. Every + # non-excluded date this month falls within a season this app now + # models as `privileged-feria-minor` (Advent through Dec 20, Christmas's + # own Octave from Dec 26) -- this month's own pull is what surfaced and + # verified that temporal-category fix (see calendar/types.ts and this + # repo's commit history). Immaculate Conception's own propers were + # backfilled this month. Excluded: Dec 24 (Vigil of Christmas) and Dec + # 25 (Christmas itself) aren't sanctoral entries at all -- Christmas is + # a fixed-date temporal anchor (see data/calendar/fixed-date- + # calendar.yml) and its Vigil is a distinct privileged-feria-major + # temporal category, neither modeled as a saint. St. Eusebius of + # Vercelli (Dec 15) is a monastic-calendar-specific placement, reached + # via a same-day redirect notation in M1617.txt rather than a plain + # date entry. The Vigil of St. Thomas (Dec 20) always lands on Advent's + # Ember Saturday -- a known Mass-vs-Office simplification, same pattern + # as September's Vigil of St. Matthew. + "12-02": [st-bibiana] + "12-04": [st-barbara] + "12-05": [st-sabbas] + "12-06": [st-nicholas] + "12-07": [st-ambrose] "12-08": [immaculate-conception] + "12-10": [st-melchiades] + "12-11": [st-damasus] + "12-13": [st-lucy] + "12-15": [st-eusebius-of-vercelli] + "12-20": [vigil-of-st-thomas] + "12-21": [st-thomas-apostle] + "12-26": [st-stephen-protomartyr] + "12-27": [st-john-apostle] + "12-28": [holy-innocents] + "12-29": [st-thomas-becket] + "12-31": [st-silvester-i] diff --git a/src/data/calendar/temporal-categories.yml b/src/data/calendar/temporal-categories.yml index 5945dc1..8d19fdd 100644 --- a/src/data/calendar/temporal-categories.yml +++ b/src/data/calendar/temporal-categories.yml @@ -39,10 +39,15 @@ bySeason: # comment) -- weaker than the Ember-day `privileged-feria` tier, but real # standing nonetheless, unlike a plain `ordinary-feria`. advent: { sunday: privileged-sunday, feria: privileged-feria-minor } - # Christmastide's ferias are folded into the privileged-feria default for - # the whole season as a simplification of "the Octave of Christmas (Dec - # 25 - Jan 1) is privileged" — slightly overbroad into Jan 2-5, harmless. - christmastide: { sunday: privileged-sunday, feria: privileged-feria } + # Christmastide's ferias are folded into the privileged-feria-minor + # default for the whole season as a simplification of "the Octave of + # Christmas (Dec 25 - Jan 1) is privileged" — slightly overbroad into Jan + # 2-5, harmless. Verified `privileged-feria-minor` specifically (not the + # stronger `privileged-feria`) during the December pull: St. Thomas of + # Canterbury, Semiduplex, wins outright within the Octave (Dec 29) in the + # real Monastic 1617 engine, which `privileged-feria`'s Duplex+ threshold + # would wrongly forbid. + christmastide: { sunday: privileged-sunday, feria: privileged-feria-minor } epiphanytide: { sunday: ordinary-sunday, feria: ordinary-feria } septuagesima: { sunday: privileged-sunday, feria: ordinary-feria } lent: { sunday: privileged-sunday, feria: ordinary-feria }