<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/lib/kernel/vocab.ml, branch v0.1.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.1.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v0.1.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-12T09:19:51Z</updated>
<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>kernel+rite-ef: correct stale plan-relative deferrals (item 7, part 2)</title>
<updated>2026-08-12T08:40:27Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T08:40:27Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=6d6ba502d8022d9e0b8cdc5302f5761d39895192'/>
<id>urn:sha1:6d6ba502d8022d9e0b8cdc5302f5761d39895192</id>
<content type='text'>
Several comments described work as "arriving with Plan 3" or "waiting
for Plan 3" that either shipped without it or refer to the wrong future
plan number, all now false in ways that would mislead the next reader:

- temporal_ef.ml (two places) and precedence_ef.ml said the Major
  Litanies (25 April, RG 80) "arrive with Plan 3's sanctoral". Plan 3
  shipped, in this branch, without them; register §6 tracks this as a
  plain open item with no plan committed to build it, and now says so.
- temporal_ef.ml said the Sacred Triduum's "own named offices are a Plan
  3 sanctoral addition". Wrong on two counts: Plan 3 shipped without
  adding them, AND a proper office for I-class FERIAS was never a
  sanctoral matter in the first place (RG 21 defines "feria" to exclude
  Sundays/feasts, not the reverse). 2026-04-02/03/04 still resolve to the
  ordinary Passiontide ferial fallback's own generic slugs
  (ef-passiontide-2-{thursday,friday,saturday}), confirmed against real
  output; register §6 now records this as its own open item.
- temporal_ef.ml said the Rogation-Wednesday commemoration (Ascension
  Vigil day, entry 21) "waits for RG 108-111" -- both the precedence
  framework and RG 108-111 exist now; the Wednesday's own commemoration
  is still never constructed, but for a different, still-real reason (no
  candidate is wired for it), not a forward dependency. Fixed at both of
  this comment's two occurrences in the file.
- vocab.ml/vocab.mli's `seasons` field doc said "Validate's contiguity
  check reads this" -- false since validate.ml's "seasons" check switched
  to Rite.t.season_runs in this branch (rite-supplied, to support a
  season appearing in more than one run, which the modern form's Ordinary
  Time needs and EF does not).
- vocab.ml/vocab.mli's `ranks` field doc said "it is not a precedence
  relation until Plan 3 defines one" -- Plan 3 did define one (RG 111's
  dignity ordering), but as its own small, separately-hardcoded function
  in precedence_ef.ml, not one derived from this field; corrected to say
  so precisely rather than leaving a forward-looking claim unresolved.
- The lectionary bootstrap (reading citations, Liturgical_day.t's own
  `citations` field) is called "Plan 3" at slug.ml, vocab_ef.ml, and
  three places in temporal_ef.ml, but "Plan 4" at liturgical_day.mli
  (whose own doc comment -- "always empty until Plan 4" -- is the
  authoritative one: the SANCTORAL bootstrap is Plan 3 and shipped; the
  LECTIONARY bootstrap is a separate, later Plan 4). All six corrected to
  say Plan 4, cross-referencing the Plan 3/4 distinction at the first
  (slug.ml) occurrence so the reasoning is not duplicated six times.

No behaviour change: every edit here is a comment/documentation
correction. Verified byte-identical `colitur day` output across 1583,
1900, 1902, 2008, 2011, 2026, 2038, 9999. 259/259 tests green.
</content>
</entry>
<entry>
<title>kernel: Vocab, Celebration and Temporal parametric types</title>
<updated>2026-08-11T09:59:43Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-11T09:59:43Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=abade24943f2f77c058b5ff768093b8babc9a8c3'/>
<id>urn:sha1:abade24943f2f77c058b5ff768093b8babc9a8c3</id>
<content type='text'>
Rite specificity is carried by type parameters plus a vocab record of
operations rather than by functors: the same guarantee that a rite cannot name
another rite's season, without threading module plumbing through every kernel
module. Celebration takes only the rank parameter, since it has no season
field and OCaml rejects a type variable that appears in no field.
</content>
</entry>
</feed>
