<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/test/golden/ordo-2027.typ, branch v1.2.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=v1.2.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v1.2.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-22T18:55:18Z</updated>
<entry>
<title>fix(ef): ferias after the Ascension repeat its own Mass, not a Sunday's</title>
<updated>2026-08-22T18:55:18Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-22T18:55:18Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=9c96e0afc19925b651e0dfee3bc9182dee72acf0'/>
<id>urn:sha1:9c96e0afc19925b651e0dfee3bc9182dee72acf0</id>
<content type='text'>
Ascension has no octave under the 1960 rubrics -- confirmed structurally:
the Proprium de Tempore's own table of contents runs straight from "In
Ascensione Domini" to "Dominica post Ascensionem" with no per-feria
headings in between. Step 3 of the reading chain therefore fell through
to Preceding_sunday on every unoccupied weekday in that stretch, walking
each one back to the 5th or 6th Sunday after Easter's own citation.

The Missal's own Proprium de Tempore carries an explicit marginal rubric
immediately after the Ascension's Mass propers, before "Dominica post
Ascensionem" begins: "Diebus a feria VI post Ascensionem usque ad feriam
VI ante vigiliam Pentecostes inclusive, dicitur Missa de festo
Ascensionis, cum Gloria et praefatione de Ascensione, sine Credo et
Communicantes proprio" -- every feria without its own proper, from the
Friday after the Ascension through the Friday before the Vigil of
Pentecost, repeats the Ascension's own Mass. RG 490(b) corroborates
independently: it assigns the Ascension preface "tamquam de Tempore"
across that identical window, which only makes sense if the Mass
actually repeated there is the Ascension's, not a numbered Sunday's
(whose own Mass would carry no need for a preface override at all).

Witnessed directly, not only inferred from the rubric: the LMS Ordo
prints "Mass of the Ascension" literally on every affected day across
all three of its fixture windows, in BOTH the tail of Ascension's own
week and the following week -- ruling out the alternative reading (that
the second week instead resumes "Dominica post Ascensionem"'s own Mass,
which a first pass over the FIUV Ordo's own week-labelled titles could
suggest at a glance; its own [praef] field for the same two dates
independently reads "Ascensionis", resolving the apparent conflict).

Implemented as data, not logic, matching this codebase's own established
precedent for the identical RG 299 shape (the week after Trinity Sunday,
data/ef/lectionary.sexp's [trinity_week_entries]): six new hand-authored
entries, [ascension_week_entries] in tools/bootstrap_lectionary.ml,
regenerated against a git-pinned copy of lectio's own source ini (SHA-256
verified unchanged) so the regeneration carries no unrelated drift. The
window's two Saturdays are deliberately excluded -- RG 78's votive Office
of Our Lady on Saturday always wins an otherwise-unoccupied Class4
Saturday first, before step 2 (this fix's own entry point) is ever
reached, so an entry for either slug would be dead data.

Blast radius measured in-process across the full 1583-9999 domain
(throwaway probe, not committed): 16 350 days total across the six
slugs, every one resolved via step 2 (Own_slug), zero anomalies, and the
window's two Saturdays confirmed to contribute zero hits via this cause
across the whole domain, corroborating the RG78-interception reasoning
by direct sweep.

Closed L2 in data/ef/expected-divergences-lms.sexp. New cited entries:
C41 in data/ef/expected-divergences.sexp (95 of 16801 rows, 2005-2050 --
lectio has no equivalent rubric and still walks these ferias back);
M31 in data/ef/expected-divergences-missalemeum.sexp (3 rows in the
2026-2027 window, plus the same shape independently reconfirmed in the
2035 and 2038 live-capture windows) -- missalemeum, Divinum Officium's
lineage, still gives the same wrong answer colitur itself used to give,
which is why these rows used to agree with M18's shape and now escape it
(M18 373 -&gt; 370, the same mechanism M23-M27 established when the
citation axis was first built).

Golden pin: 2031-05-23, the exact date the bug report was filed against.

Mutation-tested: reverting data/ef/lectionary.sexp alone (a git-diff
capture/restore, not a source-code revert, since the fix is data) reddens
19 tests across the differential, both oracle fixtures, all three LMS
Ordo windows, the golden pin, the lectionary unit test and every Render
golden template; restored and reconfirmed green (681 tests; 683 under
COLITUR_EXHAUSTIVE_SWEEP=1, ~175s).
</content>
</entry>
<entry>
<title>fix(ef): Rogation Monday/Tuesday are white, not violet (RG 119)</title>
<updated>2026-08-22T18:15:56Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-22T18:15:56Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=cd3e03bf3e5b040786838fc3c5639d7c29e9b3b8'/>
<id>urn:sha1:cd3e03bf3e5b040786838fc3c5639d7c29e9b3b8</id>
<content type='text'>
Temporal_ef.temporal's Rogation Monday/Tuesday branch hardcoded
Colour.Violet with no citation (data/ef/expected-divergences-lms.sexp's
L6, surfaced by the LMS Ordo). RG 119 assigns white to the de-Tempore
Office and Mass from the Paschal Vigil Mass to the Pentecost Vigil Mass
exclusive; Easter+36/+37 sit inside that window. RG 128's own exhaustive
four-case violet list never names Rogation days, and its vigil clause
(d) is doubly inapplicable: these are not vigils, and they are inside
Paschaltide, not outside it. RG 88 explains the violet actually seen in
print sources: "de Litaniis minoribus nihil fit in Officio, sed tantum
in Missa" -- the violet belongs to the Rogation Mass/procession, a
distinct votive text this engine does not model, not to the day's own
Office. Witnessed directly: LMS Ordo 2023-2024, 2024-05-06, "FERIA IV Cl
W" with "Gl", the Office and Mass printed separately from the optional
violet votive Mass of the Rogations.

Cascade verified, not assumed: RG 432(b) omits the Gloria on every
violet Mass, so the wrong colour was also silencing the Gloria on these
two weekdays even though RG 237(e) (Breviary, ordinary Paschaltide
ferias say Te Deum) already made it true underneath. White removes the
432(b) block, and the Gloria now follows Te Deum via 431(a), matching
the Ordo's own "Gl" -- confirmed with dedicated golden pins in both
test_golden.ml (colour) and test_rubrics_ef.ml (the Gloria flip),
2028-05-22/23 (neither day impeded that year).

Closed L6 in data/ef/expected-divergences-lms.sexp. Reopened C8 in
data/ef/expected-divergences.sexp (26 of 16801 rows, 2005-2050): lectio
independently computes these two days violet too, so the two engines
used to agree by sharing the same uncited assumption; colitur's colour
is now correct and lectio's is not, so the comparator disagrees again,
for the opposite reason. While reopening C8, found and corrected a
genuine misattribution in its own prior closure note, which claimed
lectio's violet was "RG 128(d)" -- 128(d) governs vigils outside
Paschaltide and has nothing to do with Rogation days. Checked
docs/research/rules-register.md for the same claim: not present there,
but a related conflation was found and corrected at its O'Connell
section 4(d) note, which had used a Rogation MASS/procession citation to
"confirm" the day's own OFFICE colour.

Blast radius measured in-process across the full 1583-9999 domain
(throwaway probe, not committed): 4722 days total (2368 Rogation
Mondays + 2354 Rogation Tuesdays actually observed outright, i.e. not
impeded by a stronger sanctoral feast that year), all Violet-&gt;White,
all with the Gloria flipping false-&gt;true alongside, zero anomalies.

Mutation-tested: reverting the branch to Colour.Violet reddens 16 tests
across Rubrics_ef, the lectio differential, the LMS Ordo suite and both
golden pin files; restored and reconfirmed green (680 tests).
</content>
</entry>
<entry>
<title>feat(lang): Latin and English book names, and the shipped sigla styles</title>
<updated>2026-08-20T15:14:42Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T15:14:42Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=d68feb04f71c3dea3b59726e2ffca225d99eaa35'/>
<id>urn:sha1:d68feb04f71c3dea3b59726e2ffca225d99eaa35</id>
<content type='text'>
la.ini and en.ini both gain [sigla] (the current Vulgate/Latin punctuation
convention, byte-identical to Render.default_style) and [bible] (a .full
and .abbr row for every id in Book.all -- 45 cited ids plus the 7 tradition
targets, 52 total). Shipping [sigla] changes no output, asserted by the
full test run. Shipping [bible] does change rendered book names, which is
the point.

la.ini's titles are sourced from docs/research/scan1.txt/scan2.txt (the
1962 Missal scans), each row citing the line its incipit pattern was read
from. Six pairs (kings_3/4, corinthians_1/2, thessalonians_1/2,
timothy_1/2, peter_1/2) share one Missal incipit and differ only in the
sourced .abbr, matching what the primary text itself does. Three ids
(proverbs, song_of_songs, ecclesiasticus) and the seven tradition targets
are marked UNSOURCED and fall back to the data's own spelling, per this
project's central rule against inventing a Latin title.

Re-running the task's own sourcing note against the scans, counting every
hit rather than eyeballing a frequency-sorted list, found nine of its
NOT-sourced verdicts were undercounted (a single clean hit, buried under
higher-frequency matches): Galatians, Colossians, both Thessalonians, both
Peter, Malachi, Numbers, Jonas, Osee and Esdras all have a clean incipit
in the scans and are sourced here. The note's other three verdicts stand,
confirmed independently. Ecclesiasticus is not simply unfound: this Missal
reuses Wisdom's own Lectio libri Sapientiae incipit for Ecclesiasticus
readings too (both were anciently classed as one Sapiential group), so
using it for Ecclesiasticus would misidentify the book, not merely
abbreviate it -- recorded in that row's own comment.

en.ini's [bible] is filled in full, not left partial the way [celebration]
is: without it, a Vulgate-numbered id would fall through the [meta]
fallback chain to la.ini's Latin name, not merely a less complete English
one. Traditional Douay-Rheims names for the Vulgate ids (3 Kings, Osee,
Ecclesiasticus, Isaias, Apocalypse), modern names for the seven tradition
targets, since --sigla-tradition modern is the reader asking for modern
numbering.

test_lang_coverage.ml gains test_every_book_named, asserting every
Book.all id has both forms in la.ini -- the check that catches a forgotten
tradition target, since nothing else in the suite ever names them.

Shipping real book names changes 11 golden template renders (Render/golden)
and several test/cli.t examples that used to demonstrate the pre-Task-10
default-spelling fallback; both are updated to the new, correct output,
each line checked against a fresh render before promoting.
</content>
</entry>
<entry>
<title>feat(render): citations render through Sigla at both call sites</title>
<updated>2026-08-20T14:43:04Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T14:43:04Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=27606c42b7506ab7ffc7f1bd32d4d4a72c6400c8'/>
<id>urn:sha1:27606c42b7506ab7ffc7f1bd32d4d4a72c6400c8</id>
<content type='text'>
View.citation_ref and readings' part_ref are the only two places a
citation reaches output; every emitter goes through View.

--raw passes Sigla.verbatim rather than a style built over Lang.raw:
an identity name table would still reformat punctuation and renumber.

Loosen reject_sigla_for: --sigla-style/--sigla-book/--sigla-tradition
now actually render on readings/table/render/emit/publish (each
builds its own Sigla.t via the new load_sigla), and stay refused only
on commands that render no citation (day, easter, temporal, ...).

names_of degrades a Lang.bible miss to Book.default_spelling rather
than printing the lookup key itself ("luke.abbr"); pinned in cli.t
against a language file with no [bible] section at all, independent
of la.ini/en.ini's own eventual [bible] section.

Regenerate the 11 golden templates for 2027: every changed line is
one canonical citation replacing a stored variant, verified against
the full readings 2027 diff (raw vs default) cell by cell -- 86
distinct (raw, rendered) pairs account for the entire diff across all
11 files, with zero unexplained residue. Two families: the seven
duplicate book spellings collapsing onto one canonical form (Isa./Isa,
3 Kgs./3 Kings, ...), and citations reconstructed from parsed
structure dropping stray punctuation the parser already treats as
noise (a trailing period or semicolon, a comma chapter/verse
separator, an elided inherited chapter) -- each of the latter already
named and tested in test_citation.ml's parse_suite before this task.
</content>
</entry>
<entry>
<title>feat(templates): week headers stop repeating the month name</title>
<updated>2026-08-20T09:42:25Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T09:42:25Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=900d1d781e62a08a1bda1285c8e8611a7baa0f2f'/>
<id>urn:sha1:900d1d781e62a08a1bda1285c8e8611a7baa0f2f</id>
<content type='text'>
Every ordo booklet week header used to print the month name again
even though the month heading right above it already established it
-- pure noise, repeated once per week for the whole year. All seven
ordo flavours now print the week's own Roman numeral plus the span of
dates it covers instead, e.g. "Hebdomada I (Ian 1-2)", with no month
name on the line; the LaTeX table of contents and the Typst outline
(built automatically from its own headings, so editing the heading is
the whole fix there) read the same way.

A single-day week (e.g. a lone trailing Sunday) renders "Ian 31", not
"Ian 31-31": each flavour's dash sits inside an inverted single_day
section, so the engine -- which cannot itself compare first_dom to
last_dom -- never has to decide anything, it only follows the data.
The dash character matches each flavour's own existing convention:
LaTeX/Typst's own "--" ligature, groff's \(en escape (alongside its
existing \(bu), HTML's &amp;ndash; entity (alongside its existing
&amp;middot;), and a literal en dash for the three flavours with no
escaping (adoc/md/txt).

Every in-template comment describing the new fields is written without
ever typing two curly braces together, including in the two comments
this touches that used to embed a live {{month_name}}/{{term.week}}
tag pair inside a LaTeX % comment -- harmless only because that whole
line already started with %, not because the engine has any comment
awareness (it has none).

Goldens regenerated through test_render_golden.ml's own render path
(Test_view.view_of + Template.render_string), not the CLI -- the two
differ in default language and would otherwise pin output the test
suite never produces. Grid goldens are untouched, matching the grid
templates, which have no week header.

Verified against real pdflatex (two passes) and typst compile output,
not merely the golden pins: both flavours print "Hebdomada I (Ian
1-2)", "Hebdomada II (Ian 3-9)", "Hebdomada III (Ian 10-16)" as their
first three week headers and identical text in the table of
contents/outline, and both show "Hebdomada VI (Ian 31)" for January's
own trailing single-day week with no dash.
</content>
</entry>
<entry>
<title>feat(templates): the ordo booklet flows continuously, not one week per page</title>
<updated>2026-08-20T09:09:18Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T09:09:18Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=c00bf135defe69eb303f4bcf32ae862f65c01178'/>
<id>urn:sha1:c00bf135defe69eb303f4bcf32ae862f65c01178</id>
<content type='text'>
One week per page filled roughly the top third of every A5 page and
cost 65 pages for a year that needed far fewer -- the original
requirement, reversed here: a full 7-day week already occupies most
of an A5 page even at reduced type, so the real saving was always in
the year's many SHORT boundary weeks (a month's first/last week is
rarely a full seven days), not in packing two full weeks together.

lib/render/view.ml gains a [first] field on every week object (true
on a month's own first week, the same 'cheap flag beats invented
template logic' call [last] already made for grid rows) -- there is
still no {{../}} parent-path syntax for a template to test this any
other way.

ordo.tex: the per-week \clearpage is gone. Every week keeps its
existing small header line; the month's own first week additionally
prints a large, ruled banner. \needspace (a template-local LaTeX
dependency, not one of the frozen OCaml deps) keeps a header from
being stranded alone at a page's bottom -- and a real, separate bug
surfaced building it: \label placed BEFORE \needspace captured the
OLD page number when \needspace went on to force a break, producing
a step-stale \pageref in the TOC (fixed by moving \label after both
needspace checks). The day box itself is tightened (rank/colour
folded onto the same line as the citations -- an A5 box is far wider
than tall, so this fits even Holy Week's longest citations with room
to spare) so a second week routinely shares a page with the first.
Measured result: 65 -&gt; 53 pages, two pdflatex passes still settle the
TOC, zero orphaned headers, zero overfull boxes.

ordo.typ: the per-week #pagebreak is gone; #show heading's own
block gains sticky:true, Typst's built-in answer to what ordo.tex
needs \needspace for. The month banner needed its OWN sticky:true,
found live: without it a banner could sit alone at a page's bottom
with the entire month pushed to the next page -- not caught by a
check for an orphaned HEADING, since the banner is plain markup, not
one. Measured result: 65 -&gt; 27 pages (Typst's own page-fill packs
tighter than ordo.tex's needspace-driven approach), one compile pass,
zero orphans.

The five non-paginated flavours (ms/html/md/adoc/txt) never had a
forced page break to remove -- they mainly needed the same header
treatment for structural consistency: a week-level header nested
under each month's existing one, walking months&gt;weeks&gt;days (the
week's own padded, in-month-guarded day list) in place of the old
months&gt;days flat loop. Verified against groff, asciidoctor and an
HTML parser -- zero warnings.

Goldens regenerated through the Test_view.view_of path
test_render_golden.ml itself uses, not the CLI (whose --lang default
would have pinned output the tests never produce).
</content>
</entry>
<entry>
<title>fix(naming): the rite prints its display name, not the internal id ef</title>
<updated>2026-08-20T08:39:47Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T08:39:47Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=1935f40c156563c134f87093bf6ec8da1cf4fc46'/>
<id>urn:sha1:1935f40c156563c134f87093bf6ec8da1cf4fc46</id>
<content type='text'>
The booklet's title page and running header read "Ordo 2027 . ef" --
an internal identifier reaching a reader, the same defect class the
sanctoral/temporal slugs were already fixed for.

lang/la.ini and lang/en.ini each gain a [rite] section mapping the
rite id to a reader-facing name, sourced from the Missal's own title
page (docs/research/LT.txt:6 "MISSALE ROMANUM", :15 "EDITIO TYPICA")
plus the 1962 dating this project uses throughout (rules-register.md,
CLAUDE.md) -- both cited in the ini comments, marked PATTERN since the
phrase combines two title-page elements rather than quoting one
verbatim heading.

Lang.t gains a rite table/lookup (same total, miss-echoes-the-key
contract as every other lookup here); View.of_days exposes rite_name
alongside the existing rite field, which stays the stable key exactly
as slug is kept beside name. Every shipped template that printed
{{rite}} now prints {{rite_name}} instead.

test_lang_coverage.ml gains a coverage assertion over every rite id
the engine can emit -- one today -- so a second rite module (OF)
landing without a matching [rite] entry fails loudly instead of
printing its own bare id.

Goldens regenerated through the Test_view.view_of path
test_render_golden.ml itself uses (English with a Latin fallback),
not the CLI (whose --lang default is plain Latin and would have
pinned output the tests never produce). test/cli.t's own JSON prefix
assertion updated to match: rite_name is a real new key in that
generic view dump, sitting right after rite.
</content>
</entry>
<entry>
<title>feat(templates): ordo booklet and wall calendar in Typst</title>
<updated>2026-08-20T08:07:37Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T08:07:15Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=6aebb3ec513c0177a39c2eb8d4b741e90d6f53f4'/>
<id>urn:sha1:6aebb3ec513c0177a39c2eb8d4b741e90d6f53f4</id>
<content type='text'>
Adds templates/ef/ordo.typ (A5, one week per page, each day framed with
a colour swatch, real names, every fixed string through term.*) and
templates/ef/grid.typ (A4 landscape, one month per page, 7 columns,
colour-filled cells, Epistle/Gospel sigla), matching what ordo.tex and
grid.tex already do.

Typst resolves its own table of contents inside a single compile: no
pageref/aux-file dance, unlike pdflatex's own two-pass need for
ordo.tex. ordo.typ's TOC is one flat heading per week (Month . Week N)
rather than ordo.tex's own month-once/weeks-nested layout, since the
view model has no first-of-month flag for a template to test and
inventing one would be new engine state for a cosmetic grouping.
grid.typ deliberately diverges from grid.tex's own partial-fill
behaviour for a 5-week month: Typst's row-size list repeats its own
last entry for every remaining row, so a two-entry rows spec fills the
page completely regardless of week count, where LaTeX's fixed cellh
leaves a 5-week month's bottom sixth blank on purpose. Both divergences
are documented in the templates' own headers.

Two bugs found and fixed while building these against the real typst
0.14.2 binary: two stray hash characters in grid.typ's header comment
that were not actually inside a line-comment (would have been parsed
as Typst code, not prose); and two lines merging into one wherever they
were separated only by a bare newline (still the same soft-wrapped
paragraph in Typst, unlike LaTeX's own explicit paragraph break) --
fixed with a trailing backslash to force a real line break without
adding inter-paragraph spacing, verified against a full-year render
(zero typst warnings across all 365 days of 2027, in both templates).

Goldens (test/golden/ordo-2027.typ, test/golden/grid-2027.typ) were
generated through the harness's own View.of_days/Template.render_string
path, via a throwaway generator, NOT through the CLI: the CLI's default
language table differs from the harness's own English-chained-to-Latin
table, confirmed live (diffing CLI output against the harness's own
render showed exactly the expected language divergence and nothing
else) -- the same trap this project has hit before.

make check-templates now typesets both templates with the typst binary,
using the same SKIPPED-and-exit-0 shape the pdflatex/groff blocks
already use when their own tool is absent, verified in both directions:
absent (PATH without typst) skips loudly and exits 0, and a
deliberately corrupted template fails the target with a non-zero exit
and typst's own error text.
</content>
</entry>
</feed>
