Milestone 0/1: shell, calendar/psalter/hours scaffold, Prime
Deploy / deploy (push) Failing after 1m8s

Client-side-first PWA (Vite/TS, no backend) per the approved plan: day-
navigable shell listing all 8 hours, Prime fully resolves via the
calendar -> psalter -> ordo pipeline, the other 7 hours are registered
but flagged not-implemented. Sanctoral/temporal calendar data uses a
day -> id indirection layer (saints, easter-offsets, fixed-date-calendar)
so reassigning a feast to a different day is a data edit, not a code
change. Docker (Caddy-serving-static) + Gitea CI workflow scaffolded to
match the eec/drip/bookshop operational pattern.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-09 15:20:06 -04:00
commit a5dc6502d7
53 changed files with 8634 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
# Offsets in days from Easter Sunday (0). Negative = before Easter, positive
# = after. Covers the whole Easter-anchored span: Septuagesima through the
# last Sunday of Trinitytide. A temporal-id's *name* (and hence whether it
# reads "trinitytide" or "time after pentecost") lives here as data, not as
# a compiled TS enum — see calendar/types.ts's Season type.
#
# PLACEHOLDER: only a handful of anchor points, to prove the shape. The full
# set of Sundays/ferias between anchors is content-authoring work for
# milestone 4.
offsets:
-63: septuagesima-sunday
-56: sexagesima-sunday
-49: quinquagesima-sunday
-46: ash-wednesday
0: easter-sunday
39: ascension-thursday
49: pentecost-sunday
56: trinity-sunday
+18
View File
@@ -0,0 +1,18 @@
# Fixed civil-calendar dates (MM-DD) that anchor part of the temporal cycle
# and don't move with Easter at all — unlike easter-offsets.yml.
#
# Deliberately NOT covering Advent or the Sundays after Epiphany here, even
# though they're "near" these fixed points — both have a wrinkle that isn't
# a plain fixed date:
# - Advent's start is "the Sunday nearest Nov 30" (equivalently, the 4th
# Sunday before Christmas) — a nearest-weekday-to-a-fixed-date rule, not
# a fixed date or a numeric offset.
# - Epiphanytide's *start* is fixed (Jan 6), but its *length* is secretly
# Easter-dependent: how many Sundays after Epiphany you get before
# Septuagesima cuts in varies with how early Easter falls that year —
# i.e. this file's fixed end and easter-offsets.yml's Septuagesima
# start have to arbitrate a boundary at resolution time.
# Both are milestone 4 occurrence-resolution logic, not data-file entries.
dates:
"12-25": christmas-day
"01-06": epiphany
@@ -0,0 +1,9 @@
# 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.
id: example-confessor
name: "Example Confessor (placeholder)"
rank: placeholder # real rank scheme is a milestone 4 decision, not made yet
common: common-of-a-confessor-not-bishop
propers: null # set to a propers id once/if this saint has a full proper
+12
View File
@@ -0,0 +1,12 @@
# Maps a calendar day (MM-DD — the sanctoral cycle repeats every civil year
# regardless of weekday, unlike the temporal cycle) to the saint-id(s)
# celebrated that day. This indirection is the whole point: to move a saint
# to a different day, edit this mapping. The saint's own record
# (data/calendar/saints/<id>.yml) never changes — it's the same record
# whichever day points at it.
#
# PLACEHOLDER: "01-01" -> example-confessor is fake data proving the shape,
# not a real calendar assignment. Real sanctoral content-authoring
# (a pre-1910-leaning calendar, per the plan) is a separate task.
days:
"01-01": [example-confessor]
+14
View File
@@ -0,0 +1,14 @@
# PLACEHOLDER structure: proves the fixed-parts + weekday-variable-psalm
# pipeline works. The hymn/chapter/prayer textRefs don't resolve to real
# text yet (data/propers/ doesn't exist yet) — they render as "pending"
# in the UI. Real content is a separate task from this scaffolding.
id: prime
parts:
- kind: hymn
textRef: { source: common, id: hymn-iam-lucis-orto-sidere }
- kind: variable
resolve: by-weekday
- kind: chapter
textRef: { source: common, id: prime-chapter-ferial }
- kind: prayer
textRef: { source: common, id: prime-collect }
+27
View File
@@ -0,0 +1,27 @@
# Vulgate/Gallican numbering. PLACEHOLDER content: only verses 1-2 are
# filled in, to prove the loading/rendering pipeline end to end. Marked
# `draft` (not `verified`) because this hasn't been checked against a
# primary source yet — real content acquisition (from Divinum Officium
# and/or period breviaries, per the plan's content-sourcing note) is a
# separate task from this scaffolding work.
number: 1
verses:
- n: 1
text:
la: "Beatus vir, qui non abiit in consilio impiorum, et in via peccatorum non stetit, et in cathedra pestilentiae non sedit;"
en: "Blessed is the man who hath not walked in the counsel of the ungodly, nor stood in the way of sinners, nor sat in the chair of pestilence."
status:
la: draft
en: draft
- n: 2
text:
la: "Sed in lege Domini voluntas ejus, et in lege ejus meditabitur die ac nocte."
en: "But his will is in the law of the Lord, and on his law he shall meditate day and night."
status:
la: draft
en: draft
- n: 3
text: {}
status:
la: missing
en: missing
+16
View File
@@ -0,0 +1,16 @@
# PLACEHOLDER distribution: real Benedictine Prime actually distributes
# multiple fixed psalms plus a rotating section of Ps 118 across the week,
# and the user has modifications in mind on top of that — none of that is
# designed yet. This file exists only to prove the (hourId, weekday) -> psalm
# numbers lookup works end to end, using the one psalm we have sample data
# for. Expect this file to be rewritten entirely once real content-authoring
# starts (see plan: "psalter modifications are edits to this data, not
# engine changes").
prime:
sunday: [1]
monday: [1]
tuesday: [1]
wednesday: [1]
thursday: [1]
friday: [1]
saturday: [1]