Compare commits
3 Commits
f550412c61
...
9ba09964ea
| Author | SHA1 | Date | |
|---|---|---|---|
| 9ba09964ea | |||
| f9a28ec001 | |||
| 2bac28d36c |
@@ -43,10 +43,11 @@ across every hour and content type in this app.
|
||||
`src/data/scripture/` — long-term project, explicitly deferred; Matins scripture
|
||||
citations resolve to `missing` text until it lands.
|
||||
- Matins psalmody overrides for a Duplex+ weekday feast (see "Matins psalmody overrides"
|
||||
below): mechanism built, keyed per-Common-category, one proof authored (St. Lawrence).
|
||||
Every other Common category (~75 saints across Apostle, Martyr(s), Confessor, Virgin,
|
||||
Doctor, etc.) still falls back to the plain ferial weekday table, redistributed into 3
|
||||
nocturns, until its own category's real psalmody is authored.
|
||||
below): mechanism refactored to category-keyed (`categories/*.yml` + `saints/*.yml`), two
|
||||
categories authored (Common of a Martyr via St. Lawrence, Common of an Apostle via St.
|
||||
Andrew). Every other Common category (~73 saints across Confessor, Virgin, Doctor, etc.)
|
||||
still falls back to the plain ferial weekday table, redistributed into 3 nocturns, until
|
||||
its own category's real psalmody is authored.
|
||||
- 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 —
|
||||
see "Octave content" below. St. Frances of Rome's/
|
||||
@@ -1796,6 +1797,51 @@ block (Lawrence's own psalmody resolving `verified` in both languages across all
|
||||
3 canticles, plus the ferial-fallback case via St. Ignatius). `npm test` (371 tests), `npm run
|
||||
build`, and `tsc --noEmit` all pass.
|
||||
|
||||
### Matins psalmody overrides — category-keyed refactor + second proof, St. Andrew (2026-08)
|
||||
|
||||
Refactored `hours/matins-psalmody-overrides.ts` per its own doc comment's flagged next step:
|
||||
`data/hours/matins-psalmody-overrides/` now splits into `saints/*.yml` (per-saint proper
|
||||
antiphon overrides, same shape as before, St. Lawrence migrated in place unchanged) and a new
|
||||
`categories/*.yml` store recording each Common category's own generic psalm-number/versicle/
|
||||
canticle-ref scheme, live-verified from a saint with *no* proper antiphon of his own (so his
|
||||
output is the category default outright). Two categories authored this pass:
|
||||
|
||||
- **`common-of-a-martyr`**: from St. Ignatius of Antioch (2029-02-01, "vide C2" — entirely
|
||||
Common, no proper text). Confirms Lawrence's one real deviation from the shared scheme worth
|
||||
remembering: his own Nocturn 2 has Ps 16 where the Common default (and Ignatius) has Ps 64 —
|
||||
a genuine proper substitution, not a transcription slip. Also confirmed (reference engine's
|
||||
`CommuneM/C2a.txt`) that **Common-of-a-Martyr-Bishop's own Matins psalmody redirects outright
|
||||
to Common-of-a-Martyr** — the two share one scheme, not two; checked all three Duplex+
|
||||
Common-of-a-Martyr-Bishop saints on the calendar (Ss. Ignatius, Callistus I, Boniface of
|
||||
Mainz) and none has a proper antiphon of his own, so this category currently has no saint
|
||||
eligible for its own `saints/` entry under the proper-only policy below — a real, not
|
||||
accidental, gap.
|
||||
- **`common-of-an-apostle`**: from St. Bartholomew (2026-08-24, generic "In omnem terram"
|
||||
antiphon). Second live proof authored against it: **St. Andrew** (`saints/st-andrew.yml`,
|
||||
2026-11-30, his own day outright that year), whose psalm numbers match the category's
|
||||
generic scheme in every one of the 12 Nocturn-1/2 slots — only the antiphon text is his own
|
||||
proper narration of his call and martyrdom. New scripture chapters authored for his Nocturn 3
|
||||
canticles: `data/scripture/{isa-61,sap-3,sap-10}.yml`.
|
||||
|
||||
**Category files are reference/documentation content only** — not consulted by
|
||||
`getMatinsPsalmodyOverride`, which still does a plain per-saint lookup exactly as before.
|
||||
Direct decision from the user (2026-08): a saint without their own `saints/` entry stays on the
|
||||
plain ferial-table fallback, never falls through to a category's generic antiphon text, even
|
||||
though that text is real and verified — "prefer real text over missing" is deliberately *not*
|
||||
extended to this case yet. The category files exist so the next proper-antiphon saint authored
|
||||
in an already-proven category doesn't have to re-derive/re-verify the same shared psalm numbers
|
||||
and versicles from scratch, and as the reference point for spotting a saint's real deviations
|
||||
(like Lawrence's Ps 16) from noise.
|
||||
|
||||
Live-verified end-to-end: `tests/hours/matins.test.ts`'s new "second Duplex+ weekday-feast
|
||||
proof" describe block (Andrew's own psalmody resolving `verified` in both languages across all
|
||||
12 psalms + 3 canticles). `npm test` (374 tests), `npm run build`, and `tsc --noEmit` all pass.
|
||||
|
||||
**Still open**: ~73 remaining Duplex+ saints across the other Common categories (Confessor,
|
||||
Confessor-Bishop, Virgin, Doctor, etc. — the largest population, per the earlier estimate) —
|
||||
each needs its own category file (one live `prayMatutinum` query against a no-proper-antiphon
|
||||
saint) before any of its own saints' proper antiphons can be authored against it.
|
||||
|
||||
### Calendar precedence: a tie against an octave's own elevated closing day now favors the octave (2026-08)
|
||||
|
||||
Real bug found and fixed, same session as the Matins psalmody fix above, discovered while
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
# Generic Common-of-a-Martyr Matins psalmody, live-verified against
|
||||
# Divinum Officium (Monastic Tridentinum 1617, command=prayMatutinum,
|
||||
# 2029-02-01 -- St. Ignatius of Antioch, Common of a Martyr-Bishop, whose
|
||||
# own rule file is "vide C2" i.e. entirely from this Common, no proper
|
||||
# antiphon of his own -- so his output *is* this category's generic
|
||||
# scheme, not a saint-specific deviation). Also confirmed
|
||||
# (data/hours/CommuneM/C2a.txt in the reference engine) that
|
||||
# Common-of-a-Martyr-Bishop's own Matins psalmody redirects outright to
|
||||
# this same Common-of-a-Martyr file -- the two categories share one
|
||||
# scheme, not two.
|
||||
#
|
||||
# This file is documentation/reference content only, not yet wired into
|
||||
# `hours/matins-psalmody-overrides.ts`'s resolution -- per this project's
|
||||
# "stay on the ferial fallback until proper antiphon text is authored
|
||||
# per-saint" decision (2026-08), a saint with no entry under
|
||||
# matins-psalmody-overrides/saints/ still falls all the way back to the
|
||||
# plain ferial weekday table, never to this generic Common text. Recorded
|
||||
# here so the next Common-of-a-Martyr(-Bishop) saint's own proper file
|
||||
# doesn't have to re-derive/re-verify these same shared psalm numbers and
|
||||
# versicles from scratch, and as the reference point for what "differs
|
||||
# from Common" means when authoring one (see
|
||||
# matins-psalmody-overrides/saints/st-lawrence.yml's own note on its one
|
||||
# genuine deviation, Ps 16 vs this file's Ps 64 in Nocturn 2).
|
||||
id: common-of-a-martyr
|
||||
nocturn1:
|
||||
groups:
|
||||
- psalms: [1]
|
||||
antiphon:
|
||||
la: "In lege Dómini * fuit volúntas ejus die ac nocte."
|
||||
en: "His delight * was in the law of the Lord day and night."
|
||||
- psalms: [2]
|
||||
antiphon:
|
||||
la: "Prǽdicans * præcéptum Dómini constitútus est in monte sancto ejus."
|
||||
en: "The Lord hath set him * upon His holy hill, to declare His decree."
|
||||
- psalms: [4]
|
||||
antiphon:
|
||||
la: "Fílii hóminum * scitóte quia Dóminus sanctum suum mirificávit."
|
||||
en: "O ye sons of men, * know that the Lord hath set apart him that is holy for Himself."
|
||||
- psalms: [5]
|
||||
antiphon:
|
||||
la: "Scuto bonæ voluntátis * tuæ coronásti eum Dómine."
|
||||
en: "O Lord, Thou hast compassed him * with thy favour as with a shield."
|
||||
- psalms: [8]
|
||||
antiphon:
|
||||
la: "In univérsa terra * glória et honóre coronásti eum."
|
||||
en: "Thou hast crowned him * with glory and honour in all the earth."
|
||||
- psalms: [10]
|
||||
antiphon:
|
||||
la: "Justus Dóminus, * et justítiam diléxit: æquitátem vidit vultus ejus."
|
||||
en: "The righteous Lord * loveth righteousness; His countenance doth behold uprightness."
|
||||
versicle:
|
||||
v:
|
||||
la: "Glória et honóre coronásti eum, Dómine."
|
||||
en: "Thou hast crowned him with glory and honour, O Lord."
|
||||
r:
|
||||
la: "Et constituísti eum super ópera mánuum tuárum."
|
||||
en: "And madest him to have dominion over the works of thy hands."
|
||||
nocturn2:
|
||||
groups:
|
||||
- psalms: [14]
|
||||
antiphon:
|
||||
la: "Habitábit * in tabernáculo tuo: requiéscet in monte sancto tuo."
|
||||
en: "He shall dwell * in thy tabernacle, He shall rest upon thy holy hill."
|
||||
- psalms: [20]
|
||||
antiphon:
|
||||
la: "Posuísti, Dómine, * super caput ejus corónam de lápide pretióso."
|
||||
en: "O Lord, Thou hast set a crown * of precious stones upon his head."
|
||||
- psalms: [23]
|
||||
antiphon:
|
||||
la: "Hic accípiet * benedictiónem a Dómino, et misericórdiam a Deo salutári suo; qui hæc est generátio quæréntium Dóminum."
|
||||
en: "He shall receive * a blessing from the Lord, and mercy from God his Saviour."
|
||||
- psalms: [63]
|
||||
antiphon:
|
||||
la: "Lætábitur justus * in Dómino et sperábit in eo, et laudabúntur omnes recti corde."
|
||||
en: "The just shall rejoice * in the Lord, and shall hope in him: and all the upright in heart shall be praised."
|
||||
- psalms: [64]
|
||||
antiphon:
|
||||
la: "Beátus * quem elegísti Dómine, habitábit in átriis tuis."
|
||||
en: "Blessed is * he whom thou hast chosen: he shall dwell in thy courts."
|
||||
- psalms: [91]
|
||||
antiphon:
|
||||
la: "Justus ut palma florébit: sicut cedrus Líbani multiplicábitur."
|
||||
en: "The just shall flourish * like the palm tree: he shall grow up like the cedar of Libanus."
|
||||
versicle:
|
||||
v:
|
||||
la: "Posuísti, Dómine, super caput ejus."
|
||||
en: "O Lord, Thou hast set a crown of precious stones."
|
||||
r:
|
||||
la: "Corónam de lápide pretióso."
|
||||
en: "Upon his head."
|
||||
nocturn3:
|
||||
antiphon:
|
||||
la: "Qui vult veníre post me, * ábnegat semetípsum, et tollet crucem suam, et sequátur me."
|
||||
en: "If any man will come after me, * let him deny himself, and take up his cross daily, and follow me."
|
||||
canticles:
|
||||
- refs:
|
||||
- { book: sir, chapter: 14, verses: "22" }
|
||||
- { book: sir, chapter: 15, verses: "3-4" }
|
||||
- { book: sir, chapter: 15, verses: "6" }
|
||||
- refs:
|
||||
- { book: jer, chapter: 17, verses: "7-8" }
|
||||
- refs:
|
||||
- { book: sir, chapter: 31, verses: "8-11" }
|
||||
versicle:
|
||||
v:
|
||||
la: "Magna est glória ejus in salutári tuo."
|
||||
en: "His glory is great in thy salvation."
|
||||
r:
|
||||
la: "Glóriam et magnum decórem impónes super eum."
|
||||
en: "Honour and great majesty shalt Thou lay upon him."
|
||||
@@ -0,0 +1,102 @@
|
||||
# Generic Common-of-an-Apostle Matins psalmody, live-verified against
|
||||
# Divinum Officium (Monastic Tridentinum 1617, command=prayMatutinum,
|
||||
# 2026-08-24 -- St. Bartholomew, whose own Nocturn 1 opens with the
|
||||
# generic "In omnem terram" antiphon rather than a proper one of his own,
|
||||
# i.e. this Common's own default scheme). Cross-checked against St.
|
||||
# Andrew's own proper Matins (2026-11-30): identical psalm numbers in
|
||||
# every slot across all three nocturns, only the antiphon text differs
|
||||
# (his own proper text narrating his call and martyrdom) -- confirming
|
||||
# the psalm *numbers* here are the shared Common-of-an-Apostle pool, same
|
||||
# pattern already established for Common-of-a-Martyr (see that category
|
||||
# file's own doc comment).
|
||||
#
|
||||
# Reference/documentation content only, not wired into
|
||||
# `hours/matins-psalmody-overrides.ts`'s resolution -- see
|
||||
# common-of-a-martyr.yml's own doc comment for why (the "stay on the
|
||||
# ferial fallback until proper antiphon text is authored per-saint"
|
||||
# decision, 2026-08).
|
||||
id: common-of-an-apostle
|
||||
nocturn1:
|
||||
groups:
|
||||
- psalms: [18]
|
||||
antiphon:
|
||||
la: "In omnem terram * exívit sonus eórum, et in fines orbis terræ verba eórum."
|
||||
en: "Their sound * hath gone forth into all the earth: and their words unto the ends of the world."
|
||||
- psalms: [33]
|
||||
antiphon:
|
||||
la: "Clamavérunt justi, * et Dóminus exaudívit eos."
|
||||
en: "The just cried * and the Lord heard them."
|
||||
- psalms: [44]
|
||||
antiphon:
|
||||
la: "Constítues eos * príncipes super omnem terram: mémores erunt nóminis tui, Dómine."
|
||||
en: "Thou shalt make them princes * over all the earth. They shall remember thy name, O Lord."
|
||||
- psalms: [46]
|
||||
antiphon:
|
||||
la: "Príncipes populórum * congregáti sunt cum Deo Ábraham."
|
||||
en: "The princes of the people * are gathered together, with the God of Abraham."
|
||||
- psalms: [60]
|
||||
antiphon:
|
||||
la: "Dedísti hereditátem * timéntibus nomen tuum, Dómine."
|
||||
en: "Thou hast given an inheritance * to them that fear thy name, O Lord."
|
||||
- psalms: [63]
|
||||
antiphon:
|
||||
la: "Annuntiavérunt * ópera Dei, et facta ejus intellexérunt."
|
||||
en: "They declared * the works of God, and understood his doings."
|
||||
versicle:
|
||||
v:
|
||||
la: "In omnem terram exívit sonus eórum."
|
||||
en: "Their sound hath gone forth into all the earth:"
|
||||
r:
|
||||
la: "Et in fines orbis terræ verba eórum."
|
||||
en: "And their words unto the ends of the world."
|
||||
nocturn2:
|
||||
groups:
|
||||
- psalms: [74]
|
||||
antiphon:
|
||||
la: "Exaltabúntur * córnua justi, allelúja."
|
||||
en: "The horns of the just * shall be exalted. Alleluia."
|
||||
- psalms: [95]
|
||||
antiphon:
|
||||
la: "Annuntiavérunt * inter gentes glóriam Dómini, in ómnibus pópulis mirabília ejus."
|
||||
en: "Declare his glory among the Gentiles: * his wonders among all people."
|
||||
- psalms: [96]
|
||||
antiphon:
|
||||
la: "Lux orta est * justo, allelúja, rectis corde lætítia, allelúja."
|
||||
en: "Light is risen * to the just, alleluia, and joy to the right of heart. Alleluia."
|
||||
- psalms: [97]
|
||||
antiphon:
|
||||
la: "Déxtera Dómini * salvávit eos, et bráchium sanctum ejus, allelúja."
|
||||
en: "His right hand hath wrought for him salvation, * and his arm is holy, alleluia."
|
||||
- psalms: [98]
|
||||
antiphon:
|
||||
la: "Custodiébant * testimónia ejus, et præcépta ejus, allelúja."
|
||||
en: "They kept his testimonies, * and the commandment which he gave them. Alleluia."
|
||||
- psalms: [100]
|
||||
antiphon:
|
||||
la: "Perambulábant * in innocéntia cordis sui, in medio domus tuæ."
|
||||
en: "I walked in the innocence of my heart, * in the midst of my house."
|
||||
versicle:
|
||||
v:
|
||||
la: "Constítues eos príncipes super omnem terram."
|
||||
en: "Thou shalt make them princes over all the earth."
|
||||
r:
|
||||
la: "Mémores erunt nóminis tui, Dómine."
|
||||
en: "They shall remember thy name, O Lord."
|
||||
nocturn3:
|
||||
antiphon:
|
||||
la: "Gaudéte * et exsultáte, quia nómina vestra scripta sunt in cælis, dicit Dóminus."
|
||||
en: "Be glad and rejoice, * for your names are written in heaven, said the Lord."
|
||||
canticles:
|
||||
- refs:
|
||||
- { book: isa, chapter: 61, verses: "6-9" }
|
||||
- refs:
|
||||
- { book: sap, chapter: 3, verses: "7-9" }
|
||||
- refs:
|
||||
- { book: sap, chapter: 10, verses: "17-21" }
|
||||
versicle:
|
||||
v:
|
||||
la: "Nimis honoráti sunt amíci tui, Deus."
|
||||
en: "Thy friends, O Lord, are made exceedingly honourable."
|
||||
r:
|
||||
la: "Nimis confortátus est principátus eórum."
|
||||
en: "Their principality is exceedingly strengthened."
|
||||
@@ -0,0 +1,103 @@
|
||||
# Verified against Divinum Officium (Monastic Tridentinum 1617), live
|
||||
# prayMatutinum query (2026-08-18, checked against his own day outright,
|
||||
# 2026-11-30 -- "S. Andreæ Apostoli", not transferred that year). Second
|
||||
# live-verified proof for the Matins-psalmody-override mechanism, after
|
||||
# St. Lawrence (see matins-psalmody-overrides/saints/st-lawrence.yml) --
|
||||
# this one proves the Common-of-an-Apostle category (see
|
||||
# matins-psalmody-overrides/categories/common-of-an-apostle.yml), whose
|
||||
# generic scheme this file's own psalm numbers match exactly in every
|
||||
# slot across all three nocturns; only the antiphon text is proper to
|
||||
# Andrew (narrating his own call by the Sea of Galilee and his own
|
||||
# martyrdom on the cross), matching the same category-shares-psalm-
|
||||
# numbers/saint-carries-antiphons pattern already established for
|
||||
# Common-of-a-Martyr.
|
||||
#
|
||||
# New scripture chapters authored for the canticles:
|
||||
# data/scripture/{isa-61,sap-3,sap-10}.yml (sparse, only the cited
|
||||
# verses, same convention as sir-14.yml etc.).
|
||||
id: st-andrew
|
||||
category: common-of-an-apostle
|
||||
nocturn1:
|
||||
groups:
|
||||
- psalms: [18]
|
||||
antiphon:
|
||||
la: "Vidit Dóminus * Petrum et Andréam, et vocávit eos."
|
||||
en: "The Lord saw Peter and Andrew, * and He called them."
|
||||
- psalms: [33]
|
||||
antiphon:
|
||||
la: "Veníte post me, * dicit Dóminus, fáciam vos fíeri piscatóres hóminum."
|
||||
en: "Follow Me, and I will make you fishers of men, * saith the Lord."
|
||||
- psalms: [44]
|
||||
antiphon:
|
||||
la: "Relíctis rétibus suis, * secúti sunt Dóminum Redemptórem."
|
||||
en: "And they left their nets, * and followed the Lord their Saviour."
|
||||
- psalms: [46]
|
||||
antiphon:
|
||||
la: "Christus me misit, * ad istam provínciam, in qua non parvum pópulum aquisívi."
|
||||
en: "Christ sent me * to this province, in which I have acquired not a small number of people."
|
||||
- psalms: [60]
|
||||
antiphon:
|
||||
la: "Ego si crucis * patíbulum expavéscerem, † crucis glóriam non prædicárem."
|
||||
en: "If I become terrified * at the gibbet of the Cross, I will not show forth the glory of the Cross."
|
||||
- psalms: [63]
|
||||
antiphon:
|
||||
la: "Dignum sibi Dóminus * computávit Mártyrem, quem vocávit Apóstolum, dum esset in mari, allelúja."
|
||||
en: "Whom the Lord called to be His Apostle, * when he was by the sea, him also He counted worthy to be His martyr. Alleluia."
|
||||
versicle:
|
||||
v:
|
||||
la: "In omnem terram exívit sonus eórum."
|
||||
en: "Their sound hath gone forth into all the earth:"
|
||||
r:
|
||||
la: "Et in fines orbis terræ verba eórum."
|
||||
en: "And their words unto the ends of the world."
|
||||
nocturn2:
|
||||
groups:
|
||||
- psalms: [74]
|
||||
antiphon:
|
||||
la: "Videns Andréas * crucem, cum gáudio dicébat: † Quia amátor tui semper fui, et desiderávi te amplécti, o bona crux."
|
||||
en: "Seeing the cross, * Andrew said with joy, I have always been your lover, and desired to embrace you, O good cross."
|
||||
- psalms: [95]
|
||||
antiphon:
|
||||
la: "Diléxit Andréam * Dóminus in odórem suavitátis."
|
||||
en: "Andrew was to the Lord as a sweet savour, * which He loved exceedingly."
|
||||
- psalms: [96]
|
||||
antiphon:
|
||||
la: "Bíduo vivens * pendébat in cruce beátus Andréas pro Christi nómine, et docébat pópulum."
|
||||
en: "The blessed Andrew hung alive upon the cross for two days * for Christ's Name's sake, and, all the while, he taught the people."
|
||||
- psalms: [97]
|
||||
antiphon:
|
||||
la: "Non me permíttas, Dómine, * fámulum tuum a te separári: tempus est ut commendétur terræ corpus meum, et me ad te veníre jubéas."
|
||||
en: "Suffer not thy servant, O Lord, to be parted from thee * the hour is come to lay my body in the earth, and for thee to bid me come unto thyself."
|
||||
- psalms: [98]
|
||||
antiphon:
|
||||
la: "Andréas vero rogábat pópulum, * ut non impedíret passiónem ipsíus."
|
||||
en: "But Andrew besought the people * not to hinder his passion."
|
||||
- psalms: [100]
|
||||
antiphon:
|
||||
la: "Accipe me ab homínibus * et redde me magístro meo: ut per te me recípiat, qui per te me redémit, allelúja."
|
||||
en: "Welcome me from among men and join me again to my Master; * that, as by thee He redeemed me, so by thee also He may take me unto Himself. Alleluia."
|
||||
versicle:
|
||||
v:
|
||||
la: "Constítues eos príncipes super omnem terram."
|
||||
en: "Thou shalt make them princes over all the earth."
|
||||
r:
|
||||
la: "Mémores erunt nóminis tui, Dómine."
|
||||
en: "They shall remember thy name, O Lord."
|
||||
nocturn3:
|
||||
antiphon:
|
||||
la: "Unus ex duóbus, * qui secúti sunt Dóminum, erat Andréas, frater Simónis Petri, allelúja."
|
||||
en: "One of the two * who followed the Lord was Andrew, the brother of Simon Peter, Alleluia."
|
||||
canticles:
|
||||
- refs:
|
||||
- { book: isa, chapter: 61, verses: "6-9" }
|
||||
- refs:
|
||||
- { book: sap, chapter: 3, verses: "7-9" }
|
||||
- refs:
|
||||
- { book: sap, chapter: 10, verses: "17-21" }
|
||||
versicle:
|
||||
v:
|
||||
la: "Nimis honoráti sunt amíci tui, Deus."
|
||||
en: "Thy friends, O Lord, are made exceedingly honourable."
|
||||
r:
|
||||
la: "Nimis confortátus est principátus eórum."
|
||||
en: "Their principality is exceedingly strengthened."
|
||||
+17
@@ -29,7 +29,24 @@
|
||||
# chapters authored for this: data/scripture/{sir-14,sir-15,jer-17,sir-31}.yml
|
||||
# (all sparse, only the cited verses -- same convention as sir-36.yml's
|
||||
# own Sunday-canticle transcription).
|
||||
#
|
||||
# `category: common-of-a-martyr` links this to
|
||||
# data/hours/matins-psalmody-overrides/categories/common-of-a-martyr.yml,
|
||||
# the generic Common-of-a-Martyr scheme authored from St. Ignatius of
|
||||
# Antioch's own live-verified Matins (2029-02-01 -- his own file has no
|
||||
# proper antiphon, "vide C2" i.e. entirely from Common, confirming his
|
||||
# psalmody *is* the category default). Lawrence's own file stays fully
|
||||
# self-contained (own psalm numbers + antiphons, not merged with the
|
||||
# category file at load time) -- the category link is documentation/
|
||||
# cross-reference only, not a runtime merge, per this project's "stay on
|
||||
# the ferial fallback until proper antiphon text is authored per-saint"
|
||||
# decision (2026-08): a saint without an entry here still gets no
|
||||
# override, never the category's generic antiphon text. Note one real
|
||||
# divergence from the category default worth remembering: Lawrence's own
|
||||
# Nocturn 2 has Ps 16 in the slot where the plain Common default (and
|
||||
# Ignatius) has Ps 64 -- his own proper psalm selection, not a typo.
|
||||
id: st-lawrence
|
||||
category: common-of-a-martyr
|
||||
nocturn1:
|
||||
groups:
|
||||
- psalms: [1]
|
||||
@@ -0,0 +1,49 @@
|
||||
# Isaiah 61:6-9, transcribed from a live Divinum Officium query (Monastic
|
||||
# Tridentinum 1617, command=prayMatutinum, 2026-08-18 -- St. Andrew's own
|
||||
# day, 2026-11-30, Matins Nocturn III's first canticle). Only these verses
|
||||
# are authored; the rest of the chapter is unauthored. Same convention as
|
||||
# isa-33.yml: each Latin half-verse is its own list entry (repeated verse
|
||||
# number), English attached to the first half only.
|
||||
book: isa
|
||||
chapter: 61
|
||||
verses:
|
||||
- n: 6
|
||||
text:
|
||||
la: "Vos autem sacerdótes Dómini vocabímini: * minístri Dei nostri, dicétur vobis:"
|
||||
en: "But you shall be called the priests of the Lord: to you it shall be said: You ministers of our God:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 6
|
||||
text:
|
||||
la: "Fortitúdinem géntium comedétis, * et in glória eárum superbiétis."
|
||||
en: "You shall eat the riches of the Gentiles, and you shall pride yourselves in their glory."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 7
|
||||
text:
|
||||
la: "Pro confusióne vestra dúplici et rubóre, * laudábunt partem suam;"
|
||||
en: "For your double confusion and shame, they shall praise their part:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 7
|
||||
text:
|
||||
la: "Propter hoc in terra sua duplícia possidébunt, * lætítia sempitérna erit eis."
|
||||
en: "Therefore shall they receive double in their land, everlasting joy shall be unto them."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 8
|
||||
text:
|
||||
la: "Quia ego Dóminus díligens judícium, * et ódio habens rapínam in holocáusto:"
|
||||
en: "For I am the Lord that loves judgment, and hates robbery in a holocaust:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 8
|
||||
text:
|
||||
la: "Et dabo opus eórum in veritáte, * et fœdus perpétuum fériam eis."
|
||||
en: "And I will make their work in truth, and I will make a perpetual covenant with them."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 9
|
||||
text:
|
||||
la: "Et scient in géntibus semen eórum, * et germen eórum in médio populórum:"
|
||||
en: "And they shall know their seed among the Gentiles, and their offspring in the midst of peoples:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 9
|
||||
text:
|
||||
la: "Omnes qui víderint eos cognóscent illos, * quia isti sunt semen, cui benedíxit Dóminus."
|
||||
en: "All that shall see them, shall know them, that these are the seed which the Lord has blessed."
|
||||
status: { la: verified, en: verified }
|
||||
@@ -0,0 +1,38 @@
|
||||
# Wisdom 10:17-21, transcribed from a live Divinum Officium query
|
||||
# (Monastic Tridentinum 1617, command=prayMatutinum, 2026-08-18 -- St.
|
||||
# Andrew's own day, 2026-11-30, Matins Nocturn III's third canticle --
|
||||
# the source labels it "Ibid. 10:17-21", i.e. still Wisdom). Only these
|
||||
# verses are authored; the rest of the chapter is unauthored.
|
||||
book: sap
|
||||
chapter: 10
|
||||
verses:
|
||||
- n: 17
|
||||
text:
|
||||
la: "Réddidit Deus justis mercédem labórum suórum, * et dedúxit illos in via mirábili:"
|
||||
en: "And God rendered to the just the wages of their labours, and conducted them in a wonderful way:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 17
|
||||
text:
|
||||
la: "Et fuit illis in velaménto diéi, * et in luce stellárum per noctem;"
|
||||
en: "And he was to them for a covert by day, and for the light of stars by night:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 18
|
||||
text:
|
||||
la: "Tránstulit illos per mare Rubrum, * et transvéxit illos per aquam nímiam."
|
||||
en: "And he brought them through the Red Sea, and carried them over through a great water."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 19
|
||||
text:
|
||||
la: "Inimícos autem illórum demérsit in mare, * et ab altitúdine inferórum edúxit illos."
|
||||
en: "But their enemies he drowned in the sea, and from the depth of hell he brought them out."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 20
|
||||
text:
|
||||
la: "Ideo justi tulérunt spólia impiórum, * et decantavérunt, Dómine, nomen sanctum tuum,"
|
||||
en: "Therefore the just took the spoils of the wicked, and they sung to your holy name, O Lord,"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 21
|
||||
text:
|
||||
la: "Et victrícem manum tuam laudavérunt páriter: quóniam sapiéntia apéruit os mutórum, * et línguas infántium fecit disértas."
|
||||
en: "And they praised with one accord your victorious hand, for wisdom opened the mouth of the dumb, and made the tongues of infants eloquent."
|
||||
status: { la: verified, en: verified }
|
||||
@@ -0,0 +1,27 @@
|
||||
# Wisdom 3:7-9, transcribed from a live Divinum Officium query (Monastic
|
||||
# Tridentinum 1617, command=prayMatutinum, 2026-08-18 -- St. Andrew's own
|
||||
# day, 2026-11-30, Matins Nocturn III's second canticle). Only these
|
||||
# verses are authored; the rest of the chapter is unauthored.
|
||||
book: sap
|
||||
chapter: 3
|
||||
verses:
|
||||
- n: 7
|
||||
text:
|
||||
la: "Fulgébunt justi, * et tamquam scintíllæ in arundinéto discúrrent."
|
||||
en: "The just shall shine, and shall run to and fro like sparks among the reeds."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 8
|
||||
text:
|
||||
la: "Judicábunt natiónes, et dominabúntur pópulis, * et regnábit Dóminus illórum in perpétuum."
|
||||
en: "They shall judge nations, and rule over people, and their Lord shall reign forever."
|
||||
status: { la: verified, en: verified }
|
||||
- n: 9
|
||||
text:
|
||||
la: "Qui confídunt in illo, intélligent veritátem, * et fidéles in dilectióne acquiéscent illi:"
|
||||
en: "They that trust in him, shall understand the truth: and they that are faithful in love shall rest in him:"
|
||||
status: { la: verified, en: verified }
|
||||
- n: 9
|
||||
text:
|
||||
la: "Quóniam donum * et pax est eléctis ejus."
|
||||
en: "For grace and peace is to his elect."
|
||||
status: { la: verified, en: verified }
|
||||
@@ -1,29 +1,35 @@
|
||||
/** Matins' own analogue of hours/lauds-psalmody-overrides.ts, but keyed
|
||||
* by Common category rather than per-saint: live-verified (see
|
||||
* data/hours/matins-psalmody-overrides/st-lawrence.yml's own header)
|
||||
* that the psalm *numbers* for Nocturns 1-2 are shared across saints of
|
||||
* the same Common category (a plain-Duplex Martyr and a plain-Duplex
|
||||
* Martyr-Bishop share all but one of the same twelve psalm numbers) —
|
||||
* only the antiphon text varies, proper to the individual saint when
|
||||
* authored, generic Common-of-* text otherwise. Deliberately the
|
||||
* opposite indexing choice from Lauds' own per-feast override (see that
|
||||
* file's own doc comment) — Lauds' 5-antiphon pool is shared across
|
||||
* every Duplex-majus+ feast regardless of category, so per-feast is the
|
||||
* natural key there; Matins' pool varies *by* category, so per-category
|
||||
* is the natural key here.
|
||||
/** Matins' own analogue of hours/lauds-psalmody-overrides.ts. Two data
|
||||
* stores, both keyed by id:
|
||||
*
|
||||
* - `data/hours/matins-psalmody-overrides/categories/*.yml` — the
|
||||
* generic Common-of-* Matins psalmody (psalm numbers, versicles,
|
||||
* canticle refs, and the plain Common antiphon text), one file per
|
||||
* `SaintRecord.common` category. Live-verified against a saint with no
|
||||
* proper antiphon of his own (so his own output *is* the category
|
||||
* default) — see e.g. `categories/common-of-a-martyr.yml`'s own doc
|
||||
* comment. Reference/documentation content only: not consulted by
|
||||
* `getMatinsPsalmodyOverride` below, per this project's "stay on the
|
||||
* ferial fallback until proper antiphon text is authored per-saint"
|
||||
* decision (2026-08) — a saint without their own entry in `saints/`
|
||||
* still falls all the way back to matins.ts's own plain ferial table,
|
||||
* never to a category's generic antiphon text. Recorded so the next
|
||||
* saint authored in an already-proven category doesn't have to
|
||||
* re-derive/re-verify the same shared psalm numbers and versicles.
|
||||
*
|
||||
* - `data/hours/matins-psalmody-overrides/saints/*.yml` — real proper
|
||||
* antiphon text for one specific saint (only authored where a saint
|
||||
* genuinely has proper text of their own, confirmed against the live
|
||||
* engine, not merely inherited Common text). Each carries its own
|
||||
* `category` field cross-referencing the file above, but is otherwise
|
||||
* fully self-contained (own psalm numbers, not merged with the
|
||||
* category file at load time) — a saint's proper psalmody occasionally
|
||||
* swaps one slot's psalm number from the category default too (see
|
||||
* `saints/st-lawrence.yml`'s own note), so per-saint files stay
|
||||
* authoritative rather than being computed as a diff.
|
||||
*
|
||||
* `id` is looked up against `hours/resolve-common.ts`'s
|
||||
* `resolveOfficeWinner(day).id` when it's sanctoral, exactly like every
|
||||
* other per-feast/per-category content lookup in this app — but the
|
||||
* `id` values populated so far are individual saint ids (St. Lawrence
|
||||
* proper), not Common-category ids, since only the live-verified proof
|
||||
* has been authored; extending this to a real Common-category key
|
||||
* (`common-of-a-martyr`, etc., matching `SaintRecord.common`) with
|
||||
* per-saint antiphon overrides layered on top is the deferred bulk-
|
||||
* content work (see TODO.md) — not built yet, so a saint without their
|
||||
* own entry here falls back to the plain ferial weekday table
|
||||
* (matins.ts's own fallback), not to some other saint's proper
|
||||
* antiphons. */
|
||||
* other per-feast/per-category content lookup in this app. */
|
||||
export interface MatinsPsalmodyGroup {
|
||||
psalms: number[];
|
||||
antiphon: Partial<Record<string, string>>;
|
||||
@@ -40,22 +46,42 @@ export interface MatinsPsalmodyNocturn {
|
||||
versicle: { v: Partial<Record<string, string>>; r: Partial<Record<string, string>> };
|
||||
}
|
||||
export interface MatinsPsalmodyOverride {
|
||||
id: string;
|
||||
category?: string;
|
||||
nocturn1: MatinsPsalmodyNocturn;
|
||||
nocturn2: MatinsPsalmodyNocturn;
|
||||
nocturn3: MatinsPsalmodyNocturn;
|
||||
}
|
||||
export interface MatinsPsalmodyCategory {
|
||||
id: string;
|
||||
nocturn1: MatinsPsalmodyNocturn;
|
||||
nocturn2: MatinsPsalmodyNocturn;
|
||||
nocturn3: MatinsPsalmodyNocturn;
|
||||
}
|
||||
|
||||
const modules = import.meta.glob<{ default: MatinsPsalmodyOverride }>(
|
||||
'../data/hours/matins-psalmody-overrides/*.yml',
|
||||
const saintModules = import.meta.glob<{ default: MatinsPsalmodyOverride }>(
|
||||
'../data/hours/matins-psalmody-overrides/saints/*.yml',
|
||||
{ eager: true },
|
||||
);
|
||||
const categoryModules = import.meta.glob<{ default: MatinsPsalmodyCategory }>(
|
||||
'../data/hours/matins-psalmody-overrides/categories/*.yml',
|
||||
{ eager: true },
|
||||
);
|
||||
|
||||
const overrides = new Map<string, MatinsPsalmodyOverride>();
|
||||
for (const mod of Object.values(modules)) {
|
||||
for (const mod of Object.values(saintModules)) {
|
||||
overrides.set(mod.default.id, mod.default);
|
||||
}
|
||||
|
||||
const categories = new Map<string, MatinsPsalmodyCategory>();
|
||||
for (const mod of Object.values(categoryModules)) {
|
||||
categories.set(mod.default.id, mod.default);
|
||||
}
|
||||
|
||||
export function getMatinsPsalmodyOverride(id: string | undefined): MatinsPsalmodyOverride | undefined {
|
||||
return id ? overrides.get(id) : undefined;
|
||||
}
|
||||
|
||||
export function getMatinsPsalmodyCategory(id: string | undefined): MatinsPsalmodyCategory | undefined {
|
||||
return id ? categories.get(id) : undefined;
|
||||
}
|
||||
|
||||
@@ -183,3 +183,40 @@ describe('resolveOrdo("matins", ...) Duplex+ weekday-feast (3-nocturn, non-Sunda
|
||||
expect(fallback.parts.some((p) => p.kind === 'canticle')).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('resolveOrdo("matins", ...) second Duplex+ weekday-feast proof — St. Andrew, Common of an Apostle', () => {
|
||||
// 2026-11-30 -- St. Andrew's own day outright ("S. Andreæ Apostoli",
|
||||
// not transferred that year: Nov 30 falls on a Monday, not a Sunday),
|
||||
// live-verified directly against the reference engine. Second proof
|
||||
// for the matins-psalmody-overrides mechanism after St. Lawrence, this
|
||||
// one for the Common-of-an-Apostle category (see
|
||||
// matins-psalmody-overrides/categories/common-of-an-apostle.yml and
|
||||
// its own st-andrew.yml).
|
||||
const ordo = resolveOrdo('matins', '2026-11-30');
|
||||
|
||||
it("uses St. Andrew's own proper psalmody across 3 nocturns plus a Te Deum", () => {
|
||||
const psalms = ordo.parts.filter((p) => p.kind === 'psalm').map((p) => (p as { psalmNumber: number }).psalmNumber);
|
||||
expect(psalms).toEqual([3, 94, 18, 33, 44, 46, 60, 63, 74, 95, 96, 97, 98, 100]);
|
||||
expect(ordo.parts.some((p) => p.kind === 'te-deum')).toBe(true);
|
||||
});
|
||||
|
||||
it("every Nocturn 1/2 psalm carries St. Andrew's own proper antiphon, verified in both languages", () => {
|
||||
const psalmParts = ordo.parts.filter((p) => p.kind === 'psalm') as { psalmNumber: number; antiphon?: { status: Record<string, string> } }[];
|
||||
const nocturnPsalms = psalmParts.filter((p) => ![3, 94].includes(p.psalmNumber));
|
||||
expect(nocturnPsalms).toHaveLength(12);
|
||||
for (const p of nocturnPsalms) {
|
||||
expect(p.antiphon?.status.la).toBe('verified');
|
||||
expect(p.antiphon?.status.en).toBe('verified');
|
||||
}
|
||||
});
|
||||
|
||||
it('has 3 real OT canticles in Nocturn 3, verified in both languages, sourced from the newly-authored Isaiah/Wisdom chapters', () => {
|
||||
const canticles = ordo.parts.filter((p) => p.kind === 'canticle') as { canticleId: string; text: { status: Record<string, string> } }[];
|
||||
expect(canticles).toHaveLength(3);
|
||||
expect(canticles.map((c) => c.canticleId)).toEqual(['isa-61-6-9', 'sap-3-7-9', 'sap-10-17-21']);
|
||||
for (const c of canticles) {
|
||||
expect(c.text.status.la).toBe('verified');
|
||||
expect(c.text.status.en).toBe('verified');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user