From f37c9126292670def8e7a43903b99721181556a5 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 13 Aug 2026 20:16:04 +0200 Subject: docs: CLAUDE.md for the Major Litanies Records RG80/109(f) as RESOLVED (was "NARROWED, deliberately not built"), corrects a mis-citation carried in that entry (RG111(b), not RG111(c), is the clause that makes a privileged Litanies commemoration displace St Mark's own ordinary one), and narrows the shared "no channel for a movable, Easter-relative commemoration candidate" blocker to Rogation Wednesday alone -- the Major Litanies' own version of that blocker dissolved by reusing the existing RG96 transfer machinery, a route not available to Rogation Wednesday (nothing there is being transferred FROM a fixed civil date). Adds a "know what each layer cannot see" bullet: layer 3 (lectio) is entirely blind to this whole change; layer 4 (missalemeum) sees the entity and the RG111(b) question but is blind to the transfer specifically, confirmed by mutation, since neither year in its 2026-2027 fixture window is a trigger year. Updates the stale Plan-3-era test count and the allow-list summary (expected-divergences-missalemeum.sexp now 12 active entries, M5 corrected, M20 added, M18's count adjusted). --- CLAUDE.md | 179 ++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 97 insertions(+), 82 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index 7875fbe..74f6a40 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -169,6 +169,20 @@ against missalemeum; layer 5 pins ~30 dates. `band`'s own `Commemoration_only` guard (below) also turns it red, on the same date this whole gap was originally found through — both reverted after confirming. +- **Major Litanies (RG 80/109(f), `ef-major-litanies` task): layer 3 is + entirely BLIND to a commemoration-only entity, confirmed not merely + argued** — lectio computes no Major Litanies at all, and its own `row` + type carries no commemorations field in the first place (limit 1, same + file). `data/ef/expected-divergences.sexp` needed no change; a whole new + privileged commemoration, present or absent, present-but-displacing-a- + saint, or transferring to a different date entirely, is genuinely + invisible to that layer. Layer 4 (missalemeum) sees the entity and the + RG 111(b) question (both years in its 2026-2027 window), but is ALSO + blind to the transfer specifically, because neither year in that window + is a trigger year — confirmed by mutation (disabling the transfer + branch produced zero oracle failures), not merely by the calendar + coincidence. Only golden pins see the transfer at all. Full account: + `.superpowers/sdd/2026-08-12-colitur-rg16a/major-litanies-report.md`. - **The `admit` same-rank tie-break is RG 113, not an uncited convention** (same task, fix round 1): RG 113's own second sentence ("in admittendis et ordinandis aliis commemorationibus, servetur ordo tabellae praecedentiae"), previously @@ -196,8 +210,13 @@ against missalemeum; layer 5 pins ~30 dates. ## Current state (Plans 1–3 DONE — verify with `git log`) -**Plans 1 + 2 are on `main` (35 commits). Plan 3 is branch `ef-plan3`, 42 commits, -259 tests green** (260 with the exhaustive sweep). The kernel, the **complete EF +**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 +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 validation layers** are built. `colitur day ` emits a full resolved year. @@ -231,12 +250,16 @@ commemorations RG 108–112, transfers RG 96–98) · `rite_ef` (the bundle). in its provenance header) · `data/ef/adjustments.sexp` (overlay — `Add` as well as `Suppress`/`Edit`: RG 110's own 30 June companion, `commemoration-of-st-peter`, is genuinely missing from lectio's own source, not merely from colitur's -bootstrap, so it is hand-authored here rather than upstream) · two cited +bootstrap, so it is hand-authored here rather than upstream; `Add major-litanies`, +`ef-major-litanies` task, RG 80/81, same reasoning) · two cited allow-lists, `expected-divergences.sexp` (7 active entries, vs lectio — C1, C6, C8, C14, C15, C16, C17; several more closed and recorded in the register, not -deleted) and `expected-divergences-missalemeum.sexp` (11 active, vs the oracle — +deleted — untouched by the Major Litanies, layer 3 is blind to that entity, see +above) and `expected-divergences-missalemeum.sexp` (12 active, vs the oracle — M2 closed/M18 widened by the `ef-bvm-saturday` task; M12 closed/M19 opened by an -earlier one). Fixtures live in `test/fixtures/` with asserted SHA-256s. +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 `, `temporal `, `day `. @@ -474,24 +497,27 @@ 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**: 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.** RG 91 entry 27's -BVM Saturday Office is **RESOLVED — see item 9 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). +**Unbuilt, recorded**: RG 112(b)/(c)/(d, non-BVM half) (only (a) and (d)'s +BVM half have 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.** RG 91 entry 27's BVM Saturday Office is **RESOLVED — see +item 9 below.** The Major Litanies (25 April, RG 80/109(f)) are **RESOLVED +— see item 5 below.** +Rogation Wednesday's own commemoration (RG 87-89) **remains genuinely +unbuilt** — see item 5 below: the Major Litanies' own "no third channel" +blocker turned out to be dissolved by REUSING the existing RG 96 transfer +machinery rather than by adding the missing channel, but that reuse is not +available to Rogation Wednesday, whose trigger is not a fixed civil date at +all (it is the day's own temporal identity, Easter+38, which coincides +structurally with the Ascension Vigil) — confirmed still blocked for the +original, distinct architectural reason. 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 + `ef-triduum-litanies` task); Major Litanies (RG 80/81/109(f)) — + RESOLVED (2026-08-13, `ef-major-litanies` task); Rogation Wednesday's + own commemoration (RG 87-89) remains genuinely unbuilt.** 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 @@ -512,67 +538,56 @@ candidate is exactly one and already spoken for). 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. + **Major Litanies (25 April, RG 80/81/109(f)) — RESOLVED (2026-08-13, + `ef-major-litanies` task).** The "no channel for a movable, + Easter-relative commemoration candidate" blocker this entry previously + recorded (and the item-5 header used to describe as blocking BOTH the + Litanies and Rogation Wednesday) turned out to be dissolved by a + DIFFERENT design, not by adding the missing channel: RG 80's own + transfer is structurally the SAME operation RG 96 already performs for + an impeded I-class feast (a losing candidate relocated to a named later + date), so it is built by REUSING `Precedence.disposition`'s existing + `Transfer` constructor and `Calendar`'s existing placement machinery, + with a fixed target (Easter+2) instead of a searched one — no new + `Date_spec` variant, no third candidate stream. Entity: + `Commemoration_only`, `Fixed(4,25)`, `data/ef/adjustments.sexp`'s `Add + major-litanies`. **The genuine reason to defer, correctly identified by + an earlier fix-round review** (25 April is St Mark, II class, so RG + 111(b) — not (c), a citation this task corrected — makes a privileged + Litanies commemoration DISPLACE Mark's own ordinary one whenever both + compete) **is now measured and adjudicated**: full domain blast radius + (1583-9999, zero unclassified findings) is 7 394 years the Litanies + simply appear, 829 years they displace Mark (4 of them, 2010/2021/ + 2027/2032, in the 2005-2050 window), 194 origin departures + 194 + target arrivals for the transfer (the same 194 figure this entry + already had, now independently re-derived through the real + `Calendar`/`Precedence` pipeline). The Sunday-displacement question + itself (RG 111(b): does a privileged commemoration categorically + override an ordinary II-class one, or does missalemeum's own + divergent data mean otherwise?) is ADJUDICATED colitur, honestly + flagged as the first real (non-synthetic) test of that specific admit + clause — see the "know what each layer cannot see" section above and + the task's own full report for the reasoning and the correction this + task made to a PRE-EXISTING allow-list note (M5) that had 2027's own + oracle outcome backwards. A genuine kernel bug was found and fixed + along the way, kept rite-agnostic: `calendar.ml`'s `build_day` used to + decide "did a transfer settle" by checking ONLY whether the candidate + became `observed` at its target — impossible by construction for a + `Commemoration_only` candidate (RG 81), caught by the exhaustive + property sweep the moment a rite first produced this shape. Full + account: `.superpowers/sdd/2026-08-12-colitur-rg16a/major- + litanies-report.md`. + + **Rogation Wednesday remains genuinely blocked**, and for the ORIGINAL + architectural reason, now confirmed distinct from the Litanies' own + (dissolved) one: its trigger is not a fixed civil date at all, but the + day's OWN temporal identity (Easter+38), which coincides structurally + with the Ascension Vigil — there is no `(month, day)` pair a `Fixed` + spec could ever anchor to, so the Litanies' own "reuse the RG 96 + transfer machinery" trick does not apply here (nothing is being + transferred FROM a civil date; the commemoration would have to be + synthesised from the day's own Easter offset, which still has no + channel). No partial build exists. 9. **RG 91 entry 27, the votive Office of the BVM on Saturday — RESOLVED (2026-08-13, `ef-bvm-saturday` task).** `Precedence_ef.band` already -- cgit v1.3 From cbf6826edc77e3ad5a813237bae27e367221452c Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 13 Aug 2026 20:55:43 +0200 Subject: docs(ef): fix round 1 corrections (F2-F5) -- inert fields, a date, an attribution, RG434(b) F2: the task report's "colour/subject/names on the Litanies entry are currently inert" was false for names -- test_oracle.ml's identity axis reads Names.find on every commemoration, and the invented English name is exactly why 2026-04-25 registers as a Comm_identity_mismatch, the reason M5 had to be re-gated. Corrected precisely, field by field, in the report. F3: Easter 2027 is 28 March, not 18 April, as previously stated in the report's own "layer 4 is blind to the transfer" reasoning. The conclusion survives (28 March is not 25 April); the date is corrected. F4: "the exhaustive property sweep caught this immediately" was a wrong attribution, in the report, the register, and calendar.ml's own comment. The committed exhaustive sweep walks 1583-9998 in order and aborts at the first failure; the years actually reported (5700, 4747) were draws from prop_invariants, the default dune test run's 200-year random sample. Corrected in all three places. F5: the Litanies' privileged commemoration is due in the MASS specifically (RG 108 + RG 81), never a separate Office answer -- colitur emits one resolved day, and the M20 adjudication rests on that being the Mass reading. Stated explicitly now in M20's own note, the register, and precedence_ef.ml's own RG111(b) comment. Also added to M20 and the register: Rubricae Generales Missalis Romani n. 434(b) ("VIII - De diversis Missae partibus", "D) De orationibus", "I - De orationibus in genere"), verified word for word against all three documents -- word-identical to RG 111(b) but explicitly scoped to the Mass ("post orationem Missae"), answering the objection that RG 111 (Caput XVI, which RG 106 says governs both Office and Mass) might be read as Office-shaped. Moves the M20 adjudication from "moderate-high, not certain" to near-certain. --- CLAUDE.md | 13 +++++++++--- data/ef/expected-divergences-missalemeum.sexp | 8 +++++-- lib/rites/rite_ef/precedence_ef.ml | 30 ++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 6 deletions(-) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index 74f6a40..6e8289a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -573,9 +573,16 @@ original, distinct architectural reason. along the way, kept rite-agnostic: `calendar.ml`'s `build_day` used to decide "did a transfer settle" by checking ONLY whether the candidate became `observed` at its target — impossible by construction for a - `Commemoration_only` candidate (RG 81), caught by the exhaustive - property sweep the moment a rite first produced this shape. Full - account: `.superpowers/sdd/2026-08-12-colitur-rg16a/major- + `Commemoration_only` candidate (RG 81), caught by `prop_invariants`' + SAMPLED 200-year property (the default `dune test` run), NOT the + committed exhaustive sweep (which walks in order and would have found + it deterministically at year 1638, not the later, seed-dependent year + the sample happened to draw) — attribution corrected in fix round 1 + (F4). Fix round 1 also found and closed a THIRD settlement channel + `settled_at` still missed (a transferred candidate capped out by + admission limits AT its own target, F1) — unreachable on shipped data, + caught by the same sampled property while mutation-testing the RG 109(f) + privilege. Full account: `.superpowers/sdd/2026-08-12-colitur-rg16a/major- litanies-report.md`. **Rogation Wednesday remains genuinely blocked**, and for the ORIGINAL diff --git a/data/ef/expected-divergences-missalemeum.sexp b/data/ef/expected-divergences-missalemeum.sexp index afc793e..6eeeabd 100644 --- a/data/ef/expected-divergences-missalemeum.sexp +++ b/data/ef/expected-divergences-missalemeum.sexp @@ -215,7 +215,11 @@ REVISED, ef-bvm-saturday task: 395 of the 730 days in this window used to carry (note "30 June, both years in this window (2026-06-30, 2027-06-30): colitur now shows +commemoration-of-st-peter (data/ef/adjustments.sexp's own `Add` directive) where missalemeum shows nothing at all -- not even Peter listed under \"displaced\", meaning missalemeum's own engine never constructs a candidate for this commemoration in the first place, the SAME shape this task found in lectio's own source data (`~/git/projects/lectio/internal/caldata/tridentine-calendar.ini` has no 06-30 companion entry either -- an upstream data gap both reference engines share, not a colitur bootstrap miss). Verdict colitur, the same shape as M1/M3/M8/M10 above (each already \"missalemeum does not implement X\"): the calendarium's own text is unconditional and confirmed on both photographic scans, and colitur's own machinery for the other two RG 110 pairs (25 January, 22 February) already produces the identical shape correctly. Diff shape [Comm_presence] alone: rank/colour/observed-identity all already agreed before this fix (the OBSERVED celebration on both dates is unchanged, `in-commemoratione-sancti-pauli-apostoli`, sanctoral-origin with a resolvable name matching missalemeum's own title exactly on both rows) -- only the new commemoration's PRESENCE is new, so identity comparison is never even reached (this file's own header: identity is only attempted once presence and count already agree). 2, one per year, independently re-derived against the fixture's own two 06-30 rows before being set here, not assumed from the citation's own two-pair symmetry.") (expected_rows 2)) ((id M20) - (citation "RG 109(f) + RG 111(b), Caput XVI \"De Commemorationibus\" (docs/research/rules-register.md §4, both primary-source-verified word for word, all three documents): RG 109(f) lists \"de Litaniis maioribus, in Missa\" in the SAME closed privileged list as (a)-(e); RG 111(b): \"in dominicis II classis, una tantum admittitur commemoratio, scilicet de festo II classis, QUÆ TAMEN OMITTITUR SI COMMEMORATIO PRIVILEGIATA FACIENDA SIT\" -- the II-class-feast commemoration is dropped if a privileged one is due") + (citation "RG 109(f) + RG 111(b), Caput XVI \"De Commemorationibus\", CORROBORATED by RG 434(b) (\"VIII - De diversis Missae partibus\", \"D) De orationibus\", \"I - De orationibus in genere\"), added fix round 1 (F5) -- all primary-source-verified word for word, all three documents (docs/research/rules-register.md §4). RG 109(f): \"de Litaniis maioribus, in Missa\" -- in the SAME closed privileged list as (a)-(e). RG 111(b): \"in dominicis II classis, una tantum admittitur commemoratio, scilicet de festo II classis, QUAE TAMEN OMITTITUR SI COMMEMORATIO PRIVILEGIATA FACIENDA SIT.\" RG 434(b), WORD-IDENTICAL, but explicitly scoped to the MASS (\"post orationem Missae\"), which is exactly where RG 109(f)'s own privilege lives (\"in Missa\"): \"in dominicis II classis, nulla alia admittitur oratio, praeter commemorationem festi II classis, quae tamen omittitur si commemoratio privilegiata facienda sit.\" The second citation answers the objection that RG 111 sits among Office-and-Mass rubrics and might be read as Office-shaped: RG 434 cannot be so read, and says the identical thing.") (verdict colitur) - (note "NEW (ef-major-litanies task). 25 April 2027: RG 80's own transfer condition (25 April = Easter Sunday or Monday) does NOT fire this year, so the Litanies stay on 25 April itself -- which this year happens to be an ordinary II-class Sunday (RG 91 entry 15). St Mark (II class, entry 16) also loses to the Sunday. Two losing candidates, ONE slot (RG 111(b)): colitur admits the Litanies, not Mark; missalemeum's raw fixture row shows the reverse (verified directly against test/fixtures/missalemeum-ef-2026-2027.txt's own 2027-04-25 line -- see [M5]'s own corrected note above for the exact text, which previously mis-transcribed this same row backwards). ADJUDICATED, not merely asserted: {!Precedence_ef.admit}'s [Class2, true] branch already implements RG 111(b)'s privilege-overrides-ordinary clause exactly as quoted above, and this project's own prior work (precedence_ef.ml's \"Fix, Task 16\" comment) already primary-source-verified that same clause independently of this task -- the Litanies winning here is the SAME mechanism, not a special case written for it; St Mark meets the fate any ordinary Class2 commemoration meets when a privileged one is also due (RG 16(a)'s Transfiguration/Sixtus shape is the nearest existing witness, though there the privileged side wins the whole DAY, not merely the commemoration slot). HONESTLY FLAGGED: this is the first real (non-synthetic) data point this codebase has for \"an ordinary Class2 feast and a privileged non-feast commemoration both losing to the identical Sunday\" -- every other witness for this admit branch in test_precedence_ef.ml is hand-built. Read plainly, RG 111(b)'s text supports colitur's outcome here; missalemeum's divergence is consistent with this project's already-documented pattern of RG 108-111 gaps in that oracle (M1, M8, M10 above each already \"missalemeum does not implement X\") -- plausibly one more instance of the same generator not modelling RG 109(f)'s privilege for this rare, single-date observance, not evidence the RG 111(b) mechanism itself is mis-read. Recorded as an adjudicated verdict, not a certainty -- revisit first if a future primary-source pass finds textual grounds narrowing RG 109(f)'s privilege specifically. Identity-gated (test_oracle.ml's own [m20_commemoration_matches]): pins that colitur's own sole admitted commemoration really is [major-litanies].") + (note "NEW (ef-major-litanies task). 25 April 2027: RG 80's own transfer condition (25 April = Easter Sunday or Monday) does NOT fire this year, so the Litanies stay on 25 April itself -- which this year happens to be an ordinary II-class Sunday (RG 91 entry 15). St Mark (II class, entry 16) also loses to the Sunday. Two losing candidates, ONE slot (RG 111(b)/RG 434(b)): colitur admits the Litanies, not Mark; missalemeum's raw fixture row shows the reverse (verified directly against test/fixtures/missalemeum-ef-2026-2027.txt's own 2027-04-25 line -- see [M5]'s own corrected note above for the exact text, which previously mis-transcribed this same row backwards). ADJUDICATED, not merely asserted: {!Precedence_ef.admit}'s [Class2, true] branch already implements RG 111(b)'s privilege-overrides-ordinary clause exactly as quoted above, and this project's own prior work (precedence_ef.ml's \"Fix, Task 16\" comment) already primary-source-verified that same clause independently of this task -- the Litanies winning here is the SAME mechanism, not a special case written for it; St Mark meets the fate any ordinary Class2 commemoration meets when a privileged one is also due (RG 16(a)'s Transfiguration/Sixtus shape is the nearest existing witness, though there the privileged side wins the whole DAY, not merely the commemoration slot). + + SCOPE, made explicit (fix round 1, F5): RG 108 (\"Commemorationes privilegiatae fiunt in Laudibus et in Vesperis necnon in omnibus Missis; commemorationes vero ordinariae fiunt tantum in Laudibus, in Missis conventualibus et in omnibus Missis lectis\") + RG 81 (\"nihil fit in Officio, sed tantum in Missa\") together mean the Litanies' own privileged slot is due IN THE MASS specifically; nothing here computes or asserts a separate OFFICE-level answer for the same day. colitur emits ONE resolved day, not one per liturgical hour -- this adjudication, and every one of the 829 domain-wide Sunday-displacement days it governs, is the MASS answer. Defensible for a Mass-facing engine (this codebase's own stated scope, citations/readings, is Mass-oriented throughout), but stated here rather than left implicit, since it is what the whole adjudication rests on. + + HONESTLY FLAGGED, now closer to certain than first written: this is the first real (non-synthetic) data point this codebase has for \"an ordinary Class2 feast and a privileged non-feast commemoration both losing to the identical Sunday\" -- every other witness for this admit branch in test_precedence_ef.ml is hand-built. First written \"moderate-high, not certain\"; RG 434(b)'s own independent, Mass-specific repetition of RG 111(b)'s exact rule (fix round 1 finding, above) closes the main remaining doubt (that RG 111 might be Office-shaped) and moves this near-certain. missalemeum's divergence remains consistent with this project's already-documented pattern of RG 108-111 gaps in that oracle (M1, M8, M10 above each already \"missalemeum does not implement X\") -- plausibly one more instance of the same generator not modelling RG 109(f)'s privilege for this rare, single-date observance. Identity-gated (test_oracle.ml's own [m20_commemoration_matches]): pins that colitur's own sole admitted commemoration really is [major-litanies].") (expected_rows 1)) diff --git a/lib/rites/rite_ef/precedence_ef.ml b/lib/rites/rite_ef/precedence_ef.ml index e8c05cd..b3c9ab5 100644 --- a/lib/rites/rite_ef/precedence_ef.ml +++ b/lib/rites/rite_ef/precedence_ef.ml @@ -1615,7 +1615,35 @@ let admit ~(observed : Vocab_ef.rank Precedence.candidate) 2026 (Holy Family, a II-class Sunday) has St Hyginus (Class3, commemoration-only) as its only competing candidate -- missalemeum shows him "displaced" (omitted), never commemorated; the - pre-fix code admitted him regardless. *) + pre-fix code admitted him regardless. + + CORROBORATED (ef-major-litanies task, fix round 1, F5): RG 111 + sits in Caput XVI, "De Commemorationibus", governing "tam pro + Missa quam pro Officio" per RG 106 -- read alone it could be + mistaken for Office-shaped, incidentally reused for the Mass. + Rubricae Generales Missalis Romani n. 434(b) (Part "VIII - De + diversis Missae partibus", "D) De orationibus", "I - De + orationibus in genere"), verified word for word, all three + documents: "in dominicis II classis, nulla alia admittitur + oratio, praeter commemorationem festi II classis, quae tamen + omittitur si commemoratio privilegiata facienda sit" -- + WORD-IDENTICAL to the clause above, but explicitly scoped "post + orationem Missae" -- an independent, Mass-structure-rubric + confirmation of the exact same privilege-overrides-ordinary rule + this branch already implements, from a different part of the + same document. First load-bearing live witness for this branch's + "privileged wins even against a WORSE table position" half: the + Major Litanies (RG 109(f), major_litanies_slug above), whose own + [band] value is {!unclassified} (worse than every real table + entry, per that constant's own comment) yet still displaces St + Mark's real entry-16 table position on the four Sunday-conflict + years the Litanies' own data/ef/expected-divergences-missalemeum + .sexp M20 entry adjudicates -- every earlier witness for this + branch (Holy Family/Hyginus above; the RG16(a) admit_cases table) + happened to also be the day's own privileged Sunday/feast winning + OUTRIGHT (band already decided it before admit ran), not two + independently-offered LOSING candidates settled by this clause + alone. *) (match List.filter is_privileged sorted with | best :: _ -> [ drop_band best ] | [] -> ( -- cgit v1.3