The plain ferial fallback was a single fixed year-round text that was actually just Monday's own antiphon, mislabeled in its own comment as live-verified for 2026-09-06 (a Sunday). The real Monastic 1617 source genuinely varies this antiphon Sunday-Saturday, same shape as the Matins hymn's own weekday cycle. Adds the six missing weekday variants and dispatches on weekday in resolveMatinsInvitatoryText. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W8cttEhwbN3f6hiHQHqCae
This commit is contained in:
@@ -11,10 +11,6 @@ content in the same shape, not a design change. The dated log below is that pipe
|
|||||||
## Open work, in priority order
|
## Open work, in priority order
|
||||||
|
|
||||||
1. **Mechanism gaps**
|
1. **Mechanism gaps**
|
||||||
- **2026-09-06 invitatory antiphon questioned** — user flagged today's (2026-09-06)
|
|
||||||
invitatory antiphon as suspect; needs tracing back to its source (override > octave >
|
|
||||||
Common > season > ferial chain in `hours/matins.ts`'s invitatory resolution) to find
|
|
||||||
and fix whatever underlying bug or content problem produced it. Not yet investigated.
|
|
||||||
- **Gospel+homily pairing shouldn't carry a responsory** — user, 2026-09-06: when a Matins
|
- **Gospel+homily pairing shouldn't carry a responsory** — user, 2026-09-06: when a Matins
|
||||||
Gospel pericope is immediately followed by its own patristic homily (the paired
|
Gospel pericope is immediately followed by its own patristic homily (the paired
|
||||||
`gospel`/homily rendering — see `hours/matins.ts`'s Gospel+homily-fold-in convention),
|
`gospel`/homily rendering — see `hours/matins.ts`'s Gospel+homily-fold-in convention),
|
||||||
@@ -6445,3 +6441,28 @@ Albis", i.e. Low Sunday, not yet itself named beyond a generic ordinal — a sep
|
|||||||
still-open gap) carries a name distinct from the plain "Die N" pattern.
|
still-open gap) carries a name distinct from the plain "Die N" pattern.
|
||||||
|
|
||||||
`npm test` (2066 passed) and `tsc --noEmit` both pass.
|
`npm test` (2066 passed) and `tsc --noEmit` both pass.
|
||||||
|
|
||||||
|
### Matins invitatory antiphon weekday cycle — closed (2026-09-06)
|
||||||
|
|
||||||
|
User flagged 2026-09-06's (a plain Sunday, `post-pentecost-15`) invitatory antiphon as suspect.
|
||||||
|
Traced it to a real content bug, not a resolution-order bug: `matins-invitatory-antiphon.yml` (the
|
||||||
|
final ferial fallback in `resolveMatinsInvitatoryText`) held a single fixed year-round text
|
||||||
|
("Veníte, * Exsultémus Dómino") that its own header claimed was "live-verified... 2026-09-06" —
|
||||||
|
that was wrong. Querying the live reference engine for that exact date returns a different text
|
||||||
|
("Adorémus Dóminum, * Qui fecit nos"), and querying a full week showed the real source
|
||||||
|
(`Psalterium/Special/Matutinum Special.txt`'s `[Invit Trid_]` block) genuinely varies the plain
|
||||||
|
`{Antiphona ex Psalterio secundum tempora}` invitatory antiphon Sunday-Saturday — same shape as the
|
||||||
|
Matins hymn's own weekday cycle (`matins-hymn-ferial-tuesday.yml` etc., closed 2026-09-04). The
|
||||||
|
fixed text turned out to be Monday's own real antiphon, silently standing in for every other
|
||||||
|
weekday including Sunday.
|
||||||
|
|
||||||
|
Fixed the same way as the hymn cycle: six new weekday-specific files
|
||||||
|
(`matins-invitatory-antiphon-{sunday,tuesday,wednesday,thursday,friday,saturday}.yml`, full
|
||||||
|
Latin+English pulled from the reference engine's own `Invit Trid_`/`Invit Trid` blocks, Latin and
|
||||||
|
English respectively), `matins-invitatory-antiphon.yml` (no day suffix) still used for Monday.
|
||||||
|
`hours/matins.ts`'s `resolveMatinsInvitatoryText` now dispatches on `day.weekday` for its final
|
||||||
|
fallback tier, same pattern as `resolveMatinsHymn`'s `weekdayFerialHymnIds`. Two pre-existing tests
|
||||||
|
in `tests/hours/matins.test.ts` hardcoded "Veníte" as the generic ferial default — both dates are
|
||||||
|
actually Tuesdays, updated to expect Tuesday's own real text ("Jubilémus Deo").
|
||||||
|
|
||||||
|
`npm test` (2066 passed) and `tsc --noEmit` both pass.
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Friday's own plain ferial Matins invitatory antiphon (Psalterium/
|
||||||
|
# Special/Matutinum Special.txt's "Invit Trid_" block, `Feria VI=`). Its
|
||||||
|
# English happens to be byte-identical to Sunday's own
|
||||||
|
# (matins-invitatory-antiphon-sunday.yml) — confirmed in the source, not
|
||||||
|
# a copy-paste slip: both weekdays' Latin renders as "Let us worship the
|
||||||
|
# Lord, for He is our Maker" in the reference engine's own translation
|
||||||
|
# despite slightly different Latin wording. See matins-invitatory-
|
||||||
|
# antiphon-sunday.yml's header for the weekday-cycle mechanism this
|
||||||
|
# belongs to; live-verified 2026-09-06.
|
||||||
|
id: matins-invitatory-antiphon-friday
|
||||||
|
text:
|
||||||
|
la: "Adorémus Dóminum, * Quóniam ipse fecit nos."
|
||||||
|
en: "Let us worship the Lord, for * He is our Maker."
|
||||||
|
status:
|
||||||
|
la: verified
|
||||||
|
en: verified
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Saturday's own plain ferial Matins invitatory antiphon (Psalterium/
|
||||||
|
# Special/Matutinum Special.txt's "Invit Trid_" block, `Sabbato=`).
|
||||||
|
# Reached only when Saturday is neither Marian (see calendar/index.ts's
|
||||||
|
# applyMarianSaturday) nor covered by a season's own seasonal invitatory
|
||||||
|
# — same real-world rarity as matins-hymn-ferial-saturday.yml's own case.
|
||||||
|
# See matins-invitatory-antiphon-sunday.yml's header for the weekday-cycle
|
||||||
|
# mechanism this belongs to; live-verified 2026-09-06.
|
||||||
|
id: matins-invitatory-antiphon-saturday
|
||||||
|
text:
|
||||||
|
la: "Dóminum, Deum nostrum, * Veníte, adorémus."
|
||||||
|
en: "The Lord our God: * O come, let us worship Him."
|
||||||
|
status:
|
||||||
|
la: verified
|
||||||
|
en: verified
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Sunday's own plain ferial Matins invitatory antiphon (Psalterium/Special/
|
||||||
|
# Matutinum Special.txt's "Invit Trid_" block, `Dominica=`) — the plain
|
||||||
|
# `{Antiphona ex Psalterio secundum tempora}` weekday cycle genuinely
|
||||||
|
# varies Sunday-Saturday, same shape as the Matins hymn's own weekday
|
||||||
|
# cycle (see matins-hymn-ferial-tuesday.yml etc.). `matins-invitatory-
|
||||||
|
# antiphon.yml` (no day suffix) had been standing in for every day
|
||||||
|
# including Sunday with what's actually Monday's own text — reported by
|
||||||
|
# the user 2026-09-06 as suspect and live-verified against Monastic
|
||||||
|
# Tridentinum 1617 directly.
|
||||||
|
id: matins-invitatory-antiphon-sunday
|
||||||
|
text:
|
||||||
|
la: "Adorémus Dóminum, * Qui fecit nos."
|
||||||
|
en: "Let us worship the Lord, for * He is our Maker."
|
||||||
|
status:
|
||||||
|
la: verified
|
||||||
|
en: verified
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Thursday's own plain ferial Matins invitatory antiphon (Psalterium/
|
||||||
|
# Special/Matutinum Special.txt's "Invit Trid_" block, `Feria V=`).
|
||||||
|
# See matins-invitatory-antiphon-sunday.yml's header for the weekday-cycle
|
||||||
|
# mechanism this belongs to; live-verified 2026-09-06.
|
||||||
|
id: matins-invitatory-antiphon-thursday
|
||||||
|
text:
|
||||||
|
la: "Dóminum, qui fecit nos, * Veníte, adorémus."
|
||||||
|
en: "It is the Lord That hath made us: * O come, let us worship Him."
|
||||||
|
status:
|
||||||
|
la: verified
|
||||||
|
en: verified
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Tuesday's own plain ferial Matins invitatory antiphon (Psalterium/
|
||||||
|
# Special/Matutinum Special.txt's "Invit Trid_" block, `Feria III=`).
|
||||||
|
# See matins-invitatory-antiphon-sunday.yml's header for the weekday-cycle
|
||||||
|
# mechanism this belongs to; live-verified 2026-09-06.
|
||||||
|
id: matins-invitatory-antiphon-tuesday
|
||||||
|
text:
|
||||||
|
la: "Jubilémus Deo, * Salutári nostro."
|
||||||
|
en: "Let us make a joyful noise to * the God of our salvation."
|
||||||
|
status:
|
||||||
|
la: verified
|
||||||
|
en: verified
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Wednesday's own plain ferial Matins invitatory antiphon (Psalterium/
|
||||||
|
# Special/Matutinum Special.txt's "Invit Trid_" block, `Feria IV=`).
|
||||||
|
# See matins-invitatory-antiphon-sunday.yml's header for the weekday-cycle
|
||||||
|
# mechanism this belongs to; live-verified 2026-09-06.
|
||||||
|
id: matins-invitatory-antiphon-wednesday
|
||||||
|
text:
|
||||||
|
la: "In manu tua, Dómine, * Omnes fines terræ."
|
||||||
|
en: "In Thy hand, O Lord, * are the inmost depths of the earth."
|
||||||
|
status:
|
||||||
|
la: verified
|
||||||
|
en: verified
|
||||||
@@ -1,13 +1,25 @@
|
|||||||
# Live-verified (Monastic Tridentinum 1617, 2026-09-06 and 2026-12-15).
|
# This is Monday's own plain ferial Matins invitatory antiphon
|
||||||
|
# (Psalterium/Special/Matutinum Special.txt's "Invit Trid_" block, `Feria
|
||||||
|
# II=`). Its original comment claimed this text was "live-verified...
|
||||||
|
# 2026-09-06" as the year-round default — wrong: that date query actually
|
||||||
|
# returns Sunday's own distinct text ("Adorémus Dóminum, * Qui fecit
|
||||||
|
# nos.", matins-invitatory-antiphon-sunday.yml), not this one. The real
|
||||||
|
# `{Antiphona ex Psalterio secundum tempora}` cycle genuinely varies
|
||||||
|
# Sunday-Saturday, same shape as the Matins hymn's own weekday cycle (see
|
||||||
|
# matins-hymn-ferial.yml's own header) — user flagged today's rendering
|
||||||
|
# as suspect 2026-09-06, traced to this file standing in for every
|
||||||
|
# weekday including Sunday. `hours/matins.ts`'s
|
||||||
|
# `resolveMatinsInvitatoryText` now looks up a weekday-specific id
|
||||||
|
# (matins-invitatory-antiphon-sunday/-tuesday/-wednesday/-thursday/
|
||||||
|
# -friday/-saturday) for those six days; this file (no day suffix) is
|
||||||
|
# still used directly for Monday, same convention as matins-hymn-ferial.
|
||||||
|
#
|
||||||
# Real practice repeats this antiphon as an interspersed refrain between
|
# Real practice repeats this antiphon as an interspersed refrain between
|
||||||
# verse groups of Psalm 94 (the historical "Venite" invitatory shape) —
|
# verse groups of Psalm 94 (the historical "Venite" invitatory shape) —
|
||||||
# deliberately not modeled that way here, per direct instruction: this app
|
# deliberately not modeled that way here, per direct instruction: this app
|
||||||
# frames it like any other psalm antiphon instead, one opening
|
# frames it like any other psalm antiphon instead, one opening
|
||||||
# (incipit-or-full, same rank rule as everywhere else) and one full
|
# (incipit-or-full, same rank rule as everywhere else) and one full
|
||||||
# repeat after, via hours/matins.ts's plain 'psalm' + 'antiphon' parts.
|
# repeat after, via hours/matins.ts's plain 'psalm' + 'antiphon' parts.
|
||||||
# Fixed year-round for now — real practice does vary this by season/feast
|
|
||||||
# (`{Antiphona ex Psalterio secundum tempora}` in the source); not yet
|
|
||||||
# modeled, a deferred follow-on (see TODO.md).
|
|
||||||
id: matins-invitatory-antiphon
|
id: matins-invitatory-antiphon
|
||||||
text:
|
text:
|
||||||
la: "Veníte, * Exsultémus Dómino."
|
la: "Veníte, * Exsultémus Dómino."
|
||||||
|
|||||||
+15
-1
@@ -345,7 +345,21 @@ function resolveMatinsInvitatoryText(day: LiturgicalDay): ResolvedText {
|
|||||||
return seasonal;
|
return seasonal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return resolveCommon('matins-invitatory-antiphon');
|
// The plain `{Antiphona ex Psalterio secundum tempora}` weekday cycle
|
||||||
|
// (Psalterium/Special/Matutinum Special.txt's "Invit Trid_" block) —
|
||||||
|
// same weekday-varying shape as `resolveMatinsHymn`'s own cycle, found
|
||||||
|
// missing the same way (user flagged 2026-09-06's Sunday rendering as
|
||||||
|
// suspect; it was silently reusing Monday's own text). Monday's text
|
||||||
|
// still lives at the unsuffixed `matins-invitatory-antiphon` id.
|
||||||
|
const weekdayInvitatoryIds: Partial<Record<Weekday, string>> = {
|
||||||
|
sunday: 'matins-invitatory-antiphon-sunday',
|
||||||
|
tuesday: 'matins-invitatory-antiphon-tuesday',
|
||||||
|
wednesday: 'matins-invitatory-antiphon-wednesday',
|
||||||
|
thursday: 'matins-invitatory-antiphon-thursday',
|
||||||
|
friday: 'matins-invitatory-antiphon-friday',
|
||||||
|
saturday: 'matins-invitatory-antiphon-saturday',
|
||||||
|
};
|
||||||
|
return resolveCommon(weekdayInvitatoryIds[day.weekday] ?? 'matins-invitatory-antiphon');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The Invitatory (Ps 94) — real practice interleaves its antiphon as a
|
/** The Invitatory (Ps 94) — real practice interleaves its antiphon as a
|
||||||
|
|||||||
@@ -29,7 +29,11 @@ describe('resolveOrdo("matins", ...) ferial (1-nocturn) branch', () => {
|
|||||||
expect(ordo.parts[3]).toMatchObject({ kind: 'section-heading', label: 'Invitatory' });
|
expect(ordo.parts[3]).toMatchObject({ kind: 'section-heading', label: 'Invitatory' });
|
||||||
expect(ordo.parts[4]).toMatchObject({ kind: 'psalm', psalmNumber: 94 });
|
expect(ordo.parts[4]).toMatchObject({ kind: 'psalm', psalmNumber: 94 });
|
||||||
const invitatoryAntiphon = (ordo.parts[4] as { antiphon?: { text: Record<string, string> } }).antiphon;
|
const invitatoryAntiphon = (ordo.parts[4] as { antiphon?: { text: Record<string, string> } }).antiphon;
|
||||||
expect(invitatoryAntiphon?.text.la).toContain('Veníte');
|
// FERIAL_DATE is a Tuesday — its own weekday-specific invitatory
|
||||||
|
// antiphon (see hours/matins.ts's resolveMatinsInvitatoryText), not
|
||||||
|
// Monday's "Veníte" text every weekday used to share before the
|
||||||
|
// weekday cycle was built (2026-09-06).
|
||||||
|
expect(invitatoryAntiphon?.text.la).toContain('Jubilémus Deo');
|
||||||
// Real practice repeats the invitatory antiphon between verse groups —
|
// Real practice repeats the invitatory antiphon between verse groups —
|
||||||
// deliberately not modeled that way here (see hours/matins.ts's own
|
// deliberately not modeled that way here (see hours/matins.ts's own
|
||||||
// header): confirm there's exactly one standalone repeat, not several.
|
// header): confirm there's exactly one standalone repeat, not several.
|
||||||
@@ -1090,7 +1094,10 @@ describe('resolveOrdo("matins", ...) Common-of-an-Apostle hymn + invitatory (202
|
|||||||
// ferial one -- season outranks weekday in resolveMatinsHymn's own
|
// ferial one -- season outranks weekday in resolveMatinsHymn's own
|
||||||
// precedence, same as everywhere else.
|
// precedence, same as everywhere else.
|
||||||
expect(hymnLatin(FERIAL_DATE)).toContain('Verbum supérnum, pródiens');
|
expect(hymnLatin(FERIAL_DATE)).toContain('Verbum supérnum, pródiens');
|
||||||
expect(invitatoryFullLatin(FERIAL_DATE)).toContain('Veníte');
|
// Advent has no seasonal invitatory antiphon authored, so this falls
|
||||||
|
// through to Tuesday's own weekday text (see hours/matins.ts's
|
||||||
|
// resolveMatinsInvitatoryText and its 2026-09-06 weekday-cycle fix).
|
||||||
|
expect(invitatoryFullLatin(FERIAL_DATE)).toContain('Jubilémus Deo');
|
||||||
expect(invitatoryFullLatin(FERIAL_DATE)).not.toContain('Regem Apostolórum');
|
expect(invitatoryFullLatin(FERIAL_DATE)).not.toContain('Regem Apostolórum');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user