calendar: real occurrence/precedence resolution (feast ranks, sanctoral content)

Replaces the FeastRank placeholder with a real ordered FeastClass (the old
pre-1955 six-level scale) and a new TemporalCategory (privileged/ordinary
Sunday/feria). calendar/commemorations.ts's decideOccurrence encodes the
actual precedence rules as explicit, commented branches per category
rather than the reference engine's own opaque numeric weights — this app
targets one ruleset, so the readability trade-off is worth it. Category
membership (data/calendar/temporal-categories.yml) is a best-effort
reconstruction of the pre-1955 tradition, not sourced from a primary text;
expect corrections.

calendar/feasts.ts resolves real sanctoral candidates, and resolveDay()
wires it all together — occurring/temporalCategory are no longer stubs.
isDoubleOrHigher (hours/antiphon.ts) is now a real comparison instead of
a hardcoded false.

Seeded 7 real saints/feasts, each verified directly against Divinum
Officium's own rank data (not reconstructed from memory) as a small,
growable start: St. Lawrence, the Assumption, St. Augustine, the Nativity
of the BVM, St. Michael, All Saints, the Immaculate Conception.
This commit is contained in:
2026-08-10 07:03:28 -04:00
parent ec448bc35b
commit 2ea21f2c89
19 changed files with 456 additions and 54 deletions
+7
View File
@@ -0,0 +1,7 @@
# Verified against Divinum Officium (web/www/horas/Latin/Sancti/11-01.txt,
# untagged/default [Rank] block).
id: all-saints
name: "All Saints"
rank: duplex-1-classis
common: proper-to-all-saints
propers: null
+7
View File
@@ -0,0 +1,7 @@
# Verified against Divinum Officium (web/www/horas/Latin/Sancti/08-15.txt,
# untagged/default [Rank] block).
id: assumption
name: "The Assumption of the Blessed Virgin Mary"
rank: duplex-1-classis
common: common-of-the-bvm
propers: null
@@ -1,9 +1,8 @@
# PLACEHOLDER — demonstrates the saint-record shape only. Not a real saint,
# not a real rank, not a real day assignment (see sanctoral-calendar.yml for
# where this id gets pointed at a day). Which day(s) point here can change
# freely without ever touching this file.
# PLACEHOLDER — demonstrates the saint-record shape only, deliberately not
# mapped to any day in sanctoral-calendar.yml (which now holds real,
# verified entries — see that file). Not a real saint, not a real rank.
id: example-confessor
name: "Example Confessor (placeholder)"
rank: placeholder # real rank scheme is a milestone 4 decision, not made yet
rank: simplex # placeholder value
common: common-of-a-confessor-not-bishop
propers: null # set to a propers id once/if this saint has a full proper
propers: null
@@ -0,0 +1,7 @@
# Verified against Divinum Officium (web/www/horas/Latin/Sancti/12-08.txt,
# untagged/default [Rank] block).
id: immaculate-conception
name: "The Immaculate Conception of the Blessed Virgin Mary"
rank: duplex-1-classis
common: common-of-the-bvm
propers: null
@@ -0,0 +1,7 @@
# Verified against Divinum Officium (web/www/horas/Latin/Sancti/09-08.txt,
# untagged/default [Rank] block).
id: nativity-bvm
name: "The Nativity of the Blessed Virgin Mary"
rank: duplex-2-classis
common: common-of-the-bvm
propers: null
@@ -0,0 +1,9 @@
# Verified against Divinum Officium (web/www/horas/Latin/Sancti/08-28.txt,
# untagged/default [Rank] block — that file's own "(sed rubrica 1930)"
# alternate raises this to Duplex majus, but 1930 postdates the pre-1910
# calendar this app targets, so the plain default is used instead.
id: st-augustine
name: "St. Augustine of Hippo, Bishop, Confessor and Doctor of the Church"
rank: duplex
common: common-of-a-confessor-bishop
propers: null
+8
View File
@@ -0,0 +1,8 @@
# Verified against Divinum Officium (web/www/horas/Latin/Sancti/08-10.txt,
# untagged/default [Rank] block — the pre-1955 value, not the "(sed rubrica
# 196)" alternate given alongside it in that file).
id: st-lawrence
name: "St. Lawrence, Martyr"
rank: duplex-2-classis
common: common-of-a-martyr
propers: null
+9
View File
@@ -0,0 +1,9 @@
# Verified against Divinum Officium (web/www/horas/Latin/Sancti/09-29.txt,
# untagged/default [Rank] block — that file's own "(sed rubrica tridentina)"
# alternate gives Duplex II classis instead; the plain default is used here
# for consistency with how every other saint file in this set was read).
id: st-michael
name: "St. Michael the Archangel"
rank: duplex-1-classis
common: common-of-an-angel
propers: null