<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/README.md, branch v1.0.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=v1.0.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v1.0.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-22T11:55:15Z</updated>
<entry>
<title>docs: six validation layers, not five -- the LMS Ordo is wired in</title>
<updated>2026-08-22T11:55:15Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-22T11:55:15Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=1ee397c5a09bb5c999e1681f0a6a5d884f2f9ff4'/>
<id>urn:sha1:1ee397c5a09bb5c999e1681f0a6a5d884f2f9ff4</id>
<content type='text'>
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 &amp; 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.
</content>
</entry>
<entry>
<title>docs: correct a stale README</title>
<updated>2026-08-21T10:02:49Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-21T10:02:49Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=83cc11e31c08d14fd3449f95872f346a4daaf2b8'/>
<id>urn:sha1:83cc11e31c08d14fd3449f95872f346a4daaf2b8</id>
<content type='text'>
Three claims were false:

The download paragraph said older tags are not offered for download.
They are again -- per-tag snapshots were re-enabled, and only the
summary page's tag list is trimmed. A stable colitur-latest.tar.gz still
exists for scripts that should not know a version.

'Starting with the Roman EF (1962) and OF forms' read as though both
existed. lib/rites/ holds rite_ef and nothing else; the OF is the next
module. The tagline claimed multiple rites for the same reason.

Suite timings were from a much smaller suite: the fast run is ~8s over
568 tests, not ~3s, and the exhaustive sweep ~80s.

Adds a Status section with the real numbers, the five validation layers
and -- more usefully -- what they cannot see, since the differential and
the oracle share one data lineage. Notes that chants are deliberately
absent, and points at the colitur-x viewer.
</content>
</entry>
<entry>
<title>build: publish one current tarball instead of per-tag snapshots</title>
<updated>2026-08-21T08:34:50Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-21T08:34:50Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=75ba0a85b82823c9b030ce2a1297b0ea4be7fee4'/>
<id>urn:sha1:75ba0a85b82823c9b030ce2a1297b0ea4be7fee4</id>
<content type='text'>
cgit offers snapshots for every tag or for none, so colitur.git now has
cgit.snapshots=0 and 'make release-tarball' uploads the tagged archive to
a stable URL. Ten tags had meant twenty download links, nineteen of them
stale.

The target refuses to run from an untagged or dirty tree, so what is
published always matches a tag.
</content>
</entry>
<entry>
<title>docs(citation): sigla flags, book naming and traditions</title>
<updated>2026-08-20T15:29:44Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T15:29:44Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=152bba4c94060ea2ac7430dfdf826450ee4f2bd8'/>
<id>urn:sha1:152bba4c94060ea2ac7430dfdf826450ee4f2bd8</id>
<content type='text'>
Includes that --raw emits citations verbatim, which is the behaviour
someone diffing against lectio depends on.
</content>
</entry>
<entry>
<title>docs(naming): the config man page, and the field reference</title>
<updated>2026-08-20T07:28:20Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T07:28:20Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=99dbddb2106f8a3ca31c7e0c43b7dc1a81652786'/>
<id>urn:sha1:99dbddb2106f8a3ca31c7e0c43b7dc1a81652786</id>
<content type='text'>
colitur-config.5 documents the file's location, the flag &gt; config &gt;
default precedence, every setting, and that an unknown key is warned
about rather than fatal. Its worked example is a real run against the
shipped example overlay, pasted rather than hand-typed -- including one
genuine gotcha found while verifying it: overlay/template values are not
shell-expanded, so a bare "~/..." written into the config file fails to
load; the full path must be written out instead.

colitur-templates.5's field reference is updated for the view change --
every field checked against lib/render/view.ml and schema/day-v1.json,
not transcribed from memory or an earlier version of this page -- and its
worked example is pasted from a real `colitur table` run. Its
scope-shadowing warning about {{name.la}} is REMOVED and replaced with a
short note that the hazard is now unrepresentable, because name is a
plain resolved string with no dotted path left to fall back through. The
num collision between a month and a week (both carry num, and a bare
{{num}} read from inside a day silently climbs to the week's own value,
not the month's) still exists and is demonstrated with a real render, not
merely asserted. A man page describing a hazard that was fixed is as
wrong as one that omits a real hazard.

Two further stale mentions of the removed {{name.la}} hazard, and two
places describing the schema as "Latin and English names" rather than one
resolved display name, were found in colitur.1 while cross-checking and
fixed alongside the primary rewrite; its own CSV example in EMIT was also
still the pre-Task-5 column list (name_la/name_en, no *_name columns) and
is now the real, verified header.

lang/ already installs beside templates/ and schema/ (a prior hotfix);
colitur-config.5 is added to install/uninstall/man/doc in the Makefile so
`make install`/`make doc` cover it too.
</content>
</entry>
<entry>
<title>docs(templates): document the ordo booklet's required two-pass build</title>
<updated>2026-08-19T20:00:09Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-19T20:00:09Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=ceed38372a66580ec584db10db79cf311c6da9ef'/>
<id>urn:sha1:ceed38372a66580ec584db10db79cf311c6da9ef</id>
<content type='text'>
A LaTeX table of contents needs two pdflatex passes -- the first pass
leaves every entry showing '??', the second resolves the \pageref
values. A user hit exactly this and reported it as a bug; the template
was fine, the instructions were not.

README's rendering example now runs pdflatex twice for ordo.tex (or
names latexmk -pdf as the one-shot alternative) and notes the wall
calendar needs only one pass, having no cross-references of its own.

make check-templates now runs pdflatex twice per LaTeX template too,
so the target exercises what a user actually has to do rather than
silently passing on a single, incomplete pass.
</content>
</entry>
<entry>
<title>docs(render): template reference, install rules, typesetting check</title>
<updated>2026-08-19T08:32:44Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-19T08:32:33Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=b90678e560808dd788fa7d7eb319d93a83005db4'/>
<id>urn:sha1:b90678e560808dd788fa7d7eb319d93a83005db4</id>
<content type='text'>
colitur-templates.5 documents the four syntax forms, the six flavours
and their escaping, and the full view-model field reference. It states
plainly that there are no partials, no raw form and no expression
evaluation -- a template is data, never a program. It documents two
real hazards found during this build, not theoretical ones: the
outward scope fallback silently shadowing an inner name/num key with
an outer one of the same name (with the safe {{#name}}...{{^la}}
idiom), and the engine's lack of host-comment awareness (a {{...}}
inside a LaTeX %, groff .\" or HTML &lt;!-- --&gt; comment is still parsed
as a tag).

It also states the limitation rather than hiding it: AsciiDoc and
Markdown are not escaped, so a feast name containing * or _ renders as
emphasis.

templates/ and schema/ now install into &lt;prefix&gt;/share/colitur/,
matching data/ef/, via new install stanzas; colitur-templates.5
installs to man5 beside colitur-overlay.5. Verified against a scratch
prefix: the installed binary resolves both from the prefix, not the
source tree, when run from an unrelated working directory.

make check-templates typesets every shipped template through pdflatex
and groff when they are installed, and prints SKIPPED loudly when they
are not. Golden tests prove templates render; only this proves they
typeset. A silent skip would read as a pass.

Fixed a real doc/help drift while here: bin/main.ml's --help still said
--overlay was accepted on day and readings only, three commands out of
date (emit, table/render and publish all accept it too), disagreeing
with the man page's own OVERLAYS section, which carried the identical
stale line. Both are corrected; --overlay's own behaviour is unchanged.
</content>
</entry>
<entry>
<title>docs: close the final review's four documentation residues</title>
<updated>2026-08-12T09:19:51Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T09:19:51Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=d0b78ca2ef533080d4621b22071718bb8d3a6158'/>
<id>urn:sha1:d0b78ca2ef533080d4621b22071718bb8d3a6158</id>
<content type='text'>
precedence_ef.mli said "there is no fifth, unclassified case" after the
same commit renumbered the disposition list from four cases to five; the
count is now six.

precedence.mli's physical-equality obligation described the failure mode
as counting a drop "a SECOND time (once because it is genuinely absent,
once because its identity no longer matches)" -- the same condition
stated twice. What actually happens to a rebuilt candidate record is
that the celebration surfaces in BOTH commemorations (the copy) and
omitted (the original), one admission double-reported. precedence_ef.ml
carried the same muddled sentence, which is where the kernel's copy came
from; both now say it plainly.

vocab.ml/.mli referenced {!Rite_ef.rite_ef.ml} -- a filename inside an
odoc reference, which is malformed. Now plain [Rite_ef.rite].

README documented only `dune test`, so the exhaustive 1583-9999 Validate
sweep was discoverable only by reading test_validate.ml's own comment.
With no CI in this repo, that line is what stands between a committed
artifact and one anyone runs.

No behaviour change: `colitur day` output is byte-identical across 1583,
1900, 1902, 2008, 2011, 2026, 2038 and 9999 (2921 days, both domain
edges). 259 tests by default, 260 with the sweep.
</content>
</entry>
<entry>
<title>docs+test: small factual corrections (item 7, part 1)</title>
<updated>2026-08-12T08:40:12Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T08:40:12Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=ac569e859be08320e47909e496d6e5e8f6057da7'/>
<id>urn:sha1:ac569e859be08320e47909e496d6e5e8f6057da7</id>
<content type='text'>
Six independent, small corrections found during the final review:

- dune (workspace root): the comment said the stanza used "(:standard)"
  to preserve dune's default `default` alias target; the stanza actually
  spells that out explicitly via (alias_rec install). Comment now matches
  the code.
- test_validate.ml's test_easter_extremes asserted `List.length ys = 2`
  where an identity check was called for -- the comment already named
  1598 and 1666, but nothing confirmed extreme_years() found THOSE two
  rather than some other pair with the right cardinality. Now asserts the
  identities directly (the project's "cardinality where identity was
  required" vacuity flavour, per the review).
- test_oracle.ml and expected-divergences-missalemeum.sexp both claimed
  "one entry (M13) is [verdict open]" -- M11 is open too (its own verdict
  changed from colitur to open in fix round 1); both now say "two entries
  (M11 and M13)".
- expected-divergences-missalemeum.sexp's M2 note attributed `band` to
  temporal_ef.ml; `band` is precedence_ef.ml's own function.
- lib/kernel/precedence.mli documented `dropped`/`admit`'s physical-
  equality obligation nowhere -- it lived only in one rite's own module
  (Rite_ef.Precedence_ef.admit's doc comment), but this signature is what
  an author of the next rite actually reads. Added the obligation here,
  cross-referencing the EF instance as precedent, not the only source.
- README's opam install line omitted sexplib and ppx_sexp_conv (both in
  dune-project's own depends; `dune build` fails without them for a
  contributor following the README verbatim) and documented only
  `colitur easter`, though `temporal` and `day` both exist and are the
  more useful entry points. Fixed both.

No behaviour change: comment/doc/test-assertion corrections only (the
easter-extremes fix strengthens an assertion, it does not change what
passes). Verified byte-identical `colitur day` output across 1583, 1900,
1902, 2008, 2011, 2026, 2038, 9999. 259/259 tests green.
</content>
</entry>
<entry>
<title>chore: scaffold dune project (kernel lib + cli + tests)</title>
<updated>2026-07-31T12:02:03Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-31T12:02:03Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=e94eeaa19627a9a0f235baf110780c9fb564ca2b'/>
<id>urn:sha1:e94eeaa19627a9a0f235baf110780c9fb564ca2b</id>
<content type='text'>
OCaml 5.2.0 local switch; colitur_kernel library, a colitur executable stub,
and an alcotest+qcheck test runner. AGPL LICENSE, README, generated colitur.opam.
</content>
</entry>
</feed>
