aboutsummaryrefslogtreecommitdiff
path: root/test/test_golden.ml
Commit message (Collapse)AuthorAgeFilesLines
* precedence(ef): RG 110, the inseparable Peter/Paul commemorationLukasz Kasprzak2026-08-131-3/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | RG 110 (Caput XIV): "In Officio et Missa S. Petri semper fit commemoratio S. Pauli, et vicissim... pro unica habeantur" -- in the Office and Mass of either Peter or Paul, a commemoration of the other is always made, uncapped by RG 111's own admission count. Both photographic scans, full text including sub-clause (c) (a separate trigger this register previously had not transcribed: the same rule also fires when one Apostle's oration is admitted merely as an ordinary/privileged commemoration, not only when it is the day's own office). Three real pairs in the 1962 calendar, all confirmed on both scans: 25 January (conversion-of-st-paul + peter), 22 February (chair-of-st-peter + paul), 30 June (in-commemoratione-sancti-pauli-apostoli + a new commemoration-of-st-peter). The first two already existed as ordinary sanctoral candidates but were wired into RG 111's ordinary, capped admission contest instead of this rule's own uncapped one -- the defect this closes. 30 June had no companion at all: a genuine gap in lectio's own source data (confirmed directly against tridentine-calendar.ini) and in missalemeum's own oracle output for both fixture years, not only a colitur bootstrap miss, so colitur is now uniquely correct on this date among the three engines compared. Added via data/ef/adjustments.sexp's own Add directive, the architecture's existing extension point for exactly this shape of gap, since data/ef/sanctoral.sexp is generated and lectio must not be touched. Precedence_ef.admit gained rg110_additions/rg110_companion_slug, layered on after admit's own four ordinarily-capped branches decide their normal result: checks both the observed candidate and every already-admitted candidate against the three-pair lookup and prepends any companion found, uncapped and additional, never competing for RG 111's own slot. Measured full blast radius (1583-9999, pre-change binary from git archive at 59fbda8 vs the fixed binary, 3,074,246 days each side, 14,627 differing days, all four predicted shapes, zero unclassified): 3,619 Holy Name fallback days (previous commit), 3,533 days Paul was wrongly excluded from Chair of St Peter's own day by a competing privileged feria, 593 days Chair of St Peter itself was admitted only as an ordinary commemoration with Paul entirely absent, and 6,882 days the new 30 June companion is added. The 3,533+593 figure supersedes an earlier, narrower 852-day estimate that measured only the delta between two older code commits, not the rule's full scope. The lectio differential needed no change: it does not compare commemorations at all, and this fix never touches season, slug, rank, or colour. The missalemeum oracle allow-list needed three changes: M12 removed (22 February 2027 no longer diverges in commemoration count), M15's date list gained 2027-02-22 (now reaching identity comparison for the first time, where it lands on that entry's own pre-existing, unrelated limit -- one of the two commemorations is temporal-origin and unnamed), and a new M19 for the 30 June gap. Mutation-tested, both halves separately: disabling the admit-level addition reddens the two new unit tests, the oracle's own M12-shaped checks, and an existing golden pin (updated to expect the Paul companion); removing only the 30 June data entry reddens solely the oracle's new M19 count, confirming the code and data halves are independently load-bearing.
* temporal(ef): Holy Name of Jesus, RG 17(a) -- fallback + Lord subjectLukasz Kasprzak2026-08-131-0/+53
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | RG 17(a): "festum Ss.mi Nominis Iesu, celebrandum dominica quae occurrit a die 2 ad 5 ianuarii (secus die 2 ianuarii)" -- both photographic scans, confirmed on the calendarium's own January table and the Mass propers' own heading. Two defects closed together, since they interact through RG 91 entry 14/RG 16(a): 1. The Sunday shape (2-5 January) now tags subject = Lord, matching RG 91 entry 14 ("Festa Domini II classis") -- previously subject = Temporal, the same defect shape Holy Family had before it. 2. The fallback (RG 17(a)'s own "secus die 2 ianuarii", the calendarium's "vel, ea deficiente, die 2 ianuarii") is now built: 2 January carries the feast whenever no Sunday falls 2-5 January that year. Before this fix colitur emitted no Holy Name office at all in such a year -- a real II-class feast simply missing, on 3,619 of 8,417 years in the domain (43%; 20 of the 46 years 2005-2050, independently re-derived against `date -d`). Both shapes band identically at RG 91 entry 14's MOVABLE half (Precedence_ef.entry_14_movable_band) -- one feast, not two differently classified ones, per the Mass propers' own single heading covering both dates. No live collision exists in the current sanctoral data (nothing fixed-date falls 2-5 January besides a Commemoration_only entry on 5 Jan), so the RG 16(a)/RG 112(a) interaction is proved with synthetic precedence-level fixtures mirroring Holy Family's own precedent, not a live-data regression. One asymmetry the synthetic tests found and kept honest rather than forced: a losing Holy-Name-Sunday is privileged (RG 109(a), "of a Sunday") and survives RG 111(a)'s cap; a losing Holy-Name-fallback is not (2 January is not a Sunday, and no other RG 109(a)-(f) category applies to it), so it gets no commemoration at all if ever outranked -- both individually correct readings of RG 109/111's closed lists. Golden pins follow the brief's own vacuity warning: the Sunday shape already emitted the right slug/rank/colour before this fix (an ordinary Sunday and Holy Name coincide on those fields), so its pin asserts subject explicitly rather than pinning the whole line uncritically; the fallback pin (2029-01-02) is the one with teeth against the larger defect, reddening on slug/rank/subject together if reverted. Mutation-tested: each half of the fix reverted separately reddens exactly its own tests (Sunday subject: the dedicated unit test, the golden pin's subject field, one precedence end-to-end test; fallback: the fallback unit/anchor/golden tests, the new C16 differential count, and both shapes of the precedence end-to-end tests) and nothing else. Adds data/ef/expected-divergences.sexp's C16 (lectio has no fallback for this window at all) -- the lectio differential's own count, independently re-derived against `date -d` for the fixture's 2005-2050 span, not transcribed from the domain-wide figure. The missalemeum oracle window (2026-2027) exercises only the Sunday shape and needed no new entry: subject is not one of its compared fields, and both years' rows already corroborate the Sunday-shape ranking (missalemeum's own 2026-01-04 and 2027-01-03 rows: rank 2, white, title "Holy Name of Jesus").
* test(golden): fix round 1 (F4) -- describe pins subject, the field ↵Lukasz Kasprzak2026-08-131-46/+62
| | | | | | | | | | | | | | | | | | | | | | RG16(a)/RG112(a) key on Two of the three original Holy Family pins (2026-01-11, ordinary year; 2024-01-07, earliest possible date) were byte-identical before and after temporal_ef.ml's own fix. Reverting the feature failed only the 2030-01-13 collision pin -- describe omitted subject, the ONE field the change actually touches on an ordinary (non-collision) year, so those two pins asserted an ordinary Sunday's identity and called it Holy Family. Vacuity flavour #1 (an assertion already true before the code under test ran), not #8 (promoted from actual output) -- the other nine fields' values were independently sourced and remain so. subject added to describe's own formatted line. Every existing golden pin's expected string updated to match -- each value independently sourced (grep data/ef/sanctoral.sexp for the sanctoral-origin pins; Temporal for every ef-* temporal slug) before running the suite to verify, not copied from actual output and rationalised afterward. All matched on the first attempt.
* test(golden): pin Holy Family in three shapes (RG 17(b))Lukasz Kasprzak2026-08-131-0/+73
| | | | | | | | | | | | | | | | | An ordinary year (2026-01-11, no fixed-date competitor), the latest possible date and the one 13-January collision (2030-01-13, the fixed Baptism of the Lord excluded entirely by RG91 e14 + RG112(a)), and the earliest possible date (2024-01-07, Epiphany a Saturday) -- proving RG 17(b)'s own 7-13 January window at both ends, not only its middle. Every field independently traced against the primary text before typing it in, per this file's own header rule: season stays christmastide (RG 72-73, unaffected by which Sunday of it this is), week stays unset (Christmastide has no numbered weeks at all), slug is unchanged from the plain Sunday key this date always carried (temporal_ef.ml's own comment on why RG 17(b) needs no new lectionary key), rank II class, colour white. Each weekday independently cross-checked against "date -d <iso> +%A" (GNU coreutils).
* test(golden): fix round 1 (F1) -- correct why the other 8 reclassified slugs ↵Lukasz Kasprzak2026-08-121-7/+29
| | | | | | | | | | | | | | | | | | | | | | | are silent The comment on test_iii_class_feast_wins_class4_feria gave a single reason for why 8 of the 15 rank-corrected slugs produce zero diff rows anywhere in the domain: "always fall inside Lent/Passiontide proper, RG 91 entry 22, which already outranks entry 24". Wrong for 3 of the 8: gabriel-the- archangel (24 Mar), john-damascene (27 Mar) and john-of-capistrano (28 Mar) land in Paschaltide 226/846/1108 times domain-wide, always at class-1 (inside the Easter Octave, RG91 entry 2/10), never entry 22. The conclusion (zero diff rows) was and remains right; only the reason was wrong -- exactly the "correct code, wrong explanation" defect this project has repeatedly caught before. Corrected to the actual, checked shield: every context these 8 dates ever land in domain-wide is either class-1/2 (trivially outranking any class-3 candidate and excluding it from commemoration by RG111's own rank floors, regardless of status) or the season's own class-3 feria at entry 22 (which outranks entry 24 for observation but admits the losing saint's commemoration identically whether Commemoration_only or Feast, RG111(c)/(d) having no ferial-class gate on an ordinary sanctoral candidate).
* test(golden): pin the six days RG91 entry24>28 now resolves correctlyLukasz Kasprzak2026-08-121-11/+84
| | | | | | | | | | | | | | | | | | | | | | 2008-04-02/04/05 and 2038-03-06/08/09 are the six dates the re-bootstrap's own brief named as producing a wrong observed office under the old data (a III-class feast wrongly demoted to Commemoration_only, unable to win against an ordinary class-4 feria it should trivially outrank). Verified against the Missal before pinning, per this file's own rule: RG 91 entry 24 ("Festa III classis, in calendario Ecclesiae universae inscripta") outranks entry 28 ("feriae IV classis"), a plain, unqualified table reading, and the calendarium text for all six was already primary-verified in the register before this task ran -- only the data was wrong. Each pin proves the mechanism, not merely the answer: an omitted_has check (one per season family, Paschaltide and Septuagesima) confirms the displaced class-4 feria actually reached disposition and was actively excluded under RG26, not merely absent because nothing was ever offered. test_easter_extreme_2038_late_modern's own header previously recorded these three March dates as a DELIBERATE EXCLUSION because they were known wrong; corrected in place to point at the now-existing pin instead of continuing to justify an exclusion whose reason no longer holds.
* fix(rite-ef,kernel): follow the oracle on the Purification; admit reads the ↵Lukasz Kasprzak2026-08-121-31/+64
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | day's own Sunday-ness, not observed Fix round 1 review, two findings landed together because each golden pin's correctness depends on both. CRITICAL (item 1): reverts this branch's own first-pass retag of the Purification (2 February) from Lord back to Bvm -> Lord. The calendarium titles it 'B. Mariae Virg.', but missalemeum -- this project's designated EF oracle -- treats it as taking an occurring II-class Sunday's place outright, commemorations empty, exactly RG16(a)'s own festum Domini treatment (2020-02-02, 2014-02-02, independently fetched). Control, 2019-09-08 (the Nativity of the BVM, an ordinary Marian feast, on a Sunday): the Sunday observed, the feast merely commemorated -- the opposite pattern, proving the Purification's own oracle treatment is deliberate, not a gap. RG16(a) alone, on the untouched data, would have matched the oracle character for character; retagging Bvm is what moved colitur away from it on 1200 domain-wide days. The user has ruled: follow the oracle. Genuine primary-text counter-evidence (RG120(b), the colour rule grouping 2 February under 'B. Mariae Virg.', a category separate from 'Domini') is recorded in the register, not discarded -- a different project could reasonably rule the other way on the same evidence. most-holy-name-of-mary stays retagged Bvm; that one was never disputed. Removes the now-unneeded C12 lectio allow-list entry (data/ef/ expected-divergences.sexp, test_differential.ml): with the Purification Lord again, colitur matches lectio's own class = lord on every affected date, no divergence to allow-list. IMPORTANT (item 2): Precedence.rules.admit gains a ~temporal parameter -- a genuine kernel signature change, unlike RG16(a) itself. RG111(b)'s own Sunday rank floor ('one commemoration, namely of a II-class feast') used to be detected by reading observed's own slug for a Sunday marker, which silently assumed observed IS the day's temporal-cycle office. RG16(a) breaks that assumption on purpose: a Feast of the Lord standing in for an impeded Sunday 'cum omnibus iuribus et privilegiis' keeps the day a dominica II classis for RG111(b) too, even though the FEAST, not the Sunday, is observed. Before this fix an unrelated saint (Pope Sixtus II et al., 6 August, Class3) was wrongly admitted into the freed slot on every one of 1178 domain-wide days. Oracle-confirmed directly: 2023-08-06 (a Sunday) shows him displaced, commemorations empty; 2026-08-06 (an ordinary Thursday) shows him admitted -- being a Sunday is exactly what excludes him. admit now reads Sunday-ness off ~temporal (the day's own temporal-cycle candidate, passed through from Precedence.resolve unchanged) instead of observed. Validate's own admission fixed-point invariant updated to pass the same real temporal candidate through. Both golden pins in test_golden.ml were promoted from actual colitur day output without independently consulting the rubric or the oracle first -- a real defect the review caught. Re-derived from both before re-pinning: 2028-08-06 and 2025-02-02 now pin comms=[], no commemoration at all, matching missalemeum exactly in both cases.
* test(ef): golden pins for RG16(a), both directionsLukasz Kasprzak2026-08-121-1/+73
| | | | | | | | | | | | | | | | Two real dates, hand-verified against the rubric before pinning (test_golden.ml's own discipline): 2028-08-06, the Transfiguration suppressing an ordinary Sunday's commemoration entirely (with an unrelated III-class saint the same fixed date, Pope Sixtus II et al., still getting its own ordinary commemoration -- proof the rule targets the Sunday specifically, not every commemoration due that day); and 2025-02-02, the corrected Purification -- the Sunday observed, the Purification surviving as an ordinary commemoration, the exact opposite of what RG16(a) would have done to it before the data fix. Re-ran the exhaustive sweep (COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force): 1583-9999, 0 failures, including the resolution invariants that now see RG16(a)'s changed commemoration accounting.
* test: golden pins for the known-tricky yearsLukasz Kasprzak2026-08-121-0/+511
Validation layer 5: fourteen hand-verified pins in test/test_golden.ml, wired into the suite via test/test_colitur.ml. Each pinned day was computed and checked against its RG citation before being written down, never transcribed from `colitur day` output: - Easter extremes 1598 (earliest, 22 Mar), 1666 (latest, 25 Apr) and 2038 (late-modern instance of the same latest date) -- all three independently computed by hand via the Gauss/Meeus Gregorian Easter algorithm, not read off Computus.gregorian_easter. extreme_years in test_validate.ml already established 1598/1666 as the true 1583-2500 extremes (correcting a stale 1818/2038 comment); this file pins the resolved DAY there, not just the date. - Annunciation transfer, 25 March inside Holy Week (2016: 25 March is literally Good Friday) and the double transfer with St Joseph (2008: RG96's Attamen(a) claims Easter+8 for the Annunciation first, Joseph's own RG96 walk continues past it to the next day). - The RG96 Attamen(a) exception's own CONDITION pinned on both sides: 2057, 2007, 2012 (general walk suffices, lands before Easter, no exception) vs 2016/2024 (walk would cross Easter, Easter+8 fires). - 2011-07-04, the Precious Blood transfer (Sacred Heart outranks it outright on 1 July; the RG96 walk skips Visitation and a Sunday before landing on 4 July). - All Souls falling on a Sunday (2025, RG96 Attamen(b)) and Christmas falling on a Sunday (2022, RG91 entry 1 -- no contest, since 25 December is never an ordinary Sunday candidate in the EF temporal cycle). - Holy Thursday's white amid violet Passiontide (2026, RG128(b)/RG122) -- the case colitur and lectio previously agreed was violet, so the differential could never have caught it; only a golden pin or the missalemeum oracle can. - Advent/Lent Ember ferias commemorated when impeded (1900, 1902, RG24 + RG109(e)) contrasted with IV-class ferias never commemorated (2026, RG26) and RG111(b)'s Sunday rank floor (2009, 2026) -- all three assert the actual displaced/excluded candidate is present in `omitted`, not just that `commemorations` is empty, so a day with no losing candidate at all could not pass vacuously. 2038 is deliberately NOT pinned day-by-day: register item F4 confirms 2038-03-06/08/09 are wrong (a lectio bootstrap-generator defect, not fixable here). Only the Easter-week days, untouched by that bug, are pinned; the exclusion is stated in the test's own comment, not silent. Every weekday asserted was independently cross-checked against `date -d <iso> +%A` (glibc, wholly outside this codebase) before being written down. Precedence outcomes were traced against precedence_ef.ml's own band/ disposition/admit/transfer_target, not merely observed to look plausible; where the primary text alone doesn't fully settle an outcome (the 2008 Annunciation/Joseph tie-break, both landing at RG91 table entry 11), the test's own comment says so rather than overclaiming a citation. Perturbation-tested: temporarily broke Holy Thursday's white-colour special case in temporal_ef.ml, confirmed the golden test failed with a clear day-and-field diff, reverted.