summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-25 16:31:15 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-25 16:31:15 +0200
commitb9cb5060d2ba5aa7f7a9d6d97e3bced112e30fed (patch)
tree35c76256683b4feb8f0031eb3b505c0a8ee410e0 /data
parent6559a9b19451ce82a7d71281e25899acbcee2d49 (diff)
downloadcolitur-b9cb5060d2ba5aa7f7a9d6d97e3bced112e30fed.tar.gz
colitur-b9cb5060d2ba5aa7f7a9d6d97e3bced112e30fed.zip
test(of): validate Phase 1's Ordinary Time resumption against litcal
Adds a sixth-lineage external validation layer for the OF rite module's Phase 1 temporal cycle, targeting the single highest-risk function that report named: the two-block Ordinary Time week arithmetic (Normae n. 44), which has no external witness anywhere in Phase 1's own suite and whose output selects the Mass formulary, not merely a label. Witness: litcal (Liturgical Calendar API), Apache-2.0, already archived and SHA-256-pinned by the sibling lectio project. AELF was considered and correctly excluded earlier (its CGU forbids redistribution) -- litcal is what it was replaced with. - tools/extract_litcal_ordo.py verifies all twelve archived calendar-YYYY-en.json files (2024-2035; the task brief said eleven, but twelve are actually pinned in lectio's manifest -- all twelve are used) against lectio's own manifest.tsv, then builds one fixture spanning the contiguous 4382-day range those twelve liturgical-year files cover. - test/fixtures/litcal-temporal-2024-2035.sexp: one row per day, season and (where witnessed) Ordinary Time week, with full provenance, licence, per-year Easter dates and the row-selection rules in its own header. - test/test_litcal_of.ml calls Temporal_of.temporal directly (no Rite.t) and compares 1:1 against the fixture: zero Ordinary Time week mismatches on all 1876 witnessed days (zero tolerance, no allow-list); the only season divergence class is the Sacred Triduum, which litcal tags with a season value colitur's vocabulary deliberately has none of -- one cited allow-list entry, data/of/expected-divergences-litcal.sexp, 36 rows, exact. - Mutation-tested: dropping the backward-from-34 adjustment reddens this layer (1511 of 1876 days) plus three pre-existing Phase 1 tests; the mutation was not committed. Does not touch lib/rites/rite_ef/, data/ef/, or lib/rites/rite_of/ -- this validates Phase 1, it does not change it. Full suite: 786 tests via dune test, 791 via make check, exit 0 both; lib/bin diff empty throughout.
Diffstat (limited to 'data')
-rw-r--r--data/of/expected-divergences-litcal.sexp72
1 files changed, 72 insertions, 0 deletions
diff --git a/data/of/expected-divergences-litcal.sexp b/data/of/expected-divergences-litcal.sexp
new file mode 100644
index 0000000..c75538a
--- /dev/null
+++ b/data/of/expected-divergences-litcal.sexp
@@ -0,0 +1,72 @@
+; data/of/expected-divergences-litcal.sexp -- of-litcal-layer task
+; (2026-08-25)'s cited allow-list for the litcal external-validation layer
+; (test/test_litcal_of.ml), fixture window 2023-12-03..2035-12-01 (twelve
+; litcal liturgical years, 4382 civil days).
+;
+; ONE active entry. The Ordinary Time WEEK comparison (the actual risk this
+; layer exists to validate, Normae n. 44's two-block resumption arithmetic)
+; carries NO allow-list at all -- see test_litcal_of.ml's own
+; [test_ordinary_time_week_matches] comment for why a witnessed week is
+; zero-tolerance, not an "expected divergence" shape.
+
+; L1 -- OPEN BY DESIGN, adjudicated "colitur" (a deliberate, cited design
+; decision, not a defect on either side). Fires on every litcal row tagged
+; EASTER_TRIDUUM: Holy Thursday's own evening Mass of the Lord's Supper,
+; Good Friday, and Holy Saturday, across all twelve fixture years -- 3
+; dates x 12 years = 36 rows, exactly.
+;
+; litcal's own data model gives the Sacred Triduum a season value of its
+; own (`liturgical_season: EASTER_TRIDUUM`), distinct from both LENT and
+; EASTER. colitur's `Vocab_of.season` has no such value: it keeps the
+; whole civil day of Holy Thursday, Good Friday and Holy Saturday inside
+; `Lent`, per lib/rites/rite_of/temporal_of.ml's own top-of-module
+; citation --
+;
+; Normae n. 28 (PRIMARY): "Tempus Quadragesimae decurrit a feria IV
+; Cinerum ad Missam in Cena Domini EXCLUSIVE" -- Lent runs from Ash
+; Wednesday up to (excluding) the evening Mass of the Lord's Supper. At
+; colitur's own civil-day granularity (one season per date, never a
+; sub-day boundary), the excluded boundary is an EVENT within Holy
+; Thursday's own civil day, not an earlier day -- so the whole day stays
+; Lent.
+;
+; Normae n. 30 (PRIMARY, independent second anchor): "Dominicae huius
+; temporis appellantur dominicae I, II, III, IV, V in Quadragesima.
+; Dominica sexta, in qua initium sumit Hebdomada sancta, dicitur...
+; 'Dominica in palmis de Passione Domini'" -- Holy Week (Palm Sunday
+; through the Vigil) is Lent's OWN sixth week by the Missal's own prose,
+; not a season outside Lent's numbering.
+;
+; Normae Titulus II's own six subsection headings (II-VI): FIVE are
+; literally called a "tempus"; "Triduum paschale" is deliberately NOT --
+; a real textual signal that the document's own authors did not count
+; the Triduum among the season vocabulary a day's season field needs to
+; name, corroborated by the Missal's own Mass-propers structure printing
+; "HEBDOMADA SANCTA" and "SACRUM TRIDUUM PASCHALE" as two separate
+; headings, neither titled "tempus" either.
+;
+; So litcal's EASTER_TRIDUUM is a genuine, defensible IMPLEMENTATION
+; choice (giving the Triduum its own practical season tag, useful for an
+; API consumer), and colitur's `Lent` is an equally genuine, primary-
+; source-argued READING of the same Normae text that declines to invent a
+; sixth season value the text itself does not name. Neither side is wrong;
+; this is a vocabulary question the two engines answer differently by
+; design, not a computation either got wrong -- verdict "colitur" here
+; means "colitur's own choice is deliberate and cited", not "litcal is in
+; error".
+;
+; The ROW SELECTION that produces exactly 36, not 24 or 48, is explained
+; in test/fixtures/litcal-temporal-2024-2035.sexp's own header and
+; tools/extract_litcal_ordo.py's own top-of-file comment: Holy Thursday
+; carries TWO non-vigil litcal rows on the same civil date (the Chrism
+; Mass, LENT, and the evening Mass of the Lord's Supper, EASTER_TRIDUUM);
+; the Chrism row is excluded upstream (in the fixture generator, not
+; here) so the evening Mass -- the day's own actual public/parish liturgy
+; -- represents the date, giving Holy Thursday the SAME season shape as
+; Good Friday and Holy Saturday (each of which has only one non-vigil row,
+; always EASTER_TRIDUUM) rather than an inconsistent 2-of-3 split.
+((id L1)
+ (citation "Normae nn. 28, 30; Normae Titulus II's own six subsection headings")
+ (verdict colitur)
+ (note "Holy Thursday (evening Mass)/Good Friday/Holy Saturday: litcal tags EASTER_TRIDUUM, colitur has no Triduum season value and keeps the whole day Lent -- a cited design decision, not a defect.")
+ (expected_rows 36))