<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/README.md, branch v0.10.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.10.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v0.10.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-21T10:02:49Z</updated>
<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>
