hours: build Terce, Sext, and None
Deploy / deploy (push) Successful in 39s

Three separate resolver files (terce.ts/sext.ts/none.ts), not a shared
little-hour module — they're structurally identical but kept independent
by choice. Ordo verified against Divinum Officium (Monastic Tridentinum
1617): opening versicle, self-contained hymn, one antiphon framing three
psalms (no closing repeat, unlike Prime), a capitulum with its own
embedded short versicle/response, the day's own collect, and a closing
identical across all three hours.

Also fills in psalter-distribution.yml's previously-missing Sunday/
Monday/Tuesday psalm entries (Ps 118 sections for Sunday/Monday; Tuesday
turns out to share Wednesday/Thursday's native gradual-psalm set, not a
distinct one). Friday/Saturday's antiphons are derived from each day's
first psalm rather than reusing the native gradual antiphons, since
those two days already use a redistributed, non-native psalm set.

hours/types.ts gains a 'day-collect' part kind — the first ordo to use
the day's own Proper collect rather than a fixed text.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 13:51:08 -04:00
parent 7a932b40be
commit 813d173f5c
20 changed files with 526 additions and 29 deletions
+4 -4
View File
@@ -41,12 +41,12 @@ describe('shell', () => {
const root = document.getElementById('app')!;
mountShell(root);
const terceBtn = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-hour]')).find(
(btn) => btn.dataset.hour === 'terce',
const laudsBtn = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-hour]')).find(
(btn) => btn.dataset.hour === 'lauds',
);
terceBtn?.click();
laudsBtn?.click();
expect(root.querySelector('.hour-view h2')?.textContent).toBe('Terce');
expect(root.querySelector('.hour-view h2')?.textContent).toBe('Lauds');
expect(root.querySelector('.hour-view-pending')).not.toBeNull();
});