9ce89c0312705f4ed2def9b7bd4d8ec936efdd6d
262 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
5162eabdb4 |
Document Vespers' ferial Preces and per-feast office overrides in TODO.md
Deploy / deploy (push) Successful in 59s
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> |
||
|
|
53582f1ded |
Add per-feast Vespers office overrides for all 30 duplex-majus+ ids
Same eligibility rule as Lauds' psalmody override (a duplex-majus+ saint, or a named temporal feast), factored out to resolve-common.ts's getOfficeOverrideId since Vespers has no psalmody-override table of its own to piggyback eligibility on. Authored via one live command=prayVespera query per id, reusing the same clean per-saint dates already established for each one's Lauds office-bundle override. The capitulum turned out to be byte-identical between Lauds and Vespers for every one of the 30 ids checked, a real Monastic-rite fact rather than a coincidence — so no vespers-capitulum-<id>.yml files exist at all; the chapter falls through to the already-authored lauds-capitulum-<id> directly instead of duplicating identical content. St. Scholastica's Vespers responsory, hymn, and versicle needed a hand translation (same gap she has at Lauds/Terce/Sext/None — the reference engine has no English for any of her proper content). Two more one-line English gaps in the shared Immaculate Conception/Nativity of the BVM responsory were filled with the standard Douay-Rheims/Ave Maria wording. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
4d88568c42 |
Add Vespers' ferial Preces, sourced from Tridentine 1906/1910
Monastic 1617 has no ferial Preces at Vespers, same gap Lauds already had — the fuller "Preces feriales Vespera" is byte-for-byte the Lauds ferial Preces with Psalm 129 swapped for Psalm 50 in the source, live- verified against the same clean Advent feria already used for Lauds. The short Sunday/feast form turns out to be identical at both hours too, so it's reused directly rather than duplicated. Factors the shared ferial-or-vigil predicate out of hours/lauds.ts into resolve-common.ts's isFerialOrVigil so both hours' -preces cases resolve it the same way instead of keeping two copies in sync by hand. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
ce954fea9a |
Update TODO.md: Vespers ordo is built, not a stub
Deploy / deploy (push) Successful in 57s
Records what shipped last session and what it still owes (its own ferial Preces, a per-feast office-override mechanism). |
||
|
|
f14d00bd73 |
Port seasonal office content to Lauds, closing the same pre-existing gap
Deploy / deploy (push) Successful in 56s
Lauds had the identical issue Vespers started with: resolveOffice only ever rendered the plain weekday chapter/responsory/hymn/versicle, year-round, with no Advent/Lent/Passiontide/Paschaltide override — same source file (Major Special.txt) as Vespers', just never wired up. Ports the same seasonalOfficeSuffix-based precedence (per-feast/octave override -> season -> weekday default) and the matching seasonal content, transcribed the same way as Vespers' own (Monastic hymn variants applied from the source's substitution notation against each base Roman text). Paschaltide's chapter is byte-identical to Vespers' own — the source aliases "[Pasch Vespera] = @:Pasch Laudes" — so both hours' data files intentionally carry the same text rather than one importing the other's id. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
de83786793 |
Build the Vespers ordo: mechanism, weekday content, seasonal content
Wires resolveOrdo('vespers', ...) end to end: opening versicle,
weekday psalmody (4 groups, handling the joined Ps 115+116 and the
split Ps 138/143 via a PsalmRef-like shape), the chapter/responsory/
hymn/versicle office bundle, Magnificat, day-collects — reusing
resolveEveningDay so First/Second Vespers precedence and the cross-day
commemoration (both added in the previous commit) apply automatically
— and a closing that reuses Lauds' own conclusio, since no distinct
"Vespera" version of that exact text turned up in the source.
getMagnificatAntiphon mirrors getBenedictusAntiphon's saint/temporal-id
lookup order, but also falls back to real content Benedictus has no
equivalent of: the classic ferial set that quotes the Magnificat's own
text in sequence across the week, with the correct Monastic-rubric
variant picked for Tue/Thu/Fri/Sat (two of those needed a fresh
translation where the Monastic Latin diverges from the given English
in content, not just wording).
Also includes Vespers' own seasonal content (Advent/Lent/Passiontide/
Paschaltide chapter+responsory+hymn+versicle), transcribed from the
same source blocks as the weekday content, with the Monastic-specific
hymn variants hand-applied from the source's substitution notation
against each base Roman text (one transcription slip caught and fixed
mid-pass: the Passiontide hymn's closing lines had been copied from
the Roman text instead of the Monastic one actually being
transcribed). Passiontide's own responsory/hymn correctly omit the
Gloria Patri, matching real rubric and the source data as given.
All weekday/seasonal content marked `draft`, not `verified` — read
directly from the reference source, not cross-checked against a live
rendering per day the way the psalmody was.
Six other hours' resolvePart switches needed the three new HourPart
kinds ('vespers-psalmody', 'vespers-office', 'magnificat') added to
their exhaustive not-used lists so they still typecheck; three
pre-existing tests assumed Vespers was still "coming soon" and are
updated to exercise Matins (still the genuine stub) instead.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
979bbe6aa4 |
Model cross-day Vespers commemorations, fix First Vespers threshold
Deploy / deploy (push) Successful in 1m1s
Whichever of today/tomorrow doesn't govern a given evening's Vespers
can still be commemorated there, unless it's Simplex (or a bare
temporal winner with no standing of its own) — live-verified in both
directions against the real Monastic 1617 engine: Ss. Cyriacus/Largus/
Smaragdus (Semiduplex) commemorated when Sunday claims First Vespers
over them; St. Anne commemorated even though St. James (Duplex II.
classis) keeps his own Second Vespers outright; St. Donatus (Simplex)
gets nothing ("nihil de præcedenti") in the same situation Cyriacus/
etc. did get a commemoration. The isMajorFixedFeastOfTheLord override
(Christmas/Epiphany/Candlemas/Easter/Ascension/Corpus Christi/Sacred
Heart) deliberately doesn't inherit this yet — no live data on whether
those suppress it the way privileged-sunday/privileged-feria-major do
during the day.
Also fixes hasFirstVespers's threshold, found wrong while gathering
the above evidence: it required duplex-majus+, but Ss. Cyriacus/etc.
(plain Semiduplex) actually claims First Vespers over St. Donatus in
the live engine. Lowered to semiduplex, matching the sibling
privileged-feria-minor threshold already used just below it.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
3aee8eca2f |
Bulk-import the full Psalter from Divinum Officium's Psalmorum text
Rather than continuing to author psalms one at a time as each hour needs them, pull all 150 from the reference corpus directly (Latin + English line up 1:1 for every psalm) — Vespers alone needed ~25 new numbers, and Matins will eventually need most of the rest anyway. Also completes 001.yml, which turned out to still be a 2-verse placeholder predating this project's "verified" convention. Ps 94 (the Invitatory) is included too, with its source file's repeating "$ant" antiphon macro dropped — this app's Matins doesn't need the interleaved-antiphon structure the real Invitatorium uses, so it's stored as plain continuous verses like every other psalm (a deliberate simplification, not an oversight). Its English is the traditional Coverdale/BCP "Venite" translation rather than this store's usual Douay-Rheims register, so it's marked `draft` pending a deliberate reword later. prime.test.ts's status-surfacing test relied on Ps 1 being incomplete; rewritten against Ps 94's real verified/draft split and Ps 151 (off the real 1-150 range) for the missing-fallback case instead. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
b73f8e108a |
Transcribe Monastic Vespers weekday psalmody from source
Sourced from Divinum Officium's explicit "[Monastic Vespera]" block
(Latin+English Psalmorum), not the ambiguous unlabeled Day/Daya tables
earlier in the same file — confirmed by cross-checking Monday's psalms
against the already live-verified Lauds antiphons, which the unlabeled
tables both got wrong. Only 4 psalms a day (Rule of Benedict ch. 17),
with two real wrinkles: Ps 115+116 joined under one shared antiphon on
Monday, and Ps 138/143 each split across two verse-ranges under one
shared antiphon (Thu/Fri) — modeled by letting a group's `psalms` list
take `{number, verses}` entries alongside plain numbers.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
1a1b296c5f |
Model the Paschaltide alleluia suffix on Common-category antiphons
Deploy / deploy (push) Successful in 56s
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> |
||
|
|
75b731221e |
Close out P/T/S/N: St. Benedict's/All Saints Benedictine's own content, St. Michael redirect bug
Deploy / deploy (push) Successful in 57s
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> |
||
|
|
37dac8b476 |
Sweep minorHoursCommon (P/T/S/N) across the whole calendar, not just the 94-saint batch
Deploy / deploy (push) Successful in 56s
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> |
||
|
|
130b0f983d |
Extend the source-file fallback to Frances of Rome/Bibiana, fix a real Agatha/Lucy gap
Deploy / deploy (push) Successful in 56s
Follow-up to the previous commit: applies the same "read the fileref directly, no live query required" fix to St. Frances of Rome and St. Bibiana, whose own filerefs simply hadn't been derived yet (they predate the Kalendaria-table work this session built). Both resolve to common-of-a-virgin, same as several of the 15 fixed previously. Also swept every saint on the calendar (not just this batch's own lineage) for any other still-missing collect or Benedictus antiphon, which turned up a real, older gap: St. Agatha and St. Lucy's own file comments already documented "resolves honestly missing... despite propers being set" -- written before collectCommon existed as a mechanism at all. Agatha's own [Oratio] is a name-substituted reference confirmed identical to the already-existing collect-c6.yml template, so collectCommon was simply wired in. Lucy's own [Oratio] references a different Common formula unedited, with her own [Name] section supplying the whole descriptive phrase a plain name field would otherwise need the template for -- written as her own st-lucy-collect.yml rather than a new single-use template, since she's the only current user of that unedited form. St. Clare showed up in the same sweep but is a false positive: her real content lives in a separate commemoration-bundle file, used via a different code path the sweep's synthetic-winner methodology doesn't exercise -- already fully authored, no gap. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
ea15e909df |
Resolve 15 "unwinnable" stubs' Benedictus antiphons from source directly
Deploy / deploy (push) Successful in 55s
Direct feedback on the previous commit's framing: "unwinnable" was describing an artifact of Divinum Officium's own single-winner precedence model, not a real content gap -- this app already renders commemorated saints on their own terms and doesn't need a saint to win a live query to have real content. Fixed by reading each of the 15 saints' own already-validated fileref directly (the exact same fileref their collect was already sourced from during the Kalendaria-table pull) for its [Ant 1] section, falling back to whatever Common its own [Rule]/[Rank] "vide"/"ex CXX" reference names when there isn't one -- the same proper-then-Common shape getDayCollect/collectCommon already uses, just applied to the Benedictus antiphon too. 14 of the 15 had no [Ant 1] of their own at all -- clean Common fallback, and every one of their C-numbers falls inside a family already live-query-verified in the previous commit, so minorHoursCommon/benedictusCommon were wired directly with full confidence: St. Marcus, St. Felix (Presbyter), St. Hermes, St. Saturninus, St. Prisca, St. Thecla, St. Catherine of Siena, Ss. Machabees, Ss. Marius/Martha/Audifax/Abachum, Ss. Twelve Brothers, Ss. Alexander/Eventius/Theodulus/Juvenal, Ss. Felix/Simplicius/ Faustinus/Beatrix, Ss. Nabor and Felix. St. Felicitas needed one new category (C7), but it turned out to be a cross-reference resolving to text byte-identical to the already-verified common-of-a-virgin. The 1 remaining (Ss. Euphemia, Lucy, and Geminian) does have her own real [Ant 1] -- but marked draft, not verified, on principle: St. Alexius's own file also has a genuine [Ant 1] that his actual live-rendered Benedictus antiphon doesn't use (common-of-an-abbot's text instead), so a raw [Ant 1] read alone isn't sufficient proof, and for a saint that can never be live-checked at all that uncertainty can't be resolved either way -- used the text anyway, honestly flagged rather than claimed as confirmed. St. Frances of Rome and St. Bibiana (the older, pre-Kalendaria-table 109-saint pass) are good candidates for this same fix but weren't touched here, since their own fileref was never derived by this session's work. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
9faa7168bc |
Author Benedictus antiphons for the remaining 26 propers:null saints
Deploy / deploy (push) Successful in 57s
Completes the 94-saint batch's Benedictus-antiphon coverage. A saint with a genuine proper collect doesn't imply a genuine proper antiphon, same finding as St. Martin of Tours's mixed proper/shared split from the original 29-saint pass: of the 26, 15 are genuinely unwinnable stubs (already documented from the collects pass -- always commemorated, never the day's own title, so nothing to live-query) and left honestly missing, matching St. Frances of Rome/St. Bibiana's precedent from the original 109-saint pass; 7 of the remaining 11 turned out to render byte-identical to an already-authored Common category (benedictusCommon wired directly, no new content) -- including Ss. Dionysius and Companions, whose own `common` field says common-of-a-martyr-bishop but whose live-verified minor-hour text actually matches common-of-several-martyrs, another case (like Chair of St. Peter earlier) where the two fields genuinely diverge. The other 4 have real unique text of their own: All Saints of the Benedictine Order, St. Agnes (secunda), St. Benedict (no English in the source, translated and marked draft, same gap as St. Scholastica's), and the Vigil of St. John the Baptist (deliberately echoing the Benedictus canticle's own opening words). P/T/S/N for these 26 not attempted here -- a further layer on top, same as how the original 109 got Benedictus antiphons long before their own later, separate P/T/S/N pass. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
ffaa797940 |
Author Benedictus antiphon + P/T/S/N Commons for 66 propers:null saints
Deploy / deploy (push) Successful in 56s
Continues the 94-saint batch this collects pass unblocked. Raw Commune/*.txt fields don't reliably match what the engine actually renders per hour -- same lesson as the collects pass, confirmed again: no CommuneM/*.txt file defines explicit per-hour antiphon fields for any category this batch needed, and the already-authored common-of-a-confessor-bishop content (from the original 29-saint pass) doesn't match Commune/C4.txt's own raw [Ant 1] either, since it was live-query-sourced rather than read from the file directly. Fixed by querying web/cgi-bin/horas/officium.pl directly (local Perl, not a network fetch) for one representative saint per Common category, with every representative's title verified against an accent-insensitive name-stem match before its content is trusted -- caught a stale-date bug this way: St. Emerentiana's stored clean-year comment actually rendered St. Hilary of Poitiers's office that year. Cross-querying multiple saints per nominal SaintRecord.common category found the real liturgical groupings are coarser (Martyr-Bishop and Martyr; Abbot, Confessor-not-Bishop, and Confessor; Virgin-Martyr, Virgin, and Holy Woman all render identical minor-hour text) but not uniformly so (Pope-Martyrs render distinct allelúja-toned text from plain Several-Martyrs; the Dedication of the Basilicas of Ss. Peter and Paul draws from the Dedication Common, not its nominal common-of-an-apostle at all). Net: 7 new shared Common categories plus the pre-existing common-of-a-confessor-bishop (which also needed a new Benedictus-antiphon file of its own) cover 66 of the 94 saints. New mechanism: SaintRecord.benedictusCommon, with getBenedictusAntiphon falling back to it the same way getDayCollect already falls back to collectCommon -- no name-substitution needed here, since every Common category in current use renders name-free Benedictus-antiphon text. Also fixes a real bug this surfaced: getMinorHourOverrideId gated all Prime/Terce/Sext/None lookup behind the same duplex-majus+ threshold Lauds' own psalmody override uses, on the assumption that only a strong feast carries its own minor-hour content -- live-querying proved that wrong (a winning Semiduplex saint still renders its own antiphons, not the ferial default). Lauds' psalmody override itself stays majus+-gated correctly, since it's a much bigger per-saint commitment this batch doesn't add a Common fallback for. Ss. Ursula and Companions deliberately left without a minor-hour Common: her collect template has no other calendar member to verify a shared text against, and she can never be queried directly (a genuinely unwinnable stub) -- left honestly unauthored rather than guessed. The other 26 of the 94 (own proper collect, from the collects batch) still need their own individually-authored Benedictus antiphon, same shape as the original 109-saint pass -- not done in this pass. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
6bb4c6a80f |
Author day collects for all 94 propers:null saints via Kalendaria tables
Deploy / deploy (push) Successful in 59s
Blind per-date source-file reading (Sancti/SanctiM MM-DD.txt) turned out
unreliable for collect authorship: those files are era-merged, carrying
centuries of accumulated saints behind rubric-conditional gating, so a
naive read often returned a saint canonized long after 1617 instead of
the Monastic-Tridentine-era one actually on this calendar (St. Didacus
instead of All Saints of the Benedictine Order, St. Rose of Lima instead
of Ss. Felix and Adauctus, etc).
Fixed by pulling from web/www/Tabulae/Kalendaria/'s own era-specific
calendar tables (1570.txt Tridentine base + M1617.txt's Monastic diffs)
instead, cross-validated against the pre-1955/Divino Afflatu chain
(1888->1906->1939->1954) as a corroborating signal. Cross-referencing all
205 existing saint records against this table confirmed 204/205 were
already correctly placed -- the earlier live-query verification work was
sound, only blind file-reading was flawed -- so no sanctoral-calendar.yml
corrections were needed, just the collect content itself.
Two collect shapes came out of the 94: 34 proper collects (own YAML file,
Latin verified against source, English translated+draft where the source
lacked it) and 60 resolved via a new Common-collect templating mechanism
-- SaintRecord.collectCommon/collectName plus substituteName() in
resolve-common.ts, filling a template's {N} placeholders positionally
from the saint's own declined name, across 21 new common/collect-c*.yml
templates named after the source's own C-numbering.
St. Michael's Sep 29 propers resolved via its whole-file @Sancti/05-08
inheritance (Apparition of St. Michael, May 8). St. Martha's plural-
template default was overridden to the singular collect-c6a since she's
one person, not a pair.
Also fixes a latent bug this surfaced: getDayCollect looked up
`${collectCommon}-collect`, but collect-c*.yml files are id'd as
`collect-c2` etc with no such suffix -- caught by a smoke test where
every one of the 93 non-Michael saints resolved as missing.
4 pre-existing tests updated: they asserted specific saints (St.
Benedict, St. Romanus Abbot, St. Anthony Abbot) had no authored collect,
which is no longer true; resolve-common.test.ts's generic "missing" case
now uses a synthetic day/winner since no real unauthored saint remains
as an example.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
d6ea898e3f |
Author Lauds psalmody+office-bundle for all 28 remaining duplex-majus+ saints
Deploy / deploy (push) Successful in 56s
Completes the Lauds content backlog: every saint with Prime/Terce/Sext/ None content already authored this session now also has its own Lauds psalmody override (3 psalm antiphons + Canticle of the Three Young Men + Laudate antiphon) and office bundle (capitulum/responsory/hymn/versicle), live-verified against Divinum Officium (Monastic Tridentinum 1617). Combined with the 4 already done (st-lawrence, marian-saturday, christ-the-king, christmas-octave-sunday), the psalmody-override and office-bundle backlogs are both now fully closed for every non-`propers: null` duplex-majus+ id. Confirmed structurally, not assumed: the 5 Lauds antiphons are the same pool Prime/Terce/Sext/None draw from (Prime=1, Terce=2, Sext=3, None=5, skipping the canticle's own 4th). St. Scholastica again needed self-translation (no English exists in the source for her Lauds content either) -- four of five antiphons and her capitulum reuse the English already verified for her Terce/Sext/None content; the canticle antiphon, versicle, and 6-stanza hymn are new translations. Surfaced a real schema gap along the way: the Lauds psalmody-override type has no per-language status field the way the Prime/Terce/Sext/None mechanism does, so her draft English can't carry the same "unverified" UI marker there -- flagged in TODO.md, not fixed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
6bab6047c1 |
Author full Christmas-Octave Sunday content, fix a temporal-id override gap
Deploy / deploy (push) Successful in 57s
christmas-octave-sunday previously had only its Benedictus antiphon
authored -- no Lauds psalmody override or office bundle, no Prime/Terce/
Sext/None content at all. Adds the full set: Lauds psalmody (3 psalms +
Canticle of the Three Young Men + Laudate, all distinct antiphons),
Lauds capitulum/versicle/hymn ("A solis ortus cardine"), and Prime/Terce/
Sext/None antiphons+chapters (Terce/Sext/None only, matching Gal
4:1-2/4:4-5/4:7 -- the same reading the raw Monastic Tridentinum 1617
source file gives for this Sunday).
Real code gap found and fixed along the way: getMinorHourOverrideId
(hours/resolve-common.ts) only checked the sanctoral branch of
resolveOfficeWinner's result, so a named temporal feast in
ALWAYS_OVERRIDE_TEMPORAL_IDS (marian-saturday, christ-the-king) got a
Lauds psalmody override but silently never a Prime/Terce/Sext/None one,
however much was authored for it. Fixed by mirroring
getPsalmodyOverrideFor's own temporal-id branch (hours/lauds.ts), and
christmas-octave-sunday added to that set.
Content sourced from a "Divino Afflatu 1954" live query rather than
Monastic Tridentinum 1617, since 1617 has no real identity of its own for
this Sunday under its own calendar rules on most Dec 26-29 dates (only
the collect, already authored separately, happened to be pulled from a
date where 1617 did render it) -- consistent with this app's stated
precedent of following D.A. for calendar/precedence even while keeping
1617's shape for the hours themselves elsewhere.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
bcae61568a |
Add Paschaltide-variant fallback for minor-hour Commons
Deploy / deploy (push) Failing after 57s
Confirms and formalizes what TODO.md had flagged as an open question:
the reference engine's own source has explicit Paschaltide variants
(Commune/C1p.txt, C2p.txt, C3p.txt -- "tempore Paschali") for exactly 3
of its 12 Common categories -- Apostles, a Martyr-Bishop, Several
Martyrs -- a real liturgical restriction of Alleluia/victory imagery to
apostles and martyrs, not a coincidence.
resolveMinorHourAntiphon/resolveMinorHourChapter now try a
`${minorHoursCommon}-paschaltide` variant first whenever day.season is
eastertide/ascensiontide/pentecost (the same three-season window as
Compline's own Regina Caeli table, since "tempore paschali" runs through
the Pentecost octave in both), falling back to the plain Common when no
variant is authored.
common-of-apostles-paschaltide (7 files) ported directly from the
reference engine's own Commune/C1p.txt source files rather than
live-queried, then cross-checked against st-mark's already-authored,
live-queried content -- identical except one antiphon's asterisk, which
the source places one word earlier; corrected to match. st-mark and
st-john-before-the-latin-gate's duplicate per-saint files removed
entirely; ss-philip-and-james's chapter files removed (its antiphons
stay proper).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
735f677815 |
Extract shared Commons for Prime/Terce/Sext/None minor-hour content
Deploy / deploy (push) Successful in 57s
A systematic diff across all 29 duplex-majus+ saints' P/T/S/N files found
real shared-Common groups beyond the pairs noticed in passing while
authoring them. Extracted into shared data/propers/common/{hour}-antiphon-
common-of-*.yml / {hour}-capitulum-common-of-*.yml files and wired via a
new SaintRecord.minorHoursCommon field, with resolveMinorHourAntiphon/
resolveMinorHourChapter falling back to it when a saint has no proper file
of their own. Deliberately a separate field from the existing (previously
unused) `common` field: the minor hours don't always draw from the same
Common category as the saint's overall classification -- both Chair of
St. Peter feasts are `common: common-of-an-apostle` by rank, but their
P/T/S/N content is Common of a Confessor Bishop (Peter considered as
bishop of that see).
Four groups extracted (87 duplicate files collapsed to 21 shared ones),
each confirmed byte-identical via diff first: common-of-apostles (8
saints, all 4 hours), common-of-a-confessor-bishop (Chair of Peter pair
share antiphons+chapters, Martin of Tours shares only chapters), common-
of-the-bvm (Nativity BVM + Immaculate Conception's Sext/None/Terce
chapters -- the Assumption's own stay proper, different reading + proper
versicles), and common-of-st-peter (St. Peter ad Vincula + Ss. Peter and
Paul, not a real Common category, just genuinely identical Petrine
content).
Deliberately left un-extracted: St. Mark, St. John Before the Latin Gate,
and Ss. Philip and James share identical text that live-checking shows is
Paschaltide-seasonal (all three landed within the Easter octave weeks on
their queried dates, despite disagreeing `common` classifications) rather
than a fixed per-saint-category Common -- folding it into the same
mechanism would misrepresent season-contingent content as timeless. Left
as individually-authored files; flagged in TODO.md as needing a real
Paschaltide-awareness mechanism this app doesn't have yet for any hour.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
6dad25fef6 |
Author Prime/Terce/Sext/None antiphons+chapters for all 29 duplex-majus+ saints
Completes the P/T/S/N minor-hour override backlog started with St. Lawrence: every duplex-majus+ saint not blocked by a missing collect (propers: null) now has its own antiphon (all four hours) and chapter (Terce/Sext/None) text, live-verified against Divinum Officium (Monastic Tridentinum 1617). Two saints needed corrections to the reference engine's own data rather than straight extraction: St. Scholastica's minor hours have no English rendering in the source at all (English/SanctiM only covers Matins for her), so the English is translated here directly and marked draft; the Immaculate Conception's antiphons render with diacritics stripped relative to the word-for-word-parallel Nativity BVM antiphon, so accentuation is restored to match and marked draft. Several saints share identical Common of Apostles or Common of the BVM content, confirmed via diff before reuse. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
2658a2b94e |
Fix splitNamedAntiphon silently upgrading draft text to verified
Deploy / deploy (push) Successful in 53s
Every antiphon that goes through the incipit/full split -- which is every antiphon across every hour -- lost its real status the moment it passed through here: splitNamedAntiphon hardcoded `verified` on its output via verifiedText(), regardless of what the source's actual status was. Concretely, this meant St. Scholastica's antiphon (I translated it myself, no English existed in the source), Matthias's and several other apostles' reworded English, and Gregory the Great's translated antiphon all silently rendered as if fully verified -- losing the "unverified draft text" UI marker (src/ui/styles.css's .text-draft, a dashed underline + tooltip) that's supposed to distinguish "copied straight from the source" from "Claude's own rendering." Fixed by having splitNamedAntiphon accept a real ResolvedText and carry its per-language status through unchanged to both outputs, instead of silently upgrading everything to verified. Callers whose antiphon never had a status field to begin with (plain weekday-default antiphons and Lauds psalmody overrides -- neither type tracks status at all, always implicitly verified by the source file's own live-checked convention) now wrap with verifiedText() explicitly at the call site, rather than that assumption being buried inside splitNamedAntiphon itself. resolveMinorHourAntiphon (Prime/Terce/Sext/None's override lookup) now returns a full ResolvedText for the same reason. Verified end-to-end with St. Scholastica's real draft-English antiphon, both via a direct unit test and visually in the browser (the dashed underline now shows correctly under her Benedictus antiphon). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
ea29e5ee45 |
Add Dec 26-30's own Sunday rule -- a deliberate remix, not a live-verified fix
Deploy / deploy (push) Successful in 54s
Per direct instruction, and explicitly framed as this project's own departure from Monastic 1617 itself: within Dec 26-30 inclusive (exactly one real Sunday falls somewhere in that window every year), whichever date is the actual Sunday always wins as Nat1-0 outright, with no rank check at all -- even Stephen/John/Holy Innocents (Duplex II. classis) get fully displaced, not just commemorated. The displaced saint isn't commemorated in place either; he reappears in full as Dec 30's own winner instead (the block's one date with no fixed saint of its own). Rank never matters for this rule -- confirmed with Becket (Semiduplex) transferring the same way as the Duplex-II-classis saints. This deliberately diverges both from what Monastic 1617 itself does on Dec 26-29 (live-verified two commits ago: the saint wins there, Sunday merely commemorated) and from the general privileged-sunday transfer rule elsewhere (which only transfers ranks below duplex-majus and commemorates everything else in place) -- this window transfers every rank and commemorates nothing in place, a genuinely new, third behavior specific to this 5-day block. Implemented as calendar/index.ts's applyChristmasOctaveSunday, a narrowly-scoped layer in the same spirit as applyMarianSaturday/ applyChristTheKing, rather than by changing the shared decideOccurrence/transfer machinery every other Sunday relies on. Dec 31 and everything outside Dec 26-30 is untouched -- St. Silvester still beats the Sunday there via the plain, unchanged ordinary-sunday rule. Verified against all five possible Sunday positions within the window (Dec 26/27/28/29/30) plus the "nothing displaces anything" control case, each with its own dedicated test in the new tests/calendar/christmas-octave-sunday.test.ts. Updates two existing tests whose assertions were correct under the old rule and are now superseded specifically within this window (Stephen/Innocents no longer win their own Sunday-collision dates there) while confirming the underlying ordinary-sunday rule is still live and real outside it (Dec 31/St. Silvester). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
397f31f4fc |
Implement octave-vs-octave precedence, and fix a real day-label bug it surfaced
Deploy / deploy (push) Successful in 52s
When more than one octave is active on a day with no temporal standing of
its own (St. Lawrence's and the Assumption's genuinely overlap every Aug
16-17), which one governs the day's content/label is now decided by rank
comparison instead of "whichever started first" (an accident of
insertion order). Per direct instruction:
- Highest effective rank wins outright; every other active octave still
gets commemorated, same as a single octave already outranking a weak
rival saint.
- A rank tie goes to whichever octave started more recently -- day 1 of
a new octave needs to be fully present, the whole point of it
starting. No real tied-rank case exists yet to verify this
empirically, unlike everything else here -- documented in TODO.md as
a stated decision, not a live finding.
New OctaveConfig.closingDayRank (default duplex): an octave's own final
day ("in Octava") is elevated above its ordinary in-between rank --
live-verified as a real, general pattern (both St. Lawrence's Aug 17 and
the Assumption's Aug 22 show as Duplex, above their otherwise-Semiduplex
ordinary days), not a one-off. This elevation is *why* Lawrence's octave
beats the Assumption's on their one real overlap day despite the
Assumption being the far higher-ranked feast overall. Feeds both the
existing rival-saint threshold and the new octave-vs-octave comparison.
calendar/octaves.ts gains resolveActiveOctave (+ pickWinningOctave, the
comparison itself factored out for direct unit testing against synthetic
data, since no real tied-rank overlap exists to test against yet).
hours/resolve-common.ts's resolveOfficeWinner and calendar/day-label.ts
both now call it instead of each keeping their own "activeOctavesFor(...)
[0]" logic.
That consolidation surfaced a real, independent bug: getDayLabel never
checked temporalCategory at all before choosing an octave name, unlike
resolveOfficeWinner -- found while testing the real Aug 16 overlap (a
Sunday that year, where the temporal Sunday has standing and should win
outright). Live-verified counterexample: the Christmas Octave's own
stack (Dec 30) was wrongly labeled "3rd Day within the Octave of The Holy
Innocents" instead of the correct plain temporal label -- the real title
never names any of the four stacked octaves there. Fixed by sharing the
exact same ordinary-feria gate resolveOfficeWinner already had, so the
two can no longer disagree.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
5f4cf33776 |
Add per-feast overrides to Prime/Terce/Sext/None; fill Lauds' own Lawrence office bundle
Deploy / deploy (push) Successful in 51s
Prime/Terce/Sext/None had no per-feast override mechanism at all before this -- their psalm antiphon always fell back to the plain weekday default and their chapter was always a single fixed per-annum/per-weekday text, regardless of what was actually being celebrated, even on a saint's own actual feast day (not just during an octave). Confirmed live (Monastic Tridentinum 1617) that St. Lawrence has his own real antiphon and chapter at every one of these hours, both on his own day and throughout his octave. New shared mechanism in hours/resolve-common.ts: getMinorHourOverrideId (duplex-majus+ threshold, kept in sync with Lauds' own so it's one shared backlog), resolveMinorHourAntiphon, resolveMinorHourChapter -- all resolveOfficeWinner-aware, so an octave day gets the same override as the feast's own actual day. Prime additionally needed isSundayOrFeastOffice (its capitulum/Preces Sunday-vs-ferial choice) made octave-aware -- live-verified Prime's capitulum stays the Sunday/feast form throughout the octave too, so no new file was needed there, just reaching the existing one correctly. Also fills in Lauds' own still-missing Lawrence office bundle (capitulum/responsory/hymn/versicle) -- flagged in TODO.md as worth fixing "even before tackling the other 32" and still not done until now. Authored real content for St. Lawrence across all five hours from live queries. The same ~31-saint backlog (TODO.md) now applies uniformly across Lauds and the four hours fixed here. Also documents a real, found-not-fixed gap: when two octaves overlap with no temporal standing to yield to (St. Lawrence's and the Assumption's genuinely overlap every Aug 16-17), this app currently picks whichever started first, which happens to match the live engine on Aug 17 (Lawrence's own elevated final "Octave Day" outranks the Assumption's ordinary octave-day strength) but only by coincidence, not a real rank comparison -- proposed design written up in TODO.md pending a decision on scope. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
143244203d |
Fix octave-day office content: use the octave's own feast, not the plain ferial
Deploy / deploy (push) Successful in 52s
Real, multi-part bug found by looking closely at today's rendering (day 3
of St. Lawrence's octave, St. Clare commemorated): the psalmody
antiphons, hymn, chapter/responsory/versicle, Benedictus antiphon, and
day collect were all keyed off `day.winner` directly, which stays the
plain temporal identity (post-pentecost-11) throughout an octave --
St. Lawrence's own already-authored psalmody override and collect never
engaged on any day but his actual feast day. Live-verified (Tridentine
1910, 2026-08-12) that the whole office on an ordinary octave day
actually comes from the octave's own feast ("{ex Commune aut Festo}" /
"{ex Proprio Sanctorum}"), with a *weaker* commemorated saint (Clare)
getting a separate Ant+V/R+collect block of her own alongside it.
Fixed with a new resolveOfficeWinner(day) in hours/resolve-common.ts,
used everywhere getDayCollect/getDayCollects/getBenedictusAntiphon/
getPsalmodyOverrideFor used to read day.winner directly. Deliberately
gated on temporalCategory === 'ordinary-feria' (the day has no standing
of its own) rather than "any active octave" -- the Christmas Octave's
own stacked octaves are the live-verified counterexample where the
*temporal* day keeps the office instead, each octave becoming its own
separate commemoration block (not yet modeled, flagged in TODO.md).
Also fixes the ferial Preces gate (added in the previous commit) to
exclude active octaves the same way the suffrages already do --
live-verified "Preces Feriales{omittitur}" on the same date.
getDayCollects now renders a sanctoral commemoration as a real
Ant+V/R+collect bundle when authored (${propers}-commemoration.yml),
not just a bare, unlabeled collect -- the old rendering was indeed the
confusing "PRAYER / (translation pending)" block spotted today, which
was St. Clare's placeholder with no indication whose it was or why.
Authored her real commemoration bundle and standalone collect from the
same live query rather than leaving it pending.
One correction to a guess floated mid-session: the Benedictus antiphon
does NOT go to the commemorated saint (Clare) -- live-verified it stays
with the octave's own feast (Lawrence's "In cratícula"), same as
everything else in the primary office; only the separate commemoration
block is Clare's.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
9c9811a9ed |
Add Lauds' ferial Preces (Tridentine 1906/1910), shown on ferial/vigil days
Deploy / deploy (push) Successful in 53s
Monastic 1617 has no Preces feriales at Lauds at all -- content sourced from Tridentine 1906/1910 per direct instruction, same track as the Cross suffrage and St. Joseph's suffrage. New lauds-preces-feriales.yml (Kyrie, Pater noster, the full versicle litany, Psalm 129, closing versicles) transcribed from a live query against a clean Advent feria, matching what actually rendered rather than the underlying template's own conditional markup (the Pope/Bishop and benefactors' versicles are both dropped live despite being present in the template; the King/nation versicle pair is kept despite the template's own rubric note suggesting otherwise). New `lauds-preces` part kind (hours/types.ts) picks between this and the existing short Sunday/feast litany (lauds-short-litany.yml, unchanged content) on a ferial-or-vigil day. Deliberately not the shared `isSundayOrFeast` predicate, which treats a Vigil as a "feast" -- here a Vigil needs to land on the ferial side instead, per direct instruction. Also deliberately wider than the real 1906/1910 rubric itself, which restricts the fuller form to Advent/Lent/Ember days specifically -- shown on *every* ferial or vigil day instead, mirroring the identical explicit choice already made for Prime's own ferial Preces. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
2f8f744cd1 |
Omit Lauds suffrages entirely during Advent/Christmastide/Passiontide and any active octave
Deploy / deploy (push) Successful in 54s
Checked directly against Monastic Tridentinum 1617 (not just the Tridentine 1906/1910 track the suffrage content itself comes from) -- this omission isn't a rubric-track-specific quirk, it holds under this app's own primary source too: - Advent, Christmastide, and Passiontide ferias: suffrages omitted entirely. Confirmed ordinary Lent (weeks 1-4, not Passiontide) is NOT excluded -- only the last two weeks are. - Any day within an active octave: suffrages omitted entirely, however low that octave's own rank is -- confirmed against day 2/3 of St. Lawrence's own Semiduplex octave, well below the existing Duplex+ threshold. Today (within Lawrence's octave) was showing all five suffrages before this fix; the real office has none but the Marian antiphon. Still not modeled, flagged in TODO.md: Paschaltide's own substitution (a single alleluia-form "Suffragium Paschale" replaces the whole set during Eastertide, rather than the ordinary set showing or being omitted) -- a separate, larger feature. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
fb66f60770 |
Add St. Joseph's suffrage; fix Cross/BVM suffrage gating
Deploy / deploy (push) Successful in 51s
Three things prompted by today's date resolving wrong: 1. St. Joseph's own Lauds suffrage was never modeled at all. Added lauds-suffrage-joseph.yml, sourced from Tridentine 1906/1910 (the reference engine's "Tridentine - 1906" version) per direct instruction -- Monastic 1617's own suffrage set has no Joseph suffrage at Lauds, so this one genuinely comes from a different track than the other four. 2. The Cross suffrage's actual gating rule, live-verified against a plain ferial win, a plain Sunday win, a low-rank saint's own win (even bare Simplex), and Marian Saturday: it shows only when the bare temporal feria itself is what's being prayed -- the opposite of "Sunday or a feast of the Lord." Expressed as `!isSundayOrFeast(day)` (the same ferial/festive split Prime's capitulum already uses) plus one more exclusion for a named temporal identity like Marian Saturday, which isn't Sunday or a sanctoral win either but still isn't a bare ferial office. 3. The BVM suffrage is correctly dropped on Marian Saturday (unchanged behavior, just now understood and commented correctly): it's specific to a day whose own office is already Marian, confirmed via the same live source, not a guess. Also models St. Clare (Aug 12, Simplex under Monastic 1617) and surfaces active octaves in getDayLabel, since today's date was resolving as a plain ferial day instead of showing St. Lawrence's octave with St. Clare commemorated. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
5f32a3751c |
Model St. Clare and surface active octaves in the day label
Deploy / deploy (push) Successful in 52s
Today (Aug 12, within St. Lawrence's octave) was resolving as a plain
ferial day: St. Clare wasn't modeled in the calendar at all, and even
once an octave commemoration exists, getDayLabel only ever looked for a
sanctoral commemoration, never an octave one, so the label fell all the
way through to the generic ordinal week label.
Adds St. Clare (Simplex under Monastic 1617, correctly losing to
Lawrence's octave and only commemorated -- live-verified against three
clean years). Extends getDayLabel to show the active octave itself as
the day's primary identity when nothing else has won outright (e.g.
"3rd Day within the Octave of St. Lawrence, Martyr -- St. Clare,
Virgin"), matching what the live reference engine actually titles these
days, rather than falling back to an anonymous ordinal week label.
Also fixes a regression this surfaced: Trinity Sunday is technically
also day 8 of Pentecost's own octave, and the naive octave-first check
was shadowing its own anchor-day name ("8th Day within the Octave of
Pentecost" instead of "Trinity Sunday"). A season's own named anchor day
now always outranks an active octave label.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
ff81a6fe52 |
Fix Christmas Octave Sunday's occurrence precedence (was backwards)
Deploy / deploy (push) Successful in 51s
christmastide's Sunday was coded privileged-sunday (Advent's own tier), which live-checking against the reference engine shows is wrong: on every one of the three real collision dates (St. Stephen/John/Holy Innocents, all Duplex-II-classis, falling on the Sunday within the Octave) the saint wins outright and the Sunday is merely commemorated -- the reverse of what privileged-sunday would produce (Sunday stays primary, saint just gets a nod). St. Silvester (plain Duplex, Dec 31) confirms the same live. Reclassified to ordinary-sunday, which matches all four checked cases: Duplex+ wins outright (Stephen/John/Innocents/ Silvester), Semiduplex still transfers off the Sunday rather than winning (St. Thomas Becket, unaffected by the fix either way), and a day with no saint at all resolves to the Sunday cleanly. Found while pulling christmas-octave-sunday's own Benedictus antiphon from the reference engine's dedicated Tempora/Nat1-0 proper and noticing this app's own occurrence resolution didn't match what the live engine showed for the Sunday's real collision dates. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
73672853ef |
Author christmas-octave-sunday's own Benedictus antiphon
Deploy / deploy (push) Successful in 52s
Corrects the previous conclusion (that this id had no clean sourceable date at all). The reference engine has a dedicated proper for this Sunday, Tempora/Nat1-0, distinct from the individual octave-day saints' own pages -- most years the Sunday loses outright to a Duplex-II-classis octave saint (St. Stephen/St. John/Holy Innocents) and only earns a bare commemoration, which is what the earlier search kept finding, but 2029-12-30 is a year where the Sunday wins outright with no commemoration at all, so that's the date pulled from. All 52 temporal ids (54 counting marian-saturday/christ-the-king) now have an authored Benedictus antiphon, closing out the temporal half of the "every sanctoral and temporal entry needs its antiphons" task for real. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
5a76f2198c |
Author Benedictus antiphons for all 51 remaining temporal ids
Deploy / deploy (push) Successful in 50s
Pulls the Lauds Benedictus antiphon (Latin + English) for every temporal-id proper except christmas-octave-sunday, completing the "every sanctoral and temporal entry needs its antiphons" task (sanctoral side finished in prior commits this session). Dates were found programmatically: a Node script iterated resolveDay() over full years to find, for each temporal id, the first date this app's own calendar logic resolves to it, then each candidate date was cross-checked against a live Divinum Officium (Monastic Tridentinum 1617) query to confirm the title has no saint collision before pulling content. Four ids (easter-5, easter-6, post-pentecost-11, post-pentecost-14) needed a second, alternate date after the first candidate turned out to collide with a saint modeled in the live reference engine but not in this app (St. Mark, St. Athanasius, Our Lady of the Snows). christmas-octave-sunday is deliberately left unauthored: every date it can resolve to collides with a specific named octave-day feast in the real calendar, so there's no clean generic content to source -- see TODO.md. Also updates tests/hours/lauds.test.ts: the old "falls back to missing on a plain temporal day" test used a date that now has real content (post-pentecost-11), so it's replaced with a test confirming that content resolves correctly plus a new test specifically covering the christmas-octave-sunday exception. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
346a5c65eb |
propers: Benedictus antiphons for December's sanctoral entries (9/10)
Deploy / deploy (push) Successful in 53s
4 authored fresh (Nicholas, the Immaculate Conception, Damasus, Thomas of Canterbury), 1 corrected (Lucy -- confirmed sourced from the Roman rite's raw [Ant 1] rather than a real Monastic 1617 rendering, same pattern as every month so far). Thomas Apostle, Stephen Protomartyr, John Apostle, and Holy Innocents already matched the live query as found -- December's own late feasts (the Christmas Octave content) turned out much less prone to the Roman/Monastic divergence than earlier months, presumably because they're old and universal enough that the two rites never actually diverged on them. St. Bibiana left honestly missing: Simplex rank, Dec 2 falls within Advent every tested year 2026-2029, same structural block as St. Frances of Rome in March -- she can never win her own day outright under this app's own calendar rules. This closes out the full sweep: all 109 sanctoral entries with a propers id have now been checked against a live Monastic query, twelve months, one at a time. TODO.md has the final tally. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
229250231a |
propers: Benedictus antiphons for November's sanctoral entries (7/7)
Deploy / deploy (push) Successful in 52s
4 authored fresh (All Saints, Clement I, Catherine of Alexandria, Silvester Abbot), 2 corrected (Cecilia, Andrew -- 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). Martin of Tours already matched the live query as found, no change needed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
1ad55d49a4 |
propers: Benedictus antiphons for October's sanctoral entries (7/7)
Deploy / deploy (push) Successful in 53s
All 7 authored fresh: Francis of Assisi, Callistus I, Luke, Ss. Chrysanthus and Daria, the Vigil of Ss. Simon and Jude, Ss. Simon and Jude, the Vigil of All Saints. Luke and Simon/Jude both needed the same register fix as Matthias/ Barnabas/James the Greater/Bartholomew/Matthew (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> |
||
|
|
1a82a67b15 |
propers: Benedictus antiphons for September's sanctoral entries (5/5)
Deploy / deploy (push) Successful in 54s
4 authored fresh (Matthew, Ss. Cyprian and Justina, Ss. Cosmas and Damian, Jerome), 1 corrected (the Nativity of the BVM -- confirmed sourced from the Roman rite's raw [Ant 1] rather than a real Monastic 1617 rendering, same pattern as every month so far). Matthew needed the same register fix as Matthias/Barnabas/James the Greater/Bartholomew (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> |
||
|
|
7dfc5a81ea |
propers: Benedictus antiphons for August's sanctoral entries (12/12)
Deploy / deploy (push) Successful in 53s
9 authored fresh (Dominic, Ss. Cyriacus/Largus/Smaragdus, Assumption, Bernard, Bartholomew, Louis, Zephyrinus, Augustine), 1 corrected (Peter's Chains -- confirmed sourced from the Roman rite's raw [Ant 1] rather than a real Monastic 1617 rendering, same pattern as every month so far). Two already matched the live query as found (Finding of St. Stephen, the Decollation of St. John the Baptist) and needed no change. Bartholomew needed the same register fix as Matthias/Barnabas/James the Greater (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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |