aboutsummaryrefslogtreecommitdiff
path: root/test/test_oracle.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-22 20:55:18 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-22 20:55:18 +0200
commit9c96e0afc19925b651e0dfee3bc9182dee72acf0 (patch)
tree5f1fe05d495ddea61f585311f3dbca8bb1062cd8 /test/test_oracle.ml
parentcd3e03bf3e5b040786838fc3c5639d7c29e9b3b8 (diff)
downloadcolitur-9c96e0afc19925b651e0dfee3bc9182dee72acf0.tar.gz
colitur-9c96e0afc19925b651e0dfee3bc9182dee72acf0.zip
fix(ef): ferias after the Ascension repeat its own Mass, not a Sunday's
Ascension has no octave under the 1960 rubrics -- confirmed structurally: the Proprium de Tempore's own table of contents runs straight from "In Ascensione Domini" to "Dominica post Ascensionem" with no per-feria headings in between. Step 3 of the reading chain therefore fell through to Preceding_sunday on every unoccupied weekday in that stretch, walking each one back to the 5th or 6th Sunday after Easter's own citation. The Missal's own Proprium de Tempore carries an explicit marginal rubric immediately after the Ascension's Mass propers, before "Dominica post Ascensionem" begins: "Diebus a feria VI post Ascensionem usque ad feriam VI ante vigiliam Pentecostes inclusive, dicitur Missa de festo Ascensionis, cum Gloria et praefatione de Ascensione, sine Credo et Communicantes proprio" -- every feria without its own proper, from the Friday after the Ascension through the Friday before the Vigil of Pentecost, repeats the Ascension's own Mass. RG 490(b) corroborates independently: it assigns the Ascension preface "tamquam de Tempore" across that identical window, which only makes sense if the Mass actually repeated there is the Ascension's, not a numbered Sunday's (whose own Mass would carry no need for a preface override at all). Witnessed directly, not only inferred from the rubric: the LMS Ordo prints "Mass of the Ascension" literally on every affected day across all three of its fixture windows, in BOTH the tail of Ascension's own week and the following week -- ruling out the alternative reading (that the second week instead resumes "Dominica post Ascensionem"'s own Mass, which a first pass over the FIUV Ordo's own week-labelled titles could suggest at a glance; its own [praef] field for the same two dates independently reads "Ascensionis", resolving the apparent conflict). Implemented as data, not logic, matching this codebase's own established precedent for the identical RG 299 shape (the week after Trinity Sunday, data/ef/lectionary.sexp's [trinity_week_entries]): six new hand-authored entries, [ascension_week_entries] in tools/bootstrap_lectionary.ml, regenerated against a git-pinned copy of lectio's own source ini (SHA-256 verified unchanged) so the regeneration carries no unrelated drift. The window's two Saturdays are deliberately excluded -- RG 78's votive Office of Our Lady on Saturday always wins an otherwise-unoccupied Class4 Saturday first, before step 2 (this fix's own entry point) is ever reached, so an entry for either slug would be dead data. Blast radius measured in-process across the full 1583-9999 domain (throwaway probe, not committed): 16 350 days total across the six slugs, every one resolved via step 2 (Own_slug), zero anomalies, and the window's two Saturdays confirmed to contribute zero hits via this cause across the whole domain, corroborating the RG78-interception reasoning by direct sweep. Closed L2 in data/ef/expected-divergences-lms.sexp. New cited entries: C41 in data/ef/expected-divergences.sexp (95 of 16801 rows, 2005-2050 -- lectio has no equivalent rubric and still walks these ferias back); M31 in data/ef/expected-divergences-missalemeum.sexp (3 rows in the 2026-2027 window, plus the same shape independently reconfirmed in the 2035 and 2038 live-capture windows) -- missalemeum, Divinum Officium's lineage, still gives the same wrong answer colitur itself used to give, which is why these rows used to agree with M18's shape and now escape it (M18 373 -> 370, the same mechanism M23-M27 established when the citation axis was first built). Golden pin: 2031-05-23, the exact date the bug report was filed against. Mutation-tested: reverting data/ef/lectionary.sexp alone (a git-diff capture/restore, not a source-code revert, since the fix is data) reddens 19 tests across the differential, both oracle fixtures, all three LMS Ordo windows, the golden pin, the lectionary unit test and every Render golden template; restored and reconfirmed green (681 tests; 683 under COLITUR_EXHAUSTIVE_SWEEP=1, ~175s).
Diffstat (limited to 'test/test_oracle.ml')
-rw-r--r--test/test_oracle.ml47
1 files changed, 46 insertions, 1 deletions
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index f1d1a89..01938e1 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -1381,6 +1381,33 @@ let m26_dates =
citation fields are not, discovered by this task). *)
let m27_dates = [ "2026-12-25"; "2027-12-25" ]
+(* M31 (celebrant-rubrics-phase1, Bug 2, 2026-08-22) -- the six ferias
+ between the Ascension and the Friday before the Vigil of Pentecost that
+ repeat the Ascension's own Mass by an explicit marginal rubric in the
+ Proprium de Tempore (data/ef/lectionary.sexp's own [ascension_week_
+ entries], full citation there and in this file's sibling
+ data/ef/expected-divergences.sexp's own C41). Only three of the six
+ civil dates this window's own [c_date] range can reach are actually
+ unoccupied in 2026-2027: 2026-05-21, 2026-05-22 and 2027-05-14 (the
+ other three fall to a real sanctoral feast both engines already agree
+ on). missalemeum -- Divinum Officium's own lineage, the SAME lineage
+ lectio inherited this defect from before colitur's own bootstrap --
+ still walks these ferias back to the preceding Sunday's Mass, the
+ pre-fix answer colitur itself used to give; [Observed_identity_
+ unresolved] fires alongside because none of the three is a SANCTORAL-
+ origin day (the mapping this whole file's own header describes cannot
+ name a TEMPORAL office's title either way, unrelated to this cause). *)
+let m31_dates = [ "2026-05-21"; "2026-05-22"; "2027-05-14" ]
+
+(* The exact six slugs data/ef/lectionary.sexp's own [ascension_week_entries]
+ answers -- reused by [classify_2038]/[classify_2035] below, which key on
+ slug identity rather than a date list (those two live windows are not
+ scoped the way the 2026-2027 fixture is). *)
+let ascension_week_slugs =
+ [ "ef-easter-6-friday"; "ef-easter-7-monday"; "ef-easter-7-tuesday"; "ef-easter-7-wednesday";
+ "ef-easter-7-thursday"; "ef-easter-7-friday"
+ ]
+
(* The oracle's own row went unused when M2 -- its one reader, via
[o.o_title] -- was closed/removed (see the comment above [m1_dates]), and
was kept as a named, typed parameter rather than dropped from the
@@ -1512,6 +1539,8 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs =
[ Rank; Colour_f; Comm_presence; Comm_count; Observed_identity_mismatch;
Comm_identity_unresolved; First_mismatch; Gospel_mismatch ]
then Some "M30"
+ else if List.mem c.c_date m31_dates && subset diffs [ Observed_identity_unresolved; First_mismatch; Gospel_mismatch ]
+ then Some "M31"
else None
(* ---------------------------------------------------------------------- *)
@@ -1992,6 +2021,16 @@ let classify_2038 (c : colitur_row) (o : oracle_row) diffs =
List.mem c.c_date [ "2035-08-09"; "2035-08-14"; "2038-08-09"; "2038-08-14" ]
&& diffs = [ Colour_f ]
then Some "VIGIL-COLOUR-RG128 (M29, colitur; see C37)"
+ (* The Ascension-repeat rubric (celebrant-rubrics-phase1, Bug 2; see M31
+ in this file's own 2026-2027 [layer_m_reason] and C41 in
+ data/ef/expected-divergences.sexp for the full citation). 2038 carries
+ three unoccupied instances the 2026-2027 window did not (2038-06-07/
+ 08/09, all week-7 weekdays); 2035 carries one (2035-05-08). Gated on
+ colitur's own slug rather than on the date list this window's sibling
+ windows use, the same style [m21_2038_slugs] already establishes for
+ a live-window slug-keyed class. *)
+ else if List.mem c.c_observed_slug ascension_week_slugs && diffs = [ First_mismatch; Gospel_mismatch ] then
+ Some "ASCENSION-WEEK-REPEAT (M31, colitur; register, Bug 2)"
else None
(* COMMEMORATIONS join the live-window comparison (2026-08-18).
@@ -2129,7 +2168,13 @@ let test_2038_class_counts () =
("MISSAL-TWO-PART-CITATION (register 6.9)", 1);
("COMM-IDENTITY-UNRESOLVED (temporal-origin, no English name -- M15's limit)", 2);
("PERPETUA-COMMON (register 6.8)", 1);
- ("PETER-COMPANION-ABSENT-UPSTREAM (M19)", 1)
+ ("PETER-COMPANION-ABSENT-UPSTREAM (M19)", 1);
+ (* celebrant-rubrics-phase1, Bug 2: 2038-06-07/08/09 (the Monday,
+ Tuesday and Wednesday of the week after the Sunday after the
+ Ascension) are unoccupied that year, all three landing on the
+ Ascension-repeat rubric -- see M31 (2026-2027 window) and C41
+ (data/ef/expected-divergences.sexp) for the full citation. *)
+ ("ASCENSION-WEEK-REPEAT (M31, colitur; register, Bug 2)", 3)
]
|> List.sort compare
in