From 85903385f8a32be3de3964f43b3d7831474d0a72 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 27 Aug 2026 00:56:08 +0200 Subject: docs: describe the OF rite module and what its layers cannot see CLAUDE.md's own Current state still read 'Plans 1-3 + the EF lectionary DONE' and listed the OF module as future work, so the orientation doc a fresh session reads first did not know the rite exists. Records what the OF's three validation layers cannot see -- no published-ordo witness at all where EF has three, identity comparison reaching ~12% of rows, Validate.run being blind to value-level misplacement, and an allow-list entry having twice hidden a real defect -- and scopes the six-layer Validation section to EF, which is the only rite it describes. --- CLAUDE.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file 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 ` and `readings --rite of ` 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 -- cgit v1.3