<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/test/golden, 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>docs(templates): fix groff Build: lines to match check-templates</title>
<updated>2026-08-20T10:54:21Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T10:54:21Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=1aeca948c2a2a82bffaaec65077140aa05f7b3f4'/>
<id>urn:sha1:1aeca948c2a2a82bffaaec65077140aa05f7b3f4</id>
<content type='text'>
ordo.ms's own Build: comment omitted -P-pa5 entirely, so the documented
command produced A5-sized content on a physical A4 PDF page
(595x842pt instead of 419x595pt) -- verified by running the command
verbatim and reading pdfinfo. Both .ms Build: lines were also missing
-Kutf8 and -t, which the Makefile's check-templates target already
carries: without -Kutf8, accented Latin names (e.g. Peñafort) render
as mojibake, confirmed by extracting text from the rendered PDF.

Bring both templates/ef/ordo.ms and templates/ef/grid.ms in line with
the Makefile's actual invocation (-ms -t -Tpdf -Kutf8 &lt;papersize&gt;), so
a user copying the Build: line gets the same result as
'make check-templates'. Updated the two golden fixtures that pin these
templates' rendered output byte-for-byte to match.

Verified every documented build command (README's two pdflatex
invocations, both .ms lines, both .typ lines) by running it verbatim
and checking pdfinfo/pdftotext output; no other flavour's Build: line
or man page example was affected.
</content>
</entry>
<entry>
<title>feat(templates): retune ordo.tex to ordo.typ's density, fix ordo.ms's own</title>
<updated>2026-08-20T10:47:47Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T10:47:29Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=aaca1304e9d00880b016d14529cf3809bd98fe39'/>
<id>urn:sha1:aaca1304e9d00880b016d14529cf3809bd98fe39</id>
<content type='text'>
ordo.tex was 53 pages / 6.9 days-per-page on 2027 against ordo.typ's 27
pages / 13.5 -- the user prefers the tighter Typst booklet. Read ordo.typ's
own typographic decisions (base size, the day-number/name/detail-line size
hierarchy, box padding, inter-box skip, leading) and matched them: an
explicit 9pt/10.5 base (was \normalsize, 10pt), the day number and feast
name both 9pt bold (bold distinguishes them, not size, as ordo.typ decided),
7pt weekday, 6.5pt detail lines, sharp-cornered boxes, and needspace amounts
re-measured for the shorter boxes. Result: 29 pages / 12.6 days-per-page --
within the "a page or two of 27" target, reached without sacrificing
legibility (verified against the rendered PDF, not assumed).

The one real gotcha: \fontsize set inside a brace group that closes before
the line-ending \\ has no effect on the interline glue TeX inserts for that
break -- the glue uses the OUTER scope's \baselineskip, not the just-closed
group's. This is exactly the shape of bug the pre-retune box already had
(every \fontsize group closed before its own \par), which is why the first
retune pass barely moved the page count. Fixed by declaring \fontsize/
\selectfont/\bfseries/\mdseries inline, ungrouped, immediately before the
text each governs. Recorded in the file's own header for next time.

ordo.ms looked comparatively fine (43 pages) but was rendering on A4, not
A5 -- roughly double an A5 page's area, so normalised for area it was
already looser than ordo.tex's own pre-retune baseline. Fixed, each found
by rendering and reading the real PDF rather than assumed: added -P-pa5 to
the Makefile's groff invocation (mirroring grid.ms's existing -P-pa4l);
fixed the day box reading the RAW rank/colour strings (class-2, green)
instead of the resolved Latin pair (rank_name/colour_name) -- exactly the
"printed slugs" defect the ordo rebuild's own commit message named, which
this file had regressed to; added -Kutf8 (groff's default input encoding
produced visible mojibake on an accented Latin name); tightened fonts/
leading the same way as ordo.tex; found and fixed a stray-blank-line bug
present since the file's original authoring (every day/week/month boundary
left an accidental blank template line, read by groff as its own extra
.sp); found and fixed a genuine print-safety bug (text sitting 0.13mm from
the true page edge -- .pl, groff's text page length, is independent of
-P-pa5's device paper selection and needed matching explicitly before ms's
own FM-based bottom margin would fire at all); and added a .ne guard so a
week header can no longer be stranded alone at a page's foot. Net: 43 pages
(A4, broken) to 39 pages (real A5, print-safe, real Latin names, correct
encoding, zero orphans) -- no numeric target set for this flavour, but no
lower number was reachable without leaving one of the above unfixed.

ordo.html and every grid.* flavour are untouched, as scoped.

Both golden/ordo-2027.{tex,ms} regenerated through the real test harness
path (Test_support's loaders + Test_view's en-with-la-fallback view_of),
not the CLI, whose own --lang default (la) differs from the harness's and
would have pinned content the suite never produces.

Full suite green: 503 tests (504 with the exhaustive sweep). make
check-templates/check-schema/check-citations all clean.
</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>fix(templates): the Typst grid no longer overflows a 6-week month</title>
<updated>2026-08-20T09:09:34Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T09:09:34Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=c30a35e1da315f2a44e5b53c714bdcf4d8992d2c'/>
<id>urn:sha1:c30a35e1da315f2a44e5b53c714bdcf4d8992d2c</id>
<content type='text'>
grid.typ used rows: (auto, 1fr) on the assumption that a Typst
fractional row always shrinks to share whatever space is left. It
does not: an 'fr' track's size is the LARGER of its fair share and
its content's own minimum, so it grows PAST 1fr when content is
taller than that share rather than compressing to fit. Adding the
sigla line (Epistle/Gospel references) grew every cell's natural
content past what a 1/6-of-remaining-space row allows, and a 6-week
month (three of twelve in 2027) split its own table between rows,
stranding the last week alone on a fresh page with no heading -- the
user's screenshot showed a row sliced mid-cell, 'I classis' cut off,
the next month's own heading printed underneath it.

Fixed the same way grid.tex's own \cellh already was: an explicit
row height (cellh, computed from the page's text height divided by
six, budgeted with 6mm of deliberate slack after a zero-slack first
attempt still split a table between rows), with each cell's content
wrapped in a height-clipped block sized to match -- content that
still does not fit is truncated rather than spilling into the next
cell or page. block(breakable: false) around the whole table is a
second, independent backstop: even if the budget is ever wrong
again, the WHOLE table jumps to a fresh page rather than splitting a
row across two, a loud failure (an odd blank page) rather than a
silent one (a sliced row).

This reverts the file's own prior divergence from grid.tex (Typst
stretching every month to fill the page regardless of row count,
disclosed as deliberate at the time) -- overflow safety now matters
more than that cosmetic fill. A 5-week month still leaves a blank
sixth row, the same trade-off grid.tex's own header already accepts.

Verified against all twelve months of 2027 (three 6-week: January,
May, October; nine 5-week), typeset through typst compile: exactly
12 pages, one month title per page, no clipped or duplicated
content, day 31 of a 6-week January fully visible. grid.tex itself
re-checked for the same latent risk and found unaffected -- its
fixed-height \cellh box already had enough margin.

Golden regenerated through the same Test_view.view_of path the
other affected templates already use.
</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>
</feed>
