Model Ascension, Corpus Christi, and the Sacred Heart as temporal feasts
Deploy / deploy (push) Successful in 1m23s

Adds pre-1955 TemporalFeastRecords (rank duplex-1-classis, real octaves)
for the three "feasts of the Lord" that were previously only referenced
as bare date offsets: Corpus Christi/Sacred Heart's own days already
couldn't lose to a sanctoral candidate, but with no record the day fell
back to the generic Trinity-week feria collect and never displayed its
real name; Ascension had no protection at all against an ordinary saint
winning it outright. Sacred Heart's own record carries the
forbidsSuccessorCommemoration flag added in the prior commit, refusing to
commemorate Most Precious Blood on the rare late-Easter date they fall
adjacent.

octave.wins is set to duplex on all three, matching Pentecost's own
verified threshold, despite a known conflict with a previously
live-verified case (St. Ubald winning First Vespers within Ascension's
own octave) -- kept per direct instruction; the affected tests (Ubald,
St. Margaret of Scotland) were updated to assert the new behavior, and
the tradeoff is documented in ascension.yml and TODO.md. A handful of
unrelated test fixtures that happened to land inside these new octave
windows were moved to nearby clean dates.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014axryJBrRswYh2niA7WCUc
This commit is contained in:
2026-08-26 15:21:26 -04:00
parent 2f7b421558
commit 4bbd78b1fd
9 changed files with 219 additions and 36 deletions
+46
View File
@@ -1314,6 +1314,52 @@ draft-English antiphon (`tests/hours/resolve-common.test.ts`).
commemorated back, regardless of the winner's own rank. Not addressed
here; this pass only covered the Vespers cross-day direction.
- **Ascension, Corpus Christi, and the Feast of the Sacred Heart now
modeled as real temporal feasts (2026-08-26)**: none of the three had a
`TemporalFeastRecord` at all — only referenced as bare date offsets in
`easter-offsets.yml`/`temporal-categories.yml`/
`isMajorFixedFeastOfTheLord`. Corpus Christi/Sacred Heart's own days
were already blocked from any sanctoral winner (`privileged-feria-
major`), but with no record, `resolveTemporalId` fell back to whatever
Sunday collect governs that week (`post-pentecost-01` for both), so the
day displayed as generic Trinity-week feria content, never "Corpus
Christi"/"Sacred Heart" by name. Ascension (Easter+39) was worse:
`ascensiontide`'s own `temporal-categories.yml` entry is plain
`ordinary-feria` for every day in the season including Ascension
Thursday itself, so nothing stopped an ordinary sanctoral candidate
from winning that day outright had one ever been scheduled there. All
three now have `data/calendar/temporal-feasts/{ascension,corpus-
christi,sacred-heart}.yml` (`rank: duplex-1-classis`, an `easter`
anchor, `octave: {enabled: true, wins: duplex}`) — the pre-1955
calendar specifically (each carries a real octave; the reference
engine's own "(rubrica 196)"-tagged variant strips it, later-reform
text this project doesn't follow, per CLAUDE.md). Sacred Heart's own
record also carries `forbidsSuccessorCommemoration` (see the previous
entry above) — the live-sourced Precious Blood exclusion this whole
pass started from.
- `octave.wins: duplex` is matched to `pentecost-sunday.yml`'s own
verified threshold as the closest analogue for all three, and was
kept **despite a known, direct counter-example already in this
codebase**: `tests/hours/vespers.test.ts`'s St. Ubald case was
previously live-verified against Divinum Officium (Monastic
Tridentinum 1617) to have him — Semiduplex — win First Vespers
*within* Ascension's own octave window, which a strict `duplex`
threshold contradicts. Real octaves come in three privilege
"orders"; Ascension/Sacred Heart are the weakest (Order III),
historically permissive enough for an ordinary Semiduplex saint to
still occur inside them, unlike Pentecost's own (Order I) octave
this threshold is borrowed from. Kept at `duplex` anyway per direct
instruction — the Ubald test (and St. Margaret of Scotland's
equivalent First Vespers case, inside Corpus Christi's own window)
were updated to assert the new behavior instead of the old
live-verified one. Revisit if this turns out to misfire elsewhere;
see `ascension.yml`'s own comment for the full note.
- No propers content (collects/antiphons/hymns/lessons) authored yet
for any of the three — this pass is calendar/occurrence mechanics
only, same "content vs. mechanism" split as everywhere else in this
file; an hour resolving one of these ids will correctly show
`status: 'missing'` text until that's authored.
### Matins ordo — mechanism built, small content slice (2026-08)
`src/hours/matins.ts` was the last stub hour. Built as a genuinely different