aboutsummaryrefslogtreecommitdiff
path: root/CLAUDE.md
diff options
context:
space:
mode:
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md81
1 files changed, 79 insertions, 2 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index 5047e93..2e01476 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -100,7 +100,15 @@ overlays**.
- **Data format**: **S-expressions** (`sexplib`/`ppx_sexp_conv`) — the OCaml type
*is* the format, parse/print auto-derived, no hand-written parser.
-## Validation (the "sure bet" pillar — 6 layers)
+## Validation (the "sure bet" pillar)
+
+**This section describes the EF rite's six layers.** The OF rite has three of
+its own with a different blind-spot profile — see "Current state" above, and
+read its "what the OF's layers cannot see" list before trusting an OF result.
+The two rites' validation is NOT interchangeable: EF has three published-ordo
+witnesses, OF has none.
+
+### EF — six layers
1. **Types** — illegal states unrepresentable (closed variants for ranks/colours/
seasons; dates validated at construction; resolution total).
@@ -317,7 +325,59 @@ source citation, SHA-256 and characterisation record.
ever exercised between two `Commemoration_only` candidates, neither of which has
any RG 91 table position to compare in the first place.
-## Current state (Plans 1–3 + the EF lectionary DONE — verify with `git log`)
+## Current state (EF complete at v1.0.0; **the OF rite module is BUILT** — verify with `git log`)
+
+### The OF (post-1970) rite — built 2026-08-25/27, branch `of-phase1-vocab-temporal`
+
+**`colitur day --rite of <year>` and `readings --rite of <year>` emit a full
+resolved year.** The rite is a peer module, not an overlay (binding decision 4),
+and it satisfies `RITE` **with no kernel special-casing** — spec §7's central
+claim, confirmed by assembly rather than asserted.
+
+- **Code** (`lib/rites/rite_of/`): `vocab_of` (5 seasons, 4 grades + `Feria`) ·
+ `temporal_of` (Normae Titulus II, the two-block Ordinary Time arithmetic) ·
+ `precedence_of` (the 13-entry *Tabula dierum liturgicorum*, occurrence
+ n. 60, four transfer rules) · `rubrics_of` (Gloria IGMR n. 53, Credo
+ nn. 67–68) · `lectionary_of` (three-year Sunday / two-year weekday cycles,
+ OLM n. 66 + fn. 102 and n. 69.4) · `rite_of` (the bundle).
+- **Data** (`data/of/`): `calendar-2002.sexp`, 208 entries transcribed from the
+ **Latin typical edition** (lectio is a cross-check only, never the source) ·
+ `amendments/` — **one overlay per post-2002 decree**, 13 files, 16
+ celebration-level changes, so every change stays independently citable and
+ revertible · `lectionary.sexp`, 770 entries bootstrapped from lectio.
+- **`band` is total** over everything the engine constructs, mutation-proved.
+
+### What the OF's validation layers CANNOT see — read this before trusting them
+
+- **OF has NO published-ordo witness at all**, where EF has three. litcal is a
+ second *implementation*, not a second *publication*: agreement means two
+ engines read the Normae alike, which catches implementation bugs and nothing
+ else.
+- **litcal identity comparison reaches only ~12% of non-Triduum rows.** The
+ other ~88% (668 Memorials alone) are grade-checked only, so **a
+ wrong-saint-same-grade defect is invisible**.
+- **`Validate.run`'s structural checks cannot see a value-level
+ misplacement.** A transferred celebration that lands on the wrong day still
+ satisfies every structural property — which is exactly how St Joseph sat
+ five weeks late without a single check firing.
+- **An allow-list entry can hide a real defect.** Proven twice on this
+ project: litcal entries L2/L3 documented the Holy Family gap as "expected"
+ while it was a live bug. Closing one turned it into a passing assertion.
+- The lectionary's lineage is a **Polish vernacular pastoral source**
+ (niedziela.pl via lectio), *not* the Latin OLM — three divergences from the
+ real OLM are already confirmed. And lectio is **two unrelated upstreams
+ glued together by one downstream project**, not one witness.
+
+### Known-wrong on the OF side: NONE outstanding
+
+All five documented defects were fixed 2026-08-26/27 — St Joseph's backward
+anticipation (Normae n. 56(f)), Holy Family's n. 35(a) fallback, the
+obligatory-memorial tie, chapter-crossing citations, and the render layer's
+hardcoded reading pair. Two further bugs surfaced while fixing them (`anchors`
+disagreeing with `temporal`; `transfer_target`'s Rule 1 dead on a slug
+mismatch) and were fixed too.
+
+### Historical (EF, Plans 1–3 + the EF lectionary)
**Plans 1 + 2 are on `main` (35 commits). Plan 3 and its follow-on fix/feature
tasks (RG 16(a), Holy Family/RG 112(a), Holy Name/RG 110, the Sacred Triduum,
@@ -447,6 +507,23 @@ dune exec colitur -- day 2026 | head
## What's next
+- **Plan 4 (the OF rite module) is DONE** — see "Current state" above. What it
+ proved is the part worth carrying forward: `RITE` generalises, and building a
+ second rite found **five places the kernel was EF-shaped**. Two were fixed
+ (`Validate`'s hardcoded `[First; Gospel]` became the rite-supplied
+ `Rite.t.citation_shapes`; `transfer_target`'s "strictly later" obligation
+ became "must differ from origin", which is the real invariant since
+ `Precedence.resolve` never dedupes by slug). Three remain documented, not
+ fixed: `Preface.t`'s 15 constructors are EF-cited and structurally lossy for
+ OF; `Mass_formulary.source` has no constructor for OF's direct sanctoral
+ lookup; and `Emit_csv` cannot widen to a third reading because RFC 4180's
+ header contract forbids a variable column count.
+- **Still open on the OF side**: no published-ordo witness (the single biggest
+ gap); `Rubrics_of` is unreachable from any CLI command; pre-1970 behaviour
+ is computed but undecided (spec §8.1); and optional memorials have no
+ representation for "could have been celebrated" (spec §8.3) — ~15 days a
+ year carry two or three with only one electable.
+
- **The EF lectionary is DONE** (branch `ef-lectionary`, 20 commits): the four-
step reading-resolution chain, its data (`data/ef/lectionary.sexp`,
`commons.sexp`, sanctoral propers), all five validation layers extended to