Update TODO.md for third Matins psalmody overrides pass
Deploy / deploy (push) Successful in 1m24s

Records the Virgin/Confessor-Doctor/Confessor-Pope closures via the
source-file-first method, St. Scholastica's proper-content case, and
corrects a prior pass's wrong claim that Ss. Perpetua and Felicity are
"only ever Commemoratio" -- their own source file shows rank Duplex.
Widow and Several Women Martyrs remain blocked for a sharper reason:
CommuneM/C7a.txt and C7b.txt are synthetic patchworks that no real
saint anywhere in the Monastic corpus ever actually invokes, so there's
no live rendering to verify a hand-resolution against.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PhysogLP9eCeKS7JEwRi6y
This commit is contained in:
2026-08-28 05:20:19 -04:00
parent 09cf0c1aa0
commit 39f30b42c1
+111 -23
View File
@@ -95,29 +95,31 @@ across every hour and content type in this app.
citations resolve to `missing` text until it lands. citations resolve to `missing` text until it lands.
- Matins psalmody overrides for a Duplex+ weekday feast (see "Matins psalmody overrides" - Matins psalmody overrides for a Duplex+ weekday feast (see "Matins psalmody overrides"
below): mechanism refactored to category-keyed (`categories/*.yml` + `saints/*.yml`), now below): mechanism refactored to category-keyed (`categories/*.yml` + `saints/*.yml`), now
eleven categories authored plus six genuine alias redirects across two passes (2026-08-27, **fourteen of nineteen categories authored, plus nine genuine alias redirects**, across three
see "Matins psalmody overrides — nine more categories" and "— second pass, four more passes (2026-08-27/28, see "Matins psalmody overrides — nine more categories", "— second
categories" below): Martyr, Apostle (+ aliases Common-of-Apostles-plural and pass, four more categories", and "— third pass, source-file-first method" below): Martyr,
Common-of-an-Evangelist), Confessor (+ aliases Common-of-an-Abbot, Apostle (+ aliases Apostles-plural and Evangelist), Confessor (+ aliases Abbot,
Common-of-a-Confessor-not-Bishop, and Common-of-Several-Confessors), Confessor-Bishop, Confessor-not-Bishop, and Several-Confessors), Confessor-Bishop (+ aliases
Several Martyrs, Virgin-Martyr, the BVM, a Dedication, and a Holy Woman — plus, separately, Confessor-Doctor and Confessor-Pope, 2026-08-28), Several Martyrs, Virgin-Martyr (+ alias
all 5 angel feasts now have their own saint-level proper Matins psalmody authored directly Virgin, plain, 2026-08-28), the BVM, a Dedication, and a Holy Woman — plus, separately, all 5
(`saints/apparition-of-st-michael.yml`, `st-michael.yml`, `guardian-angels.yml`, angel feasts and St. Scholastica (Virgin, 2026-08-28) have their own saint-level proper
`st-gabriel-archangel.yml`, `st-raphael-archangel.yml` — see "Angel feasts' proper Matins Matins psalmody authored directly (same shape as `st-andrew.yml`/`st-lawrence.yml`), each a
psalmody authored" below), closing the "Common-of-an-Angel doesn't exist" gap the second pass case where the saint's own `[Rank]` cites a Common but their real content is genuinely
found — there was never a missing category file here, just missing saint-level content, same proper. **Methodology change in the third pass**: reading the reference engine's own
shape as `st-andrew.yml`/`st-lawrence.yml`. Still open, each with a specific blocker found `CommuneM/*.txt`/`Commune/*.txt` template source files directly (redirect-chain tracing, one
across both category-tier passes (privileged-feria/movable-feast collisions that ruled out targeted live query per finding to confirm) replaced the earlier trial-and-error of querying
every representative saint tried across multiple years, or a genuine structural mismatch — multiple candidate saints/years live — much faster, and it directly disproved two of the
see the second pass's section for full detail rather than re-deriving): Virgin (plain, not second pass's own claims (Common-of-a-Virgin isn't a distinct scheme after all, and Ss.
Virgin-Martyr — every Duplex+ candidate tried is either absent from the live Monastic 1617 Perpetua and Felicity are Duplex, not "only ever Commemoratio" — see the third pass's section
calendar on her own date, or (St. Gertrude) carries real proper content of her own so isn't a for both corrections). Still open, now down to **Widow, Several Women Martyrs**, both
valid Common source), Widow (same "absent from the calendar on this specific track" problem — genuinely blocked by the same underlying cause found via source-reading: the Monastic
confirmed via the reference engine's own votive index that this Common, C7a, has *zero* corpus's own `C7`/`C7a`/`C7b` template family (Widow, and — through `C7b`'s own whole-file
SanctiM cross-references anywhere in the Monastic corpus, unlike every other category here), inherit of `C7` — Several Women Martyrs too) is a synthetic patchwork stitched together from
Confessor-Doctor, Confessor-Pope, Several Women Martyrs (blocked by design, not oversight — secular-track fragments with psalm-number substitutions and cross-nocturn borrowing, and is
its one candidate, Ss. Perpetua and Felicity, is always in Lent and is only ever a never actually invoked by any real saint anywhere in the Monastic Sancti/SanctiM corpus
`Commemoratio`, never a full Duplex+ day, in every source file checked). These five still (confirmed by exhaustive grep) — so there is no live rendering to check a hand-resolution
against, and hand-resolving the substitution chain blind risks getting the liturgical text
wrong. A genuinely different, harder problem than "no clean candidate found yet." Both still
fall back to the plain ferial weekday table, redistributed into 3 nocturns. 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 —
@@ -3145,6 +3147,92 @@ ids resolve through `getMatinsSaintOverride`, and `resolveOrdo('matins', ...)` a
invitatory (Ps 3, 94) plus all 9 nocturn psalms with zero `missing`-status parts end-to-end — also 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. the direct evidence correcting the "gated `rubrica 1930`" claim in the pass above.
### Matins psalmody overrides — third pass, source-file-first method (2026-08-28)
Directed explicitly: read the reference engine's own `CommuneM/*.txt` (Monastic) and
`Commune/*.txt` (secular) template source files directly instead of live-CGI trial-and-error
across candidate saints/years — much faster, and it also settled two open questions the second
pass had gotten wrong by relying on live-query attempts alone. Also directed to use non-1617
tracks where the Monastic one is silent (this project already blends tracks by design, see this
file's own header/CLAUDE.md), and to prefer real saint-level propers over forcing a generic
Common read wherever a saint turns out to have proper content of her own — same principle as the
angel-feasts pass above.
**Common-of-a-Virgin (plain, `C6a`) — closed as an alias, corrected from the prior pass's own
"kept separate by design" claim.** Reading `CommuneM/C6a.txt` directly: the whole file is a
top-level inherit of `@CommuneM/C6` (Virgin-Martyr, already authored) with no
`[Ant Matutinum]`/`[Ant Matutinum 3N]` override anywhere — it only overrides
Officium(secular)/Oratio/Hymn/Responsory1/Capitulum/Lectio-Prima, none of which is Matins nocturn
psalmody. Live-confirmed against St. Scholastica (2029-02-10, her own real day, `vide C6a` in her
`[Rank]`): her rendered psalm numbers (8,18,23,44,45,47 / 84,86,95,96,97,98) and all three
nocturn-closing versicles are byte-identical to `common-of-a-virgin-martyr.yml`'s own. Added
`common-of-a-virgin` as an alias there, with the earlier incorrect claim in that file's header
corrected in place.
**St. Scholastica herself needed her own proper file, not the Common** — her rendered page is
explicitly headed "{Antiphonæ et Psalmi ex Proprio Sanctorum}": `SanctiM/02-10.txt` overrides the
inherited Common wholesale with 9 antiphons narrating her own life (the "prodigious rainstorm"
episode with St. Benedict). Psalm numbers and all three versicles still match the Common exactly
(confirming they really are the shared pool); only the antiphon text is hers. Authored
`saints/st-scholastica.yml` (`category: common-of-a-virgin`) from the same live query used to
verify the alias above.
**Common-of-a-Confessor-Doctor (`C4a`) and Common-of-a-Confessor-Pope (`C4b`) — both closed as
aliases of `common-of-a-confessor-bishop`, genuine full redirects (versicles included, unlike the
Confessor/Confessor-Bishop split, which differs only in versicles).**
- `C4a`: `CommuneM/C4a.txt` whole-file inherits `@CommuneM/C4` with no Matins-nocturn-psalmody
override — its own `[Ant 1]`/`[Ant 3]` blocks turned out to be Lauds antiphon tags (confirmed by
cross-reference against `Commune/C4.txt`'s own `[Ant 3]`/`[Ant 3 summi Pontificis]` pair, the
same bare naming convention), not Matins Nocturn 3. Live-verified against St. Ambrose
(2026-12-07, `vide C4a`, real Duplex day, un-outranked): every antiphon, psalm number, and all
three versicles (`Amávit eum Dóminus...` / `Elégit eum Dóminus sacerdótem sibi...` / `Tu es
sacérdos in ætérnum...`) reproduce `common-of-a-confessor-bishop.yml` exactly — independently
corroborated by that file's own pre-existing St. Basil the Great data point (also `vide C4a`,
already recorded as byte-identical, but not previously connected to this category id).
- `C4b`: `CommuneM/C4b.txt` whole-file inherits `@CommuneM/C4` and only overrides Oratio variants,
Lectio9-12 (redirected to St. Gregory the Great's own lessons, irrelevant to this psalmody-only
module), and a Lauds `[Ant 3]` cross-reference — again no Matins-nocturn override. Not
live-verifiable against a real Monastic-calendar saint: all three vu saints carrying this Common
(`st-leo-ii`, `st-pius-v`, `st-pius-x`) have no `SanctiM/*.txt` file at all — confirmed by
attempting a live query against St. Pius X's expected date (2026-09-03 and 2027-09-03 both
render plain ferial, no trace of him), meaning none of the three are observed under the
Monastic-1617 track vu's structure otherwise follows, only under the secular/Divino-Afflatu
tracks vu's calendar also draws from. Aliased on the strength of the source redirect chain
alone, consistent with the convention already established in all three saints' own files, which
already fall back to this same Common for their Benedictus/minor-hours content for the identical
reason.
**Widow (`C7a`) and Several Women Martyrs (`C7b`) — still open, but the real blocker is now
precisely identified, not just "no clean candidate found yet."** `CommuneM/C7a.txt`'s own
`[Officium]` block redirects to `@CommuneM/C7` ("Commune Unius non Virginis Martyris"), not C6a —
genuinely distinct content, not an alias to anything authored. `CommuneM/C7.txt` itself is a
12-lesson Monastic structure stitched together from secular `Commune/C7` fragments with
psalm-number substitutions (`s/95/84/ s/96/86/ s/97/95/`) and a cross-reference into
`CommuneM/C6`'s own antiphon numbering — resolvable in principle by hand, but a full exhaustive
grep across every `SanctiM/*.txt` file in the corpus for a `C7a` cross-reference returns zero
hits: no saint in the Monastic tradition actually invokes this Common, so there is no live
rendering to check a hand-resolution against. `CommuneM/C7b.txt` (Several Women Martyrs) compounds
the same problem — it whole-file inherits `@CommuneM/C7` too (Widow's own unresolved scheme),
layering further secular-track overrides (`Commune/C7b`) and a borrowed Nocturn-1 versicle from
`CommuneM/C6`'s own secular file on top. Both are the same underlying gap, not two independent
ones.
**Correction to the second pass's own claim about Ss. Perpetua and Felicity**: their source file
(`Sancti/03-06.txt`) shows rank **Duplex** (`;;Duplex;;3;;vide C7b`), not "only ever
`Commemoratio`, never a full Duplex+ day" as previously logged here — that claim was simply wrong,
caught by reading the file directly instead of relying on the earlier live-query attempts. Their
own vu file (`ss-perpetua-and-felicity.yml`) already reflects the correct Duplex rank and has for
some time; only this file's own prior claim about them was stale. Doesn't change the fact that
they're still blocked by the `C7`/`C7b` template problem above, though — a clean calendar year for
them was never actually the obstacle.
`npm test` (522 tests) and `tsc --noEmit` both pass. A runtime smoke test confirmed
`resolveOrdo('matins', ...)` for St. Scholastica (2029-02-10) and St. Ambrose (2026-12-07) returns
zero `missing`-status psalm/antiphon/versicle/canticle parts (the only `missing` parts present are
unrelated Matins scripture-reading lessons, the long-deferred bulk-Vulgate-import gap logged
above), and that St. Pius X's Confessor-Pope Matins resolves without error.
### 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