diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-13 19:23:19 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-13 19:23:19 +0200 |
| commit | a3afb19dc6390c9e33ed5fa0ecbd6e5895e60e8d (patch) | |
| tree | 9e6108a58da67fcd94ce057a196f70c47ec49677 /test/test_differential.ml | |
| parent | 36eba4eff58162cbe4c7b4ff1b9d049432fc1acc (diff) | |
| parent | c63e37b8cbef1480b6f5677420425d22fe7061d9 (diff) | |
| download | colitur-a3afb19dc6390c9e33ed5fa0ecbd6e5895e60e8d.tar.gz colitur-a3afb19dc6390c9e33ed5fa0ecbd6e5895e60e8d.zip | |
Merge branch 'ef-bvm-saturday': the Office of Our Lady on Saturday
Builds RG 91 entry 27 under RG 78 -- 'In sabbatis, in quibus occurrit
Officium de feria IV classis, fit de sancta Maria in sabbato' -- a rank
test, not a season list. band had been assigning entry 27 312966 times
across the domain while the office was never constructed, so an
otherwise-unoccupied Saturday got a bare ferial slug and its season's
colour.
75863 days change, in two shapes: colour (green or violet to white) on
74642, and colour plus a dropped commemoration on 1221. The 312966
reconciles to the day across four buckets, 210808 of them impeded by a
sanctoral winner.
The first version introduced a live RG 112(d) violation on every
Saturday falling on 16 July: the Office of Our Lady observed,
commemorating Our Lady. Both photographic scans print a rubric at that
Mass for exactly this collision -- 'Missa dici potest aut de sancta
Maria in sabbato, aut propria' -- absent from the electronic
transcription, and cited nowhere. It was missed because the check was a
grep for subject = Bvm, and Mt Carmel is tagged Saint: the rubric's
criterion is whose intercession the oration implores, not colitur's own
tag.
The I-V Mass numbering is a propers rotation and stays unbuilt;
citations remain empty on all 3073916 days.
Recorded rather than glossed: the new rule has no comparison-layer
witness at all, and lectio's fixture prints a Mt Carmel commemoration on
8 in-window dates where colitur now prints none -- a real divergence
that falls through a gap in what the comparators examine. Time after
Epiphany's 5015 office days have zero oracle witnesses and rest on the
scan alone.
Diffstat (limited to 'test/test_differential.ml')
| -rw-r--r-- | test/test_differential.ml | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml index bea1bf4..5093484 100644 --- a/test/test_differential.ml +++ b/test/test_differential.ml @@ -138,6 +138,7 @@ module Slug = Colitur_kernel.Slug module Date = Colitur_kernel.Date module Cel = Colitur_kernel.Celebration module Colour = Colitur_kernel.Colour +module Subject = Colitur_kernel.Subject module V = Rite_ef.Vocab_ef (* Same relative paths test_rite_ef.ml/test_sanctoral_ef.ml use: dune test @@ -216,6 +217,14 @@ type row = { slug : string; rank : string; colour : string; + (* Fix round 1 (coordinator finding F3): ONLY ever populated for colitur's + own row (see [colitur_rows_2005_2050] below) -- lectio's own fixture + format has no subject column at all, so [row_of_line] (the lectio-side + parser) sets this to "-", a placeholder never read on that side. Every + Layer C predicate that reads [subject] must therefore read it off the + COLITUR row [c], never [l] -- the same asymmetry [row]'s other fields + do not have, called out here rather than left implicit. *) + subject : string; } let read_lines path = @@ -232,7 +241,7 @@ let read_lines path = let row_of_line line = match String.split_on_char ' ' line with | date :: weekday :: season :: week :: slug :: rank :: colour :: _others -> - { date; weekday; season; week; slug; rank; colour } + { date; weekday; season; week; slug; rank; colour; subject = "-" } | _ -> Alcotest.failf "malformed fixture line (fewer than 7 fields): %S" line let lectio_rows () = List.map row_of_line (read_lines fixture_path) @@ -271,7 +280,8 @@ let colitur_rows_2005_2050 () = week; slug = Slug.to_string cel.Cel.slug; rank = V.rank_to_string cel.Cel.rank; - colour = Colour.to_string cel.Cel.colour + colour = Colour.to_string cel.Cel.colour; + subject = Subject.to_string cel.Cel.subject } :: !rows | None -> Alcotest.failf "internal error: no resolved day for %s" (Date.to_iso8601 !d)); @@ -516,6 +526,44 @@ let holy_name_fallback_dates_2005_2050 = "2034-01-02"; "2035-01-02"; "2036-01-02"; "2040-01-02"; "2041-01-02"; "2045-01-02"; "2046-01-02"; "2047-01-02" ] +(* C17 -- ef-bvm-saturday task: RG 91 entry 27 ("Officium sanctae Mariae in + sabbato" -- see data/ef/expected-divergences.sexp's own C17 note for the + full RG 78/RG 120(b) citation). lectio builds no equivalent office at all + (checked directly against its own tridentine-calendar.ini/generator, the + same "genuine upstream gap, not a colitur bootstrap miss" shape C15/C16 + already document for their own gaps) -- it shows the ordinary season + colour on every otherwise-unoccupied Class4 Saturday where colitur's own + RG 78 fix now shows white. Season, slug and rank all still agree -- + temporal_ef.ml's own [bvm_saturday_names] citation ("Slug" paragraph) + deliberately REUSES the ordinary ferial slug rather than minting a new + one, precisely so this predicate's diff set stays [Colour_f] alone, never + [Slug_f] too. Gated on colitur's own [rank]/[weekday]/[colour] rather + than a date list, the same shape M2 (data/ef/expected-divergences- + missalemeum.sexp) already uses for the identical reason: this + population is large (a large fraction of all Saturdays domain-wide) and + entirely formulaic (RG 78's own condition, "otherwise unoccupied + IV-class Saturday", reduces exactly to this triple), not a short, + individually-interesting list of dates the way C14/C15/C16 above are. *) +let is_bvm_saturday_row (c : row) diffs = + (* Fix round 1 (coordinator finding F3): [c.subject] added -- the ONLY + field in this predicate that pins WHICH celebration is observed, not + merely its shape. Every other Layer C entry pins a colitur slug (C1's + own [jan_6_13_slug], C6's [nativity_octave_day_slugs], C8/C14/C15/C16's + own literal slug checks); this entry could not, because the office + deliberately REUSES the ordinary ferial slug (Rite_ef.Temporal_ef's own + [bvm_saturday_names] citation, "Slug" paragraph) -- there is no fixed + slug string to pin. [subject = "bvm"] is the field that DOES uniquely + identify the office (set nowhere else the differential's own + [colitur_rows_2005_2050] can produce a Saturday/Class4/white + combination for), closing the gap a shape-only predicate left open: + without this conjunct, a FUTURE bug that made some OTHER white, + Class4, Saturday candidate exist (Christmastide/Paschaltide, where + [season_colour] is already white, so a real bug there could slip + through unnoticed by colour alone) would be silently absorbed here + too. *) + diffs = [ Colour_f ] && String.equal c.weekday "saturday" && String.equal c.rank "class-4" + && String.equal c.colour "white" && String.equal c.subject "bvm" + (* [layer_c_reason l c diffs] returns the [data/ef/expected-divergences.sexp] [id] this row-pair's remaining (post Layer A/B) diff set belongs to, or [None] if nothing here explains it (a genuine, uncovered failure). *) @@ -571,6 +619,7 @@ let layer_c_reason (l : row) (c : row) diffs = && subset diffs [ Slug_f; Rank ] && String.equal c.slug "ef-holy-name" then Some "C16" + else if is_bvm_saturday_row c diffs then Some "C17" else None (* ---------------------------------------------------------------------- *) |
