Authors a real Latin nameLa for every saint in src/data/calendar/saints/
except the deliberate example-confessor placeholder (standard
ecclesiastical Latin forms, a lighter sourcing bar than this app's usual
reference-engine verification -- flagged for future spot-check). Fixes a
real mechanism bug found in the process: calendar/index.ts's sanctoral
collision-resolution branch was dropping nameLa for any saint that won
after beating another same-day candidate. Updates ~180 pre-existing test
fixtures across the calendar suite for the new field.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwsZQMjALCvy7u9tFDWmuQ
Keeps Simplex commemorating in place, but a Semiduplex feast on an
ordinary Sunday goes back to transferring off to the next open day —
this app's own design choice, not a correction against a reference
engine. The transfer mechanism is already generic: this file's `decideOccurrence`
only signals "couldn't hold onto this candidate" for the day itself;
calendar/index.ts's resolveDay is what independently checks each
neighboring day's own native occurrence for an incoming transfer and
claims it — no separate lookback logic needed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Two related fixes surfaced while chasing why St. Gregory Thaumaturgus
appeared to be misdated on Nov 18:
- calendar/commemorations.ts's `ordinary-sunday` case was transferring a
Semiduplex (or lower) saint off the Sunday instead of commemorating it
in place — an earlier, unverified guess. Live-verified against both
Tridentine 1906 and Divino Afflatu 1954 (St. Gregory Thaumaturgus, St.
Clement, St. Apollinaris, St. Thomas Becket, all real cases): the saint
stays and is commemorated on the Sunday itself, same as Simplex, never
pushed to the next open day. This is what was actually moving Gregory
onto Nov 18 — not a data error. `applyChristmasOctaveSunday`'s own
Dec 26-29 special case needed a matching adjustment (per its own
documented intent, the displaced saint there is deliberately *not*
commemorated in place, since he reappears in full on Dec 30 instead).
- getDayLabel had five branches, each hand-assembling its own
filter/format logic for which commemorations to show — which is why
the octave phrasing, the closing-day title, and a missing Sunday
commemoration turned into three separate bugs earlier instead of one.
Replaced with a single shared `collectCommemorations` used by every
branch. This also exposed that the sanctoral-winner branch never
showed any commemorated saint at all, and every other branch only
showed the *first* one (`.find()`), silently dropping real collisions
— both now show every commemorated saint, matching this app's own
generous-commemoration design.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Blind per-date source-file reading (Sancti/SanctiM MM-DD.txt) turned out
unreliable for collect authorship: those files are era-merged, carrying
centuries of accumulated saints behind rubric-conditional gating, so a
naive read often returned a saint canonized long after 1617 instead of
the Monastic-Tridentine-era one actually on this calendar (St. Didacus
instead of All Saints of the Benedictine Order, St. Rose of Lima instead
of Ss. Felix and Adauctus, etc).
Fixed by pulling from web/www/Tabulae/Kalendaria/'s own era-specific
calendar tables (1570.txt Tridentine base + M1617.txt's Monastic diffs)
instead, cross-validated against the pre-1955/Divino Afflatu chain
(1888->1906->1939->1954) as a corroborating signal. Cross-referencing all
205 existing saint records against this table confirmed 204/205 were
already correctly placed -- the earlier live-query verification work was
sound, only blind file-reading was flawed -- so no sanctoral-calendar.yml
corrections were needed, just the collect content itself.
Two collect shapes came out of the 94: 34 proper collects (own YAML file,
Latin verified against source, English translated+draft where the source
lacked it) and 60 resolved via a new Common-collect templating mechanism
-- SaintRecord.collectCommon/collectName plus substituteName() in
resolve-common.ts, filling a template's {N} placeholders positionally
from the saint's own declined name, across 21 new common/collect-c*.yml
templates named after the source's own C-numbering.
St. Michael's Sep 29 propers resolved via its whole-file @Sancti/05-08
inheritance (Apparition of St. Michael, May 8). St. Martha's plural-
template default was overridden to the singular collect-c6a since she's
one person, not a pair.
Also fixes a latent bug this surfaced: getDayCollect looked up
`${collectCommon}-collect`, but collect-c*.yml files are id'd as
`collect-c2` etc with no such suffix -- caught by a smoke test where
every one of the 93 non-Michael saints resolved as missing.
4 pre-existing tests updated: they asserted specific saints (St.
Benedict, St. Romanus Abbot, St. Anthony Abbot) had no authored collect,
which is no longer true; resolve-common.test.ts's generic "missing" case
now uses a synthetic day/winner since no real unauthored saint remains
as an example.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Real collect text for the 9 January saints that have one, plus a real
antiphon for the 3 that have one of their own (as opposed to falling back
to a generic Common-of-Saints text) — read directly from the reference
engine's fully-rendered output, not reconstructed from the raw source
files' own shorthand endings ($Per Dominum, $Qui vivis, etc.).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>