aboutsummaryrefslogtreecommitdiff
path: root/test/test_temporal_ef.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 13:12:01 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 13:12:01 +0200
commitd2bfeb3c9b5cff163ed9cd9e86eb0e1849117f67 (patch)
tree322bee04e3499493df1c38e9f0a1b0a01e579ec8 /test/test_temporal_ef.ml
parentdc00d1f730b23fa99cd15ff142ecba515a9fe0b7 (diff)
downloadcolitur-d2bfeb3c9b5cff163ed9cd9e86eb0e1849117f67.tar.gz
colitur-d2bfeb3c9b5cff163ed9cd9e86eb0e1849117f67.zip
temporal(ef): the Sacred Triduum's own Latin identity, RG 91 entry 2
Holy Thursday, Good Friday and Holy Saturday resolved to the generic Passiontide ferial slugs with no distinct identity of their own -- rank and colour were already correct (RG 91 entry 2; Holy Thursday's white per RG 128(b)/RG 122), only Celebration.names/subject were missing. Keeps the slug (RG 91 entry 2 is identified structurally, off rank and Easter offset, by Precedence_ef.band -- never off the slug -- so renaming it would touch precedence for no reason and break the lectio differential's own slug mapping for these three lectionary keys, the same reasoning already given for Holy Family/Holy Name). Carries the identity in Celebration.names instead, the same treatment those two established: Latin, not English, to avoid reading the oracle this axis is compared against. Names sourced from both photographic scans, word for word, corroborated by the electronic transcription's own table-of-contents-style listing at the identical three headings (three-way agreement, nothing to adjudicate): "Feria V in Cena Domini" (Holy Thursday), "Feria VI in Passione et Morte Domini" (Good Friday -- not the transcription's own informal "Feria VI Parasceve" used in passing elsewhere), "Sabbato Sancto" (Holy Saturday). Also tags subject = Lord, going further than Holy Family/Holy Name strictly required (they needed it only because band's entry 14 reads subject to outrank a colliding fixed feast; entry 2 here needs no such thing). Safe: disposition's RG 112(a) branch only fires when both sides of an occurrence are tagged Lord, and no Lord-subject sanctoral entry has a fixed civil date inside Holy Week's own movable range; any Class1 sanctoral entry landing there (e.g. a transferred Annunciation) reaches disposition's earlier, subject-blind Transfer branch first regardless. Verified against the full 1583-9999 domain: zero observed/commemorations/transferred_* difference traceable to the tag. test_golden.ml's describe gains a name_la field alongside subject, for the same reason subject was added: a names-only change is otherwise invisible to every pin whose rank/colour/slug are already correct (this task's own catalogued vacuity flavour #1). Six existing pins move from subject=temporal to subject=lord (the three Easter-extreme Holy Saturday pins, 2016's Good Friday, and the 2026 Holy Thursday/Good Friday pair); the rest gain name_la=- by construction (no other temporal-cycle candidate carries a name yet). Mutation-tested: reverting temporal_ef.ml alone (keeping the tests) reddens the new Rite_ef unit test plus five golden pins across two independent layers.
Diffstat (limited to 'test/test_temporal_ef.ml')
-rw-r--r--test/test_temporal_ef.ml81
1 files changed, 81 insertions, 0 deletions
diff --git a/test/test_temporal_ef.ml b/test/test_temporal_ef.ml
index f341533..a979700 100644
--- a/test/test_temporal_ef.ml
+++ b/test/test_temporal_ef.ml
@@ -732,6 +732,85 @@ let test_holy_name_fallback_anchor_present_and_erosion_is_caught () =
Alcotest.(check string) "sanity: temporal itself is unaffected by the anchors-list erosion"
expected_slug (slug_of expected_date)
+(* Gap 1 (ef-triduum-litanies, docs/research/rules-register.md, "the Sacred
+ Triduum has no proper office"): the Missal's own Mass-propers headings for
+ Holy Thursday/Good Friday/Holy Saturday, both photographic scans, word for
+ word (missale-romanum-1962.pdf and "Missale Romanum 1962_text.pdf",
+ corroborated by the electronic transcription's own table-of-contents-style
+ listing at the identical three headings -- three-way agreement, no
+ scan-vs-transcription conflict to adjudicate): "FERIA QUINTA IN CENA
+ DOMINI" / running header "Feria V in Cena Domini"; "FERIA SEXTA / IN
+ PASSIONE ET MORTE DOMINI"; "SABBATO SANCTO". The slug stays the generic
+ Passiontide ferial one (RG 91 entry 2 already identifies the Triduum
+ structurally, off the day's own Easter offset and rank --
+ {!Rite_ef.Precedence_ef.band}'s own entry-2 branch -- never off the slug,
+ so renaming it would touch precedence for no reason and would break the
+ lectio differential's own slug mapping for these three lectionary keys);
+ the missing IDENTITY is carried in [names], the same treatment RG
+ 17(b)/(a) (Holy Family/Holy Name) already established -- Latin, not
+ English, for the same zero-circularity reason those two entries give
+ (would otherwise read the oracle this exact axis is compared against).
+
+ [subject] is ALSO set to [Lord] here, going further than Holy Family/Holy
+ Name's own precedent strictly required (they needed it because
+ {!Rite_ef.Precedence_ef.band}'s entry 14 reads [subject] to outrank a
+ colliding fixed feast). The Triduum has no such live need: entry 2 is
+ decided purely by [rank]/Easter-offset, never [subject] -- confirmed by
+ reading {!Rite_ef.Precedence_ef.band}'s own entry-2 branch, which tests
+ neither. Tagged anyway because it is simply true (the Last Supper, the
+ Passion and Death, the entombment are textbook mysteries of the Lord) and
+ safe: {!Rite_ef.Precedence_ef.disposition}'s own RG 112(a) branch (Lord vs
+ Lord) only fires when BOTH sides are tagged [Lord], and no [Lord]-subject
+ sanctoral entry anywhere in data/ef/sanctoral.sexp has a FIXED civil date
+ inside Holy Week's own movable range (earliest 19 March, latest 24 April
+ -- the register's own subject audit lists exactly six [Lord]-tagged
+ entries, all fixed in January, February, August, September or November);
+ any [Class1] sanctoral entry that DOES land there (e.g. a transferred
+ Annunciation) reaches {!Rite_ef.Precedence_ef.disposition}'s EARLIER,
+ subject-blind "I class, not a Sunday -> Transfer" branch first, so RG
+ 112(a)'s own branch is never reached for it regardless of this tag.
+ Measured empirically too: this task's own full 1583-9999 blast-radius
+ sweep shows no [observed]/[commemorations]/[transferred_*] difference
+ traceable to this tag anywhere in the domain. *)
+let test_sacred_triduum_identity () =
+ (* 2026: Easter 5 April, so Holy Thursday/Good Friday/Holy Saturday are
+ 2/3/4 April. *)
+ Alcotest.(check string) "2026-04-02 Holy Thursday: slug stays the generic ferial key"
+ "ef-passiontide-2-thursday" (slug_of (d 2026 4 2));
+ Alcotest.(check bool) "2026-04-02 Holy Thursday: subject Lord" true
+ (subject_of (d 2026 4 2) = Sub.Lord);
+ Alcotest.(check (option string)) "2026-04-02 Holy Thursday: Latin name, both photographic scans verbatim"
+ (Some "Feria V in Cena Domini") (name_la_of (d 2026 4 2));
+ Alcotest.(check string) "2026-04-03 Good Friday: slug stays the generic ferial key"
+ "ef-passiontide-2-friday" (slug_of (d 2026 4 3));
+ Alcotest.(check bool) "2026-04-03 Good Friday: subject Lord" true
+ (subject_of (d 2026 4 3) = Sub.Lord);
+ Alcotest.(check (option string)) "2026-04-03 Good Friday: Latin name, both photographic scans verbatim"
+ (Some "Feria VI in Passione et Morte Domini") (name_la_of (d 2026 4 3));
+ Alcotest.(check string) "2026-04-04 Holy Saturday: slug stays the generic ferial key"
+ "ef-passiontide-2-saturday" (slug_of (d 2026 4 4));
+ Alcotest.(check bool) "2026-04-04 Holy Saturday: subject Lord" true
+ (subject_of (d 2026 4 4) = Sub.Lord);
+ Alcotest.(check (option string)) "2026-04-04 Holy Saturday: Latin name, both photographic scans verbatim"
+ (Some "Sabbato Sancto") (name_la_of (d 2026 4 4));
+ (* Neighbouring days carry no name/subject override -- the tag is exactly
+ three days wide, not the whole Passiontide-2 week. *)
+ Alcotest.(check (option string)) "2026-04-01 (Wednesday of Holy Week): no Latin name"
+ None (name_la_of (d 2026 4 1));
+ Alcotest.(check bool) "2026-04-01 (Wednesday of Holy Week): subject stays temporal" true
+ (subject_of (d 2026 4 1) = Sub.Temporal);
+ Alcotest.(check (option string)) "2026-04-05 Easter Sunday: no Latin name from this branch"
+ None (name_la_of (d 2026 4 5));
+ (* A second, independent year (1666: the latest possible Easter, 25 April,
+ already this file's own Easter-extreme witness elsewhere) -- proves the
+ mechanism generalises off [days_between easter d], not hand-pinned to
+ 2026's own civil dates. Holy Thursday/Good Friday/Holy Saturday are
+ 22/23/24 April 1666. *)
+ Alcotest.(check (option string)) "1666-04-22 Holy Thursday (latest-Easter year): Latin name still fires"
+ (Some "Feria V in Cena Domini") (name_la_of (d 1666 4 22));
+ Alcotest.(check bool) "1666-04-22 Holy Thursday: subject Lord" true
+ (subject_of (d 1666 4 22) = Sub.Lord)
+
let test_totality () =
(* Every day of 2026 yields an office without raising. Not a slug
re-validation -- Slug.t is a private string validated on construction,
@@ -765,6 +844,8 @@ let suite_extra =
Alcotest.test_case "ember days" `Quick test_ember_days;
Alcotest.test_case "rogations" `Quick test_rogations;
Alcotest.test_case "colours" `Quick test_colours;
+ Alcotest.test_case "sacred triduum identity (RG 91 entry 2, Gap 1)" `Quick
+ test_sacred_triduum_identity;
Alcotest.test_case "christmastide feria slugs" `Quick test_christmastide_feria_slugs;
Alcotest.test_case "named days carry their week" `Quick test_named_days_carry_their_week;
Alcotest.test_case "totality" `Quick test_totality;