Update TODO.md for angel feasts' Matins psalmody pass
Deploy / deploy (push) Successful in 1m19s

Closes the Angel item out of the priority list, corrects the prior
pass's wrong claim that Guardian Angels is gated behind a
Monastic Divino 1930 rubric (verified via a resolveOrdo smoke test with
zero missing parts under plain Monastic 1617), and flags a separate
found-in-passing bug: lauds-capitulum-st-gabriel-archangel.yml carries
Apparition's capitulum under Gabriel's id -- left for its own pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PhysogLP9eCeKS7JEwRi6y
This commit is contained in:
2026-08-27 22:23:30 -04:00
parent fd5ab0781e
commit 0725019e67
+104 -34
View File
@@ -100,28 +100,25 @@ across every hour and content type in this app.
categories" below): Martyr, Apostle (+ aliases Common-of-Apostles-plural and categories" below): Martyr, Apostle (+ aliases Common-of-Apostles-plural and
Common-of-an-Evangelist), Confessor (+ aliases Common-of-an-Abbot, Common-of-an-Evangelist), Confessor (+ aliases Common-of-an-Abbot,
Common-of-a-Confessor-not-Bishop, and Common-of-Several-Confessors), Confessor-Bishop, Common-of-a-Confessor-not-Bishop, and Common-of-Several-Confessors), Confessor-Bishop,
Several Martyrs, Virgin-Martyr, the BVM, a Dedication, and a Holy Woman. Still open, each Several Martyrs, Virgin-Martyr, the BVM, a Dedication, and a Holy Woman — plus, separately,
with a specific blocker found across both passes (privileged-feria/movable-feast collisions all 5 angel feasts now have their own saint-level proper Matins psalmody authored directly
that ruled out every representative saint tried across multiple years, or a genuine (`saints/apparition-of-st-michael.yml`, `st-michael.yml`, `guardian-angels.yml`,
structural mismatch — see the second pass's section for full detail rather than `st-gabriel-archangel.yml`, `st-raphael-archangel.yml` — see "Angel feasts' proper Matins
re-deriving): Virgin (plain, not Virgin-Martyr — every Duplex+ candidate tried is either psalmody authored" below), closing the "Common-of-an-Angel doesn't exist" gap the second pass
absent from the live Monastic 1617 calendar on her own date, or (St. Gertrude) carries real found — there was never a missing category file here, just missing saint-level content, same
proper content of her own so isn't a valid Common source), Widow (same "absent from the shape as `st-andrew.yml`/`st-lawrence.yml`. Still open, each with a specific blocker found
calendar on this specific track" problem — confirmed via the reference engine's own votive across both category-tier passes (privileged-feria/movable-feast collisions that ruled out
index that this Common, C7a, has *zero* SanctiM cross-references anywhere in the Monastic every representative saint tried across multiple years, or a genuine structural mismatch —
corpus, unlike every other category here), Confessor-Doctor, Confessor-Pope, Several Women see the second pass's section for full detail rather than re-deriving): Virgin (plain, not
Martyrs (blocked by design, not oversight — its one candidate, Ss. Perpetua and Felicity, is Virgin-Martyr — every Duplex+ candidate tried is either absent from the live Monastic 1617
always in Lent and is only ever a `Commemoratio`, never a full Duplex+ day, in every source calendar on her own date, or (St. Gertrude) carries real proper content of her own so isn't a
file checked), and an Angel — this last one is a different *kind* of gap, not a missing valid Common source), Widow (same "absent from the calendar on this specific track" problem —
Common: the reference engine has no Common-of-an-Angel scheme at all (confirmed via its own confirmed via the reference engine's own votive index that this Common, C7a, has *zero*
votive index, which lists no angel entry, and via zero `CommuneM` cross-references site-wide) SanctiM cross-references anywhere in the Monastic corpus, unlike every other category here),
because every angel feast (Guardian Angels, Michael, Gabriel, Raphael, the Apparition of St. Confessor-Doctor, Confessor-Pope, Several Women Martyrs (blocked by design, not oversight —
Michael) genuinely has its own full proper Matins psalmody instead — real antiphons/lessons its one candidate, Ss. Perpetua and Felicity, is always in Lent and is only ever a
exist in the source (confirmed for Guardian Angels under the `Monastic Divino 1930` rubric `Commemoratio`, never a full Duplex+ day, in every source file checked). These five still
track, since her feast isn't recognized under plain `Monastic Tridentinum 1617` at all) but fall back to the plain ferial weekday table, redistributed into 3 nocturns.
authoring them is saint-level proper work via `saints/*.yml`, a different and larger task
than this category-file sweep — not started. All seven still fall back to the plain ferial
weekday table, redistributed into 3 nocturns.
- The four "Commemoratio Octavæ" Ant+V/R+collect blocks (Christmas Octave's own - The four "Commemoratio Octavæ" Ant+V/R+collect blocks (Christmas Octave's own
Nativity/Stephen/John/Holy-Innocents commemorations, e.g. on Dec 30) are now done — Nativity/Stephen/John/Holy-Innocents commemorations, e.g. on Dec 30) are now done —
see "Octave content" below. St. Frances of Rome's/ see "Octave content" below. St. Frances of Rome's/
@@ -3040,18 +3037,18 @@ Tridentinum 1617`).
**Mechanism finding, not content**: Common-of-an-Angel isn't a missing category file, it's not a **Mechanism finding, not content**: Common-of-an-Angel isn't a missing category file, it's not a
category *at all* in this engine. The votive index lists no angel entry, and a site-wide search of category *at all* in this engine. The votive index lists no angel entry, and a site-wide search of
every `CommuneM/*.txt` cross-reference in the Monastic corpus turns up zero hits for any angel every `CommuneM/*.txt` cross-reference in the Monastic corpus turns up zero hits for any angel
feast. Checked Guardian Angels' own SanctiM source directly instead (`SanctiM/10-02.txt`): it feast. Checked Guardian Angels' own source directly instead (`web/www/horas/Latin/Sancti/
carries a full, genuine set of proper Matins antiphons (`Stetit Angelus`, `Mitte Domine`, `Angelus 10-02.txt`): it carries a full, genuine set of 9 proper Matins antiphons — real proper content,
meus`, `Ecce ego` for Nocturn 3, `Vidit Jacob`/`Si audíeris` responsories) — real proper content, not Common-derived. The fix isn't a `categories/*.yml` file — it's proper saint-level psalmody via
not Common-derived, confirming the earlier "not on the calendar" read from a rubric problem, not a `saints/*.yml`, matching the `st-andrew.yml`/`st-lawrence.yml` precedent, for each of the five
content gap: her feast is gated `rubrica 1930 aut rubrica cisterciensis` and simply isn't angel feasts individually — done in the very next pass, see "Angel feasts' proper Matins psalmody
recognized under plain `Monastic Tridentinum 1617` at all, only under `Monastic Divino 1930` authored" below. **Correction to this section's own original claim**: Guardian Angels is *not*
(tried live, confirmed Duplex majus with this content there). vu's own `guardian-angels.yml` gated behind `Monastic Divino 1930` — the untagged, default `[Rank]` entry in `10-02.txt` (`Duplex
already independently found the same thing from the *secular* Sancti file's own comment ("feast's majus;;4;;vide C4`, no rubric tag) already applies under plain `Monastic Tridentinum 1617`; only a
own content is fully proper throughout"). The fix here isn't a `categories/*.yml` file — it's *second*, alternate entry lower in the same block carries `(sed rubrica 1963)`. A runtime
proper saint-level psalmody via `saints/*.yml`, matching the `st-andrew.yml`/`st-lawrence.yml` `resolveOrdo('matins', '2026-10-02')` smoke test (in the next pass) confirms this directly — 0
precedent, for each of the five angel feasts individually. That's real, larger, not-yet-started `missing` parts under the plain rubric, no special rubric flag needed. The earlier read here
work — not attempted this pass; flagged rather than forced. mixed up which of the two `[Rank]` entries the `rubrica` tag actually qualifies.
**Still open, blockers now more specific than "not found yet"**: Virgin (plain) and Widow both hit **Still open, blockers now more specific than "not found yet"**: Virgin (plain) and Widow both hit
the same root problem — every Duplex+ candidate tried (St. Margaret Mary Alacoque, St. Gertrude, the same root problem — every Duplex+ candidate tried (St. Margaret Mary Alacoque, St. Gertrude,
@@ -3075,6 +3072,79 @@ be no clean instance of this Common to extract from in vu's own calendar.
`common-of-several-confessors`, `common-of-an-evangelist`, and `common-of-a-holy-woman` all `common-of-several-confessors`, `common-of-an-evangelist`, and `common-of-a-holy-woman` all
resolve through the real `getMatinsCommonOverride` lookup via a saint id in each category. resolve through the real `getMatinsCommonOverride` lookup via a saint id in each category.
### Angel feasts' proper Matins psalmody authored — all 5, saint-level (2026-08-27)
Closes the "Common-of-an-Angel doesn't exist" finding from the pass above. Authored
`saints/apparition-of-st-michael.yml`, `st-michael.yml`, `guardian-angels.yml`,
`st-gabriel-archangel.yml`, and `st-raphael-archangel.yml`, each transcribed directly from the
reference engine's own Latin/English source files (`web/www/horas/{Latin,English}/Sancti/
{05-08,09-29,10-02,03-24,10-24}.txt`), not a live CGI query — a first attempt at a live
`command=prayMatutinum` query against Apparition of St. Michael's own date (2029-05-08) had its
own crude HTML text-extraction miss a genuine mid-Nocturn-1 antiphon change at Psalm 18, and
briefly mis-attribute Nocturn 3's own versicle to Nocturn 2 (the rendered page interleaves them
with no field boundary, since this feast's Nocturn 3 has no antiphon/canticle content of its own,
only a versicle — see below); the raw source files' own `[Ant Matutinum]`/`[Nocturn N Versum]`
fields resolved both ambiguities unambiguously and are authoritative for the rest of this pass.
**Real structural finding, not a transcription gap**: Apparition of St. Michael's (and, by
inheritance, Guardian Angels', St. Gabriel's, and St. Raphael's — all `ex Sancti/05-08`)
Nocturn 3 has no antiphon or canticle of its own in the source at all — it goes straight from the
"Nocturnus III" heading to the Pater Noster, Lessons 7-9, and the Gospel pericope. Only a
`[Nocturn 3 Versum]` exists. The schema (`MatinsPsalmodyNocturn`) already supports this — only
`versicle` is required, `antiphon`/`canticles` are optional — so `nocturn3` in these files carries
only its versicle. St. Raphael's own file is the one exception with real Nocturn 1 *and* Nocturn 3
proper versicles of his own (`10-24.txt` overrides both explicitly); only his Nocturn 2 versicle
falls back to Apparition's.
**Each feast's own sourcing, briefly:**
- **Apparition of St. Michael** (May 8, `propers: null`) — fully proper. Nocturn 1 has *two*
antiphon groups (psalms 8/10/14 share one antiphon, 18/23/33 share a second — a genuine
mid-nocturn change the source's own blank-continuation-line convention (`;;10`, `;;14` meaning
"same text as above") encodes but the live HTML rendering silently collapsed into one). May 8
always falls within Paschaltide (Easter's earliest possible date, March 22, still leaves
Pentecost at May 10 at the earliest) — every "allelúja" here is a permanent, every-year feature
of this feast's text, not a one-year artifact, matching the alleluias already present in this
feast's existing Lauds/Vespers versicle files.
- **St. Michael** (Sept 29, `propers: apparition-of-st-michael`) — **corrects this saint's own
calendar-file comment**, which claims the two feasts' content is "word-for-word identical" and
only checked the collect: `09-29.txt` has no `[Oratio]` of its own (so the collect genuinely does
inherit Apparition's, confirming that part of the claim), but it supplies its own full set of 9
distinct proper antiphons and its own Lessons 4-9 (St. Gregory's homily on the nine choirs of
Angels, not St. Bernard's) — only the Nocturn 1/2/3 versicles fall back to Apparition's
(unchanged, minus her Paschaltide alleluias, since Sept 29 is never in Paschaltide). Per
`hours/matins.ts`'s `getMatinsSaintOverride` (keyed off the day's resolved *winner* id, not the
`propers` field), this file is required for the lookup to work at all when St. Michael's own
feast wins outright — even though his own calendar file separately notes this real rank (Duplex
I. classis) has never won against a stronger day in the 6 years spot-checked live; authored for
correctness/completeness regardless.
- **Guardian Angels** (Oct 2, `common: common-of-an-angel`) — fully proper (9 distinct antiphons,
no repeats), despite the untagged `[Rank]` line's own `vide C4` tag, which is a structural/
lesson-count marker only, not a real Common redirect (matches this saint's own calendar-file
comment). Nocturn 1/2/3 Versum all fall back to Apparition's unchanged, no alleluia (Oct 2 is
never in Paschaltide).
- **St. Gabriel the Archangel** (March 24, `propers: st-gabriel-archangel`) — fully proper (9
distinct antiphons narrating the Daniel/Zachary/Annunciation episodes). **Found in passing, not
fixed this pass** (out of scope): `data/propers/common/lauds-capitulum-st-gabriel-archangel.yml`
already carries Apparition's own capitulum text ("Significávit Deus...") under Gabriel's id by
mistake — his own real capitulum is "Ecce vir Gábriel, quem víderam in visióne..." (Dan 9:21-22).
Flagged in that file's own new header comment for a future pass. Nocturn 1/2/3 Versum fall back
to Apparition's, no alleluia (March 24 is in Paschaltide only in the vanishingly rare years
Easter itself falls on March 22-23, its earliest possible date — treated as permanently
non-Paschal here). The English source file's own "(Alleluia.)" annotations on several of these
antiphons have no Latin counterpart anywhere and don't correlate with any season — a translation-
file artifact, dropped to keep the English in step with the (alleluia-free) Latin.
- **St. Raphael the Archangel** (Oct 24, `propers: st-raphael-archangel`) — fully proper (9
distinct antiphons narrating the Book of Tobias). Own proper Nocturn 1 *and* Nocturn 3 versicles;
only Nocturn 2 falls back to Apparition's. Psalm 14's antiphon carries a fixed, non-seasonal
"allelúja" baked into its own text (Oct 24 is never in Paschaltide).
`npm test` (521 tests) and `tsc --noEmit` both pass. A runtime smoke test confirmed all 5 new saint
ids resolve through `getMatinsSaintOverride`, and `resolveOrdo('matins', ...)` against both
2026-10-02 (Guardian Angels) and 2029-05-08 (Apparition of St. Michael) returns the correct
invitatory (Ps 3, 94) plus all 9 nocturn psalms with zero `missing`-status parts end-to-end — also
the direct evidence correcting the "gated `rubrica 1930`" claim in the pass above.
### Lauds/Vespers chapter-responsory-hymn-versicle bundle: rank-agnostic Common fallback (2026-08-25) ### Lauds/Vespers chapter-responsory-hymn-versicle bundle: rank-agnostic Common fallback (2026-08-25)
**Bug fixed**: St. Louis (2026-08-25, `common-of-a-confessor-not-bishop`, Simplex, wins **Bug fixed**: St. Louis (2026-08-25, `common-of-a-confessor-not-bishop`, Simplex, wins