<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/lib/rites/rite_of/precedence_of.mli, 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-26T21:40:17Z</updated>
<entry>
<title>fix(of): anticipate St Joseph onto 18 March per Normae n. 56(f)</title>
<updated>2026-08-26T21:40:17Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-26T21:40:17Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=2f6d25aff88b4c76c61e36889f1c017b3cc8faee'/>
<id>urn:sha1:2f6d25aff88b4c76c61e36889f1c017b3cc8faee</id>
<content type='text'>
W1: when 19 March (St Joseph) falls on Palm Sunday, colitur sent him
forward to Easter+9 instead of anticipating the solemnity backward to
18 March, the one rule in the whole Normae transfer machinery that
names an earlier date. Live in 16 of 1583-2100 (1595, 1606, 1617,
1690, 1758, 1769, 1780, 1815, 1826, 1837, 1967, 1978, 1989, 2062,
2073, 2084).

Blocked on a kernel contract: Rite.t.transfer_target required its
result be strictly later than the impeded date, an obligation argued
purely from the EF's RG 96. Traced against Calendar's actual placement
pass rather than assumed unsafe: the round loop re-resolves the whole
year fresh every round, and its two safety nets (~start/~stop; the
round-count guard) both test the target's own value with no comparison
against origin, so a bounded backward jump converges the same way a
bounded forward one does. The one requirement that stays load-bearing
is target &lt;&gt; origin: Precedence.resolve never deduplicates by slug, so
a candidate returning its own argument unchanged would collide with
itself in the same round's contest. Relaxed the obligation accordingly
(rite.mli) and added the fourth transfer_target branch in
Precedence_of, ahead of the existing three (Precedence_of.transfer_target,
Rule 0). calendar.ml needed no logic change, only two comments that
asserted "every genuine transfer moves forward" as a blanket fact.

Unpinned the two tests that asserted the old wrong (forward) behaviour
and replaced them with assertions of the correct one, plus a new
direct unit test of the backward branch across two independent years.

EF output is untouched: data/ef/ and lib/rites/rite_ef/ carry no diff,
and colitur day/readings for 2026, 1583 and 9999 are byte-identical
against a build of the prior commit. OF's own 2005-2050 window carries
none of the 16 affected years and shows zero unexpected diffs; the
full 1583-9999 domain still reaches a fixed point under the exhaustive
sweep.
</content>
</entry>
<entry>
<title>docs(of): correct stale precedence_of.mli note on St Joseph/Palm Sunday</title>
<updated>2026-08-26T10:55:47Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-26T10:55:47Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=b05d81daaf067bd21e078c6bb43a0dcfcdfbadc4'/>
<id>urn:sha1:b05d81daaf067bd21e078c6bb43a0dcfcdfbadc4</id>
<content type='text'>
The "KNOWN UNIMPLEMENTED FOURTH RULE" note (Normae n. 56(f)) still said
"No sanctoral data exists yet (Phase 3), so nothing is WRONG today" and
located the trigger at "25 March co-occurring with Palm Sunday". Both
are now false, and the date was already wrong when written: St Joseph
is 19 March, not 25 March -- 25 March is the Annunciation, a separate
solemnity handled elsewhere in this same module.

Phase 3 shipped data/of/calendar-2002.sexp on this branch, so the
defect is now live in 16 of the 1583-2100 years (19 March on Palm
Sunday); rewrite the note to say so and point at where it is pinned
(test_rite_of.ml's known-wrong-forward-transfer test, allow-list
entries L8/L9).
</content>
</entry>
<entry>
<title>fix(of): correct season citation, note All Souls gap, guard transfer search</title>
<updated>2026-08-25T18:51:23Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T18:51:12Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=0a85280b0588629a05149e07934759f83f7bd83e'/>
<id>urn:sha1:0a85280b0588629a05149e07934759f83f7bd83e</id>
<content type='text'>
Fix wave from the final whole-branch review of OF Phase 2 (0 Critical,
5 Important, 8 Minor). Applies the five items ruled in-scope and records
two more, per the controller's R7/R8/R9 rulings.

Fixes:
- temporal_of.ml: season-boundary header cited "Normae n. 71-77", a range
  that does not exist (the Normae end at n. 61) and collides with real IGMR
  nn. 71-77 (Preparation of the Gifts) in the same PDF -- EF leakage from
  RG 71-77. Corrected to Normae Titulus II, nn. 17-47, with a note against
  reintroducing the wrong range.
- precedence_of.ml entry 3: added the Tabula's second clause (Commemoratio
  omnium fidelium defunctorum / All Souls) to the comment, and recorded the
  Phase 3 hazard -- Vocab_of.rank has no constructor for it yet, and every
  natural tagging choice gets 2 November's precedence wrong in a different
  way. No code change; nothing can construct the entity yet.
- precedence_of.ml transfer_target's search: added a domain_max_date guard
  (following Rite_ef.Precedence_ef's existing shape and reasoning) so the
  walk can no longer probe Computus past 9999-12-31, and it now returns the
  last date visited on bound exhaustion instead of failwith-ing. .mli
  updated to drop the @raise Failure clause.
- precedence_of.ml is_privileged_sunday: added its own inline Tabula I.2
  citation, matching its sibling helpers.
- precedence_of.ml entry 10: trimmed the reused "universal or temporal-origin"
  comment -- Temporal_of never constructs a Memoria_obligatoria candidate, so
  the temporal-origin half was vacuous there.

Recorded without fixing (both comment-only, per explicit scope ruling):
- test_precedence_of.ml: corrected the entry-3 Nativity Vigil test's
  characterisation. The pinned band-30 assertion (2026-12-24, a Thursday) is
  correct, but is not the value on a 24-December Sunday (e.g. 2028, 2034),
  where is_privileged_sunday instead bands the same candidate 20. Named the
  underlying Phase 1 defect this exposes -- named() claims 24 December
  unconditionally and is matched before sunday_slug, so the Fourth Sunday of
  Advent gets no office at all in those years, invisible to the litcal layer
  -- as known and carried to the next task.
- precedence_of.mli transfer_target: documented Normae n. 56(f) (St Joseph
  on Palm Sunday anticipates backward to 18 March) as a known, cited,
  unimplemented fourth transfer rule, and named the underlying kernel
  constraint (Rite.t.transfer_target's strictly-later obligation, justified
  only by the EF's RG 96) as the reason a real fix needs a kernel change.

dune test: 799 tests, exit 0. make check (exhaustive sweep): 805 tests,
exit 0, 224.7s. No kernel/rite_ef/data changes (git diff empty).
</content>
</entry>
<entry>
<title>feat(of): transfer_target per Normae nn. 5 and 60</title>
<updated>2026-08-25T18:24:29Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T18:24:21Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=e611e90b0b5433ddc9afdcf26cbf98a5c3a7be28'/>
<id>urn:sha1:e611e90b0b5433ddc9afdcf26cbf98a5c3a7be28</id>
<content type='text'>
Three rules, in priority order: the Annunciation in Holy Week goes to
Easter+8; any other solemnity on a Sunday of Advent, Lent or Easter goes to
the following Monday (n. 5, which n. 60 defers to explicitly), except on Palm
Sunday or Easter Sunday; otherwise the nearest later day free of Tabula
entries 1-8.

The n. 5 Monday rule is easy to miss -- n. 60 names it only by cross
reference, and reading n. 60 alone yields a single search rule where the
sources give three.

Shaped to match Rite.t.transfer_target so a later phase wires it unchanged,
with its own step bound: Calendar's round guard bounds rounds, not one call's
internal search.
</content>
</entry>
<entry>
<title>fix(of): correct vigil_feast's justification for of-nativity-vigil</title>
<updated>2026-08-25T17:59:26Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T17:59:26Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=ce67fad69398047739a6ce89fb76f32b136b69f5'/>
<id>urn:sha1:ce67fad69398047739a6ce89fb76f32b136b69f5</id>
<content type='text'>
The prior comment claimed of-nativity-vigil is 'not a distinct celebration' -
wrong: Temporal_of.named (temporal_of.ml:230) constructs it as its own
Sollemnitas-rank candidate on 24 December, a genuine contestant in
band/Precedence.resolve.

The real reason None is safe is structural, not that. The Nativity is
Tabula entry 2 (band 20); only entry 1, the Paschal Triduum (band 10),
bands lower. The Triduum's Easter-2..Easter window is confined to 20
March-25 April because Gregorian Easter never falls outside [22 March, 25
April] over the whole 1583-9999 domain (measured exhaustively in
test_computus.ml, not assumed), so it can never reach 25 December. The
Nativity therefore always keeps its own day and its vigil can never be
orphaned by a transfer or reduction.

Behaviour is unchanged: vigil_feast still returns None unconditionally.
RG 33 (EF-only) and Normae nn. 11/13 remain the reason the hook exists at
all and returns None for every other candidate.
</content>
</entry>
<entry>
<title>feat(of): admit and vigil_feast, both argued degenerate</title>
<updated>2026-08-25T17:52:46Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T17:52:46Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=29f1cc7e67e75d3f35747e5f6edd4e7ba430f97e'/>
<id>urn:sha1:29f1cc7e67e75d3f35747e5f6edd4e7ba430f97e</id>
<content type='text'>
admit returns the empty list because disposition never returns Commemorate;
vigil_feast returns None because the OF has no vigil office that its feast's
movement could orphan -- 'of-nativity-vigil' is a Mass formulary of the
solemnity, not a separate celebration.

Both are argued from the sources rather than stubbed, and Precedence_of.rules
now assembles the four functions the kernel resolver consumes.
</content>
</entry>
<entry>
<title>feat(of): disposition per Normae n. 60</title>
<updated>2026-08-25T17:47:52Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T17:47:52Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=ebbf88dae0110e9cb00935861fae1857107260cc'/>
<id>urn:sha1:ebbf88dae0110e9cb00935861fae1857107260cc</id>
<content type='text'>
An impeded solemnity transfers; every other loser is omitted for that year
('Reliquae celebrationes eo anno omittuntur').

Commemorate is never returned, and that is the rule rather than a gap: the OF
has no commemoration of a losing celebration in the EF's sense, and an
optional memorial is an election rather than a commemoration. A property over
every rank pairing asserts it, so a later edit cannot quietly introduce one.
</content>
</entry>
<entry>
<title>feat(of): transcribe Tabula part I into precedence_of</title>
<updated>2026-08-25T17:01:39Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-25T17:01:39Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=a2be1f88ff9d2e4dd99689213692f2a03bbf999d'/>
<id>urn:sha1:a2be1f88ff9d2e4dd99689213692f2a03bbf999d</id>
<content type='text'>
The Tabula dierum liturgicorum's entries 1-4, one band branch each, scaled
x10 as Precedence_ef's own table is. The Triduum is identified structurally
by Easter offset because Temporal_of emits Good Friday and Holy Saturday as
ordinary Lent week-6 ferias, leaving no slug to key on.

Holy Thursday sits at entry 2, not entry 1: the Tabula's own entry 2 runs
'a feria II ad feriam V inclusive' and the Triduum opens with an evening
Mass inside that civil day. Same granularity decision the litcal layer's L1
records on the season axis.
</content>
</entry>
</feed>
