Add nameLa mechanism for bilingual header, proof set of 11 feasts + St. Lawrence
Deploy / deploy (push) Successful in 1m32s

Threads an optional nameLa field through SanctoralIdentity/SaintRecord/
TemporalFeastRecord/ActiveOctave so day-label.ts can render real Latin
proper names instead of always falling back to English. Authors the
proof set: all 11 named temporal feasts plus St. Lawrence (chosen to
exercise the octave-headline and octave-commemoration code paths too).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwsZQMjALCvy7u9tFDWmuQ
This commit is contained in:
2026-08-31 06:30:48 -04:00
parent 76cc363a75
commit a6261f044a
27 changed files with 190 additions and 50 deletions
+50 -4
View File
@@ -34,10 +34,17 @@ across every hour and content type in this app.
date/entry already resolves correctly end-to-end); what's left is authoring/importing more
content in that same shape across the rest of the calendar:
- Latin saint/octave/named-feast names for the bilingual date/day-label header (see
"Bilingual, merged date/day-label header" below) — the `{en, la}` mechanism is built and
every proper name falls back to English gracefully, but zero saints, octaves, or named
temporal feasts have an authored Latin name anywhere in `src/data/**`. Weekday names,
month names, rank labels, and season/ordinal phrasing already have real Latin.
"Bilingual, merged date/day-label header" below and the dated log's new entry at the
bottom of this file) — `SanctoralIdentity`/`SaintRecord`/`TemporalFeastRecord`/
`ActiveOctave` now carry a real optional `nameLa` field, threaded end-to-end through
`calendar/day-label.ts`'s `biName` helper (live-verified: winner, octave-headline, and
commemoration branches all render authored Latin, not the English fallback, for a proof
set of 12 records — all 11 named temporal feasts plus St. Lawrence). Zero saints besides
St. Lawrence have an authored `nameLa` yet — this is now real bulk-content work in an
already-proven shape, same "one saint at a time, sourced against the reference engine's
own `[Officium]`/`[Rank]` title, nominative-noun-phrase form" methodology used for the
named temporal feasts. Weekday names, month names, rank labels, and season/ordinal
phrasing already had real Latin before this.
- Matins sanctoral-side readings: the per-book Matins responsory pool has only one book
seeded (`isa`) — needs expanding. Bible-plan TSV content also isn't yet in a test table
(see "Bible-plan TSV — bulk conversion done" below).
@@ -4383,3 +4390,42 @@ not just under this app's implementation of them.
Neither is "unauthored content pending" — there is no historical text for either case to author.
Dropped from the "Open work" list entirely rather than marked done-with-a-caveat, since authoring
something anyway would mean inventing text that never existed.
### Bilingual header `nameLa` mechanism (2026-08-31)
Picked up the standing "Latin saint/octave/named-feast names" backlog item. The `Bi`
(`{en, la}`) *display* wrapper already existed in `calendar/day-label.ts`, but the underlying
*data* had no bilingual name field at all — `SaintRecord.name`, `TemporalFeastRecord.name`, and
the derived `SanctoralIdentity`/`ActiveOctave`/`Commemoration` types were plain English strings,
so every proper name necessarily fell back through `biFallback`.
Added an optional `nameLa?: string` alongside `name` on `SanctoralIdentity` (`calendar/types.ts`),
`SaintRecord`/`SanctoralCandidate` (`calendar/feasts.ts`), `TemporalFeastRecord`
(`calendar/temporal-feasts.ts`), and `ActiveOctave` (`calendar/octaves.ts`), then threaded it
through every construction site that had been spreading `id`/`name`/`rank` (`collision.ts`,
`commemorations.ts`, `movable-feasts.ts`, `index.ts` x3, `vespers.ts` x2,
`octaves.ts`'s `considerCandidate`). `day-label.ts`'s old `biFallback(name)` calls became
`biName(name, nameLa)`, which still falls back to the English string when `nameLa` is absent —
the "surface real text, don't block on missing" convention preserved exactly, just now backed by
a real field instead of no field at all.
Authored `nameLa` for all 11 named temporal feasts as the proof set (each sourced from the
reference engine's own `[Officium]`/`[Rank]` title, adapted from the source's genitive/ablative
liturgical-title style to this app's nominative-noun-phrase naming convention — e.g. "In
Ascensione Domini" → `Ascensio Domini`, "Sacratissimi Cordis Domini Nostri Jesu Christi" →
`Sacratissimum Cor Domini Nostri Jesu Christi`) plus St. Lawrence as the one saint, chosen
specifically to exercise the octave-headline (`octaveCoreName`) and octave-commemoration code
paths, not just the plain-winner path the temporal feasts alone would have covered. Live-verified
end-to-end via a throwaway scratch test (removed after confirming) that Pentecost's/the
Ascension's/the Immaculate Heart's own winner label, St. Lawrence's mid-octave and closing-day
octave label, and his octave *commemoration* line (Aug 12) all render the authored Latin, not the
English fallback. Six pre-existing `toEqual` test fixtures across `august-sanctoral.test.ts`,
`octaves.test.ts`, `transfer.test.ts`, and `december-sanctoral.test.ts` needed their expected
objects updated to include the new `nameLa` key (Christmas's own octave-commemoration entries too,
since `christmas-day.yml` picked up a name in this same pass). `npm test` (807 passed) and
`tsc --noEmit` pass.
**Not started**: `nameLa` for the other ~220 saints — the mechanism is now proven in all three
code paths (plain winner, octave headline, sanctoral commemoration); what's left is the same
per-saint sourcing pass the sanctoral-content sweep itself used, just for a name instead of a
collect.