Monastic 1617 has no Preces feriales at Lauds at all -- content sourced
from Tridentine 1906/1910 per direct instruction, same track as the
Cross suffrage and St. Joseph's suffrage. New lauds-preces-feriales.yml
(Kyrie, Pater noster, the full versicle litany, Psalm 129, closing
versicles) transcribed from a live query against a clean Advent feria,
matching what actually rendered rather than the underlying template's
own conditional markup (the Pope/Bishop and benefactors' versicles are
both dropped live despite being present in the template; the King/nation
versicle pair is kept despite the template's own rubric note suggesting
otherwise).
New `lauds-preces` part kind (hours/types.ts) picks between this and the
existing short Sunday/feast litany (lauds-short-litany.yml, unchanged
content) on a ferial-or-vigil day. Deliberately not the shared
`isSundayOrFeast` predicate, which treats a Vigil as a "feast" -- here a
Vigil needs to land on the ferial side instead, per direct instruction.
Also deliberately wider than the real 1906/1910 rubric itself, which
restricts the fuller form to Advent/Lent/Ember days specifically -- shown
on *every* ferial or vigil day instead, mirroring the identical explicit
choice already made for Prime's own ferial Preces.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Checked directly against Monastic Tridentinum 1617 (not just the
Tridentine 1906/1910 track the suffrage content itself comes from) --
this omission isn't a rubric-track-specific quirk, it holds under this
app's own primary source too:
- Advent, Christmastide, and Passiontide ferias: suffrages omitted
entirely. Confirmed ordinary Lent (weeks 1-4, not Passiontide) is NOT
excluded -- only the last two weeks are.
- Any day within an active octave: suffrages omitted entirely, however
low that octave's own rank is -- confirmed against day 2/3 of St.
Lawrence's own Semiduplex octave, well below the existing Duplex+
threshold.
Today (within Lawrence's octave) was showing all five suffrages before
this fix; the real office has none but the Marian antiphon.
Still not modeled, flagged in TODO.md: Paschaltide's own substitution
(a single alleluia-form "Suffragium Paschale" replaces the whole set
during Eastertide, rather than the ordinary set showing or being
omitted) -- a separate, larger feature.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Three things prompted by today's date resolving wrong:
1. St. Joseph's own Lauds suffrage was never modeled at all. Added
lauds-suffrage-joseph.yml, sourced from Tridentine 1906/1910 (the
reference engine's "Tridentine - 1906" version) per direct
instruction -- Monastic 1617's own suffrage set has no Joseph
suffrage at Lauds, so this one genuinely comes from a different track
than the other four.
2. The Cross suffrage's actual gating rule, live-verified against a
plain ferial win, a plain Sunday win, a low-rank saint's own win (even
bare Simplex), and Marian Saturday: it shows only when the bare
temporal feria itself is what's being prayed -- the opposite of
"Sunday or a feast of the Lord." Expressed as `!isSundayOrFeast(day)`
(the same ferial/festive split Prime's capitulum already uses) plus
one more exclusion for a named temporal identity like Marian Saturday,
which isn't Sunday or a sanctoral win either but still isn't a bare
ferial office.
3. The BVM suffrage is correctly dropped on Marian Saturday (unchanged
behavior, just now understood and commented correctly): it's specific
to a day whose own office is already Marian, confirmed via the same
live source, not a guess.
Also models St. Clare (Aug 12, Simplex under Monastic 1617) and surfaces
active octaves in getDayLabel, since today's date was resolving as a
plain ferial day instead of showing St. Lawrence's octave with St. Clare
commemorated.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Corrects the previous conclusion (that this id had no clean sourceable
date at all). The reference engine has a dedicated proper for this
Sunday, Tempora/Nat1-0, distinct from the individual octave-day saints'
own pages -- most years the Sunday loses outright to a Duplex-II-classis
octave saint (St. Stephen/St. John/Holy Innocents) and only earns a bare
commemoration, which is what the earlier search kept finding, but
2029-12-30 is a year where the Sunday wins outright with no
commemoration at all, so that's the date pulled from.
All 52 temporal ids (54 counting marian-saturday/christ-the-king) now
have an authored Benedictus antiphon, closing out the temporal half of
the "every sanctoral and temporal entry needs its antiphons" task for
real.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Pulls the Lauds Benedictus antiphon (Latin + English) for every
temporal-id proper except christmas-octave-sunday, completing the
"every sanctoral and temporal entry needs its antiphons" task
(sanctoral side finished in prior commits this session).
Dates were found programmatically: a Node script iterated resolveDay()
over full years to find, for each temporal id, the first date this
app's own calendar logic resolves to it, then each candidate date was
cross-checked against a live Divinum Officium (Monastic Tridentinum
1617) query to confirm the title has no saint collision before pulling
content. Four ids (easter-5, easter-6, post-pentecost-11,
post-pentecost-14) needed a second, alternate date after the first
candidate turned out to collide with a saint modeled in the live
reference engine but not in this app (St. Mark, St. Athanasius, Our
Lady of the Snows).
christmas-octave-sunday is deliberately left unauthored: every date it
can resolve to collides with a specific named octave-day feast in the
real calendar, so there's no clean generic content to source -- see
TODO.md.
Also updates tests/hours/lauds.test.ts: the old "falls back to missing
on a plain temporal day" test used a date that now has real content
(post-pentecost-11), so it's replaced with a test confirming that
content resolves correctly plus a new test specifically covering the
christmas-octave-sunday exception.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
On a free Saturday (nothing privileged already claims it, no active
octave), the day's own identity is now "Our Lady's Saturday" rather
than an anonymous ordinary-feria -- mirrors privileged-feria-minor
exactly, per direct instruction: Semiduplex-or-higher still wins
outright (Marian Saturday doesn't apply at all); below that (Simplex,
and Vigil, both under semiduplex on the FeastClass scale) loses and is
commemorated instead. Layered additively after decideOccurrence, same
shape as applyOctaves -- never touches decideOccurrence's own rules.
Needed a real winner identity (not just the plain temporal feria id)
so day-label/antiphon/collect sourcing can recognize it -- added a
temporal-feasts record purely for that, and taught getDayLabel to
check it for any named temporal winner (a small, free improvement for
Christmas/Pentecost's own labels too, previously unhandled).
hours: build the duplex-majus+ Lauds psalmody override (per-feast)
lauds-psalmody no longer unconditionally uses the plain weekday
default: a duplex-majus-or-higher sanctoral winner, or Our Lady's
Saturday (unconditional, no rank threshold -- it isn't competing with
the weekday default the way a saint is), now substitutes its own
proper psalm groups/antiphons/canticle. Per-feast, not per-Common, per
direct instruction, even though most duplex-majus+ saints across the
year don't have one authored yet and fall back to the plain weekday
default until they do.
Content for the worked example (St. Lawrence's own day) surfaced a
real bug while sourcing it: st-lawrence-antiphon.yml had been read
from the Roman/secular rite's own [Ant 1], not Monastic 1617's actual
Benedictus antiphon for that day -- corrected from a fresh live query.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Per direct instruction: RB 13 says this canticle "in duas glorias" --
two pieces, each closing with its own Gloria Patri, framed by one
shared antiphon (opening before the first, full only after the
second) -- not joined into one continuous block the way this was
first built. canticleText() now takes an optional verse slice so
Saturday can ask for two.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
By explicit choice, not the honest-missing placeholder from before: a
genuinely per-annum, unprivileged Saturday isn't achievable (every one
is either Marian-Sabbato-overridden or in a privileged season with its
own swapped hymn), so Sanctae Mariae Sabbato's own hymn ("O gloriosa
Domina") becomes Saturday's default rather than leaving a gap.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Opening versicle; Ps 66 (fixed, no antiphon at all); the weekday-
variable psalm groups (Ps 50 plus 1-2 more, framed by their own
antiphon each, wholesale-substituted by Sunday's Ps 50+117-share-one-
antiphon shape); the weekday OT canticle; the Laudate psalms (148-150)
under one more shared antiphon; the weekday chapter/responsory/hymn/
versicle bundle; the Benedictus (framed by a day-resolved antiphon,
same incipit-or-full/full-repeat shape as Compline's Nunc Dimittis);
the Kyrie/Pater-noster short litany; the day's collect(s) — winner
plus one per commemoration, via the new getDayCollects; the four
Tridentine suffrages (omitted on a Double-or-higher feast); the
conclusio; the closing versicle (the silent Our Father that precedes
it isn't re-rendered, its text having already appeared once at the
short litany); and the closing Marian antiphon, reusing Compline's own
mechanism exactly.
Known, deliberate gap, not yet fixed: the psalmody doesn't model the
Commune/feast override real practice applies on a Semiduplex-or-higher
day (substituting an entirely different psalm+canticle set) — every
day currently gets the plain ferial weekday distribution regardless of
who wins. That's a separate, larger propers-authoring task (a full
Common-of-Saints psalm set per Common).
Also a simplification in getDayCollects: each collect in a multi-
collect day renders as its own complete "Let us pray ... Amen." block,
rather than the more compressed real form (one "Let us pray," only the
last collect's doxology).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>