d77c9ca68fe0aabe7ce3718849e2dcf3ac436e43
11 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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>
|
||
|
|
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> |
||
|
|
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> |
||
|
|
81440de832 |
hours: add the day's-collect resolver
Terce/Sext/None's Oratio is the day's own Proper-of-season/-saints collect, not a fixed text — getDayCollect() resolves it from the LiturgicalDay's winner (temporal id or sanctoral saint's propers), falling through to an honest "missing" status for saints that don't have authored propers yet. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |