<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/tools/bootstrap_sanctoral.ml, branch v0.2.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.2.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v0.2.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-14T22:05:35Z</updated>
<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>tools(bootstrap_sanctoral): fix round 1 (F6) -- stale entry-count comments</title>
<updated>2026-08-12T16:26:05Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T16:26:05Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=4c0277ef2a848e355224812db15c8bca921daf75'/>
<id>urn:sha1:4c0277ef2a848e355224812db15c8bca921daf75</id>
<content type='text'>
Three comments still said "322" after the previous commit's regeneration
moved the total to 327: the date-form comment (rewritten to not carry a
count at all, since it is about a FORM, not a quantity); the explicit-class
comment (327, plus recorded that the 6 entries carrying it changed
membership -- 12 September dropped it, 13 January gained it -- even though
the count of 6 itself did not move); the name.pl comment (327 total, 5
missing it, 322 carrying it -- was "5 of the source's 322 entries",
conflating the new total with the old one).
</content>
</entry>
<entry>
<title>tools(bootstrap_sanctoral): name.pl is optional, not required</title>
<updated>2026-08-12T15:49:01Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T15:49:01Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=71e8d83a094b90b7aa4a30fcc7e719d6399b85f4'/>
<id>urn:sha1:71e8d83a094b90b7aa4a30fcc7e719d6399b85f4</id>
<content type='text'>
lectio's regenerated tridentine-calendar.ini (the fix that corrects the
15-entry rank cluster and adds the 5 missing entries this branch
re-bootstraps from) has 5 entries with no name.pl field at all
(agnes-secundo, boniface-martyr, eusebius-confessor, evaristus, theodore --
all either newly added or newly un-hidden). parse_names previously required
name.pl unconditionally (`field sec "name.pl"`, which dies on absence) --
correct for a source that always had it, wrong now that it legitimately
does not.

Names.t is an open, per-language assoc list (names.mli) with no rule that
every entry must carry every language colitur happens to know about, so
requiring pl here was this tool's own invented constraint, not a kernel
one. Falls back to an en-only Names.t when pl is absent, never a
placeholder string.
</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>
