Model a Matins Gospel pericope and its paired homily as one atomic part
Deploy / deploy (push) Successful in 1m25s

Replaces the lesson+isGospel flag with a dedicated 'gospel' ResolvedPart
carrying an optional nested homily. Previously a Gospel pericope and its
patristic homily were two separate pool entries, which the front-light
1/1/rest nocturn slicer could split into different nocturns purely by
index. buildReadingPool now folds an isGospel:true reading and its
immediately-following same-nocturn homily into a single pool entry, so
the pairing is structural rather than a convention the slicer has to
honor. hour-view.ts renders the pair as one visually grouped section.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D1LqodVbQdQVoTGPz9sSw4
This commit is contained in:
2026-08-28 19:46:48 -04:00
parent 6a17a74b9b
commit 25934865b1
6 changed files with 173 additions and 49 deletions
+35 -7
View File
@@ -20,13 +20,6 @@ across every hour and content type in this app.
1. **Mechanism gaps** — a real design/code piece not built yet, blocking any content pass on
it from starting:
- Easter's own octave — tabled, "a whole different discussion."
- Gospel pericope + paired homily rendered as one part: decided, not yet built. When a
Matins Nocturn 3 reading pairs a Gospel pericope with a patristic homily on it, render them
as two distinct parts, one after the other, with markup that visibly distinguishes pericope
from homily (not concatenated into a single `lesson` text as now). A bible-plan Gospel
reading has no paired homily — it renders as just the pericope, which is correct as-is.
Needs a schema change (splitting `lesson`+`isGospel` into a Gospel part with an optional
homily part) and matching UI treatment in `hour-view.ts`.
- Date picker: `day-nav.ts` currently only steps a day at a time (prev/next); there's no
way to jump to an arbitrary date without walking there one day at a time or editing the
URL. Needs a calendar-grid picker UI — open, not started.
@@ -3887,3 +3880,38 @@ Transfiguration, All Saints of the Benedictine Order). The same session also clo
pass touched (see "Matins hymn gap closed for the same categories/saints" elsewhere in this
file) — Matins hymns are a different mechanism from the Lauds/Vespers bundle and needed their
own pass.
### Gospel pericope + paired homily rendered as one part — done (2026-08-28)
Closed the last open Matins mechanism gap. `ResolvedPart` gained its own `'gospel'` kind
(`src/hours/types.ts`), replacing the old `lesson`+`isGospel` flag entirely — a Gospel pericope
now carries an optional nested `homily` (`{ source?, text }`) instead of being a same-kind
sibling `lesson` part next to it.
The reason for nesting rather than keeping two adjacent pool entries: `distributeIntoNocturns`'s
front-light 1/1/rest slicing (see "Reading distribution" elsewhere in this file) splits the
reading pool by raw index, with no notion that two adjacent entries belong together — a Gospel
pericope and its own homily, sourced as two separate array entries in
`data/propers/nocturn-readings/*.yml`, could land in different nocturns purely by where they
fell in the pool. Fixed at the pool-assembly step instead of patching the slicer:
`buildReadingPool` (`src/hours/matins.ts`) now detects an `isGospel: true` NocturnReading
immediately followed by a same-nocturn `isGospel: false` one and folds the pair into a single
`gospel` pool entry before it ever reaches `distributeIntoNocturns` — the pairing is structural
(one array element), not a convention the slicer has to know about. A bible-plan Gospel reading
(never paired with a homily, per the user's own plan) becomes a bare `gospel` part with no
`homily`, so it still gets the same "Gospel" UI treatment.
One real data wrinkle surfaced, not touched: `chair-of-st-peter-at-rome.yml`'s Nocturn 3 has the
homily prose already folded into the same `isGospel: true` entry's own `text` (an earlier, less
clean authoring convention flagged in this file's own SanctiM-pass notes) rather than as a
separate following reading — that file is left as-is per the earlier decision not to "fix" it;
the new `'gospel'` type's `source` field (distinct from `homily`) exists specifically to carry
that entry's own attribution without misrepresenting it as a separate homily reading.
`hour-view.ts` renders the pericope with a "Gospel" heading, then the nested homily (when
present) directly underneath in the same section, visually set off by a top border
(`.ordo-part-homily` in `styles.css`) — one section, pericope then homily, rather than two
separate `ordo-part` blocks that could be visually or structurally pulled apart.
`tests/hours/matins.test.ts`'s Sunday proof (2026-09-06, Luke 7:11-16 + St. Augustine's homily)
updated to assert against the new `gospel`/`homily` shape instead of two `isGospel`-flagged
lessons. `npm test`/`npm run build` both pass.