Resolve 15 "unwinnable" stubs' Benedictus antiphons from source directly
Deploy / deploy (push) Successful in 55s
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>
This commit is contained in:
@@ -425,6 +425,76 @@ P/T/S/N for these 26 not attempted in this pass — a further layer on
|
|||||||
top, same as how the original 109 got Benedictus antiphons long before
|
top, same as how the original 109 got Benedictus antiphons long before
|
||||||
their own later, separate P/T/S/N pass (duplex-majus+ subset only).
|
their own later, separate P/T/S/N pass (duplex-majus+ subset only).
|
||||||
|
|
||||||
|
### The 15 "unwinnable" stubs' Benedictus antiphons, resolved from source (2026-08)
|
||||||
|
|
||||||
|
Direct feedback on the section above: "unwinnable" was describing an
|
||||||
|
artifact of Divinum Officium's own single-winner precedence model, not
|
||||||
|
a real content gap — the app doesn't need a saint to *win* a live query
|
||||||
|
to have real content, since this app already renders commemorated
|
||||||
|
saints on their own terms (`day.commemorations`) rather than only ever
|
||||||
|
showing the day's outright winner. The fix: read each of the 15 saints'
|
||||||
|
own already-validated fileref directly (`extract_final.py`'s
|
||||||
|
`load_file`/`resolve`, the exact same fileref their collect was already
|
||||||
|
sourced from during the Kalendaria-table pull — no live query, no
|
||||||
|
"does this saint ever win" requirement at all) 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 `[Rule]`/`[Rank]` C-numbers (`C2a`,
|
||||||
|
`C2a-1`, `C3`, `C3a`, `C3a-1`, `C4b`, `C6`, `C6-1`, `C6a`, `C7`) falls
|
||||||
|
inside a family already live-query-verified in the section above, so
|
||||||
|
`minorHoursCommon`/`benedictusCommon` were wired directly with full
|
||||||
|
confidence, no new content needed: St. Marcus (`C4b` — a whole-file
|
||||||
|
`@Commune/C4` inherit, just the title relabeled "of the Popes" — into
|
||||||
|
`common-of-a-confessor-bishop`); St. Felix (Presbyter), St. Hermes, St.
|
||||||
|
Saturninus (`C2a`/`C2a-1` into `common-of-a-martyr`); St. Prisca, St.
|
||||||
|
Thecla, St. Catherine of Siena (`C6`/`C6-1`/`C6a` into
|
||||||
|
`common-of-a-virgin`); Ss. Machabees, Ss. Marius/Martha/Audifax/Abachum,
|
||||||
|
Ss. Twelve Brothers, Ss. Alexander/Eventius/Theodulus/Juvenal, Ss.
|
||||||
|
Felix/Simplicius/Faustinus/Beatrix, Ss. Nabor and Felix
|
||||||
|
(`C3`/`C3a`/`C3a-1` into `common-of-several-martyrs`). St. Felicitas is
|
||||||
|
the one genuine new finding: her file points to `C7` ("Commune Unius
|
||||||
|
non Virginis Martyris"), which isn't a category this project had
|
||||||
|
touched yet — but `C7`'s own `[Ant 1]` is itself a cross-reference
|
||||||
|
(`@Commune/C6:Ant 2`) that resolves to text byte-identical to
|
||||||
|
`common-of-a-virgin`'s own already-verified Benedictus antiphon, so no
|
||||||
|
new Common file was needed even there.
|
||||||
|
|
||||||
|
**The 1 remaining (Ss. Euphemia, Lucy, and Geminian) does have her own
|
||||||
|
real `[Ant 1]`** — but marked `status.la: draft`, not `verified`, on
|
||||||
|
principle: a real counterexample turned up in the *same* pass while
|
||||||
|
double-checking a winnable saint for comparison — St. Alexius's own
|
||||||
|
file also has a genuine `[Ant 1]` ("Similábo eum..."), yet his actual
|
||||||
|
live-rendered Benedictus antiphon (already confirmed in the section
|
||||||
|
above) uses `common-of-an-abbot`'s text instead, not his own `[Ant 1]`
|
||||||
|
at all. So a raw `[Ant 1]` read is demonstrably not sufficient proof by
|
||||||
|
itself that it's what the Benedictus canticle actually uses (Vespers'
|
||||||
|
Magnificat is a live candidate for what it's *actually* for), even for
|
||||||
|
a saint that *can* be live-checked — and for one that never can be, that
|
||||||
|
uncertainty can't be resolved at all. Used the text anyway (better than
|
||||||
|
nothing, and plausibly correct), just honestly flagged rather than
|
||||||
|
claimed as confirmed.
|
||||||
|
|
||||||
|
All 15 now have real content — none left "honestly missing." St.
|
||||||
|
Frances of Rome and St. Bibiana (the original, pre-Kalendaria-table
|
||||||
|
109-saint pass) are still left missing and are good candidates for this
|
||||||
|
exact same fix — this pass didn't touch them since their own fileref
|
||||||
|
was never derived (they predate the Kalendaria-table work this session
|
||||||
|
built), not because they're any less resolvable in principle. Ss.
|
||||||
|
Ursula and Companions (the section above) is the one case that's
|
||||||
|
actually different in kind: no other calendar member shares her
|
||||||
|
`C6b`/plural-Virgins-and-Martyrs category to cross-check a Common
|
||||||
|
against, so even a clean file read wouldn't have anything solid to
|
||||||
|
verify itself against.
|
||||||
|
|
||||||
|
Two vigils (Vigil of St. John the Baptist, Vigil of St. Lawrence) didn't
|
||||||
|
resolve via this file-based method at all (their particular file format
|
||||||
|
wasn't handled by this pass's parser) — no impact, both already had
|
||||||
|
real content from the live-query batch above.
|
||||||
|
|
||||||
### Christmas-Octave Sunday content — done (2026-08)
|
### Christmas-Octave Sunday content — done (2026-08)
|
||||||
|
|
||||||
Was: only the Benedictus antiphon existed for `christmas-octave-sunday`
|
Was: only the Benedictus antiphon existed for `christmas-octave-sunday`
|
||||||
@@ -761,13 +831,19 @@ correction (confirmed Roman-rite sourced), a handful already matched.
|
|||||||
(see the section above for method and its own correction).
|
(see the section above for method and its own correction).
|
||||||
- **94 `propers: null` saints: done (2026-08)** — see the dedicated
|
- **94 `propers: null` saints: done (2026-08)** — see the dedicated
|
||||||
section below for the collect-authoring pass and the era-specific-
|
section below for the collect-authoring pass and the era-specific-
|
||||||
calendar discovery it took to do reliably. Benedictus antiphon: done
|
calendar discovery it took to do reliably. Benedictus antiphon: real
|
||||||
for all 94 (own dedicated sections below) — 66 via a shared Common; of
|
content for all of them except the deliberate `example-confessor` test
|
||||||
the other 26 (own proper collect), 15 are genuinely unwinnable stubs
|
placeholder and Ss. Ursula and Companions (left honestly unset, no way
|
||||||
left honestly missing, 7 share an existing Common, and 4 have real
|
to verify a category of one — see her own file's comment) — 66 via a
|
||||||
unique text. P/T/S/N: done for the 66-saint batch; the 26 propers-set
|
shared Common (own dedicated section below); of the other 26 (own
|
||||||
saints' own P/T/S/N not yet attempted, a further layer on top (see
|
proper collect), 21 share an existing Common (7 live-query-verified
|
||||||
that section's own note).
|
directly, 14 more resolved straight from source once "unwinnable"
|
||||||
|
stopped being treated as a content blocker — see that section's own
|
||||||
|
note) and 5 have real unique text (one, Ss. Euphemia/Lucy/Geminian,
|
||||||
|
honestly marked `draft` rather than `verified` since it can never be
|
||||||
|
checked against a live rendering). P/T/S/N: done for the 66-saint
|
||||||
|
batch; the 26 propers-set saints' own P/T/S/N not yet attempted, a
|
||||||
|
further layer on top (see that section's own note).
|
||||||
|
|
||||||
### Bug found and fixed while pulling christmas-octave-sunday's antiphon
|
### Bug found and fixed while pulling christmas-octave-sunday's antiphon
|
||||||
|
|
||||||
|
|||||||
@@ -12,3 +12,8 @@ name: "Ss. Alexander I, Eventius, and Theodulus, Martyrs, and Juvenal, Bishop an
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-several-martyrs
|
common: common-of-several-martyrs
|
||||||
propers: "ss-alexander-eventius-theodulus-and-juvenal"
|
propers: "ss-alexander-eventius-theodulus-and-juvenal"
|
||||||
|
# No [Ant 1] of its own in the source (05-03r.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C3 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-several-martyrs.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-several-martyrs
|
||||||
|
benedictusCommon: common-of-several-martyrs
|
||||||
|
|||||||
@@ -12,3 +12,8 @@ name: "Ss. Felix, Simplicius, Faustinus, and Beatrix, Martyrs"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-several-martyrs
|
common: common-of-several-martyrs
|
||||||
propers: "ss-felix-simplicius-faustinus-and-beatrix"
|
propers: "ss-felix-simplicius-faustinus-and-beatrix"
|
||||||
|
# No [Ant 1] of its own in the source (07-29cc.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C3a instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-several-martyrs.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-several-martyrs
|
||||||
|
benedictusCommon: common-of-several-martyrs
|
||||||
|
|||||||
@@ -7,3 +7,8 @@ name: "Ss. Machabees, Martyrs"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-several-martyrs
|
common: common-of-several-martyrs
|
||||||
propers: "ss-machabees"
|
propers: "ss-machabees"
|
||||||
|
# No [Ant 1] of its own in the source (08-01r.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C3 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-several-martyrs.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-several-martyrs
|
||||||
|
benedictusCommon: common-of-several-martyrs
|
||||||
|
|||||||
@@ -10,3 +10,8 @@ name: "Ss. Marius, Martha, Audifax, and Abachum, Martyrs"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-several-martyrs
|
common: common-of-several-martyrs
|
||||||
propers: "ss-marius-martha-audifax-and-abachum"
|
propers: "ss-marius-martha-audifax-and-abachum"
|
||||||
|
# No [Ant 1] of its own in the source (01-19.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C3a instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-several-martyrs.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-several-martyrs
|
||||||
|
benedictusCommon: common-of-several-martyrs
|
||||||
|
|||||||
@@ -12,3 +12,8 @@ name: "Ss. Nabor and Felix, Martyrs"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-several-martyrs
|
common: common-of-several-martyrs
|
||||||
propers: "ss-nabor-and-felix"
|
propers: "ss-nabor-and-felix"
|
||||||
|
# No [Ant 1] of its own in the source (07-12o.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C3a-1 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-several-martyrs.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-several-martyrs
|
||||||
|
benedictusCommon: common-of-several-martyrs
|
||||||
|
|||||||
@@ -7,3 +7,8 @@ name: "Ss. Twelve Brothers, Martyrs"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-several-martyrs
|
common: common-of-several-martyrs
|
||||||
propers: "ss-twelve-brothers"
|
propers: "ss-twelve-brothers"
|
||||||
|
# No [Ant 1] of its own in the source (09-01cc.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C3 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-several-martyrs.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-several-martyrs
|
||||||
|
benedictusCommon: common-of-several-martyrs
|
||||||
|
|||||||
@@ -11,3 +11,8 @@ name: "St. Catherine of Siena, Virgin"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-a-virgin
|
common: common-of-a-virgin
|
||||||
propers: "st-catherine-of-siena"
|
propers: "st-catherine-of-siena"
|
||||||
|
# No [Ant 1] of its own in the source (04-30.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C6a instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-a-virgin.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-a-virgin
|
||||||
|
benedictusCommon: common-of-a-virgin
|
||||||
|
|||||||
@@ -7,3 +7,10 @@ name: "St. Felicitas, Martyr"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-a-martyr
|
common: common-of-a-martyr
|
||||||
propers: "st-felicitas"
|
propers: "st-felicitas"
|
||||||
|
# No [Ant 1] of its own in the source (11-23cc.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C7 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-a-virgin.yml (see that section of TODO.md). C7 itself
|
||||||
|
# resolves via a cross-reference to Commune/C6:Ant 2, confirmed byte-
|
||||||
|
# identical to common-of-a-virgin's own already-verified text.
|
||||||
|
minorHoursCommon: common-of-a-virgin
|
||||||
|
benedictusCommon: common-of-a-virgin
|
||||||
|
|||||||
@@ -10,3 +10,8 @@ name: "St. Felix, Priest and Martyr"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-a-martyr
|
common: common-of-a-martyr
|
||||||
propers: "st-felix-presbyter"
|
propers: "st-felix-presbyter"
|
||||||
|
# No [Ant 1] of its own in the source (01-14cc.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C2a instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-a-martyr.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-a-martyr
|
||||||
|
benedictusCommon: common-of-a-martyr
|
||||||
|
|||||||
@@ -7,3 +7,8 @@ name: "St. Hermes, Martyr"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-a-martyr
|
common: common-of-a-martyr
|
||||||
propers: "st-hermes"
|
propers: "st-hermes"
|
||||||
|
# No [Ant 1] of its own in the source (08-28cc.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C2a-1 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-a-martyr.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-a-martyr
|
||||||
|
benedictusCommon: common-of-a-martyr
|
||||||
|
|||||||
@@ -8,3 +8,8 @@ name: "St. Marcus, Pope and Confessor"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-a-confessor-bishop
|
common: common-of-a-confessor-bishop
|
||||||
propers: "st-marcus"
|
propers: "st-marcus"
|
||||||
|
# No [Ant 1] of its own in the source (10-07t.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C4b instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-a-confessor-bishop.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-a-confessor-bishop
|
||||||
|
benedictusCommon: common-of-a-confessor-bishop
|
||||||
|
|||||||
@@ -10,3 +10,8 @@ name: "St. Prisca, Virgin and Martyr"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-a-virgin-martyr
|
common: common-of-a-virgin-martyr
|
||||||
propers: "st-prisca"
|
propers: "st-prisca"
|
||||||
|
# No [Ant 1] of its own in the source (01-18r.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C6-1 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-a-virgin.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-a-virgin
|
||||||
|
benedictusCommon: common-of-a-virgin
|
||||||
|
|||||||
@@ -7,3 +7,8 @@ name: "St. Saturninus, Martyr"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-a-martyr
|
common: common-of-a-martyr
|
||||||
propers: "st-saturninus"
|
propers: "st-saturninus"
|
||||||
|
# No [Ant 1] of its own in the source (11-29r.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C2a-1 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-a-martyr.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-a-martyr
|
||||||
|
benedictusCommon: common-of-a-martyr
|
||||||
|
|||||||
@@ -7,3 +7,8 @@ name: "St. Thecla, Virgin and Martyr"
|
|||||||
rank: simplex
|
rank: simplex
|
||||||
common: common-of-a-virgin-martyr
|
common: common-of-a-virgin-martyr
|
||||||
propers: "st-thecla"
|
propers: "st-thecla"
|
||||||
|
# No [Ant 1] of its own in the source (09-23cc.txt) -- [Rule]/[Rank] point to
|
||||||
|
# Commune/C6 instead, the same C-number family already live-query-verified
|
||||||
|
# for common-of-a-virgin.yml (see that section of TODO.md).
|
||||||
|
minorHoursCommon: common-of-a-virgin
|
||||||
|
benedictusCommon: common-of-a-virgin
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# Pulled directly from her own source file's [Ant 1]
|
||||||
|
# (Sancti/09-16cc.txt, the same fileref her collect was verified against
|
||||||
|
# -- see her own saint record's comment) -- NOT live-query-verified, and
|
||||||
|
# marked `draft` rather than `verified` for that reason: she can never
|
||||||
|
# be the day's own rendered title (always commemorated under Ss.
|
||||||
|
# Cornelius and Cyprian, see her own file's comment), so there is no
|
||||||
|
# live Lauds page to confirm this [Ant 1] text is actually what's used
|
||||||
|
# at the Benedictus specifically, rather than elsewhere (Vespers'
|
||||||
|
# Magnificat, say) -- a real, demonstrated risk: St. Alexius's own file
|
||||||
|
# likewise has a real [Ant 1] ("Similábo eum...") that his live-rendered
|
||||||
|
# Benedictus antiphon does *not* use (it draws from common-of-an-abbot
|
||||||
|
# instead, confirmed live) -- so a raw [Ant 1] read is not on its own
|
||||||
|
# sufficient proof for a *winnable* saint either, let alone one that can
|
||||||
|
# never be checked. English translated (the source's own English page
|
||||||
|
# had no rendering at all), same `draft` reasoning applies twice over.
|
||||||
|
id: ss-euphemia-lucia-and-geminianus-antiphon
|
||||||
|
text:
|
||||||
|
la: "Gaudent in cælis * ánimæ Sanctórum, qui Christi vestígia sunt secúti: et quia pro ejus amóre sánguinem suum fudérunt, ídeo cum Christo exsúltant sine fine."
|
||||||
|
en: "The souls of the Saints rejoice in heaven, * who have followed the footsteps of Christ: and because for love of him they shed their blood, therefore they exult with Christ without end."
|
||||||
|
status:
|
||||||
|
la: draft
|
||||||
|
en: draft
|
||||||
@@ -9,6 +9,17 @@ import {
|
|||||||
} from '../../src/hours/resolve-common';
|
} from '../../src/hours/resolve-common';
|
||||||
import type { LiturgicalDay } from '../../src/calendar/types';
|
import type { LiturgicalDay } from '../../src/calendar/types';
|
||||||
|
|
||||||
|
function syntheticSanctoralDay(id: string): LiturgicalDay {
|
||||||
|
return {
|
||||||
|
date: '2026-01-01',
|
||||||
|
weekday: 'thursday',
|
||||||
|
season: 'trinitytide',
|
||||||
|
temporalCategory: 'ordinary-feria',
|
||||||
|
winner: { kind: 'sanctoral', id, name: id, rank: 'simplex' },
|
||||||
|
commemorations: [],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
describe('getDayCollect', () => {
|
describe('getDayCollect', () => {
|
||||||
it('resolves a real, verified collect for an ordinary Sunday', () => {
|
it('resolves a real, verified collect for an ordinary Sunday', () => {
|
||||||
const day = resolveDay('2026-08-09'); // post-pentecost-11
|
const day = resolveDay('2026-08-09'); // post-pentecost-11
|
||||||
@@ -30,20 +41,52 @@ describe('getDayCollect', () => {
|
|||||||
// Kalendaria-table pull, 2026-08) -- so this exercises the "missing"
|
// Kalendaria-table pull, 2026-08) -- so this exercises the "missing"
|
||||||
// path with a synthetic winner rather than hunting for a real
|
// path with a synthetic winner rather than hunting for a real
|
||||||
// example that no longer exists.
|
// example that no longer exists.
|
||||||
const day: LiturgicalDay = {
|
const collect = getDayCollect(syntheticSanctoralDay('example-confessor'));
|
||||||
date: '2026-01-01',
|
|
||||||
weekday: 'thursday',
|
|
||||||
season: 'trinitytide',
|
|
||||||
temporalCategory: 'ordinary-feria',
|
|
||||||
winner: { kind: 'sanctoral', id: 'example-confessor', name: 'Example Confessor (placeholder)', rank: 'simplex' },
|
|
||||||
commemorations: [],
|
|
||||||
};
|
|
||||||
const collect = getDayCollect(day);
|
|
||||||
expect(collect.status.la).toBe('missing');
|
expect(collect.status.la).toBe('missing');
|
||||||
expect(collect.status.en).toBe('missing');
|
expect(collect.status.en).toBe('missing');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('genuinely unwinnable stubs still get a Benedictus antiphon (2026-08)', () => {
|
||||||
|
// These saints are always commemorated, never the day's own rendered
|
||||||
|
// title (see e.g. st-marcus.yml's own comment) -- so unlike the rest of
|
||||||
|
// this project's content, their own [Ant 1] (or lack of one) had to be
|
||||||
|
// pulled directly from source rather than confirmed against a live
|
||||||
|
// Lauds query, since no such query is ever possible for them. A
|
||||||
|
// synthetic winner is used here for the same reason: resolveDay would
|
||||||
|
// never actually pick one of these as day.winner.
|
||||||
|
it("resolves via its Common category when the saint's own file has no [Ant 1] at all", () => {
|
||||||
|
// St. Marcus -- [Rule] says "vide C4b" with no override; C4b is a
|
||||||
|
// whole-file inherit of C4 (just the title relabeled "of the Popes"),
|
||||||
|
// the same family already live-query-verified for
|
||||||
|
// common-of-a-confessor-bishop.yml.
|
||||||
|
const ben = getBenedictusAntiphon(syntheticSanctoralDay('st-marcus'));
|
||||||
|
expect(ben.status).toEqual({ la: 'verified', en: 'verified' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('resolves via a cross-referenced Common category (C7 -> Commune/C6:Ant 2)', () => {
|
||||||
|
// St. Felicitas -- [Rule] says "vide C7", a category this project
|
||||||
|
// hadn't touched before; C7's own [Ant 1] is itself a reference to
|
||||||
|
// Commune/C6:Ant 2, which resolves to text byte-identical to
|
||||||
|
// common-of-a-virgin's own already-verified Benedictus antiphon.
|
||||||
|
const ben = getBenedictusAntiphon(syntheticSanctoralDay('st-felicitas'));
|
||||||
|
expect(ben.status).toEqual({ la: 'verified', en: 'verified' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("resolves its own file's [Ant 1] as draft, not verified, when it can't be checked against a live rendering", () => {
|
||||||
|
// Ss. Euphemia, Lucy, and Geminian -- her own file *does* have an
|
||||||
|
// [Ant 1], but St. Alexius (a winnable saint checked earlier in this
|
||||||
|
// same 2026-08 pass) proved a real [Ant 1] doesn't always end up the
|
||||||
|
// rendered Benedictus antiphon either (his own live Lauds query uses
|
||||||
|
// common-of-an-abbot's text instead) -- so a raw-file [Ant 1] read is
|
||||||
|
// never enough on its own to claim `verified`, and even less so for a
|
||||||
|
// saint no live query can ever confirm.
|
||||||
|
const ben = getBenedictusAntiphon(syntheticSanctoralDay('ss-euphemia-lucia-and-geminianus'));
|
||||||
|
expect(ben.status).toEqual({ la: 'draft', en: 'draft' });
|
||||||
|
expect(ben.text.la).toContain('Gaudent');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('minorHoursCommon/benedictusCommon fallback (2026-08, the 94 propers:null saints)', () => {
|
describe('minorHoursCommon/benedictusCommon fallback (2026-08, the 94 propers:null saints)', () => {
|
||||||
it('a below-duplex-majus saint still gets a real Benedictus antiphon and P/T/S/N content via its Common category', () => {
|
it('a below-duplex-majus saint still gets a real Benedictus antiphon and P/T/S/N content via its Common category', () => {
|
||||||
// St. Anacletus, Semiduplex -- below the duplex-majus+ threshold that
|
// St. Anacletus, Semiduplex -- below the duplex-majus+ threshold that
|
||||||
|
|||||||
Reference in New Issue
Block a user