<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/data/ef/sanctoral.sexp, branch v0.3.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.3.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v0.3.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>data(ef): carry sanctoral propers on the celebration</title>
<updated>2026-08-14T22:05:35Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-14T22:05:35Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=f1d90a83ece4d8301061e8247e23ec2af8293ab4'/>
<id>urn:sha1:f1d90a83ece4d8301061e8247e23ec2af8293ab4</id>
<content type='text'>
Celebration.citations has existed in the type, the .mli and the sexp schema
since Plan 2 and has been emitted as () for every entry; the bootstrap now
writes the real values for the 208 entries lectio has them for.

On the celebration rather than in the lectionary table deliberately: a
diocesan overlay adding a saint then carries his readings through the
existing overlay algebra, with no second file to edit and no new directive.

Asserted both ways -- the 13 January proper is present, and no
Commemoration_only entry has readings, because in the EF a commemoration
contributes an oration, not a reading.
</content>
</entry>
<entry>
<title>data(ef): re-bootstrap sanctoral.sexp from the corrected lectio source</title>
<updated>2026-08-12T15:49:11Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T15:49:11Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=25fedcaf3044828333ba15b232fdc7c7f84970e5'/>
<id>urn:sha1:25fedcaf3044828333ba15b232fdc7c7f84970e5</id>
<content type='text'>
Regenerated via tools/bootstrap_sanctoral.ml against lectio's
tridentine-calendar.ini (SHA-256 6a25e634... -&gt; 1b303ef2...), whose own
generator was independently fixed in a concurrent session. 327 entries (223
feast, 104 commemoration-only), up from 322 (208/114):

- 15 entries wrongly bootstrapped `rank = commemoration` are now
  `class-3` (a real III-class Feast) -- all 6 March-5 April, all
  primary-source-verified against the calendarium (register's own
  "Commemoration-only entries' inferred STATUS" item).
- 5 new entries: agnes-secundo (28 Jan), boniface-martyr (14 May),
  eusebius-confessor (14 Aug), evaristus (26 Oct), theodore (9 Nov) --
  all Commemoration_only, all primary-source-verified (register's "Four
  confirmed sanctoral DATA GAPS" item + expected-divergences-missalemeum
  .sexp's former M4/M6/M7/M9/M14).
- commemoration-of-the-baptism-of-the-lord (13 Jan) is now
  `(subject Lord)` (the source's own `class` field, not a colitur
  overlay); most-holy-name-of-mary (12 Sep) no longer carries `class =
  lord` at all (the source dropped it), so the bootstrap default
  (Subject.Saint) is now correct there without help from
  adjustments.sexp's own Edit.

test_sanctoral_ef.ml's pinned counts (327/104/12 Class1) are re-derived
directly from the source INI (`grep -c '^\['`, `grep '^rank' | sort |
uniq -c`), not transcribed from a bootstrap-tool or `colitur day` run.

data/ef/adjustments.sexp and the differential/oracle allow-lists still
need updating for the consequences of this regeneration -- follow-up
commits.
</content>
</entry>
<entry>
<title>data(ef): bootstrap the 1962 sanctoral from lectio</title>
<updated>2026-08-11T22:05:57Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-11T22:05:57Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=4624441d0bc9c1f28dea54606ab7999041d4b323'/>
<id>urn:sha1:4624441d0bc9c1f28dea54606ab7999041d4b323</id>
<content type='text'>
Convert lectio's tridentine-calendar.ini (322 entries) into
data/ef/sanctoral.sexp via a validating OCaml converter, tools/
bootstrap_sanctoral.ml, rather than a hand-written script: every field is
built through Slug.of_string, Colour.of_string and Vocab_ef.rank_of_string,
so the emitted sexp is valid by construction.

Two conversion decisions, both documented rather than buried:
- subject defaults to Subject.Saint, overriding Celebration.make's kernel
  default of Subject.Temporal, for the 316 entries with no explicit class;
- rank = commemoration maps to status = Commemoration_only with an inferred
  Class3 (not a citation -- it is what the 1960 reform reduced most simple
  feasts from), recorded as an open item in the rules register for the
  oracle to adjudicate.

Every celebration is tagged layer = Precedence_ef.universal_layer, the
provenance id RG 91's band classifier reads to tell the universal calendar
from proper/indult data.

The generated file carries a provenance header: source path, its SHA-256,
and the UTC conversion date, so re-bootstrapping against a newer lectio is
reproducible and diffable. Output is byte-identical across runs.

test/test_sanctoral_ef.ml loads the file through Layer.load and checks the
counts independently derived from the source INI (322 entries, 114
Commemoration_only, 12 Class1, no Subject.Temporal, every date resolves in
a leap year), plus two named spot-checks against the INI's own text -- one
entry with an explicit class field, one commemoration -- so a passing count
cannot hide the wrong 322 entries having been converted.
</content>
</entry>
</feed>
