summaryrefslogtreecommitdiff
path: root/test/test_oracle.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 12:44:15 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 12:44:15 +0200
commitdc00d1f730b23fa99cd15ff142ecba515a9fe0b7 (patch)
treee40f7f003008b33104723a6d8856168bbdea7633 /test/test_oracle.ml
parent59fbda87d565ad9b98c2493e9703390cd988609d (diff)
parente45ec1ccce68d9edb9655004c21861d6bfb33a9d (diff)
downloadcolitur-dc00d1f730b23fa99cd15ff142ecba515a9fe0b7.tar.gz
colitur-dc00d1f730b23fa99cd15ff142ecba515a9fe0b7.zip
Merge branch 'ef-holyname-rg110': the Holy Name of Jesus, RG 110
Builds the Most Holy Name of Jesus with the fallback RG 17(a) and the calendarium both specify -- 'secus die 2 ianuarii', 'vel, ea deficiente, die 2 ianuarii' -- which was unimplemented, so in 3619 of the domain's 8417 years a II-class feast did not exist at all. Also retags it as a feast of the Lord per RG 91 entry 14. Builds RG 110's inseparable Peter/Paul commemoration ('in numero orationum computando, pro unica habeantur') across the three calendarium pairs, and adds the 30 June companion, which was missing from lectio's source and from missalemeum's output alike -- corroborated in both photographic scans plus RG 124(c), and added through adjustments.sexp so the bootstrap's provenance stands. 14627 days change, in four shapes, none unclassified. The register's earlier 852-day estimate for RG 110 reconciles exactly as the Lent Ember subset of one shape: 288 + 284 + 280. RG 110(c)'s ordering was implemented backwards at first and corrected: 'huic orationi additur altera' attaches the companion to the trigger's own oration, so it follows it, where (a) and (b) attach to the day's and so precede everything. The 'ante omnes alias commemorationes' half remains unimplemented and is unreachable by construction -- shape (c) needs the trigger to lose while still being admitted, which only a I-class day or a II-class Sunday allows, and both RG 111 caps are one. Records a fifth way the validation layers can be green while wrong: nothing anywhere compares commemoration order.
Diffstat (limited to 'test/test_oracle.ml')
-rw-r--r--test/test_oracle.ml105
1 files changed, 81 insertions, 24 deletions
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index 35d4501..58ceb26 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -599,23 +599,23 @@ let m10_dates = [ "2026-11-30"; "2027-11-30"; "2026-12-08"; "2027-12-08" ]
own full note and the task report. *)
let m11_dates = [ "2026-12-26"; "2026-12-28"; "2027-12-27"; "2027-12-28" ]
-(* M12 -- RG 110, primary text: "In Officio et Missa S. Petri semper fit
- commemoratio S. Pauli, et vicissim" -- in the Office and Mass of EITHER
- Peter or Paul, a commemoration of the OTHER is ALWAYS made (the
- "inseparable commemoration"), uncapped by RG 111's ordinary admission
- count ("in numero orationum computando, pro unica habeantur" -- counted
- as one for counting purposes, i.e. it rides alongside whatever RG 111
- already admits). Unimplemented in this codebase -- confirmed by the one
- row in this window where it is visible: 22 February 2027 (Chair of
- St Peter) shows only the privileged Lent feria commemorated in colitur,
- while missalemeum shows that AND "St. Paul". A genuine, primary-cited
- feature gap -- verdict missalemeum, register §6 open item. Real but
- NARROW: every other Peter/Paul office in this window (29 June, both
- years; 1 August M4-adjacent dates were checked and found clean) either
- had no room for the extra commemoration to become visible against this
- comparator's axes, or fell on a day this predicate does not otherwise
- touch -- see the task report for the specific check. *)
-let m12_dates = [ "2027-02-22" ]
+(* M12 -- CLOSED (ef-holyname-rg110 task): RG 110 is now built
+ (precedence_ef.ml's own [rg110_additions]/[rg110_companion_slug]), and
+ this window's one visible instance -- 22 February 2027 -- no longer
+ diverges from missalemeum on [Comm_count] at all: colitur now shows the
+ privileged Lent feria's own commemoration AND "St. Paul", same COUNT
+ (two) as missalemeum. Removed rather than kept as a dead 0-row citation,
+ the SAME shape M17's own removal already established (this file's own
+ header): the count pin now enforces that this exact divergence cannot
+ silently reappear. NOT closed with zero remaining difference, though --
+ see M15's own widened date list immediately below: once count agrees,
+ IDENTITY comparison is reached for the first time on this date, and
+ trips a SEPARATE, pre-existing, unrelated comparator limit (one of
+ colitur's two admitted commemorations, [ef-lent-2-monday], is
+ TEMPORAL-origin and carries no English name) -- a newly-exposed
+ instance of M15's own gap, not a new one, folded into M15's date list
+ rather than kept here under RG 110's own citation, which no longer
+ explains ANY part of this row's remaining diff. *)
(* M13 -- OPEN, NOT adjudicated (the brief's own explicit permission,
"say so as an open item rather than absorbing it"). 19 March 2027: St
@@ -647,13 +647,13 @@ let m13_dates = [ "2027-03-19" ]
either engine is wrong about: a genuine LIMIT of this comparator, honestly
counted rather than silently passed (the brief's own explicit
instruction: "a day whose commemoration cannot be matched must be
- visibly counted and reported, not quietly passed"). On each of these 19
+ visibly counted and reported, not quietly passed"). On 19 of these 20
rows, colitur's own admitted commemoration is TEMPORAL-origin (an
impeded Advent/Lent feria) -- Rite_ef.Temporal_ef's own [build]
(temporal_ef.ml) never sets a celebration's [names] field, so there is no
English string on colitur's side to compare against missalemeum's title
text at all (this file's own header, "THE MAPPING, AND EXACTLY WHAT IT
- CANNOT RESOLVE"). Every one of these 19 oracle titles reads as a plain
+ CANNOT RESOLVE"). Every one of those 19 oracle titles reads as a plain
prose description of the SAME temporal ferial slot colitur independently
computes for that date (e.g. 2 Dec 2026: oracle "Feria IV after I Sunday
of Advent" against colitur's own [ef-advent-1-wednesday]; 4 Dec 2027:
@@ -664,12 +664,25 @@ let m13_dates = [ "2027-03-19" ]
unresolved. Fixing this at the ROOT (giving every temporal-cycle
candidate an English name) is a data/lectionary-bootstrap task, not
something this comparator can do for itself -- register §6, "RG 113
- tie-break" section's own neighbour, records it as an open item. *)
+ tie-break" section's own neighbour, records it as an open item.
+
+ ADDED, ef-holyname-rg110 task: 2027-02-22 -- the closed M12's own date,
+ above. NOT the same shape as the other 19 (colitur admits TWO
+ commemorations there, not one -- [paul], sanctoral-origin and
+ resolvable, and [ef-lent-2-monday], temporal-origin and not): the
+ comparator's own [identity_diff] bails out to [Comm_identity_unresolved]
+ the moment ANY admitted commemoration is unresolvable, regardless of how
+ many others resolve cleanly (test_oracle.ml's own [identity_diff],
+ "[List.exists] ... name = None"), so this row reaches the identical
+ diagnosis for the identical structural reason, once RG 110 stopped
+ [Comm_count] from masking it. Genuinely newly-EXPOSED by this task's own
+ fix, not newly-CAUSED by it: the underlying gap (no English name for a
+ temporal-cycle candidate) is exactly M15's own pre-existing one. *)
let m15_dates =
[ "2026-02-24"; "2026-03-19"; "2026-03-25"; "2026-12-02"; "2026-12-03"; "2026-12-04";
- "2026-12-07"; "2026-12-11"; "2026-12-21"; "2027-02-24"; "2027-12-02"; "2027-12-03";
- "2027-12-04"; "2027-12-06"; "2027-12-07"; "2027-12-11"; "2027-12-13"; "2027-12-16";
- "2027-12-21" ]
+ "2026-12-07"; "2026-12-11"; "2026-12-21"; "2027-02-22"; "2027-02-24"; "2027-12-02";
+ "2027-12-03"; "2027-12-04"; "2027-12-06"; "2027-12-07"; "2027-12-11"; "2027-12-13";
+ "2027-12-16"; "2027-12-21" ]
(* M16 -- Task B: a genuine IDENTITY mismatch, both sides otherwise agreeing
on rank/colour/count/presence. 27 March 2026 (Friday of Passion Week):
@@ -766,6 +779,49 @@ let m16_dates = [ "2026-03-27" ]
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. *)
+(* M19 -- ef-holyname-rg110 task: RG 110's OTHER direction, 30 June (this
+ window's two instances -- both years -- of
+ [in-commemoratione-sancti-pauli-apostoli], data/ef/adjustments.sexp's
+ own `Add commemoration-of-st-peter` directive; see that file's own
+ citation for the full scan quote). Unlike 22 February above,
+ missalemeum's own row for both dates shows an EMPTY commemorations array
+ ("St. Peter" absent, and not even listed as "displaced" -- nothing
+ competes for the slot on either side, so there is no candidate for
+ missalemeum's own engine to have rejected, only one it never
+ constructed): missalemeum has the SAME gap this task's own scan found in
+ lectio's source data (`~/git/projects/lectio/internal/caldata/
+ tridentine-calendar.ini` has no 06-30 companion entry either) -- a
+ genuine feature gap, verdict colitur, the SAME shape as M1/M3/M8/M10
+ above (each already "missalemeum does not implement X"), not a
+ citation-count coincidence: RG 110's own text is unconditional ("in
+ Officio et Missa S. Petri semper fit commemoratio S. Pauli, ET
+ VICISSIM"), and the calendarium's own June table states the SAME
+ pattern already built for the other two pairs, word for word.
+
+ IDENTITY-GATED, fix round 1 (coordinator finding F2): the predicate
+ below now also requires [c.c_commemorations] to be EXACTLY the single
+ entry [commemoration-of-st-peter] -- not merely that some [Comm_presence]
+ diff exists on these two dates. Proved necessary, not decorative: the
+ reviewer added a SECOND, fabricated `Add` directive on 30 June (a
+ `bogus-fabricated-companion` slug) to a scratch copy of
+ data/ef/adjustments.sexp and found the whole suite stayed green with the
+ pre-fix, presence-only predicate -- the exact C6/C14 failure mode (a
+ Layer-C-style predicate that pins a date and a diff SHAPE but not WHICH
+ candidate). This matters more here than for any other entry in this
+ file: `commemoration-of-st-peter` is corroborated by NEITHER oracle (it
+ rests on a scan reading alone, data/ef/adjustments.sexp's own citation),
+ so this allow-list predicate is the only place in the whole suite that
+ could assert what colitur actually emits here -- and, pre-fix, asserted
+ nothing about it. Mirrors C16's own identity guard
+ (`String.equal c.slug "ef-holy-name"`, test_differential.ml) at the
+ analogous decision point in this file. *)
+let m19_dates = [ "2026-06-30"; "2027-06-30" ]
+
+let m19_commemoration_matches (c : colitur_row) =
+ match c.c_commemorations with
+ | [ (slug, _, _, _) ] -> String.equal slug "commemoration-of-st-peter"
+ | _ -> false
+
let layer_m_reason (c : colitur_row) (o : oracle_row) diffs =
if diffs = [] then None
(* M1's own subset widened (this task): colitur's observed day on both
@@ -795,7 +851,6 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs =
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 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
@@ -818,6 +873,8 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs =
&& subset diffs [ Comm_identity_mismatch; Observed_identity_unresolved ]
then Some "M16"
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 None
(* ---------------------------------------------------------------------- *)