aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-25 22:38:31 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-25 22:38:31 +0200
commita2fba71d8cccc765c4a987df99fa780f5467514d (patch)
tree02aee8d69de31d8797233d5248d8f2b82dcf6f7d /lib
parent0a85280b0588629a05149e07934759f83f7bd83e (diff)
downloadcolitur-a2fba71d8cccc765c4a987df99fa780f5467514d.tar.gz
colitur-a2fba71d8cccc765c4a987df99fa780f5467514d.zip
fix(of): Nativity Vigil no longer suppresses a Sunday of Advent
Temporal_of.named claimed 24 December unconditionally as of-nativity-vigil (Sollemnitas), and temporal's dispatch matched named before sunday_slug. On a Sunday 24 December, the Fourth Sunday of Advent -- Tabula I.2, Normae n. 5's own privileged Sundays of Advent, Lent and Easter -- was silently replaced by the Vigil. named now returns None for 24 December when that date is itself a Sunday, so temporal's dispatch falls through to sunday_slug and the day resolves as of-advent-sunday-4. The Vigil Mass is an evening Mass of the following solemnity, not an office belonging to 24 December's own civil day -- the same civil-day-granularity reasoning already applied to Holy Thursday (Precedence_of.band's entry-1 comment) and to expected-divergences-litcal.sexp's L1 entry. Every non-Sunday 24 December is unaffected. Audited every other named entry for the same latent shape (see .superpowers/sdd/of-r8-advent-iv-report.md): none of them has it, either because the date can never fall on a Sunday, or because the date IS the definition of that Sunday (Palm Sunday, Easter, Pentecost, Trinity, Christ the King), or because the competing movable-Sunday windows are constructed to exclude that date. Added test_nativity_vigil_yields_to_advent_sunday, covering 2028-12-24 and 2034-12-24 (both inside the litcal fixture window) and the 2026-12-24 non-Sunday control. Re-ran the litcal layer: no allow-list counts moved, since it compares only season and Ordinary-Time week, and both readings of 24 December are "advent" either way. Updated test_precedence_of.ml's "entry 3, not 9" comment, which had carried this as a known, unfixed defect, to describe the fix; its own pinned assertion (a hand-built Thursday candidate) needed no change.
Diffstat (limited to 'lib')
-rw-r--r--lib/rites/rite_of/temporal_of.ml28
-rw-r--r--lib/rites/rite_of/temporal_of.mli11
2 files changed, 37 insertions, 2 deletions
diff --git a/lib/rites/rite_of/temporal_of.ml b/lib/rites/rite_of/temporal_of.ml
index 9aa898e..e375350 100644
--- a/lib/rites/rite_of/temporal_of.ml
+++ b/lib/rites/rite_of/temporal_of.ml
@@ -238,7 +238,33 @@ let named d =
let easter = Computus.gregorian_easter y in
let off n = Date.add_days easter n in
let m = Date.month d and dd = Date.day d in
- if m = 12 && dd = 24 then Some (Advent, "of-nativity-vigil", Colour.White, Sollemnitas)
+ if m = 12 && dd = 24 && Date.weekday d <> Date.Sun then
+ Some (Advent, "of-nativity-vigil", Colour.White, Sollemnitas)
+ (* NOT unconditional. Tabula I.2 ("Dominicae Adventus, Quadragesimae et
+ Paschae") outranks Tabula I.3 (solemnities generally, where the Vigil
+ Mass of the Nativity itself bands, per Precedence_of.band's own entry-3
+ branch) -- Normae n. 5 states it directly for exactly this class of
+ day: a Sunday of Advent/Lent/Easter yields to nothing but a still
+ higher-banked day. The Fourth Sunday of Advent is one of those
+ privileged Sundays every time 24 December falls on one.
+
+ The Vigil Mass is an evening Mass of the FOLLOWING solemnity (the
+ Nativity, 25 December), not an office belonging to 24 December's own
+ civil day -- the identical granularity reasoning
+ Precedence_of.band's own entry-1 comment already applies to Holy
+ Thursday (the Triduum opens with an evening Mass inside Holy
+ Thursday's civil day, so the day itself stays at entry 2, not entry
+ 1) and that data/of/expected-divergences-litcal.sexp's L1 entry
+ applies on the season axis. At colitur's one-office-per-civil-day
+ granularity, only one identity can hold 24 December, and on a Sunday
+ that identity is the Fourth Sunday of Advent, not the Vigil -- so
+ [named] must return [None] here and let [temporal]'s dispatch fall
+ through to [sunday_slug], exactly as it already does for every other
+ Sunday [named] does not claim.
+
+ Every non-Sunday 24 December is unaffected: the Vigil still wins
+ there, as a plain late-Advent feria (Tabula II.9) is never privileged
+ against it. *)
else if m = 12 && dd = 25 then Some (Christmas, "of-nativity", Colour.White, Sollemnitas)
else if m = 1 && dd = 1 then Some (Christmas, "of-mary-mother-of-god", Colour.White, Sollemnitas)
else if m = 1 && dd = 6 then Some (Christmas, "of-epiphany", Colour.White, Sollemnitas)
diff --git a/lib/rites/rite_of/temporal_of.mli b/lib/rites/rite_of/temporal_of.mli
index 982ff05..d2acadd 100644
--- a/lib/rites/rite_of/temporal_of.mli
+++ b/lib/rites/rite_of/temporal_of.mli
@@ -103,7 +103,16 @@ val christ_the_king : int -> Date.t
threading extra state through every other branch too -- the exact
reason EF's own [named] excludes its structurally identical Holy
Family/Holy Name. {!temporal} applies all three as its own targeted
- dispatch instead. *)
+ dispatch instead.
+
+ 24 December is ALSO conditional, not unconditional like the rest of this
+ function's fixed dates: it yields [of-nativity-vigil] only when that date
+ is not itself a Sunday. On a Sunday, [None] is returned so {!temporal}'s
+ dispatch falls through to {!sunday_slug}'s own [of-advent-sunday-4] --
+ Tabula I.2/Normae n. 5's Sundays of Advent outrank the Vigil (Tabula
+ I.3), the same evening-Mass-inside-the-civil-day reasoning already
+ applied to Holy Thursday (see [named]'s own implementation comment for
+ the full argument). *)
val named : Date.t -> (Vocab_of.season * string * Colour.t * Vocab_of.rank) option
(** Week within the season, 1-indexed, Sunday-aligned (constant across a