diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-13 13:12:01 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-13 13:12:01 +0200 |
| commit | d2bfeb3c9b5cff163ed9cd9e86eb0e1849117f67 (patch) | |
| tree | 322bee04e3499493df1c38e9f0a1b0a01e579ec8 /test/test_temporal_ef.ml | |
| parent | dc00d1f730b23fa99cd15ff142ecba515a9fe0b7 (diff) | |
| download | colitur-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.ml | 81 |
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; |
