diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-17 21:45:47 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-17 21:45:47 +0200 |
| commit | cffb879fa124c22acd400f59152a57d20cec036f (patch) | |
| tree | d44a6a1f80828b356ec122483f6fd71701b36e71 /test | |
| parent | 6e42b2f524b283f43e05a967295e244e4083725f (diff) | |
| download | colitur-cffb879fa124c22acd400f59152a57d20cec036f.tar.gz colitur-cffb879fa124c22acd400f59152a57d20cec036f.zip | |
feat(ef): the votive Mass of Our Lady on Saturday (RG 309(a))
RG 78's office has been built since ef-bvm-saturday: an otherwise
unoccupied IV-class Saturday is de sancta Maria in sabbato, white, IV
class. The Mass stayed the feria's, so the day observed Our Lady and then
read Colossians on the parable of the weeds. That is M26 shape 1.
RG 309(a) is the rule -- the Masses the Missal assigns "iuxta temporum
diversitatem" -- and it prints five, each under its own season heading.
All ten citations are transcribed from the scans with line numbers in the
source. Masses II-V were confirmed twice, against the scan and against a
live missalemeum capture of 2038 which names them and agrees on both
readings. Mass I rests on the scan alone: no oracle year to hand has an
Advent Saturday carrying this office. One witness where the others have
two, and the code says so rather than blurring it.
The mapping looked like the hard part and dissolved. The Missal's ranges
are cut by civil dates and movable feasts, not by this rite's seasons --
II ends mid-season at the Purification, III spans four seasons. But
measured against what a IV-class Saturday can actually be, it reduces to
a seasonal mapping plus one date test at 2/3 February, with no Easter
arithmetic at all: III's end to IV's start leaves the Triduum unassigned,
unreachable because Holy Saturday is I class; IV's end to V's start
leaves Pentecost week unassigned, also unreachable because that week's
Saturday is an Ember Saturday. Time after Pentecost then begins exactly
at Trinity, exactly where Mass V begins. Both gaps verified by sweep --
zero IV-class Saturdays in either across 2000-2059 -- not inferred.
The office is identified structurally, never off the slug, which it
deliberately shares with the ordinary feria: subject Bvm, IV class,
Saturday.
Blast radius: 87611 reading rows over the full domain, every one a
Saturday.
Allow-lists: M26 27 to 6, shape 1 gone, leaving only the Christ-the-King
residue argued in colitur's favour last commit. The 2038 suite's
BVM-SATURDAY-MASS class is removed rather than zeroed -- an id with no
rows must not be declared. M18 355 to 376. C17 widened 397 to 445,
taking its own Saturdays back from C1, C19 and C25, since one cause
should not be filed under two ids; C31 89 to 103; C25 closed at 0 rows,
its Holy-Name-week Saturdays now answered before step 3 is reached.
Three unit tests pinned the old behaviour and are corrected rather than
re-pinned: two asserted the day "keeps its ferial Mass", which was the
honest thing to assert while this was unimplemented. The third still
tests what it always did -- that step 4 refuses a temporal office -- and
only what answers instead has changed.
Register: section 6.13.
Diffstat (limited to 'test')
| -rw-r--r-- | test/test_differential.ml | 23 | ||||
| -rw-r--r-- | test/test_lectionary_ef.ml | 29 | ||||
| -rw-r--r-- | test/test_oracle.ml | 8 |
3 files changed, 50 insertions, 10 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml index eb83c0e..c9173d6 100644 --- a/test/test_differential.ml +++ b/test/test_differential.ml @@ -667,7 +667,22 @@ let is_bvm_saturday_row (c : row) diffs = [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" + (* WIDENED (2026-08-17): [First_f]/[Gospel_f] join [Colour_f], because the + CAUSE did not change, it grew. colitur builds RG 78's office (hence white + where lectio is green) and now also says RG 309(a)'s own Mass for it, + where lectio -- having no such office at all -- says the feria's. One + cause, one entry: splitting the colour from the citations would file two + ids against a single divergence. + + At least one difference is required, not merely a subset, so this can + never match a day that agrees entirely. The colour difference is ABSENT + in Christmastide and Paschaltide (RG 119 already made those seasons + white), which is why those rows carry citations alone -- the + [c.colour = "white"] guard still holds there, being colitur's own value + either way. *) + subset diffs [ Colour_f; First_f; Gospel_f ] + && (List.mem Colour_f diffs || List.mem First_f diffs || List.mem Gospel_f diffs) + && String.equal c.weekday "saturday" && String.equal c.rank "class-4" && String.equal c.colour "white" && String.equal c.subject "bvm" (* C19 (task 8, branch ef-lectionary): the Time-after-Epiphany WEEK-INDEX @@ -1252,7 +1267,11 @@ let layer_c_reason (l : row) (c : row) diffs = diffs = [ First_f; Gospel_f ] && String.equal l.first "-" && String.equal l.gospel "-" && List.mem c.slug lectio_no_reading_slugs then Some "C20" - else if List.mem c.slug rg69_one_hop_slugs && diffs = [ First_f; Gospel_f ] then Some "C25" + (* C25 -- CLOSED, BVM Saturday Mass (2026-08-17), predicate removed: 0 rows. + Its days are unoccupied IV-class Saturdays, so they carry RG 78's office + and now RG 309(a)'s Mass for it, which answers before step 3's walkback + is reached. They still differ from lectio, but for C17's cause, and are + filed there. See data/ef/expected-divergences.sexp's own closure note. *) else if List.mem c.slug holy_week_slugs && diffs = [ First_f; Gospel_f ] then Some "C23" else if String.equal c.slug passion_tuesday_slug && diffs = [ First_f; Gospel_f ] then Some "C26" else if String.equal c.slug advent_ember_sat_slug && diffs = [ First_f; Gospel_f ] then Some "C27" diff --git a/test/test_lectionary_ef.ml b/test/test_lectionary_ef.ml index 3ed6987..a5a0f6e 100644 --- a/test/test_lectionary_ef.ml +++ b/test/test_lectionary_ef.ml @@ -180,8 +180,14 @@ let test_step3_advent_feria_resumes_sunday () = only the Holy-Name-Sunday alias was wrong, not this citation itself). *) let test_step3_christmas_feria_resumes_sunday () = Alcotest.(check (list string)) - "Saturday of Holy Name week resumes the Nativity-Octave Sunday's Mass" - [ "Gal 4:1-7"; "Luke 2:33-40" ] + (* SUPERSEDED, not merely re-pinned (BVM Saturday Mass, 2026-08-17): this + Saturday is an unoccupied IV-class Saturday, so it carries RG 78's own + office -- and now RG 309(a)'s Mass for it, which answers before step 3's + walkback is ever reached. The Nativity-Octave Sunday's Mass is no longer + what this day says, and should not be: the day's office is Our Lady's. + Mass II, "A Nativitate Domini usque ad Purificationem". *) + "Saturday of Holy Name week says the BVM Saturday Mass, not the Sunday's" + [ "Titus 3:4-7"; "Luke 2:15-20" ] (refs (day 2026 1 3)) (* Fix round 1 (coordinator review, Important finding 1): the original test @@ -328,8 +334,13 @@ let test_step1_proper_francis_of_paola () = [sanctoral_office = true] and all 357 tests stayed green). *) let test_step4_leaves_a_temporal_office_alone_on_shipped_data () = Alcotest.(check (list string)) - "4 July 2026 (a BVM Saturday) keeps its ferial Mass" - [ "1 Pet 3:8-15."; "Matt 5:20-24." ] + (* CORRECTED (BVM Saturday Mass, 2026-08-17). This pinned the GAP -- the + office was Our Lady's while the Mass stayed the feria's -- which was the + honest thing to assert while RG 309(a) was unimplemented. It is + implemented now, so the day says Mass V, "A festo Ss. Trinitatis usque + ad sabbatum ante dominicam I Adventus". *) + "4 July 2026 (a BVM Saturday) says the BVM Saturday Mass" + [ "Ecclus 24:14-16"; "Luke 11:27-28" ] (refs (day 2026 7 4)) (* THE GUARD, pinned. The guard is a no-op on shipped data by design, so the @@ -368,8 +379,14 @@ let test_step4_guard_refuses_a_common_assigned_to_a_ferial_slug () = "the synthetic table really does resolve that ferial slug to a Common" true (Lectionary_ef.commons_for ~commons:hostile ferial_slug <> None); Alcotest.(check (list string)) - "4 July 2026 keeps its ferial Mass even so: step 4 refuses a temporal office" - [ "1 Pet 3:8-15."; "Matt 5:20-24." ] + (* The point of this test is UNCHANGED and still worth asserting: step 4 + (the Common route) must refuse a temporal-origin office, so a Commons + assignment cannot leak onto the BVM Saturday. What changed is only what + answers instead -- formerly the feria's Mass via step 2, now RG 309(a)'s + own via the BVM step. If step 4 ever did fire here it would produce a + Common's readings, which are neither of these. *) + "4 July 2026: step 4 still refuses a temporal office; the BVM Mass answers" + [ "Ecclus 24:14-16"; "Luke 11:27-28" ] (refs (day_with ~commons:hostile 2026 7 4)) (* THE DATA ASSERTION, and the one that cannot drift: after Task 6, every diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 0735cb6..e90a45a 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -1892,8 +1892,12 @@ let test_2038_class_counts () = class is adjudicated elsewhere and merely RE-CONFIRMED here, in a year entirely independent of the one those rulings were made in. *) let expected = - [ ("BVM-SATURDAY-MASS (M26 shape 1)", 13); - ("CHRIST-THE-KING-WEEK (M26 shape 2b)", 2); + (* BVM-SATURDAY-MASS (M26 shape 1) is GONE from this list, not zeroed: + colitur now says RG 309(a) own Mass on the BVM Saturday office, so + those 13 days no longer differ at all. An id with no rows must not be + declared -- the count assertion rejects an unused one, which is what + keeps this list honest. *) + [ ("CHRIST-THE-KING-WEEK (M26 shape 2b)", 2); ("CHRISTMAS-MULTI-MASS (M27)", 1); ("COLOUR (M21)", 7); ("JUDITH (M28, register 6.6)", 2); |
