<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/test/fixtures/lectio-ef-2005-2050.txt, branch v0.1.0</title>
<subtitle>deterministic OCaml engine to compute and validate liturgical calendars for multiple rites, template-driven output to year 9999</subtitle>
<id>https://git.labunix.xyz/colitur.git/atom?h=v0.1.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v0.1.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-17T12:13:02Z</updated>
<entry>
<title>fix(lectionary): two Judith citations wrong in both engines</title>
<updated>2026-08-17T12:13:02Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-17T12:13:02Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=3565ebd1608a7d87e0d890f9953845efcfe743ca'/>
<id>urn:sha1:3565ebd1608a7d87e0d890f9953845efcfe743ca</id>
<content type='text'>
A live-missalemeum sweep over a full liturgical year (2028, 364 days)
returned 333 matching and 31 differing days: 17 already-known or pure
notation, 3 new. All three now adjudicated against the photographic
scans of the 1962 Missal.

The Assumption's Epistle reads "Iudith 13, 22-25; 15, 10" (scan1:35357).
Both engines carried "Judith 13:22-25; 13:15; 13:10" -- a chapter
carry-over defect that re-applied chapter 13 to the second citation and
so invented two verses the Missal never cites. The Seven Sorrows reads
"Iudith 13, 22 et 23-25" (scan1:36938, corroborated at 28468); both
carried "Judith 13:22; 13:25", dropping the range. The third, St Monica,
resolves the other way: the Missal gives 1 Timothy (scan2:32679, heading
and incipit both legible; scan1:29524 agrees) where missalemeum serves
the Common of Holy Women's Proverbs -- colitur is right, no change.

Layer 3 could not have found either citation defect. colitur's data is
bootstrapped from lectio, and lectio is the other side of that
differential, so while both engines produced the identical wrong answer
the comparison held it against itself and reported agreement -- the
shared-lineage blindness CLAUDE.md names, now with a second live witness
beside Holy Thursday's colour. Only an external oracle could see it, and
only outside the committed fixture's own window.

Fixed upstream in lectio, re-bootstrapped here (provenance SHA-256 moved
to 54f6bfc5, verified against the source), fixture regenerated.

The upstream fix inverted layer 3 from blind to load-bearing here:
reverting the Assumption citation now reddens both layers, where before
it would have reddened neither. Verified by mutation, both directions.

Allow-lists:
- C22 closed and removed (128 rows -&gt; 0), not re-adjudicated -- the other
  engine was fixed to agree, the same shape as the C2-C5/C7/C9-C13/C21
  closures. Its own note had already flagged the Lenten Ember dead-key
  bug for upstream; lectio now also fails its build on any unreachable
  lectionary key rather than serving a plausible wrong Mass.
- M28 opened (3 rows, verdict colitur), pinning both sides' citation
  text rather than the date and diff shape alone, so a different
  divergence landing on the same date cannot be swallowed.
- M8's gate widened, expected_rows unchanged at 2: 2027-08-15 carries
  both its cause and M28's, and one entry is admitted per day. It stays
  under M8, which now requires its own commemoration difference to be
  present and admits the citation difference only when it satisfies
  M28's two-sided predicate. Neither cause absorbs the other.

layer_m_reason's oracle-row parameter, kept named since M2 closed for
exactly such a future reader, is live again.

Register: docs/research/rules-register.md section 6.6.
</content>
</entry>
<entry>
<title>test(differential): compare reading citations, 16 801 days</title>
<updated>2026-08-15T00:58:00Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-15T00:58:00Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=459d2c74711e6a152fb338f88d2327f12180b61f'/>
<id>urn:sha1:459d2c74711e6a152fb338f88d2327f12180b61f</id>
<content type='text'>
Layer 3 is NOT blind to the ferial resumption rule, unusually for this
project: lectio implements the same rubric independently, so the differential
checks colitur's rule against a second implementation rather than against
silence.

It IS blind to the Commons -- lectio has no such concept -- so chain step 4
rests on layer 4 alone.

Divergence triage, 1 532 of 16 801 days differ (15 269 match exactly),
0 unexplained:

- A genuine colitur bug found and fixed: data/ef/lectionary.sexp carried
  lectio's own ini section names verbatim, never translated into the slugs
  Temporal_ef actually computes for the identical office. Data the bootstrap
  already held (Passiontide both weeks, the Pentecost Ember days, Holy Name
  Sunday) was unreachable by chain step 2, silently falling through to a
  wrong step-3 answer -- invisible until citation content became comparable.
  tools/bootstrap_lectionary.ml gained colitur_keys (rename/widen), a
  hand-authored ef-nativity-vigil entry cross-sourced from lectio's own
  sanctoral calendar and corroborated by colitur's own (overlay-suppressed)
  sanctoral bootstrap of the same source, and a derived ef-holy-name entry
  (RG 17(a)'s single Mass heading covers both the Sunday and 2-January
  shapes). One guess (giving the fixed Nativity-Octave days Holy Name
  Sunday's own citation uniformly) was tried and reverted once measured
  against the fixture -- Missal-verified to be right only for the genuine
  "Sunday within the Octave" case, wrong whenever the true preceding Sunday
  is Christmas Day or Advent IV instead.

- 10 existing/widened Layer C entries (C1/C6/C8/C14/C15/C16/C17/C18 --
  C6 and C17 narrowed with the removed population accounted for, not
  silently re-absorbed) plus two new ones: C19 (the already-adjudicated
  Time-after-Epiphany week-numbering offset, now visible in citation
  content), C20 (lectio computes no reading at all for the seven
  readingless saints Task 6 gave a Common or proper -- colitur is more
  complete, not wrong).

- One entry, C21, is a genuine colitur LOGIC limitation found but not
  fixed: Lectionary_ef.readings' step 3 is a single hop to the preceding
  Sunday, insufficient for a run of colitur-only fixed Christmastide slugs
  whose own preceding Sunday is itself another entry-less fixed slug.
  Recorded verdict open (data/ef/expected-divergences-missalemeum.sexp's
  own established precedent for this shape), not left silently failing --
  fully diagnosed in task-8-report.md, recommended as a dedicated
  follow-up task rather than a hasty fix to a shared, multi-round-reviewed
  kernel-adjacent function.
</content>
</entry>
<entry>
<title>test(differential): refresh the lectio fixture, close 9 entries, add C14</title>
<updated>2026-08-12T20:24:30Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T20:24:30Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=a4ffb0234d198ef295554e3202db15403346fbed'/>
<id>urn:sha1:a4ffb0234d198ef295554e3202db15403346fbed</id>
<content type='text'>
lectio moved 2386a45 -&gt; 3b32c00 (seven EF calendar defects fixed, plus a
sanctoral-generator root-cause fix); the committed fixture predates all
of them. Regenerated with the same command the provenance note already
named (`go run ./cmd/lectio-ef-dump 2005 2050`), read-only against
lectio -- nothing there was touched. New SHA-256 asserted in both the
provenance note and test_differential.ml's fixture_sha256. The dumper's
two new name_en/name_pl columns are kept verbatim (the fixture is meant
to be the exact command's raw output; the comparator already discards
everything past field 7).

Every C-entry's expected_rows was re-derived independently against the
refreshed fixture (a Python re-implementation of diff_fields/
layer_c_reason, cross-checked against the real OCaml comparator's own
failure output), not transcribed from a green run. Nine entries -- C2,
C3, C4, C5, C7, C10, C11, C12, C13 -- now match zero rows and are
closed: sexp row removed, layer_c_reason predicate and its now-dead
helper bindings removed, citation preserved in
docs/research/rules-register.md's new §3d with the specific lectio
commit that fixed each one. C1 (361 -&gt; 368) absorbs C13's former 7 rows
now that lectio's own slug matches there too. C6 (138, unchanged count)
narrows to a slug-only shape now that lectio's rank agrees. C8 (31,
unchanged) survives untouched -- lectio still computes no Rogation days.

C9's old shape ("Joseph observed ON a Lent Sunday") is also closed, but
a narrower, different divergence survived under the same saint's slug: 3
years (2008, 2035, 2046) where Joseph's own congested RG96 walk collides
with the Annunciation's separately-transferred "sedes propria". The old
predicate's broad "any diff involving this slug" match was silently
absorbing both under one citation -- split into a new id, C14, rather
than folded back into C9, since the two are unrelated rules. lectio's
own commit history (09a1444) documents this residual as a gap it
deliberately left unresolved; colitur gives Joseph a real transferred
day either way, which is why C14's verdict stands regardless of a
genuinely open sub-question (recorded in the register, not resolved
here) about which of the two feasts should claim the contested day
first under RG98's "prius impeditum" wording.

Re-triaged the full remaining 4975 raw differences: only 10 distinct
field-diff signatures now, all resolving to Layer A/B noise or the four
surviving citations, 0 unexplained. The crude "Sunday-rank" and "Holy
Thursday" residues the task flagged both fully resolve once the real
Layer A/B machinery runs (season-spelling and week-numbering artifacts,
not substantive divergences) -- see the task report for the derivation.

Teeth proof: perturbing ferial_rank to reproduce C4's old defect made
140 rows reappear as unexplained (the exact prior C4 count), reverted
after capturing the failure message.

277 tests green (dune test) and 278 with COLITUR_EXHAUSTIVE_SWEEP=1 (the
extra case is the 1583-9999 sweep itself).
</content>
</entry>
<entry>
<title>test: differential vs lectio 2005-2050 with a cited allow-list</title>
<updated>2026-08-12T01:18:15Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T01:18:15Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=fcfce4ba0ab4ea93837b647deaa5292300aaad5e'/>
<id>urn:sha1:fcfce4ba0ab4ea93837b647deaa5292300aaad5e</id>
<content type='text'>
Validation layer 3 (design spec's five): compares colitur's real day-by-day
EF output against lectio (sibling project, Go), 2005-2050, one line per
civil day. Of 16801 day-pairs, 11206 already agree on the seven leading
columns; the 5595 that don't resolve into exactly 25 distinct field-diff
signatures, all triaged.

Three strictly separate layers, per the controller's ruling (the brief's
single flat allow-list assumed a handful of differences, not 5595):

- Layer A (test_differential.ml, norm_season/norm_slug): vocabulary. An
  explicit, closed table of naming synonyms with no liturgical substance
  (lectio's easter/christmas vs colitur's paschaltide/christmastide; a
  handful of slugs that are two names for the identical office). No
  wildcards -- every entry is a literal string pair.

- Layer B (strip_epiphany_index): numbering. The one slug family whose
  lectio/colitur index offset is not a constant (Time-after-Epiphany week
  numbering, register 3c#5) has its embedded digit stripped to a common
  form on both sides before comparing; rank and colour stay fully compared.

- Layer C (data/ef/expected-divergences.sexp): the cited allow-list. Ten
  genuine liturgical disagreements, each citing its RG paragraph and
  naming which engine is right (always colitur, verified against the
  Missal/register, never against lectio's own behaviour). This is the
  only layer permitted to cover a difference in rank, colour, or which
  celebration is observed. Five extend or restate register 3c's already-
  documented divergences (season boundary, Sunday I-class, Advent Ember
  ferias, Rogations); five are new, found and adjudicated in this task
  (Lent Ember days, the Nativity Octave, Ember-day-vs-saint precedence,
  the St Joseph transfer off a Lent Sunday, and the 2011 Sacred Heart /
  Precious Blood / Visitation collision). expected_rows on each entry is
  an exact regression pin, asserted by the test, not documentation.

13 January (register 6's long-open "Baptism of the Lord" item) is
confirmed empirically fixed already -- Task 11's sanctoral wiring closed
it before this task started -- so it is not allow-listed; the only
residual difference there is the season boundary already covered by C1.

Two stated limits carried from the brief (commemorations are not
comparable; lectio's own EF oracle asserts season only, 2025-2026 only,
so a rank/colour difference is not presumptive evidence against colitur)
plus a third found during this task (the week column is a display
convention on both sides, not a liturgical fact, and is not compared at
all) are documented in the test file's own doc comment.

Fixture: test/fixtures/lectio-ef-2005-2050.txt, committed as plain text
(1.4 MB), generated by lectio commit 2386a45; provenance recorded in the
sibling .provenance file. Colitur's side is recomputed fresh from the
library on every run, through the same Calendar/Rite_ef pipeline
`colitur day` uses, not the compiled binary.

Proved the harness has teeth by two reverted perturbations: a genuine
colour difference injected into a fully-covered fixture row fails the
"no unexplained differences" check with the exact mismatched row printed;
a one-row drift in an allow-list entry's expected_rows fails the count
check independently, showing it is not merely a duplicate of the first
assertion. 236/236 tests green, clean-build verified, deterministic
across OCAMLRUNPARAM=R.
</content>
</entry>
</feed>
