summaryrefslogtreecommitdiff
path: root/CLAUDE.md
Commit message (Collapse)AuthorAgeFilesLines
* docs: describe the OF rite module and what its layers cannot seeLukasz Kasprzak2026-08-271-2/+79
| | | | | | | | | | | | CLAUDE.md's own Current state still read 'Plans 1-3 + the EF lectionary DONE' and listed the OF module as future work, so the orientation doc a fresh session reads first did not know the rite exists. Records what the OF's three validation layers cannot see -- no published-ordo witness at all where EF has three, identity comparison reaching ~12% of rows, Validate.run being blind to value-level misplacement, and an allow-list entry having twice hidden a real defect -- and scopes the six-layer Validation section to EF, which is the only rite it describes.
* fix(of): anticipate St Joseph onto 18 March per Normae n. 56(f)Lukasz Kasprzak2026-08-261-0/+76
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | W1: when 19 March (St Joseph) falls on Palm Sunday, colitur sent him forward to Easter+9 instead of anticipating the solemnity backward to 18 March, the one rule in the whole Normae transfer machinery that names an earlier date. Live in 16 of 1583-2100 (1595, 1606, 1617, 1690, 1758, 1769, 1780, 1815, 1826, 1837, 1967, 1978, 1989, 2062, 2073, 2084). Blocked on a kernel contract: Rite.t.transfer_target required its result be strictly later than the impeded date, an obligation argued purely from the EF's RG 96. Traced against Calendar's actual placement pass rather than assumed unsafe: the round loop re-resolves the whole year fresh every round, and its two safety nets (~start/~stop; the round-count guard) both test the target's own value with no comparison against origin, so a bounded backward jump converges the same way a bounded forward one does. The one requirement that stays load-bearing is target <> origin: Precedence.resolve never deduplicates by slug, so a candidate returning its own argument unchanged would collide with itself in the same round's contest. Relaxed the obligation accordingly (rite.mli) and added the fourth transfer_target branch in Precedence_of, ahead of the existing three (Precedence_of.transfer_target, Rule 0). calendar.ml needed no logic change, only two comments that asserted "every genuine transfer moves forward" as a blanket fact. Unpinned the two tests that asserted the old wrong (forward) behaviour and replaced them with assertions of the correct one, plus a new direct unit test of the backward branch across two independent years. EF output is untouched: data/ef/ and lib/rites/rite_ef/ carry no diff, and colitur day/readings for 2026, 1583 and 9999 are byte-identical against a build of the prior commit. OF's own 2005-2050 window carries none of the 16 affected years and shows zero unexpected diffs; the full 1583-9999 domain still reaches a fixed point under the exhaustive sweep.
* docs: six validation layers, not five -- the LMS Ordo is wired inLukasz Kasprzak2026-08-221-7/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Task 6 (celebrant-rubrics-phase1) added test_lms_ordo.ml as a sixth validation layer, comparing 400 days against a printed Latin Mass Society Ordo -- a genuinely independent fourth lineage, never passed through Divinum Officium/missalemeum/lectio. README.md's own table still said "Five validation layers"; man/colitur.1 still said "two published-calendar oracles"; CLAUDE.md still said "5 layers" in two places and, worse, stated as fact that "the published Ordo... Not wired in as a layer" in the file every future session is instructed to read first. Updated all three, describing what the new layer covers (the Creed, the BVM Saturday votive Mass's own seasonal selection, the reading formulary override) and what it cannot see (one civil year, only three of the formulary axis's five sources, England & Wales diocesan propers excluded from every comparison) -- consistent with docs/research/ordo/PROVENANCE-lms.md, not overstating it. CLAUDE.md's own stale claim is corrected in place, not silently rewritten, matching the file's own established convention: the paragraph it lived in was about a DIFFERENT, earlier Ordo (unreliable PDF column extraction, still genuinely unwired for that reason), and its own closing prediction -- "a structured Ordo would be the only way to add a fourth lineage" -- is exactly what the LMS Ordo's structured extractor (tools/extract_lms_ordo.ml) has since done. Historical "five layers" mentions elsewhere in CLAUDE.md, describing completed state as of earlier branches, are left alone -- they were true then, and rewriting them would misrepresent the record the same way overstating layer 6's own coverage would. Left README's pre-existing v0.9.0/569-tests staleness untouched, as instructed -- it predates this branch and is a separate matter.
* docs: the lineage is broken at one link, and layer 4 is now the outlierLukasz Kasprzak2026-08-181-0/+25
| | | | | | | | | | | | | | | | | | | | | | | | | CLAUDE.md's lineage note said layers 3 and 4 are one chain -- Divinum Officium, missalemeum, lectio, colitur -- and that a defect inherited at the root is invisible to both. That is still true everywhere except on the days lectio has now corrected. lectio adopted eight corrections colitur argued from the Missal. On those days the chain no longer runs DO to lectio: lectio follows the Missal, and missalemeum is the only party still carrying the inherited error. C27, C28 and C37 went to zero and are closed; C38 narrowed to a readings-only divergence that cannot close without lectio gaining a Commons concept. The practical consequence for layer 4 is a base rate, and it is worth stating because it is easy to get backwards: on those days the oracle disagrees with BOTH engines, so M29 and M30 should be read as "missalemeum is the outlier" rather than "colitur is unusual". A fresh colitur-vs-missalemeum divergence is no longer presumptively colitur's fault. And the limit, stated so it is not over-read: everywhere else the two layers remain one lineage, and lectio's sanctoral is still generated from missalemeum by a script that would silently revert all four calendar corrections if re-run. That warning now lives in lectio's two ini headers and the generator's own doc comment as well as here.
* feat(tools): export the lectio EF correction patchLukasz Kasprzak2026-08-181-1/+1
| | | | | | | | | | | | | | | | | | | colitur has been downstream of lectio since its data was bootstrapped from it. These are the fields where that relationship should now invert: eight changes, each annotated with the colitur allow-list entry carrying its rubric. Deliberately a PATCH and not a regeneration. colitur carries 205 of the 327 Polish names lectio ships, so regenerating lectio's ini from colitur would silently drop 122 of them; colitur also uses a different slug vocabulary for Passion/Holy week and different Paschaltide week numbering. What colitur is authoritative for is the adjudicated fields, and only those are emitted. Comparing the two datasets field by field also caught a counting error in colitur's own register that no assertion in this project was watching for: six sanctoral entries carry subject = Lord, not the four recorded, because the regex that counted them truncated on the two longest Polish names. The RG 112(b) reachability measurement was re-run against all six and is unchanged at 0/0; both docs are corrected.
* docs: record why RG 112(b)/(c)/(d-saint) are unbuiltLukasz Kasprzak2026-08-181-2/+12
| | | | | | | | | | | | | | | | | | | | | | | They have been carried as a bare 'unbuilt' for weeks. The reason is not neglect, and it differs per clause -- now measured across 1583-9999 rather than asserted. (c) cannot fire in this architecture at all: Temporal_ef.temporal returns one office per day, so two de Tempore candidates never coexist. Nothing to build. (b) is already produced by RG 16(a), which is implemented: 0 days in either direction, because a Lord feast takes an occurring Sunday's place with no commemoration, and no Class1 Sunday shares a date with any of the four Lord-subject entries. (d)'s saint half has no candidate pair. Three apparent pairs are distinct saints sharing a forename -- recorded so the false positive is not rediscovered -- and the one real pair, agnes and agnes-secundo, is 7 days apart and co-occurs 0 times. (b) and (d) are data-unreachable rather than architecture-unreachable, so an overlay can make either live. That is the entry_14_movable_band shape. Left as an explicit open decision rather than silently resolved.
* docs: Rogation Wednesday is built, not blockedLukasz Kasprzak2026-08-181-11/+21
| | | | | | | | | | | | | | CLAUDE.md still described it as architecturally blocked, and that claim was being carried forward into task lists a release later. It was true when written and was superseded by the very next task: the blocker was that no (month, day) pair could anchor an Easter-relative trigger, and Date_spec gained Easter_offset in v0.2.0. The entity has shipped since then as an ordinary Add in adjustments.sexp -- 1 981 days across the domain carry it. Also recorded the general lesson, since this cost a stale item twice: a blocker phrased as an architectural impossibility was really a claim about one type's expressiveness, and it dissolved when that type grew a constructor.
* docs: name the lineage problem, and record an independent Ordo witnessLukasz Kasprzak2026-08-181-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Two research findings, and the first changes how every earlier adjudication should be read. missalemeum's own repository states it uses Divinum Officium's data files via a git submodule. lectio's ini is generated from missalemeum. colitur was bootstrapped from lectio. So the chain is Divinum Officium -> missalemeum -> lectio -> colitur, and the other projects in this space are the same tree: OfficiumDivinum is an object-oriented rewrite of Divinum Officium, Breviarium Meum is based on its texts. That is worse than the caveat already recorded. CLAUDE.md described layer 3 as sharing colitur's lineage and layer 4 as a separate oracle. It is not separate: layer 4 is layer 3's own upstream. The two oracles are one source seen at two removes, so every colitur-versus-missalemeum adjudication is in substance colitur versus Divinum Officium -- the de facto standard for this whole software space. That makes the six prior adjudications more consequential, and it means the project has one external software witness plus the scans, not two. The second finding is a witness outside that tree entirely: the published Ordo, compiled by clergy applying the rubrics. The 2025-26 Ordo for the Traditional Latin Mass shows commemorations AND distinguishes privileged from ordinary, which is precisely colitur's thinnest axis. Its liturgical timeline matches colitur exactly, and it confirms seven colitur positions -- including M16, reversed against Divinum Officium two days ago on RG 111(d), and the Nativity Octave work from this morning, both halves, including the RG 69 Sunday guard. Three of the confirmations matter most: the Major Litanies, the RG 110 30-June Peter companion, and St Barbara are entries colitur hand-authored because they are missing from lectio AND missalemeum, that is from Divinum Officium. The Ordo carries all three, and even notes the Peter commemoration is said "w/ 1 conclusion" -- RG 110's own pro unica habeantur. Those were the least-supported entries in the dataset and are now the best-corroborated. The one apparent disagreement resolves in colitur's favour: the Ordo lists St Evaristus as 26 October's Mass where colitur observes the feria and commemorates him, but the calendarium reads "Commemoratio S. Evaristi... Comm." in both sources, and the Ordo's own preamble explains it lists Masses that may be said on a class 4 feria. An Ordo is a practical document, not a rank authority. Not wired in as a layer: the PDF's columns shift between pages, automated extraction recovered 271 of 364 rows and truncated text mid-word, and a fragile layer that silently mis-parses is worse than none. A structured Ordo would be the only way to add a genuinely independent fourth lineage. Register: section 6.20.
* feat(cli): --overlay FILE, so a local calendar can be suppliedLukasz Kasprzak2026-08-171-3/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Overlay algebra has been built and tested since Plan 2, and Date_spec grew movable variants last commit, but there was still no way to hand colitur a file: bin/main.ml applied exactly one overlay, the shipped data/ef/adjustments.sexp, with the path hardcoded. This is the plumbing. --overlay is repeatable and ordered, and applies ON TOP of the shipped adjustments rather than instead of them. That ordering is the whole point: adjustments.sexp carries RG 110's own 30 June companion, the Major Litanies, St Barbara and Rogation Wednesday, and a user file that replaced it would silently drop all four while appearing merely to add a local feast. Overlay.merge is last-writer-wins, so a local calendar can still override a universal entry deliberately, by naming its slug. The dispatch needed real argument parsing. It matched Sys.argv as an exact array, which does not survive a repeatable flag -- two --overlay arguments are a different array shape from one, and each further flag would multiply the patterns again. Flags are now stripped first and the remaining words matched as command plus year. Hand-rolled, because the dependency list is frozen and this is fifteen lines. One defect found by the cram suite on the first run: the unknown-option guard rejected --help and --version, having excluded only their short forms. Refused, not ignored, on easter and temporal. Neither reads sanctoral data -- temporal deliberately runs the cycle before any layer exists -- so accepting the flag there and silently doing nothing is the failure mode this project refuses everywhere else. A file that fails to load is fatal, exactly as the shipped overlay is; a directive naming a slug that does not exist warns on stderr and the run continues. The second matters more for a user file than for ours: a typo in a diocesan calendar should say so rather than quietly do nothing. test/fixtures/overlay-example-diocesan.sexp is a worked example and is labelled as invented, not calendar data. It carries both shapes a real local calendar needs: a fixed-date patron, and a dedication on "the first Sunday of October" -- which is the case the Date_spec work existed to unlock and which lands on 4 October in 2026, 3 October in 2027, 1 October in 2028. The dedication is I class because a church's own dedication anniversary is I class in that church; at III class it lost to the II-class Sunday every year, which a first draft demonstrated correctly and uselessly. The man page gains an OVERLAYS section saying plainly that an overlay is applied, NOT validated: the five test layers assert things about the shipped calendar and none of them can vouch for a file the user supplies. This is the first feature that lets someone change what colitur computes, and that distinction should not have to be inferred.
* feat(kernel): movable Date_spec variants, and Rogation WednesdayLukasz Kasprzak2026-08-171-3/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Date_spec carried one variant, Fixed(month, day), and its own header said Sunday- and Easter-relative forms would arrive with the OF sanctoral. They arrive early because two things needed them at once: a user-supplied overlay carrying a local movable feast had no way to express "the first Sunday of October", and Rogation Wednesday's commemoration has been recorded as architecturally blocked since 2026-08-13. That blockage turns out to have been a premise, not a fact. The register concluded the Rogation "is not Commemoration_only sanctoral data by nature... it needs a genuinely THIRD kind of thing this architecture has no name for" -- but the reasoning rested on there being "no civil (month, day) pair to anchor a Fixed entry to". That is a statement about Date_spec's expressiveness. With Easter_offset the entity is ordinary sanctoral data, the identical shape Add major-litanies already ships, differing only in how the date is written. No third channel was needed. The register is corrected rather than left contradicting the code. Two variants: Easter_offset of int, and Nth_weekday of {month; nth; weekday} with negative nth counting from the end. Fixed's sexp representation is untouched, so all 327 sanctoral entries and the whole overlay parse unchanged. Both are re-validated in t_of_sexp through their smart constructors, extending the idiom Fixed already used -- the failure that guards against is invisible, a spec deserialising into something that silently never resolves and a celebration vanishing with no diagnostic. Easter is supplied by the rite, not computed in the kernel. Computus ships Gregorian and Julian both, and picking one here would hard-code a Roman assumption into rite-agnostic code and be silently wrong for a Julian-reckoning rite. Rite.t gains an easter field; Rite_ef supplies the Gregorian one. Layer keeps a split index. Fixed entries stay in the year-independent (month, day) table, which preserves the fast path and the "30 November counted twice in a 371-day span" behaviour validate.mli documents for St Andrew. Movable entries have no year-independent key by construction -- the same spec lands on a different (month, day) each year -- so they resolve per civil year into a rata-die table. index_by_date is removed rather than kept as an alias: two ways to index a layer, one of which silently ignores movable entries, is the trap this change exists to avoid. Two domain-edge defects, both found by the suite rather than reasoning. A liturgical year is Advent-anchored, so resolving civil year y names y +/- 1, and at the edges those are 1582 and 10000, which Computus correctly refuses by raising. The ceiling surfaced through the domain-ceiling test, the floor through `colitur day 1583` failing outright. Fixed once, in Layer.index, the single point that calls the rite's easter -- a clamp repeated per caller would have been two places to get wrong a third time. Rogation Wednesday: RG 87 assigns the Litaniae minores to the Monday, Tuesday AND Wednesday before Ascension (scan1:691); colitur built the first two from the start and never the third. RG 88 keeps it out of the Office, so the Ascension Vigil remains observed. RG 89 routes it through the Major Litanies' rules, but RG 109's closed list names only maiores, so by RG 107 it is an ORDINARY commemoration -- confirmed in the output, not assumed. Name from the Missal's own "feria IV" (scan1:20495-20497), violet to match the Monday and Tuesday offices. Blast radius, full 1583-9999 sweep against the pre-change binary: 2257 days, every one the same shape, zero unclassified, line counts equal both sides. The complement is the informative half -- in the other 6160 years the Rogation does not appear at all, because RG 111 admits one commemoration on a II-class day and an impeded feast takes it under RG 113, a Commemoration_only candidate having no row in RG 91's table. Both shapes are pinned. Allow-lists unmoved: layer 3 compares no commemorations and is blind by construction, and layer 4's 2026-2027 window has a competing feast on both Wednesdays, so the Rogation is capped out in exactly the years the oracle can see. C8 is unchanged, asserted by its own count pin. Not built: Sunday-relative specs, which nothing needs yet, and the --overlay plumbing that would let a user actually supply a local movable feast. Nth_weekday therefore ships with synthetic and property coverage only; inventing a shipped entry to exercise it would be fabricating calendar data. Register: section 6.10.
* feat(cli): a Makefile, a man page, and --helpLukasz Kasprzak2026-08-171-4/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Three things the project had no answer for: how to install it without knowing dune, where to read about it, and what it does when asked. Makefile, same shape as lectio's -- PREFIX ?= $(HOME)/.local, BINDIR, MANDIR, and the '## '-comment help target -- so the two siblings are driven the same way. Every recipe wraps dune in `opam exec --`, which is the actual point of having one here: `make build` works from a plain shell with no `eval $(opam env)` first. install goes through `dune install` rather than a hand-rolled copy, because the binary finds its calendar data relative to its own path; the man page is installed separately to share/man/man1, matching lectio. install and uninstall were both run against a scratch prefix and checked: uninstall leaves zero files behind. PREFIX defaults to ~/.local because that is where lectio installs and where it actually lives on this machine, so colitur lands on an existing PATH with no shell change. An earlier install this session went to ~/opt/colitur, which was me over-applying a rule meant for third-party tools to one of the author's own projects; it has been removed rather than left as a second, staler binary competing on PATH. man/colitur.1 documents the four commands, both output formats and why they differ, COLITUR_DATA_DIR and its refusal to fall back, the data resolution order, exit statuses, and -- deliberately -- the limitations: EF only, Epistle and Gospel only with the chants unbuilt and rejected rather than guessed, and the BVM Saturday Mass-selection gap. A man page that only lists what works is half a man page. Renders clean under `groff -ww -z`, no warnings. --help prints to stdout and exits 0; a usage error prints one line to stderr and exits 2. That is the Unix convention rather than a preference: asking for help succeeded and should be pipeable, being invoked wrongly did not and must not pollute stdout. Both directions are asserted in cli.t, along with a loop confirming every command the help text advertises is one the dispatch actually accepts -- the check that catches help drifting away from the code.
* test(oracle): a second oracle year, 2038, closing step 4's blind spotLukasz Kasprzak2026-08-171-4/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Register section 6.7 recorded that step 4 of the reading chain -- the Common route -- had no external witness of any kind, and proved it by mutation: corrupting a Common citation left both the 16801-day differential and the 730-day oracle green. This closes that. 2038 is the only year in 2005-2050 in which two of the five Common-routed saints are the observed office (Perpetua and Felicitas on 6 March, Frances of Rome on 9 March). 365 days were captured live, one request per day, zero failures. A separate fixture, not more rows on the existing one. sources.md already records that the live endpoint has drifted from lectio's archived 2026-2027 snapshot; merging two versions of one source behind a single set of expectations would make any future disagreement unattributable -- calendar or drift, no way to tell. Nothing in the 2038 comparison is checked against the older fixture, and its provenance file says so, along with the fact that a live capture is not reproducible byte-for-byte on demand the way a snapshot-derived one is. 338 of 365 days match. 27 differ, every one of them in a named, already-adjudicated class, none unexplained: 13 the BVM Saturday votive Mass (M26 shape 1), 7 colour (M21), 2 Judith (M28), 2 Christ the King's week (M26 shape 2b), 1 Christmas multi-Mass (M27), 1 Perpetua's Common, 1 new. Each was decided in a different year, so 2038 re-confirms them independently -- the point of a second window is not new rulings but evidence the old ones are not artefacts of their own year. Two findings came out of it. Perpetua and Felicitas: missalemeum serves the Common of Virgins and calls them "Virgins and Martyrs" in its own oration, where the Missal directs "Missa Me exspectaverunt, de Communi non Virginum I loco" (scan1:27634-27635). Both Commons share the Introit Ps 118:95-96, which is exactly why the calendarium qualifies its direction, and both women were mothers. Verdict colitur; the mechanism is located on missalemeum's side, not merely asserted. Passion Tuesday: the Missal prints "Dan. 14, 27 et 28-42" (scan1:11106) and colitur reproduces that two-part form where missalemeum collapses it to 27-42. Same verses; the convention is deliberate, appearing also in the Seven Sorrows and the Common of Non-Virgins. Verdict colitur, cosmetic. Citations are notation-normalised before comparing, as layer 3 already does: Ecclus/Sir, Joann/John, Luc/Luke, Matth/Matt. Each pair was added because a real row needed it, and no target contains its own source as a substring, so the set is idempotent. Not compared, stated rather than left to be found: commemorations and observed-identity. That machinery is built around a date-literal 28-entry allow-list specific to 2026-2027, and re-deriving it for a second year is its own task. 2038 compares rank, colour, Epistle, Gospel. The extractor's day count was hardcoded to 730, which silently forbade any other window. It is now a parameter defaulting to 730, so the existing documented command keeps its guard and a partial fetch still fails loudly instead of producing a short fixture that passes a comparison it never ran. Teeth, by re-running section 6.7's own experiment: corrupting the Common of Non-Virgins II now reddens four tests, two of them external-oracle, where the same mutation previously reddened neither oracle layer. Residual: isidore-of-seville is still unwitnessed and needs 2035 or 2046; gregory-the-great and patrick are never the observed office in any year 2005-2050, so no fixture in that range can reach them. Register section 6.8 and 6.9.
* feat(cli): colitur readings, one line per dayLukasz Kasprzak2026-08-171-6/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* docs(ef): fix round 2 -- three miscitations and a recorded blind spotLukasz Kasprzak2026-08-171-0/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Comment and citation corrections found by review, plus one finding that survived an attempt to reconstruct it. No behaviour change; the suite is unchanged at 358 green. The ferial rubric "Diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut die 1 ianuarii" was attributed to RG 17(a) in three test comments. It is not RG 17(a). RG 17(a) (LT.txt:843) fixes only WHEN the Holy Name is kept -- "celebrandum dominica quae occurrit a die 2 ad 5 ianuarii; secus die 2 ianuarii". The rubric quoted is a Mass-propers rubric printed under the Sanctissimi Nominis Iesu heading (scan1:6523-6526, corroborated scan2:7216), governing what the ordinary ferias of that window say when they are not the feast at all. Two rules sharing a date window. Fix round 1 had already corrected this on the data side; the generator's own comment was right throughout. Only the test comments were stale. test_differential.ml named bootstrap_lectionary.ml's derived_entries as the source of ef-holy-name's citations. That binding no longer exists -- it was the mechanism that derived them from ef-holy-name-sunday's wrongly-widened ini translation, removed in Task 9 because the derivation was itself the error. They are hand-authored from the scans now, as holy_name_entries. M26's shape 1 described its 21 rows as votive Masses of the BVM "on an otherwise-unoccupied feria, not only a Saturday", splitting them into 4 BVM-Saturday rows and 17 "ordinary weekday ferias". Every one of the 21 is a Saturday, each checked individually against date -d. The error was not merely verbal: it made the gap look broader than a single cause and pointed away from the one rule that explains all 21. The sub-groups differ by season, not weekday, and only in what colitur shows in the votive Mass's place. One gap -- the office is built (RG 91 entry 27), the seasonal selection among the five Masses is not. Recorded, not fixed: step 4 of the reading chain has no oracle witness at all. This began as a note to write up a live-oracle confirmation for Felicitas and Perpetua; the reconstruction contradicted its premise. The sweep ran over 2028, where 6 March resolves as a Lenten feria with the saint admitted only as a commemoration, so her own Mass is never read that year. The finding underneath is firmer: only five saints route through a Common, they are the observed office on five days in all of 2005-2050 (isidore-of-seville 2008/2035/2046, frances-rome and sts-felicitas-perpetua both 2038), two are never observed in 46 years, and none falls in layer 4's window. Layer 3 does not cover it either -- lectio resolves the literal "-"/"-" sentinel there, which is what C18 is gated on, so it confirms only that colitur emits a citation where lectio emits none, never that it is right. Closing it needs the oracle fixture extended to 2035, 2038 or 2046; that is a fixture-scope decision. Register: sections 6.6 and 6.7. CLAUDE.md's layer-blindness list gains the step-4 entry.
* docs(ef): fix round 1 corrections (F2-F5) -- inert fields, a date, an ↵Lukasz Kasprzak2026-08-131-3/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* docs: CLAUDE.md for the Major LitaniesLukasz Kasprzak2026-08-131-81/+96
| | | | | | | | | | | | | | | | | | | | | | 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).
* docs: fix round 1 ride-along findings (F2-F7)Lukasz Kasprzak2026-08-131-5/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | F2: test_christmastide_feria_slugs's 26 December assertions removed -- St Stephen/John/the Holy Innocents (RG 67-70) always outrank a Class4 Saturday candidate there, in every year, so the office can never actually be observed on any day in the 26-28 December stretch. 3 January (no competing sanctoral entry, any year) used for the "-1-" stretch demonstration instead, alongside the pre-existing 10 January one. F3: test_differential.ml's shared row type gains a subject field (populated for colitur's own rows only; lectio's fixture has no such column). C17's own predicate now also requires subject = "bvm" -- defence in depth against a future bug producing a white Class4 Saturday candidate some other way, particularly in Christmastide/ Paschaltide where colour alone could not catch it. F4: Precedence_ef.band's entry-27 comment gains its RG 78 citation, replacing "per the historical default that fills it". F5: two report inaccuracies corrected -- band was already receiving a real candidate 312,966 times pre-change (what was missing was its identity, not its reality); the "Missae de S. Maria in sabbato" heading quote was presented as "both scans, word for word" when both scans are OCR-noisy there AND genuinely differ in abbreviation from each other -- corrected in temporal_ef.ml's own comment and the register alongside the report. F6: the colour rule gains a tighter citation chain -- RG 431(e) (the Missal's own classification of this Mass as a "Missa votiva IV classis... de B. Maria Virg.") -> RG 121(a) (votive Masses take the colour of the feast-type they correspond to) -> RG 120(b) (BVM feasts are white) -- reaching the same conclusion through the category (votive) the Missal's own text actually places this Mass in, not by treating it as a festum RG 91's own table structure says it is not. F7: the oracle's real seasonal coverage recorded precisely in CLAUDE.md and the register -- of 26 BVM-Saturday-office days in the 2026-2027 fixture only 17 are colour-discriminating; Time after Epiphany (5,015 observed days domain-wide) has zero oracle witnesses. Full account in .superpowers/sdd/2026-08-12-colitur-rg16a/ bvm-saturday-report.md (local, gitignored).
* docs: RG 91 entry 27 (BVM Saturday) resolvedLukasz Kasprzak2026-08-131-10/+73
| | | | | | | | | | | | | CLAUDE.md's "Unbuilt, recorded" list and Data section move to reflect the closed gap: a new item 9 records the office's own build, citations and measured blast radius; the allow-list counts move to 7 active lectio entries (C17 new) and 11 active missalemeum entries (M2 closed). docs/research/rules-register.md (gitignored, not tracked) gets the matching update: §4's entry marked RESOLVED with a cross-reference, the §6 open-item checkbox closed, and a new §6.4 with the full primary-source account -- every scan reading quoted, the blast-radius reconciliation, and the mutation-test record.
* docs: a name that matched no scan, and a blocker that was not realLukasz Kasprzak2026-08-131-14/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Two corrections from the fix-round review, both to the record. "Sabbato Sancto" is attested zero times in either photographic scan. The scans print SABBATO SANCTO as the heading (once) and "Sabbato sancto" as the running header (28x and 30x); the shipped casing appears only in the electronic transcription's table of contents -- the source this project's own methodology rule deprecates -- while the comment beside it called the value "both photographic scans, word for word". Recased to the running-header form, which is the convention the other three Latin names in the file already follow, with a source note recording the count. Third source-fidelity slip this week, and the first where the wrong value came from the deprecated source itself. The Major Litanies deferral was recorded with two false blockers. It claimed a kernel signature extension was needed to suppress the feast in transfer years: admit already takes ~temporal and disposition already takes ~winner, both carrying the Easter office on 25 April, so a rite-local slug test does it with zero kernel surface. And it implied Easter Monday is unmarkable: ef-easter-1-monday occurs exactly 8417 times in 8417 years, as reliable as ef-easter-sunday. So the guarded build -- never scored -- is a strict improvement, 8223 years newly correct against 194 unchanged, and "worse than the gap" was true only of the unguarded one. Deferring is still right, for a reason nobody had found: 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 -- an unmeasured blast radius through layers 3 and 4. That measurement is the prerequisite. The 194 figure is exact and reproduces. Also corrects a subject-audit list that named five months for six entries, omitting the Precious Blood on 1 July.
* docs: close/narrow the Triduum and Litanies open items in CLAUDE.mdLukasz Kasprzak2026-08-131-9/+74
| | | | | | | | | | | | | | | | | | | Item 5: the Sacred Triduum's own identity is RESOLVED (RG 91 entry 2), full 1583-9999 blast radius measured at zero differing CLI lines -- the change is invisible to layers 2-4, visible only to the two golden/ unit tests built for it. Major Litanies (RG 80) and Rogation Wednesday's own commemoration (RG 87-89) are established from a photographic scan and fully cited, but deliberately not built: both need a rite-computed, Easter-relative, non-competing commemoration candidate -- a kind of thing Precedence.resolve's architecture has no channel for. Measured, not assumed: RG 80's own transfer clause triggers in 194 of 8417 domain years (~2.3%), so building only the ordinary case would trade a known, understood gap for a new wrong answer in those years. Renumbers the trailing three architectural-debt items (5-7 -> 6-8) to make room.
* fix round 1: RG 110(c)'s ordering was inverted; M19 lacked an identity gateLukasz Kasprzak2026-08-131-2/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | RG 110(c), word for word: "quoties vero oratio unius Apostoli addenda est ad modum commemorationis, huic orationi additur altera immediate, ante omnes alias commemorationes." "Huic orationi" (dative, "to this oration") refers to the trigger's own oration; "additur altera" means the companion is added to it, i.e. follows it. "Ante omnes alias commemorationes" governs the pair's position relative to other, unrelated commemorations, not the pair's own internal order. The previous build prepended the companion uniformly in both RG 110 shapes, citing this same clause for both -- correct for (a)/(b) (the day's own oration, not a list member, has nothing to order against), backwards for (c), where the trigger is itself a list member and the companion belongs after it. Fixed in rg110_additions: shape (a)/(b) still prepends; shape (c) now splices the companion in immediately after its own trigger. Re-pinned the unit test that had asserted the wrong order, and corrected both rows' comments to cite the clause that actually governs each shape. No layer in this codebase compares commemoration order: the lectio differential never compares commemorations, the oracle sorts both sides into a multiset, and the golden tests' own describe function sorts its commemorations field too. Recorded as a new, permanent blind spot in CLAUDE.md and the register, not merely fixed around -- the admit_cases unit table is the only place order is asserted at all. Re-measured the full blast radius against the same pre-change binary: same 14,627 differing days, same four shapes and counts, confirming the fix changed only the content of the 593 shape-(c) rows and nothing else. Mutation-tested: reverting the splice back to a uniform prepend reddens exactly the shape-(c) unit test; a new golden pin for a real shape-(c) day (2004-02-22) stays green under the same mutation, living proof that golden pins cannot see this axis, not merely a claim. Separately, M19's own predicate checked a date and a diff shape but not which candidate -- proved insufficient by fabricating a second, bogus companion on 30 June and confirming the whole suite stayed green. Fixed by requiring the admitted commemoration to be exactly commemoration-of-st-peter, mirroring C16's own identity guard. Added a golden pin for 30 June, the only assertion of that entry's identity outside the allow-list. Also: corrected a false claim in the task report that the electronic transcription carries no corroboration of the Holy Name fallback -- its own table of contents does, at a line not checked on the first pass. Added two further citations, both re-verified against the scan: RG 17's own closing paragraph, settling the Sunday shape's Sunday- exclusion at the rubric level rather than only in the propers; RG 124(c), which assigns red to 30 June by paragraph number rather than by the generic apostle/martyr default. Noted the fragility of deriving the Sunday shape's RG 109(a) privilege from a slug-substring match rather than from a citation. Cosmetic: a stray blank line and an indentation inconsistency.
* docs: close the Holy Name / RG 110 open items in CLAUDE.mdLukasz Kasprzak2026-08-131-38/+68
| | | | | | | | | | | Both items this file tracked as open since branch ef-rg112-rg110 (Holy Name of Jesus's subject tag and missing RG 17(a) fallback; RG 110's inseparable Peter/Paul commemoration) are resolved. Adds item 4 to the behaviour-items list with the account and measured blast radius, renumbers the structural items 5-7, and removes both from the "Unbuilt, recorded" paragraph. Updates the two allow-list active-entry counts (differential 5 -> 6 for C16; oracle stays 12, M12 closed and M19 opened).
* docs: two retracted claims that outlived their retractionLukasz Kasprzak2026-08-131-10/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* docs: fix round 1 (F9) -- Holy Name of Jesus is missing a real office, not ↵Lukasz Kasprzak2026-08-131-3/+16
| | | | | | | | | | | | | | | | | | | 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.
* test(oracle): fix round 1 (F8) -- correct the M18 headline, name the blind ↵Lukasz Kasprzak2026-08-131-1/+7
| | | | | | | | | | | | | | | | | | | | 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.
* docs: Holy Family + RG112(a) resolved; layer 4 observed-identity gap closedLukasz Kasprzak2026-08-131-21/+86
| | | | | | | | | | | | | | | | | | | | | 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.
* fix(rite-ef): band has no table entry for a bare commemoration, everLukasz Kasprzak2026-08-121-50/+70
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix round 1 on the commemoration-identity/tie-break work: the "genuine same-band tie" M17 adjudicated as open was not a tie at all. RG 91's table enumerates only "dies liturgici" (real feasts) -- entry 24's own text is "Festa III classis, in calendario Ecclesiae universae inscripta" -- so a Celebration.t.status = Commemoration_only candidate (a saint reduced to a bare commemoration) has no row in the table to begin with. Precedence_ef.band used to read rank alone, so it silently lent such a candidate the same table entry as a genuine Feast of its own rank; the calendarium's own 22 September row confirms the distinction in its own notation ("S. Thomae de Villanova ... III classis. / Commemoratio Ss. Mauritii et Soc. Mm." -- Thomas carries a class number, Maurice carries none). Fixed at the source, not by adding a status tier to compare_precedence: band now checks status first, ahead of every rank-keyed branch, and returns unclassified for any Commemoration_only candidate. M17 deleted (not re-adjudicated) -- 22 September now resolves identically on both sides, with no divergence left to name. Blast radius measured independently (a temporary git worktree at the pre-fix commit): 4451 days change across the whole 1583-9999 domain, exactly 4 verified shapes -- 3576 x maurice-and-companions-martyrs -> thomas-of-villanova and 282 x eleutherius -> philip-neri (admitted set changes), 502 x appollonia/cyril-of-alexandria and 91 x dorothy/titus (order only, independently confirmed against the calendarium's own listing convention). Zero days change who is observed. Further swept the whole domain for a genuine "two different candidates on the identical real table entry" residual -- the shape RG 113 truly gives no instruction for -- and found it empty: of 109201 same-rank ties domain-wide, 83950 now resolve by band alone and the remaining 25251 are exclusively two Commemoration_only candidates tied at unclassified, never two real feasts. The residual admit still breaks alphabetically is real, but narrower than previously documented. The "66 days" figure is reconciled, not merely disputed: 599 is the tie population, 65 (whole-comparator: 67) is the real admitted-set decision count within it (independently reproduced against the pre-Task-B binary), 149 is order-only. Every one of the 65 real decisions traces to the same Commemoration_only/Feast root cause as Maurice/Thomas. Also: validate.ml's admission fixed-point check recovers a commemoration's real origin (by matching its slug against the day's own temporal office) instead of reconstructing every candidate as Sanctoral, since band -- unlike EF's own admit -- does read origin; precedence_ef.ml/.mli's motivating example and blast-radius claims corrected to no longer rest on the fixed Maurice/Thomas case; test_identity_rank_corroboration's own population count corrected now that 22 September (and 21 other Feast-status matches) became reachable; its rank-agreement pin documents exactly what it does and does not prove. Register (§4, §6.1, §6 checklist) and CLAUDE.md corrected in place, including the RG 113 first-sentence gap this exercise surfaced but did not close, recorded as a new open item. 275 -> 276 tests (with the exhaustive sweep), all green.
* feat(test): oracle layer compares commemoration identity, not just countLukasz Kasprzak2026-08-121-5/+33
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | test_oracle.ml (validation layer 4) used to compare commemoration presence and List.length only -- cardinality, never which candidate is admitted. A reviewer proved this vacuous by reversing admit's dignity sort (the engine admitting the worst commemoration, an outright RG 111 violation) and finding every assertion in this file green across all 730 days. tools/extract_missalemeum_oracle.py now also emits each commemoration's own missalemeum id (field 9, commemoration_ids), parallel to the existing title field; fixture regenerated from the same underlying lectio snapshot (commit d7da4b0, re-verified, first 8 fields byte-identical), read from a scratch copy so ~/git/projects/lectio was never touched. SHA-256 pin and provenance updated. The mapping: colitur identifies a commemoration by slug, missalemeum by an English title string. No hand-built slug<->title table -- colitur's own Celebration.t.names already carries the same English text for every SANCTORAL-origin commemoration (bootstrapped from lectio, verified to match missalemeum's titles character-for-character). This resolves identity for every sanctoral-origin commemoration but cannot resolve a TEMPORAL-origin one (Rite_ef.Temporal_ef never sets a celebration name) -- that case is a new, distinct outcome (Comm_identity_unresolved), counted and allow-listed, never silently skipped: 19 of 227 non-empty-commemoration days over 2026-2027. Two genuine identity mismatches found and adjudicated (new allow-list entries M15-M17, one is the unresolved bucket): M16, 27 March 2026, the already-known unimplemented Seven Sorrows of Passion Friday office (verdict missalemeum); M17, 22 September 2027, the RG 113 same-band tie-break residual (verdict open, per the sibling admit fix). A new corroborating check cross-references missalemeum's own id-embedded rank against colitur's, split by status: Feast-status matches must agree exactly (none reachable in this 2-year window, checked regardless); Commemoration_only-status matches either genuinely agree or fit a known, pre-existing, already-registered convention gap (colitur's bootstrap rank vs missalemeum's own sentinel) -- not a title-matching defect. Perturbation test performed and reverted: reversing admit's dignity- based ordering (compare_precedence's real committed form uses band, not dignity -- this reproduces the historical defect shape directly) turns the oracle layer red: "no differences outside the cited allow-list" fails with an unexplained commemoration-identity-mismatch on 2026-09-23 (colitur admits "St. Thecla" where the rubric and missalemeum both require "St. Linus"). Reverted; diff against the prior commit confirms no residue. CLAUDE.md's "know what each layer cannot see" section updated: the commemoration-identity gap it documented as open is now closed, with the mapping's limits and the RG 113 tie-break finding summarised. 271 -> 273 tests (274 with the exhaustive sweep), all green.
* docs: fix round 1 -- Purification reversal, the admit fix, RG112, layer ↵Lukasz Kasprzak2026-08-121-17/+47
| | | | | | | | | | | | | | | | | | | | | blindness CLAUDE.md's own carried-item record, updated to match the register's full account: the Purification retag reversed (follow the oracle, not the calendarium title, per the user's ruling), the admit/~temporal kernel signature change (a genuine one, unlike RG16(a) itself), RG112 recorded as a newly-found, unimplemented rule (a feast/mystery of one Divine Person excludes a commemoration of another of the same Person -- confirmed live on 13 January in seven real differential-window years, independent of the subject question), and the Dedication-of-a-Church classification question (measured, not applied: St Michael's own Dedication, 29 September, may also be a feast of the Lord -- 1200 days domain-wide if so). Extends the existing 'commemoration identity is unasserted' item: this is the exact gap the whole RG16(a) fix round exploited both ways -- the original bug and the review's own catch (Pope Sixtus II wrongly admitted, both golden pins promoted from output) were both invisible to every layer except unit tests and two golden pins.
* docs: close the RG16(a) CLAUDE.md item, correct its signature-change claimLukasz Kasprzak2026-08-121-7/+16
| | | | | | | | | | | Mirrors the register §6.0 correction: the carried-item list previously said the fix "needs a signature change -- privilege_of cannot currently see the winner's subject", which was true of privilege_of specifically but wrong about what the fix required -- disposition already took the winner. Marked resolved, with a pointer to the register's own full account (audit, fix, blast radius, allow-list) and to one further sanctoral subject defect this task found but did not fix (13 January, Baptism of the Lord, mistagged Saint).
* docs: refresh CLAUDE.md for Plan 3Lukasz Kasprzak2026-08-121-34/+128
| | | | | | | | | | | | | | | | | | | Plans 1-3 are done: the resolution engine, the sanctoral data, and all five validation layers. Records what each layer CANNOT see, which is the part a fresh session most needs and the part a green suite hides -- the lectio differential never compares commemorations and shares colitur's own data lineage, the oracle is two years wide and never compares celebration identity, and between them they sleep through commemoration identity entirely. Carries into Plan 4 the two behaviour items that all five layers currently miss (RG 16(a), 5996 wrong days; commemoration identity), the structural items cheapest to fix before a second rite exists, and the data defects traced upstream into lectio's generator. Adds the exhaustive-sweep invocation to the build block: the default suite samples, so the "clean across every year" claim is reproducible only on demand.
* docs: add CLAUDE.md working context for the repoLukasz Kasprzak2026-08-111-0/+168
Orients a fresh session: what colitur is, the authoritative docs, the binding decisions, the architecture, the five validation layers, current state and what comes next. The design spec and research register it points at stay local (docs/ is gitignored).