Add the Circumcision of Our Lord (Jan 1) as a proper temporal feast

Jan 1 previously fell through to generic Christmastide-feria content with
no identity of its own, despite being Christmas's own Octave Day. Adds a
`fixed-date` anchor kind to calendar/movable-feasts.ts's MovableAnchor
(the existing easter/nth-sunday kinds can't express "always Jan 1"),
plus the feast's collect, Magnificat/Benedictus antiphons, full Lauds
psalmody, capitulum, versicle, and two Matins nocturn readings (Leo the
Great, Ambrose), sourced from Sancti/01-01.txt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014axryJBrRswYh2niA7WCUc
This commit is contained in:
2026-08-26 16:27:39 -04:00
parent 4bbd78b1fd
commit f56fb3bd64
12 changed files with 309 additions and 1 deletions
+2
View File
@@ -51,6 +51,8 @@ function dateForAnchor(year: number, anchor: MovableAnchor): string {
}
case 'nth-sunday-of-advent':
return addDays(adventStart(year), 7 * (anchor.nth - 1));
case 'fixed-date':
return toIsoDate({ year, month: anchor.month, day: anchor.day });
}
}
+2 -1
View File
@@ -24,7 +24,8 @@ import { easterOffsetOf } from './temporal';
export type MovableAnchor =
| { kind: 'easter'; offset: number }
| { kind: 'nth-sunday-of-month'; month: number; nth: number } // nth: 1-4, or -1 for "last"
| { kind: 'nth-sunday-of-advent'; nth: number }; // nth: 1-4 (Advent always has exactly 4 Sundays)
| { kind: 'nth-sunday-of-advent'; nth: number } // nth: 1-4 (Advent always has exactly 4 Sundays)
| { kind: 'fixed-date'; month: number; day: number }; // a plain civil-calendar date, not itself Easter- or Advent-anchored (e.g. the Circumcision, Jan 1)
export interface TemporalFeastRecord {
id: string;