summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-21 14:42:30 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-21 14:42:30 +0200
commit12b97761019cfa02ca0da8a5fb50ef815d07685c (patch)
tree11e7306a1a5de2f5226eea06282515ff38b226d5 /data
parent0eae32f67145065b0e4960650ae06c293fd9f272 (diff)
downloadcolitur-12b97761019cfa02ca0da8a5fb50ef815d07685c.tar.gz
colitur-12b97761019cfa02ca0da8a5fb50ef815d07685c.zip
feat(ef): implement RG 33's third omission trigger
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 -> missalemeum -> 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 -> 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.
Diffstat (limited to 'data')
-rw-r--r--data/ef/expected-divergences.sexp13
1 files changed, 13 insertions, 0 deletions
diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp
index d6cbc5b..f99add0 100644
--- a/data/ef/expected-divergences.sexp
+++ b/data/ef/expected-divergences.sexp
@@ -87,6 +87,19 @@ VERDICT, split by the SAME 138-row population, not two entries: on the 119 rows
Gated on the literal date window (month=12, day in {29,30,31}) AND colitur's own slug family (`nativity_octave_day_slugs`) AND `subset diffs [ Slug_f; First_f; Gospel_f ]` (widened this task from the exact-match `diffs = [ Slug_f ]` the pre-citation-comparison entry used -- narrowing back to exact-match would have silently re-excluded the very citation divergence this task exists to surface). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 138. NARROWED (Nativity-Octave fix, 2026-08-18): 138 -> 119. Nineteen of these days are 26-28 December, which colitur now builds as days WITHIN the Octave of the Nativity (RG 67) rather than generic Christmastide ferias, so their temporal identity -- and with it their divergence shape -- changed. Not a re-adjudication: the same RG 69 disagreement on the days that remain. VERDICT CLOSED 2026-08-18, open -> colitur, because the defect this entry named was FIXED rather than re-argued. The note above splits the old 138 rows into 119 weekday rows, where it already recorded colitur's citation as CONFIRMED CORRECT and said verdict colitur would be accurate for that subset alone, and 19 Sunday rows where colitur emitted the weekday formulary in defiance of RG 69 and was plainly wrong -- a genuine Temporal_ef defect it deliberately left out of scope. Temporal_ef now excludes Sundays from the octave-day branch (register 6.17, confirmed against the oracle: missalemeum shows Sunday in the Octave of Christmas on 2035-12-30 where colitur showed a feria), so those 19 rows no longer occur at all and the count fell 138 -> 119 -- exactly the population this note had already enumerated by date. What remains is only the subset this entry itself certified correct: colitur says the Missal's own Diebus infra octavam formulary, lectio falls back to whichever civil Sunday precedes the date. Verdict colitur, on the reasoning already written here rather than on anything new. NARROWED, not closed, 2026-08-18: still 119 rows, but the CAUSE has halved. lectio now serves the Missal's own 'Diebus infra octavam Nativitatis Domini' Mass on 29-31 December (Titus 3:4-7 / Luke 2:15-20) instead of falling back to the Sunday's, so First_f and Gospel_f no longer differ on any of these days -- what remains is Slug_f alone, colitur's ef-nativity-octave-day-N against lectio's ordinary ef-christmas-N-weekday. That is naming, not disagreement: the two engines now read the same Mass on the same day. This entry's own gate already admits a Slug_f-only subset, which is why the count did not move even though the substantive half of the divergence did.")
(expected_rows 119))
+ ((id C39)
+ (citation "RG 33, primary text, docs/research/LT.txt: \"Vigilia II aut III classis penitus omittitur, si occurrat in dominica quavis, aut in festo I classis, vel si festum cui praemittitur in alium diem transferri aut ad commemorationem reduci contingat\" -- \"A vigil of the II or III class is entirely omitted if it occurs on any Sunday whatsoever, or on a feast of the I class, OR IF THE FEAST IT PRECEDES happens to be transferred to another day or reduced to a commemoration.\" The third clause is the one at issue; RG 34 places the feast on the day after its vigil, which is how the rule is evaluated. Register ยง6.31.")
+ (verdict colitur)
+ (note "colitur implements all three of RG 33's omission triggers; lectio implements the first two only. On these 10 days the vigil's own weekday is unremarkable -- it is the FEAST that fails to keep its day, either transferred away under RG 96 or reduced to a commemoration under RG 94 -- so lectio still emits the vigil and colitur omits it entirely.
+
+Two shapes, both in the rubric's own words. SEVEN rows are 'ad commemorationem reduci': 10 August falls on a Sunday, the II-class Sunday outranks St Lawrence's II-class feast (RG 15), the feast is commemorated rather than celebrated, and the vigil of 9 August goes (2008, 2014, 2025, 2031, 2036, 2042 -- and the same shape reaches the 2038 row through the other half). THREE are 'in alium diem transferri': the Sacred Heart takes 24 June, the Nativity of St John the Baptist transfers under RG 96, and its vigil of 23 June goes (2022, 2033, 2038, 2044).
+
+Domain-wide this clause fires on 1 744 of the 3 074 246 days in 1583-9999 -- 1 199 St Lawrence, 347 St John the Baptist, 198 Sts Peter and Paul -- measured by diffing a pre-change binary against HEAD over the whole domain and classifying every changed day: three shapes, zero unexplained, and every one independently re-checked to confirm the feast really is absent from its own day.
+
+INDEPENDENTLY WITNESSED, which is rare in this file and is the reason this entry is verdict colitur rather than open. The published Ordo -- the project's only witness outside the Divinum Officium -> missalemeum -> lectio lineage (see CLAUDE.md's own account of why layers 3 and 4 are one lineage, not two) -- omits the vigil on 2025-08-09, agreeing with colitur against both engines. It had been examined earlier in the same session that implemented this rule and misread as an Ordo GAP, on the reasoning that the Missal's calendarium lists the vigil; the calendarium lists it as a fixed entry, which is not a claim about whether it survives a given year's occurrence. The Ordo was right. Two dates were compared and they part company for the correct reason: on 2027-08-09 (10 August a Tuesday, the feast keeps its day) the Ordo omits a vigil colitur correctly keeps, and that one IS an Ordo gap.
+
+Gated on lectio's own slug being one of the three vigils this clause can reach and colitur's not being a vigil -- identity on both sides, not a diff-set shape. The Assumption's and the Ascension's vigils are absent from that list because their I-class feasts always keep their own day: 0 occurrences across the whole domain, measured rather than assumed.")
+ (expected_rows 10))
; C8 -- CLOSED, REMOVED (2026-08-18): 0 of 16801 rows, was 26. lectio builds
; Rogation Monday and Tuesday now (RG 87, Easter+36/+37, violet under
; RG 128(d)). The Wednesday is NOT built there and deliberately so: Easter+38