aboutsummaryrefslogtreecommitdiff
path: root/data/ef/expected-divergences.sexp
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-12 03:18:15 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-12 03:18:15 +0200
commitfcfce4ba0ab4ea93837b647deaa5292300aaad5e (patch)
tree0a56b077e5214a5aec3eec609de4e3a9358e4af3 /data/ef/expected-divergences.sexp
parent4235a6aa18b815c5457a7eb97fd97eb4919dfd4b (diff)
downloadcolitur-fcfce4ba0ab4ea93837b647deaa5292300aaad5e.tar.gz
colitur-fcfce4ba0ab4ea93837b647deaa5292300aaad5e.zip
test: differential vs lectio 2005-2050 with a cited allow-list
Validation layer 3 (design spec's five): compares colitur's real day-by-day EF output against lectio (sibling project, Go), 2005-2050, one line per civil day. Of 16801 day-pairs, 11206 already agree on the seven leading columns; the 5595 that don't resolve into exactly 25 distinct field-diff signatures, all triaged. Three strictly separate layers, per the controller's ruling (the brief's single flat allow-list assumed a handful of differences, not 5595): - Layer A (test_differential.ml, norm_season/norm_slug): vocabulary. An explicit, closed table of naming synonyms with no liturgical substance (lectio's easter/christmas vs colitur's paschaltide/christmastide; a handful of slugs that are two names for the identical office). No wildcards -- every entry is a literal string pair. - Layer B (strip_epiphany_index): numbering. The one slug family whose lectio/colitur index offset is not a constant (Time-after-Epiphany week numbering, register 3c#5) has its embedded digit stripped to a common form on both sides before comparing; rank and colour stay fully compared. - Layer C (data/ef/expected-divergences.sexp): the cited allow-list. Ten genuine liturgical disagreements, each citing its RG paragraph and naming which engine is right (always colitur, verified against the Missal/register, never against lectio's own behaviour). This is the only layer permitted to cover a difference in rank, colour, or which celebration is observed. Five extend or restate register 3c's already- documented divergences (season boundary, Sunday I-class, Advent Ember ferias, Rogations); five are new, found and adjudicated in this task (Lent Ember days, the Nativity Octave, Ember-day-vs-saint precedence, the St Joseph transfer off a Lent Sunday, and the 2011 Sacred Heart / Precious Blood / Visitation collision). expected_rows on each entry is an exact regression pin, asserted by the test, not documentation. 13 January (register 6's long-open "Baptism of the Lord" item) is confirmed empirically fixed already -- Task 11's sanctoral wiring closed it before this task started -- so it is not allow-listed; the only residual difference there is the season boundary already covered by C1. Two stated limits carried from the brief (commemorations are not comparable; lectio's own EF oracle asserts season only, 2025-2026 only, so a rank/colour difference is not presumptive evidence against colitur) plus a third found during this task (the week column is a display convention on both sides, not a liturgical fact, and is not compared at all) are documented in the test file's own doc comment. Fixture: test/fixtures/lectio-ef-2005-2050.txt, committed as plain text (1.4 MB), generated by lectio commit 2386a45; provenance recorded in the sibling .provenance file. Colitur's side is recomputed fresh from the library on every run, through the same Calendar/Rite_ef pipeline `colitur day` uses, not the compiled binary. Proved the harness has teeth by two reverted perturbations: a genuine colour difference injected into a fully-covered fixture row fails the "no unexplained differences" check with the exact mismatched row printed; a one-row drift in an allow-list entry's expected_rows fails the count check independently, showing it is not merely a duplicate of the first assertion. 236/236 tests green, clean-build verified, deterministic across OCAMLRUNPARAM=R.
Diffstat (limited to 'data/ef/expected-divergences.sexp')
-rw-r--r--data/ef/expected-divergences.sexp69
1 files changed, 69 insertions, 0 deletions
diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp
new file mode 100644
index 0000000..17bafc1
--- /dev/null
+++ b/data/ef/expected-divergences.sexp
@@ -0,0 +1,69 @@
+; data/ef/expected-divergences.sexp -- Task 15's Layer C: the CITED allow-list
+; for colitur's differential harness against lectio (test/test_differential.ml),
+; 2005-2050. This is the only layer that may cover a difference in rank,
+; colour, or which celebration is observed -- Layers A (vocabulary) and B
+; (numbering) live in test_differential.ml's code because they normalise
+; NAMES and INDICES only and never touch this file's territory.
+;
+; Each entry is a genuine liturgical disagreement between the two engines.
+; [verdict] names which engine the register/Missal backs; every entry here
+; is "colitur" -- an entry saying otherwise would mean "fix colitur", not
+; "allow-list it" (task ruling). [expected_rows] is the exact row count this
+; entry accounts for over the fixture's 2005-2050 span: a REGRESSION PIN, not
+; documentation -- test_differential.ml asserts actual counts equal these
+; exactly, so an unnoticed behaviour change here fails loudly instead of
+; silently changing what the harness accepts.
+;
+; Regenerate expected_rows only after re-adjudicating the change against the
+; Missal/register -- never by re-running the comparator and copying its
+; output back here (that would launder a regression into a new baseline).
+((id C1)
+ (citation "RG 72-73 (Nativity/Epiphany season boundary, Jan 1-13) + RG 119a (white through \"expletum tempus Epiphaniae\"); register §3c item 1")
+ (verdict colitur)
+ (note "6-13 January is Christmastide in colitur, matching RG 72-73's explicit boundary at 13 January (corroborated independently by RG 119a's colour rule, register lines 241-246). lectio's efSeason switches to time-after-epiphany on 6 January. The season disagreement cascades into colour (green vs white) and, on 7-8 January specifically, into the ferial slug family name (colitur's ef-christmas-2-<weekday> vs lectio's ef-time-after-epiphany-1-<weekday> for the same two days).")
+ (expected_rows 368))
+ ((id C2)
+ (citation "RG 91 line 332 (\"Sundays of Advent, Lent, Passiontide, and Low Sunday\" -- I class, unqualified); extends register §3c item 4 (stated there for Advent only) to Lent on the same textual basis")
+ (verdict colitur)
+ (note "Advent II & IV and Lent I-III are I class in colitur, matching RG 91's own unqualified line 332 (already confirmed for Passion Sunday, Palm Sunday, Low Sunday and Advent I, where lectio agrees). lectio's temporal_ef.go generic Sunday branch assigns Class2 and special-cases only Advent I, Passion/Palm/Low Sunday -- a lectio gap for the remaining five Sundays this entry covers.")
+ (expected_rows 215))
+ ((id C3)
+ (citation "RG 91 line 332 (same I-class Sunday rule as C2) + RG 131 (rose indult, Gaudete/Laetare, \"in Officio et Missa diei dominici tantum\")")
+ (verdict colitur)
+ (note "Gaudete (Advent III) and Laetare (Lent IV): I class per C2's citation, plus the RG 131 rose indult. lectio has no Rose case in its EF colour function and zero rose rows in tridentine-calendar.ini -- Rose exists only on lectio's OF path -- so it prints violet for both Sundays.")
+ (expected_rows 89))
+ ((id C4)
+ (citation "RG 91 entry 18 (\"II-class ferias ... Advent 17-23 Dec\"); register §3c item 2")
+ (verdict colitur)
+ (note "Advent ferias 17-23 December (excluding the Advent Ember days, already correct on both sides) are II class in colitur. lectio marks every Advent feria III class.")
+ (expected_rows 140))
+ ((id C5)
+ (citation "RG 91 entry 18 (\"Ember days of Advent, Lent, September\", the same entry as C4); extends register §3c item 2 to the Lent set on the same textual basis lectio already gets right for Advent and September")
+ (verdict colitur)
+ (note "The Lent I Ember Wednesday/Friday/Saturday are II class with colitur's own ef-lent-ember-{wed,fri,sat} slugs. lectio implements the Advent and September Ember exceptions (matches colitur exactly, confirmed empty diff there) but not the Lent one, falling back to a plain ef-lent-1-<weekday> III-class feria -- a lectio gap not previously named in the register.")
+ (expected_rows 128))
+ ((id C6)
+ (citation "RG 91 entry 17 (\"days within the Octave of the Nativity\")")
+ (verdict colitur)
+ (note "29-31 December (and any Sunday landing among them) are II class in colitur, with the ef-nativity-octave-day-{5,6,7} slugs. lectio treats them as plain class-4 ferias (ef-christmas-0-<weekday>), not recognising the Nativity octave's own entry.")
+ (expected_rows 138))
+ ((id C7)
+ (citation "RG 91 entries 16 (II-class feast of the universal Church) vs 18 (II-class ferias, incl. Ember days) -- entry 16 outranks entry 18")
+ (verdict colitur)
+ (note "St Matthew (21 September, colliding with the September Ember Wednesday or Friday in some years) and St Thomas (21 December, colliding with the Advent Ember Friday in some years) are both II-class universal feasts and win the day per RG 91's own numeric ordering -- matching Rite_ef.Precedence_ef.band's already-reviewed entry 16/18 handling. lectio does not contest Ember days against sanctoral feasts at all and keeps the Ember office observed.")
+ (expected_rows 34))
+ ((id C8)
+ (citation "RG 87 (Minor Litanies/Rogations, Mon/Tue before Ascension); register §3c item 3")
+ (verdict colitur)
+ (note "Rogation Monday and Tuesday exist as colitur's own ef-rogation-{monday,tuesday} slugs (violet) whenever no higher-ranked saint intervenes. lectio computes no Rogation days at all and shows the plain paschaltide-week-6 feria instead.")
+ (expected_rows 31))
+ ((id C9)
+ (citation "RG 95 (translation is a right of I-class FEASTS only) + RG 91 line 332 (Sundays are a separate table row, not feasts) + RG 109(a) (\"of a Sunday\" is a privileged commemoration, presupposing the Sunday stays put) + RG 96 (the general translation walk) -- the same reasoning already fixed for the analogous impeded-Sunday defect in Precedence_ef (Task 9)")
+ (verdict colitur)
+ (note "St Joseph (19 March, I class) colliding with a Lent Sunday (I class per C2): colitur keeps the Sunday observed and transfers Joseph to the next free day (usually 20 March; in years the walk is congested enough to cross Easter, as far as 1 April -- 2008, 2035, 2046, independently pinned by this project's own transfer tests). lectio instead puts Joseph ON the Sunday, displacing the Lenten Sunday office RG 95 says cannot be displaced by a translated feast.")
+ (expected_rows 15))
+ ((id C10)
+ (citation "RG 91 entry 3 (Sacred Heart, a Feast of the Lord, outranks entry 11 Precious Blood) + RG 96 (impeded I-class feast moves to the next day that is NOT I or II class)")
+ (verdict colitur)
+ (note "2011: Sacred Heart (Friday after the Corpus Christi octave) falls on 1 July and impedes the Precious Blood (also 1 July, I class but a lower RG 91 entry). RG 96's walk must skip 2 July (Visitation, II class) and 3 July (Sunday), landing on 4 July (Monday, a free class-4 feria). lectio instead lands Precious Blood on 2 July, illegitimately displacing the Visitation -- exactly what RG 96's \"not I or II class\" clause forbids.")
+ (expected_rows 2))