summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CLAUDE.md107
1 files changed, 86 insertions, 21 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index 4fb93f9..20f3ebf 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -113,6 +113,22 @@ against missalemeum; layer 5 pins ~30 dates.
the week column. It also **shares colitur's own lineage**: colitur's data was
bootstrapped from lectio, so an error both inherited is invisible here. Proven:
Holy Thursday was violet in both because both were wrong.
+- **Layer 4's OBSERVED-identity gap is CLOSED** (2026-08-13, branch
+ `ef-rg112-rg110`, register §6.2): it used to compare the observed day's rank
+ and colour and stop there — never whether it is actually the RIGHT day. Holy
+ Family (RG 17(b), missing from colitur entirely until this task) was rank
+ 2/white on both sides purely by coincidence (an ordinary, unnamed Sunday
+ and Holy Family share both), so this layer stayed silently green through
+ the whole gap's lifetime. Now compares `Celebration.t.names` against
+ missalemeum's own title, same mapping/limits as the commemoration-identity
+ fix below: resolvable only for a SANCTORAL-origin observed day; a
+ TEMPORAL-origin one (an ordinary Sunday, a feria, a movable named feast —
+ 373 of 730 days in the 2026–2027 window) is `Observed_identity_unresolved`,
+ counted and allow-listed (`M18`), never silently skipped. Teeth proved and
+ reverted: corrupting one sanctoral saint's own English name on an OBSERVED
+ day (rank/colour untouched) reddened the suite immediately with an
+ `observed-identity-mismatch` and nothing else — the exact shape the
+ pre-strengthening comparator would have slept through completely.
- **Layer 4's commemoration-identity gap is CLOSED** (2026-08-12, Task B, branch
`ef-rg16a`, two fix rounds): it used to compare presence/count only, never
*which* commemoration won — reversing `admit`'s dignity sort (the engine
@@ -189,16 +205,18 @@ validation layers** are built. `colitur day <year>` emits a full resolved year.
transfers need whole-year knowledge, so per-date resolution cannot be correct).
**EF rite module** (`lib/rites/rite_ef`): `vocab_ef` (8 RG-cited seasons, 4
-classes) · `temporal_ef` (season boundaries RG 71–77, named feasts, Sunday slugs,
-week numbering, the resumed-Sunday tail, ferias, four Ember sets, Rogations,
-`anchors`) · `precedence_ef` (the full RG 91 28-entry table, occurrence RG 92–95,
-commemorations RG 108–111, transfers RG 96–98) · `rite_ef` (the bundle).
+classes) · `temporal_ef` (season boundaries RG 71–77, named feasts including
+Holy Family (RG 17(b)), Sunday slugs, week numbering, the resumed-Sunday tail,
+ferias, four Ember sets, Rogations, `anchors`) · `precedence_ef` (the full RG 91
+28-entry table including entry 14's movable/fixed split, occurrence RG 92–95,
+commemorations RG 108–112, transfers RG 96–98) · `rite_ef` (the bundle).
**Data**: `data/ef/sanctoral.sexp` (322 entries, bootstrapped from lectio, SHA-256
in its provenance header) · `data/ef/adjustments.sexp` (overlay) · two cited
-allow-lists, `expected-divergences.sexp` (11 entries, vs lectio) and
-`expected-divergences-missalemeum.sexp` (14, vs the oracle). Fixtures live in
-`test/fixtures/` with asserted SHA-256s.
+allow-lists, `expected-divergences.sexp` (5 active entries, vs lectio — C1, C6,
+C8, C14, C15; several more closed and recorded in the register, not deleted) and
+`expected-divergences-missalemeum.sexp` (12 active, vs the oracle). Fixtures
+live in `test/fixtures/` with asserted SHA-256s.
**CLI**: `colitur easter <year>`, `temporal <year>`, `day <year>`.
@@ -229,10 +247,11 @@ dune exec colitur -- day 2026 | head
- **Plan 4 — OF rite module** (proves `RITE` generalizes) → the lectionary
bootstrap and citations → full output/rendering → hardening and a first tag.
- **Both behaviour items below are now RESOLVED** (RG 16(a) and commemoration
- identity, closed on branch `ef-rg16a`) — kept here as the record of what the
- five layers, taken together, used to sleep through, and as the shape a
- future gap of the same kind would need to be caught by.
+ **All three 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`) — kept here as
+ the record of what the five layers, taken together, used to sleep through,
+ and as the shape a future gap of the same kind would need to be caught by.
### Carried into Plan 4 (read before starting)
@@ -242,7 +261,7 @@ triage, and the whole-branch review — is in
workspace is deliberately kept, because it and the register corrections exist
nowhere in git (`docs/` is gitignored).
-**The two behaviour items, in order:**
+**The three behaviour items, in order:**
1. **RG 16(a) — RESOLVED (RG16(a) task, branch `ef-rg16a`, 2026-08-12; ONE
FIX ROUND of review after the first pass — see register §6.0 for the full,
@@ -271,11 +290,12 @@ nowhere in git (`docs/` is gitignored).
of the Dedication of a Church's own classification (*"Festum
Dedicationis Ecclesiae est festum Domini"*) means St Michael's Dedication
(29 Sep) may also be `Lord`, not `Saint` — measured, not applied (1 200
- days domain-wide if it were). Two further open items recorded, not fixed:
- 13 January (Baptism of the Lord, mistagged `Saint`, and separately, RG 112
- — a feast/mystery of one Divine Person excludes a commemoration of
- another of the SAME Person — entirely unimplemented, confirmed live on 7
- real years).
+ days domain-wide if it were). Two further open items were recorded here,
+ not fixed at the time: 13 January (Baptism of the Lord, mistagged
+ `Saint`) and RG 112, unimplemented. **Both are now RESOLVED — see item 3
+ below.** (The `Saint` mistag turned out to be independently fixed by the
+ `ef-rebootstrap` re-bootstrap, upstream of item 3's own task; RG 112 is
+ item 3's own work.)
2. **Commemoration identity — RESOLVED (Task B, branch `ef-rg16a`, 2026-08-12;
ONE FIX ROUND of review after the first pass — see register §6.1 for the
full, corrected account).** Was unasserted outside ~3 test rows — **the
@@ -297,21 +317,62 @@ nowhere in git (`docs/` is gitignored).
figure: 599 is the tie POPULATION, 65 (or 67) the real ADMITTED-SET
decisions within it, 149 order-only — all now independently reproduced
(register §6.1), not merely asserted.
+3. **Holy Family (RG 17(b)) + RG 112(a) + layer 4's observed-identity gap —
+ RESOLVED (2026-08-13, branch `ef-rg112-rg110`; see register §6.2 for the
+ full account).** Holy Family did not exist anywhere in colitur — a `grep`
+ found no trace in `lib/` or `data/`, and the day it should have observed
+ emitted an ordinary Sunday instead, undetected because **layer 4 compared
+ the observed day's rank and colour, never its identity** (Holy Family is
+ rank 2/white on both sides purely by coincidence — see the "know what
+ each layer cannot see" section above, closed first, as the regression
+ net, before any production code changed). Built: `Temporal_ef.temporal`'s
+ existing Sunday-fallback branch already computed the right slug/rank/
+ colour for 7-13 January by coincidence; the only silently-wrong field was
+ `subject` (always `Temporal`), now `Lord` on `holy_family_sunday y`
+ (`RG 91 entry 14`, "primum mobilia, deinde fixa") alone. RG 17(b)'s own
+ window can never be empty of a Sunday (unlike RG 17(a)'s Holy Name,
+ which carries an explicit calendarium fallback for its own narrower
+ window) — checked, not assumed; no fallback built. `Precedence_ef.band`
+ gained a movable-half priority for entry 14 (`entry_14_movable_band`,
+ negative so it can never collide with a real table position) — without
+ it, Holy Family would tie with the fixed Commemoration of the Baptism of
+ the Lord (13 January) at the literal integer 14 and lose the kernel's own
+ alphabetical tie-break, backwards from RG 91's own stated order.
+ `disposition` gained RG 112(a) (a mystery of one Divine Person excludes a
+ commemoration of another mystery of the SAME Divine Person) — directly
+ confirmed by a MORE SPECIFIC primary source found while building this,
+ the Holy Family Mass propers' own 13-January rubric (both photographic
+ scans, absent from the electronic transcription along with RG 112(a)'s
+ own worked example — the transcription-defect pattern found again, §6.-1).
+ **Blast radius, measured (`git archive` pre-change binary vs HEAD, full
+ 1583–9999 sweep, diffed): 1 220 days, every single one the identical
+ shape, cross-verified against `date -d` independently (exactly 1 220
+ years have 13 January on a Sunday) — no anomaly, nothing outside what
+ was expected.** The differential's own C1 (the 6-13 January blanket) lost
+ exactly those 7 (of the 1 220) rows within its 2005–2050 window and they
+ were split into their own new cited entry (C15), not silently
+ re-absorbed — the same discipline the task brief demanded. Not built:
+ RG 110 (inseparable Peter/Paul, still open, M12) — out of this task's own
+ dispatched scope despite the branch name. Holy Name of Jesus (RG 17(a))
+ has the identical "generic-Sunday-slug masking a real named feast" shape
+ Holy Family had — flagged as a new open item, not fixed here (no live
+ collision exists for it in today's data, so nothing is currently WRONG
+ about it the way Holy Family's own Baptism collision was).
**Structural items, cheapest to fix before OF exists:**
-3. **`Record` and `Liturgical_day` both claim to be "the single stable output
+4. **`Record` and `Liturgical_day` both claim to be "the single stable output
schema".** `Record` cannot express what the engine now computes (no observed
celebration, no commemorations, no transfers), has **no test file**, and is
used only by the legacy `colitur temporal` path — `day` hand-formats instead.
Plan 2's carried item (add a `cycle` field for OF's Sunday A/B/C and weekday
I/II) is still open and now costlier: it must pass through `Temporal.t`, which
is embedded in the sexp-derived `Liturgical_day.t`.
-4. **`Temporal.RITE` and `Rite.t` are two competing abstractions.** The module
+5. **`Temporal.RITE` and `Rite.t` are two competing abstractions.** The module
type still exists and `temporal_ef` still satisfies it, but it carries none of
`rules`, `anchors`, `season_runs`, `transfer_target` — satisfying it now proves
almost nothing. `Rite.t` is the load-bearing one.
-5. **EF-shaped things still in "rite-agnostic" kernel code**: `validate.ml`
+6. **EF-shaped things still in "rite-agnostic" kernel code**: `validate.ml`
hardcodes Sunday as the week start; `Liturgical_day.transferred_in` is an
`option` justified by RG 96; `Precedence.privilege` is defined by RG 111;
`Repose` is EF vocabulary emitted by nothing. Each is one field short of the
@@ -328,7 +389,11 @@ lineage, not two independent sources.
**Unbuilt, recorded**: the Sacred Triduum has no proper office (it uses ordinary
Passiontide ferial slugs); RG 91 entry 27's BVM Saturday Office; RG 110's
inseparable commemorations; Major Litanies (25 April); the Rogation-Wednesday
-commemoration. Allow-list entries M11 and M13 are `verdict open` by design.
+commemoration; Holy Name of Jesus (RG 17(a)) still carries `subject = Temporal`
+like an ordinary Sunday, the same identity gap Holy Family had until this task,
+found while closing it (register §6.2) but not itself fixed — no live collision
+exists for it in today's data. Allow-list entries M11 and M13 are `verdict open`
+by design.
## How to work here