From 9bc8f0ebbbd4031cc74e076ab9e9e80bd4fa43e6 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 13 Aug 2026 08:36:50 +0200 Subject: docs: Holy Family + RG112(a) resolved; layer 4 observed-identity gap closed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CLAUDE.md's own carried-item list (item 1, RG16(a)) named two open items it did not fix: 13 January mistagged Saint (independently fixed upstream by ef-rebootstrap, not this task) and RG 112 unimplemented. Both close now, plus a third: the 'know what each layer cannot see' section did not record that layer 4 (the missalemeum oracle) compared the observed day's rank and colour and never its identity -- exactly why the missing Holy Family went unnoticed by every layer for as long as it did. Recorded as a new, third RESOLVED item alongside RG16(a) and commemoration identity, with the same shape: what broke, what was found while fixing it, the measured blast radius, what stays open. docs/research/rules-register.md (gitignored, not part of this commit) carries the full account as its own new §6.2 -- the complete RG 91 entry 14 and RG 112 primary texts (all four sub-clauses, not only the two the register quoted before), the Holy Family Mass propers' own more specific 13-January rubric found while building this, and the independently cross-verified 1,220-day blast radius. --- CLAUDE.md | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 86 insertions(+), 21 deletions(-) (limited to 'CLAUDE.md') 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 ` 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 `, `temporal `, `day `. @@ -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 -- cgit v1.3 From 9df26e2e91646925c5977d4bab22c0d510d3b3c1 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 13 Aug 2026 09:22:36 +0200 Subject: test(oracle): fix round 1 (F8) -- correct the M18 headline, name the blind spot precisely The full breakdown, precisely: of 730 days, 331 are resolved (330 matching, 1 mismatched -- M13, Joseph vs the Seven Sorrows), 399 unresolved -- 373 in M18's own bucket, 26 absorbed inside M1/M2/M3/ M16's own widened subsets where the axis fires alongside their pre-existing citation. M18's own note previously stated only its own 373 without this fuller context. Also names the blind spot the axis exists to close in exact terms, not just "the observed day's identity": a TEMPORAL-origin observed day silently replaced by a DIFFERENT temporal-origin observed day of the SAME rank and colour -- exactly Holy Family's own shape, and the reason every prior layer stayed green through the whole gap. States explicitly what the count pin does and does not prove: it guards against the 373/399 population moving silently in either direction, but cannot say which specific day moved or why. --- CLAUDE.md | 8 ++++- data/ef/expected-divergences-missalemeum.sexp | 2 +- test/test_oracle.ml | 52 ++++++++++++++++----------- 3 files changed, 40 insertions(+), 22 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index 20f3ebf..8915bc6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -124,7 +124,13 @@ against missalemeum; layer 5 pins ~30 dates. 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 + counted and allow-listed (`M18`), never silently skipped. Full breakdown: + 331 of 730 days resolved (330 matching, 1 mismatched — Joseph vs the Seven + Sorrows, `M13`), 399 unresolved (373 in `M18`, 26 absorbed inside four + other entries' own widened subsets). The blind spot, precisely: a + TEMPORAL-origin observed day silently replaced by a DIFFERENT + temporal-origin observed day of the SAME rank and colour — exactly Holy + Family's own shape. 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 diff --git a/data/ef/expected-divergences-missalemeum.sexp b/data/ef/expected-divergences-missalemeum.sexp index d7a1c8c..15f9cf2 100644 --- a/data/ef/expected-divergences-missalemeum.sexp +++ b/data/ef/expected-divergences-missalemeum.sexp @@ -165,5 +165,5 @@ ((id M18) (citation "test_oracle.ml's own header, \"COMMEMORATION IDENTITY\" section, restated for the OBSERVED axis (ef-rg112-rg110 task) -- not an RG citation, a comparator LIMIT: Rite_ef.Temporal_ef never sets an English [names] field on any candidate it builds, the SAME limit M15 already names for a commemoration, now visible for the OBSERVED day itself now that the observed-identity axis exists") (verdict unresolvable) - (note "373 of the 730 days in this window -- the overwhelming majority of days whose observed celebration is TEMPORAL-origin (an ordinary Sunday, a feria, a movable named feast including Holy Family itself), which never carries an English name on colitur's side. Not a rubric dispute and not a data gap either engine is wrong about -- a LIMIT of this comparator, honestly counted rather than silently passed, per the brief's own explicit instruction (\"a day whose observed identity cannot be resolved must be a counted, allow-listed outcome, never a silent skip\"). Gated on the diff SHAPE alone (exactly, and only, observed-identity-unresolved), not a literal date list the way every other entry in this file is -- at this population size a date list would itself be the \"pattern that could silently widen\" this file's own header warns against, for the opposite reason a date RANGE is normally risky: the predicate (colitur's own resolved name is [None]) is the precise, falsifiable evidence, the same shape M2's own title-substring predicate already uses instead of enumerating dates, just keyed on presence-of-a-name rather than a title string. Building an English name onto every temporal-cycle candidate (a data/lectionary-bootstrap task, Plan 4, out of this task's scope -- register §6, the same open item M15's own note already tracks) would resolve this entry to Matched for every one of these days it does not instead expose as a REAL divergence (Holy Family's own two dates in this window, 2026-01-11 and 2027-01-10, are counted here, not separately -- the name comparison genuinely cannot distinguish \"Holy Family\" from any other unnamed Sunday, so proving Holy Family's own correctness rests on the golden pins and the differential's own C15, not this axis). Derived directly from the comparator's own failure output (test_layer_m_counts_match_citations), not hand-counted first and cross-checked after: 373.") + (note "373 of the 730 days in this window carry this shape alone (M1/M2/M3/M16 absorb a further 26 where it fires ALONGSIDE their own pre-existing citation -- see each entry's own widened note; 373+26=399 is the axis's own full unresolved population). CORRECTED, fix round 1 (coordinator finding 8) -- the full breakdown, precisely: of 730 days, 331 are RESOLVED (colitur's own observed celebration carries a name) -- 330 resolved-and-MATCHING, 1 resolved-and-MISMATCHED (M13, Joseph vs the Seven Sorrows, already its own entry above) -- and 399 are UNRESOLVED (colitur's own name is [None]), split between this entry's own 373 and the 26 absorbed elsewhere. The BLIND SPOT this axis exists to close, stated precisely: a TEMPORAL-origin observed day silently replaced by a DIFFERENT temporal-origin observed day of the SAME RANK AND COLOUR -- exactly the shape that hid Holy Family from every layer before this task (rank 2/white on both sides, purely coincidental). This count PIN is what stands guard against that population growing silently in either direction: an implementation change that made MORE days temporal-origin-and-unresolvable, or fewer, changes 373 and fails the pin, even though the axis itself cannot say WHICH specific day moved or why. The overwhelming majority of days whose observed celebration is TEMPORAL-origin (an ordinary Sunday, a feria, a movable named feast including Holy Family itself) never carry an English name on colitur's side -- not a rubric dispute and not a data gap either engine is wrong about, a LIMIT of this comparator, honestly counted rather than silently passed, per the brief's own explicit instruction (\"a day whose observed identity cannot be resolved must be a counted, allow-listed outcome, never a silent skip\"). Gated on the diff SHAPE alone (exactly, and only, observed-identity-unresolved), not a literal date list the way every other entry in this file is -- at this population size a date list would itself be the \"pattern that could silently widen\" this file's own header warns against, for the opposite reason a date RANGE is normally risky: the predicate (colitur's own resolved name is [None]) is the precise, falsifiable evidence, the same shape M2's own title-substring predicate already uses instead of enumerating dates, just keyed on presence-of-a-name rather than a title string. Building an English name onto every temporal-cycle candidate (a data/lectionary-bootstrap task, Plan 4, out of this task's scope -- register §6, the same open item M15's own note already tracks) would resolve this entry to Matched for every one of these days it does not instead expose as a REAL divergence (Holy Family's own two dates in this window, 2026-01-11 and 2027-01-10, are counted here, not separately -- the name comparison genuinely cannot distinguish \"Holy Family\" from any other unnamed Sunday, so proving Holy Family's own correctness rests on the golden pins and the differential's own C15, not this axis). Derived directly from the comparator's own failure output (test_layer_m_counts_match_citations), not hand-counted first and cross-checked after: 373.") (expected_rows 373)) diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 7068af9..35d4501 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -733,26 +733,38 @@ let m16_dates = [ "2026-03-27" ] TEMPORAL-origin one -- an ordinary Sunday, a feria, a movable named feast including Holy Family itself -- never does ({!Rite_ef.Temporal_ef}'s own [build] has no [en "..."] string anywhere in it, this file's own header - again). That is the OVERWHELMING majority of days in any calendar (saints' - feasts are common, but far from every day), so this is a single - STRUCTURAL predicate -- [Observed_identity_unresolved] alone, nothing - else disagreeing -- not a literal date list the way every other entry in - this file is: at 374 of the 730 days in this window, a list would be - exactly the "range/pattern that could silently widen" this file's own - header explicitly avoids elsewhere, for the OPPOSITE reason a range is - normally risky here -- the predicate itself (colitur's own name is - [None]) is the precise, falsifiable evidence, the same shape [M2]'s own - title-substring predicate already uses instead of a date list, just keyed - on presence-of-a-name rather than a title string. NOT a rubric dispute - and NOT a data gap either engine is wrong about -- a LIMIT of this - comparator itself, honestly counted rather than silently passed, per the - brief's own explicit instruction ("a day whose observed identity cannot - be resolved must be a counted, allow-listed outcome, never a silent - skip"), the SAME discipline [M15] already established for an unresolvable - COMMEMORATION, applied here for the first time to the OBSERVED day. Fixing - this at the root (giving every temporal-cycle candidate an English name) - is a data/lectionary-bootstrap task (Plan 4), not something this - comparator can do for itself -- register §6 tracks it, the same open item + again). CORRECTED, fix round 1 (coordinator finding 8) -- the precise + breakdown: of this window's 730 days, 331 are RESOLVED (330 matching, 1 + mismatched, [M13]); 399 are UNRESOLVED, split between this entry's own + 373 (the axis's sole disagreement) and 26 absorbed inside [M1]/[M2]/[M3]/ + [M16]'s own widened subsets, where it fires ALONGSIDE their pre-existing + citation. The BLIND SPOT this axis exists to close, stated precisely: a + TEMPORAL-origin observed day silently replaced by a DIFFERENT + temporal-origin observed day of the SAME RANK AND COLOUR -- exactly the + shape that hid Holy Family from every layer before this task. This is + the OVERWHELMING majority of days in any calendar (saints' feasts are + common, but far from every day), so this is a single STRUCTURAL + predicate -- [Observed_identity_unresolved] alone, nothing else + disagreeing -- not a literal date list the way every other entry in this + file is: at this population size, a list would be exactly the + "range/pattern that could silently widen" this file's own header + explicitly avoids elsewhere, for the OPPOSITE reason a range is normally + risky here -- the predicate itself (colitur's own name is [None]) is the + precise, falsifiable evidence, the same shape [M2]'s own title-substring + predicate already uses instead of a date list, just keyed on + presence-of-a-name rather than a title string. NOT a rubric dispute and + NOT a data gap either engine is wrong about -- a LIMIT of this comparator + itself, honestly counted rather than silently passed, per the brief's own + explicit instruction ("a day whose observed identity cannot be resolved + must be a counted, allow-listed outcome, never a silent skip"), the SAME + discipline [M15] already established for an unresolvable COMMEMORATION, + applied here for the first time to the OBSERVED day. The count pin below + ([test_layer_m_counts_match_citations]) is what stands guard against this + population growing (or shrinking) silently -- it cannot say WHICH day + moved or why, only that the total did. Fixing this at the root (giving + every temporal-cycle candidate an English name) is a data/lectionary- + bootstrap task (Plan 4), not something this comparator can do for itself + -- register §6 tracks it, the same open item [M15]'s own note already points to. *) let layer_m_reason (c : colitur_row) (o : oracle_row) diffs = if diffs = [] then None -- cgit v1.3 From 6d7c201e54006514c7cf80c706dc9bc9b60c5abb Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 13 Aug 2026 09:23:41 +0200 Subject: docs: fix round 1 (F9) -- Holy Name of Jesus is missing a real office, not just a name A second, more severe gap than the identity-shaped one already recorded: RG 17(a)'s own 2-5 January window, unlike Holy Family's 7-13 January (never empty, register section 6.2), CAN be empty of a Sunday -- the calendarium carries an explicit fallback for it ("vel, ea deficiente, die 2 ianuarii") that colitur does not implement at all. Independently computed (matched the reviewer's own figure exactly): 3,619 of 8,417 domain years have no Sunday in 2-5 January, and colitur emits no Holy Name office whatsoever in any of them -- a genuine missing II-class feast on 43% of years, not merely an unnamed generic Sunday the way Holy Family's own pre-task gap was. Recorded in the register (gitignored, not part of this commit) and CLAUDE.md's carried-item list; out of this task's own dispatched scope (Holy Family and RG 112 only), not fixed here. --- CLAUDE.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index 8915bc6..faec251 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -363,7 +363,16 @@ nowhere in git (`docs/` is gitignored). 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). + about it the way Holy Family's own Baptism collision was). **A SECOND, + more severe Holy Name gap, found in review (fix round 1, coordinator + finding 9): unlike RG 17(b)'s own 7–13 January window (never empty), + RG 17(a)'s narrower 2–5 January window CAN be empty of a Sunday, and the + calendarium carries an explicit fallback ("vel, ea deficiente, die 2 + ianuarii") colitur does not implement at all — 3 619 of 8 417 years in + the domain (independently computed, matched exactly) have NO Holy Name + office whatsoever, a genuine missing II-class feast on 43% of years, not + merely an unnamed one. Recorded, not fixed — out of this task's own + dispatched scope. **Structural items, cheapest to fix before OF exists:** @@ -398,8 +407,12 @@ inseparable commemorations; Major Litanies (25 April); the Rogation-Wednesday 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. +exists for it in today's data; **Holy Name of Jesus also has no RG 17(a) fallback +for its own 2–5 January window when it is empty of a Sunday (unlike RG 17(b)'s +7–13 January, never empty) — 3 619 of 8 417 domain years have no Holy Name office +at all, found in review (fix round 1, finding 9), a genuine missing II-class +feast, not merely an unnamed one.** Allow-list entries M11 and M13 are `verdict +open` by design. ## How to work here -- cgit v1.3 From e30a4be5a2594fb3b6c4b51345d138cd89ba78ad Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 13 Aug 2026 09:57:57 +0200 Subject: docs: two retracted claims that outlived their retraction Both are the defect class this fix round existed to close, which is why they are worth recording rather than quietly overwriting. CLAUDE.md still carried F1's retracted design rationale -- describing entry_14_movable_band as "negative so it can never collide with a real table position" -- and F2's retracted transcription-defect attribution, verbatim, in the one tracked file the project's own workflow tells a fresh session to read first. The fix round struck both everywhere else and missed this file. A session following it as instructed could have re-derived the negative sentinel for entry 20's or entry 23's movable half and re-introduced the inversion in a new branch. precedence_ef.ml's replacement justification for the x10 rescale then introduced a fresh misstatement of the same primary text it was correcting: it attributed "primum mobilia, deinde fixa" to "entry 12's own ninth sub-item" and counted three such rows. Both photographic scans, and the register's own section 4 table, put that clause at entry 13; entry 12 has eight sub-items and no such clause. The split occurs at five rows -- 13, 14, 20, 23's third sub-item, and 24. Entry 24 is the most-evaluated band in the whole domain and is unsplit in the code, which is precisely the sub-rank the new headroom exists to hold. Corrected in the .mli and the register too. No behaviour change; 290 tests green. --- CLAUDE.md | 35 +++++++++++++++++++++++++---------- lib/rites/rite_ef/precedence_ef.ml | 19 ++++++++++++++----- lib/rites/rite_ef/precedence_ef.mli | 7 +++++-- 3 files changed, 44 insertions(+), 17 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index faec251..54ae709 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -339,17 +339,32 @@ nowhere in git (`docs/` is gitignored). 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. + gained a movable-half priority for entry 14 — without it, Holy Family + would tie with the fixed Commemoration of the Baptism of the Lord + (13 January) and lose the kernel's alphabetical tie-break, backwards + from RG 91's own stated order. **The whole table is now scaled ×10** + (entry *n* → 10*n*), so a half-row is expressed as an ordinary position + between its neighbours. *(CORRECTED: this paragraph previously described + `entry_14_movable_band` as "negative so it can never collide with a real + table position". That was the bug, not the design — a negative sentinel + avoids **collision** but also inverts **ordering**, making a movable + II-class feast of the Lord outrank every I-class day. Unreachable on + universal data; live the moment a diocesan overlay puts a I-class proper + or indult feast, RG 91 entries 12–13, in the 7–13 January window. Do not + re-derive the sentinel approach.)* `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). + commemoration of another mystery of the SAME Divine Person). The primary + authority is **RG 95 ¶2** — *"Si vero duo festa eiusdem Divinæ Personæ… + fit de festo, quod in tabella præcedentiæ superiorem obtinet locum, et + aliud omittitur"* — an occurrence-level rule present in all three + documents; RG 112(a) and the Holy Family Mass propers' own 13-January + rubric corroborate it. *(CORRECTED: this previously called the propers' + rubric a further instance of the transcription defect. It is not. The + transcription carries RG 112 in full; RG 112 has no worked example in + either scan; and the propers' note is absent because that document is a + partial 2006 web capture containing almost no propers text — one + `Introitus` in 26 322 lines against 52 in a scan. Diagnose the cause of a + silence before invoking the rule.)* **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 diff --git a/lib/rites/rite_ef/precedence_ef.ml b/lib/rites/rite_ef/precedence_ef.ml index 635a69f..374e9a4 100644 --- a/lib/rites/rite_ef/precedence_ef.ml +++ b/lib/rites/rite_ef/precedence_ef.ml @@ -74,11 +74,20 @@ let unclassified = max_int TIMES TEN (entry 1 -> 10, entry 28 -> 280, {!unclassified} untouched at [max_int]) instead of the bare 1..28 -- not an arbitrary rescale, a deliberate one: RG 91's own text records a "primum mobilia, deinde - fixa" (movable-then-fixed) split at THREE rows, not only this one -- - entry 12's own ninth sub-item ("Festa indulta I classis, primum - mobilia, deinde fixa"), entry 14 (this one), and entry 20 ("indult - II-class feasts (movable then fixed)", register §4's own summary) -- - and only entry 14 has a live witness in this codebase's data today. The + fixa" (movable-then-fixed) split at FIVE rows, not only this one -- + entry 13 ("Festa indulta I classis, primum mobilia, deinde fixa", its + own numbered row on both scans), entry 14 (this one), entry 20, entry + 23's third sub-item ("deinde festa indulta, primum mobilia, deinde + fixa"), and entry 24 ("Festa III classis, in calendario Ecclesiae + universae inscripta, primum mobilia, deinde fixa") -- and only entry 14 + has a live witness in this codebase's data today. NOTE, corrected by the + fix-round re-review: this comment previously said THREE rows and + attributed the first to "entry 12's own ninth sub-item". Both scans, and + the register's own §4 table, put that clause at entry 13; entry 12 has + eight sub-items and no such clause. Entry 24's split is the notable + omission -- it is the most-evaluated band in the whole domain and is + unsplit here, which is exactly the kind of sub-rank this headroom exists + for. The ×10 scale reserves nine integers of genuine headroom immediately BEFORE each real entry's own value for exactly this kind of sub-rank, without requiring a second rescale if entry 12's or entry 20's own movable half diff --git a/lib/rites/rite_ef/precedence_ef.mli b/lib/rites/rite_ef/precedence_ef.mli index 7d0bc98..6a96c4e 100644 --- a/lib/rites/rite_ef/precedence_ef.mli +++ b/lib/rites/rite_ef/precedence_ef.mli @@ -80,8 +80,11 @@ val entry_14_fixed_band : int was built to beat. {!band}'s own entries now use the real RG 91 number TIMES TEN throughout, reserving genuine headroom before every entry -- see precedence_ef.ml's own comment for the full citation, the counter- - example that found this, and why entries 12 and 20 may need the same - treatment if their own "movable then fixed" halves ever get a witness. *) + example that found this, and why entries 13, 20, 23 and 24 may need the + same treatment if their own "movable then fixed" halves ever get a + witness. (Corrected: this previously said "entries 12 and 20". RG 91 + puts that clause at entry 13, not 12, and the split occurs at five rows + in all -- 13, 14, 20, 23's third sub-item and 24.) *) val entry_14_movable_band : int (** [band ctx c]: RG 91's Table of Precedence. Returns the table's own entry -- cgit v1.3