diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-13 15:20:24 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-13 15:20:24 +0200 |
| commit | 36eba4eff58162cbe4c7b4ff1b9d049432fc1acc (patch) | |
| tree | aad8cd588a8a33202bfed990fec99d5eafc25dcd /CLAUDE.md | |
| parent | dc00d1f730b23fa99cd15ff142ecba515a9fe0b7 (diff) | |
| parent | 67855ae3125148116df870bf1a9abeac5b501d5b (diff) | |
| download | colitur-36eba4eff58162cbe4c7b4ff1b9d049432fc1acc.tar.gz colitur-36eba4eff58162cbe4c7b4ff1b9d049432fc1acc.zip | |
Merge branch 'ef-triduum-litanies': the Sacred Triduum's Latin identity
Gives Holy Thursday, Good Friday and Holy Saturday the names the Missal
prints for them, taken from each Office's own running header: 'Feria V
in Cena Domini', 'Feria VI in Passione et Morte Domini', 'Sabbato
sancto'. Rank and colour were already correct; only the identity was
missing, the same shape the Holy Family had. The slug is deliberately
unchanged -- it is the lectionary key -- and the names are Latin, which
avoids promoting an English value from the oracle the engine is checked
against.
Not 'Feria VI Parasceve': that phrase occurs zero times as a title in
either photographic scan, appearing only inside the Johannine Passion
text, and RG 132(a) writes 'feriae VI in Passione et Morte Domini'.
Output is byte-identical across all 8417 years -- colitur day prints no
name column -- but layer 5 does see it: describe gained name_la, and
reverting the change reddens six pins.
The Major Litanies (RG 80) and the Rogation Wednesday commemoration were
investigated to the same depth, scan-verified, cited, and deliberately
not built. Rogation Wednesday is genuinely blocked: Easter+38 coincides
with the Ascension Vigil, so no Fixed date-spec can anchor it. The Major
Litanies are tractable in the rite module -- the two blockers first
recorded for them were false, and are retracted here -- but 25 April is
St Mark, II class, so under RG 111(c) a privileged Litanies
commemoration would displace the day's existing ordinary commemoration
in ~97.7% of years. That blast radius is unmeasured, and measuring it is
the prerequisite for its own task.
Diffstat (limited to 'CLAUDE.md')
| -rw-r--r-- | CLAUDE.md | 110 |
1 files changed, 101 insertions, 9 deletions
@@ -449,18 +449,18 @@ nowhere in git (`docs/` is gitignored). failure mode, proven by fabricating a second companion and watching the whole suite stay green pre-fix). -5. **`Record` and `Liturgical_day` both claim to be "the single stable output +6. **`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`. -6. **`Temporal.RITE` and `Rite.t` are two competing abstractions.** The module +7. **`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. -7. **EF-shaped things still in "rite-agnostic" kernel code**: `validate.ml` +8. **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 @@ -474,12 +474,104 @@ Boniface 14 May, Evaristus, Theodore); and `romanus`, which should not exist on 9 August. lectio's ini is **generated from missalemeum**, so the two are one 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; Major Litanies -(25 April); the Rogation-Wednesday commemoration; RG 112(b)/(c)/(d) (only (a) -has a live witness this codebase's data can construct). Allow-list entries M11 -and M13 are `verdict open` by design. Holy Name of Jesus (RG 17(a)) and RG 110 -(inseparable Peter/Paul commemorations) are **RESOLVED — see item 4 above.** +**Unbuilt, recorded**: RG 91 entry 27's BVM Saturday Office; RG 112(b)/(c)/(d) +(only (a) has a live witness this codebase's data can construct). Allow-list +entries M11 and M13 are `verdict open` by design. Holy Name of Jesus (RG 17(a)) +and RG 110 (inseparable Peter/Paul commemorations) are **RESOLVED — see item 4 +above.** The Sacred Triduum's own identity is **RESOLVED — see item 5 below.** +Major Litanies (25 April) and the Rogation-Wednesday commemoration are +**NARROWED, still unbuilt — see item 5 below**: both rules are now +scan-verified and register-cited, but neither is built, because both need the +SAME missing machinery (a rite-computed, Easter-relative, non-competing +commemoration candidate — no channel in `Precedence.resolve`/`calendar.ml` +constructs one; sanctoral candidates are Fixed-date only, the day's temporal +candidate is exactly one and already spoken for). + +5. **The Sacred Triduum (RG 91 entry 2) — RESOLVED (2026-08-13, + `ef-triduum-litanies` task); Major Litanies (RG 80) and Rogation + Wednesday's own commemoration (RG 87-89) — established from a + photographic scan, deliberately NOT built.** Holy Thursday/Good + Friday/Holy Saturday kept their existing slugs + (`ef-passiontide-2-{thursday,friday,saturday}` — RG 91 entry 2 is + identified structurally by `Precedence_ef.band`, off rank and Easter + offset, never off the slug) and gained `Celebration.names` (Latin, both + photographic scans, corroborated by the electronic transcription's own + table-of-contents listing at the identical headings: "Feria V in Cena + Domini", "Feria VI in Passione et Morte Domini", "Sabbato Sancto") and + `subject = Lord` (verified safe: RG 112(a) only fires when both sides of + an occurrence are `Lord`, and no `Lord`-subject sanctoral entry has a + fixed date inside Holy Week's own movable range). **Full 1583-9999 + blast radius, measured (`git archive` pre- vs post-change, `colitur day` + CLI output diffed): ZERO differing lines anywhere in the domain** — the + CLI prints neither `names` nor `subject`, so this whole change is + invisible to the differential (layer 3), the oracle (layer 4), and even + the exhaustive property sweep (layer 2); only `test_golden.ml`'s + `describe` (widened this task to add a `name_la` field, the same lesson + its own `subject` field was added for) and one new `test_temporal_ef.ml` + unit test see it at all. Mutation-tested: reverting `temporal_ef.ml` + alone reddens 6 tests across those two files. + + Major Litanies (25 April, RG 80) and Rogation Wednesday's own + commemoration (RG 87-89, Minor Litanies) were both investigated to the + same depth and **both scan-verified and fully register-cited, but + deliberately not built**: RG 80's own transfer clause (25 April moving to + the following Tuesday whenever it coincides with Easter Sunday or Easter + Monday — **194 of 8,417 domain years, ≈2.3%, measured**, not assumed + rare) and Rogation Wednesday's own commemoration (RG 88/89, competing + only when the Ascension Vigil already occupies the day) both need a + commemoration candidate keyed to a MOVABLE, Easter-relative date that + is not the day's own temporal office — a kind of thing + `Precedence.resolve`'s architecture has no channel for: sanctoral + candidates come exclusively from `Layer.on_date`'s Fixed-`Date_spec` + lookup (`date_spec.ml`'s own header: Easter-relative forms "arrive with + the OF sanctoral" — not yet), and the day's temporal candidate is + exactly one, already spoken for. RG 110's own `rg110_additions` + mechanism (item 4 above) looks like a precedent but is not one: it only + ever RE-INCLUDES a candidate that already exists elsewhere in that + date's own candidate pool (both Peter and Paul are ordinary Fixed-date + sanctoral entries); neither the Major Litanies' Easter+2 target nor + Rogation Wednesday's own Mass commemoration has any such pre-existing + candidate to find. + + **The real reason to defer the Major Litanies, corrected by the + fix-round review** — the version above was wrong in two load-bearing + ways and is retracted: + + - It said the suppression half needs "a kernel signature extension + threading Easter-offset into `disposition`/`admit`". It does not. + `admit` **already** takes `~temporal` (added for exactly this class of + question during the RG 16(a) task) and `disposition` already takes + `~winner`; on 25 April in a transfer year both carry the Easter Sunday + or Easter Monday office. A rite-local slug test suppresses it with + **zero** kernel surface. + - It implied Easter Monday is unmarkable. Measured over the whole + domain: `ef-easter-1-monday` occurs **exactly 8 417 times in 8 417 + years** — once every year, never displaced, since it is an I-class + octave day — making it precisely as reliable a marker as + `ef-easter-sunday`. The stated asymmetry between the two trigger + conditions does not exist. + + So the **guarded** build (a `Commemoration_only` `Fixed(4,25)` entry, RG + 109(f) wired, plus slug-based suppression on the two Easter slugs) is a + strict improvement, not a regression: 8 223 years newly correct, 194 + unchanged, zero new wrong answers. "Worse than the recorded gap" was + true only of the *unguarded* build, which is the only option that was + scored. + + Deferring is still right, for a reason nobody had identified: **25 April + is St Mark, II class**, so under **RG 111(c)** a *privileged* Litanies + commemoration (RG 109(f)) would **displace** whatever ordinary + commemoration the day currently carries, in ≈97.7% of years — a live, + unmeasured blast radius straight through layers 3 and 4. That + measurement is the prerequisite, and it makes this its own task rather + than a rider on another. The 194 figure is exact and reproduced twice + (Easter = 25 April in 67 years, Easter Monday = 25 April in 127). + + Full reasoning: the `ef-triduum-litanies` task report and register + (Rogations/§4, and the two narrowed open items in §6). **Rogation + Wednesday remains genuinely blocked** — Easter+38 coincides with the + Ascension Vigil by construction, so there is no `(month, day)` pair a + `Fixed` spec could anchor to and no partial build exists at all. ## How to work here |
