<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/lib/kernel/temporal.ml, branch v0.10.1</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.1</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v0.10.1'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-11T14:23:01Z</updated>
<entry>
<title>rite(ef): fix duplicate slugs and omitted weeks in the temporal cycle</title>
<updated>2026-08-11T14:23:01Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-11T14:23:01Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=68cff511cd79ca5450c4f21dffba1b1e4ac93389'/>
<id>urn:sha1:68cff511cd79ca5450c4f21dffba1b1e4ac93389</id>
<content type='text'>
Two correctness bugs in Temporal_ef, both only visible across many
years, not a single point assertion:

1. Duplicate slugs within one liturgical year. Christmastide has no
   numbered weeks, so the ferial fallback's &lt;season&gt;-&lt;week&gt;-&lt;weekday&gt;
   scheme collapsed every feria in it to literal week "0". Since
   colitur's Christmastide runs 25 Dec - 13 Jan (RG 72-73, a deliberate
   divergence from lectio), the same weekday recurs across that span
   and the keys collided (e.g. ef-christmas-0-saturday on three
   different dates). Fixed with a dedicated christmastide_feria_slug
   that splits the span into four sub-stretches, prioritising
   compatibility with lectio's own keys wherever lectio has one:
     - 26-28 Dec keeps lectio's existing ef-christmas-0-&lt;weekday&gt;.
     - 2-5 Jan becomes ef-christmas-1-&lt;weekday&gt; -- lectio collapses
       this indistinguishably into the same key as the stretch above,
       so there is nothing to preserve; a colitur-only lectionary gap.
     - 7-13 Jan splits at the actual first-Sunday-after-Epiphany
       origin: on/after it, this is genuinely week 1 of Time after
       Epiphany and takes lectio's own ef-time-after-epiphany-1-&lt;weekday&gt;
       (which also can't collide with that season's own later week-1
       ferias, since it's the same computation). Before it (0-6 days,
       whenever Epiphany doesn't fall on a Saturday), a first attempt
       at labelling this "week 1" too, matching a literal reading of
       lectio's behaviour, was verified empirically (a throwaway sweep
       of the full 1583..9998 domain) to reproduce duplicates in most
       years -- so this remainder is its own ef-christmas-2-&lt;weekday&gt;,
       a further colitur-only gap.
   Verified with the same throwaway sweep: zero duplicate slugs across
   1583..9998 after the fix.

2. named's week field was set by hand on some branches (Passion/Palm
   Sunday, Easter, Low Sunday, Pentecost and its Vigil, Christ the
   King) and left at None on others (Ascension and its Vigil, Corpus
   Christi, Sacred Heart) even though all of them sit inside a
   numbered season run. named no longer carries a week at all --
   temporal now calls week itself for every day, named or not, so "a
   named day inside a run carries that run's week" holds by
   construction rather than by remembering to set it on each branch.
   temporal.mli's week field doc is reworded to state the actual rule.

Covering tests: point assertions for all four Christmastide
sub-stretches; a QCheck property scanning random years for any
duplicate slug within a liturgical year (excluding the deliberate
resumed-Sunday reuse); point assertions for the four previously-None
days now carrying their week (first to fail without the fix: Ascension
Vigil, expected Some 6, got None); a QCheck property asserting
temporal's week equals week for every day of the year, replacing a
prior property whose fallback made it structurally incapable of
detecting an omitted week.

Also: cite RG 91 e18 for the September/Advent Ember days matching
lectio and flag the Lent/Whitsun Ember and Rogation slugs as
colitur-only lectionary gaps inline, matching the existing
Nativity-vigil/octave-day convention; cite RG 117/123/127/128/131 for
season colours and Gaudete/Laetare rose; drop the unreachable
Passiontide arm from the Sunday-rank match (Passiontide has only two
Sundays and both are already named above, so no Passiontide Sunday
ever reaches that fallback).
</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>
