Own real Oratio and Nocturn 2-3 content (Duplex majus). This was the
only real gap left in December -- the rest of the month was already
complete from the earlier pre-1955 sanctoral pull. No test collisions:
Dec 3 was genuinely open.
This closes out the full-year sanctoral sweep (January-December).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
St. Charles Borromeo (11-04), the Octave Day of All Saints (11-08,
own real Cyprian/Augustine Nocturn 2-3 content, collect reused from
All Saints via cross-id propers), St. Albert the Great (11-15),
St. Gertrude (11-16), St. Felix of Valois (11-20). All Souls' Day
(11-02) deliberately skipped -- a Requiem office, not a normal
saint's office, a genuine mechanism gap.
Several new fixed-date Duplex+ saints displaced existing test
fixtures that had assumed particular dates were clean/ferial/
plain-Sunday: prime.test.ts's MONDAY constant, weekday.test.ts's
clean-Sunday case, and day-label.test.ts's post-Epiphany-overflow
and open-octave-day cases. Fixed by finding genuinely clean
alternate dates/years, never by weakening assertions.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Continues the full-year sanctoral import: the Guardian Angels (Duplex
majus, full proper content), St. Thérèse of Lisieux, St. Bruno, St.
Bridget of Sweden, St. Francis Borgia, the Maternity of the BVM (Duplex
II Classis, instituted 1931 for the 1500th anniversary of the Council
of Ephesus, full proper content), St. Edward the Confessor, St. Teresa
of Avila (distinct from St. Thérèse of Lisieux -- two different
Carmelite saints sharing a name), St. Margaret Mary Alacoque, St. Peter
of Alcantara, St. John Cantius, and St. Raphael the Archangel (own
full proper content, matching st-gabriel-archangel.yml's established
pattern for a Sancti file that redirects wholesale to another date's
file but still carries its own real content).
St. Raphael's new fixed day (Oct 24, Duplex majus) collided with the
"clean, empty Saturday" fixture used by three tests for Marian
Saturday/Lauds-psalmody-override behavior; moved all three to 2026-07-04,
verified genuinely free of any sanctoral entry (not even a commemorated
Simplex).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Continues the full-year sanctoral import: St. Stephen of Hungary, St.
Pius X, St. Lawrence Justinian, Ss. Protus and Hyacinth, the Holy Name
of Mary, the Seven Sorrows of the BVM (Duplex II Classis, own full
proper content except Nocturn 2, a real cross-reference to Passion
Friday's own temporal content), the Impression of the Stigmata of St.
Francis, St. Joseph of Cupertino, Our Lady of Ransom, and St.
Wenceslaus.
Ss. Protus and Hyacinth (Sep 11) were previously excluded under a
stale "real secondary saint blocked by the Nativity's own octave, same
as St. Clare in August" note -- wrong, same class of error already
corrected for St. Tiburtius/Susanna in August: the octave-window
exclusion was never a real rule. Sep 15 (day 8 of the Nativity's own
octave) is now also the Seven Sorrows' own fixed day (Duplex II
Classis), which wins outright with the octave still commemorated
alongside her -- updated september-sanctoral.test.ts's own "excluded
secondary saints" case accordingly, splitting it into the still-valid
Sep 9 (Gorgonius) half and a new Sep 15 case reflecting the real
winner.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Continues the full-year sanctoral import: Ss. Tiburtius and Susanna, Ss.
Hippolytus and Cassian, the Vigil of the Assumption, St. Joachim (Duplex
II Classis, own full proper content), St. Hyacinth, St. John Eudes, St.
Jane Frances de Chantal, the Immaculate Heart of the BVM (Duplex II
Classis, instituted 1942, full proper content), St. Joseph Calasanctius,
and St. Raymond Nonnatus.
Several of the new fixed dates (Aug 16, 17, 21, 22) fall within or
adjacent to St. Lawrence's and the Assumption's overlapping octave
windows and now win outright there under the ordinary-feria/ordinary-
sunday precedence rules, displacing what several existing tests
expected to be bare octave commemorations or ferial fallbacks. Updated:
- august-sanctoral.test.ts: Aug 22 now correctly shows the Immaculate
Heart of Mary as the winner, with the Assumption's octave still
commemorated alongside her.
- day-label.test.ts: the two octave-priority tests pinned to Aug 17
(now St. Hyacinth's own day) moved their "day 8 alone" case to All
Saints' own octave (Nov 8, still open); the two-octaves-overlap
comparison can no longer be demonstrated via any real date in this
app since every day where St. Lawrence's and the Assumption's octaves
genuinely overlap is now real sanctoral content -- the underlying
`pickWinningOctave` mechanism itself stays covered by
tests/calendar/octaves.test.ts's own synthetic-data unit test.
- vespers.test.ts: the Thursday Ps 138 split test moved off Aug 20,
whose own first Vespers is now claimed by St. Jane Frances de
Chantal's fixed day (Aug 21).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Continues the full-year sanctoral import: the Most Precious Blood of Our
Lord (Duplex I Classis, full proper office, elevated by Pius XI for the
1933 Redemption jubilee), the Visitation of the BVM (Duplex II Classis,
full proper office), St. Leo II, St. Anthony Mary Zaccaria, the Octave
Day of Ss. Peter and Paul (own real content, not a bare continuation),
Ss. Cyril and Methodius, St. Elizabeth of Portugal, St. Henry, Our Lady
of Mount Carmel, St. Vincent de Paul, and St. Ignatius of Loyola.
Also fixes a real pre-existing bug surfaced while authoring St. Leo II:
an earlier June sanctoral pull had mapped him to "06-28" (his own vita
text mentions his burial "upon the 28th day of June," but his actual
liturgical feast, per the reference engine's Sancti/07-03.txt, is July
3) with no saints/st-leo-ii.yml ever authored for it -- a wrong-date
stub, same class of artifact as the pre-existing St. Apollinaris
wrong-date bug already documented in july-sanctoral.test.ts. Removed
the stale June 28 entry now that he's correctly authored on July 3.
Two day-label tests pinned to Trinity-Sunday-relative dates that now
collide with new fixed feasts (Jul 6: Octave Day of Ss. Peter and Paul)
were moved to collision-free years/dates, and the July stub test
covering "pure octave-continuation days" was updated to a date (July 4)
that's still genuinely unmapped, since most of that range turned out to
have real content after all.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Continues the full-year sanctoral import: St. Angela Merici, St. Francis
Caracciolo, St. Boniface of Mainz (Bishop and Martyr, Apostle of Germany --
distinct from the earlier, unrelated St. Boniface Martyr already on May 14),
St. Norbert, St. Margaret of Scotland, and St. Aloysius Gonzaga.
Two of the new fixed dates (June 1, June 4) fall on dates used by two
day-label tests pinned to specific Trinity Sunday years; moved those to
years/dates free of the new entries, with explanatory comments.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Continues the full-year sanctoral import (see TODO.md/memory for Jan-Apr):
St. Pius V, St. Antoninus, St. Robert Bellarmine, St. John Baptist de la
Salle, St. Paschal Baylon, St. Venantius, St. Bernardine of Siena, St. John
Baptist de Rossi, St. Augustine of Canterbury, St. Mary Magdalene de Pazzi,
and the Queenship of the BVM (May 31, Duplex II Classis, instituted by Pius
XII's 1954 "Ad cæli Reginam" — full proper content, not a Common fallback).
Adding the Queenship to May 31 surfaces a real collision with Trinity
Sunday in years where Trinity falls on May 31 (2026): since this app
models Trinitytide Sundays as plain ordinary-sunday with no special
first-class standing, a Duplex+ sanctoral feast wins outright there per
the existing precedence rule. Updated the two tests pinned to that date
accordingly, with a third moved to a Trinity Sunday date (2023-06-04)
free of any sanctoral entry to keep testing the octave-vs-anchor-day
interaction in isolation.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
St. Isidore of Seville, St. Vincent Ferrer, St. Hermenegild, St. Anselm,
St. Fidelis of Sigmaringen, St. Peter Canisius -- April complete.
St. Peter Canisius is the second common-of-a-confessor-doctor saint
(after St. John Damascene in March), same benedictusCommon reuse
pattern. St. Hugh, Abbot (Apr 1) checked and correctly skipped: his own
file is Commemoratio-rank with only a collect, no Lectio content at
all to source.
npm test (365 tests) and tsc --noEmit both pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
St. John Capistrano -- March complete
Finishes March's sweep of previously-never-added sanctoral content.
The Annunciation (Mar 25) was one of the two feasts literally named in
this app's original stale "fixed BVM feast, excluded per the usual
convention" note (alongside Purification, already fixed).
St. John Damascene is the first common-of-a-confessor-doctor saint;
his own Commune/C5a points its own Benedictus antiphon back at C4a's,
so he reuses the already-authored
benedictus-antiphon-common-of-a-confessor-bishop.yml directly rather
than duplicating it.
npm test (365 tests) and tsc --noEmit both pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
of Jerusalem (March)
Continuing the sweep of previously-never-added sanctoral content. New
shared Common templates: collect-c7b.yml and
benedictus-antiphon-common-of-several-women-martyrs.yml (Commune/C7b,
"several women Martyrs, not Virgins" -- Perpetua and Felicity's own
Common category, not authored before now).
St. Gabriel Archangel (Mar 24), the Annunciation (Mar 25), St. John
Damascene (Mar 27), and St. John Capistrano (Mar 28) are still open --
substantial feasts left for a follow-up pass.
npm test (365 tests) and tsc --noEmit both pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Purification of the BVM (Feb 2), St. Andrew Corsini (Feb 4), St. John
of Matha (Feb 8), Apparition of the Immaculate BVM at Lourdes (Feb 11),
Ss. Seven Founders of the Servite Order (Feb 12), St. Gabriel of Our
Lady of Sorrows (Feb 27) -- all had real, complete Matins content in
the reference engine and no exclusion comment; simply never reached
during the earlier month-by-month sanctoral pulls. Continuing the same
sweep as January's St. Francis de Sales/St. Martina/St. John Bosco.
Test update (not a regression): St. Andrew Corsini transfers onto Feb 5
in years where Sexagesima falls on his own Feb 4, outranking St. Agatha
when it does -- february-sanctoral.test.ts's proof year for Agatha
moved from 2029 (now a collision year) to 2025 (clean).
npm test (365 tests) and tsc --noEmit both pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Per direct instruction to import all available sanctoral content
regardless of rubric-era markers: these three had real, complete Matins
content in the reference engine and were simply never added during the
earlier month-by-month sanctoral pulls (no exclusion comment, no
placeholder -- just never reached). First of a broader sweep across the
whole calendar.
New shared Common template: benedictus-antiphon-common-of-a-confessor.yml
(Commune/C5's own Ant 1) -- the first common-of-a-confessor saint that
needed one; st-alexius.yml (the only prior user of this category) had
used a Cistercian-specific alternate instead.
npm test (365 tests) and tsc --noEmit both pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>
The Latin text already named the dedication of St. Mary Major ("Romæ,
in Exquiliis, Dedicatio Basilicae sanctae Mariae ad Nives") but the
English translation silently dropped the corresponding sentence,
jumping straight to the day's other martyrs. Restored from the
reference engine's own English/Martyrologium/08-05.txt.
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>
Ss. Tryphon and Companions, St. Gregory Thaumaturgus, St. Catherine of
Alexandria, and the Vigil of St. Andrew. This completes the
pre-1955-but-post-1617 sanctoral pass: 43 saints authored across the
year, 9 confirmed Common-only with nothing to source (see TODO.md).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
St. Giles, St. Nicholas of Tolentino, Ss. Cornelius and Cyprian, Ss.
Euphemia/Lucy/Geminian, St. Januarius, the Vigil of St. Matthew, and
Ss. Cyprian and Justina.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The Finding of St. Stephen, St. Donatus, St. Louis, St. Zephyrinus, and
Ss. Felix and Adauctus.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ss. Basilides/Cyrinus/Nabor/Nazarius, St. Anthony of Padua, Ss. Gervase
and Protase, St. Silverius, and St. Paulinus of Nola.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
St. Monica, St. Stanislaus, the Apparition of St. Michael, and St.
Eleutherius. St. Monica's Nocturn 3 Gospel+homily reuses the
already-verified Luke 7:11-16 text from post-pentecost-15.yml, the same
pericope her own day's lessons cross-reference.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sts. Marcellus I, Paul the Hermit, Marius/Martha/Audifax/Abachum,
Emerentiana, Timothy, Polycarp, and Agnes (second feast) — sourced from
the reference engine's Tridentine/Divino Afflatu track since none of
these saints existed in the Monastic 1617 calendar this app otherwise
follows.
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>
Lets someone outside Reground's infra run vu standalone: builds the image and exposes it on localhost:8080, independent of the reground.org-specific compose config that joins an external network with no published port.
tests/hours/matins.test.ts covers both branches (ferial, Sunday)
end-to-end through the real resolveOrdo mechanism against two clean,
live-verified dates — psalm/canticle counts, Te Deum presence, reading
citations/statuses, Gospel flagging and its Common-fallback exclusion,
and responsory matching.
tests/hours/prime.test.ts and tests/ui/shell.test.ts both had assertions
that Matins was still pending — replaced with assertions that it now
renders real content, mirroring the equivalent Compline test.
hours/matins.ts no longer a stub: resolves a full ordo assembled
programmatically per day rather than a static parts list, since the real
structure (1 nocturn ferial vs. 3 on a Sunday or Duplex+ feast, a
variable number of readings) doesn't fit the pattern every other hour
uses. Several deliberate departures from the historical office, all per
direct instruction (see TODO.md's own writeup): Nocturn 1 always draws
from the user's bible-plan rather than the historical lectionary and
never contracts for "summer"; split historical lessons are recombined
except where the source genuinely changes; Nocturn 3 is gated at
Duplex-and-higher plus every Sunday; every commemorated saint and active
octave contributes its own reading, not just the office winner; a Gospel
reading is sourced only from the user's plan or the day's own proper
content, never a Common-of-Saints fallback; the Invitatory is framed like
an ordinary antiphoned psalm rather than the historical repeating
refrain.
ui/hour-view.ts renders the two new part kinds (nocturn-psalmody,
te-deum) and the extended lesson shape (responsory, Gospel flag).