aboutsummaryrefslogtreecommitdiff
path: root/CLAUDE.md
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-17 15:24:27 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-17 15:24:27 +0200
commitcba04b3033f23b5c2515c9e648f2b83344716224 (patch)
tree5f76a73fd2889bc396cbaa0034b347b8a82a696d /CLAUDE.md
parent947cadfab527829f8e42a896339a0fa6c2e81ad9 (diff)
downloadcolitur-cba04b3033f23b5c2515c9e648f2b83344716224.tar.gz
colitur-cba04b3033f23b5c2515c9e648f2b83344716224.zip
feat(cli): colitur readings, one line per day
The lectionary has been resolvable since Task 4 but invisible from the command line: `colitur day` prints no citations, so the branch's whole deliverable could only be seen through the test suite. A separate command rather than extra columns on `day`, which is where the plan pointed. Its instruction was to append the Epistle and Gospel to each row "matching the existing column style", and that turns out not to be possible: a citation contains spaces and commas ("Ezech 34:11-16", "Ecclus 51:1-8, 12") while a day row is space-separated with a variable-length +slug commemoration tail, so appending them leaves the row unsplittable -- no awk or cut field number recovers where the Epistle ends. That is the opposite of what the row is shaped for. So `day` keeps its format byte-identical, asserted directly in cli.t rather than left implicit, and the citations get their own row with " | "-delimited fields, safe for values containing spaces. Both formats are a stopgap and say so in the source: the design calls for one schema rendered through a logic-less template engine, and two ad-hoc formats are easier to retire later than one overloaded format whose parsing rules nobody wrote down. The year walk is now shared. day_report and readings_report differ only in how a day is printed, and the two-liturgical-year indexing -- with its own reasoning about civil-versus-liturgical spans -- is exactly the part that must not be duplicated and drift. "-" for an absent part, though no EF day can currently print one: layer 2 asserts exactly one First and one Gospel on every day of every year 1583-9999. The CLI still does not assume a guarantee the kernel makes about data rather than about types. cli.t gains the four chain-step cases test_golden.ml pins against the scans, so the CLI path is checked to agree with the library path, plus the 2 January line, which reads the Circumcision's Mass under the Missal's own ferial rubric (scan1:6523-6526) and not RG 17(a). Verified the cram tests actually run and have teeth: corrupting one expectation produces a diff and exits 1. CLAUDE.md: state, test count (369, 370 with the sweep), the readings command and why it is separate, and What's next -- the lectionary landed early rather than inside Plan 4, so what remains there is OF's own lectionary, not the mechanism. Chants stay deliberately unbuilt, and Validate now rejects any part outside First/Gospel.
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md37
1 files changed, 31 insertions, 6 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index 0819c88..9f8352c 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -224,13 +224,13 @@ against missalemeum; layer 5 pins ~30 dates.
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 DONE — verify with `git log`)
+## Current state (Plans 1–3 + the EF lectionary DONE — verify with `git log`)
**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,
the BVM Saturday Office, the Major Litanies) have landed on a chain of feature
-branches since — test count keeps climbing task by task (325 tests green, 326
-with the exhaustive sweep, as of `ef-major-litanies`; this line is not kept in
+branches since — test count keeps climbing task by task (369 tests green, 370
+with the exhaustive sweep, as of `ef-lectionary`; this line is not kept in
lockstep with every task, `git log`/`dune test` are the actual source of
truth).** The kernel, the **complete EF
temporal cycle**, the **resolution engine**, the **sanctoral data**, and **all five
@@ -277,7 +277,19 @@ earlier one; M5 corrected (a prior note had 2027's own outcome backwards) and
M20 added by the `ef-major-litanies` task, M18 394 not 395 accordingly).
Fixtures live in `test/fixtures/` with asserted SHA-256s.
-**CLI**: `colitur easter <year>`, `temporal <year>`, `day <year>`.
+**CLI**: `colitur easter <year>`, `temporal <year>`, `day <year>`,
+`readings <year>`.
+
+`readings` is a **separate command, not extra columns on `day`**, for a
+mechanical reason worth not rediscovering: a citation contains spaces and
+commas (`Ezech 34:11-16`, `Ecclus 51:1-8, 12`) while a `day` row is
+space-separated with a variable-length `+slug` commemoration tail, so
+appending them there leaves the row unsplittable by field number. `day`'s
+format is therefore **byte-identical** to what it was before the lectionary
+existed (asserted in `test/cli.t`). Both are a **stopgap**, not the project's
+answer to output: the design still calls for one schema rendered through a
+logic-less template engine — two ad-hoc formats are easier to retire than one
+overloaded format with unwritten parsing rules.
`band` is **provably total** over everything the engine constructs: zero
`unclassified` across all 8 417 years, for a 28-branch hand-transcribed table.
@@ -304,8 +316,21 @@ dune exec colitur -- day 2026 | head
## What's next
-- **Plan 4 — OF rite module** (proves `RITE` generalizes) → the lectionary
- bootstrap and citations → full output/rendering → hardening and a first tag.
+- **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
+ citations, and `colitur readings`. Layer 2 asserts that **every day of every
+ year 1583–9999 resolves exactly one Epistle and one Gospel** — measured, and
+ mutation-proved live rather than silently inert. **Chants (Psalm, Second,
+ Tract, Alleluia, Sequence) remain deliberately unbuilt**: no source, no
+ oracle, and `Validate`'s own `citations` check now *rejects* any part outside
+ First/Gospel, so one appearing would be a defect rather than a feature
+ arriving early.
+- **Plan 4 — OF rite module** (proves `RITE` generalizes) → full output/
+ rendering → hardening and a first tag. (The lectionary bootstrap and
+ citations this line used to defer to Plan 4 landed early, on
+ `ef-lectionary`; what remains here is OF's own lectionary, not the
+ mechanism, which is now built and rite-agnostic.)
**All four behaviour items below are now RESOLVED** (RG 16(a) and
commemoration identity, closed on branch `ef-rg16a`; Holy Family/RG 112(a)
and observed identity, closed on branch `ef-rg112-rg110`; Holy Name of