aboutsummaryrefslogtreecommitdiff
path: root/test/test_oracle.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 20:15:56 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 20:15:56 +0200
commit81c72ce9fc4b769be19e6373ce66852acd5b3425 (patch)
tree2fc2f0d2c37b02a05695080b254875fff9231e7c /test/test_oracle.ml
parent84333a8c74ddb3988ad88398632ca5e1c7788e56 (diff)
downloadcolitur-81c72ce9fc4b769be19e6373ce66852acd5b3425.tar.gz
colitur-81c72ce9fc4b769be19e6373ce66852acd5b3425.zip
test(ef): oracle allow-list for the Major Litanies, and a source-fidelity correction
M5 (the pre-existing register-cited gap this task closes) had a genuine backwards claim in its own note: it said missalemeum's single admitted commemoration on 25 April 2027 (the Sunday-conflict year) was "the Major Litanies". Checked directly against the raw fixture row while adjudicating this task's own new divergence -- missalemeum's own commemorations field there is "St. Mark"; "Pro rogationibus" (the Litanies) is the one listed as displaced. Corrected in place, both the .sexp entry and this file's own header note. M5 itself now covers only the ordinary case (25 April 2026): presence agrees now that the entity is built, identity does not (colitur's own English name vs missalemeum's Latin-ish descriptive string), the same declared comparator limit M15/M18 already document, hit here for a different reason. The real, substantive divergence the correction exposes: colitur now admits the Litanies on 2027-04-25 where missalemeum admits Mark. New entry M20, adjudicated colitur -- RG 109(f) places the Litanies in the same closed privileged list as (a)-(e), and RG 111(b)'s own text is unconditional ("the II-class commemoration is dropped if a privileged one is due", no table-order qualifier). The same mechanism already primary-source-verified and used for other RG 109 categories elsewhere in this codebase; honestly flagged as the first real, non-synthetic test of this specific admit clause, consistent with this oracle's own already-documented pattern of RG 108-111 gaps (M1, M8, M10). M18's own count moves 395 -> 394 (2027-04-25 no longer falls into "observed- identity-unresolved alone"; it moved into M20), traced to the specific date and mechanism, not merely re-baselined. data/ef/expected-divergences.sexp (the lectio allow-list) needed no change: lectio computes no Major Litanies at all, and its own row type carries no commemorations field -- layer 3 is entirely blind to this change, confirmed rather than assumed.
Diffstat (limited to 'test/test_oracle.ml')
-rw-r--r--test/test_oracle.ml125
1 files changed, 107 insertions, 18 deletions
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index c0badfe..3a9e499 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -517,25 +517,108 @@ let m3_dates = [ "2027-05-03" ]
sourced from lectio's independently-fixed generator; the divergence no
longer occurs on either 2026-01-28 or 2027-01-28). *)
-(* M5 -- register §6's OWN already-open item, independently confirmed by
- the oracle: "Major Litanies (25 April, RG 80) are not yet computed" --
- missalemeum's commemoration "Pro rogationibus" ("for the Rogations") on
- St Mark's day (25 April, the Major Litanies' fixed date) is exactly the
- missing office. Not a new finding; recorded here so the automated
- comparator does not report it as an unexplained mismatch, and cross-
- referenced from the register so a reader sees both. Verdict missalemeum
- (colitur is missing a real, cited office; register §6 already tracks
- it). Only ONE date below, not two: 25 April 2026 is a Saturday (Mark
- wins outright, colitur's commemoration list is empty where the oracle's
- is not -- a visible presence gap); 25 April 2027 is a Sunday, where the
- Sunday wins on BOTH sides and each side's own single slot goes to a
- DIFFERENT candidate (colitur: Mark himself, admitted under RG 111(b)'s
- "de festo II classis"; missalemeum: the Major Litanies) -- both
- non-empty, same count, so this comparator's deliberately-not-slug-
- identity axes cannot see that year's instance at all (see the task
- report). *)
+(* M5 -- CORRECTED (ef-major-litanies task): the Major Litanies (RG 80,
+ Caput X "De Litaniis maioribus et minoribus") are now built
+ (Rite_ef.Precedence_ef's own [major_litanies_slug]/[disposition]/
+ [privilege_of] RG 109(f) branch/[transfer_target] RG 80 branch,
+ data/ef/adjustments.sexp's matching [Add] entry). This note's own
+ PRIOR text (struck below, kept for the record of what was corrected)
+ claimed missalemeum's single admitted commemoration on 25 April 2027
+ (the Sunday-conflict shape) was "the Major Litanies" -- CHECKED AGAINST
+ THE RAW FIXTURE ROW DIRECTLY while adjudicating this task's own new
+ divergence (test/fixtures/missalemeum-ef-2026-2027.txt, the 2027-04-25
+ line: "...|IV Sunday after Easter|-|St. Mark|Pro rogationibus|1|
+ sancti:04-25:2:r") and found BACKWARDS: missalemeum's own
+ [commemorations] field for that row is "St. Mark", and "Pro
+ rogationibus" (the Litanies) is the one listed in [displaced]. The
+ note had the two swapped -- a genuine source-fidelity slip in this
+ file's own prior authorship, not a re-reading of a primary document,
+ but corrected on the same "read positively, quote it" discipline this
+ project applies to the primary scans. See [M20] below for the fix
+ this correction actually motivates (2027's own now-real divergence,
+ colitur=Litanies vs missalemeum=Mark, adjudicated separately).
+
+ What THIS entry (M5) still covers, unchanged in kind: 25 April 2026 (an
+ ordinary, non-Sunday year -- Mark wins the day outright on both sides,
+ uncontested). Both engines now admit a commemoration there (colitur:
+ [major-litanies]; missalemeum: "Pro rogationibus") -- PRESENCE now
+ agrees (closing the register §6 gap this entry used to track), but the
+ two engines name the SAME real-world observance in different registers:
+ colitur's own English descriptive name (data/ef/adjustments.sexp's own
+ honestly-flagged, not-primary-sourced "The Major Litanies") against
+ missalemeum's Latin-ish "Pro rogationibus" ("for the Rogations") --
+ never going to match as literal strings, and not a rubric dispute at
+ all (RG 80/81 do not prescribe an English title for this observance;
+ this comparator's own [identity_diff] can only ever compare exact
+ strings, the same declared limit [M15]/[M18] already document for
+ temporal-origin candidates, now hit here for a different structural
+ reason -- a real candidate on both sides, just two different
+ vocabularies). Verdict colitur (the identity axis's own declared limit,
+ not an error): {!m5_commemoration_matches} pins WHICH candidate colitur
+ actually admits here, not merely that some [Comm_identity_mismatch]
+ diff exists, the same discipline [M19]'s own identity guard already
+ established. *)
let m5_dates = [ "2026-04-25" ]
+let m5_commemoration_matches (c : colitur_row) =
+ match c.c_commemorations with [ (slug, _, _, _) ] -> String.equal slug "major-litanies" | _ -> false
+
+(* M20 -- ef-major-litanies task, NEW. 25 April 2027: the Sunday-conflict
+ shape (RG 80's own condition -- 25 April is Easter Sunday or Monday --
+ does NOT fire this year, so the Litanies stay put on 25 April itself,
+ which this year happens to be an ordinary II-class Sunday, RG 91 entry
+ 15). St Mark (II class, RG 91 entry 16) also loses to the Sunday. Two
+ losing candidates, ONE slot (RG 111(b)): colitur admits the Litanies,
+ NOT Mark; missalemeum's raw fixture row shows the reverse (verified
+ directly, not inferred -- see [M5]'s own corrected note above for the
+ exact line).
+
+ ADJUDICATED: verdict colitur, RG 109(f) + RG 111(b) (docs/research/
+ rules-register.md §4 "Commemorations", both primary-source-verified
+ word for word, all three documents): RG 109(f), Caput XVI "De
+ Commemorationibus", places "de Litaniis maioribus, in Missa" in the
+ SAME closed list as (a)-(e), with equal grammatical standing -- no
+ textual qualifier narrows its privilege relative to theirs. RG 111(b),
+ same chapter: "in dominicis II classis, una tantum admittitur
+ commemoratio, scilicet de festo II classis, QUÆ TAMEN OMITTITUR SI
+ COMMEMORATIO PRIVILEGIATA FACIENDA SIT" -- the II-class-feast
+ commemoration is DROPPED if a privileged commemoration is due, full
+ stop; the clause names no table-order qualifier ("whichever ranks
+ higher"), only the categorical fact of a privileged commemoration being
+ due. This is the SAME mechanism {!Precedence_ef.admit}'s [Class2, true]
+ branch already implements and this project's OWN prior work already
+ primary-source-verified for this exact clause (precedence_ef.ml's own
+ "Fix, Task 16" comment) -- not new code, not a special case written for
+ the Litanies; St Mark simply meets the same fate any other ordinary
+ Class2 commemoration meets when a privileged one is also due that
+ Sunday (RG 16(a)'s Transfiguration/Sixtus shape is the nearest existing
+ witness, though there the privileged side wins the DAY, not merely the
+ commemoration slot).
+
+ HONESTLY FLAGGED, not overclaimed: this is the FIRST real, independent
+ (non-synthetic) data point this codebase has for "an ordinary Class2
+ feast candidate and a privileged non-feast commemoration candidate,
+ both losing to the identical Sunday" -- every other witness for
+ [admit]'s Class2-Sunday privilege-override branch in this suite's own
+ test_precedence_ef.ml is hand-built (real slugs/ranks, but a
+ constructed collision, not one the calendar itself produces). Read
+ plainly, RG 111(b)'s text supports colitur's outcome; missalemeum's own
+ divergence here is consistent with this project's ALREADY-DOCUMENTED
+ pattern of RG 108-111 gaps in that oracle (M1: RG 33's Sunday omission
+ not implemented; M8: RG 109(a)+RG 111(a) not implemented for an impeded
+ I-class Sunday; M10: RG 109(e) inconsistently applied) -- plausibly one
+ more instance of the same generator not modelling RG 109(f)'s privilege
+ for this one rare, single-date observance, not evidence the general
+ RG 111(b) mechanism itself is mis-read. Recorded as an adjudicated
+ verdict, not a certainty: if a future primary-source pass finds
+ textual grounds narrowing RG 109(f)'s privilege specifically (e.g. a
+ clause this task's own scan reading did not surface), this entry is
+ the one to revisit first. *)
+let m20_dates = [ "2027-04-25" ]
+
+let m20_commemoration_matches (c : colitur_row) =
+ match c.c_commemorations with [ (slug, _, _, _) ] -> String.equal slug "major-litanies" | _ -> false
+
(* M6 -- REMOVED, ef-rebootstrap (2026-08-12): see data/ef/expected-
divergences-missalemeum.sexp's own "FIVE MORE REMOVED" note. Eusebius
Confessor (14 Aug) is now present in data/ef/sanctoral.sexp
@@ -852,7 +935,8 @@ let layer_m_reason (c : colitur_row) (_o : oracle_row) diffs =
observes is temporal-origin, same root cause as M1/M2 above. *)
else if List.mem c.c_date m3_dates && subset diffs [ Colour_f; Observed_identity_unresolved ] then
Some "M3"
- else if List.mem c.c_date m5_dates && diffs = [ Comm_presence ] then Some "M5"
+ else if List.mem c.c_date m5_dates && diffs = [ Comm_identity_mismatch ] && m5_commemoration_matches c then
+ Some "M5"
else if List.mem c.c_date m8_dates && diffs = [ Comm_presence ] then Some "M8"
else if List.mem c.c_date m10_dates && diffs = [ Comm_presence ] then Some "M10"
else if List.mem c.c_date m11_dates && diffs = [ Comm_presence ] then Some "M11"
@@ -880,6 +964,11 @@ let layer_m_reason (c : colitur_row) (_o : oracle_row) diffs =
else if diffs = [ Observed_identity_unresolved ] then Some "M18"
else if List.mem c.c_date m19_dates && diffs = [ Comm_presence ] && m19_commemoration_matches c then
Some "M19"
+ else if
+ List.mem c.c_date m20_dates
+ && subset diffs [ Comm_identity_mismatch; Observed_identity_unresolved ]
+ && m20_commemoration_matches c
+ then Some "M20"
else None
(* ---------------------------------------------------------------------- *)