aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 08:21:39 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 08:21:39 +0200
commite5cafdd222a05032ae4f3c0ea07fe0eeda47c145 (patch)
treea576ca9bb8717ab848172334804b446d0097b9e4 /test
parentdaca7de424be106c1cc5f3aa01950eda3b767a0f (diff)
downloadcolitur-e5cafdd222a05032ae4f3c0ea07fe0eeda47c145.tar.gz
colitur-e5cafdd222a05032ae4f3c0ea07fe0eeda47c145.zip
test(oracle): green -- widen five entries, add M18 for observed identity
layer_m_reason's own five entries whose diff shape was checked by EXACT list equality (M1, M2, M3, M13, M16) lost their match once the observed-identity axis widened every row's diff set two commits ago. Each is widened the same way commemoration-identity was already widened for M13 once before: the axis now ALSO fires alongside their existing citation, same root cause, same id -- M1/M3 (temporal-origin observed day, no name), M2 (same, plus five Paschaltide dates that used to match cleanly and now surface for the first time), M13 (Joseph, sanctoral, now a genuine title MISMATCH, not merely unresolved), M16 (the temporal Passiontide feria observed there). M18 covers the remainder: 373 of 730 days whose observed celebration is temporal-origin and so carries no English name at all -- the overwhelming majority of the window, including Holy Family's own two dates in it (2026-01-11, 2027-01-10), counted here rather than shown as a false Matched. Gated on the diff SHAPE alone (this file's own convention for a population this size, the same reasoning M2's own title-substring predicate already uses instead of a date list), verdict unresolvable -- the same fourth verdict M15 already established for the identical limit on the commemoration axis. Building an English name onto the temporal cycle is Plan 4's own scope, register §6. Teeth, per the brief: temporarily corrupted hilary's own English name in data/ef/sanctoral.sexp (14 January 2026, an OBSERVED sanctoral day, rank and colour left untouched) and reran. Reddened immediately: 2026-01-14: observed-identity-mismatch differ -- colitur=(rank=3 colour=w ...) oracle=(rank=3 colours=[w] title="St. Hilary" ...) rank and colour agree on both sides -- exactly the shape the pre-strengthening comparator would have slept through completely. Reverted (git diff on the data file is empty) before this commit.
Diffstat (limited to 'test')
-rw-r--r--test/test_oracle.ml83
1 files changed, 72 insertions, 11 deletions
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index ae5c396..7068af9 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -726,25 +726,86 @@ let m16_dates = [ "2026-03-27" ]
entry needed at all -- removed, not re-adjudicated to a different
verdict, since there is no longer a divergence to name. *)
+(* M18 -- ef-rg112-rg110 task: the gap this file's own header now names under
+ "COMMEMORATION IDENTITY", restated for the OBSERVED axis. colitur's own
+ observed celebration carries an English name ({!Celebration.t}.names)
+ ONLY for a SANCTORAL-origin day (a saint's feast winning outright); a
+ TEMPORAL-origin one -- an ordinary Sunday, a feria, a movable named feast
+ including Holy Family itself -- never does ({!Rite_ef.Temporal_ef}'s own
+ [build] has no [en "..."] string anywhere in it, this file's own header
+ again). That is the OVERWHELMING majority of days in any calendar (saints'
+ feasts are common, but far from every day), so this is a single
+ STRUCTURAL predicate -- [Observed_identity_unresolved] alone, nothing
+ else disagreeing -- not a literal date list the way every other entry in
+ this file is: at 374 of the 730 days in this window, a list would be
+ exactly the "range/pattern that could silently widen" this file's own
+ header explicitly avoids elsewhere, for the OPPOSITE reason a range is
+ normally risky here -- the predicate itself (colitur's own name is
+ [None]) is the precise, falsifiable evidence, the same shape [M2]'s own
+ title-substring predicate already uses instead of a date list, just keyed
+ on presence-of-a-name rather than a title string. NOT a rubric dispute
+ and NOT a data gap either engine is wrong about -- a LIMIT of this
+ comparator itself, honestly counted rather than silently passed, per the
+ brief's own explicit instruction ("a day whose observed identity cannot
+ be resolved must be a counted, allow-listed outcome, never a silent
+ skip"), the SAME discipline [M15] already established for an unresolvable
+ COMMEMORATION, applied here for the first time to the OBSERVED day. Fixing
+ this at the root (giving every temporal-cycle candidate an English name)
+ is a data/lectionary-bootstrap task (Plan 4), not something this
+ comparator can do for itself -- register §6 tracks it, the same open item
+ [M15]'s own note already points to. *)
let layer_m_reason (c : colitur_row) (o : oracle_row) diffs =
if diffs = [] then None
- else if List.mem c.c_date m1_dates && subset diffs [ Rank; Colour_f; Comm_presence ] then Some "M1"
- else if contains_substring o.o_title ~needle:bvm_saturday_title && diffs = [ Colour_f ] then Some "M2"
- else if List.mem c.c_date m3_dates && diffs = [ Colour_f ] then Some "M3"
+ (* M1's own subset widened (this task): colitur's observed day on both
+ dates is TEMPORAL-origin (the Sunday itself, RG33's own point -- the
+ vigil should never have displaced it), so it now ALSO carries
+ [Observed_identity_unresolved] -- the same root cause the file's other
+ widened entries below share, restated for this one's own shape. *)
+ else if List.mem c.c_date m1_dates
+ && subset diffs [ Rank; Colour_f; Comm_presence; Observed_identity_unresolved ]
+ then Some "M1"
+ (* M2's own subset widened (this task): every BVM-Saturday date's observed
+ celebration is temporal-origin (the ordinary Saturday feria colitur
+ computes, not the distinct Office of the BVM missalemeum's title
+ names -- M2's own gap), so [Observed_identity_unresolved] now fires
+ alongside [Colour_f] where it used to fire alone, AND alone on its own
+ on every Paschaltide occurrence M2's own comment already says never
+ reached this predicate before (colour already agrees there; only the
+ new axis has anything left to say). *)
+ else if contains_substring o.o_title ~needle:bvm_saturday_title
+ && subset diffs [ Colour_f; Observed_identity_unresolved ]
+ then Some "M2"
+ (* M3's own subset widened (this task): the Rogation Monday feria colitur
+ 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 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"
else if List.mem c.c_date m12_dates && diffs = [ Comm_count ] then Some "M12"
- (* M13's own subset widened (Task B): the same underlying gap (the Seven
- Sorrows commemoration is never constructed at all) now ALSO surfaces
- as [Comm_identity_unresolved] on this date, since colitur's own
- admitted commemoration there is temporal-origin (no English name) --
- one root cause, one id, both axes it touches. *)
- else if List.mem c.c_date m13_dates && subset diffs [ Rank; Colour_f; Comm_identity_unresolved ] then
- Some "M13"
+ (* M13's own subset widened AGAIN (this task, following the SAME pattern
+ Task B's own widening comment below records): colitur's observed
+ celebration here is Joseph, SANCTORAL-origin, so its name IS
+ resolvable -- and disagrees with missalemeum's own title outright
+ ([Observed_identity_mismatch], not [_unresolved]), the SAME underlying
+ gap (the Seven Sorrows commemoration is never constructed, so colitur
+ has no candidate to observe OR commemorate in its place) now visible
+ on a THIRD axis. *)
+ else if List.mem c.c_date m13_dates
+ && subset diffs [ Rank; Colour_f; Comm_identity_unresolved; Observed_identity_mismatch ]
+ then Some "M13"
else if List.mem c.c_date m15_dates && diffs = [ Comm_identity_unresolved ] then Some "M15"
- else if List.mem c.c_date m16_dates && diffs = [ Comm_identity_mismatch ] then Some "M16"
+ (* M16's own subset widened (this task): colitur's observed celebration
+ here is the temporal Passiontide feria (John Damascene is only a
+ COMMEMORATION on this Feast-status-losing day -- band picks the
+ temporal candidate outright at Class3 rank, register's own account of
+ this date), so [Observed_identity_unresolved] now fires alongside the
+ pre-existing [Comm_identity_mismatch]. *)
+ else if List.mem c.c_date m16_dates
+ && subset diffs [ Comm_identity_mismatch; Observed_identity_unresolved ]
+ then Some "M16"
+ else if diffs = [ Observed_identity_unresolved ] then Some "M18"
else None
(* ---------------------------------------------------------------------- *)