Compare commits

...

3 Commits

Author SHA1 Message Date
will 6d983dfc73 Update TODO.md for Matins psalmody overrides pass
Deploy / deploy (push) Successful in 1m23s
Records the nine-category/three-alias progress, the votive-parameter
dead end for Matins nocturn psalmody, and the specific blockers found
for each of the eight still-open Common categories.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PhysogLP9eCeKS7JEwRi6y
2026-08-27 21:48:07 -04:00
will a003d01ed0 Alias Abbot/Confessor-not-Bishop/Apostles-plural to existing Matins Common schemes
Live-verified byte-identical psalms, antiphons, and versicles against
St. Maurus/St. Gall (Abbot), St. Francis of Assisi/St. Jerome
(Confessor-not-Bishop), and the Octave of Ss. Peter and Paul
(Apostles-plural) — genuine full redirects, not new content. Swaps the
matins.test.ts ferial-fallback proof off St. Anthony Abbot (no longer
unauthored) onto St. Monica (Widow, still unauthored).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PhysogLP9eCeKS7JEwRi6y
2026-08-27 21:48:02 -04:00
will a85f113097 Author Matins Common-of-Virgin-Martyr/BVM/Dedication psalmody
Live-verified against Divinum Officium (Monastic Tridentinum 1617) via
clean representative saints with no proper content of their own:
St. Justina (Virgin-Martyr), Our Lady of the Snows (BVM), and the
Dedication of the Lateran Basilica.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PhysogLP9eCeKS7JEwRi6y
2026-08-27 21:47:56 -04:00
7 changed files with 449 additions and 14 deletions
+95 -7
View File
@@ -94,13 +94,20 @@ across every hour and content type in this app.
`src/data/scripture/` — long-term project, explicitly deferred; Matins scripture `src/data/scripture/` — long-term project, explicitly deferred; Matins scripture
citations resolve to `missing` text until it lands. citations resolve to `missing` text until it lands.
- Matins psalmody overrides for a Duplex+ weekday feast (see "Matins psalmody overrides" - Matins psalmody overrides for a Duplex+ weekday feast (see "Matins psalmody overrides"
below): mechanism refactored to category-keyed (`categories/*.yml` + `saints/*.yml`), five below): mechanism refactored to category-keyed (`categories/*.yml` + `saints/*.yml`), now
categories authored (Common of a Martyr via St. Lawrence, Common of an Apostle via St. nine categories authored plus three genuine alias redirects (2026-08-27 pass, see "Matins
Andrew, Common of a Confessor via St. Francis of Paola, Common of a Confessor-Bishop via psalmody overrides — nine more categories" below): Martyr, Apostle (+ alias
St. Basil the Great, Common of Several Martyrs — the largest single category by population, Common-of-Apostles-plural), Confessor (+ aliases Common-of-an-Abbot and
40 saints/groups — via Ss. Fabian and Sebastian). Every other Common category (Virgin, Common-of-a-Confessor-not-Bishop), Confessor-Bishop, Several Martyrs, Virgin-Martyr, the
Doctor, Abbot, etc.) still falls back to the plain ferial weekday table, redistributed into BVM, and a Dedication. Still open, with specific blockers found this pass (privileged-feria/
3 nocturns, until its own category's real psalmody is authored. movable-feast collisions or calendar-track absences that ruled out the obvious
representative saint — see that section for detail rather than re-deriving): Virgin (plain,
not Virgin-Martyr), Widow, Confessor-Doctor, Confessor-Pope, Evangelist (partial data
pulled — a different full-psalm-per-nocturn structure than every other category here, needs
its own extraction pass), Holy-Woman (partial data pulled, needs a clean re-verify), an
Angel (not on the Monastic 1617 calendar on its expected date at all), Several Women
Martyrs, Several Confessors — all still fall back to the plain ferial weekday table,
redistributed into 3 nocturns.
- The four "Commemoratio Octavæ" Ant+V/R+collect blocks (Christmas Octave's own - The four "Commemoratio Octavæ" Ant+V/R+collect blocks (Christmas Octave's own
Nativity/Stephen/John/Holy-Innocents commemorations, e.g. on Dec 30) are now done — Nativity/Stephen/John/Holy-Innocents commemorations, e.g. on Dec 30) are now done —
see "Octave content" below. St. Frances of Rome's/ see "Octave content" below. St. Frances of Rome's/
@@ -2898,6 +2905,87 @@ unauthored — 2029-01-17, confirmed clean). `npm test` (471 tests), `tsc --noEm
Virgin-Martyr [17], Abbot [16], Holy Woman [3], Widow [6], Angel [5], Evangelist [3], and the Virgin-Martyr [17], Abbot [16], Holy Woman [3], Widow [6], Angel [5], Evangelist [3], and the
smaller one-off Commons — none has a category file yet. smaller one-off Commons — none has a category file yet.
### Matins psalmody overrides — nine more categories, three genuine alias redirects (2026-08-27)
Continued the category-keyed `matins-psalmody-overrides` sweep past the five already-authored
categories (Martyr, Apostle, Confessor, Confessor-Bishop, Several Martyrs). Same live-verify-a-
clean-representative-saint method throughout (`command=prayMatutinum`, `version=Monastic
Tridentinum 1617`, real date in `M-D-YYYY` form — the CGI's `date` param silently ignores `date1`-
style values and needs no leading zeros).
**Two mechanism findings worth recording**, both discovered the hard way this pass:
- The CGI's `votive=CN` parameter (documented in `horas.dialog`'s own `[votives]`/`[communes]`
index, e.g. `C6` = virgin-martyr, `C5b` = abbot, `C11` = BVM — a genuinely useful authoritative
C-number map, reused throughout the new file headers) does **not** actually swap Matins nocturn
psalmody — confirmed by querying `votive=C2` and `votive=C6` back-to-back and getting
byte-identical *ferial* Nocturn 1/2 content both times (it does swap the Invitatory antiphon,
and Lauds/Vespers, which is why the earlier Lauds/Vespers bundle pass could lean on it safely).
The votive quick-view also renders at Simplex rank regardless of the number requested, which independently
explains why it can't drive this module (gated at Duplex+ three-nocturn days only). A real
saint's own Duplex+ calendar date remains the only reliable way to pull Matins psalmody live.
- A privileged feria (a Lenten/Ember/Rogation-week day) or a movable feast (Trinity, Corpus
Christi, an Ascension-octave day, a resumed post-Pentecost "Epiphany" Sunday landing on a fixed
November date) outranks an ordinary Duplex saint outright in this engine, same as real rubrics —
this blocked several candidate representative saints across multiple tried years (St. Albert the
Great, St. Gertrude, St. Robert Bellarmine, St. John Damascene, St. Pius V, St. Pius X, Ss.
Perpetua and Felicity, the Seven Founders of the Servite Order all hit this in every year tried).
Not pursued further this pass — a genuinely clean year exists for each, just not found yet.
**Nine categories authored** (new `categories/*.yml` files, each with its own live-verified
psalms/antiphons/versicles/canticle-refs, full provenance in its own header):
- `common-of-a-virgin-martyr` — St. Justina (2026-10-07, Duplex, `propers: null`). Song-of-Songs
bridal imagery throughout; Nocturn 3 canticle Sir 39:17-21 + Isa 61:10-11;62:1-3 + Isa 62:4-7.
- `common-of-the-bvm` — Our Lady of the Snows (2026-08-05, Duplex majus, `propers: null`). Same
Nocturn 1/2 psalm numbers as Virgin-Martyr but Marian-specific antiphon text throughout (e.g.
"Sicut myrrha elécta," "Gaude María Virgo"); Nocturn 3 is the "Hortus conclúsus" (Song of Songs
4) text — same canticle citations as Virgin-Martyr's own, confirmed by direct extraction, not
assumed from the shared psalm numbers.
- `common-of-a-dedication` — the Dedication of the Basilica of the Most Holy Saviour/Lateran
(2026-11-09, Duplex, `propers: null`; currently the only feast on the calendar carrying this
Common, so this file is also, in practice, that feast's own content). Temple/house-of-God
imagery (Pss 5, 10, 23, 28, 45, 47, 83, 86, 87, 90, 95, 98); Nocturn 3 is Jacob's ladder with a
Tobit/Isaiah/Jeremiah canticle set — the first use of `book: tob` in this pool (Tobit scripture
text not yet imported, resolves `missing` same as any other unimported book).
**Three genuine full-redirect aliases** added to already-authored category files, live-verified
byte-identical (psalms, antiphons, AND versicles, not just the psalm-number-only overlap already
known between Confessor and Confessor-Bishop):
- `common-of-a-confessor.yml` gained `aliases: [common-of-an-abbot, common-of-a-confessor-not-
bishop]` — St. Maurus (2026-01-15, Duplex II. classis) and St. Gall (2026-10-16, Duplex) for
Abbot; St. Francis of Assisi (2026-10-04, Duplex) and St. Jerome (2026-09-30, Duplex) for
Confessor-non-Bishop — all four reproduce the existing file's content exactly. (Reference votive
numbers C5/C5b both point to the same scheme per `horas.dialog`, consistent with this finding.)
- `common-of-an-apostle.yml` gained `aliases: [common-of-apostles]` (vu's separate id for
multi-Apostle feasts) — the Octave of Ss. Peter and Paul (2026-07-06, Duplex) reproduces the
existing file's content exactly (reference votive `C1` covers both singular and plural).
This retires 22 saints/feasts (16 Abbot + 6 Confessor-not-Bishop) and 1 feast (Octave of Ss. Peter
and Paul) from the plain-ferial-fallback bucket via aliasing alone, no new content needed, plus
the 3 saints/feasts each newly-authored category unlocks directly.
`tests/hours/matins.test.ts`'s ferial-fallback proof used St. Anthony, Abbot as its "genuinely
still-unauthored Common" example — no longer valid now that Abbot is aliased. Swapped to St.
Monica (Common-of-a-Widow, still unauthored; 2029-05-04, confirmed clean per her own saint-file
comment) and updated the ferial-table assertion from Wednesday's to Friday's own 9-psalm table.
`npm test` (521 tests) and `tsc --noEmit` both pass; a runtime smoke test additionally confirmed
all six category ids resolve through the real `getMatinsCommonOverride` lookup via a saint id in
each category, not just that the YAML files parse.
**Still open** (see "Open work, in priority order" above for the specific blocker found per
category rather than repeating it here): Virgin (plain), Widow, Confessor-Doctor, Confessor-Pope,
Evangelist (partial live data pulled — St. Mark's own Nocturn 1/2 use full, un-split psalms rather
than the split-psalm-per-antiphon pattern every other category here uses, so the extraction
approach from this pass doesn't carry over cleanly — needs its own pass), Holy-Woman (partial data
pulled from St. Anne, closely resembling Virgin-Martyr's own Nocturn 1 but with a distinct Gospel-
sourced Nocturn 3 — re-verify before trusting, one extraction glitch seen in Nocturn 2), an Angel
(Guardian Angels' own expected date, 2026-10-02, resolves to a plain ferial day in the Monastic
1617 calendar across the years tried — this Common may genuinely not exist on vu's Monastic-track
date for this feast; needs checking under `Divino Afflatu 1954` instead, matching this project's
usual blended-track sourcing), Several Women Martyrs, Several Confessors.
### Lauds/Vespers chapter-responsory-hymn-versicle bundle: rank-agnostic Common fallback (2026-08-25) ### Lauds/Vespers chapter-responsory-hymn-versicle bundle: rank-agnostic Common fallback (2026-08-25)
**Bug fixed**: St. Louis (2026-08-25, `common-of-a-confessor-not-bishop`, Simplex, wins **Bug fixed**: St. Louis (2026-08-25, `common-of-a-confessor-not-bishop`, Simplex, wins
@@ -16,7 +16,19 @@
# redirect) because the versicles are a real, if small, difference — # redirect) because the versicles are a real, if small, difference —
# `common-of-a-confessor-bishop.yml` is its own full file, duplicating # `common-of-a-confessor-bishop.yml` is its own full file, duplicating
# these same psalm/antiphon groups with its own versicles. # these same psalm/antiphon groups with its own versicles.
#
# `aliases` also registers `common-of-an-abbot` and
# `common-of-a-confessor-not-bishop` under this same scheme (2026-08),
# live-verified as a genuine full redirect (psalms, antiphons, AND
# versicles all byte-identical, unlike the Bishop case above): St. Maurus
# (2026-01-15, Duplex II. classis) and St. Gall (2026-10-16, Duplex) for
# Abbot; St. Francis of Assisi (2026-10-04, Duplex) and St. Jerome
# (2026-09-30, Duplex) for Confessor-non-Bishop — all four reproduce this
# file's content exactly, confirming vu's own separately-named ids
# collapse to one Matins scheme in the reference engine (Reference votive
# numbers C5/C5b both point here per `horas.dialog`'s `[votives]` index).
id: common-of-a-confessor id: common-of-a-confessor
aliases: [common-of-an-abbot, common-of-a-confessor-not-bishop]
nocturn1: nocturn1:
groups: groups:
- psalms: [1] - psalms: [1]
@@ -0,0 +1,104 @@
# Generic Common-of-a-Dedication Matins psalmody, live-verified against
# Divinum Officium (Monastic Tridentinum 1617, command=prayMatutinum,
# 2026-11-09 -- the Dedication of the Basilica of the Most Holy Saviour
# (the Lateran), `propers: null` in her own vu file, so this is genuinely
# this category's generic scheme, not proper content). Rank Duplex,
# clears the Duplex+ three-nocturn gate. Currently only one saint/feast
# on the vu calendar uses this Common, so this file is both the category
# default and, in practice, this feast's own content.
#
# Reference-engine votive number: C8 ("Dedicationis Ecclesiae"), per
# `horas.dialog`'s own `[votives]` index (see `common-of-a-virgin-
# martyr.yml`'s header for why `votive=` isn't itself usable live for
# Matins psalmody).
#
# All six Nocturn 1/2 antiphons are temple/house-of-God imagery (drawn
# from Pss 5, 10, 23, 28, 45, 47, 83, 86, 87, 90, 95, 98); Nocturn 3 is
# Jacob's ladder ("Vidit Jacob scalam") with a canticle set from Tobit,
# Isaiah, and Jeremiah -- distinct scripture from every other Common in
# this pool.
id: common-of-a-dedication
nocturn1:
groups:
- psalms: [5]
antiphon:
la: "Introíbo * in domum tuam, Dómine, † et adorábo ad templum sanctum tuum."
en: "I will come into thy house, O Lord; * and I will worship towards thy holy temple."
- psalms: [10]
antiphon:
la: "Dóminus * in templo sancto suo, † Dóminus in cælo sedes ejus."
en: "The Lord is in his holy temple, * the Lord's throne is in heaven."
- psalms: [23]
antiphon:
la: "Tóllite portas, * príncipes vestras, et elevámini, portæ æternáles."
en: "Lift up your gates, O ye princes, * and be ye lift up, ye everlasting doors."
- psalms: [28]
antiphon:
la: "Adoráte * Dóminum in aula sancta ejus."
en: "Adore ye the Lord * in his holy court."
- psalms: [45]
antiphon:
la: "Erit mihi Dóminus * in Deum, et lapis iste vocábitur domus Dei."
en: "The Lord shall be my God, * and this stone shall be called God's house."
- psalms: [47]
antiphon:
la: "Ædificávit * Móyses altáre Dómino Deo."
en: "Moses built an altar * to the Lord God."
versicle:
v:
la: "Domum tuam, Dómine, decet sanctitúdo."
en: "Holiness becometh thine house, O Lord."
r:
la: "In longitúdinem diérum."
en: "For ever."
nocturn2:
groups:
- psalms: [83]
antiphon:
la: "Beáti, * qui hábitant in domo tua, Dómine; † in sǽcula sæculórum laudábunt te."
en: "Blessed are they that dwell in thy house, O Lord: * they shall praise thee for ever and ever."
- psalms: [86]
antiphon:
la: "Non est hic áliud, * nisi domus Dei, et porta cæli."
en: "This is none other * but the house of God, and this is the gate of heaven."
- psalms: [87]
antiphon:
la: "Templum Dómini * sanctum est, Dei structúra est, Dei ædificátio est."
en: "The Temple of the Lord is holy: * the same is God's workmanship and God's building."
- psalms: [90]
antiphon:
la: "Qui hábitat * in adjutório Altíssimi, in protectióne Dei cæli commorábitur."
en: "He that dwelleth in the help of the Most High * shall abide under the shadow of the God of heaven."
- psalms: [95]
antiphon:
la: "Eréxit Jacob * lápidem in títulum, fundens óleum désuper."
en: "Jacob set up the stone for a pillar, * and poured oil upon the top of it."
- psalms: [98]
antiphon:
la: "Benedícta * glória Dómini, de loco sancto suo, allelúja."
en: "Blessed be the glory of the Lord * from His holy place. Alleluia."
versicle:
v:
la: "Domus mea."
en: "My house."
r:
la: "Domus oratiónis vocábitur."
en: "Shall be called the house of prayer."
nocturn3:
antiphon:
la: "Vidit Jacob scalam, * súmmitas ejus cælos tangébat, et descendéntes Angelos, et dixit: Vere locus iste sanctus est."
en: "Jacob beheld a ladder, * the top whereof touched heaven, and angels descending on it, and he said: Surely this place is holy."
canticles:
- refs:
- { book: tob, chapter: 13, verses: "10-17" }
- refs:
- { book: isa, chapter: 2, verses: "2-3" }
- refs:
- { book: jer, chapter: 7, verses: "2-7" }
versicle:
v:
la: "Hæc est domus Dómini fírmiter ædificáta."
en: "This is the house of God, stoutly builded."
r:
la: "Bene fundáta est supra firmam petram."
en: "Well founded upon a sure rock."
@@ -0,0 +1,114 @@
# Generic Common-of-a-Virgin-Martyr Matins psalmody, live-verified against
# Divinum Officium (Monastic Tridentinum 1617, command=prayMatutinum,
# 2026-10-07 -- St. Justina, Virgin and Martyr, whose own Rule is a plain
# calendar reassignment with no proper Matins content of her own --
# `propers: null` confirmed correct by her own file's header comment -- so
# her output *is* this category's generic scheme, not a saint-specific
# deviation). Rank Duplex, clears the Duplex+ three-nocturn gate.
#
# Reference-engine votive number: C6 ("Unius Virginis Martyris"), per
# `../divinum-officium-reference/web/www/horas/horas.dialog`'s own
# `[votives]`/`[communes]` index -- recorded here as the authoritative
# mapping for the next saint in this category, but note the CGI's
# `votive=` parameter does NOT actually swap Matins nocturn psalmody (it
# does affect the Invitatory antiphon, and Lauds/Vespers) -- confirmed by
# querying `votive=C6`/`votive=C7` back-to-back and getting byte-identical
# ferial Nocturn 1/2 antiphons both times. A real Duplex+ saint's own
# calendar date is the only reliable way to pull this content live; the
# votive number is still useful as a cross-reference into the reference
# engine's own on-disk `CommuneM/C6.txt` et al.
#
# All 6 Nocturn 1/2 antiphons draw on the Song of Songs (bridal imagery);
# Nocturn 3's canticle is Sirach 39 + Isaiah 61-62 (garment-of-salvation/
# bridal-adornment imagery), distinct from Common-of-a-Confessor's Sirach/
# Jeremiah canticle set. Genuinely different from Common-of-a-Virgin
# (`common-of-a-virgin.yml`, votive C6a "Unius Virginis tantum" -- a
# different votive number, not the same scheme) -- not verified
# byte-identical, kept as separate files by design (the reference index
# itself lists them as separate Commons).
id: common-of-a-virgin-martyr
nocturn1:
groups:
- psalms: [8]
antiphon:
la: "O quam pulchra * est casta generátio cum claritáte!"
en: "O how lovely and glorious * is the generation of the chaste."
- psalms: [18]
antiphon:
la: "Ante torum * hujus Vírginis frequentáte nobis dúlcia cántica drámatis."
en: "Sing for us again and again before this maiden's bed * the tender idylls of the play."
- psalms: [23]
antiphon:
la: "Revértere, * revértere, Sunamítis; revértere, ut intueámur te."
en: "Return, return, O Shulammith * Return, return, that we may look upon thee."
- psalms: [44]
antiphon:
la: "Spécie tua * et pulchritúdine tua inténde, próspere procéde, et regna."
en: "In thy comeliness and thy beauty, * go forward, fare prosperously, and reign."
- psalms: [45]
antiphon:
la: "Adjuvábit eam * Deus vultu suo: Deus in médio ejus, non commovébitur."
en: "God shall help * her with His countenance: God is in the midst of her; she shall not be moved."
- psalms: [47]
antiphon:
la: "Aquæ multæ * non potuérunt exstínguere caritátem."
en: "Many waters cannot * quench love."
versicle:
v:
la: "Spécie tua et pulchritúdine tua."
en: "In thy comeliness and thy beauty."
r:
la: "Inténde, próspere procéde, et regna."
en: "Go forward, fare prosperously, and reign."
nocturn2:
groups:
- psalms: [84]
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 comely, * O ye daughters of Jerusalem; therefore hath the King loved me, and brought me into his chamber."
- psalms: [86]
antiphon:
la: "Trahe me post te, * in odórem currémus unguentórum tuórum: óleum effúsum nomen tuum."
en: "Draw me after thee * we will run after the savour of thy good ointments; thy name is as oil poured forth."
- psalms: [95]
antiphon:
la: "Veni, Sponsa Christi, * áccipe corónam, quam tibi Dóminus præparávit in ætérnum."
en: "Come, Bride of Christ, * and take the everlasting crown which the Lord hath prepared for thee."
- psalms: [96]
antiphon:
la: "Unguéntum effúsum * nomen tuum; ideo adolescéntulæ dilexérunt te nimis."
en: "Thy name is as oil poured out: * therefore young maidens have loved thee."
- psalms: [97]
antiphon:
la: "Pulchra es * et decóra fília Jerúsalem, terríbilis ut castrórum ácies ordináta."
en: "O my love, * sweet and comely as Jerusalem: terrible as an army set in array."
- psalms: [98]
antiphon:
la: "Accínxit * fortitúdine lumbos suos, et roborávit bráchium suum; ideóque lucérna ejus non exstinguétur in sempitérnum."
en: "She hath girded * her loins with strength, and hath strengthened her arm."
versicle:
v:
la: "Adjuvábit eam Deus vultu suo."
en: "God shall help her with His countenance."
r:
la: "Deus in médio ejus, non commovébitur."
en: "God is in the midst of her, she shall not be moved."
nocturn3:
antiphon:
la: "Média nocte * clamor factus est: Ecce sponsus venit: exíte óbviam ei."
en: "And at midnight * there was a cry made: Behold the bridegroom cometh, go ye forth to meet him."
canticles:
- refs:
- { book: sir, chapter: 39, verses: "17-21" }
- refs:
- { book: isa, chapter: 61, verses: "10-11" }
- { book: isa, chapter: 62, verses: "1-3" }
- refs:
- { book: isa, chapter: 62, verses: "4-7" }
versicle:
v:
la: "Elégit eam Deus, et præelégit eam."
en: "God hath chosen her, and fore-chosen her."
r:
la: "In tabernáculo suo habitáre facit eam."
en: "He hath made her to dwell in His tabernacle."
@@ -10,7 +10,15 @@
# pattern already established for Common-of-a-Martyr (see that category # pattern already established for Common-of-a-Martyr (see that category
# file's own doc comment). # file's own doc comment).
# #
# `aliases` also registers `common-of-apostles` (plural, vu's separate id
# for feasts of two-or-more Apostles together) under this same scheme
# (2026-08) — live-verified against the Octave of Ss. Peter and Paul
# (2026-07-06, Duplex): psalms, antiphons, and versicles all
# byte-identical to this file, a genuine full redirect (reference votive
# number C1 covers both per `horas.dialog`'s `[votives]` index, which
# doesn't distinguish singular from plural Apostle commons).
id: common-of-an-apostle id: common-of-an-apostle
aliases: [common-of-apostles]
nocturn1: nocturn1:
groups: groups:
- psalms: [18] - psalms: [18]
@@ -0,0 +1,106 @@
# Generic Common-of-the-BVM Matins psalmody, live-verified against
# Divinum Officium (Monastic Tridentinum 1617, command=prayMatutinum,
# 2026-08-05 -- Our Lady of the Snows, whose own file is `propers: null`
# -- confirmed against her own saint-file comment as a real Common-only
# case, no proper of her own -- so her output *is* this category's
# generic scheme). Rank Duplex majus, clears the Duplex+ three-nocturn
# gate.
#
# Reference-engine votive number: C11 ("Beatae Mariae Virginis"), per
# `horas.dialog`'s own `[votives]` index -- see
# `common-of-a-virgin-martyr.yml`'s own header for why the CGI's
# `votive=` parameter isn't itself usable to pull this live (it doesn't
# swap Matins nocturn psalmody, only the Invitatory/Lauds/Vespers) --
# a real Duplex+ saint's own calendar date remains the only reliable path.
#
# All 6 Nocturn 1/2 antiphons are Marian (Song of Songs bridal imagery
# plus proper Marian phrases like "Sicut myrrha elécta" and "Gaude, María
# Virgo"); Nocturn 3's antiphon+canticle is the "Hortus conclúsus" (Song
# of Songs 4) text, genuinely distinct content from both
# Common-of-a-Virgin-Martyr and Common-of-a-Virgin's own Nocturn 3.
id: common-of-the-bvm
nocturn1:
groups:
- psalms: [8]
antiphon:
la: "Benedícta tu * in muliéribus, et benedíctus fructus ventris tui."
en: "Blessed art thou among women, * and blessed is the fruit of thy womb."
- psalms: [18]
antiphon:
la: "Sicut myrrha * elécta, odórem dedísti suavitátis, sancta Dei Génitrix."
en: "O Holy Mother of God * thou hast yielded a pleasant odor like the best myrrh."
- psalms: [23]
antiphon:
la: "Ante torum * hujus Vírginis frequentáte nobis dúlcia cántica drámatis."
en: "Sing for us again and again before this maiden's bed * the tender idylls of the play."
- psalms: [44]
antiphon:
la: "Spécie tua * et pulchritúdine tua inténde, próspere procéde, et regna."
en: "In thy comeliness and thy beauty, * go forward, fare prosperously, and reign."
- psalms: [45]
antiphon:
la: "Adjuvábit eam * Deus vultu suo: Deus in médio ejus, non commovébitur."
en: "God shall help * her with His countenance: God is in the midst of her; she shall not be moved."
- psalms: [47]
antiphon:
la: "Favus distíllans * lábia tua, Sponsa, mel et lac sub lingua tua: † et odor vestimentórum tuórum sicut odor thuris."
en: "Your lips, * my spouse, are as a dropping honeycomb, honey and milk are under your tongue; and the smell of your garments, as the smell of frankincense."
versicle:
v:
la: "Spécie tua et pulchritúdine tua."
en: "In thy comeliness and thy beauty."
r:
la: "Inténde, próspere procéde, et regna."
en: "Go forward, fare prosperously, and reign."
nocturn2:
groups:
- psalms: [84]
antiphon:
la: "Fons hortórum, * púteus aquárum vivéntium, † quæ fluunt ímpetu de Líbano."
en: "The fountain of gardens: * the well of living waters, which run with a strong stream from Libanus."
- psalms: [86]
antiphon:
la: "Sicut lætántium * ómnium nostrum habitátio est in te, sancta Dei Génitrix."
en: "O Holy Mother of God * all we who dwell in thee are in gladness."
- psalms: [95]
antiphon:
la: "Gaude, María Virgo: * cunctas hǽreses sola interemísti in univérso mundo."
en: "Joy to thee, * O Virgin Mary, thou hast trampled down all the heresies in the whole world."
- psalms: [96]
antiphon:
la: "Dignáre me * laudáre te, Virgo sacráta: da mihi virtútem contra hostes tuos."
en: "Holy Virgin, my praise by thee accepted be; * give me strength against thine enemies."
- psalms: [97]
antiphon:
la: "Post partum, * Virgo, invioláta permansísti: Dei Génitrix, intercéde pro nobis."
en: "After thy delivery thou still remainest a virgin; * undefiled Mother of God, pray for us."
- psalms: [98]
antiphon:
la: "Descéndi * in hortum nucum, ut vidérem poma convállium, † et inspícerem, si floruísset vinea, et germinássent mala púnica, allelúja."
en: "I went down * into the garden of nuts, to see the fruits of the valleys, and to look if the vineyard had flourished, and the pomegranates budded."
versicle:
v:
la: "Adjuvábit eam Deus vultu suo."
en: "God shall help her with His countenance."
r:
la: "Deus in médio ejus, non commovébitur."
en: "God is in the midst of her, she shall not be moved."
nocturn3:
antiphon:
la: "Hortus conclúsus * es Dei Génitrix, hortus conclúsus, fons signátus: † surge própera, amíca mea, et veni."
en: "Thou art a garden enclosed, * O Mother of God, a garden enclosed, a fountain sealed: arise, make haste, my love, and come."
canticles:
- refs:
- { book: sir, chapter: 39, verses: "17-21" }
- refs:
- { book: isa, chapter: 61, verses: "10-11" }
- { book: isa, chapter: 62, verses: "1-3" }
- refs:
- { book: isa, chapter: 62, verses: "4-7" }
versicle:
v:
la: "Elégit eam Deus, et præelégit eam."
en: "God hath chosen her, and fore-chosen her."
r:
la: "In tabernáculo suo habitáre facit eam."
en: "He hath made her to dwell in His tabernacle."
+10 -7
View File
@@ -330,16 +330,19 @@ describe('resolveOrdo("matins", ...) Duplex+ weekday-feast (3-nocturn, non-Sunda
}); });
it('falls all the way back to the plain ferial weekday table, redistributed into 3 nocturns, when neither a proper nor a Common entry is authored', () => { it('falls all the way back to the plain ferial weekday table, redistributed into 3 nocturns, when neither a proper nor a Common entry is authored', () => {
// St. Anthony, Abbot (Duplex, Common of an Abbot -- no // St. Monica, Widow (Duplex, Common of a Widow -- no
// matins-psalmody-overrides category authored yet for either tier) // matins-psalmody-overrides category authored yet for either tier;
// -- 2029-01-17, a Wednesday, confirmed clean (no Sunday collision). // Common-of-an-Abbot no longer qualifies for this proof as of
const fallback = resolveOrdo('matins', '2029-01-17'); // 2026-08-27, now aliased to Common-of-a-Confessor) -- 2029-05-04, a
// Friday, confirmed clean (no Sunday collision, per her own
// saint-file comment).
const fallback = resolveOrdo('matins', '2029-05-04');
const psalms = fallback.parts.filter((p) => p.kind === 'psalm').map((p) => (p as { psalmNumber: number }).psalmNumber); const psalms = fallback.parts.filter((p) => p.kind === 'psalm').map((p) => (p as { psalmNumber: number }).psalmNumber);
// Ps 3 + 94, then Wednesday's own 9-psalm ferial table // Ps 3 + 94, then Friday's own 9-psalm ferial table
// (psalter-distribution.yml), not any Common-of-an-Abbot scheme. // (psalter-distribution.yml), not any Common-of-a-Widow scheme.
expect(psalms[0]).toBe(3); expect(psalms[0]).toBe(3);
expect(psalms[1]).toBe(94); expect(psalms[1]).toBe(94);
expect(psalms.slice(2)).toEqual(getPsalmsFor('matins', 'wednesday').map((r) => r.number)); expect(psalms.slice(2)).toEqual(getPsalmsFor('matins', 'friday').map((r) => r.number));
expect(fallback.parts.some((p) => p.kind === 'te-deum')).toBe(true); expect(fallback.parts.some((p) => p.kind === 'te-deum')).toBe(true);
expect(fallback.parts.some((p) => p.kind === 'canticle')).toBe(false); expect(fallback.parts.some((p) => p.kind === 'canticle')).toBe(false);
}); });