Record that showing the ferial Preces on every ferial day (rather than
only Advent/Lent/vigils/Ember, per the historical rubric) is a
deliberate, currently-unaddressed backlog item, not an oversight.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HWN869GrMFHqrer9fdCBbF
Proof content for the new Common-fallback mechanism, live-verified
against Divinum Officium (Monastic Tridentinum 1617): Lauds chapter/
responsory/hymn/versicle ("Jesu coróna célsior"), cross-checked
byte-identical between St. Louis's and St. Nicholas of Tolentino's own
days. Vespers bundle (hymn "Iste Conféssor Dómini sacrátus", reusing
the already-authored Matins hymn translation) sourced via the
reference engine's votive=C5 view instead of a real saint's own Second
Vespers, since every saint in this Common category has their own
Second Vespers permanently outranked by an adjacent fixed feast.
TODO.md records the fuller sourcing detail and the remaining open
Common categories.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HWN869GrMFHqrer9fdCBbF
Marks the Confessors (C4) hymn gap from the 2026-08-24 entry as done
and logs the Monastic-vs-secular textual-variant finding as a general
lesson about not trusting reused reference-engine translations.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019jHSimu99UDKh1pRRd11uV
Documents the full set of changes from this session: the
nocturnReadingIds precedence bug fix, the new Matins hymn Common-tier
and invitatory-antiphon mechanism (Common-of-an-Apostle content
authored, other Commons/seasons logged as backlog), the antiphon-
doubling dedup, and the Terce/Sext/None hymn dedup — including why the
Lauds/Vespers office-bundle resolvers were deliberately left alone
(they turned out not to be byte-identical: different override-
eligibility semantics) and why Matins's own octave hymn tier isn't
redundant with resolveOfficeWinner's octave-folding.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F25189JqjXddUhU9hM9nUS
Matins now sings "Te decet laus" (Psalterium/Common/Prayers.txt's [Te
decet]) immediately after the Te Deum on every 3-nocturn day, matching
Rule of Benedict ch. 11's close of Vigils. New common text
te-decet-laus.yml, wired into both matins.ts branches that render a Te
Deum; absent on ferial days along with it.
Also drops Psalm 129 (De profundis) from the Lauds ferial Preces and
Psalm 50 (Miserere) from the Vespers ferial Preces, per direct
instruction — both were embedded inline in the live-transcribed text.
Updated the affected fixture tests to key off a versicle that survives
the removal instead of the now-absent psalm text.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWzE3kaSZCs79fPBrrE1aF
All 53 nocturn-readings files with a responsory field started straight
into the text with no leading R., unlike octave-readings' own R./V.
convention. Fixed in content per direct instruction (not injected at
render time), matching each file's own existing plain V./R. style rather
than switching to octave-readings' R./V. glyphs.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWzE3kaSZCs79fPBrrE1aF
buildReadingPool concatenated readings in id-processing order, so a later
post-Pentecost Sunday's Nocturn 3 (from its own temporalId file) could land
ahead of its Nocturn 2 (from the newly-added month-week id) in the pool,
flipping which nocturn slot each landed in. Group by each reading's own
nocturn tag instead, ascending, preserving id/file order within each group.
Also logs three follow-up items to TODO.md: displaying "Te decet laus",
the missing responsory marker convention in nocturn-readings content, and
removing Ps 129/50 from the Lauds/Vespers ferial Preces.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWzE3kaSZCs79fPBrrE1aF
The later post-Pentecost Sundays' real Nocturn 2 patristic content isn't
keyed by Pentecost offset in the reference engine — it's keyed by civil
calendar month/week (the old "Scriptura occurrens" cycle), which shifts
relative to post-pentecost-NN every year depending on Easter's date. Port
Date.pm's monthday() algorithm (pre-1955/Tridentine rubrics) as a new,
date-driven id, author all 20 August-November month-week files from the
reference engine's Tempora/0MN-0.txt sources, and pool them in
hours/matins.ts as a third, independent reading source alongside the
existing temporalId lookup.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWzE3kaSZCs79fPBrrE1aF
Closes the gap the user found on 2026-08-23 (post-pentecost-13's Matins had
no patristic reading): nocturn-readings/ had content for only one temporal
id (post-pentecost-15, the original mechanism proof date). Since
resolveTemporalId maps every day in a liturgical week to the same id, one
file per id covers the whole week — authored all 23 remaining
post-pentecost-NN ids (01-14, 16-24) from the reference engine's own
Tempora/PentNN-0.txt files. Trinity Sunday (01) keeps its own full proper
office including a displaced-Sunday commemoration; 02-11 have real Nocturn
2+3 content; 12 onward are Nocturn-3-only (homily, Gospel incipit skipped
per convention), reusing the same two responsories the source itself
cross-references week to week.
Rest of the temporal cycle (Advent/Christmas/Epiphany/Septuagesima/Lent/
Easter) is a separate follow-up pass, tracked in TODO.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWzE3kaSZCs79fPBrrE1aF
Researched whether September/Advent Ember days belong in the
movable-feasts.ts table alongside Christ the King/Immaculate Heart of
Mary. Live-verified against the reference engine they don't: Ember days
are privileged ferias (a saint can still win outright against them), not
named feasts contesting the day by rank.
Two smaller pieces instead: calendar/temporal.ts's septemberEmberDayOffset
(Sunday nearest Sept 14, same "nearest" arithmetic adventStart already
used, factored into a shared nearestSunday helper) feeds a new
resolveTemporalCategory check giving those 3 dates privileged-feria-minor
(live-verified correct); calendar/ember-days.ts's applyEmberDay relabels
the day's own temporal id to the Ember day's own (so its real content is
found) when the feria itself wins, or adds a commemoration when a saint
does. Advent Ember days needed no precedence change -- Advent's own
season default already covers them.
Found and fixed a real bug along the way: matins.ts's nocturnReadingIds
only ever pulled a commemorated *sanctoral* id's own readings, never a
commemorated *temporal* one's -- so a commemorated Ember day (the common
case) would never have surfaced its own content. Same root cause as the
day.winner.id gap the IHM relocation fixed earlier, just hiding in the
commemorations loop instead.
Authored all 6 days' real collect + 3 Matins readings each, transcribed
directly from the reference engine (September: Tempora/093-{3,5,6}.txt;
Advent: Tempora/Adv3-{3,5,6}.txt, whose lessons are themselves a
cross-reference to the Annunciation's own Common, followed and
transcribed from there). Kept as 3 separate readings per day rather than
the usual combine-into-one default, since each carries its own
genuinely distinct proper responsory.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VZSAgRi4QE4XRTqVto93zA
The bespoke applyImmaculateHeart function (following the applyMarianSaturday/
applyChristTheKing precedent of one hand-written override function per
feast) doesn't scale: several more feasts are planned that all reduce to
"weekday N days from Easter Sunday" (Ember/Rogation days, more
Sacred-Heart-family Marian devotions, St. Joseph's pre-1955 Eastertide
feast, Lenten Friday Passion devotions), and one-off functions invite
subtle ordering bugs -- applyImmaculateHeart had to be sequenced after
applyMarianSaturday specifically or it would have been silently clobbered.
Replaced with calendar/movable-feasts.ts's generic applyMovableFeasts,
which scans calendar/temporal-feasts.ts's existing per-feast YAML records
for a new optional `easterOffset` field. Adding the next movable feast is
now a new data/calendar/temporal-feasts/<id>.yml file with `rank` and
`easterOffset` set, not a new TypeScript function. Same rank-compared,
commemorate-the-loser semantics as before, just centralized instead of
duplicated per feast.
christ-the-king, marian-saturday, and christmas-octave-sunday stay as
their own functions -- they're structurally different rules (a fixed
month-position search, a date-less fallback default, and a fixed-date-
range Sunday search, respectively), not Easter offsets, so force-fitting
them into this table wouldn't actually simplify anything.
No behavior change -- the existing Immaculate Heart of Mary test suite
passes unchanged through the new generic path.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VZSAgRi4QE4XRTqVto93zA
resolveMatinsHymn's own doc comment already claimed the octave "keeps
the feast's own proper hymn all week," but the code never implemented
it -- it only matched when the day's own winner literally was
`assumption` (Aug 15 itself). Every other octave day (16, 17, 19, 20,
21, none of whom has a Matins hymn of their own authored) fell straight
through to the plain ferial hymn instead.
Adds a real octave-fallback tier between the existing per-feast override
and the seasonal tier. A deliberate departure from the reference engine,
which doesn't do this either (Monastic 1617's octave days have no
[Hymnus Matutinum] override at all) -- consistent with how this project
already treats octave readings/commemorations more generously than any
one source track.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VZSAgRi4QE4XRTqVto93zA
Fixed Aug 22 collided outright with the Assumption's own octave-closing
day (both this project's blended calendar tracks are kept deliberately,
so one shouldn't permanently suppress the other). Moved IHM to the
Saturday after the Feast of the Sacred Heart -- its real diocesan date
from 1914 until Pius XII's 1944 fixed-date decree, and also the date the
1969 reform returned to.
Required real new mechanism, not just a data move: a new bespoke
calendar/index.ts override (applyImmaculateHeart, following the existing
applyMarianSaturday/applyChristTheKing precedent), a move from the
sanctoral saints store to the temporal-feasts store (different propers
lookup entirely), and a real bug fix in matins.ts's nocturnReadingIds,
which only ever picked up a *sanctoral* winner's own reading file.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VZSAgRi4QE4XRTqVto93zA
sundayPsalmNocturn/sundayCanticleNocturn only ever rendered a
versicle's V. line, silently missing the responsory for Sunday Matins
and every Duplex+ weekday feast using matins-psalmody-overrides. Both
now share the versicleText helper introduced for the ferial nocturn
antiphons, which combines V./R. into one block.
Every non-Sunday, non-Duplex+ Matins nocturn rendered bare psalms with
no antiphon at all. Sourced each psalm's antiphon from Divinum
Officium's Monastic Matins psalter and regrouped to fit
psalter-distribution.yml's own already-established (and non-historical)
weekday psalm redistribution, since the source's own per-weekday
antiphon pairings don't survive that reslice intact.
Two new mechanism-gap items: an arbitrary-date calendar picker (day-nav
currently only steps one day at a time) and a "read it to me" audio
interface via the Web Speech API for long texts.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L3wxvz3mPXiHxkPB5JpnmD
Builds every day label as a {en, la} pair (weekdays, ranks, season/ordinal
phrasing authored in Latin; proper names without an authored Latin form
fall back to their English string) and merges the date+day-label into one
header in the day-nav bar.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Documents the Francis of Paola / Basil the Great live-verification,
the identical-apart-from-versicles finding, the Duplex+ saints checked
for proper-antiphon eligibility, and the M1617-kalendar wrinkle found
along the way (a SanctiM file existing doesn't mean the saint is
actually on the Monastic Tridentinum 1617 calendar).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
getMatinsPsalmodyOverride is now a genuine 3-tier lookup: proper
(saints/) -> Common (categories/, joined via the winner's own
SaintRecord.common) -> the plain ferial fallback, reversing the earlier
"category files are documentation-only" decision now that two
categories are trusted. Category files gain an `aliases` field;
common-of-a-martyr.yml lists common-of-a-martyr-bishop, since the
reference engine's own Matins psalmody redirects that Common outright
to plain Martyr — so its three Duplex+ saints (Ignatius, Callistus,
Boniface, none with proper text of his own) get real Common-tier
content with no new authoring.
tests/hours/matins.test.ts's old ferial-fallback proof (St. Ignatius)
is rewritten as a Common-tier proof; a fresh ferial-fallback proof
(St. John Bosco, an unauthored Confessor category) replaces it.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Two categories live-verified: common-of-a-martyr (from St. Ignatius of
Antioch, whose own office is entirely Common — also confirms
Common-of-a-Martyr-Bishop redirects to this same scheme, and that none
of its 3 Duplex+ saints has a proper antiphon of his own) and
common-of-an-apostle (from St. Bartholomew). St. Andrew authored as the
second saint-level proof, sharing the apostle category's psalm numbers
in every slot with his own proper antiphon text.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Christmas Octave's own commemoration blocks are now modeled -- see the
prior two commits. Updates the top-of-file priority summary and the
dated build-log entry to reflect this.
Finding of the Holy Cross (May 3), the Transfiguration (Aug 6), the
Exaltation of the Holy Cross (Sep 14), and Dedication of the Basilica of
the Most Holy Savior (Nov 9, the Lateran) were all excluded under the
same stale "fixed feast of the Lord, not modeled" note that turned out
wrong for Our Lady of the Snows. All four have real, complete content in
the reference engine. Presentation of the BVM (Nov 21) was excluded
under the equivalent "fixed BVM feast" note and is added the same way.
- finding-of-the-holy-cross: fully proprium, own collect/antiphon/Matins
throughout; now correctly outranks
ss-alexander-eventius-theodulus-and-juvenal, matching what that
saint's own file already documented as the live reality.
- transfiguration: same proprium shape. Its subordinate saints (Ss.
Xystus/Felicissimus/Agapitus) stay excluded -- blocked by the real,
separate octave/subordination-rendering gap, not by an unmodeled
Transfiguration.
- exaltation-of-the-holy-cross: reuses the Finding of the Holy Cross's
content wholesale (ex Sancti/05-03) -- collect/antiphon via a cross-id
`propers` pointer, Matins nocturn-readings duplicated (no cross-id
lookup exists for that mechanism).
- dedication-of-the-basilica-of-the-most-holy-savior: reuses the
existing Common-of-a-Dedication (collect-c8, benedictus-antiphon-
common-of-a-dedication), real unique Nocturn 2 vita of her own. Her
secondary, St. Theodore, stays excluded for the same
octave/subordination reason as above.
- presentation-of-the-bvm: real unique collect of her own; her
Benedictus antiphon is a substituted Common reference
(truncate-and-add-alleluia edit specific to this feast), authored as
her own file.
Also: our-lady-of-the-snows.yml was missing its own Nocturn 3 (she
defers to Commune/C11's own Gospel-incipit-plus-Bede-homily, same as
Presentation of the BVM) -- added.
Test updates (not regressions): three tests had fixed proof dates
colliding with the newly-added feasts, updated to reflect the new,
correct behavior. npm test (365 tests) and tsc --noEmit both pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Previously excluded entirely under a stale "fixed BVM feasts aren't
modeled" note -- wrong: this app already models three other fixed BVM
feasts (assumption, immaculate-conception, nativity-bvm), and this one
has real, complete content too. Sancti/08-05.txt's untagged rank block
gives her Duplex Majus with real Nocturn 2/3 content (the
miraculous-snowfall founding legend of St. Mary Major); SanctiM/08-05.txt
confirms she's on the Monastic 1617 track too, reslicing the same
Lectio4-6.
Unlike the other three BVM feasts, she has no proper collect or
Benedictus antiphon of her own (her Rule says "ex C11" -- Common of
Feasts of the BVM) -- collect-c11.yml and
benedictus-antiphon-common-of-the-bvm.yml are real, reusable Common
templates, wired via collectCommon/benedictusCommon like any other
Common-only saint, not a private per-saint duplicate.
Live-checked via direct resolution: she wins outright on 2026-08-05 and
2027-08-05, with antiphon, collect, and Matins reading all resolving
verified. npm test (365 tests) and tsc --noEmit both pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
st-telesphorus, st-hyginus (Jan 5/11, octave-absorbed — their day's Nocturn
2/3 is given over to a Nativity/Epiphany homily rather than their own vita)
and vigil-of-st-john-the-baptist, vigil-of-st-lawrence (Vigils whose single
3-lesson nocturn was misread as "no content") were left unauthored earlier
in the SanctiM pass on the theory that non-proper-to-the-saint text
shouldn't be sourced. Per direct correction: this app pools every available
reading first and figures out display later, so real sourceable text
belongs in the pool even when it isn't proper to that particular saint —
flagged as such in each file's own header, not disguised as the saint's
own vita. vigil-of-all-saints was re-checked under the same policy and
confirmed still genuinely contentless (a bare @Commune rubric).
npm test (365 tests) and tsc --noEmit both pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
13 of December's 15 SanctiM-track saints authored (st-bibiana, st-nicholas,
st-ambrose, immaculate-conception, st-damasus, st-lucy, st-thomas-apostle,
st-stephen-protomartyr, st-john-apostle, holy-innocents, st-thomas-becket,
st-silvester-i, st-eusebius-of-vercelli); st-barbara and st-melchiades left
unauthored as Common-only. This is the twelfth and final month of the
SanctiM (Monastic 1617)-track saints' Matins readings pass — 129 saints
authored across the whole year.
Adding St. Eusebius of Vercelli's content surfaces a 3rd Matins lesson on
the existing Advent III Tuesday proof date (Dec 15 falls under his
commemoration); updated matins.test.ts accordingly — the "commemorations
get their own reading" design working as intended, not a regression.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
14 of November's 16 SanctiM-track saints authored, including All
Saints of the Benedictine Order -- a genuinely Monastic-only feast
with both rich content and (unusually for this pass) an available
English translation. St. Martin I is another off-date case like St.
Paul the Hermit, and two more saints (St. Emilian, St. Odo) turn out
Monastic-only-but-Common-only, extending October's wrinkle.
9 of October's 13 SanctiM-track saints authored. Found a new wrinkle:
St. Justina and St. Gall are genuinely Monastic-only (no Tridentine
file at all) but their own SanctiM files turn out to be Common-only
with no proper Lectio content -- being Monastic-only doesn't guarantee
real text to transcribe.
All 9 of September's SanctiM-track saints authored -- the first full
month in this pass with nothing left unsourced. Includes the
Dedication of St. Michael the Archangel, whose SanctiM file borrows
structure from his separate May 8 Apparition file but still resolves
its actual readings back to this day's own Tridentine content.
13 of August's 16 SanctiM-track saints authored, including the Duplex
I class feasts of St. Lawrence and the Assumption of the B.V.M. The
Assumption's presence confirms this app's calendar already maps fixed
BVM feasts, despite an older note in the parent workspace CLAUDE.md
suggesting otherwise -- flagged in memory as stale documentation to
verify against, not trust blindly. 3 saints left unsourced (Common-only
or Nocturn-1-only vigil content).
13 of July's 18 SanctiM-track saints authored (5 left unsourced,
Common-only). Discovered the Monastic calendar keeps a full Octave of
St. Benedict (Jul 11-18), which explains several dates' SanctiM files
not matching their expected saint. Also hit a translation-misalignment
bug on St. Bonaventure's English source (paragraph boundaries don't
line up with the Latin), worked around with an original translation.
12 of June's 13 SanctiM-track saints authored, including the major
Duplex I class feast of Ss. Peter and Paul. One left unsourced (the
Vigil of St. John the Baptist has only a Nocturn 1 scripture reading
in the source, nothing proper to author for Nocturn 2/3). Found a new
wrinkle: St. William Abbot has real vita content in both tracks,
essentially the same story independently transcribed — sourced from
the Tridentine file since only it has an English translation.
12 of May's 13 SanctiM-track saints authored (1 left unsourced,
Common-only). Resolves an old loose end from the pre-1955 pass: St.
Romanus Abbot does have a real SanctiM file after all, it's just
Common-only with no proper Lectio content, which looked like a missing
file until actually opened. Also the first isGospel:true case since
January (Ss. Philip and James's Nocturn 3 has a full Gospel pericope,
not a bare incipit).
All 9 of April's SanctiM-track saints authored. Found a new wrinkle:
St. Catherine of Siena and St. Peter Martyr sit on swapped dates
between this app's calendar and the general Tridentine one (Apr 29/30
each way), not just an off-by-a-few-days shift like earlier cases.
Also hit a reference-engine data bug on St. George (English prose
filed under a Latin heading) and another genuinely Monastic-only saint
(St. Robert of Molesme) needing an original translation.
All 6 of March's SanctiM-track saints authored. St. Benedict's own
patronal feast turns out to be the richest case in this pass so far:
its Nocturn 3 is genuinely Monastic-only content (a St. Peter Damian
sermon) absent from the Tridentine track entirely, unlike every other
saint done so far where the SanctiM file just reslices the same
Tridentine text. Also caught a case (St. Gregory the Great) where a
saint's SanctiM file carries content copied verbatim from an unrelated
feast rather than anything proper to the saint himself.
8 of February's 10 SanctiM-track saints authored (2 left unsourced —
Common-only, no proper text in the source). Two more turned out to be
missed pre-1955-pool candidates rather than genuine SanctiM cases
(their date's SanctiM file belongs to a different saint sharing the
date). Also settles a convention for bare Gospel incipits followed by
a real homily: author the homily alone as isGospel:false rather than
including the incipit line under isGospel:true.
Starts the bulk-content pass complementary to the pre-1955 saints pass:
11 of January's 13 SanctiM-track saints authored (2 left unsourced —
their Nocturn 2/3 content is entirely octave homiletic material, no
proper vita text in either track). Most SanctiM files turn out to be
thin rule overrides pointing back at the same Sancti/ text; only
St. Maurus (Monastic-only, no Sancti file) needed direct SanctiM
sourcing, with an original translation for its missing English source.
Removes the resolved "mechanism gap" entry (it turned out to need no
new mechanism, just sourcing), adds a dated build-log entry with the
sourcing method and the critical "plain Sancti/MM-DD.txt file is often
the wrong saint" wrinkle, and repoints the remaining backlog at the
larger Monastic-1617-track saint pool.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Post-Pentecost overflow years (early Easter, fewer than 6 Sundays after
Epiphany fit before Septuagesima) previously clamped every excess Sunday
to post-pentecost-24 instead of resuming the skipped post-Epiphany
Sundays' own content, per the traditional rubric. Ported directly from
the reference engine's own DivinumOfficium/Date.pm getweek().
Also adds the Epiphany VI Saturday-before-Septuagesima commemoration
(only when Epiphany V was the last Sunday to actually occur), and fixes
day-label.ts's on-screen display to track the same resumed-Sunday
content instead of a raw elapsed-week count — including a correction so
the fixed final Sunday of the year always reads "23rd Sunday after
Trinity", not a per-year-varying number.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The user's own reading plan isn't sourced from a historical breviary, so
"not yet spot-verified against a reference" wasn't a real gap for this
content, unlike sanctoral/temporal data. Also confirms Jn 17 on Sunday
after Ascension as a deliberate, remembered exception.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Converts all ~369 non-blank rows of the user's own scripture-reading
plan TSV into data/hours/bible-plan/*.yml, mapping each row's day label
to this app's (temporalId, weekday) or Dec25-Jan13 calendarDate scheme.
Fixes a few source TSV typos in the process (chapter-range and
trailing-colon citations); status stays explicitly `missing` pending the
separate Vulgate/Douay-Rheims import.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replaces the fixed Nocturn 1 = plan / Nocturns 2-3 = patristic slotting
with one ordered pool (scripture plan, winner/commemorations/temporal id,
active octaves) sliced evenly across however many nocturns the day has.
Also makes the bible-plan store dual-keyed so the Dec 25 - Jan 13 stretch
can key off a fixed calendar date alongside the usual (temporalId,
weekday) key. Mechanism only — content authoring is still 2 proof dates.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Records what shipped in the previous two commits, plus the known gaps
(5 hymns with a seasonally-variable doxology not modeled, same class
as the Paschaltide alleluia suffix elsewhere in this file).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Live-querying settled the "sometimes 1, sometimes 2 allelúja" question:
categories without their own dedicated Paschaltide source-text chain
(Confessor-Bishop/Doctor, Abbot, Virgin, ...) get a mechanical single
suffix appended at render time, not a rank/octave-dependent count.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The last 2 duplex-majus+ saints held back from the original 29-saint
P/T/S/N pass (for lacking a collect at the time) get the same
individual live-query treatment as their peers: real, unique proper
text for both (St. Benedict's own Prime antiphon is the opening line of
St. Gregory the Great's Life of St. Benedict; All Saints of the
Benedictine Order draws on Matt 13:43, Luke 6:22-23, and a well-known
All Saints antiphon) -- 14 new files, English translated throughout
since the source rendered none for either.
A final calendar-wide sweep (every saint's resolveMinorHourAntiphon/
resolveMinorHourChapter) turned up one more real gap, in the mechanism
itself rather than missing data: St. Michael's propers field points at
Apparition of St. Michael's own id (the two feasts are word-for-word
identical), and getDayCollect/getBenedictusAntiphon both explicitly
follow propers when resolving content -- but getMinorHourOverrideId
doesn't; it keys off the day's own winner id directly, so
resolveMinorHourAntiphon was looking for a file that could never exist.
Fixed the same way as Finding of St. Stephen: minorHoursCommon points
directly at his delegate's already-authored proper files.
Every real saint on this app's calendar now has real P/T/S/N content.
The only remaining absence is Ss. Ursula and Companions (no way to
verify a category of one) and the example-confessor test placeholder,
which was never meant to have any.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The original 29-saint P/T/S/N pass only ever covered duplex-majus+
saints; every below-majus saint from the *original*, pre-94-batch
109-saint pass had never had Prime/Terce/Sext/None attempted at all --
same gap already found and fixed for the 94-batch's own below-majus
saints, now closed for the rest of the calendar too.
Reused the Kalendaria-table-validated fileref approach rather than a
blind Sancti/MM-DD.txt read -- a real near-miss caught this early: St.
Apollonia's Sancti/02-09.txt is currently St. Cyril of Alexandria's (a
19th-century addition to that filename slot); blind reading would have
silently attributed his Doctor-of-the-Church Common to her. Also fixed
a regex bug the same pass turned up: the "vide"/"ex CXX" pattern
matched the bare word "Commune" (no number) and reading-specific
sub-references like "ex C4 in 2 loco" -- found via St. Clement, whose
Monastic-specific [Rule] override has neither a clean "vide CXX" nor a
number after "Commune."
90 below-majus saints swept, ~82 wired directly into the categories
already established in the previous commits -- no new content needed,
every C-number variant found already falls inside an already-verified
family.
A real bug this pass caught and fixed in its own output: Ss. Ursula and
Companions (deliberately left minorHoursCommon-unwired) got swept up
and wrongly wired, since she has collectCommon set despite propers:
null and being a genuine commemoration-only stub -- the Kalendaria
lookup silently defaulted to St. Hilarion's own primary slot at her
shared date. Caught by cross-checking every swept saint's propers field
for this exact pattern; reverted.
A real new category found: Doctors of the Church are not one thing.
6 of the 7 saints whose own [Rule] says "vide C4a" (Athanasius,
Augustine, Basil the Great, Hilary of Poitiers, John Chrysostom, Leo I)
render P/T/S/N byte-identical to the already-verified
common-of-a-confessor-bishop -- wired directly. St. Gregory the Great is
the one genuine exception: his own live-rendered P/T/S/N is real, unique
proper text (his own election, his Liber Regulae Pastoralis, the
dove-and-quill legend, the "non Angli sed Angeli" episode) -- 7 new
files, English translated throughout since the source rendered none.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>