From 8baabbd7e0b070197657d4d358ce5684dcda6255 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 13 Aug 2026 08:22:55 +0200 Subject: test(golden): pin Holy Family in three shapes (RG 17(b)) 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 +%A" (GNU coreutils). --- test/test_golden.ml | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) (limited to 'test/test_golden.ml') diff --git a/test/test_golden.ml b/test/test_golden.ml index 5292427..259b81a 100644 --- a/test/test_golden.ml +++ b/test/test_golden.ml @@ -552,6 +552,72 @@ let test_rg16a_lord_feast_no_sunday_commemoration_2028 () = colour=white comms=[] in=- out=[]" (describe d) +(* Holy Family (RG 17(b), scan-verified, docs/research/rules-register.md + §4/§6.0): "festum S. Familiae Iesu, Mariae, Ioseph, celebrandum dominica + prima post Epiphaniam" -- first Sunday after Epiphany, II class, EVERY + year, taking the Sunday's own place "cum omnibus iuribus et privilegiis" + (RG 17(b)'s own closing clause, the same formula RG 16(a) uses above). + Three shapes, each independently verified against the primary text + BEFORE being typed in here, per this file's own header rule: + + 1. AN ORDINARY YEAR (2026, 11 January): no fixed-date competitor in the + 7-13 January window besides St Hyginus (11 Jan, Class3, + Commemoration_only per data/ef/sanctoral.sexp) -- excluded from the + day's single Sunday slot outright by RG 111(b)'s own rank floor ("de + festo II classis"), the SAME mechanism test_precedence_ef.ml's own + "II-class Sunday admits only a de-festo-II-classis commemoration" pin + already proves for a different date -- so comms=[] is not itself new + ground, only Holy Family's own slug/rank/colour/season are. + `date -d 2026-01-11 +%A` = Sunday, independently confirmed. + 2. THE 13-JANUARY COLLISION (2030, the latest possible date -- Epiphany + itself a Sunday, 6 January): the fixed Commemoration of the Baptism + of the Lord (13 Jan, Class2, subject Lord, data/ef/sanctoral.sexp) + would otherwise contest the day directly, not merely lose a + commemoration slot -- RG 91 entry 14's own "primum mobilia, deinde + fixa" (precedence_ef.ml's own [entry_14_movable_band]) is what keeps + Holy Family observed, and RG 112(a) -- directly confirmed by the Holy + Family Mass propers' own more specific 13-January rubric, both + photographic scans, word for word: "Si festum S. Familiae occurrerit + die 13 ianuarii, Missa dicitur de festo S. Familiae, sine + commemoratione Baptismatis D.N.I.C., et sine commemoratione + dominicae" -- is what keeps comms=[] rather than admitting the + Baptism as an ordinary Class2 commemoration. `date -d 2030-01-13 + +%A` = Sunday, independently confirmed; 2030 is one of the seven + years in the 2005-2050 window this collision occurs (register §6.0's + own list, test_differential.ml's own C15). + 3. THE EARLIEST POSSIBLE DATE (2024, 7 January -- Epiphany a Saturday): + the OTHER end of RG 17(b)'s own 7-13 January range, proving the + window's own boundary, not only its middle and its latest instance. + No fixed-date competitor exists this early in the window either. + `date -d 2024-01-07 +%A` = Sunday, independently confirmed. + + All three: season=christmastide (RG 72-73's own 1-13 January boundary, + unaffected by Holy Family), week=- (Christmastide carries no numbered + weeks at all, [T.week_origin]'s own [None] case -- unaffected by which + Sunday of it this is), slug=ef-time-after-epiphany-sunday-1 (unchanged + from the plain Sunday key this date always carried -- temporal_ef.ml's + own comment on why RG 17(b) does not need a new lectionary key), rank + =class-2, colour=white. *) +let test_holy_family_ordinary_year_2026 () = + check ~msg:"2026-01-11: Holy Family, ordinary year -- Hyginus (Class3, Commemoration_only) has no \ + standing for the day's II-class-only Sunday slot" + 2026 1 11 + "2026-01-11 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ + colour=white comms=[] in=- out=[]" + +let test_holy_family_excludes_baptism_2030 () = + check ~msg:"2030-01-13: Holy Family on the latest possible date -- RG91 e14 \"primum mobilia\" keeps it \ + observed over the fixed Baptism, RG112(a) excludes the Baptism entirely, not merely demotes it" + 2030 1 13 + "2030-01-13 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ + colour=white comms=[] in=- out=[]" + +let test_holy_family_earliest_possible_date_2024 () = + check ~msg:"2024-01-07: Holy Family on the earliest possible date (Epiphany a Saturday)" + 2024 1 7 + "2024-01-07 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ + colour=white comms=[] in=- out=[]" + (* 2025-02-02, the other real instance of the SAME pattern -- not a contrasting second direction, per this task's fix round 1 (CRITICAL finding, item 1, reverted; see register §6.0 for the full account). @@ -704,6 +770,13 @@ let suite = Alcotest.test_case "RG16(a), the Purification (oracle-ruled): observed outright, the Sunday not commemorated (2025-02-02)" `Quick test_purification_on_a_sunday_2025; + Alcotest.test_case "Holy Family (RG17(b)), ordinary year (2026-01-11)" `Quick + test_holy_family_ordinary_year_2026; + Alcotest.test_case + "Holy Family excludes the Baptism entirely on the latest possible date (RG91 e14 + RG112(a), 2030-01-13)" + `Quick test_holy_family_excludes_baptism_2030; + Alcotest.test_case "Holy Family, earliest possible date (2024-01-07)" `Quick + test_holy_family_earliest_possible_date_2024; Alcotest.test_case "ef-rebootstrap: RG91 entry24 (III-class feast) outranks entry28 (class-4 feria) -- the six dates \ deferred since 2038's own Easter-extreme pin (2008-04-02/04/05, 2038-03-06/08/09)" -- cgit v1.3 From b9b26ef4badc2ef4dfff2e57decf7f9c57066888 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 13 Aug 2026 09:19:51 +0200 Subject: test(golden): fix round 1 (F4) -- describe pins subject, the field 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/test_golden.ml | 108 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 46 deletions(-) (limited to 'test/test_golden.ml') diff --git a/test/test_golden.ml b/test/test_golden.ml index 259b81a..1724375 100644 --- a/test/test_golden.ml +++ b/test/test_golden.ml @@ -93,9 +93,19 @@ let fetch y m d = Cal.day Rite_ef.context real_ef_layer (mk y m d) let slug_s (c : V.rank Cel.t) = Slug.to_string c.Cel.slug let rank_s (c : V.rank Cel.t) = V.rank_to_string c.Cel.rank let colour_s (c : V.rank Cel.t) = Colour.to_string c.Cel.colour +let subject_s (c : V.rank Cel.t) = Colitur_kernel.Subject.to_string c.Cel.subject let privilege_s = function Prec.Privileged -> "privileged" | Prec.Ordinary -> "ordinary" -(* The five fields {!Colitur_kernel.Liturgical_day.t} promises are never +(* fix round 1 (coordinator finding 4): [subject] added. Two of the three + original Holy Family pins (2026-01-11, 2024-01-07) were byte-identical + before and after temporal_ef.ml's own fix -- reverting the feature failed + only the 2030-01-13 collision pin, because [describe] omitted the ONE + field the change touches on an ordinary (non-collision) year. 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; only this tenth was missing. + + The five fields {!Colitur_kernel.Liturgical_day.t} promises are never silently lost, folded into one comparable line -- see the file header for why one string, not five checks. *) let describe (day : (V.season, V.rank) LD.t) = @@ -110,11 +120,12 @@ let describe (day : (V.season, V.rank) LD.t) = List.map (fun (c, d) -> Printf.sprintf "%s->%s" (slug_s c) (Date.to_iso8601 d)) day.LD.transferred_out |> List.sort compare |> String.concat "," in - Printf.sprintf "%s %s season=%s week=%s slug=%s rank=%s colour=%s comms=[%s] in=%s out=[%s]" + Printf.sprintf "%s %s season=%s week=%s slug=%s rank=%s colour=%s subject=%s comms=[%s] in=%s out=[%s]" (Date.to_iso8601 day.LD.date) (Date.weekday_to_string t.Temporal.weekday) (V.season_to_string t.Temporal.season) - week (slug_s day.LD.observed) (rank_s day.LD.observed) (colour_s day.LD.observed) comms tin tout + week (slug_s day.LD.observed) (rank_s day.LD.observed) (colour_s day.LD.observed) + (subject_s day.LD.observed) comms tin tout let check ~msg y m d expected = Alcotest.(check string) msg expected (describe (fetch y m d)) @@ -139,11 +150,11 @@ let omitted_has (day : (V.season, V.rank) LD.t) slug = place, not merely that 22 March is white. *) let test_easter_extreme_1598 () = check ~msg:"1598-03-21 Holy Saturday: still Passiontide, violet (RG 128)" 1598 3 21 - "1598-03-21 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet \ + "1598-03-21 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]"; check ~msg:"1598-03-22 earliest possible Easter (Gauss-verified): Paschaltide begins, white, class-1" 1598 3 22 - "1598-03-22 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white comms=[] in=- \ + "1598-03-22 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white subject=temporal comms=[] in=- \ out=[]" (* 1666: latest Gregorian Easter possible, 25 April -- hand-verified via @@ -151,11 +162,11 @@ let test_easter_extreme_1598 () = 25 April). Same citations as 1598 above. *) let test_easter_extreme_1666 () = check ~msg:"1666-04-24 Holy Saturday: still Passiontide, violet (RG 128)" 1666 4 24 - "1666-04-24 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet \ + "1666-04-24 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]"; check ~msg:"1666-04-25 latest possible Easter (Gauss-verified): Paschaltide begins, white, class-1" 1666 4 25 - "1666-04-25 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white comms=[] in=- \ + "1666-04-25 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white subject=temporal comms=[] in=- \ out=[]" (* 2038: the brief's "late modern case" -- Easter also 25 April (Gauss- @@ -180,10 +191,10 @@ let test_easter_extreme_1666 () = though nothing forces that any more). *) let test_easter_extreme_2038_late_modern () = check ~msg:"2038-04-24 Holy Saturday: still Passiontide, violet (RG 128)" 2038 4 24 - "2038-04-24 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet \ + "2038-04-24 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]"; check ~msg:"2038-04-25 late-modern instance of the latest possible Easter (Gauss-verified)" 2038 4 25 - "2038-04-25 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white comms=[] in=- \ + "2038-04-25 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white subject=temporal comms=[] in=- \ out=[]" (* ------------------------------------------------------------------ *) @@ -204,7 +215,7 @@ let test_annunciation_transfer_inside_holy_week_2016 () = actually reaches a live case" for exactly this reason. *) check ~msg:"2016-03-25 Good Friday: Triduum outranks the Annunciation (RG91 entry 2 > 11), no commemoration" 2016 3 25 - "2016-03-25 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet \ + "2016-03-25 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[annunciation-of-the-blessed-virgin-mary->2016-04-04]"; (* The general RG 96 walk from 26 March would still be inside the Triduum, the Easter octave (all I class, entry 2/10) -- carrying the feast PAST @@ -212,7 +223,7 @@ let test_annunciation_transfer_inside_holy_week_2016 () = after Low Sunday = Easter + 8 = 27 Mar + 8 = 4 April. *) check ~msg:"2016-04-04 Easter+8 (Monday after Low Sunday): RG96 Attamen(a) sedes propria fires" 2016 4 4 "2016-04-04 monday season=paschaltide week=2 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]" + colour=white subject=saint comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]" (* ------------------------------------------------------------------ *) (* 2008: the double transfer (register §4, "cases worth adding"). Easter = @@ -227,7 +238,7 @@ let test_annunciation_joseph_double_transfer_2008 () = I-class feria, band 7, above 11) -- impeded, Transfer-disposed. *) check ~msg:"2008-03-19 Wednesday of Holy Week outranks Joseph (RG91 entry 7 > 11), no commemoration" 2008 3 19 - "2008-03-19 wednesday season=passiontide week=2 slug=ef-passiontide-2-wednesday rank=class-1 colour=violet \ + "2008-03-19 wednesday season=passiontide week=2 slug=ef-passiontide-2-wednesday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[joseph-spouse-of-the-bl-virgin-mary->2008-04-01]"; (* Both Joseph and the Annunciation are band 11 (register: neither is Immaculate Conception/Assumption, band 4; both are ordinary universal @@ -255,7 +266,7 @@ let test_annunciation_joseph_double_transfer_2008 () = check ~msg:"2008-03-31 Easter+8: Annunciation's named sedes propria (RG96 Attamen a) claims the day first" 2008 3 31 "2008-03-31 monday season=paschaltide week=2 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]"; + colour=white subject=saint comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]"; (* Joseph's own general RG96 walk, finding 31 March already claimed (occupant reports Class1 there, still blocking per [is_blocking]), continues one more day to 1 April -- RG 97-98's "in order": the second @@ -264,7 +275,7 @@ let test_annunciation_joseph_double_transfer_2008 () = check ~msg:"2008-04-01: Joseph's RG96 walk continues past the now-claimed 31 March (RG97-98 'in order')" 2008 4 1 "2008-04-01 tuesday season=paschaltide week=2 slug=joseph-spouse-of-the-bl-virgin-mary rank=class-1 \ - colour=white comms=[] in=joseph-spouse-of-the-bl-virgin-mary out=[]" + colour=white subject=saint comms=[] in=joseph-spouse-of-the-bl-virgin-mary out=[]" (* ------------------------------------------------------------------ *) (* RG 96 Attamen (a) is CONDITIONAL ("quando est transferendum post @@ -288,15 +299,15 @@ let test_annunciation_exception_not_triggered_general_walk_suffices () = check ~msg:"2057-03-26: general RG96 walk suffices (target before Easter, 22 Apr) -- no Attamen(a) exception" 2057 3 26 "2057-03-26 monday season=lent week=3 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[ef-lent-3-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]"; + colour=white subject=saint comms=[ef-lent-3-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]"; check ~msg:"2007-03-26: general RG96 walk suffices (target before Easter, 8 Apr) -- no Attamen(a) exception" 2007 3 26 "2007-03-26 monday season=passiontide week=1 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[ef-passiontide-1-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]"; + colour=white subject=saint comms=[ef-passiontide-1-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]"; check ~msg:"2012-03-26: general RG96 walk suffices (target before Easter, 8 Apr) -- no Attamen(a) exception" 2012 3 26 "2012-03-26 monday season=passiontide week=1 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[ef-passiontide-1-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]" + colour=white subject=saint comms=[ef-passiontide-1-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]" (* After Easter: 2016 (already pinned above, Easter+8 = 4 April) and 2024 (Easter 31 March, Easter+8 = 8 April). In both, the general walk would @@ -312,7 +323,7 @@ let test_annunciation_exception_triggered_when_walk_would_cross_easter () = (RG26)" 2024 4 8 "2024-04-08 monday season=paschaltide week=2 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]" + colour=white subject=saint comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]" (* 2016's own pin (test_annunciation_transfer_inside_holy_week_2016) is the other half of this pair -- not repeated here to avoid asserting the same date twice. *) @@ -330,19 +341,19 @@ let test_annunciation_exception_triggered_when_walk_would_cross_easter () = let test_precious_blood_transfer_2011 () = check ~msg:"2011-07-01: Sacred Heart (RG91 entry 3) outranks the fixed Precious Blood (entry 11) outright" 2011 7 1 - "2011-07-01 friday season=time-after-pentecost week=2 slug=ef-sacred-heart rank=class-1 colour=white \ + "2011-07-01 friday season=time-after-pentecost week=2 slug=ef-sacred-heart rank=class-1 colour=white subject=temporal \ comms=[] in=- out=[precious-blood-of-our-lord-jesus-christ->2011-07-04]"; check ~msg:"2011-07-02: the RG96 walk's first blocked day (Visitation, II class) -- Precious Blood not here" 2011 7 2 "2011-07-02 saturday season=time-after-pentecost week=2 slug=visitation-of-the-blessed-virgin-mary \ - rank=class-2 colour=white comms=[processus-and-martinian:ordinary] in=- out=[]"; + rank=class-2 colour=white subject=saint comms=[processus-and-martinian:ordinary] in=- out=[]"; check ~msg:"2011-07-03: the RG96 walk's second blocked day (an ordinary Sunday, II class) -- still not here" 2011 7 3 "2011-07-03 sunday season=time-after-pentecost week=3 slug=ef-time-after-pentecost-sunday-3 rank=class-2 \ - colour=green comms=[] in=- out=[]"; + colour=green subject=temporal comms=[] in=- out=[]"; check ~msg:"2011-07-04: the first non-I/II-class day (RG96) -- the Precious Blood lands here" 2011 7 4 "2011-07-04 monday season=time-after-pentecost week=3 slug=precious-blood-of-our-lord-jesus-christ \ - rank=class-1 colour=red comms=[] in=precious-blood-of-our-lord-jesus-christ out=[]" + rank=class-1 colour=red subject=lord comms=[] in=precious-blood-of-our-lord-jesus-christ out=[]" (* ------------------------------------------------------------------ *) (* All Souls falling on a Sunday (register §4, RG96 Attamen (b), primary- @@ -357,11 +368,11 @@ let test_all_souls_on_a_sunday_2025 () = check ~msg:"2025-11-02: All Souls yields to the occurring Sunday (RG91 entry 8), no commemoration (RG94)" 2025 11 2 "2025-11-02 sunday season=time-after-pentecost week=21 slug=ef-time-after-pentecost-sunday-21 rank=class-2 \ - colour=green comms=[] in=- out=[commemoration-of-all-souls->2025-11-03]"; + colour=green subject=temporal comms=[] in=- out=[commemoration-of-all-souls->2025-11-03]"; check ~msg:"2025-11-03: All Souls transfers to the following Monday, its sedes propria (RG96 Attamen b)" 2025 11 3 "2025-11-03 monday season=time-after-pentecost week=21 slug=commemoration-of-all-souls rank=class-1 \ - colour=black comms=[] in=commemoration-of-all-souls out=[]" + colour=black subject=saint comms=[] in=commemoration-of-all-souls out=[]" (* ------------------------------------------------------------------ *) (* Christmas falling on a Sunday (RG91 entry 1: Nativity, Easter, Pentecost @@ -375,7 +386,7 @@ let test_all_souls_on_a_sunday_2025 () = let test_christmas_on_a_sunday_2022 () = check ~msg:"2022-12-25 falling on a Sunday: the Nativity (RG91 entry 1) takes the day outright, no contest" 2022 12 25 - "2022-12-25 sunday season=christmastide week=- slug=ef-nativity rank=class-1 colour=white comms=[] in=- \ + "2022-12-25 sunday season=christmastide week=- slug=ef-nativity rank=class-1 colour=white subject=temporal comms=[] in=- \ out=[]" (* ------------------------------------------------------------------ *) @@ -388,18 +399,18 @@ let test_christmas_on_a_sunday_2022 () = confirmed via `date -d`. *) let test_holy_thursday_is_white_2026 () = check ~msg:"2026-04-01 (Wednesday of Holy Week): ordinary Passiontide violet (RG128)" 2026 4 1 - "2026-04-01 wednesday season=passiontide week=2 slug=ef-passiontide-2-wednesday rank=class-1 colour=violet \ + "2026-04-01 wednesday season=passiontide week=2 slug=ef-passiontide-2-wednesday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]"; check ~msg: "2026-04-02 Holy Thursday: white (RG128(b)'s named exception + RG122's affirmative statement), not \ Passiontide's violet" 2026 4 2 - "2026-04-02 thursday season=passiontide week=2 slug=ef-passiontide-2-thursday rank=class-1 colour=white \ + "2026-04-02 thursday season=passiontide week=2 slug=ef-passiontide-2-thursday rank=class-1 colour=white subject=temporal \ comms=[] in=- out=[]"; check ~msg:"2026-04-03 Good Friday: back to violet (RG128) -- Thursday's white is a one-day exception" 2026 4 3 - "2026-04-03 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet \ + "2026-04-03 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]" (* ------------------------------------------------------------------ *) @@ -419,14 +430,14 @@ let test_ember_ferias_commemorated_when_impeded () = makes it PRIVILEGED, not merely eligible. *) check ~msg:"1900-12-21: Advent Ember Friday, impeded, MUST be commemorated (RG24) and is privileged (RG109e)" 1900 12 21 - "1900-12-21 friday season=advent week=3 slug=thomas rank=class-2 colour=red \ + "1900-12-21 friday season=advent week=3 slug=thomas rank=class-2 colour=red subject=saint \ comms=[ef-advent-ember-fri:privileged] in=- out=[]"; (* 1902-02-22: Lent Ember Saturday (RG91 entry 18, II class) impeded by the Chair of St Peter (II class, universal, entry 16). Same RG24/ RG109(e) mandate. *) check ~msg:"1902-02-22: Lent Ember Saturday, impeded, MUST be commemorated (RG24) and is privileged (RG109e)" 1902 2 22 - "1902-02-22 saturday season=lent week=1 slug=chair-of-st-peter rank=class-2 colour=white \ + "1902-02-22 saturday season=lent week=1 slug=chair-of-st-peter rank=class-2 colour=white subject=saint \ comms=[ef-lent-ember-sat:privileged] in=- out=[]" let test_iv_class_ferias_never_commemorated () = @@ -443,7 +454,7 @@ let test_iv_class_ferias_never_commemorated () = true (omitted_has d1 "ef-time-after-pentecost-8-wednesday"); Alcotest.(check string) "2026-07-22: Mary Magdalene observed, no commemoration (RG26)" - "2026-07-22 wednesday season=time-after-pentecost week=8 slug=mary-magdalene rank=class-3 colour=white \ + "2026-07-22 wednesday season=time-after-pentecost week=8 slug=mary-magdalene rank=class-3 colour=white subject=saint \ comms=[] in=- out=[]" (describe d1); let d2 = fetch 2026 8 10 in @@ -451,7 +462,7 @@ let test_iv_class_ferias_never_commemorated () = true (omitted_has d2 "ef-time-after-pentecost-11-monday"); Alcotest.(check string) "2026-08-10: St Lawrence observed, no commemoration (RG26)" - "2026-08-10 monday season=time-after-pentecost week=11 slug=lawrence rank=class-2 colour=red comms=[] in=- \ + "2026-08-10 monday season=time-after-pentecost week=11 slug=lawrence rank=class-2 colour=red subject=saint comms=[] in=- \ out=[]" (describe d2) @@ -476,7 +487,7 @@ let test_ii_class_sunday_admits_only_ii_class_commemoration () = (omitted_has d2009 "romanus"); Alcotest.(check string) "2009-08-09: the Sunday observed, no commemoration at all (RG111(b) rank floor)" "2009-08-09 sunday season=time-after-pentecost week=10 slug=ef-time-after-pentecost-sunday-10 rank=class-2 \ - colour=green comms=[] in=- out=[]" + colour=green subject=temporal comms=[] in=- out=[]" (describe d2009); let d2026 = fetch 2026 8 9 in Alcotest.(check bool) "2026-08-09: romanus (Class3) is offered and excluded, proving RG111(b) actually fired" @@ -484,7 +495,7 @@ let test_ii_class_sunday_admits_only_ii_class_commemoration () = (omitted_has d2026 "romanus"); Alcotest.(check string) "2026-08-09: the Sunday observed, no commemoration at all (RG111(b) rank floor)" "2026-08-09 sunday season=time-after-pentecost week=11 slug=ef-time-after-pentecost-sunday-11 rank=class-2 \ - colour=green comms=[] in=- out=[]" + colour=green subject=temporal comms=[] in=- out=[]" (describe d2026) (* ------------------------------------------------------------------ *) @@ -549,7 +560,7 @@ let test_rg16a_lord_feast_no_sunday_commemoration_2028 () = et privilegiis\" keeps the day a dominica II classis for RG111(b), so Sixtus (Class3) has no standing \ either, oracle-confirmed" "2028-08-06 sunday season=time-after-pentecost week=9 slug=transfiguration-of-our-lord rank=class-2 \ - colour=white comms=[] in=- out=[]" + colour=white subject=lord comms=[] in=- out=[]" (describe d) (* Holy Family (RG 17(b), scan-verified, docs/research/rules-register.md @@ -597,26 +608,31 @@ let test_rg16a_lord_feast_no_sunday_commemoration_2028 () = Sunday of it this is), slug=ef-time-after-epiphany-sunday-1 (unchanged from the plain Sunday key this date always carried -- temporal_ef.ml's own comment on why RG 17(b) does not need a new lectionary key), rank - =class-2, colour=white. *) + =class-2, colour=white -- AND, fix round 1 (coordinator finding 4), + subject=lord: the ONE field that actually distinguishes Holy Family from + an ordinary, unnamed Sunday (every other field above was already + identical before temporal_ef.ml's own fix -- [describe] originally + omitted [subject], so two of these three pins would have stayed green + even with the feature fully reverted; see [describe]'s own comment). *) let test_holy_family_ordinary_year_2026 () = check ~msg:"2026-01-11: Holy Family, ordinary year -- Hyginus (Class3, Commemoration_only) has no \ standing for the day's II-class-only Sunday slot" 2026 1 11 "2026-01-11 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ - colour=white comms=[] in=- out=[]" + colour=white subject=lord comms=[] in=- out=[]" let test_holy_family_excludes_baptism_2030 () = check ~msg:"2030-01-13: Holy Family on the latest possible date -- RG91 e14 \"primum mobilia\" keeps it \ observed over the fixed Baptism, RG112(a) excludes the Baptism entirely, not merely demotes it" 2030 1 13 "2030-01-13 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ - colour=white comms=[] in=- out=[]" + colour=white subject=lord comms=[] in=- out=[]" let test_holy_family_earliest_possible_date_2024 () = check ~msg:"2024-01-07: Holy Family on the earliest possible date (Epiphany a Saturday)" 2024 1 7 "2024-01-07 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ - colour=white comms=[] in=- out=[]" + colour=white subject=lord comms=[] in=- out=[]" (* 2025-02-02, the other real instance of the SAME pattern -- not a contrasting second direction, per this task's fix round 1 (CRITICAL @@ -649,7 +665,7 @@ let test_purification_on_a_sunday_2025 () = commemoration of the Sunday, oracle-confirmed" 2025 2 2 "2025-02-02 sunday season=time-after-epiphany week=4 slug=purification-of-the-blessed-virgin-mary \ - rank=class-2 colour=white comms=[] in=- out=[]" + rank=class-2 colour=white subject=lord comms=[] in=- out=[]" (* ------------------------------------------------------------------ *) (* RG 91 entry 24 ("Festa III classis, in calendario Ecclesiae universae @@ -708,15 +724,15 @@ let test_iii_class_feast_wins_class4_feria () = true (omitted_has d1 "ef-easter-2-wednesday"); Alcotest.(check string) "2008-04-02: Francis of Paola (III class, RG91 entry 24) outranks the class-4 feria" - "2008-04-02 wednesday season=paschaltide week=2 slug=francis-of-paola rank=class-3 colour=white comms=[] \ + "2008-04-02 wednesday season=paschaltide week=2 slug=francis-of-paola rank=class-3 colour=white subject=saint comms=[] \ in=- out=[]" (describe d1); check ~msg:"2008-04-04: Isidore of Seville (III class) outranks the class-4 Paschaltide feria, same shape" 2008 4 4 - "2008-04-04 friday season=paschaltide week=2 slug=isidore-of-seville rank=class-3 colour=white comms=[] in=- \ + "2008-04-04 friday season=paschaltide week=2 slug=isidore-of-seville rank=class-3 colour=white subject=saint comms=[] in=- \ out=[]"; check ~msg:"2008-04-05: Vincent Ferrer (III class) outranks the class-4 Paschaltide feria, same shape" 2008 4 5 - "2008-04-05 saturday season=paschaltide week=2 slug=vincent-ferrer rank=class-3 colour=white comms=[] in=- \ + "2008-04-05 saturday season=paschaltide week=2 slug=vincent-ferrer rank=class-3 colour=white subject=saint comms=[] in=- \ out=[]"; let d4 = fetch 2038 3 6 in Alcotest.(check bool) @@ -726,15 +742,15 @@ let test_iii_class_feast_wins_class4_feria () = Alcotest.(check string) "2038-03-06: Sts Perpetua and Felicity (III class, RG91 entry 24) outrank the class-4 feria; RED per their \ own martyrs' colour, not the season's violet" - "2038-03-06 saturday season=septuagesima week=2 slug=sts-felicitas-perpetua rank=class-3 colour=red comms=[] \ + "2038-03-06 saturday season=septuagesima week=2 slug=sts-felicitas-perpetua rank=class-3 colour=red subject=saint comms=[] \ in=- out=[]" (describe d4); check ~msg:"2038-03-08: John of God (III class) outranks the class-4 Septuagesima feria, same shape" 2038 3 8 - "2038-03-08 monday season=septuagesima week=3 slug=john-of-god rank=class-3 colour=white comms=[] in=- \ + "2038-03-08 monday season=septuagesima week=3 slug=john-of-god rank=class-3 colour=white subject=saint comms=[] in=- \ out=[]"; check ~msg:"2038-03-09: Frances of Rome (III class) outranks the class-4 Septuagesima feria, same shape" 2038 3 9 - "2038-03-09 tuesday season=septuagesima week=3 slug=frances-rome rank=class-3 colour=white comms=[] in=- \ + "2038-03-09 tuesday season=septuagesima week=3 slug=frances-rome rank=class-3 colour=white subject=saint comms=[] in=- \ out=[]" let suite = -- cgit v1.3