Remove spurious mid-nocturn versicle from ferial Matins

The 1-nocturn ferial branch was rendering a V./R. versicle stuck
mid-list, as if marking a nocturn boundary that doesn't exist in a
single continuous nocturn. Live-verified against the reference engine
(Pofficium.pl, Monastic Tridentinum 1617) for Wednesday and Thursday:
the real office runs straight from the last psalm to the Capitulum,
with no versicle anywhere in the psalmody. The embedded mid-list V./R.
line in the source Psalmi matutinum.txt is inert there and was never
actually emitted by the engine — matins-ferial-antiphons.yml's
versicle field was a documented-but-unverified assumption, not real
content.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X26BkFT3ARbtUGXuBmzUmD
This commit is contained in:
2026-09-02 07:06:21 -04:00
parent 9d39d162ec
commit 9da5a74301
4 changed files with 59 additions and 70 deletions
+5 -5
View File
@@ -48,7 +48,7 @@ describe('resolveOrdo("matins", ...) ferial (1-nocturn) branch', () => {
expect(ordo.parts.some((p) => p.kind === 'versicle' && p.text.text.la?.includes('Te decet laus'))).toBe(false);
});
it("gives every nocturn psalm its own antiphon and includes Tuesday's own versicle (data/hours/matins-ferial-antiphons.yml)", () => {
it('gives every nocturn psalm its own antiphon and has no mid-nocturn versicle (data/hours/matins-ferial-antiphons.yml)', () => {
// The nocturn's own psalms start at index 5 (after the two opening versicles/Ps3/heading/Ps94).
const nocturnPsalms = ordo.parts.slice(5).filter((p) => p.kind === 'psalm') as {
psalmNumber: number;
@@ -65,11 +65,11 @@ describe('resolveOrdo("matins", ...) ferial (1-nocturn) branch', () => {
expect(p.antiphon.text.en).toBeTruthy();
}
}
// No versicle anywhere in the psalmody (fixed 2026-09-02) — the
// source's embedded mid-list V./R. line is live-verified inert; the
// real single-nocturn ferial office runs straight to the Capitulum.
const nocturnVersicles = ordo.parts.slice(5).filter((p) => p.kind === 'versicle');
expect(nocturnVersicles).toHaveLength(1);
const versicleText = (nocturnVersicles[0] as { text: { text: Record<string, string> } }).text.text;
expect(versicleText.la).toContain('Ímmola Deo sacrifícium laudis');
expect(versicleText.la).toContain('Et redde Altíssimo vota tua');
expect(nocturnVersicles).toHaveLength(0);
});
it("resolves the user's own bible-plan readings for the day, not the historical lectionary", () => {