<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git, 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:21:20Z</updated>
<entry>
<title>release: v0.10.0</title>
<updated>2026-08-21T10:21:20Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-21T10:21:20Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=ced4ead904791d5ec813036b8682d24dd001de9d'/>
<id>urn:sha1:ced4ead904791d5ec813036b8682d24dd001de9d</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(config): flavour is settable, and an INI overlay is diagnosed</title>
<updated>2026-08-21T10:19:43Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-21T10:19:43Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=055deaedd6bc1acb770bd96b7da8f985ab0f4f0b'/>
<id>urn:sha1:055deaedd6bc1acb770bd96b7da8f985ab0f4f0b</id>
<content type='text'>
The escaping flavour was the one rendering setting with no config key,
so a template whose extension says nothing needed the flag every run.
Unset still means infer, which config --show reports as (infer) rather
than (none).

Backfills the 0.8.0 and 0.9.0 changelog entries. Both were tagged by
hand rather than through 'make release', which is precisely the guard
that would have refused a release with no changelog line.
</content>
</entry>
<entry>
<title>fix(cli): diagnose an INI overlay passed to --overlay</title>
<updated>2026-08-21T10:09:35Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-21T10:09:35Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=aaf3dc5ba55d46b6b318bb761305013f4c533b26'/>
<id>urn:sha1:aaf3dc5ba55d46b6b318bb761305013f4c533b26</id>
<content type='text'>
The INI overlay form is a SOURCE format that 'colitur convert' turns into
the S-expression one. Handing the INI to --overlay instead failed deep in
the sexp reader with 'more than one S-expression in file', which names
neither the cause nor the cure -- and the shipped examples under
data/ef/examples/ are exactly the files someone would try that with.

The detector reads past the comment header to the first real line and
looks for a [section]. Its first version capped that scan at 40 lines and
poland.ini's own header is 43, so it silently never fired on the very
file it was written for; the cap now bounds only how much of a binary
gets read, and is not a guess at header length.
</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: verify the upload instead of assuming it</title>
<updated>2026-08-21T08:36:00Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-21T08:36:00Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=906df3badc311ac993a7c95589536edacd4220ac'/>
<id>urn:sha1:906df3badc311ac993a7c95589536edacd4220ac</id>
<content type='text'>
release-tarball chained its steps with ';', so a failed scp or ssh still
reached the final echo and it announced a publication that had not
happened -- the file was never in the docroot. Every step is now chained
with &amp;&amp; and the result is checked over HTTP before anything is claimed:
the URL must respond and the bytes must untar.

Also passes -o ClearAllForwardings=yes, since the i2p port forwards in
the ssh config fail when another session holds them and their noise
buries real errors.
</content>
</entry>
<entry>
<title>build: publish the latest tag, not strictly HEAD</title>
<updated>2026-08-21T08:35:06Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-21T08:35:06Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=3acc0f61ab0ab9fa807f81af7fa90bd98f660ce8'/>
<id>urn:sha1:3acc0f61ab0ab9fa807f81af7fa90bd98f660ce8</id>
<content type='text'>
Requiring HEAD to be exactly a tag made the target unusable: the commit
that adds the download link to the README necessarily comes after the tag
it links to. It now archives the most recent tag and says so when HEAD is
ahead of it.
</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>chore: v0.9.0</title>
<updated>2026-08-20T20:40:54Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T20:40:54Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=87d528d379b7d031731f0bb7e9daa52fe036ff6a'/>
<id>urn:sha1:87d528d379b7d031731f0bb7e9daa52fe036ff6a</id>
<content type='text'>
Robustness and hackability pass over the shipped program.

The citation parser is strict about numbers, four pairs of books no
longer share a full title, shipped styles re-parse their own output, and
overlay errors are written for the person editing the file rather than
for a compiler author.

colitur-templates(5) already refers to "before colitur 0.9" for the
month-key change, so the version moves with it.
</content>
</entry>
<entry>
<title>Merge branch 'robustness-and-hackability'</title>
<updated>2026-08-20T20:40:13Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T20:40:13Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=f73bd5d0e33146c24af1e98bf9ea26bd8cbf004b'/>
<id>urn:sha1:f73bd5d0e33146c24af1e98bf9ea26bd8cbf004b</id>
<content type='text'>
An audit of the shipped program, plus the fixes it found.

The citation parser accepted OCaml integer-literal syntax, so a typo like
'Luke 1_1:5' silently became a different chapter. Four pairs of different
books shared a full title -- 1 and 2 Corinthians both rendered 'Epistola
ad Corinthios' -- leaving 108 citations in 2027 alone that a reader could
not resolve to a book. Spec section 8.5 is now delivered rather than
recorded: shipped styles re-parse their own output. Overlay errors no
longer name OCaml source files at the reader.

Also: the new-overlay scaffold shows citations at the right nesting
level, config --show validates before printing, error messages no longer
echo whole file lines, and a month answers to both spellings of its own
name.
</content>
</entry>
<entry>
<title>fix(render): a month answers to both spellings of its own name</title>
<updated>2026-08-20T20:33:07Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T20:33:07Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=671c4264707ec8c81845059746632b00f2481d88'/>
<id>urn:sha1:671c4264707ec8c81845059746632b00f2481d88</id>
<content type='text'>
A week object carries month_name/month_num/month_abbr, because at that
level a bare `name` would be ambiguous. An author who learned those names
inside {{#weeks}} reaches for them one level up inside {{#months}} too --
where they resolved to nothing, and an unknown key renders as the empty
string by design, so the result was a silently blank month heading rather
than any error.

Found by writing a template from scratch rather than copying a shipped
one; every shipped template sidesteps it, which is why nothing caught it.

The aliases are additive, so no existing template or golden changes.
colitur-templates(5) now documents both spellings and says why they
exist.
</content>
</entry>
</feed>
