Prime: real content (psalms, Martyrology, Regula) and ordo corrections
Deploy / deploy (push) Failing after 21s

Pulls in verified content from Divinum Officium rather than placeholders:
17 psalms (2, 6, 7-19, 118, 129), 365 days of the Martyrology, and the full
121-reading Regula cycle, plus the Athanasian Creed.

Ordo corrections driven by review against the real engine output:
- Capitulum and Preces now pick a Sunday/feast vs. ferial form
  (calendar/isSundayOrFeast); ferial Preces said every ferial day by choice.
- Chapter responsory, hymn doxology, and the opening versicle's
  Alleluia/Laus tibi all vary by season via a shared resolver
  (hours/seasonal-propers.ts).
- Real Roman Kalends/Nones/Ides Latin dating (calendar/roman-date.ts,
  verified against 363/365 real Martyrology headings) plus the historical
  "bis sextus" Feb 29 handling, and the Martyrology's Luna (moon-day)
  heading (a ported Golden-Number calculation).
- Fixed responsory structure (was missing its initial full repeat),
  weekday psalm antiphons (opening as incipit-or-full by rank, full
  repeat after the psalms/Creed as its own part, "*" chant mark kept),
  scripture citations on the capitulum/lectio brevis, and V./R. markers
  switched from Unicode symbols to plain text for reliable font rendering.
- Dropped Pretiosa and the dead-commemoration psalm (129) for time;
  trimmed section headings down to the ones that are actually named
  things (Preces, Chapter Office, etc. no longer relabel connective text).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-09 20:03:53 -04:00
parent a5dc6502d7
commit 58958aa847
571 changed files with 21842 additions and 72 deletions
@@ -0,0 +1,5 @@
# Per-feast override of the hymn's doxology stanza — real Divinum Officium
# has a `winner{Doxology}` mechanism for this (some feasts specify their own).
# Empty until milestone 4's sanctoral propers store exists, same as
# prime-chapter-responsory-by-feast.yml.
byFeastId: {}
@@ -0,0 +1,14 @@
# Which common proper supplies the hymn's final doxology stanza, by season.
# Advent has no special doxology in the source data — it falls through to
# perAnnum, same as any season not listed here. Same PLACEHOLDER caveat as
# prime-chapter-responsory-by-season.yml: real season resolution doesn't
# exist until milestone 4, so this can't be exercised by real data yet.
perAnnum: hymn-doxology-per-annum
bySeason:
christmastide: hymn-doxology-nat
epiphanytide: hymn-doxology-epi
eastertide: hymn-doxology-pasch
ascensiontide: hymn-doxology-asc
pentecost: hymn-doxology-pent
corpus-christi: hymn-doxology-corp
sacred-heart: hymn-doxology-heart
+27
View File
@@ -0,0 +1,27 @@
# Verified against Divinum Officium ("Psalmi minor.txt", [Monastic_]
# section, both languages). One antiphon per weekday, framing that day's
# whole psalm group. Each string carries its own incipit/full split via an
# embedded "*" (same convention as the source) — see hours/antiphon.ts for
# how that's used: incipit (or full, on a Double-or-higher feast) before the
# first psalm, full text always after the last.
sunday:
la: "Allelúja, * allelúja, allelúja (allelúja)."
en: "Alleluia, * alleluia, alleluia (alleluia)."
monday:
la: "Servíte Dómino * in timóre: et exsultáte ei cum tremóre."
en: "Serve ye the Lord with fear: * and rejoice unto him with trembling."
tuesday:
la: "Deus judex justus, * fortis et longánimis: numquid irascétur per síngulos dies?"
en: "God is a just judge * strong and patient, will He be angry every day?"
wednesday:
la: "Exsúrge, Dómine * non præváleat homo."
en: "Arise, O Lord, * let not man be strengthened."
thursday:
la: "Cantábo Dómino, * qui bona tríbuit mihi."
en: "I shall sing to the Lord, * who hath given good things to me."
friday:
la: "Bonórum meórum * non indiges, in te sperávi, consérva me, Dómine."
en: "Thou hast no need of my goods * preserve me, O Lord, for I have put my trust in thee."
saturday:
la: "Vivit Dóminus, * et benedíctus Deus salútis meæ."
en: "The Lord liveth, and blessed be my God, my salvation."
@@ -0,0 +1,8 @@
# Per-feast override of the chapter responsory's verse — some sanctoral
# feasts replace the seasonal verse with their own (real Divinum Officium's
# `winner{'Versum Prima'}` mechanism). Empty until milestone 4's sanctoral
# propers store exists (LiturgicalDay.occurring is always [] until then, so
# this table has nothing to key against yet) — see
# src/hours/chapter-responsory.ts for how a lookup miss falls back to the
# season table above.
byFeastId: {}
@@ -0,0 +1,20 @@
# Which common proper (see data/propers/common/prime-chapter-responsory-*)
# supplies the short responsory's variable verse, by season.
#
# PLACEHOLDER keys: calendar/index.ts's season resolution is a hardcoded
# stub until milestone 4 (see calendar/types.ts's Season comment), so this
# table can't actually be exercised by real season data yet — it always
# falls through to "per-annum" (see src/hours/chapter-responsory.ts). The
# season *names* here are provisional guesses at what milestone 4's
# temporal-cycle ids will actually be called; expect to revisit the keys
# once that's real, not just fill in more of them.
perAnnum: prime-chapter-responsory-per-annum
bySeason:
advent: prime-chapter-responsory-adv
christmastide: prime-chapter-responsory-nat
epiphanytide: prime-chapter-responsory-epi
eastertide: prime-chapter-responsory-pasch
ascensiontide: prime-chapter-responsory-asc
pentecost: prime-chapter-responsory-pent
corpus-christi: prime-chapter-responsory-corp
sacred-heart: prime-chapter-responsory-heart
@@ -0,0 +1,10 @@
# Which common proper supplies the opening versicle's ending
# (Allelúja vs. Laus tibi), by season. Septuagesima/Lent/Passiontide all
# drop the Alleluia — same PLACEHOLDER caveat as the other by-season
# tables: real season resolution doesn't exist until milestone 4, so this
# always falls through to perAnnum today.
perAnnum: prime-opening-alleluia
bySeason:
septuagesima: prime-opening-laus-tibi
lent: prime-opening-laus-tibi
passiontide: prime-opening-laus-tibi
+62 -6
View File
@@ -1,14 +1,70 @@
# PLACEHOLDER structure: proves the fixed-parts + weekday-variable-psalm
# pipeline works. The hymn/chapter/prayer textRefs don't resolve to real
# text yet (data/propers/ doesn't exist yet) — they render as "pending"
# in the UI. Real content is a separate task from this scaffolding.
# Ordo verified against Divinum Officium (Monastic Tridentinum 1617),
# 2026-08-25 run — see src/hours/prime.ts for how each part resolves.
#
# Deliberately deviates from that verified source in several places, all by
# explicit decision:
# - The opening Pater/Ave/Credo (said silently before "Deus in adiutorium")
# is dropped entirely, to keep the hour shorter.
# - The Regula reading and the generic Lectio Brevis are both said, in
# sequence — historically these are alternatives (Regula in choir, OR
# Lectio Brevis alone outside choir), not both.
# - A short responsory ("Christe, Fili Dei vivi") is said after the
# chapter — Monastic Prime doesn't actually have one (it goes straight
# from chapter to versicle); this is the Roman/secular breviary's,
# added by choice. See hours/chapter-responsory.ts for its seasonal
# (and eventually per-feast) variants.
# - The Athanasian Creed is included on qualifying Sundays even though
# Monastic Prime doesn't traditionally have it either — see
# hours/prime.ts's 'creed' case for the inclusion rule (a deliberate
# simplification of the real, much more tangled rubric).
# - The Pretiosa (the versicle/response said right after the Martyrology
# in choir) is dropped — a deliberate cut, not an oversight.
#
# The capitulum and Preces both use calendar/isSundayOrFeast to pick between
# a Sunday/feast form and a ferial form (see hours/types.ts's 'by-day-kind').
# By explicit choice, the ferial Preces are said on *every* ferial day, not
# just Advent/Lent/vigils/Ember days the way later rubrics restricted them.
#
# The dead-commemoration psalm (129, De profundis) is dropped by explicit
# choice — a deliberate time-saving cut, not an oversight. The intro/close
# responsory and collect around it are kept.
id: prime
parts:
- kind: opening-versicle
- kind: hymn
textRef: { source: common, id: hymn-iam-lucis-orto-sidere }
- kind: variable
resolve: by-weekday
- kind: chapter
textRef: { source: common, id: prime-chapter-ferial }
- kind: creed
- kind: closing-antiphon
- kind: by-day-kind
resolvedKind: chapter
sundayOrFeastRef: { source: common, id: prime-capitulum-dominica }
ferialRef: { source: common, id: prime-capitulum-feria }
- kind: variable
resolve: by-season
- kind: versicle
textRef: { source: common, id: prime-versicle }
- kind: by-day-kind
resolvedKind: preces
sundayOrFeastRef: { source: common, id: prime-preces-dominicales }
ferialRef: { source: common, id: prime-preces-feriales }
- kind: prayer
textRef: { source: common, id: prime-collect }
- kind: martyrology
- kind: preces
textRef: { source: common, id: prime-chapter-office }
- kind: rule-reading
- kind: lesson
textRef: { source: common, id: prime-lectio-brevis-per-annum }
label: Short Reading
- kind: preces
textRef: { source: common, id: prime-lesson-close }
- kind: preces
textRef: { source: common, id: prime-conclusio }
label: Conclusion
- kind: preces
textRef: { source: common, id: commemoratio-defunctorum-intro }
label: Commemoration of the Dead
- kind: preces
textRef: { source: common, id: commemoratio-defunctorum-close }