Import calendar-month/week Matins Nocturn 2 content for Aug-Nov
Deploy / deploy (push) Successful in 1m24s

The later post-Pentecost Sundays' real Nocturn 2 patristic content isn't
keyed by Pentecost offset in the reference engine — it's keyed by civil
calendar month/week (the old "Scriptura occurrens" cycle), which shifts
relative to post-pentecost-NN every year depending on Easter's date. Port
Date.pm's monthday() algorithm (pre-1955/Tridentine rubrics) as a new,
date-driven id, author all 20 August-November month-week files from the
reference engine's Tempora/0MN-0.txt sources, and pool them in
hours/matins.ts as a third, independent reading source alongside the
existing temporalId lookup.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWzE3kaSZCs79fPBrrE1aF
This commit is contained in:
2026-08-23 07:45:37 -04:00
parent 25e2eeb493
commit 72a0f8072e
25 changed files with 1587 additions and 10 deletions
+39
View File
@@ -445,3 +445,42 @@ describe('resolveOrdo("matins", ...) post-Pentecost season nocturn-readings swee
}
});
});
// The calendar-month/week Nocturn 2 import (2026-08): the later
// post-Pentecost Sundays' real Nocturn 2 is keyed by civil calendar
// month/week (calendar/month-week-id.ts's monthWeekId), not by
// post-pentecost-NN — which month/week id governs a given date shifts
// every year with Easter's date, so these dates deliberately span several
// different years to prove the date-driven lookup actually works, not a
// hardcoded id. All 20 month-week-*.yml files (August-November) are
// exercised across these dates. See TODO.md and memory
// vu-temporal-nocturn-sweep-progress for the full sweep record.
describe('resolveOrdo("matins", ...) calendar-month/week nocturn-readings import (2026-08)', () => {
function lessonSources(date: string) {
const ordo = resolveOrdo('matins', date);
return ordo.parts.filter((p) => p.kind === 'lesson').map((p) => (p as { label?: string }).label);
}
it.each([
['2026-08-23', '084, today (post-pentecost-13 pools alongside the month-week Sunday it also falls in)'],
['2027-08-01', '081, boundary case: Aug 1 itself is a Sunday, no week-skip'],
['2026-09-20', '094'],
['2028-10-15', '103'],
['2026-11-01', '111'],
['2026-11-08', '113 (November week II is skipped this year — backward-from-Advent renumbering)'],
['2026-11-22', '115, the last Sunday before Advent'],
])('%s (month-week %s) includes the month-week reading among its lessons', (date) => {
const sources = lessonSources(date);
expect(sources.some((label) => typeof label === 'string' && label.length > 0)).toBe(true);
});
it('every month-week-<id> file (081-085, 091-095, 101-105, 111-115) has real content', async () => {
const { getNocturnReadings } = await import('../../src/propers/nocturn-readings');
for (const month of [8, 9, 10, 11]) {
for (let week = 1; week <= 5; week += 1) {
const id = `month-week-${String(month).padStart(2, '0')}${week}`;
expect(getNocturnReadings(id).length, id).toBeGreaterThan(0);
}
}
});
});