<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/lib/rites/rite_ef/precedence_ef.mli, branch v1.0.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.0.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v1.0.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-22T10:02:01Z</updated>
<entry>
<title>feat(ef): the Creed, RG 475-476</title>
<updated>2026-08-22T10:02:01Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-22T10:01:48Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=d4682c13161b62bc83eaae37790493f670d39c01'/>
<id>urn:sha1:d4682c13161b62bc83eaae37790493f670d39c01</id>
<content type='text'>
Whether the Creed is said at Mass. New Rubrics_ef.creed, reached through
a new Rite.t.creed field and a new Liturgical_day.t.creed bool (false,
not an option, for a rite that has not implemented the rule); colitur
rubrics gains a fourth TAB-separated column.

475(a) reads the TEMPORAL cycle's own weekday, not the observed day: a
Sunday impeded by a Feast of the Lord (RG 16a) still says the Creed.
475(d)'s three octaves (Nativity, Easter, Pentecost) are pure date/
Easter-offset windows, checked first, since a saint's feast winning the
day inside one of them still says the Creed ("etiam in festis
occurrentibus") -- St Stephen, 26 December, is the live witness.

RG 23 classifies Ash Wednesday and every feria of Holy Week (including
the Sacred Triduum) as feriae, not festa, however high their rank, so
475(b)/(c)'s "in festis" never reaches them; this single check subsumes
476(a)'s own naming of the Chrism/Lord's-Supper Mass and the Easter
Vigil. RG 28-34 vigils are a third liturgical-day category, also
excluded from "in festis" regardless of rank -- reuses the already-
exported Precedence_ef.is_vigil rather than a new list.

475(e)'s Apostle/Evangelist natalicia list (creed_apostle_slugs) was
derived by grepping data/ef/sanctoral.sexp directly and checking each
candidate's own date against whether it is that saint's dies natalis --
not copied from any list supplied with the task. The Conversion of St
Paul and the 30 June Commemoration of St Paul are excluded (neither is
a natalicium); the Chair of St Peter and St Barnabas are included only
because the clause names them explicitly, which is exactly why it has
to: neither is a natalicium either.

475(c)'s BVM half reuses Precedence_ef.marian_slugs (newly exported)
rather than the subject field alone: checked against the shipped data,
almost every Marian sanctoral entry ships subject=Saint, not Bvm.

man/colitur.1's rubrics section is updated to match the new column;
test/cli.t repinned via dune promote for the same reason. Verified
day/readings output byte-identical to v0.10.1 across the whole
1583-9999 domain (both binaries' concatenated day+readings output,
6,148,492 lines each, zero diff). Domain-wide: 882,996 days say the
Creed, 2,191,250 do not; every one of the domain's 439,178 Sundays says
it, zero exceptions.
</content>
</entry>
<entry>
<title>feat(ef): implement RG 33's third omission trigger</title>
<updated>2026-08-21T12:42:30Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-21T12:42:30Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=12b97761019cfa02ca0da8a5fb50ef815d07685c'/>
<id>urn:sha1:12b97761019cfa02ca0da8a5fb50ef815d07685c</id>
<content type='text'>
RG 33 omits a II/III-class vigil in three cases: it falls on a Sunday, it
falls on a I-class feast, "vel si festum cui praemittitur in alium diem
transferri aut ad commemorationem reduci contingat". Only the first two
were built; the third was recorded in precedence_ef.ml as unimplemented on
the grounds that no witness existed in the shipped data. That reasoning was
wrong, and the rule fires on 1 744 days across 1583-9999.

Both halves of the clause reduce to one observable question -- is the feast
the OBSERVED office on the following day (RG 34 puts it there) -- so the
kernel asks it once per candidate, after place_transfers has settled the
year. No fixed point is needed: a vigil is a candidate only on its own day,
never on its feast's, so suppressing it cannot change what the next day
observes. Precedence.rules gains vigil_feast, which returns the slug of the
feast a vigil precedes; the kernel cannot infer that itself, because only
two of the five vigil/feast pairs share a slug stem.

Blast radius, measured pre-change binary vs HEAD over the whole domain and
classified: 1 744 days, three shapes, zero unexplained. 1 199 are the feast
reduced to a commemoration (10 August on a Sunday, St Lawrence); 478 and 67
are the feast transferred under RG 96 after the Sacred Heart or Corpus
Christi takes its day. The Assumption's and the Ascension's vigils never
qualify -- their I-class feasts always keep their own day.

Independently witnessed, which is unusual here. The published Ordo -- the
only witness outside the Divinum Officium -&gt; missalemeum -&gt; lectio lineage
-- omits St Lawrence's vigil on 2025-08-09, agreeing with colitur against
both engines. That date had been read earlier as an Ordo gap; the Ordo was
right, and correcting the misreading is what surfaced this clause. On
2027-08-09 the feast does keep its day and the Ordo omits a vigil colitur
correctly keeps, which is a genuine Ordo gap.

Allow-lists: C39 (lectio, 10 rows) and a 2038 oracle class citing the
register, the 2026-2027 window having no instance. The golden pin asserting
St Lawrence's vigil is violet moved 2025 -&gt; 2027; its own comment had
reasoned about the vigil's weekday and missed that RG 33 also looks at the
feast's. Two new pins cover both shapes of the clause.

The vigil/feast table is built with Slug.of_string_exn: mutation testing
showed that of_string plus Result.to_option turns a typo into None, which
this hook's contract reads as "not a vigil", switching the rule off in
silence. Two tests assert the table against the shipped data in both
directions.
</content>
</entry>
<entry>
<title>feat(ef): the Major Litanies -- entity, RG80 transfer, RG109(f) privilege</title>
<updated>2026-08-13T18:15:28Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-13T18:15:28Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=3364e23fc49dc5b49576a97315326de030376e31'/>
<id>urn:sha1:3364e23fc49dc5b49576a97315326de030376e31</id>
<content type='text'>
RG 80 (Caput X, "De Litaniis maioribus et minoribus", A): the Major
Litanies are assigned to 25 April, transferred to the following Tuesday
(always Easter+2) when that date is Easter Sunday or Easter Monday. RG 81,
same division: nothing is done in the Office, only in the Mass. RG 109(f)
(Caput XVI): a privileged commemoration.

Entity: Commemoration_only, Fixed(4,25), via data/ef/adjustments.sexp's
`Add major-litanies` -- RG 81 denies it Office standing entirely, which is
exactly what Commemoration_only already means to Precedence.resolve (held
out of the observed contest by construction). Rank Class4 deliberately,
not Class1, to keep the new RG109(f) privilege branch live rather than
shadowed by privilege_of's existing "of a I-class day" branch. Colour
Violet by consistency with the sibling Minor Litanies; subject Saint, the
same "no special exclusion" default this codebase's other
Commemoration_only entries use. Names not primary-sourced, flagged as such
in the data file's own comment.

Transfer: reuses the existing RG 96 placement machinery
(Precedence.disposition's Transfer constructor + Calendar's
place_transfers/resolve_with_injected) rather than a new candidate
channel -- RG 80's own transfer is structurally the same operation RG 96
already performs for an impeded I-class feast. disposition gains a branch,
checked before the Commemoration_only catch-all: the Litanies losing to
winner slug "ef-easter-sunday" or "ef-easter-1-monday" is Transfer, not
Commemorate. transfer_target gains a branch, checked before the general
RG 96 search is even computed, returning Easter+2 directly with no search
at all -- necessary, not merely simpler, since Easter+2 is itself I-class
and a search from there would walk past the exact day RG 80 names (a
commemoration needs no unoccupied day the way a displaced feast does).

Privilege: privilege_of's previously-dead RG 109(f) branch now recognises
the Litanies' own slug. No other code change -- admit's existing
Class1/Class2-Sunday branches already implement "a privileged
commemoration categorically takes the slot" correctly, from an earlier
task.

Full blast-radius measurement, adjudication of the resulting missalemeum
divergence, and the mutation proofs are in the task's own report,
.superpowers/sdd/2026-08-12-colitur-rg16a/major-litanies-report.md.
</content>
</entry>
<entry>
<title>precedence(ef): RG 110, the inseparable Peter/Paul commemoration</title>
<updated>2026-08-13T09:19:19Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-13T09:19:19Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=ee5c81e70adcd2ce6cecc57da4c416d482c187ca'/>
<id>urn:sha1:ee5c81e70adcd2ce6cecc57da4c416d482c187ca</id>
<content type='text'>
RG 110 (Caput XIV): "In Officio et Missa S. Petri semper fit
commemoratio S. Pauli, et vicissim... pro unica habeantur" -- in the
Office and Mass of either Peter or Paul, a commemoration of the other
is always made, uncapped by RG 111's own admission count. Both
photographic scans, full text including sub-clause (c) (a separate
trigger this register previously had not transcribed: the same rule
also fires when one Apostle's oration is admitted merely as an
ordinary/privileged commemoration, not only when it is the day's own
office).

Three real pairs in the 1962 calendar, all confirmed on both scans:
25 January (conversion-of-st-paul + peter), 22 February
(chair-of-st-peter + paul), 30 June
(in-commemoratione-sancti-pauli-apostoli + a new
commemoration-of-st-peter). The first two already existed as ordinary
sanctoral candidates but were wired into RG 111's ordinary, capped
admission contest instead of this rule's own uncapped one -- the
defect this closes. 30 June had no companion at all: a genuine gap
in lectio's own source data (confirmed directly against
tridentine-calendar.ini) and in missalemeum's own oracle output for
both fixture years, not only a colitur bootstrap miss, so colitur is
now uniquely correct on this date among the three engines compared.
Added via data/ef/adjustments.sexp's own Add directive, the
architecture's existing extension point for exactly this shape of
gap, since data/ef/sanctoral.sexp is generated and lectio must not be
touched.

Precedence_ef.admit gained rg110_additions/rg110_companion_slug,
layered on after admit's own four ordinarily-capped branches decide
their normal result: checks both the observed candidate and every
already-admitted candidate against the three-pair lookup and prepends
any companion found, uncapped and additional, never competing for
RG 111's own slot.

Measured full blast radius (1583-9999, pre-change binary from git
archive at 59fbda8 vs the fixed binary, 3,074,246 days each side,
14,627 differing days, all four predicted shapes, zero unclassified):
3,619 Holy Name fallback days (previous commit), 3,533 days Paul was
wrongly excluded from Chair of St Peter's own day by a competing
privileged feria, 593 days Chair of St Peter itself was admitted only
as an ordinary commemoration with Paul entirely absent, and 6,882 days
the new 30 June companion is added. The 3,533+593 figure supersedes an
earlier, narrower 852-day estimate that measured only the delta
between two older code commits, not the rule's full scope.

The lectio differential needed no change: it does not compare
commemorations at all, and this fix never touches season, slug, rank,
or colour. The missalemeum oracle allow-list needed three changes:
M12 removed (22 February 2027 no longer diverges in commemoration
count), M15's date list gained 2027-02-22 (now reaching identity
comparison for the first time, where it lands on that entry's own
pre-existing, unrelated limit -- one of the two commemorations is
temporal-origin and unnamed), and a new M19 for the 30 June gap.

Mutation-tested, both halves separately: disabling the admit-level
addition reddens the two new unit tests, the oracle's own M12-shaped
checks, and an existing golden pin (updated to expect the Paul
companion); removing only the 30 June data entry reddens solely the
oracle's new M19 count, confirming the code and data halves are
independently load-bearing.
</content>
</entry>
<entry>
<title>docs: two retracted claims that outlived their retraction</title>
<updated>2026-08-13T07:57:57Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-13T07:57:57Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=e30a4be5a2594fb3b6c4b51345d138cd89ba78ad'/>
<id>urn:sha1:e30a4be5a2594fb3b6c4b51345d138cd89ba78ad</id>
<content type='text'>
Both are the defect class this fix round existed to close, which is why
they are worth recording rather than quietly overwriting.

CLAUDE.md still carried F1's retracted design rationale -- describing
entry_14_movable_band as "negative so it can never collide with a real
table position" -- and F2's retracted transcription-defect attribution,
verbatim, in the one tracked file the project's own workflow tells a
fresh session to read first. The fix round struck both everywhere else
and missed this file. A session following it as instructed could have
re-derived the negative sentinel for entry 20's or entry 23's movable
half and re-introduced the inversion in a new branch.

precedence_ef.ml's replacement justification for the x10 rescale then
introduced a fresh misstatement of the same primary text it was
correcting: it attributed "primum mobilia, deinde fixa" to "entry 12's
own ninth sub-item" and counted three such rows. Both photographic
scans, and the register's own section 4 table, put that clause at entry
13; entry 12 has eight sub-items and no such clause. The split occurs at
five rows -- 13, 14, 20, 23's third sub-item, and 24. Entry 24 is the
most-evaluated band in the whole domain and is unsplit in the code,
which is precisely the sub-rank the new headroom exists to hold.

Corrected in the .mli and the register too. No behaviour change; 290
tests green.
</content>
</entry>
<entry>
<title>precedence(ef): fix round 1 (F2, F7) -- correct a false transcription claim, cite RG95's real primary authority</title>
<updated>2026-08-13T07:16:30Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-13T07:16:30Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=ac277cd1aaa47401b4a4c205b54c2faf88938c73'/>
<id>urn:sha1:ac277cd1aaa47401b4a4c205b54c2faf88938c73</id>
<content type='text'>
F2: the disposition comment for RG112(a) claimed the electronic
transcription "carries NEITHER this paragraph's own worked example
NOR its own more specific Mass-proper rubric... exactly the
transcription's documented defect" -- wrong on both counts, checked
directly rather than taken on trust.

RG 112 has no worked example in any of the three source documents
(the transcription included) -- there was nothing to drop. The Holy
Family Mass propers' own 13-January rubric is absent from the
transcription not because it silently drops content it otherwise
has (the project's own documented defect, dropped calendarium
commemoration lines) but because that specific document (a 2006 web
capture) contains almost no Mass-propers text of any day: 5
Introit-line occurrences across 26,322 lines, against 61 and 402 in
the two photographic scans; its own "Proprium de Tempore" page is a
table of contents linking to PDFs the capture never pulled in. A
coverage gap in a partial web capture, not an instance of the
narrower, different defect the methodology note actually describes.
The ruling is unaffected -- the propers' quotation is real, on two
independent photographic scans, and settles 13 January on its own --
only the attribution is struck, here and in test_precedence_ef.ml
(the register and the task report are corrected separately).

F7: RG 95's own second paragraph -- present in all three documents,
including the transcription -- is a more direct, occurrence-level
authority for the exact collision than RG 112(a): "if two feasts of
the same Divine Person... occur together, the one higher in the
table is kept, the other omitted." Added as the primary citation on
disposition's RG112(a) branch, with RG 112(a) and the propers' note
kept as corroboration. Also corrects RG 112(b)'s own framing: it is
bidirectional ("et vicissim"), and only the Lord-feast-wins direction
(RG 16(a)) is implemented -- the Sunday-wins direction has no witness
anywhere in this codebase's data and was wrongly described as already
covered.
</content>
</entry>
<entry>
<title>precedence(ef): fix round 1 (F1) -- band's -14 sentinel inverted the table</title>
<updated>2026-08-13T07:11:21Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-13T07:11:21Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=b23020c7acc6b22d99ffeeac5d65e9ad4a58c82c'/>
<id>urn:sha1:b23020c7acc6b22d99ffeeac5d65e9ad4a58c82c</id>
<content type='text'>
entry_14_movable_band = -14 was justified only by "cannot collide
with a real table position (1..28) or unclassified" -- a collision
argument, not an ordering one. band's own value is compared by plain
&lt;, so a negative number beats every I-class entry (1-13), not merely
the fixed Baptism it was built to beat. Not live against the shipped
universal sanctoral data (no I-class universal feast falls 7-13
January, which is why the original 1583-9999 sweep showed only the
intended shape), but entries 12/13 admit PROPER and INDULT I-class
feasts too, and those arrive via adjustments.sexp-style overlays --
this architecture's own advertised extension path. A diocesan
patronal feast landing in Holy Family's window would have made the
inversion live immediately: the I-class feast displaced and
transferred to the next day, reproduced and confirmed before this
fix, reverted after.

Fixed by rescaling every band branch to the real RG 91 entry number
times ten (unclassified untouched at max_int) instead of the bare
1..28, reserving genuine headroom immediately before each entry for
a movable sub-rank -- not an arbitrary rescale: RG 91's own text
records a "primum mobilia, deinde fixa" split at three rows, not
only entry 14 (entry 12's own ninth sub-item, entry 14, and entry
20), so this leaves room for the other two without a second rescale
if either ever gets a live witness. entry_14_movable_band now
derives from entry_14_fixed_band - 1, tied together so they cannot
drift apart.

Added a synthetic I-class end-to-end test reproducing the exact
counter-example that found this: a universal I-class candidate
inside Holy Family's own 7-13 January window is now observed and
does not transfer, with Holy Family itself falling to RG109(a)'s
ordinary privileged-Sunday-commemoration path, the same treatment
any genuine feast outranking an ordinary Sunday gets.
</content>
</entry>
<entry>
<title>precedence(ef): RG91 e14 "primum mobilia" + RG112(a) inseparable exclusion</title>
<updated>2026-08-13T06:15:48Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-13T06:15:48Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=6319c8d5c012db40206b463dc912a1edf7aeec5d'/>
<id>urn:sha1:6319c8d5c012db40206b463dc912a1edf7aeec5d</id>
<content type='text'>
Two related fixes, both needed for Holy Family to actually observe
correctly on the seven years it coincides with the fixed
Commemoration of the Baptism of the Lord (13 January): 2008, 2013,
2019, 2030, 2036, 2041, 2047.

band's entry 14 ("Festa Domini II classis") gated on sanctoral
origin only, so a movable Class2 Lord feast had no row in the table
at all. RG 91 entry 14's own text says otherwise: "primum mobilia,
deinde fixa" -- movable first, then fixed. entry_14_movable_band
gives Holy Family (the one movable candidate this codebase builds
with subject Lord) a value strictly better than the fixed half's own
literal 14, negative so it can never collide with a real table
position -- without it, the two would tie at 14 and fall to
Precedence.resolve's own alphabetical tie-break, which picks the
WRONG side ("commemoration-of-the-baptism-of-the-lord" sorts before
"ef-time-after-epiphany-sunday-1").

disposition gets a new branch for RG 112(a) (Caput XVI, "De
Commemorationibus"): the Office, Mass or commemoration of a mystery
of one Divine Person excludes a commemoration of another mystery of
the SAME Divine Person. Winner and loser both subject Lord -&gt; Omit,
not Commemorate -- without it, Holy Family observing correctly still
left the Baptism admitted as an ordinary Class2 commemoration under
RG111(b), which the primary text does not allow.

Confirmed by a MORE SPECIFIC primary source than RG 112(a) alone: the
Holy Family Mass propers' own note, found on both photographic scans,
word for word, immediately after the Postcommunio -- "Si festum S.
Familiae occurrerit die 13 ianuarii, Missa dicitur de festo S.
Familiae, sine commemoratione Baptismatis D.N.I.C., et sine
commemoratione dominicae." The electronic transcription carries
neither this rubric nor RG 112(a)'s own worked example -- another
instance of its documented defect, not merely absent from one check.

Still expected red: the lectio differential (2005-2050) now shows a
new, real divergence on those seven 13-January-Sunday dates -- lectio
has no Holy Family at all, so it still shows the fixed Baptism
observed there, unlike colitur now. The oracle's own M-series entries
also still need widening for the observed-identity axis added two
commits ago. Both are the next commits.
</content>
</entry>
<entry>
<title>fix(rite-ef): band has no table entry for a bare commemoration, ever</title>
<updated>2026-08-12T14:45:58Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T14:45:58Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=5d5454208464892e96310efd99ec9db09171f982'/>
<id>urn:sha1:5d5454208464892e96310efd99ec9db09171f982</id>
<content type='text'>
Fix round 1 on the commemoration-identity/tie-break work: the "genuine
same-band tie" M17 adjudicated as open was not a tie at all. RG 91's
table enumerates only "dies liturgici" (real feasts) -- entry 24's own
text is "Festa III classis, in calendario Ecclesiae universae
inscripta" -- so a Celebration.t.status = Commemoration_only candidate
(a saint reduced to a bare commemoration) has no row in the table to
begin with. Precedence_ef.band used to read rank alone, so it silently
lent such a candidate the same table entry as a genuine Feast of its
own rank; the calendarium's own 22 September row confirms the
distinction in its own notation ("S. Thomae de Villanova ... III
classis. / Commemoratio Ss. Mauritii et Soc. Mm." -- Thomas carries a
class number, Maurice carries none).

Fixed at the source, not by adding a status tier to compare_precedence:
band now checks status first, ahead of every rank-keyed branch, and
returns unclassified for any Commemoration_only candidate. M17 deleted
(not re-adjudicated) -- 22 September now resolves identically on both
sides, with no divergence left to name.

Blast radius measured independently (a temporary git worktree at the
pre-fix commit): 4451 days change across the whole 1583-9999 domain,
exactly 4 verified shapes -- 3576 x maurice-and-companions-martyrs -&gt;
thomas-of-villanova and 282 x eleutherius -&gt; philip-neri (admitted set
changes), 502 x appollonia/cyril-of-alexandria and 91 x dorothy/titus
(order only, independently confirmed against the calendarium's own
listing convention). Zero days change who is observed. Further swept
the whole domain for a genuine "two different candidates on the
identical real table entry" residual -- the shape RG 113 truly gives
no instruction for -- and found it empty: of 109201 same-rank ties
domain-wide, 83950 now resolve by band alone and the remaining 25251
are exclusively two Commemoration_only candidates tied at unclassified,
never two real feasts. The residual admit still breaks alphabetically
is real, but narrower than previously documented.

The "66 days" figure is reconciled, not merely disputed: 599 is the
tie population, 65 (whole-comparator: 67) is the real admitted-set
decision count within it (independently reproduced against the
pre-Task-B binary), 149 is order-only. Every one of the 65 real
decisions traces to the same Commemoration_only/Feast root cause as
Maurice/Thomas.

Also: validate.ml's admission fixed-point check recovers a
commemoration's real origin (by matching its slug against the day's
own temporal office) instead of reconstructing every candidate as
Sanctoral, since band -- unlike EF's own admit -- does read origin;
precedence_ef.ml/.mli's motivating example and blast-radius claims
corrected to no longer rest on the fixed Maurice/Thomas case;
test_identity_rank_corroboration's own population count corrected now
that 22 September (and 21 other Feast-status matches) became reachable;
its rank-agreement pin documents exactly what it does and does not
prove. Register (§4, §6.1, §6 checklist) and CLAUDE.md corrected in
place, including the RG 113 first-sentence gap this exercise surfaced
but did not close, recorded as a new open item.

275 -&gt; 276 tests (with the exhaustive sweep), all green.
</content>
</entry>
<entry>
<title>fix(kernel,rite-ef): admit orders commemorations by RG 113's table of precedence, not slug</title>
<updated>2026-08-12T13:16:00Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T13:16:00Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=ea22ad2bde211998e6719fd5fb76233571a48383'/>
<id>urn:sha1:ea22ad2bde211998e6719fd5fb76233571a48383</id>
<content type='text'>
Precedence_ef.admit broke a same-rank tie among commemoration candidates
alphabetically by slug -- a deterministic engineering convention with no
rubrical citation. RG 113's own second sentence, primary-source-verified
against two independent scans and previously uncited in the register
(only "commemoratio de Tempore fit primo loco" was quoted before), gives
the real rule: "in admittendis et ordinandis aliis commemorationibus,
servetur ordo tabellae praecedentiae" -- admitting and ordering
commemorations both run on the rite's own table of precedence (band's
28-entry table), not RG 8's coarse four-class rank.

Precedence.resolve now computes each commemoration candidate's own band
value once, generically, and hands it to rules.admit as a third tuple
element (Precedence.rules.admit's signature changed accordingly, ditto
Precedence_ef.admit; every rule-record stub in the test suite updated to
match). Precedence_ef.admit's own compare_dignity is replaced by
compare_precedence, ordering by band then slug; a residual tie within one
identical band value still falls back to slug, since RG 113 gives no
further instruction there -- documented as a still-uncited engineering
convention, not dressed up as a rubric.

RG 98 ("in paritate autem Officium prius impeditum praecedit") was
considered as a candidate authority for that residual and rejected: it
governs the transfer queue order among several simultaneously-impeded
I-class feasts (Caput XIII), a different operation in a different
chapter from RG 113's commemoration admission (Caput XVI); nothing in the
primary text connects the two.

Blast radius measured against the pre-change binary across the entire
1583-9999 domain (not only 2005-2050): the admitted-commemoration-slug
set is byte-identical, day for day, before and after this change. The
fix corrects the citation and mechanism, not the answer, on this
codebase's current data -- both of the task brief's named examples
(22 Feb Chair-of-Peter/Lent-vs-Paul, 22 Sept Maurice-vs-Thomas-of-
Villanova) are confirmed present and unchanged in both streams. A new
test (RG113: admit picks by precedence order, not slug, when they
disagree) proves admit actually consults the passed-in precedence value
with a synthetic pair whose slug order and precedence order disagree --
teeth a same-band-only regression test could not have caught, since
every real collision found in the domain happens to agree on both axes.

271 -&gt; 272 tests, all green; COLITUR_EXHAUSTIVE_SWEEP=1 unaffected.
</content>
</entry>
</feed>
