summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-17 13:02:39 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-17 13:02:39 +0200
commit5d236c75c557a7e9ed4a8a852b8089aca48b594e (patch)
tree59686baed56d78eff5255e31e0f677ebe32d044d /test
parent8d1eb25a311e16ddb7bf89d2b21fb1ca0aa058a7 (diff)
downloadcolitur-5d236c75c557a7e9ed4a8a852b8089aca48b594e.tar.gz
colitur-5d236c75c557a7e9ed4a8a852b8089aca48b594e.zip
test(oracle): fix round 1 -- C30 disclosure, RG 17(a) misattribution, M26 shapes
Three Important findings from coordinator review of 8d1eb25, all fixed. 1. C30's own note claimed its 91-row population "is C25's OWN former population, before this task narrowed it" -- false. Independently re-derived against the real resolver (pre-fix vs post-fix binary) and the lectio fixture: only 44 of the 91 rows were ever in C25 (Wed 6/ Thu 19/Fri 19, matching C25's own fix-round-3 breakdown exactly); the other 47 (all of Monday/Tuesday, plus part of Wednesday/Friday) previously matched lectio outright -- both engines independently landing on the same wrong value -- and are newly allow-listed only because colitur is now right. Rewritten to the same "both engines silently agreed on the wrong answer" pattern C33/C34 already used. 2. "Diebus ferialibus" is not RG 17(a) -- RG 17(a) states only the day-identity privilege; the ferial-Mass rubrics are Mass-propers rubrics, a distinction the register's own §6.3 already drew before this task's first pass blurred it in code/allow-list comments. A further slip: C31/C32 called their own rubric "RG 17(a)'s own next/ third sentence" when it is a different rubric block ~230 lines away, in Holy Family's (not Holy Name's) own feast propers. Fixed the attribution chain throughout tools/bootstrap_lectionary.ml, data/ef/expected-divergences.sexp's C29-C34, and (gitignored, outside this commit) docs/research/rules-register.md -- closed the §6.3 park, added §6.5 recording all four citations with corrected attribution. Quotes and line numbers were already right; only the chain of custody to RG 17(a) was wrong. 3. M26's own 30 rows classify into two nameable shapes, not "three confirmed shapes" with an unexplained 23-row residue that was in fact empty: 21 rows are RG 78's own already-documented BVM votive-Mass gap; 9 rows are a second, distinct gap -- a week whose own Sunday was displaced by a movable named feast (Trinity->Corpus Christi, "Missa Dominicae I post Pentecosten"; Christ the King), where the Missal requires the displaced Sunday's own Mass to keep informing that week's ferias but step 3 walks back to the displacing feast's citation instead -- proven directly by colitur's own citation on the Christ- the-King rows being literally that feast's own Gospel. verdict open unchanged (not fixed here); the shape is now named instead of buried. Minors: section count corrected 1458->1456 (four places); "exactly one candidate, zero ambiguous" corrected to "correctness rests on ordering, not uniqueness" (2 of 1456 sections genuinely yield two candidates, Holy Saturday's own Lectio, both years); the stale "nothing in layers 3-5 compares citations" claim corrected (only layer 5 still doesn't); M18's note corrected (five new entries not six; ~18 of its remaining 352 rows only agree now because of this task's own fixes, not "already" before it); "five" corrected to "six" otherwise-unoccupied Saturdays in bootstrap_lectionary.ml; scan2 quotes softened where OCR-garbled. Also done outside the git-tracked files: the step-4 (Commons) coverage gap is now recorded in data/ef/expected-divergences-missalemeum.sexp's own header, not only the commit body and the (gitignored) report. dune test: 358 tests green. COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force: 359 tests green, 95.7s.
Diffstat (limited to 'test')
-rw-r--r--test/fixtures/missalemeum-ef-2026-2027.provenance23
-rw-r--r--test/test_golden.ml14
-rw-r--r--test/test_oracle.ml138
3 files changed, 112 insertions, 63 deletions
diff --git a/test/fixtures/missalemeum-ef-2026-2027.provenance b/test/fixtures/missalemeum-ef-2026-2027.provenance
index d760c9f..33b5566 100644
--- a/test/fixtures/missalemeum-ef-2026-2027.provenance
+++ b/test/fixtures/missalemeum-ef-2026-2027.provenance
@@ -49,11 +49,24 @@ things verified during extraction, not merely assumed: no field collides
with the "|"/";" delimiters, all 4 multi-Mass days (info is an array on
2026-11-02, 2026-12-25, 2027-11-02, 2027-12-25) carry an IDENTICAL info
block (rank/colors/tempora/commemorations/displaced) across every Mass of
-the day, so taking entry[0] throughout (this fixture's own convention)
-loses nothing the comparator or a human auditor needs, and the citation
-extraction itself (all 1 458 Lectio/Evangelium sections across the 728
-days that carry one) yields exactly one unambiguous citation-shaped
-candidate per section -- checked exhaustively, not sampled.
+the day, so taking entry[0] throughout for THOSE fields (this fixture's
+own convention) loses nothing the comparator or a human auditor needs
+there -- CORRECTED, fix round 1 (coordinator review): this is NOT true
+for the citation fields Task 9 added. Christmas (25 December) has three
+genuinely different Masses (Midnight/Dawn/Day) with three different
+Epistle+Gospel pairs; entry[0] is the Midnight Mass, colitur's own
+citation (bootstrapped from lectio) reflects the Day Mass -- a real,
+documented divergence (test_oracle.ml's own M27), not one this
+convention avoids. The citation extraction itself (all 1 456 Lectio/
+Evangelium sections, 728 days x 2) does NOT yield exactly one candidate
+per section either -- CORRECTED, fix round 1: 2 of the 1 456 (Holy
+Saturday's own "Lectio", both years) yield two verse-shaped spans,
+['Col 3:1-4', 'Ps 117, 1'] (the second is the Tractus verse following
+the real citation in the same paragraph). Both rows are still extracted
+correctly because [extract_citation] returns candidates[0] and the real
+citation happens to come first -- correctness rests on ORDERING, not
+uniqueness. See tools/extract_missalemeum_oracle.py's own header for
+the full account of both corrections.
Regenerate with the same commands if the missalemeum snapshot is refreshed
and the fixture needs updating; do not hand-edit this file or the fixture.
diff --git a/test/test_golden.ml b/test/test_golden.ml
index 2f8930f..8d33e29 100644
--- a/test/test_golden.ml
+++ b/test/test_golden.ml
@@ -94,11 +94,15 @@ let real_ef_lectionary =
(* The Commons (data/ef/commons.sexp) travel the same caller-supplied seam
as the lectionary above, and [~commons] is required rather than defaulted
- so that no caller can silently run with none -- nothing in layers 3-5
- compares reading citations, so a rite quietly missing its Commons would
- be invisible. Loaded here even where this file asserts nothing about
- readings, so that the rite under test is the same one bin/main.ml
- assembles. *)
+ so that no caller can silently run with none. CORRECTED, Task 9 fix
+ round 1 (coordinator review): this used to claim "nothing in layers 3-5
+ compares reading citations" -- stale since Task 8 (layer 3) and Task 9
+ (layer 4). THIS layer (5, golden pins) is the one that still does not:
+ this file's own [describe] carries no citation field at all, so a rite
+ quietly missing its Commons would still be invisible here specifically,
+ even though layers 3/4 would now catch it. Loaded here even where this
+ file asserts nothing about readings, so that the rite under test is the
+ same one bin/main.ml assembles. *)
let real_ef_commons =
match Rite_ef.Lectionary_ef.Commons.load commons_path with
| Error e -> failwith (Printf.sprintf "%s: failed to load: %s" commons_path e)
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index 41d8a2e..1ad4b1f 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -234,9 +234,13 @@ let real_lectionary () =
(* The Commons (data/ef/commons.sexp) travel the same caller-supplied seam
as the lectionary above, and [~commons] is required rather than defaulted
- so that no caller can silently run with none -- nothing in layers 3-5
- compares reading citations, so a rite quietly missing its Commons would
- be invisible. Loaded here even where this file asserts nothing about
+ so that no caller can silently run with none. CORRECTED, fix round 1
+ (coordinator review): this used to claim "nothing in layers 3-5 compares
+ reading citations" -- stale since Task 8 (layer 3) and this task itself
+ (layer 4, this file). Layer 5 (test_golden.ml's own [describe]) still
+ has no citation field at all, so it alone would still miss a rite
+ quietly missing its Commons; layers 3/4 compare citations directly and
+ would not. Loaded here even where this file asserts nothing about
readings, so that the rite under test is the same one bin/main.ml
assembles. *)
let real_commons () =
@@ -1161,57 +1165,85 @@ let m24_dates = [ "2026-04-01"; "2026-04-02"; "2027-03-24"; "2027-03-25" ]
predicate already applies to a citation-vocabulary gap. *)
let m25_dates = [ "2026-03-09"; "2026-03-24"; "2027-03-01"; "2027-03-16" ]
-(* M26 -- Task 9: the large remaining population, one single root cause.
- {!Rite_ef.Lectionary_ef.readings}'s own header comment already names
- this LIMIT, not a rubric dispute this task settled: step 3 ("a feria
- with no proper says the preceding SUNDAY's Mass") is colitur's only
- fallback mechanism, and its own WARRANT is "lectio's own observed
- behaviour... not a confirmed Missal citation" -- register's own
- standing note. missalemeum's own ferial-Mass selection is more
- granular than that single rule in (at least) three distinct ways this
- task's own investigation found and confirmed against the primary
- source, but did NOT build (a genuine, understood, ALREADY-DOCUMENTED
- architecture gap, the SAME shape data/ef/expected-divergences.sexp's
- own C6/C25 entries already carry for the sibling lectio differential,
- and Task 6's own residual concern 4/5, "the BVM Saturday Office still
- emits its feria's Mass... needs... a season-keyed selection among five
- formularies" -- RG 309(a), "iuxta temporum diversitatem"):
- (1) a rotating VOTIVE MASS OF THE BVM ("Missae de sanctae Mariae in
- sabbato" I-V and their Time-after-Pentecost siblings, missalemeum's own
- "II/III/V Mass of the B. V. M." titles) on an otherwise-unoccupied
- feria, not only a Saturday -- 2026-01-03/2026-01-10/2027-01-02/
- 2027-01-09 are RG 78's own BVM SATURDAY Office specifically (Task 6's
- own named open item; colitur's own step-3 fallback, not the votive
- Mass, is what these four rows actually show -- 2026-01-03/2027-01-09
- are `ef-christmas-1-saturday`, C25's own unchanged population in the
- sibling lectio differential; 2026-01-10/2027-01-02 are
- `ef-christmas-2-saturday`); the rest of this entry's own population
+(* M26 -- Task 9: the remaining population, one root cause,
+ TWO NAMEABLE SHAPES -- CORRECTED, fix round 1 (coordinator review,
+ Important 3): a prior version of this entry described three shapes,
+ the third an unexplained "23-row residue... not narrowed to a single
+ citable rule at all". That bucket was EMPTY -- every one of the 30
+ dates classifies cleanly into one of the two shapes below; the
+ "residue" framing buried a real, nameable defect instead of recording
+ it. {!Rite_ef.Lectionary_ef.readings}'s own header comment already
+ names the underlying LIMIT, not a rubric dispute this task settled:
+ step 3 ("a feria with no proper says the preceding SUNDAY's Mass") is
+ colitur's only fallback mechanism, and its own WARRANT is "lectio's
+ own observed behaviour... not a confirmed Missal citation" --
+ register's own standing note. missalemeum's own ferial-Mass selection
+ is more granular than that single rule in two distinct, CONFIRMED ways
+ (the same "needs a season-keyed selection mechanism, new behaviour not
+ new data" shape data/ef/expected-divergences.sexp's own C6/C25 entries
+ already carry for the sibling lectio differential, and Task 6's own
+ residual concern 4/5, "the BVM Saturday Office still emits its feria's
+ Mass... needs... a season-keyed selection among five formularies" --
+ RG 309(a), "iuxta temporum diversitatem"):
+
+ SHAPE 1 -- 21 rows: a rotating VOTIVE MASS OF THE BVM ("Missae de
+ sanctae Mariae in sabbato" I-V and their Time-after-Pentecost
+ siblings, missalemeum's own "II/III/V Mass of the B. V. M." titles) on
+ an otherwise-unoccupied feria, not only a Saturday -- 2026-01-03/
+ 2026-01-10/2027-01-02/2027-01-09 are RG 78's own BVM SATURDAY Office
+ specifically (Task 6's own named open item; colitur's own step-3
+ fallback, not the votive Mass, is what these four rows actually show
+ -- 2026-01-03/2027-01-09 are `ef-christmas-1-saturday`, C25's own
+ unchanged population in the sibling lectio differential; 2026-01-10/
+ 2027-01-02 are `ef-christmas-2-saturday`); the other 17 of these 21
are ordinary weekday ferias in Time after Pentecost showing the SAME
- votive-Mass title;
- (2) a NAMED weekly formula distinct from the plain Sunday-repeat rule
- for at least one week this task's own primary-source reading found by
- accident while fixing a DIFFERENT gap (Holy Family's own week,
- "Missa Dominicae Primae post Epiphaniam" -- built, tools/
- bootstrap_lectionary.ml's own [epiphanytide_opening_entries]) --
- 2026-06-02/03 and 2027-05-24 are the SAME shape for a different week
- (the ferias between Trinity Sunday and Corpus Christi, "Missa
- Dominicae I post Pentecosten", 1 John 4:8-21/Luke 6:36-42, visible in
- the raw scan while researching Corpus Christi's own Mass -- see
- docs/research/scan1.txt around line 21800 -- but NOT independently
- verified as a general "every week has its own named formula" rule the
- way the January window was, and NOT built here);
- (3) later Time-after-Pentecost weeks whose own votive/ferial answer
- this task's investigation did not narrow to a single citable rule at
- all (2026-10-26 through 2026-11-28, 2027-11-03 through 2027-11-27).
- ALL THREE are variations on the identical root limitation, not three
- separate bugs, and none is safe to fix piecemeal inside this task's own
- scope (extending layer 4 + triage) without the same real, dedicated,
- TDD/mutation-tested unit of work C6/C25 and Task 6's own open item
- already call for -- a season-keyed ferial/votive-Mass-selection
- mechanism, new behaviour, not new data. Verdict open, the SAME fourth
- verdict M15/M18 already establish for a genuine comparator/architecture
- LIMIT, honestly counted rather than silently absorbed or left failing
- without explanation. A literal date list, not a shape predicate (no
+ votive-Mass title (2026-02-14/06-20/06-27/07-04/07-11/08-01/10-31/
+ 11-07/11-28; 2027-07-17/07-24/09-04/09-11/10-30/11-06/11-13/11-27).
+
+ SHAPE 2 -- 9 rows, a SECOND, DIFFERENT and DISTINCT gap: ferias of a
+ week whose own Sunday was DISPLACED that year by a movable, named
+ temporal-cycle feast, where the Missal requires the DISPLACED
+ Sunday's own Mass to continue informing that week's ferias, but step 3
+ walks back to the DISPLACING feast's citation instead (the SAME
+ Sunday's own OFFICE is displaced; its own reading is not). Two
+ witnessed instances, not a residue: (a) 2026-06-02/03 and 2027-05-24,
+ the ferias between Trinity Sunday and Corpus Christi -- the Missal
+ prints a named formula for exactly this week, "Missa Dominicae I post
+ Pentecosten" (1 Ioann. 4,8-21 / Luc. 6,36-42, docs/research/
+ scan1.txt:21758-21830, found while researching Corpus Christi's own
+ Mass immediately following it) -- but colitur's step 3 walks back to
+ Trinity SUNDAY's own citation (Rom 11:33-36, the generic Time-after-
+ Pentecost fallback), not this named formula, since [ef-corpus-christi]
+ now correctly interrupts Trinity's own week at step 2 (this task's own
+ fix) and step 3's walkback from the Tuesday/Wednesday after it lands
+ one Sunday further back than the week actually calls for; (b)
+ 2026-10-26/27/29/30 and 2027-11-03/05, the ferias of the week Christ
+ the King (I class, movable, "Dominica ultima octobris") displaces --
+ colitur's own citation on all six is LITERALLY Christ the King's own
+ Gospel (John 18:33-37, "Art thou a king?"), confirming step 3 walked
+ back to the DISPLACING feast, not the displaced ordinary Sunday;
+ missalemeum shows a different citation each row (the displaced
+ Sunday's own, varying by year). No Missal-propers rubric for Christ
+ the King's own week ferias was found the way Holy Name/Holy Family's
+ own each carry one (checked: no rubric text precedes Christ the
+ King's own Mass heading, scan1.txt:39140-39163, unlike the two
+ feasts C30/C31/C32 above document) -- this half is named from the
+ OBSERVED citation evidence itself (colitur's own value IS the
+ displacing feast's, missalemeum's is not), not from a located
+ propers rubric; the general mechanism (a week's own ferias follow its
+ OWN Sunday's temporal identity even when that Sunday is impeded that
+ year) is the same shape RG 69 already establishes for the Nativity
+ Octave (C6's own citation) and RG 96's own general transfer framework
+ assumes throughout, but no citation SPECIFIC to Christ the King's own
+ week was found or is claimed here.
+
+ Neither shape is safe to fix inside this task's own scope (extending
+ layer 4 + triage) without the same real, dedicated, TDD/mutation-tested
+ unit of work C6/C25 and Task 6's own open item already call for.
+ Verdict open, the SAME fourth verdict M15/M18 already establish for a
+ genuine comparator/architecture LIMIT, honestly counted and NAMED
+ rather than silently absorbed, left failing, or buried in an
+ unexplained residue. A literal date list, not a shape predicate (no
single structural signal -- unlike C17's own [subject = bvm] -- exists
to distinguish this population from a genuinely new, unrelated
citation bug on some other Time-after-Pentecost feria): the SAME