Compare commits

..

2 Commits

Author SHA1 Message Date
will b3a7176cb8 Add the O Antiphons (Dec 17-23) as an unconditional Vespers Magnificat override
Deploy / deploy (push) Successful in 1m27s
advent-4's own remaining Magnificat-antiphon gap turned out to be a
mechanism problem, not missing content: Dec 17-23 always carries one of
the seven "O Antiphons" at Vespers, keyed to the calendar date itself,
not to whichever Advent week (advent-3 or advent-4, varies by year)
happens to govern that date -- a single per-week file was structurally
the wrong shape.

Added vespers-o-antiphons.yml (MM-DD keyed) and a new lookup tier in
getMagnificatAntiphon, checked unconditionally ahead of both the
per-week temporal file and a real sanctoral winner's own antiphon --
direct instruction: the O Antiphon wins this one text slot on these
seven dates regardless of who otherwise wins the day (e.g. St. Thomas,
Dec 21, still keeps every other part of his own office). Two of the
seven (O Clavis David/O Oriens, Dec 20-21) couldn't be live-verified --
every reference-engine track routes those two dates through St.
Thomas's Vigil/feast instead, which this app's own vigil-of-st-thomas.yml
already documents diverging from -- so they're marked draft rather than
verified.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ME8QNPdEmHSbSx1r6VmDRG
2026-08-30 07:04:30 -04:00
will 66bd970fed Author the missing Vespers Magnificat antiphon for 52 temporal ids
Every temporal id had its Lauds (Benedictus) antiphon authored, but only
3 of 57 had the Vespers (Magnificat) counterpart -- a whole-calendar
gap exposed by 2026-08-29's Vespers rendering with no Magnificat
antiphon at all. Sourced from the reference engine's static Tempora/
Sancti files, same convention and per-id reference dates already
established for the Benedictus antiphons.

advent-4 and marian-saturday are the only two ids still missing one
(neither resolves from the static files alone) -- follow-up commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ME8QNPdEmHSbSx1r6VmDRG
2026-08-30 07:03:52 -04:00
57 changed files with 993 additions and 17 deletions
+113
View File
@@ -48,6 +48,12 @@ across every hour and content type in this app.
- The bulk Vulgate (Latin) + Douay-Rheims (English) scripture import into
`src/data/scripture/` — long-term project, explicitly deferred; Matins scripture
citations resolve to `missing` text until it lands.
- Vespers Magnificat antiphon: after the 2026-08-30 sweep plus the same-day O-Antiphon
follow-up (see "O Antiphons (Dec 17-23) added" below), only two narrow gaps remain —
Advent 4's own Sunday landing on Dec 24 specifically (outside the O-Antiphon range), and
`marian-saturday` (moot in practice — its own Vespers is never actually reachable, a
following Sunday always claims First Vespers first). Neither resolves from the static
reference files alone; would need a live-CGI query.
- Lauds/Vespers duplex-majus+ Common-category psalmody: 10 of 24 `SaintRecord.common`
categories authored (covering 19 ids via aliases) for Vespers, 9 of 24 (18 ids) for Lauds —
see "Lauds/Vespers duplex-majus+ Common-category psalmody" below and its follow-up entry.
@@ -4096,3 +4102,110 @@ rather than a drop. Regression test added (`tests/hours/compline.test.ts`, 2026-
Assumption, Duplex I. classis) confirming the short-form text (Kyrie/Pater/"Dómine, exáudi") is
present and the fuller exchanges ("Benedíctus es, Dómine.../Miserére nostri...") are absent.
`npm test` (543 passed), `tsc --noEmit`, and `npm run build` all pass.
### Vespers Magnificat antiphon — whole-calendar temporal-cycle gap closed, 52/54 (2026-08-30)
User flagged 2026-08-29's Vespers was missing its Magnificat antiphon. Root cause turned out to
be systematic, not date-specific: `getMagnificatAntiphon` (`hours/resolve-common.ts`) looks up
`${winner.id}-magnificat-antiphon` for a temporal winner, but of the 57 temporal ids with an
authored Lauds `-benedictus-antiphon.yml`, only 3 (`holy-name-of-jesus`, `immaculate-heart-of-mary`,
`circumcision`) had a matching Vespers `-magnificat-antiphon.yml` — every ordinary Sunday/named-feast
in the temporal cycle (all 24 `post-pentecost-NN` weeks, Advent, post-Epiphany, pre-Lent, Lent,
Passion/Palm Sunday, the whole Easter season, Pentecost, Christmas-octave Sunday, Christ the King)
had its Lauds antiphon but not its Vespers one, apparently missed whenever the Lauds sweep pulled
`[Ant 2]` from the reference engine's Tempora files but never followed up with `[Ant 3]`.
Sourced from the same static reference-engine files already used for the Benedictus sweep
(`../divinum-officium-reference/web/www/horas/{Latin,English}/Tempora/*.txt`), same occasion/date
as each id's own `-benedictus-antiphon.yml` sibling (its header comment already records the clean
verified date) — no live CGI needed, the Magnificat antiphon is baked into each static file's own
`[Ant 3]` block (sometimes an alias, e.g. `@:Ant 3_` or `@:Ant 1`, always resolved to its real text
before use, and always the *default*/Tridentine variant, never a `(rubrica cisterciensis...)` one).
`post-pentecost-01`..`23` map straight to `Tempora/PentNN-0.txt`; `post-pentecost-24` (the fixed
last Sunday) does *not* map to `Pent24-0` — cross-checked against its own already-authored
Benedictus antiphon and confirmed it actually reuses the leftover `post-epiphany-6` formulary
(`Tempora/Epi6-0.txt`), the classic "Sundays remaining over are supplied by the omitted
post-Epiphany Sundays" rubric, already implicit in this app's own resumed-Epiphany-Sunday overflow
logic. `post-epiphany-1` doesn't map to `Epi1-0.txt` (that file is Holy Family Sunday content in
the reference engine, a title mismatch against the already-authored Benedictus text) but to
`Epi1-0a.txt` ("Dominica infra Octavam Epiphaniæ"). `christ-the-king` (not a Tempora entry at all,
a 1925 addition) sourced from `Sancti/10-DU.txt` instead, matching its own Benedictus antiphon's
already-verified occasion.
**Two ids skipped, not fabricated**: `advent-4` (`Tempora/Adv4-0.txt` has no standalone `[Ant 3]`
at all — only `[Ant Vespera 3] @:Ant Laudes`, aliasing the whole 5-antiphon Lauds set rather than
one text, and which single entry the live engine actually picks isn't determinable from the static
file alone) and `marian-saturday` (the votive "Sanctæ Mariæ Sabbato" office's Magnificat antiphon
isn't in any static Tempora/Sancti/Commune file found — likely only resolvable via a live CGI
query, same as how its own Benedictus antiphon was originally sourced).
### O Antiphons (Dec 17-23) added — advent-4's own gap effectively closed (2026-08-30)
Follow-up the same day, prompted by a user report that 2026-08-29's own Vespers was missing its
Magnificat antiphon entirely for an unrelated reason (see the day-label winner-first fix earlier
this date) that turned out to expose this whole-calendar gap. Root cause of `advent-4`'s own
skip above, once actually investigated live (divinumofficium.com, Monastic Tridentinum 1617):
Dec 17-23 always carries one of the seven "O Antiphons" at Vespers, keyed to the *calendar date*
itself, not to whichever Advent week (`advent-3` or `advent-4`, depending on the year) happens to
govern that date — a single per-week static file was structurally the wrong shape for this from
the start, not just missing content.
Added `data/hours/vespers-o-antiphons.yml` (7 entries, `MM-DD` keyed) and a new lookup tier in
`hours/resolve-common.ts`'s `getMagnificatAntiphon`. 5 of the 7 (Dec 17/18/19/22/23)
live-verified directly. The remaining two — "O Clavis David" (Dec 20) and "O Oriens" (Dec 21) —
could not be: every version/track on the live engine (including plain Tridentine 1570) routes
those two dates through St. Thomas's Vigil/feast instead of the ferial Proper of the Time,
apparently a real modeling choice of that engine (a Vigil of an Apostle actually displacing the
ferial Magnificat antiphon), not an app quirk — and this app's own `vigil-of-st-thomas.yml`
already documents a deliberate divergence from exactly that engine behavior on this date (the
Vigil transfers away entirely here, per the ordinary privileged-feria/vigil rule). Marked `draft`
rather than `verified`: real, standard, universally-fixed O-Antiphon wording (unchanged across
every edition of the Roman/Monastic Breviary), just not confirmed against this app's own primary
live reference for lack of a clean query path — see the data file's own header.
**Follow-up the same day, direct user instruction**: the O Antiphon lookup was originally scoped
to only apply when the day's winner was still plain-temporal (i.e. it deferred to a real
sanctoral winner, same as every other tier in `getMagnificatAntiphon`). The user explicitly
wanted the O Antiphons to actually surface even against a real winning saint — St. Thomas (Dec
21, Duplex II. classis) otherwise wins that day outright with no Magnificat antiphon of his own
authored yet (a separate, pre-existing gap — no sanctoral saint has a
`${propers}-magnificat-antiphon.yml` at all), so "O Oriens" was structurally unreachable on its
own real date. Considered and rejected: lowering Thomas's rank so a ferial default would win Dec
20/21 instead — factually wrong (he really is Duplex II Class pre-1955) and would strip him of
his *entire* office (chapter/hymn/collect/Lauds antiphon too), not just Vespers' Magnificat.
Instead, moved the O-Antiphon lookup to the very top of `getMagnificatAntiphon`, checked
unconditionally before either the temporal or sanctoral branch — the O Antiphon now wins this one
specific text slot on Dec 17-23 full stop, regardless of who otherwise wins the day; every other
part of the office is untouched. Deliberate, explicit app-level design choice (not a
reconstruction of the reference engine's own Dec 20/21 behavior, which shows Thomas's own
antiphon there instead) — see the data file's own header for the reasoning, including why a
saint's own real Magnificat antiphon is still worth authoring later even knowing it would be
permanently unreachable at Vespers on whichever of these seven dates that saint occupies, under
*this* calendar's own construction: the user has a future user-editable calendar in mind, where a
differently-constructed calendar's own precedence might surface it. `tests/hours/vespers.test.ts`'s
Thomas-precedence case now asserts the opposite of its original intent (the O Antiphon wins, his
other office parts don't).
Net effect: `advent-4`'s practical gap is closed for every date this app's calendar can actually
reach — Dec 17-23 unconditionally now, including Dec 21 itself. One narrow residual sub-case
remains, not touched by this fix: if Advent 4's own *Sunday* itself lands on Dec 24 (the latest
possible date, outside the O-Antiphon range and excluded from the classic weekday-default
fallback since Sunday has none), it still resolves to `missing` — genuinely no source for that
one specific Sunday found yet. `marian-saturday` is unchanged by this pass (still skipped, per
above) — and turns out to be moot for Vespers specifically anyway: its own evening is never
actually reachable through `resolveOrdo`, since a following Sunday always claims First Vespers
over the preceding Saturday regardless of the Sunday's own rank (`calendar/vespers.ts`'s
`hasFirstVespers`).
New tests: `tests/hours/vespers.test.ts`'s "O Antiphons (Dec 17-23)" block (the Dec 19 case
end-to-end, plus the Thomas-precedence case); `tests/hours/resolve-common.test.ts`'s new
`getMagnificatAntiphon — classic weekday-default fallback` block replaces the old bare-ferial
`resolveOrdo` test with two synthetic-day unit tests instead, since no live date is left in this
app's calendar that still reaches that fallback tier through the real pipeline at all (every
other temporal id now has its own real content, per this whole sweep). `npm test` (556 tests)
and `tsc --noEmit` both pass; live-verified on the dev server (2026-08-29 and 2026-12-19).
52 new `src/data/propers/temporal/*-magnificat-antiphon.yml` files. `npm test` (553 passed) and
`tsc --noEmit` both pass; spot-checked live in the dev server that 2026-08-29's Vespers now shows
the Magnificat antiphon ("Quǽrite primum * regnum Dei et justítiam ejus...", `post-pentecost-14`'s
own).
+86
View File
@@ -0,0 +1,86 @@
# The seven "O Antiphons" (Dec 17-23): the classic pre-Christmas Vespers
# Magnificat antiphons, keyed by calendar date (`MM-DD`) rather than by
# any Advent-week temporal id -- unlike every other week's proper
# Magnificat antiphon (data/propers/temporal/advent-N-magnificat-
# antiphon.yml, one file per Advent week), these seven don't belong to a
# single Advent week at all, since Dec 17-23 can fall within either
# Advent's 3rd or 4th week depending on the year (Advent's own governing
# Sunday moves, see calendar/temporal-id.ts).
#
# See hours/resolve-common.ts's getMagnificatAntiphon for the date-keyed
# lookup this feeds -- checked *unconditionally*, ahead of both the
# per-week temporal file and a real sanctoral winner's own antiphon.
# Direct user instruction (2026-08-30): the O Antiphon always wins this
# one specific text slot on these seven dates, full stop, regardless of
# who otherwise wins the day -- e.g. St. Thomas, Duplex II. classis,
# Dec 21, still wins everything else about that day (chapter, hymn,
# collect, Lauds' own Benedictus antiphon), just not the Magnificat
# antiphon. This is a deliberate app-level design choice, not a
# reconstruction of the reference engine's own behavior (its live query
# shows Thomas's own antiphon on Dec 20/21 instead, see below) -- and it
# means a saint's own real Magnificat antiphon, once authored, is
# permanently unreachable at Vespers on whichever of these seven dates
# that saint happens to occupy, under *this* calendar's own construction.
# Kept on file anyway (worth having for a future differently-constructed,
# e.g. user-editable, calendar) rather than treated as pointless to
# author.
#
# 12-17/18/19/22/23 live-verified against Divinum Officium (Monastic
# Tridentinum 1617), Vespers live query, 2027-12-17/18/19/22/23 --
# genuinely clean dates in this app's own calendar (no sanctoral entry on
# any of the five, confirmed against data/calendar/sanctoral-calendar.yml).
#
# 12-20 ("O Clavis David") and 12-21 ("O Oriens") could NOT be
# live-verified the same way: every version/track on the live engine
# routes those two dates through St. Thomas's Vigil/feast (Dec 20/21)
# instead of the plain ferial Proper of the Time, even in the plain
# Tridentine 1570 track -- apparently a real modeling choice of that
# engine (a Vigil of an Apostle actually displacing the ferial Magnificat
# antiphon there), not an app-specific quirk. This app's own
# vigil-of-st-thomas.yml already documents a deliberate divergence from
# that engine on this exact date (the Vigil transfers away entirely here,
# per the ordinary privileged-feria/vigil rule, rather than claiming
# Second Vespers the way the live engine's Mass-only-commemoration
# modeling implies) -- so the plain "O Clavis David"/"O Oriens" text
# below, drawn from the standard, universally-fixed wording of these two
# antiphons (unchanged across every edition of the Roman/Monastic
# Breviary), is marked `draft` rather than `verified`: real, correctly
# sourced liturgical text, just not confirmed against this app's own
# primary live reference for lack of a clean query path.
"12-17":
antiphon:
la: "O Sapiéntia, * quæ ex ore Altíssimi prodiísti, attíngens a fine usque ad finem, fórtiter suavitérque dispónens ómnia: veni ad docéndum nos viam prudéntiæ."
en: "O Wisdom, * that comest out of the mouth of the Most High, that reachest from one end to another, and dost mightily and sweetly order all things; come, to teach us the way of prudence!"
"12-18":
antiphon:
la: "O Adonái, * et Dux domus Israël, qui Móysi in igne flammæ rubi apparuísti, et ei in Sina legem dedísti: veni ad rediméndum nos in brácchio exténto."
en: "O Adonai, * and Ruler of the house of Israel, who didst appear unto Moses in the burning bush, and gavest him the law in Sinai; come, to redeem us with an outstretched arm!"
"12-19":
antiphon:
la: "O radix Jesse * qui stas in signum populórum, super quem continébunt reges os suum, quem gentes deprecabúntur: veni ad liberándum nos, jam noli tardáre."
en: "O Root of Jesse, * which standest for an ensign of the people, at whom the kings shall shut their mouths, to whom the Gentiles shall seek; come to deliver us, make no tarrying!"
"12-20":
antiphon:
la: "O clavis David, * et sceptrum domus Israël; qui áperis, et nemo claudit; claudis, et nemo áperit: veni, et educ vinctum de domo cárceris, sedéntem in ténebris, et umbra mortis."
en: "O Key of David, * and Sceptre of the house of Israel, who openest and no man shutteth, who shuttest and no man openeth; come, and bring forth the prisoner from the prison-house, and him that sitteth in darkness and the shadow of death."
status: { la: draft, en: draft }
"12-21":
antiphon:
la: "O Oriens, * splendor lucis ætérnæ, et sol justítiæ: veni, et illúmina sedéntes in ténebris, et umbra mortis."
en: "O Dayspring, * Brightness of light everlasting, and Sun of righteousness; come, and enlighten them that sit in darkness and the shadow of death."
status: { la: draft, en: draft }
"12-22":
antiphon:
la: "O Rex géntium, * et desiderátus eárum, lapísque anguláris, qui facis útraque unum: veni, et salva hóminem, quem de limo formásti."
en: "O King of the Gentiles, * yea, and Desire thereof, O Cornerstone that makest of twain one; come to save man, whom thou hast made of the dust of the earth!"
"12-23":
antiphon:
la: "O Emmánuel, * Rex et légifer noster, exspectátio géntium, et Salvátor eárum: veni ad salvándum nos, Dómine, Deus noster."
en: "O Emmanuel, our King * and our Law-giver, Longing of the Gentiles, yea, and Salvation thereof; come to save us, O Lord our God!"
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-11-28 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: advent-1-magnificat-antiphon
text:
la: "Ne tímeas, María, * invenísti enim grátiam apud Dóminum: ecce concípies, et páries fílium, allelúja."
en: "Fear not, Mary, * for thou hast found grace with the Lord; behold, thou shalt conceive in thy womb, and bring forth a son. Alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-12-05 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: advent-2-magnificat-antiphon
text:
la: "Tu es, qui ventúrus es, * an álium exspectámus? Dícite Joánni quæ vidístis: Ad lumen rédeunt cæci, mórtui resúrgunt, páuperes evangelizántur, allelúja."
en: "Art thou he that art to come * or look we for another? Go and relate to John what you have seen: the blind see, the dead rise again, to the poor the gospel is preached. Alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-12-12 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: advent-3-magnificat-antiphon
text:
la: "Beáta es, María, * quæ credidísti Dómino: perficiéntur in te, quæ dicta sunt tibi a Dómino, allelúja."
en: "Blessed art thou, * O Mary, who hast believed the Lord, for there shall be a performance of those things which were told thee from the Lord. Alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,9 @@
# Verified against Divinum Officium ("Monastic Divino 1930"), Vespers live
# query, the last Sunday of October (2026-10-25).
id: christ-the-king-magnificat-antiphon
text:
la: "Habet in vestiménto * et in fémore suo scriptum: Rex regum, et Dóminus dominántium. Ipsi glória et impérium, in sǽcula sæculórum."
en: "And he hath on his garment, * and on his thigh written: King of kings, and Lord of lords. To him be glory and empire for ever and ever."
status:
la: verified
en: verified
@@ -0,0 +1,11 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2029-12-30 -- the Sunday within the Octave of Christmas,
# found via the reference engine's own dedicated Tempora/Nat1-0 proper
# (same occasion as the sibling -benedictus-antiphon.yml).
id: christmas-octave-sunday-magnificat-antiphon
text:
la: "Puer Jesus * proficiébat ætáte et sapiéntia coram Deo et homínibus."
en: "And Jesus advanced in wisdom * and age, and grace with God and men."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-04-11 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: easter-3-magnificat-antiphon
text:
la: "Ego sum pastor bonus, * qui pasco oves meas, et pro óvibus meis pono ánimam meam, allelúja."
en: "I am the Good Shepherd, * Who feed My sheep: and I lay down My life for My sheep. Alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-04-18 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: easter-4-magnificat-antiphon
text:
la: "Amen dico vobis, * quia plorábitis et flébitis vos: mundus autem gaudébit, vos vero contristabímini, sed tristítia vestra convertétur in gáudium, allelúja."
en: "Amen, amen I say to you * that you shall lament and weep, but the world shall rejoice; and you shall be made sorrowful, but your sorrow shall be turned into joy."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2025-05-18 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: easter-5-magnificat-antiphon
text:
la: "Vado ad eum * qui misit me: sed quia hæc locútus sum vobis, tristítia implévit cor vestrum, allelúja."
en: "I go My way to Him That sent Me, * but because I have said this to you, sadness has filled your hearts, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2025-05-25 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: easter-6-magnificat-antiphon
text:
la: "Pétite, et accipiétis, * ut gáudium vestrum sit plenum: ipse enim Pater amat vos, quia vos me amástis, et credidístis, allelúja."
en: "Ask, and ye shall receive, * that your joy may be full; for the Father Himself loveth you, because ye have loved Me, and have believed in Me, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-04-04 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: easter-octave-magnificat-antiphon
text:
la: "Post dies octo * jánuis clausis ingréssus Dóminus dixit eis: Pax vobis, allelúja, allelúja."
en: "After eight days * came the Lord, the doors being shut, and said unto them: Peace be unto you, alleluia, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-03-28 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: easter-sunday-magnificat-antiphon
text:
la: "Et respiciéntes * vidérunt revolútum lápidem: erat quippe magnus valde, allelúja."
en: "And looking * they saw the stone rolled back, for it was very great, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-02-14 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: lent-1-magnificat-antiphon
text:
la: "Ecce nunc tempus * acceptábile, ecce nunc dies salútis: in his ergo diébus exhibeámus nosmetípsos sicut Dei minístros in multa patiéntia, in jejúniis, in vigíliis, et in caritáte non ficta."
en: "Behold, now is the accepted time * behold, now is the day of salvation; in these days therefore let us approve ourselves as the ministers of God, in much patience, in fastings, in watchings, and in love unfeigned."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-02-21 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: lent-2-magnificat-antiphon
text:
la: "Visiónem quam vidístis, * némini dixéritis, donec a mórtuis resúrgat Fílius hóminis."
en: "Tell the vision that ye have seen to no man, * until the Son of man be risen again from the dead."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-02-28 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: lent-3-magnificat-antiphon
text:
la: "Extóllens vocem * quædam múlier de turba, dixit: Beátus venter qui te portávit, et úbera quæ suxísti. At Jesus ait illi: Quinímmo beáti, qui áudiunt verbum Dei, et custódiunt illud."
en: "A certain woman of the company lifted up her voice and said: * Blessed is the womb that bare thee, and the paps which Thou hast sucked. But Jesus said unto her: Yea, rather, blessed are they that hear the word of God, and keep it."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-03-07 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: lent-4-magnificat-antiphon
text:
la: "Súbiit ergo, * in montem Jesus, et ibi sedébat cum discípulis suis."
en: "And Jesus went up into a mountain, * and there He sat with His disciples."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-03-21 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: palm-sunday-magnificat-antiphon
text:
la: "Scriptum est enim: * Percútiam pastórem, et dispergéntur oves gregis: postquam autem resurréxero, præcédam vos in Galilǽam: ibi me vidébitis, dicit Dóminus."
en: "It is written: I will smite the Shepherd, * and the sheep of the flock shall be scattered abroad, but after I am risen again, I will go before you into Galilee: there shall ye see Me, saith the Lord."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-03-14 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: passion-sunday-magnificat-antiphon
text:
la: "Abraham pater vester * exsultávit ut vidéret diem meum: vidit, et gavísus est."
en: "Your father Abraham rejoiced to see My day * and he saw it, and was glad."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-05-16 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: pentecost-sunday-magnificat-antiphon
text:
la: "Hódie * compléti sunt dies Pentecóstes, allelúja: hódie Spíritus Sanctus in igne discípulis appáruit, et tríbuit eis charísmatum dona: misit eos in univérsum mundum prædicáre, et testificári: Qui credíderit et baptizátus fúerit, salvus erit, allelúja."
en: "This day * the day of Pentecost is fully come, alleluia. This day the Holy Ghost appeared in fire unto the disciples, and gave unto them gifts of grace. He sent them into all the world, to preach and to testify that he who believeth, and is baptized, shall be saved, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-01-10 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-epiphany-1-magnificat-antiphon
text:
la: "Fili, quid fecísti * nobis sic? Ego et pater tuus doléntes quærebámus te. Quid est quod me quærebátis? nesciebátis quia in iis, quæ Patris mei sunt, opórtet me esse?"
en: "Son, why hast thou thus dealt with us? Behold, thy father and I have sought thee sorrowing. How is it that ye sought me? Wist ye not that I must be about my Father's business?"
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2028-01-16 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-epiphany-2-magnificat-antiphon
text:
la: "Deficiénte vino, * jussit Jesus impléri hýdrias aqua, quæ in vinum convérsa est, allelúja."
en: "The wine failing, * Jesus commanded the water pots to be filled with water, which was changed into wine, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2028-01-23 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-epiphany-3-magnificat-antiphon
text:
la: "Dómine, * si vis, potes me mundáre: et ait Jesus: Volo, mundáre."
en: "Lord, if Thou wilt, * Thou canst make me clean; and Jesus saith to him: I will; be thou clean."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2028-01-30 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-epiphany-4-magnificat-antiphon
text:
la: "Dómine, salva nos, * perímus: ímpera, et fac, Deus, tranquillitátem."
en: "Lord, save us: * we perish; give the word, O God, and let there be a great calm!"
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2028-02-06 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-epiphany-5-magnificat-antiphon
text:
la: "Collígite * primum zizánia, et alligáte ea in fascículos ad comburéndum: tríticum autem congregáte in hórreum meum, dicit Dóminus."
en: "The master saith: Gather ye together first the tares, * and bind them in bundles to burn them; but gather the wheat into my barn."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2038-02-14 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-epiphany-6-magnificat-antiphon
text:
la: "Símile est * regnum cælórum ferménto, quod accéptum múlier abscóndit in farínæ satis tribus, donec fermentátum est totum."
en: "The kingdom of heaven * is like unto leaven, which a woman took and hid in three measures of meal till the whole was leavened."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-05-23 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-01-magnificat-antiphon
text:
la: "Te Deum * Patrem ingénitum, te Fílium unigénitum, te Spíritum Sanctum Paráclitum, sanctam et indivíduam Trinitátem, toto corde et ore confitémur, laudámus, atque benedícimus: tibi glória in sǽcula."
en: "With all our heart * and with all our voice do we acknowledge thee, praise thee, and bless thee, O God the Father the Unbegotten, O God the Only-Begotten Son, O God the Holy Ghost the Comforter, One Holy and Undivided Trinity, To thee be glory for ever."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-05-30 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-02-magnificat-antiphon
text:
la: "Exi cito * in platéas et vicos civitátis: et páuperes ac débiles, cæcos et claudos compélle intráre, ut impleátur domus mea, allelúja."
en: "Go out quickly into the streets * and lanes of the city, and compel the poor and the maimed, and the halt, and the blind, to come in that my house may be full, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-06-06 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-03-magnificat-antiphon
text:
la: "Quæ múlier * habens drachmas decem, et si perdíderit drachmam unam, nonne accéndit lucérnam et evérrit domum et quærit diligénter, donec invéniat?"
en: "What woman * having ten pieces of silver, if she lose one piece, doth not light a candle, and sweep the house, and seek diligently till she find it?"
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-06-13 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-04-magnificat-antiphon
text:
la: "Præcéptor, * per totam noctem laborántes nihil cépimus; in verbo autem tuo laxábo rete."
en: "Master, we have toiled all night, * and have taken nothing; nevertheless at thy word I will let down the net."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-06-20 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-05-magnificat-antiphon
text:
la: "Si offers * munus tuum ad altáre et recordátus fúeris quia frater tuus habet áliquid advérsus te, relínque ibi munus tuum ante altáre, et vade prius reconciliári fratri tuo, et tunc véniens ófferes munus tuum, allelúja."
en: "If thou bring thy gift to the Altar, * and there rememberest that thy brother hath aught against thee, leave there thy gift before the Altar, and go thy way; first be reconciled to thy brother, and then come and offer thy gift. Alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-06-27 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-06-magnificat-antiphon
text:
la: "Miséreor * super turbam, quia ecce jam tríduo sústinent me nec habent quod mandúcent, et, si dimísero eos jejúnos, defícient in via, allelúja."
en: "I have compassion on the multitude, * because they have now been with Me three days, and have nothing to eat; and if I send them away fasting, they will faint by the way. Alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-07-04 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-07-magnificat-antiphon
text:
la: "Non potest arbor * bona fructus malos fácere, nec arbor mala fructus bonos fácere. Omnis arbor quæ non facit fructum bonum, excidétur, et in ignem mittétur, allelúja."
en: "A good tree cannot bring forth evil fruit, * neither can a corrupt tree bring forth good fruit. Every tree that bringeth not forth good fruit, is hewn down and cast into the fire. Alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-07-11 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-08-magnificat-antiphon
text:
la: "Quid fáciam, * quia dóminus meus aufert a me villicatiónem? Fódere non váleo, mendicáre erubésco. Scio quid fáciam, ut, cum amótus fúero a villicatióne, recípiant me in domos suas."
en: "What shall I do? * For my lord taketh away from me the stewardship. I cannot dig, to beg I am ashamed. I am resolved what to do, that, when I am put out of the stewardship, they may receive me into their houses."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-07-18 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-09-magnificat-antiphon
text:
la: "Scriptum est enim: * Quia domus mea domus oratiónis est cunctis géntibus; vos autem fecístis illam spelúncam latrónum. Et erat cotídie docens in templo."
en: "It is written: My house is the house of prayer * for all nations but ye have made it a den of thieves. And He taught daily in the Temple."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2028-08-13 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-10-magnificat-antiphon
text:
la: "Descéndit * hic justificátus in domum suam ab illo; quia omnis qui se exáltat, humiliábitur, et, qui se humíliat, exaltábitur."
en: "This man went down to his house * justified rather than the other, for every one that exalteth himself shall be abased, and he that humbleth himself shall be exalted."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2026-08-09 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-11-magnificat-antiphon
text:
la: "Bene ómnia fecit * et surdos fecit audíre et mutos loqui."
en: "He hath done all things well, * He maketh both the deaf to hear and the dumb to speak."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-08-08 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-12-magnificat-antiphon
text:
la: "Homo quidam * descendébat ab Jerúsalem in Jéricho et íncidit in latrónes, qui étiam despoliavérunt eum et, plagis impósitis, abiérunt semivívo relícto."
en: "A certain man went down from Jerusalem * to Jericho, and fell among thieves, which stripped him of his raiment, and wounded him, and departed, leaving him half dead."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2028-09-03 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-13-magnificat-antiphon
text:
la: "Unus autem * ex illis, ut vidit quod mundátus est, regréssus est cum magna voce magníficans Deum, allelúja."
en: "And one of them, * when he saw that he was healed, turned back, and with a loud voice glorified God, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2031-09-07 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-14-magnificat-antiphon
text:
la: "Quǽrite primum * regnum Dei et justítiam ejus, et hæc ómnia adiciéntur vobis, allelúja."
en: "Seek ye first the kingdom of God * and His righteousness, and all these things shall be added unto you, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2028-09-17 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-15-magnificat-antiphon
text:
la: "Prophéta magnus * surréxit in nobis, et quia Deus visitávit plebem suam."
en: "A great prophet is risen up among us * and God hath visited His people."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-09-05 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-16-magnificat-antiphon
text:
la: "Cum vocátus fúeris * ad núptias, recúmbe in novíssimo loco, ut dicat tibi qui te invitávit: Amíce, ascénde supérius. Et erit tibi glória coram simul discumbéntibus, allelúja."
en: "When thou art bidden * of any man to a wedding, go and sit down in the lowest room, that he that bade thee may say: Friend, go up higher, then shalt thou have worship in the presence of them that sit at meat with thee, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-09-12 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-17-magnificat-antiphon
text:
la: "Quid vobis * vidétur de Christo? cujus fílius est? Dicunt ei omnes: David. Dicit eis Jesus: Quómodo David in spíritu vocat eum Dóminum dicens: Dixit Dóminus Dómino meo: Sede a dextris meis?"
en: "What think ye of Christ? Whose Son is He? * They say all unto Him: The Son of David. Jesus saith unto them: How then doth David in spirit call Him Lord, saying: The Lord said unto my Lord, Sit Thou at My right hand?"
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-09-19 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-18-magnificat-antiphon
text:
la: "Tulit ergo * paralýticus lectum suum, in quo jacébat, magníficans Deum: et omnis plebs, ut vidit, dedit laudem Deo."
en: "And immediately, he that had been sick of the palsy arose, * and took up his bed whereon he lay, glorifying God and all the people, when they saw it, gave praise to God."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-09-26 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-19-magnificat-antiphon
text:
la: "Intrávit autem rex * ut vidéret discumbéntes, et vidit ibi hóminem non vestítum veste nuptiáli et ait illi: Amíce, quómodo huc intrásti non habens vestem nuptiálem?"
en: "And the King came in * to see the guests, and he saw there a man which had not on a wedding garment. And he saith unto him: Friend, how camest thou in hither, not having a wedding garment?"
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-10-03 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-20-magnificat-antiphon
text:
la: "Cognóvit autem pater * quia illa hora erat, in qua dixit Jesus: Fílius tuus vivit; et crédidit ipse et domus ejus tota."
en: "So the father knew * that it was at the same hour in which Jesus said “Thy son liveth.” And he himself believed, and his whole house."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-10-10 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-21-magnificat-antiphon
text:
la: "Serve nequam, * omne débitum dimísi tibi, quóniam rogásti me: nonne ergo opórtuit et te miseréri consérvi tui, sicut et ego tui misértus sum, allelúja."
en: "O thou wicked servant, I forgave thee all * that debt, because thou desiredst me. Shouldest not thou also have had compassion on thy fellow-servant, even as I had pity on thee, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-10-17 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-22-magnificat-antiphon
text:
la: "Réddite ergo * quæ sunt Cǽsaris Cǽsari, et quæ sunt Dei Deo, allelúja."
en: "Render therefore unto Caesar the things which are Caesar's, * and unto God the things that are God's, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-10-24 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: post-pentecost-23-magnificat-antiphon
text:
la: "At Jesus convérsus * et videns eam dixit: Confíde, fília, fides tua te salvam fecit, allelúja."
en: "But Jesus turned Him about, * and when He saw her, He said: Daughter, be of good comfort; thy faith hath made thee whole, alleluia."
status:
la: verified
en: verified
@@ -0,0 +1,12 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-11-14 -- the fixed final Sunday after Pentecost reuses the
# leftover Sixth-Sunday-after-Epiphany formulary (Tempora/Epi6-0), same as
# its sibling -benedictus-antiphon.yml (see TODO.md's resumed-Epiphany-Sunday
# overflow method).
id: post-pentecost-24-magnificat-antiphon
text:
la: "Símile est * regnum cælórum ferménto, quod accéptum múlier abscóndit in farínæ satis tribus, donec fermentátum est totum."
en: "The kingdom of heaven * is like unto leaven, which a woman took and hid in three measures of meal till the whole was leavened."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-02-07 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: quinquagesima-magnificat-antiphon
text:
la: "Stans autem Jesus, * jussit cæcum addúci ad se, et ait illi: Quid vis ut fáciam tibi? Dómine, ut vídeam. Et Jesus ait illi: Réspice, fides tua te salvum fecit. Et conféstim vidit, et sequebátur illum, magníficans Deum."
en: "And Jesus stood, * and commanded the blind man to be brought unto Him, and He asked him, saying: What wilt thou that I shall do unto thee? Lord, that I may receive my sight. And Jesus said unto him: Receive thy sight, thy faith hath saved thee. And immediately he received his sight, and followed Him, glorifying God."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-01-24 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: septuagesima-magnificat-antiphon
text:
la: "Dixit paterfamílias * operáriis suis: Quid hic statis tota die otiósi? At illi respondéntes dixérunt: Quia nemo nos condúxit. Ite et vos in víneam meam: et quod justum fúerit, dabo vobis."
en: "The householder saith unto his labourers: * Why stand ye here all the day idle? But they answered and said: Because no man hath hired us. Go ye also into my vineyard, and whatsoever is right, that will I give you."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2027-01-31 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: sexagesima-magnificat-antiphon
text:
la: "Vobis datum est * nosse mystérium regni Dei, céteris autem in parábolis, dixit Jesus discípulis suis."
en: "Jesus said to His disciples: * Unto you it is given to know the mysteries of the kingdom of God, but to others in parables."
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), Vespers
# live query, 2028-05-28 (a clean year/date for this temporal id -- see
# TODO.md for the general method: each temporal-id's own Sunday, found
# programmatically via calendar/index.ts's own resolveDay rather than
# guessed at, then cross-checked live for a title with no saint collision;
# same occasion as the sibling -benedictus-antiphon.yml).
id: sunday-after-ascension-magnificat-antiphon
text:
la: "Hæc locútus sum * vobis, ut cum vénerit hora eórum, reminiscámini quia ego dixi vobis, allelúja."
en: "These things have I told * you, that, when the time shall come, ye may remember that I told you of them, alleluia."
status:
la: verified
en: verified
+36 -3
View File
@@ -9,6 +9,7 @@ import { isInTriduum } from '../calendar/temporal';
import { splitAntiphon, isDoubleOrHigher } from './antiphon';
import { getLaudsSaintOverride } from './lauds-psalmody-overrides';
import vespersMagnificatAntiphonsData from '../data/hours/vespers-magnificat-antiphons.yml';
import vespersOAntiphonsData from '../data/hours/vespers-o-antiphons.yml';
type BilingualText = Partial<Record<string, string>>;
type TranslationStatus = 'verified' | 'draft' | 'missing';
@@ -21,6 +22,10 @@ interface MagnificatWeekdayDefault {
const vespersMagnificatAntiphons = vespersMagnificatAntiphonsData as Partial<
Record<Weekday, MagnificatWeekdayDefault>
>;
// Keyed by "MM-DD" (Dec 17-23) — see the data file's own header for why
// these seven can't live in a per-Advent-week temporal-proper file the
// way every other week's Magnificat antiphon does.
const vespersOAntiphons = vespersOAntiphonsData as Partial<Record<string, MagnificatWeekdayDefault>>;
function toResolvedText(proper: ProperText): ResolvedText {
return { text: proper.text, status: proper.status, citation: proper.citation };
@@ -817,15 +822,43 @@ export function getBenedictusAntiphon(day: LiturgicalDay): ResolvedText {
* order exactly (temporal id, then a saint's own `${propers}-magnificat-
* antiphon`, then their Common category's `magnificat-antiphon-${common}`
* — none of that content authored yet, a separate future pass the same
* shape as the Benedictus one was), but with one real difference: a bare
* shape as the Benedictus one was), but with two real differences: a bare
* ferial weekday (Mon-Sat) has actual content to fall back to —
* data/hours/vespers-magnificat-antiphons.yml's classic "quote the
* Magnificat's own text in sequence" set — which Benedictus has no
* equivalent of. `withPaschaltideAlleluia` applied to that fallback too,
* by analogy with the Common-category treatment above; not independently
* equivalent of; and the O Antiphons below, checked before either the
* temporal or sanctoral branch even runs.
*
* `withPaschaltideAlleluia` applied to the weekday fallback too, by
* analogy with the Common-category treatment above; not independently
* confirmed for this specific case.
*
* The O Antiphons (Dec 17-23) are checked first, unconditionally —
* ahead of *both* the per-week `${winner.id}-magnificat-antiphon` file
* and a real sanctoral winner's own antiphon, deliberately: this is the
* app's own design choice (2026-08-30 user instruction), not a
* reconstruction of any single historical rite's rubric — the reference
* engine itself doesn't do this uniformly (its own Dec 20/21 live query
* shows St. Thomas's own antiphon instead, see vespers-o-antiphons.yml's
* header), but this app deliberately gives the O Antiphon absolute
* priority for this one specific text slot on these seven dates,
* regardless of who otherwise wins the day. Every other part of the
* office (chapter/responsory/hymn/versicle/collect, Lauds' own Benedictus
* antiphon) is untouched by this — a saint who wins Dec 17-23 (St.
* Thomas, Dec 21) still gets everything else that comes with winning,
* just not this one slot. This also means a saint's own real Magnificat
* antiphon, once authored, is permanently unreachable on one of these
* seven dates under *this* calendar's own construction — deliberately
* accepted, since a saint's real antiphon is still worth having on file
* for a differently-constructed calendar (e.g. a future user-editable
* one) even where the shipped calendar's own precedence never surfaces
* it here.
*/
export function getMagnificatAntiphon(day: LiturgicalDay): ResolvedText {
const oAntiphon = vespersOAntiphons[day.date.slice(5)];
if (oAntiphon) {
return oAntiphon.status ? { text: oAntiphon.antiphon, status: oAntiphon.status } : verifiedText(oAntiphon.antiphon);
}
const winner = resolveOfficeWinner(day);
if (winner.kind === 'temporal') {
const named = toResolvedText(getTemporalProper(`${winner.id}-magnificat-antiphon`));
+40
View File
@@ -3,6 +3,7 @@ import { resolveDay } from '../../src/calendar';
import {
getDayCollect,
getBenedictusAntiphon,
getMagnificatAntiphon,
resolveMinorHourAntiphon,
resolveMinorHourChapter,
splitNamedAntiphon,
@@ -305,3 +306,42 @@ describe('Paschaltide alleluia suffix on Common-category antiphons (2026-08)', (
expect(benedictus.text.la?.match(/allelúja/g)?.length).toBe(2);
});
});
describe('getMagnificatAntiphon — classic weekday-default fallback', () => {
it('falls back to the classic weekday-quote antiphon for a plain temporal id with no proper Magnificat antiphon of its own', () => {
// Synthetic day, not a real resolveOrdo/resolveDay date: after the
// full temporal-cycle Magnificat-antiphon sweep (2026-08-30, see
// TODO.md), every real temporal id this app's calendar can actually
// land Vespers on has its own proper antiphon authored (or is covered
// date-by-date by the O Antiphons, Dec 17-23 -- see
// vespers-o-antiphons.yml), so there's no live date left to exercise
// this fallback tier through the real pipeline any more -- see
// tests/hours/vespers.test.ts's own note where this test used to
// live. Tests the mechanism directly instead, the same way this
// file's other synthetic-day cases do.
const day: LiturgicalDay = {
date: '2026-01-01',
weekday: 'tuesday',
season: 'trinitytide',
temporalCategory: 'ordinary-feria',
winner: { kind: 'temporal', id: 'not-a-real-temporal-id' },
commemorations: [],
};
const magnificat = getMagnificatAntiphon(day);
expect(magnificat.text.la).toContain('Exsúltet');
expect(magnificat.status.la).toBe('verified');
});
it('has no weekday default for Sunday (its own antiphon varies by Proper of the Time)', () => {
const day: LiturgicalDay = {
date: '2026-01-04',
weekday: 'sunday',
season: 'trinitytide',
temporalCategory: 'ordinary-sunday',
winner: { kind: 'temporal', id: 'not-a-real-temporal-id' },
commemorations: [],
};
const magnificat = getMagnificatAntiphon(day);
expect(magnificat.status.la).toBe('missing');
});
});
+49 -14
View File
@@ -248,20 +248,18 @@ describe('resolveOrdo("vespers", ...)', () => {
expect(versicle).toBeDefined();
});
it('falls back to the classic weekday-default Magnificat antiphon on a bare ferial', () => {
// 2033-09-06 is a Tuesday, plain ordinary trinitytide, no saint, no
// active octave (same date already used by calendar/vespers.test.ts's
// "does not anticipate between two plain ferias" -- see that test's
// own comment for why this moved off 2026-06-16).
const ordo = resolveOrdo('vespers', '2033-09-06');
const magnificatIndex = ordo.parts.findIndex((p) => p.kind === 'canticle' && p.canticleId === 'magnificat');
expect(magnificatIndex).toBeGreaterThanOrEqual(0);
const magnificat = ordo.parts[magnificatIndex];
expect(magnificat?.kind === 'canticle' ? magnificat.text.text.la : undefined).toContain('Magníficat ✠ ánima mea');
// The closing full-antiphon repeat is the very next part.
const closingAntiphon = ordo.parts[magnificatIndex + 1];
expect(closingAntiphon?.kind === 'antiphon' ? closingAntiphon.text.text.la : undefined).toContain('Exsúltet');
});
// The classic weekday-default Magnificat antiphon (getMagnificatAntiphon's
// last fallback tier, vespers-magnificat-antiphons.yml) now has no live,
// reachable date left in this app's own calendar to exercise it through
// resolveOrdo: every temporal id has its own proper antiphon authored
// (the 2026-08-30 full sweep) except advent-4 (now covered date-by-date
// by the O Antiphons for its entire practical range, see the "O
// Antiphons" describe block below) and marian-saturday (whose own
// Vespers is itself unreachable -- Sunday always claims First Vespers
// over the preceding Saturday evening regardless of Sunday's own rank,
// see calendar/vespers.ts's hasFirstVespers). See
// tests/hours/resolve-common.test.ts's own synthetic-day unit test for
// this fallback tier instead.
it('folds the cross-day Vespers commemoration into day-collects (St. James keeps Vespers, St. Anne commemorated)', () => {
// St. Christopher (same-day collision, commemorated under James
@@ -664,6 +662,43 @@ describe('resolveOrdo("vespers", ...)', () => {
});
});
describe('resolveOrdo("vespers", ...) O Antiphons (Dec 17-23)', () => {
it('uses the date-keyed O Antiphon instead of the enclosing Advent week\'s own Magnificat antiphon', () => {
// Regression test for the 2026-08-30 Magnificat-antiphon gap: 2026-12-19
// (a Saturday, genuinely clean -- no saint on this date, see
// data/calendar/sanctoral-calendar.yml) falls within whichever Advent
// week governs that year (advent-3 or advent-4), but the O Antiphon
// "O radix Jesse" must win regardless of which week id that is --
// see vespers-o-antiphons.yml's own header for why these seven can't
// live in a per-week temporal-proper file.
const ordo = resolveOrdo('vespers', '2026-12-19');
const magnificat = ordo.parts.find((p) => p.kind === 'canticle' && p.canticleId === 'magnificat');
expect(magnificat?.kind === 'canticle' ? magnificat.antiphon?.text.la : undefined).toContain('radix Jesse');
const magnificatIndex = ordo.parts.indexOf(magnificat!);
const closingAntiphon = ordo.parts[magnificatIndex + 1];
expect(closingAntiphon?.kind === 'antiphon' ? closingAntiphon.text.text.en : undefined).toContain('Root of Jesse');
});
it("gives the O Antiphon absolute priority for the Magnificat slot even over a real sanctoral winner (St. Thomas, Dec 21, Duplex II. classis), while leaving the rest of his own office untouched", () => {
// Direct user instruction (2026-08-30): the O Antiphon always wins
// the Magnificat slot on Dec 17-23, full stop, regardless of who
// otherwise wins the day -- St. Thomas still wins everything else
// about Dec 21 (his own chapter/responsory/hymn/versicle, confirmed
// below), just not this one text. See vespers-o-antiphons.yml's own
// header for the reasoning (a deliberate app-level design choice, not
// a reconstruction of the reference engine's own Dec 21 behavior).
const ordo = resolveOrdo('vespers', '2026-12-21');
const magnificat = ordo.parts.find((p) => p.kind === 'canticle' && p.canticleId === 'magnificat');
expect(magnificat?.kind === 'canticle' ? magnificat.antiphon?.text.la : undefined).toContain('Oriens');
expect(magnificat?.kind === 'canticle' ? magnificat.antiphon?.text.en : undefined).toContain('Dayspring');
// The rest of his own office is untouched by this.
const chapter = ordo.parts.find((p) => p.kind === 'chapter');
expect(chapter?.kind === 'chapter' ? chapter.text.status.la : undefined).not.toBe('missing');
const hymn = ordo.parts.find((p) => p.kind === 'hymn');
expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toBeTruthy();
});
});
describe('resolveOrdo("vespers", ...) responsory Gloria omission', () => {
// Same shared mechanism/rule as Lauds' — see tests/hours/lauds.test.ts's
// and tests/hours/compline.test.ts's own describe blocks.