<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/test/dune, branch v1.2.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=v1.2.1</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v1.2.1'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-09-02T10:30:56Z</updated>
<entry>
<title>feat(cli): --help is one screen, not the whole manual</title>
<updated>2026-09-02T10:30:56Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-09-02T10:30:56Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=5dd14266f2609faadc3ec60077127a7ef7e8ac8b'/>
<id>urn:sha1:5dd14266f2609faadc3ec60077127a7ef7e8ac8b</id>
<content type='text'>
It printed 374 lines: every output format, the RFC 4180 quoting rule, the
template scope hazard, the publish manifest semantics. All of that is real
documentation and all of it is already in colitur(1), installed beside the
binary. A help text nobody reads at the terminal is not more helpful than a
short one, it is less -- the reader stops looking.

Now 42 lines: the commands, the flags most runs need, the year domain, the
exit status, and where the rest lives. Everything removed is in the man
pages, which is checked rather than assumed -- each dropped section has a
counterpart section there.

One thing moved rather than went. cli.t pinned `rubrics`' documented field
list against what `rubrics` actually prints, because that field count drifted
once already and stayed wrong for a whole review round. Deleting the prose
would have quietly retired the check, so it now reads the worked example out
of man/colitur.1 instead, and test/dune's cram stanza gains the man page as a
dep -- a sandbox holds only what that stanza names. Mutation-tested: changing
the documented example reddens the suite.

The tagline also stopped saying "Roman rite, 1962" -- the OF has shipped since
v1.1.0.
</content>
</entry>
<entry>
<title>feat(of): assemble Rite_of.context and wire --rite of into the CLI</title>
<updated>2026-08-26T07:53:22Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-26T07:53:22Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=8fa9db25f55f4ae92ad6a28115484dd981593a3c'/>
<id>urn:sha1:8fa9db25f55f4ae92ad6a28115484dd981593a3c</id>
<content type='text'>
Task 5 of Phases 3-5 (the payoff task): bundles Tasks 1-4's separately
built pieces (Temporal_of, Precedence_of, Rubrics_of, Lectionary_of)
into a (Vocab_of.season, Vocab_of.rank) Colitur_kernel.Rite.t, and
wires colitur day/readings --rite of &lt;year&gt; into the CLI. Default
stays ef; every pre-existing invocation is byte-identical (asserted
directly in test/cli.t and against a real v1.0.0 build for three
years, plus git diff --stat v1.0.0..HEAD over lib/rites/rite_ef/,
lib/kernel/, data/ef/ is empty).

No kernel change was needed, confirming the spec's central claim.
season_runs needed real thought rather than the brief's own suggested
Vocab_of.seasons: Temporal_of.season's own 'first run'/'second run'
comments confirm Ordinary Time is genuinely interrupted by Lent and
Easter over one liturgical year, so the expected run-length-compressed
sequence names it twice, six runs over five seasons -- exactly the
case Rite.t.season_runs's own doc comment already names as its
illustration for why this field is rite-supplied rather than derived.
easter/fixed_key are as specified, each carrying its own citation
(Gregorian computus; the 2002 Missal's one bissextilis occurrence is a
leap-year table entry, not a kalends-doubling rule, so fixed_key is
identity).

Follows rite_ef.ml's template and its lectionary-parameter lesson
exactly: lectionary is caller-supplied, not closed over.

test/test_rite_of.ml resolves the real assembled rite (calendar-2002
.sexp + all 13 amendment overlays + lectionary.sexp) through Calendar
and Validate.run, the same discipline test_validate.ml/test_rite_ef.ml
already apply to EF. This is the first time rite_of has been checked
this way, and it surfaced two new, real, cited gaps outside this
task's own scope to fix: Temporal_of never reaches Normae n.35(a)'s
30-December Holy Family fallback in a year with no Sunday in 26-31
December (first hit 1583, the domain floor), and Temporal_of.anchors
disagrees with temporal on 24 December when that date is itself a
Sunday (Advent IV outranks the Vigil, first hit 2006). Both pinned as
known-wrong, not fixed, the same treatment the brief's own pre-known
St Joseph/Palm Sunday gap (Normae n.56(f)) gets, pinned on 2062. A
third gap was found in data/of/lectionary.sexp's own coverage (audited
against one civil year only, so the other weekday-cycle letter is
unaudited and at least one pairing is asymmetric on shipped data) --
that file is excluded from this task, so the wide 2005-2050 sweep
checks structural invariants only and leaves the citation-chain checks
to the small, individually-audited landmark-year set.

make check (COLITUR_EXHAUSTIVE_SWEEP=1): exit 0, 867 tests, ~316s.
</content>
</entry>
<entry>
<title>feat(of): Lectionary_of -- reading-cycle arithmetic and the lectionary chain</title>
<updated>2026-08-26T07:15:08Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-26T07:15:08Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=155c2e55948dc179a45458d856808f7105878d1f'/>
<id>urn:sha1:155c2e55948dc179a45458d856808f7105878d1f</id>
<content type='text'>
Task 4 of Phases 3-5: the last Rite.t field OF still needed, `readings`.

The cycle rules are CODE, cited to OLM (Ordo Lectionum Missae) 1981
Praenotanda -- verified against the real page image
(docs/research/of/olm-1981.pdf pp.32-33/"XXXII-XXXIII"), not the
document's own unreliable OCR text layer, per the design spec's own
caveat. n. 66 (with its footnote 102's worked example, 1980=C/1981=A/
1982=B/1983=C) gives the three-year Sunday cycle; n. 69 point 4 gives
the two-year weekday cycle, Year I in odd label years, Year II in
even. Both derive the "label year" the same way: one more than the
civil year Advent I opened in, per n. 66's footnote 102 itself
("nempe a prima hebdomada Adventus, quae cadit in anno civili
praecedente") -- so the cycle turns at Advent I, not 1 January, exactly
where the task brief said to get it right. The design spec's own
citation for the weekday rule, "Praenotanda n. 649", does not survive
a direct check against the primary source (search finds "649" only in
unrelated index/page-number entries); corrected here to n. 69, the
paragraph the rule's own Latin text actually sits under, confirmed by
the page image's own printed margin number.

The data is bootstrapped from lectio's of-lectionary.ini (988 keys,
niedziela.pl, harvest 2020-2025) by tools/bootstrap_lectionary_of.ml
-- OCaml, not the brief's own suggested .py: tools/bootstrap_lectionary
.ml already established this exact shape for EF, including a real
safety net ([assert_reachable], sweeping Rite_of.Temporal_of.temporal
AND the real merged sanctoral layer directly) that a second-language
reimplementation would either duplicate or lose. Handles two real
data anomalies found while building it: one malformed ini line (a
Polish Septuagint-numbering annotation for Sirach 3, "Syr 3,2-6.12-14"
against OLM/CEI/USA's shared Nova Vulgata, matching the design spec's
own sec5 finding); and two Sunday-cycle-labelled bases (Annunciation,
Immaculate Conception) where a scraping-year artifact left one of
three cycle letters carrying a different day's Mass entirely --
resolved by a general, mechanical 2-of-3 majority rule, not a
per-saint hand edit, and logged.

Coverage measured in both directions, per the brief's own Step 1:
- 1 of 365 days in civil year 2026 (25 December, the Christmas DAY
  Mass) has no Temporal_of-slug match anywhere in lectio's 988 keys --
  only the Vigil is present. Named in the data file's own header.
- 0 of 438 distinct lectio bases map to no colitur slug, after 19 are
  deliberately excluded (late-Advent/Christmas-season DATE-keyed
  duplicates lectio also carries in a WEEKDAY-keyed form colitur's own
  slugs actually match -- Lectionary.t has no date-keyed lookup at
  all, so the date-keyed family is transcription-inert, not silently
  dropped: named explicitly, not a residual).

Lectionary_of.readings is three steps (no Commons indirection, unlike
EF -- out of this task's scope): the observed celebration's own
embedded citations; else, for a real sanctoral winner, its own slug
looked up directly (flat, then both cycle letters); else the day's
own temporal slug, same lookup. No preceding-Sunday fallback: OF's own
two-year cycle assigns every Ordinary Time weekday its own reading by
design, and no OF norm was found instructing otherwise.

Tests (test/test_lectionary_of.ml, 12 cases): a cycle-arithmetic table
straddling Advent 1980/1981/1982/2025 inside single civil years,
reproducing OLM n.66's own worked example directly; SHA-256 pins on
both the emitted file and lectio's own source (embedded in the
provenance header); a pinned, NAMED 2026 coverage result (364 resolve,
exactly {25 December} does not -- never a bare count); two resolution-
chain spot checks (a plain ferial, and a saint's day beating the
ferial it would otherwise fall on); and a real subprocess test that a
missing lectio source file fails the generator loudly, non-zero exit,
no output written -- the exact bug Task 1's own generator shipped and
needed a review round to fix.

dune test: exit 0, 856 tests. make check (COLITUR_EXHAUSTIVE_SWEEP=1,
full 1583-9999 sweep): exit 0, 862 tests, ~342s, both run unpiped in
the foreground. git diff --stat v1.0.0..HEAD -- lib/rites/rite_ef/
lib/kernel/ data/ef/ still empty.
</content>
</entry>
<entry>
<title>feat(of): post-2002 GRC amendment overlays, one file per decree</title>
<updated>2026-08-25T22:18:16Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T22:18:16Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=85c1f194c03634eaa905f0bfd630fe23b5f53e59'/>
<id>urn:sha1:85c1f194c03634eaa905f0bfd630fe23b5f53e59</id>
<content type='text'>
Adds data/of/amendments/*.sexp: 13 overlay files, one per decree,
carrying the General Roman Calendar's amendments since the 2002 typical
edition (docs/research/of/PROVENANCE-amendments.md's own 15-item
inventory, items 10-12 sharing one decree; items 2 and 3, though issued
the same day, carry different protocol numbers and are counted as two
decrees). 14 Add directives (Padre Pio, Juan Diego, Guadalupe, John
XXIII, John Paul II, Mary Mother of the Church, Paul VI, Loreto,
Faustina Kowalska, Gregory of Narek, John of Avila, Hildegard of Bingen,
Teresa of Calcutta, John Henry Newman) and 2 Edit directives (Mary
Magdalene's rank memoria-&gt;festum; Martha/Mary/Lazarus's name widened,
same slug, same date and rank -- a continuation of the existing
memorial per the decree's own text, not a suppression and replacement).

Mary, Mother of the Church is the one movable entry (Easter_offset 50,
the Monday after Pentecost) -- verified against the decree's own text
and against Colitur_kernel.Computus.gregorian_easter in three real
years, no kernel change needed.

data/of/calendar-2002.sexp is untouched, per spec sec4.1.

Adds test/test_amendments_of.ml: every file parses, each has a pinned
SHA-256, applying all 13 in decree order yields 222 entries (208 base +
14 Add) with an empty Overlay.merge diagnostics list, and Mary Mother of
the Church resolves to the Monday after Pentecost in three real years.

Two Precedence_of interactions are recorded, not fixed (out of scope for
a data-only task): a movable Memoria_obligatoria can land on an existing
fixed one (verified for 13 June 2011), a genuine band tie Normae n. 14
does not address and Precedence_of.ml does not implement; and adding
Hildegard of Bingen changes which of two ad-libitum memorials on 17
September Precedence.resolve reports as observed, by alphabetical
tie-break alone.
</content>
</entry>
<entry>
<title>feat(of): transcribe the 2002 General Roman Calendar</title>
<updated>2026-08-25T21:14:13Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T21:14:13Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=d201028d71ad3f26d5ec0b9c12268475e0b70cfd'/>
<id>urn:sha1:d201028d71ad3f26d5ec0b9c12268475e0b70cfd</id>
<content type='text'>
Extracted from the Latin typical edition, which is the authority; lectio's
roman-calendar.ini is a cross-check only and every divergence is adjudicated
against the Missal in the provenance header.

A blank grade column means Memoria ad libitum, per the calendar's own
footnote, rather than a missing value. 206 entries; 1 January, 6 January and
25 December are deliberately excluded because Temporal_of.named already
computes them, and shipping them here too would create a duplicate
candidate for the same day.

Colour is derived from IGMR n. 346, cited per class in the extractor; the
lectio cross-check surfaces one rank divergence (22 July, Mary Magdalene --
lectio reflects the 2016 post-2002 elevation decree, out of scope here) and
17 colour divergences, all adjudicated in the provenance header.
</content>
</entry>
<entry>
<title>test(of): validate Phase 1's Ordinary Time resumption against litcal</title>
<updated>2026-08-25T14:31:15Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T14:31:15Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=b9cb5060d2ba5aa7f7a9d6d97e3bced112e30fed'/>
<id>urn:sha1:b9cb5060d2ba5aa7f7a9d6d97e3bced112e30fed</id>
<content type='text'>
Adds a sixth-lineage external validation layer for the OF rite module's
Phase 1 temporal cycle, targeting the single highest-risk function that
report named: the two-block Ordinary Time week arithmetic (Normae n. 44),
which has no external witness anywhere in Phase 1's own suite and whose
output selects the Mass formulary, not merely a label.

Witness: litcal (Liturgical Calendar API), Apache-2.0, already archived
and SHA-256-pinned by the sibling lectio project. AELF was considered and
correctly excluded earlier (its CGU forbids redistribution) -- litcal is
what it was replaced with.

- tools/extract_litcal_ordo.py verifies all twelve archived
  calendar-YYYY-en.json files (2024-2035; the task brief said eleven,
  but twelve are actually pinned in lectio's manifest -- all twelve are
  used) against lectio's own manifest.tsv, then builds one fixture
  spanning the contiguous 4382-day range those twelve liturgical-year
  files cover.
- test/fixtures/litcal-temporal-2024-2035.sexp: one row per day, season
  and (where witnessed) Ordinary Time week, with full provenance,
  licence, per-year Easter dates and the row-selection rules in its own
  header.
- test/test_litcal_of.ml calls Temporal_of.temporal directly (no Rite.t)
  and compares 1:1 against the fixture: zero Ordinary Time week
  mismatches on all 1876 witnessed days (zero tolerance, no allow-list);
  the only season divergence class is the Sacred Triduum, which litcal
  tags with a season value colitur's vocabulary deliberately has none of
  -- one cited allow-list entry, data/of/expected-divergences-litcal.sexp,
  36 rows, exact.
- Mutation-tested: dropping the backward-from-34 adjustment reddens this
  layer (1511 of 1876 days) plus three pre-existing Phase 1 tests; the
  mutation was not committed.

Does not touch lib/rites/rite_ef/, data/ef/, or lib/rites/rite_of/ --
this validates Phase 1, it does not change it. Full suite: 786 tests via
dune test, 791 via make check, exit 0 both; lib/bin diff empty throughout.
</content>
</entry>
<entry>
<title>feat(of): Phase 1 of the OF rite module — vocab_of, temporal_of</title>
<updated>2026-08-25T13:35:59Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T13:35:59Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=6559a9b19451ce82a7d71281e25899acbcee2d49'/>
<id>urn:sha1:6559a9b19451ce82a7d71281e25899acbcee2d49</id>
<content type='text'>
The first code for a second rite. lib/rites/rite_of/vocab_of implements
the OF's five-way rank vocabulary (Sollemnitas/Festum/Memoria_obligatoria/
Memoria_ad_libitum/Feria) and five-season vocabulary (Advent/Christmas/
Lent/Easter/Ordinary_time), each constructor cited against the 2002
Missale Romanum's Normae universales and the Tabula dierum liturgicorum.
temporal_of implements season boundaries, week numbering — including
Ordinary Time's own two-block resumption, derived from the Missale's own
"HEBDOMADA I/XXXIV 'per annum'" headings and empirically verified across
the whole 1583-9999 domain — named temporal days, and Sunday/ferial
slugs. Both satisfy Colitur_kernel.Temporal.RITE with no kernel change.

No Rite.t is assembled and no CLI wiring is added (Phase 2's own scope);
lib/rites/rite_ef and data/ef are untouched, verified byte-identical
against the v1.0.0 tag across a domain-spanning sample.

test/test_temporal_of.ml adds unit tests for every boundary and named day
plus seven QCheck properties (seasons contiguous, Ordinary Time weeks in
1..34, Advent always four Sundays, slug uniqueness, weekday agreement,
determinism, consecutive liturgical years partition civil time), with a
committed exhaustive sweep mirroring test_validate.ml's own convention.

Full account, including the Ordinary Time derivation's evidence and a
list of EF concepts that do not carry over, in
.superpowers/sdd/of-phase1-report.md (untracked, gitignored).
</content>
</entry>
<entry>
<title>feat(ordo): wire the extraordinaryform.org preface column in as a third witness</title>
<updated>2026-08-24T14:16:59Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-24T14:16:59Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=0d061abc7cc5cdc51ded6ee69e00e187813f5e1b'/>
<id>urn:sha1:0d061abc7cc5cdc51ded6ee69e00e187813f5e1b</id>
<content type='text'>
Extends the preface comparison (RG 482-499) with a third, independent
publisher, extraordinaryform.org's three annual Ordo editions
(2024-2025, 2025-2026, 2026-2027), previously declined for two reasons
that are now resolved:

- "Advent" is not a preface: RG 494(b) grants the Trinity preface on
  every Advent SUNDAY, RG 498 the residual Common on every Advent
  FERIA; this source's own "Advent" label covers both indiscriminately
  (confirmed live on all 11 non-impeded Advent Sundays in the corpus).
  Classified by the day's own civil weekday, not a static table.
- The known Vigil-of-St-Lawrence gap is reconfirmed, with a nuance not
  present in the earlier audits: colitur's own RG33-third-trigger now
  omits the vigil in some years too, so the corpus's gap and colitur's
  answer coincide in 2025 (a full match, not a coincidence) while 2027
  still shows the classic identity-wrong-but-preface-invisible shape.

Re-derives the known menu-trap office filter (Requiem-skip, "and "-chain)
against the live JSON and finds a second, general pattern: "Saturday of
Our Lady" (RG78's BVM Saturday Office), whenever listed, is
unconditionally the office -- checked exhaustively across all 38
instances in the corpus, zero counter-examples. A third, generic
"absorption" rule was deliberately not built: it would resolve 2 of the
11 residual divergences but wrongly misfires on a structurally identical
but semantically different shape (an optional Rogation-day Mass option).

The JSON's own extraction carries a genuine classifier gap: parse_ordo.py's
hardcoded PREFACES set omits "Christ the King", misfiling it into comms;
recovered in the generator, not left blank.

11 of 1088 comparable rows diverge, resolving to 7 adjudicated root
causes (E1-E7): two Commemoration_only Marian titles reduced to
commemorations (Mt Carmel, Ransom), two genuine sanctoral data gaps
cross-confirmed absent by the FIUV/LMS witnesses (Miraculous Medal,
St John before the Latin Gate), two single-witnessed efdotorg outliers
against FIUV/LMS agreement (St Michael's Dedication, All Saints on a
Sunday), and one isolated source labelling slip.

Mutation-tested: corrupting the RG495 BVM-Saturday clause reddens 9
tests across this new layer and both existing Ordo witnesses.

Per-edition agreement: 358/363 (2024-2025), 358/363 (2025-2026),
361/362 (2026-2027).
</content>
</entry>
<entry>
<title>test(fiuv-ordo): add the FIUV universal Ordo as a second, independent witness</title>
<updated>2026-08-22T13:11:43Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-22T13:11:43Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=96aed1b6f04ef89e8f3d18af8b13e6fd30dbd4d2'/>
<id>urn:sha1:96aed1b6f04ef89e8f3d18af8b13e6fd30dbd4d2</id>
<content type='text'>
Wires in the FIUV (Foederatio Internationalis Una Voce) Ordo for
2025-2026 as validation layer seven -- the first UNIVERSAL (not
diocesan) source in this project, and the first compiled by someone
other than the LMS editions' own Peter Day-Milne (Joseph Shaw, FIUV
President).

tools/extract_fiuv_ordo.ml hand-parses pdftotext's -layout dump of the
Latin-language ordo (no Str/regex, frozen deps). Three real parsing
traps were found and fixed by tracing actual false results against the
raw source, not assumed in advance:

- "Gloria" is also the first word of "Gloria Patri" (the psalm
  doxology), which can appear INSIDE the very Mass clause being scanned
  (Good Friday: "...omittuntur ps. Iudica me et Gloria Patri), Gloria,
  sine Credo..."). Guarded by rejecting any "Gloria" hit whose next
  token is "Patri".
- Christmas Day's own rubric uses the PLURAL "Missae"/"Missae" ("tres
  Missae celebrantur..."), never the singular "Missa" every other real
  day anchors on -- silently produced gloria=None/credo=None on the one
  most doctrinally unambiguous day in the calendar until traced and
  fixed, guarded in turn against "Missae defunctorum" (an unrelated
  Requiem-prohibition notice appearing at the end of many day-blocks).
- The Vespers boundary (bounding the primary Mass option before a
  second "Vel Missa" alternative or before Vespers information) missed
  the ligature spelling "VESPERÆ", the dominant form in this source,
  letting a whole day's trailing prose leak into the captured [praef]
  field on the task brief's own worked example day (19 September).

A distinct second stop-marker bug: the malformed trailing entry this
source shares structurally with the LMS PDFs (a stray, mislabelled
duplicate of 1 January) was initially over-matched by a generic
"first token is 4 digits" heuristic, which false-positived on an
indulgence-decree date citation wrapped mid-sentence in October
("...20 augusti / 1885, 26 augusti 1886..."), truncating the extraction
to 308 of 400 real days. Fixed by anchoring on the tail entry's own
distinctive "1st Jan" opening instead.

Five opposite-prediction Creed probes are re-verified by the tool
itself against its own extracted rows (a failed probe is a hard exit,
not a printed claim) before the fixture is written.

test/test_fiuv_ordo.ml compares the Creed against colitur across all
399 comparable days (Holy Saturday excluded, no Mass that day) --
CLEAN, zero unexplained divergences, a genuine second confirmation of
{!Rite_ef.Rubrics_ef.creed} independent of the LMS lineage. [praef],
[te_deum] and [class_] (including the FIUV ordo's own "III cl." vs
"III cl. (Priv.)" Cum Sanctissima convention, stated on its title
page) are captured into the fixture but deliberately not compared --
colitur has no Gloria/preface predicate yet, and its default
configuration models no Cum Sanctissima overlay to compare the class
convention against.

All 634 tests green (dune test), 635 with the exhaustive sweep and
make check. No lib/ file touched.

Claude-Session: https://claude.ai/code/session_017ZBxCCRM2ojnBupp3SBxV9
</content>
</entry>
<entry>
<title>test(lms-ordo): extend the LMS witness layer from one year to three</title>
<updated>2026-08-22T12:51:07Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-22T12:51:07Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=72dd2426f020f83a392158ead7bd15b36088fd08'/>
<id>urn:sha1:72dd2426f020f83a392158ead7bd15b36088fd08</id>
<content type='text'>
Generalises tools/extract_lms_ordo.ml's start-of-body detection: the
hardcoded "End of November 2024" sentinel assumed every edition opens
with an "End of November" stub section. The 2023-2024 edition has none
(Advent Sunday 2023 fell on 3 December, so the compiler folded the two
tail days into the "December 2023" header directly) -- the generalised
detector anchors on the body's own "ORDO" title line instead, verified
unique in all three known editions and distinct from the Table of
Contents' lowercase "Ordo" entries.

Extracts test/fixtures/lms-ordo-2023-2024.sexp (397 rows) and
lms-ordo-2025-2026.sexp (399 rows), each with a provenance header
carrying its own SHA-256, source citation, and a per-edition
characterisation record: five opposite-prediction Creed probes,
independently re-verified against this run's own extracted rows (a
failed probe is now a hard die, not a printed claim). The 2025-2026
edition needed a different sharp II-class pairing than 2024-2025's
Joachim/Stephen one, because Joachim (16 August) is impeded by a Sunday
that year -- recorded in the fixture header, not silently swapped.

test/test_lms_ordo.ml is refactored into a parameterised make_suite,
instantiated once per edition; every count Task 6 hardcoded against the
single 2024-2025 window is now a per-edition parameter, several of which
turned out to differ once measured (BVM-Saturday population 12/14/13,
Ascension-week exclusion 1/3/2). Two mapping gaps surfaced only by the
new windows and fixed here (test-side, not colitur): Low Sunday reached
via Preceding_sunday for the first time (absent from 2024-2025's own
window), and the Ascension-week exclusion was wrongly keyed off week
number alone -- Rogation Monday also resumes week 6's Sunday but falls
BEFORE Ascension, not after, and the Ordo prints the ordinary Sunday
text there. Re-bounded by date, against Ascension and Pentecost.

Two genuine divergences surfaced in the 2023-2024 window and are
allow-listed (L3, L4) rather than fixed, per this task's no-lib-changes
scope:

- L3 (verdict ordo): colitur has no bissextile calendar rule. The 1962
  Missal's own calendarium moves St Matthias from 24 to 25 February in
  leap years (docs/research/LT.txt:5011); colitur keeps him on the 24th
  every year. Domain-wide upper bound measured with a throwaway sweep:
  1,650 of 2,041 leap years in 1583-9999 currently observe him there.

- L4 (verdict open): Christmas Eve falling on the 4th Sunday of Advent
  (2023-12-24, roughly 1 year in 7). colitur says the Creed is said,
  reading RG 475(a)'s Sunday clause; the Ordo says it is not. RG 30(a)'s
  own "locum tenet ... nulla fit commemoratio" for this exact vigil
  reads like RG 16(a)'s Feast-of-the-Lord-on-Sunday shape, which colitur
  already treats as Creed-preserving -- but RG 475(a) names "festo"
  specifically, and a vigil is its own liturgical-day category (RG 35),
  so the counter-reading is real too. Left open rather than adjudicated.

All 630 tests green (dune test), 631 with the exhaustive sweep.

Claude-Session: https://claude.ai/code/session_017ZBxCCRM2ojnBupp3SBxV9
</content>
</entry>
</feed>
