Commit Graph

423 Commits

Author SHA1 Message Date
will 36e1181b85 propers: Benedictus antiphons for July's sanctoral entries (9/9)
Deploy / deploy (push) Successful in 52s
8 authored fresh (the Seven Brothers/Rufina/Secunda, Symphorosa and
Her Seven Sons, Margaret of Antioch, Apollinaris, James the Greater,
Anne, Nazarius/Celsus/Victor I/Innocent I, Abdon and Sennen), 1
corrected (Mary Magdalene -- confirmed sourced from the Roman rite's
raw [Ant 1] rather than a real Monastic 1617 rendering, same pattern
as every month so far).

James the Greater needed the same register fix as Matthias/Barnabas
(Matt 19:27ff, same verse): the source's own English existed but read
jarringly modern next to everything else, reworded to match and
marked draft.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 21:22:06 -04:00
will ab52cfda69 propers: Benedictus antiphons for June's sanctoral entries (16/16)
Deploy / deploy (push) Successful in 53s
11 authored fresh (Ss. Marcellinus/Peter/Erasmus, Ss. Primus and
Felicianus, Barnabas, Anthony of Padua, Basil the Great, Ss. Vitus/
Modestus/Crescentia, Ss. Mark and Marcellian, Ss. Gervase and Protase,
Paulinus of Nola, William Abbot, Leo II), 5 corrected (Ss. Basilides/
Cyrinus/Nabor/Nazarius, the Nativity of St. John the Baptist, Ss. John
and Paul, Ss. Peter and Paul, Commemoration of St. Paul -- each
confirmed sourced from the Roman rite's raw [Ant 1] rather than a real
Monastic 1617 rendering, same pattern as every month so far).

Barnabas needed the same register fix as Matthias (Matt 19:27ff, same
verse): the source's own English existed but read jarringly modern
next to everything else, reworded to match and marked draft.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 21:18:34 -04:00
will af4b703f77 propers: Benedictus antiphons for May's sanctoral entries (13/13)
Deploy / deploy (push) Successful in 54s
10 authored fresh (Athanasius, Monica, Stanislaus, Ss. Nereus/
Achilleus/Domitilla/Pancras, Boniface, Ubald, Peter Celestine, Urban I,
Eleutherius, John I), 3 corrected (Ss. Philip and James, John Before
the Latin Gate, the Apparition of St. Michael -- each confirmed
sourced from the Roman rite's raw [Ant 1] rather than a real Monastic
1617 rendering, same pattern as every month so far).

Urban I, Eleutherius, and John I (all late May) needed 2038 to find a
year not swallowed by Ascensiontide/Pentecost/Trinity/Corpus Christi
in some combination -- the latest year needed yet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 21:12:46 -04:00
will 1b57e4fe9c propers: Benedictus antiphons for April's sanctoral entries (8/8)
Deploy / deploy (push) Successful in 55s
All 8 authored fresh: Francis of Paola, Leo I, Ss. Tiburtius/Valerian/
Maximus, George, Mark, Vitalis, Robert, Peter Martyr. Several share
one Eastertide Common-of-Several-Martyrs antiphon word for word
(Tiburtius/Valerian/Maximus, George, Vitalis, Peter Martyr) -- each
confirmed independently via its own live query rather than assumed
from the others.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 21:08:19 -04:00
will aa6ca21938 propers: Benedictus antiphons for March's sanctoral entries (5/6)
Deploy / deploy (push) Successful in 52s
4 authored fresh (Lucius I, Thomas Aquinas, the Forty Holy Martyrs,
Gregory the Great), 1 corrected (Joseph -- confirmed sourced from the
Roman rite's raw [Ant 1] rather than a real Monastic 1617 rendering,
same pattern as January/February's corrections).

Gregory the Great's antiphon (the "non Angli sed Angeli" episode) had
no English in the source at all -- translated fresh, marked draft.

St. Frances of Rome left honestly missing: Simplex rank, and her day
(March 9) falls within Lent in every year tested 2026-2035, so she can
never win outright under this app's own privileged-feria-major rule --
there's no live-rendered antiphon to source, ever, not just this year.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 21:05:02 -04:00
will 93bcee414e propers: Benedictus antiphons for February's sanctoral entries (7/7)
Deploy / deploy (push) Successful in 55s
5 authored fresh (Dorothea, Apollonia, Scholastica, Valentine,
Matthias), 2 corrected (Agatha, Chair of St. Peter at Antioch -- both
confirmed sourced from the Roman rite's raw [Ant 1] rather than a real
Monastic 1617 rendering, same pattern as January's corrections).

Two needed translation/rewording, not just transcription: Scholastica
had no English at all in the source (translated fresh, marked draft);
Matthias's own English existed but was jarringly modern next to every
other antiphon's archaic register, so reworded to match (the
underlying verse's standard Douay-Rheims wording) and marked draft
rather than presented as a straight source transcription.

Also noted in TODO.md, not fixed: splitNamedAntiphon always marks its
output verified regardless of input status, so a draft antiphon
currently renders as if fully verified wherever it's actually
displayed -- a pre-existing issue across every hour, only now surfaced
by content with a real draft status going through it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 21:02:00 -04:00
will cc0d8cc892 calendar: move St. Hilary of Poitiers to his real date, Jan 14
Deploy / deploy (push) Successful in 53s
Confirmed against the raw [Officium] file directly: Jan 14 is Hilary
(Latin/Sancti/01-14.txt), Jan 23 is St. Raymond of Peñafort
(Latin/Sancti/01-23.txt) -- not Hilary at all. The original Jan-23
placement wasn't fabricated, just misled by its own source: 2029 is a
real year where Jan 14 falls on a Sunday and every day through the
22nd is already occupied by another feast, so Hilary genuinely
transfers all the way to the 23rd that one year -- the app had
mistaken that transfer-year artifact for his real, fixed date.

His collect text is unaffected (a feast's collect doesn't change based
on which day it's said), re-confirmed identical on his real date.
Benedictus antiphon pulled fresh, completing January's antiphon pass
(9/9).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 20:57:43 -04:00
will 0878c3d60c propers: Benedictus antiphons for January's sanctoral entries (9/9)
Deploy / deploy (push) Successful in 50s
All 9 January saints with a propers id: 5 authored fresh (Marcellus I,
Paul the Hermit, Fabian & Sebastian, Vincent & Anastasius, John
Chrysostom), 3 corrected (Chair of St. Peter at Rome, Agnes,
Conversion of St. Paul -- each confirmed sourced from the Roman rite's
raw [Ant 1] rather than a real Monastic 1617 rendering, same mistake
as St. Lawrence's earlier fix), 1 left honestly missing (Hilary of
Poitiers -- this app's calendar has him Jan 23, but Divinum Officium's
own calendar has him Jan 14; flagged in TODO.md rather than guessed
at). See TODO.md for the full remaining scope and the method this
settled on after automated matching proved unreliable on real edge
cases (shared dates, saints the reference engine doesn't carry at
all).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 16:58:18 -04:00
will cea23a4dc5 docs: add a real backlog (TODO.md)
Deploy / deploy (push) Successful in 48s
Was scattered across code comments and session summaries with no
single place to check what's actually left open -- consolidated here,
with concrete lists (which duplex-majus+ saints still need a Lauds
psalmody override, which already-authored Benedictus antiphons are
unverified against Monastic 1617 vs. the Roman rite they may have
actually been sourced from) rather than vague pointers.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 15:30:14 -04:00
will 2247e8c27f calendar: exempt Vigils from Our Lady's Saturday's demotion
Deploy / deploy (push) Successful in 49s
Refined per direct correction: Our Lady's Saturday is really only a
Simplex-strength standing, not a privileged-feria-minor-shaped one --
a Vigil keeps forcing its own primacy on a Saturday the same way it
already does any other day (see calendar/commemorations.ts's own
transferDirectionOf special-casing for Vigils elsewhere). Only a
Simplex saint alone now loses to it; a Vigil, along with anything
Semiduplex-or-higher, wins outright and Marian Saturday doesn't apply.

Un-does the two test-date moves this same regression prompted last
time (Vigil of St. Lawrence, Vigil of St. John Baptist) -- both dates'
original years work again now that the fix is right.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 14:20:13 -04:00
will 0404642614 calendar: add Christ the King, last Sunday of October
Deploy / deploy (push) Successful in 51s
A 1925 addition, so nowhere in the Monastic Tridentinum 1617 base this
project otherwise targets -- content sourced from "Monastic Divino
1930" instead, the Monastic-lineage version of the era that actually
carries it. Always wins outright (Duplex I. classis, confirmed live),
commemorating whichever Sunday after Pentecost it displaces -- same
additive-layering shape as applyOctaves/applyMarianSaturday, run last
so nested commemorations (e.g. a Simplex saint already commemorated
under that Sunday) survive underneath it.

Extended the Lauds psalmody-override mechanism (both the psalm groups
and, newly, the chapter/responsory/hymn/versicle bundle) to recognize
named temporal winners as unconditionally override-eligible, not just
duplex-majus+ sanctoral ones -- generalizing what had been a Marian-
Saturday-only special case. Suffrages needed their own explicit check
too: isDoubleOrHigher only ever looks at a sanctoral rank, and a named
temporal winner has no FeastClass to check at all.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 14:13:22 -04:00
will 747a078580 calendar: model Our Lady's Saturday as a real occurrence outcome
Deploy / deploy (push) Successful in 49s
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>
2026-08-11 14:02:55 -04:00
will 4548042b65 hours: split Saturday's Deuteronomy canticle back into its own two parts
Deploy / deploy (push) Successful in 48s
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>
2026-08-11 13:46:20 -04:00
will 73f9c1aebe hours: use the Marian Sabbato hymn as Saturday's own Lauds default
Deploy / deploy (push) Successful in 47s
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>
2026-08-11 11:57:57 -04:00
will 5830e4cfd2 hours: build Lauds
Deploy / deploy (push) Successful in 48s
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>
2026-08-11 11:45:25 -04:00
will 70fbdd12d0 propers: transcribe Lauds' fixed and weekday content
Every fixed and weekday-variable text Lauds needs beyond the psalms/
canticles themselves: per-weekday antiphons (data/hours/lauds-
antiphons.yml, reconstructed with an embedded '*' from the engine's
separately-rendered incipit/full lines), the weekday capitulum/
responsory/hymn/versicle bundle (shared verbatim Mon-Fri for the
capitulum, confirmed against the live engine), the fixed Benedictus
text, the Kyrie/Pater-noster short litany, the four Tridentine
suffrages, the conclusio, and the closing versicle.

Saturday's hymn is left honestly `missing`: every ordinary-time
Saturday is either Marian-Sabbato-overridden or falls in a privileged
season whose hymn is itself swapped for the season's own, so there's
no achievable date showing a genuinely per-annum, unprivileged
Saturday Lauds hymn to source it from.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 11:45:08 -04:00
will d06f9deb99 psalter: transcribe the 16 psalms and 7 OT canticles Lauds needs
Ps 5, 35, 42, 50, 56, 62, 63, 64, 66, 75, 87, 89, 91, 117, 142, 148-150
weren't needed by any hour built so far. The 7 weekday OT canticles
(Isaiah, Ezechias, Anna, Moses x2, Habacuc, the Three Young Men) get
their own small store (src/hours/lauds-canticles.ts), separate from the
Psalter, since they use their own liturgical verse-numbering per
canticle rather than the Psalter's 1-150 numbering.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 11:44:53 -04:00
will 49bd7f7858 scripture: add a dedicated non-Psalm scripture store, migrate pure-scripture readings
Deploy / deploy (push) Successful in 46s
Adds src/scripture/ (types.ts, index.ts), a verse-addressable store mirroring
psalter/index.ts's own pattern exactly -- getScriptureVerses(book, chapter,
range) -- for non-Psalm scripture (Wisdom, Canticles, Ezekiel, Acts, Joel,
etc.). Kept as its own module, not folded into the Psalter, per 2026-08
discussion ("the psalms kind of work differently even if the logic is the
same, they do need their own store").

Octave readings can now declare `passages: [{ book, chapter, verses }]`
instead of embedding text -- each entry becomes its own paragraph, letting a
reading built from several verse ranges keep its original paragraph breaks.
getOctaveReading resolves either shape (embedded text or passages) into the
same OctaveReadingText callers already expect, so nothing downstream needs
to know which was used. Scope, per discussion: only readings that are
Scripture start to finish get this treatment -- prose that merely quotes a
verse or two (most of the patristic sermons pulled so far) keeps its
quotations embedded inline, as before.

Migrates the 9 already-committed octave readings that are pure Scripture
(Wisdom 4:7-20, Canticles 1 and 8, seven different Ezekiel excerpts across
All Saints' octave -- one of which, day 7, genuinely spans two chapters --
and Acts 19/Joel 2 for Pentecost's octave) to the new passages notation,
verified to resolve to character-identical text as before.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 10:06:10 -04:00
will 589c4be0d7 propers: octave readings for the Immaculate Conception
Deploy / deploy (push) Successful in 45s
Corrects the earlier "no Matins content exists" conclusion (previous
commit): that was true of the live prayMatutinum query specifically,
scoped to "Monastic Tridentinum 1617" -- which naturally selects nothing,
since the dogma wasn't defined until 1854. The reference project's raw
"bmv"-suffixed variant files (12-09bmv.txt through 12-14bmv.txt) do carry
real content: excerpts from Pope Pius IX's dogmatic bull "Ineffabilis
Deus" joined with a different Marian homily each day (Sophronius,
Bernard, Tarasius). Included per explicit user direction -- this
project's octave content is deliberately more generous than the strict
1617 monastic rubric alone would select.

Days 4 (Dec 11) and 6 (Dec 13) genuinely have no reading of their own in
the source (confirmed directly in the raw files, not assumed) -- both
already belong to another saint's own feast (Damasus, Lucy) anyway. Day
8 has no "bmv" variant file at all.

Also fixes two more source typos found while transcribing ("Himselfcan"
-> "Himself can", "Onlybegotten" -> "Only-begotten").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 09:53:02 -04:00
will 1d0b20a958 propers: octave readings for Christmas's octave and Pentecost's
Deploy / deploy (push) Successful in 47s
Christmas's stacking cluster (Dec 26-31): only day 6 (Dec 30) has its own
Matins reading -- the one day nothing else wins outright, confirmed via
its own Invitatory. St. Stephen, St. John, and the Holy Innocents' own
octaves (also active there, stacking) have no separate reading content
anywhere in this range -- every other day belongs entirely to whichever
saint natively wins it, same as Immaculate Conception's octave (no
Matins content at all beyond its own day, confirmed and left
unauthored -- checked, not skipped).

Pentecost's octave: days 2-7 all have real content, confirmed via a
consistent distinctive Invitatory throughout, including its own Ember
Saturday (day 7) -- Pentecost's own content governs Matins there despite
St. Felix I's stub-level commemoration that same day (see
tests/calendar/transfer.test.ts). Day 8 (Trinity Sunday) has none of its
own -- Trinity's own distinct office governs that day's actual Matins
content, so no reading is authored for it despite the octave mechanism
still commemorating Pentecost there. Two readings are direct Scripture
(Acts 19:1-9, Joel 2:23-28) with no source English rendered; used the
standard Douay-Rheims wording (verified, not draft) rather than the
project's own patristic-prose translations, matching how every other
Scripture citation in this project is sourced.

Also fixes two more instances of the recurring "dropped space after
capital I" source typo ("Icame" -> "I came").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 09:12:39 -04:00
will 966f515138 propers: octave readings for All Saints; fix PWA precache limit
Deploy / deploy (push) Successful in 46s
All Saints: all 7 days (2-8) have real content -- a continuous reading
from the book of Ezechiel read straight through the whole octave,
confirmed via each day's own distinctive Invitatory antiphon, present
even on Nov 2 (so this app's own All Souls' Day exclusion doesn't
conflict with anything here). Also fixes two more recurring "dropped
space after capital I" source typos ("Iwill" -> "I will") found by
grepping the accumulated readings so far, retroactively correcting
St. Lawrence's day 8 and the Assumption's day 6.

vite.config.ts: raises workbox's maximumFileSizeToCacheInBytes -- the
growing body of eagerly-bundled octave-reading text (by design, for
offline use) pushed the main chunk past the default 2 MiB precache cap,
which was failing the production build.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 09:07:16 -04:00
will ffc301a5a2 propers: octave readings for the Assumption and Nativity of the BVM
Deploy / deploy (push) Successful in 45s
Assumption: days 2, 4-8 (day 3, Aug 17, is entirely overshadowed by St.
Lawrence's own octave-concluding day, a higher-rank Duplex that day --
no separate Assumption reading exists there). Also fixes a source typo
("Isaw her" -> "I saw her") in the shared responsory, retroactively
correcting day 2's file from the previous commit.

Nativity of the BVM: days 2, 4, 5, 6, 8 (day 3, Sep 10, belongs to St.
Nicholas of Tolentino's monastic-specific reassignment; day 7, Sep 14, is
the Exaltation of the Holy Cross -- confirmed via each day's own
Invitatory antiphon, not assumed). Day 5 had no source English at all;
translated per this session's discussion (status: draft). Also fixes a
second source typo ("Gorgonitis" -> "Gorgonius" in a commemoration
heading).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 08:58:52 -04:00
will e35183bfac propers: add octave Matins readings, starting with St. Lawrence's
Deploy / deploy (push) Successful in 46s
Adds propers/octave-readings.ts: a day-indexed lookup
(getOctaveReading(octaveId, dayNumber), id convention
"${octaveId}-octave-day-${dayNumber}") since readings genuinely vary day
to day within a single octave (confirmed: the Assumption's own octave
gives different patristic excerpts on day 2 vs. day 5) -- the singular
OctaveConfig.readingId field from the previous commit didn't fit that
reality and is removed.

Sourced via a different query command (prayMatutinum, not prayTertia)
than every other proper this pull has pulled -- the raw per-date
Sancti/MM-DD.txt files for octave-continuation days are occupied by
unrelated later-calendar saints (same trap as everywhere else), but the
real content lives in MM-DDoct.txt/MM-DDbmv.txt-style variant files the
live engine resolves correctly.

Per project convention (2026-08 discussion): the historical 3 (or 9-12,
on a day's own higher-rank office) Lectios are collapsed into one
continuous reading rather than kept broken up, and only the first
responsory is kept (which one to use when several collapse into one is
still an open question). A caught bug along the way: several readings
have no English translation in the source at all -- its own English page
silently falls back to showing the Latin text under the "Reading"
header, which an early pass mistakenly stored as a duplicate before the
mismatch was caught; now left honestly missing instead.

St. Lawrence's octave: real readings for days 2-5 and 8 (day 8, "In
Octava S. Laurentii," is a fuller distinct office); days 6-7 (Aug 15-16)
belong entirely to the Assumption's feast and octave instead -- day 7's
query, redirected, became assumption-octave-day-2's reading. The other
five octaves (Assumption's remaining days, Nativity BVM, Immaculate
Conception, All Saints, the Christmas trio, Pentecost) are follow-up
work, not done in this pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 08:46:58 -04:00
will eec76a1e4e calendar: enable the four remaining real octaves
Deploy / deploy (push) Successful in 44s
Assumption (Aug 15-22), Nativity of the BVM (Sep 8-15), Immaculate
Conception (Dec 8-15), and All Saints (Nov 1-8) now declare octave:
{ enabled: true }, same generic mechanism as St. Lawrence and the
Christmas trio. Every octave this pull has identified is now modeled;
Matins reading content is a separate, larger follow-up (see conversation)
-- these still just commemorate at L/V-equivalent level for now.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 08:20:47 -04:00
will da3b6e893e calendar: model octaves as a generic, data-driven mechanism
Deploy / deploy (push) Successful in 46s
Adds calendar/octaves.ts: a lookback over the past week collecting every
octave (sanctoral or temporal) still active on a date, stacking multiple
at once (Christmas + St. Stephen + St. John + Holy Innocents all
commemorated together within the Christmas Octave). Declared via an
optional `octave` field on a saint's own record or a new small
TemporalFeastRecord (calendar/temporal-feasts.ts) for temporal ids like
Christmas/Pentecost that didn't have a metadata record before -- data-
driven per user design discussion, with `{ enabled: true }` alone using
sensible defaults (8 days, semiduplex threshold) so a minimal declaration
works without authored content.

Wired into resolveDay as a post-processing layer: doesn't change how a
single day's own precedence contest is decided, just adds commemorations
for active octaves and occasionally overrides the winner when the
occurring saint doesn't clear the strictest active octave's threshold.

Populated so far: St. Lawrence's own octave (the one that repeatedly cost
real saints their spot in August), the three Comites Christi octaves
(Stephen/John/Innocents -- Thomas of Canterbury deliberately excluded,
per discussion), and Pentecost's (duplex threshold, user-specified).
Pentecost's octave offsets are also removed from temporal-categories.yml's
privileged-feria-major classification, letting a real candidate reach the
new octave layer instead of being transferred away first -- with the
side effect that Pentecost's own Ember Saturday no longer forces a
transfer (a sub-threshold saint is now commemorated in place instead, see
tests/calendar/transfer.test.ts's updated case). Assumption, Nativity
BVM, Immaculate Conception, and All Saints' own octaves are not yet
populated with octave data -- deliberately deferred to a follow-up pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 07:23:43 -04:00
will c0413a44dc propers: add December's collect and antiphon text
Deploy / deploy (push) Successful in 45s
10 collects, 5 antiphons -- including backfilling the pre-existing
Immaculate Conception entry. St. Damasus's collect is Latin-only (no
English translation exists in the reference source at all); a few
others (All Saints, Bibiana, Immaculate Conception) needed their English
read directly from the raw source file after the live query's English
side either omitted the Oratio translation or rendered the wrong Marian
feast's text -- caught by cross-checking, not assumed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 06:34:45 -04:00
will 2785aa2a4e calendar: pull December's sanctoral calendar (pre-1955 pull, 12/12 -- complete)
16 saints, plus a propers-slug update for the pre-existing Immaculate
Conception entry. Also extends the Advent temporal-category fix
(previous commit) to Christmastide: St. Thomas of Canterbury, only
Semiduplex, wins outright within the Christmas Octave in the real
Monastic 1617 engine, which the stronger privileged-feria tier would
have wrongly forbidden -- Christmastide now shares Advent's
privileged-feria-minor tier instead. Every real winner this month falls
within one of these two newly-corrected seasons.

This completes the first pass of the pre-1955 sanctoral calendar pull
across all twelve months.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 06:34:37 -04:00
will 08f94823f7 calendar: give Advent's ordinary ferias their own precedence tier
Deploy / deploy (push) Successful in 44s
Found while starting the December sanctoral pull: Advent's plain
(non-Ember) weekday ferias have real standing in the live Monastic 1617
engine that the existing ordinary-feria category couldn't represent --
a Simplex saint (St. Bibiana, Dec 2) is merely commemorated there rather
than winning outright, while a Semiduplex+ saint (St. Nicholas, Dec 6)
wins with the feria itself commemorated back. Adds a third, weaker
privileged-feria-minor tier (Semiduplex+ threshold, vs. privileged-
feria's Duplex+) rather than reusing either existing tier, mirroring how
privileged-feria/privileged-feria-major were split in March. Lent's own
ordinary ferias likely share this property but are left as-is, unverified
this session.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 06:23:35 -04:00
will 7cc6adfb55 propers: add November's collect and antiphon text
Deploy / deploy (push) Successful in 44s
9 collects, 3 antiphons -- including backfilling the pre-existing All
Saints entry. Also updates two pre-existing tests whose shared date
(2025-11-30, Advent I Sunday) now correctly shows St. Andrew commemorated
alongside it, confirmed against the live reference engine.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 06:18:12 -04:00
will 395b7dfc1f calendar: pull November's sanctoral calendar (pre-1955 pull, 11/12)
19 saints (14 real winners + 5 stubs), plus a propers-slug update for the
pre-existing All Saints entry. Three monastic-calendar-specific
reassignments this month, the most of any month so far (St. Emilian
displacing St. Martin I Pope, who moves to a different date; St. Odo
demoting St. Pontian; St. Silvester Abbot displacing St. Peter of
Alexandria), plus All Saints of the Benedictine Order, a monastic-only
addition at Duplex II. classis. New exclusion category: All Souls' Day
(Nov 2) is a fundamentally different liturgical genre -- the Office of
the Dead -- out of scope the same way the Requiem rite isn't modeled
anywhere else in this app.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 06:18:04 -04:00
will 14227c7afe propers: add October's collect text
Deploy / deploy (push) Successful in 46s
7 collects. Also moves two pre-existing tests' dates off Oct 4-5, which
now carry real sanctoral content (St. Francis, Ss. Placid and
Companions) that changes their governing behavior -- same class of
collision as previous months.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 06:07:51 -04:00
will ab713f424a calendar: pull October's sanctoral calendar (pre-1955 pull, 10/12)
16 saints (14 real winners + 2 stubs). Three monastic-calendar-specific
finds this month: Ss. Placid and Companions (Oct 5, St. Benedict's own
disciple, Duplex II. classis -- absent from the base Tridentine table
entirely), St. Justina (Oct 7, reassigns what the base table gives to
St. Marcus, Pope), and St. Gall (Oct 16, founder of St. Gallen, also
absent from the base table). No octave-gap exclusions this month.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 06:07:44 -04:00
will a99be15219 calendar: document the Sep 29 St. Michael decision
Deploy / deploy (push) Successful in 56s
Records the explicit choice to keep the pre-existing Sep 29 mapping as a
deliberate simplification rather than removing it, per user decision.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 06:01:08 -04:00
will 3376036779 propers: add September's collect and antiphon text
Deploy / deploy (push) Successful in 43s
6 collects, 1 antiphon -- including backfilling the pre-existing Nativity
of the BVM entry now that the pulling methodology exists.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 21:20:44 -04:00
will f71b5380b1 calendar: pull September's sanctoral calendar (pre-1955 pull, 9/12)
14 saints (12 real winners + 2 stubs), plus a propers-slug update for the
pre-existing Nativity of the BVM entry. Two monastic-calendar-specific
finds: St. Nicholas of Tolentino (Sep 10) overrides what the base
Tridentine table treats as a plain Nativity-octave continuation, and St.
Januarius (Sep 19) is a monastic-only addition absent from the base table
entirely. Also flags (not yet acted on) that the pre-existing Sep 29 St.
Michael mapping doesn't appear to hold in this pull's actual target
track -- see the sanctoral-calendar.yml comment for detail.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 21:20:37 -04:00
will a492be961b propers: add August's collect and antiphon text
Deploy / deploy (push) Successful in 44s
11 collects, 4 antiphons -- including backfilling the three pre-existing
August entries (Lawrence, Assumption, Augustine) now that the pulling
methodology exists. Also updates three pre-existing tests whose dates
collided with this month's new real content: the vigil-of-St.-Lawrence
backward-transfer case now runs into a real feast at its landing day
instead of an empty one (confirmed correct against the live reference
engine, including the surviving commemoration on the impeded Sunday
itself), and two other tests moved off Aug 9/10 to dates unaffected by
the new data.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 21:11:56 -04:00
will 5230e661c0 calendar: pull August's sanctoral calendar (pre-1955 pull, 8/12)
18 saints (14 real winners + 4 stubs), plus propers-slug updates for the
4 pre-existing August entries. Notable this month: several dates have a
real named secondary saint permanently subordinate to an unmodeled fixed
octave (Lawrence's own, the Assumption's) or the fixed Transfiguration --
excluded entirely rather than guessed at, since this app can't yet
represent the actual blocking primary (a known, deferred octave gap).
Most notable casualty: St. Clare (Aug 12).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 21:11:44 -04:00
will c03d6a227d propers: add July's collect and antiphon text
Deploy / deploy (push) Successful in 42s
Real collect text for all 9 July saints that have one, plus St. Mary
Magdalene's own antiphon — same extraction method as prior months.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 18:38:50 -04:00
will 7f038cbb06 calendar: pull July's sanctoral calendar (pre-1955 pull, 7/12)
23 saints for July (18 real + 5 stubs). Caught and corrected a real
mistake in this pull's own methodology: an earlier live-query pass
recorded St. Apollinaris under July 24 based on a year where he'd
actually transferred there (his true date, the 23rd, was a Sunday that
year) — cross-checking against the raw calendar text file
(1570.txt) caught it before it went in. His real date is the 23rd, with
St. Liborius as his (permanently unwinnable) secondary; July 24 is
instead the Vigil of St. James with St. Christina as its own secondary.

Five stubs this month are all genuinely unwinnable (fixed-date
competitors) — the most of any month so far.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 18:38:41 -04:00
will 9b8dc200a1 propers: add June's collect and antiphon text
Deploy / deploy (push) Successful in 42s
Real collect text for all 16 June saints that have one, plus a real
antiphon for 4 of them and a fifth (Ss. Peter and Paul) that deliberately
reuses the Chair-of-Peter-at-Antioch antiphon text, matching the source's
own cross-reference — same extraction method as prior months.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:37:27 -04:00
will e1f0982276 calendar: pull June's sanctoral calendar (pre-1955 pull, 6/12)
18 saints for June, all winning outright on a clean per-annum date — no
stubs this month, including two normally blocked by the generic
"Sanctae Mariae Sabbato" Saturday votive, which just needed a
non-Saturday year instead.

Three distinct Pauline feasts now exist in this pull (Conversion of St.
Paul, Jan 25; Ss. Peter and Paul, June 29; Commemoration of St. Paul,
June 30) plus a second St. Leo (Leo II, June 28, distinct from Leo I in
April). The Nativity of St. John the Baptist (Duplex I. classis, the
highest rank pulled so far) is kept in the sanctoral store despite the
very high rank, same as the Conversion of St. Paul/Chair-of-Peter
feasts — it's about the saint himself, not a feast of the Lord/BVM.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:37:09 -04:00
will 3cd6faafe6 hours: move Prime's test MONDAY off a date the June pull now owns
June's sanctoral pull assigned Ss. Vitus, Modestus, and Crescentia to
2026-06-15 — the same date prime.test.ts's MONDAY constant used, which
correctly flips Prime's capitulum/Preces from ferial to feast form now
that isSundayOrFeast sees a real sanctoral winner there. Moved to an
still-unpulled October Monday instead; also fixed a stale comment that
had drifted from the constant's actual value.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:36:59 -04:00
will a6a72f277d propers: add May's collect and antiphon text
Deploy / deploy (push) Successful in 42s
Real collect text for all 13 May saints that have one, plus a real
antiphon for the 3 that have one of their own (Ss. Philip and James, St.
John Before the Latin Gate, the Apparition of St. Michael) — same
extraction method as prior months. Two saints (St. Peter Celestine, St.
Urban I) have an [Ant 1] in the source that turned out to just be a
cross-reference to the generic Common template, not real unique text, so
no antiphon file was authored for them.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:25:56 -04:00
will 2d5857f71c calendar: pull May's sanctoral calendar (pre-1955 pull, 5/12)
18 saints for May (16 real + 2 stubs). Both stubs this month are
genuinely unwinnable in the real historical calendar in any year (their
competing observances are fixed-date, not movable) — flagged explicitly
in their own files as distinct from the usual "just an artifact of the
year checked" caveat.

A second, distinct feast of St. Michael (his Apparition, May 8) is kept
as its own record separate from st-michael.yml's Sept 29 dedication
feast, same precedent as the two Chair-of-Peter feasts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:25:41 -04:00
will f0e32ae0c1 calendar: fix transferred candidates blindly winning outright
Found via real data (the May sanctoral pull): a transfer landing on a day
whose own native winner was temporal blindly took over as winner,
regardless of that day's own precedence category — so a transferred-in
Simplex saint (St. Felix I, impeded by Pentecost's Ember Saturday) was
overwriting Trinity Sunday itself instead of being merely commemorated,
the way a native Simplex candidate on an ordinary Sunday already
correctly is.

Fixes applyIncomingTransfer to run the arriving candidate through
decideOccurrence using the receiving day's own temporalCategory, the same
rules a native occurrence there would use, instead of assuming an empty
temporal slot means automatic victory.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:25:27 -04:00
will 88074cdfe6 propers: add April's collect text
Deploy / deploy (push) Successful in 41s
Real collect text for all 8 April saints that have one — same extraction
method as prior months. One correction to St. Robert's own English
translation in the source, which left his name in Latin genitive form
("blessed Robérti") rather than translating it — fixed, flagged in the
file as a transcription artifact, not a deliberate style choice.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:14:12 -04:00
will 1b3d236ef3 calendar: pull April's sanctoral calendar (pre-1955 pull, 4/12)
12 saints for April (11 real + St. Catherine of Siena as a stub), all
winning outright on a clean per-annum date.

Two real methodological findings this month:
- St. Mark (Apr 25, Duplex II. classis) directly confirms the
  privileged-feria-major behavior from the previous fix: he only ever
  gets commemorated within the Easter Octave, never wins there.
- St. Robert/St. Catherine of Siena (Apr 29) is a genuine, year-stable
  monastic-calendar reassignment — this app's own base Latin source data
  files that date's Roman-calendar content under a different saint (Peter
  Martyr) entirely, which a naive raw-file lookup by MM-DD would have
  missed; the live per-date query resolved it correctly regardless, and
  is what these records are actually built from. Worth remembering for
  future months.

New common category: common-of-an-evangelist (St. Mark, an Evangelist
but not an Apostle).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 17:14:04 -04:00
will effe2b1333 calendar: split privileged-feria into two real precedence tiers
Deploy / deploy (push) Successful in 41s
A plain Duplex saint was losing to any privileged feria (Ember days
included) since the occurrence engine only let duplex-1-classis+ get
even a commemoration there. Verified this was wrong: St. Gregory the
Great, plain Duplex, outright wins against a Lenten Ember Saturday in
the real Monastic 1617 engine.

Splits TemporalCategory's single privileged-feria into privileged-feria
(the lesser tier — Lent's Ember days, verified — now behaves like an
ordinary Sunday: Duplex+ wins outright) and privileged-feria-major (Ash
Wednesday, Holy Week, the Easter Octave, verified via St. Mark only ever
being commemorated there, never winning — behaves like privileged-
Sunday). Everywhere else the old single category was ambiguous
(Pentecost's own Ember days/Vigil/Octave, the Vigil of Christmas)
defaults to the stricter major tier pending verification.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 15:51:09 -04:00
will a2d86a4879 propers: add March's collect and antiphon text
Deploy / deploy (push) Successful in 40s
Real collect text for all 6 March saints that have one, plus St. Joseph's
own antiphon — same extraction method as January/February.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 15:38:11 -04:00
will 67915b6c81 calendar: pull March's sanctoral calendar (pre-1955 pull, 3/12)
7 saints for March, all winning outright on a clean per-annum date. Notably
St. Benedict himself (Mar 21, Duplex I. classis, the founder — "S. P. N."
in the source) turns out to have no unique Oratio/Antiphon at all in this
date's source file, only Common-of-an-Abbot cross-references — flagged in
his own file to check his second (July) feast when that month comes up.

Two Benedictine-oblate saints (Frances of Rome, Gregory the Great) are
marked "O. N." (Ordinis Nostri) in the source — real significance for a
monastic calendar. St. Frances also needed a new common category,
common-of-a-widow (she's neither virgin nor martyr).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 15:38:04 -04:00