calendar: enable the four remaining real octaves
Deploy / deploy (push) Successful in 44s

Assumption (Aug 15-22), Nativity of the BVM (Sep 8-15), Immaculate
Conception (Dec 8-15), and All Saints (Nov 1-8) now declare octave:
{ enabled: true }, same generic mechanism as St. Lawrence and the
Christmas trio. Every octave this pull has identified is now modeled;
Matins reading content is a separate, larger follow-up (see conversation)
-- these still just commemorate at L/V-equivalent level for now.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 08:20:47 -04:00
parent da3b6e893e
commit eec76a1e4e
7 changed files with 36 additions and 7 deletions
+3
View File
@@ -8,3 +8,6 @@ name: "All Saints"
rank: duplex-1-classis
common: proper-to-all-saints
propers: "all-saints"
# Has a real octave (Nov 1-8) -- see calendar/types.ts's OctaveConfig.
octave:
enabled: true
+3
View File
@@ -9,3 +9,6 @@ name: "The Assumption of the Blessed Virgin Mary"
rank: duplex-1-classis
common: common-of-the-bvm
propers: "assumption"
# Has a real octave (Aug 15-22) -- see calendar/types.ts's OctaveConfig.
octave:
enabled: true
@@ -7,3 +7,6 @@ name: "The Immaculate Conception of the Blessed Virgin Mary"
rank: duplex-1-classis
common: common-of-the-bvm
propers: "immaculate-conception"
# Has a real octave (Dec 8-15) -- see calendar/types.ts's OctaveConfig.
octave:
enabled: true
@@ -8,3 +8,6 @@ name: "The Nativity of the Blessed Virgin Mary"
rank: duplex-2-classis
common: common-of-the-bvm
propers: "nativity-bvm"
# Has a real octave (Sep 8-15) -- see calendar/types.ts's OctaveConfig.
octave:
enabled: true
+7 -2
View File
@@ -76,13 +76,18 @@ describe('August sanctoral pull (first pass)', () => {
expect(getDayCollect(day).status.en).toBe('verified');
});
it('dates within St. Lawrence and the Assumption\'s own octaves still exclude the real secondary saint the source names (St. Clare, Aug 12) -- Clare herself isn\'t modeled yet -- but St. Lawrence\'s own octave (now modeled, see calendar/octaves.ts) correctly keeps commemorating him through it regardless. The Assumption\'s own octave isn\'t populated with octave data yet, so Aug 22 stays plain.', () => {
it("dates within St. Lawrence and the Assumption's own octaves still exclude the real secondary saint the source names (St. Clare, Aug 12) -- Clare herself isn't modeled yet -- but both octaves themselves (now modeled, see calendar/octaves.ts) correctly keep commemorating through them regardless", () => {
const clareDay = resolveDay('2025-08-12');
expect(clareDay.winner.kind).toBe('temporal');
expect(clareDay.commemorations).toEqual([{ kind: 'octave', id: 'st-lawrence', name: 'St. Lawrence, Martyr' }]);
// Aug 22 is the Assumption's own octave day (In Octava Assumptionis),
// Duplex, blocking Ss. Timothy/Hippolytus/Symphorian the same way --
// it's also day 8 of the Assumption's own octave.
const assumptionOctaveDay = resolveDay('2025-08-22');
expect(assumptionOctaveDay.winner.kind).toBe('temporal');
expect(assumptionOctaveDay.commemorations).toEqual([]);
expect(assumptionOctaveDay.commemorations).toEqual([
{ kind: 'octave', id: 'assumption', name: 'The Assumption of the Blessed Virgin Mary' },
]);
});
it('the Beheading of St. John the Baptist wins outright at Duplex with a real proper collect and antiphon, over a genuinely unwinnable stub', () => {
+9 -2
View File
@@ -10,10 +10,17 @@ describe('activeOctavesFor', () => {
const day1 = activeOctavesFor('2026-08-10'); // St. Lawrence's own day
expect(day1).toEqual([{ id: 'st-lawrence', name: 'St. Lawrence, Martyr', wins: 'semiduplex', dayNumber: 1 }]);
// Aug 17 is also day 3 of the Assumption's own octave (started Aug 15) --
// the two run concurrently this time of year.
const day8 = activeOctavesFor('2026-08-17');
expect(day8).toEqual([{ id: 'st-lawrence', name: 'St. Lawrence, Martyr', wins: 'semiduplex', dayNumber: 8 }]);
expect(day8).toEqual([
{ id: 'st-lawrence', name: 'St. Lawrence, Martyr', wins: 'semiduplex', dayNumber: 8 },
{ id: 'assumption', name: 'The Assumption of the Blessed Virgin Mary', wins: 'semiduplex', dayNumber: 3 },
]);
expect(activeOctavesFor('2026-08-18')).toEqual([]);
// Aug 23: past both Lawrence's (ended Aug 17) and the Assumption's
// (ended Aug 22) windows.
expect(activeOctavesFor('2026-08-23')).toEqual([]);
});
it("Pentecost's octave uses its own configured threshold (duplex), not the default (semiduplex)", () => {
+8 -3
View File
@@ -27,13 +27,18 @@ describe('September sanctoral pull (first pass)', () => {
expect(getDayCollect(day).status.en).toBe('verified');
});
it("dates within the Nativity's own octave are excluded entirely, even where the source names a real secondary saint, pending octave support", () => {
it("dates within the Nativity's own octave still exclude the real secondary saints the source names (Ss. Gorgonius, Nicomedes) -- neither is modeled yet -- but the octave itself (now modeled, see calendar/octaves.ts) correctly commemorates through it", () => {
const gorgoniusDay = resolveDay('2025-09-09');
expect(gorgoniusDay.winner.kind).toBe('temporal');
expect(gorgoniusDay.commemorations).toEqual([]);
expect(gorgoniusDay.commemorations).toEqual([
{ kind: 'octave', id: 'nativity-bvm', name: 'The Nativity of the Blessed Virgin Mary' },
]);
// Sep 15 is also day 8 of the Nativity's own octave (started Sep 8).
const nicomedesDay = resolveDay('2025-09-15');
expect(nicomedesDay.winner.kind).toBe('temporal');
expect(nicomedesDay.commemorations).toEqual([]);
expect(nicomedesDay.commemorations).toEqual([
{ kind: 'octave', id: 'nativity-bvm', name: 'The Nativity of the Blessed Virgin Mary' },
]);
});
it('a monastic-calendar-specific reassignment replaces what the base Tridentine table treats as a plain Nativity-octave continuation', () => {