calendar: model Our Lady's Saturday as a real occurrence outcome
Deploy / deploy (push) Successful in 49s

On a free Saturday (nothing privileged already claims it, no active
octave), the day's own identity is now "Our Lady's Saturday" rather
than an anonymous ordinary-feria -- mirrors privileged-feria-minor
exactly, per direct instruction: Semiduplex-or-higher still wins
outright (Marian Saturday doesn't apply at all); below that (Simplex,
and Vigil, both under semiduplex on the FeastClass scale) loses and is
commemorated instead. Layered additively after decideOccurrence, same
shape as applyOctaves -- never touches decideOccurrence's own rules.

Needed a real winner identity (not just the plain temporal feria id)
so day-label/antiphon/collect sourcing can recognize it -- added a
temporal-feasts record purely for that, and taught getDayLabel to
check it for any named temporal winner (a small, free improvement for
Christmas/Pentecost's own labels too, previously unhandled).

hours: build the duplex-majus+ Lauds psalmody override (per-feast)

lauds-psalmody no longer unconditionally uses the plain weekday
default: a duplex-majus-or-higher sanctoral winner, or Our Lady's
Saturday (unconditional, no rank threshold -- it isn't competing with
the weekday default the way a saint is), now substitutes its own
proper psalm groups/antiphons/canticle. Per-feast, not per-Common, per
direct instruction, even though most duplex-majus+ saints across the
year don't have one authored yet and fall back to the plain weekday
default until they do.

Content for the worked example (St. Lawrence's own day) surfaced a
real bug while sourcing it: st-lawrence-antiphon.yml had been read
from the Roman/secular rite's own [Ant 1], not Monastic 1617's actual
Benedictus antiphon for that day -- corrected from a fresh live query.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 14:02:55 -04:00
parent 4548042b65
commit 747a078580
16 changed files with 378 additions and 31 deletions
@@ -0,0 +1,29 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds
# live query, Sanctæ Mariæ Sabbato (2026-09-05). Applies unconditionally
# whenever Marian Saturday wins the day (see calendar/index.ts's
# applyMarianSaturday) -- not gated by the duplex-majus+ rank threshold
# the sanctoral overrides use, since Marian Saturday isn't itself ranked
# in competition with the weekday default the way a saint is.
id: marian-saturday
groups:
- psalms: [92]
antiphon:
la: "Dum esset Rex * in accúbitu suo, nardus mea dedit odórem suavitátis."
en: "While the King was at his repose, * my spikenard sent forth the odour thereof."
- psalms: [99]
antiphon:
la: "Læva ejus * sub cápite meo, et déxtera illíus amplexábitur me."
en: "His left hand is under my head, * and his right hand shall embrace me."
- psalms: [62]
antiphon:
la: "Nigra sum, * sed formósa, fíliæ Jerúsalem; ídeo diléxit me Rex, et introdúxit me in cubículum suum."
en: "I am black, * but beautiful, O ye daughters of Jerusalem; therefore hath the King loved me, and brought me into his chamber."
canticle:
id: canticum-trium-puerorum
antiphon:
la: "Jam hiems tránsiit, * imber ábiit et recéssit: surge, amíca mea, et veni."
en: "For winter is now past, * the rain is over and gone: arise, my love, and come."
laudate:
antiphon:
la: "Speciósa * facta es et suávis in delíciis tuis, sancta Dei Génitrix."
en: "Beautiful and sweet * thou art become in thy delights, O holy Mother of God."
@@ -0,0 +1,31 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds
# live query, St. Lawrence's own day (2026-08-10, Duplex II. classis --
# above the duplex-majus threshold this override mechanism is gated at).
# Worked example proving the mechanism end to end; the psalm numbers
# happen to be the same 92/99/62 + the Three Young Men that most Common-
# of-Martyrs-shaped feasts reuse, but the antiphons are St. Lawrence's own
# proper text, not the plain Commune's — that's the whole point of
# authoring per-feast rather than per-Common (explicit choice).
id: st-lawrence
groups:
- psalms: [92]
antiphon:
la: "Lauréntius * ingréssus est Martyr, et conféssus est nomen Dómini Jesu Christi."
en: "Lawrence went in to be a martyr, * and acknowledged the name of our Lord Jesus Christ."
- psalms: [99]
antiphon:
la: "Lauréntius * bonum opus operátus est, qui per signum crucis cæcos illuminávit."
en: "Lawrence wrought a good work, * in that with the sign of the Cross he gave sight to the blind."
- psalms: [62]
antiphon:
la: "Adhǽsit * ánima mea post te, quia caro mea igne cremáta est pro te, Deus meus."
en: "O my God, my soul cleaveth * fast after thee, for my flesh hath been burnt with fire for thy sake."
canticle:
id: canticum-trium-puerorum
antiphon:
la: "Misit Dóminus * Angelum suum, et liberávit me de médio ignis, et non sum æstuátus."
en: "The Lord hath sent His Angel, * and hath delivered me out of the midst of the fire, so that I am not scorched."
laudate:
antiphon:
la: "Beátus Lauréntius * orábat, dicens: Grátias tibi ago, Dómine, quia jánuas tuas íngredi mérui."
en: "The blessed Lawrence prayed * and said: I give thee thanks, O Lord, that Thou hast made me worthy to enter within thy gates."