aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/ef/expected-divergences-missalemeum.sexp21
-rw-r--r--data/ef/expected-divergences.sexp4
-rw-r--r--lib/rites/rite_ef/precedence_ef.ml36
-rw-r--r--lib/rites/rite_ef/temporal_ef.ml54
-rw-r--r--test/test_oracle.ml18
-rw-r--r--test/test_temporal_ef.ml14
6 files changed, 122 insertions, 25 deletions
diff --git a/data/ef/expected-divergences-missalemeum.sexp b/data/ef/expected-divergences-missalemeum.sexp
index 280ecf5..d5d16a3 100644
--- a/data/ef/expected-divergences-missalemeum.sexp
+++ b/data/ef/expected-divergences-missalemeum.sexp
@@ -209,11 +209,18 @@ WIDENED, Task 9 (branch ef-lectionary, layer-4 oracle): [First_mismatch]/[Gospel
(verdict colitur)
(note "colitur commemorates the losing early-Advent feria (Monday after Advent I, 30 Nov; Tuesday/Wednesday after Advent II, 8 Dec) when a saint wins. missalemeum shows nothing on these 4 rows specifically, even though it DOES show equivalent later-Advent-feria commemorations elsewhere in the SAME window (2-21 December, matching colitur exactly there) -- read as a missalemeum-side inconsistency on these particular rows, not a textually narrower rule.")
(expected_rows 4))
- ((id M11)
- (citation "CORRECTED, fix round 1 (F3): RG 67 (\"Dies infra octavam sunt II classis\" -- days within the Octave are II class) + RG 109(c) (\"de diebus infra octavam Nativitatis Domini\" -- privileged) + the 1962 calendarium's own explicit note under 26/27/28 December, primary-source-verified 2026-08-12: \"S. STEPHANI PROTOMARTYRIS, II classis. / Com. octavae Nativitatis.\" (same pattern, verbatim, under 27 and 28 December for John the Evangelist and the Holy Innocents) -- \"Commemoration of the Octave of the Nativity\", named explicitly, alongside each of the three named feasts")
- (verdict open)
- (note "This entry previously read \"No RG paragraph found to support this\" and verdict colitur -- WRONG, found by fix-round-1 review: RG 67/109(c) and the calendarium's own \"Com. octavae Nativitatis\" note both confirm a real commemoration is due here. It is ALSO a genuine REGRESSION Task 16's own commemoration-eligibility fix introduced: before that fix, colitur unconditionally commemorated the day's own losing temporal candidate (\"ef-christmas-0-<weekday>\", the generic Christmastide ferial slug 26-28 December falls through to since temporal_ef.ml's [named] does not cover those three dates), which happened to keep commemoration PRESENCE agreeing with missalemeum even though the underlying reasoning was wrong (a Task 16 review-round-1 finding elsewhere, F1/F2 fixed it for the general case) -- and Task 16's fix (and this fix round's RG 23-26 correction of it) both correctly stop commemorating that generic candidate, since [ferial_rank]'s Christmastide catch-all gives it Class4, which RG 26 never commemorates. The catch: RG 67 says days WITHIN the octave are II class, not IV -- the generic ferial construction 26-28 December falls through to has the WRONG rank for this specific window (a rank bug, not merely a missing-candidate one; 29-31 December already get the correct Class2 via [named]'s own \"ef-nativity-octave-day-{5,6,7}\" branch, so this is narrowly a 26-28-December gap). Fixing it properly also has to get RG 69 right (\"De dominica infra octavam Nativitatis Domini... semper fit Officium cum commemoratione FESTI FORTE OCCURRENTIS\" -- when the Sunday falls in this window, the SUNDAY is observed with a commemoration of THE FEAST ITSELF, Stephen/John/the Innocents by name -- NOT the generic octave placeholder), so a naive \"treat the octave commemoration as one more competing candidate\" fix would get the Sunday case backwards (confirmed by working through it: it would make the octave placeholder outrank the named saint for the Sunday's own privileged slot, when RG 69 names the SAINT, not the octave, for that slot). This needs either new architecture (a commemoration that attaches to whichever of Stephen/John/the Innocents is observed, not a competing candidate the way RG 92-95's occurrence framework models everything else) or a more careful RG-69-aware fix than this task attempted -- out of scope for this fix round. Verdict changed from colitur to open: neither side is confidently right without that fix, and the previous entry's \"colitur is correct, nothing to implement\" framing was itself the risk this review flagged. Register §6 open item.")
- (expected_rows 4))
+ ; M11 -- CLOSED, Nativity-Octave fix (2026-08-18), REMOVED not
+ ; re-adjudicated: 0 of 730 rows. This was the ONE entry in this file
+ ; adjudicated against colitur rather than the oracle, and it was right to be.
+ ; The calendarium directs "Com. octavae Nativitatis" under each of 26, 27 and
+ ; 28 December (LT.txt:5454-5459) and RG 109(c) makes a commemoration "de
+ ; diebus infra octavam Nativitatis Domini" privileged -- but colitur built
+ ; those three days as generic Class4 Christmastide ferias, so there was no
+ ; octave-day candidate for the feast to be commemorated OVER and colitur
+ ; emitted nothing. They are days within the Octave (RG 67, "Dies infra
+ ; octavam sunt II classis") and are now built as such, exactly as 29-31
+ ; always were. The commemoration follows from the existing machinery rather
+ ; than from a special case. Citation preserved in the register.
((id M13)
(citation "OPEN -- not adjudicated. 1962 calendarium's March table: \"Feria VI post dominicam I Passionis: Commemoratio septem Dolorum B. Mariæ Virg.\" (confirmed real, every year) -- but RG 91's plain table (entry 11-13, Joseph, I class, vs entry 22, an ordinary III-class Passiontide feria) gives Joseph the day outright, with no RG 96 collision requiring a transfer, so the primary text found here does not by itself explain missalemeum's result")
(verdict colitur)
@@ -224,8 +231,8 @@ WIDENED, Task 9 (branch ef-lectionary, layer-4 oracle): [First_mismatch]/[Gospel
((id M15)
(citation "docs/research/rules-register.md §4's own \"THE MAPPING, AND EXACTLY WHAT IT CANNOT RESOLVE\" note (test_oracle.ml's own header) -- not an RG citation, a comparator LIMIT: Rite_ef.Temporal_ef never sets an English [names] field on any candidate it builds (temporal_ef.ml has no \"en ...\" string anywhere in it)")
(verdict unresolvable)
- (note "17 rows (was 20 before the ef-sanctoral-audit task; three moved to new entries below, not re-adjudicated) where at least one of colitur's own admitted commemorations is TEMPORAL-origin -- there is no English name on colitur's side to compare against missalemeum's title text at all, so identity cannot be attempted for the WHOLE row, only reported as unresolved (test_oracle.ml's own [identity_diff]: any unresolved name bails the whole comparison out, regardless of how many others resolve cleanly). Not a rubric dispute and not a data gap either engine is wrong about. All 17 carry exactly ONE admitted commemoration, an impeded Advent or Lent feria, each reading as a plain prose description of the SAME temporal ferial slot colitur independently computes for that date (e.g. 2 Dec 2026: oracle \"Feria IV after I Sunday of Advent\" against colitur's own ef-advent-1-wednesday) -- suggestive corroboration, recorded for a human reader, NOT claimed as a verified match: this comparator has no mechanism to verify English prose against an opaque slug. (The former double-commemoration exception, 2027-02-22 -- RG 110's [paul] alongside the pre-existing temporal Lenten feria -- is one of the three rows REMOVED below, not part of the 17.) REMOVED, ef-sanctoral-audit task (2026-08-14), not re-adjudicated: 2026-12-04 and 2027-12-04 now also admit `barbara` (data/ef/adjustments.sexp's own new `Add`), so both carry a [Comm_count] diff instead and fall to [M22] below; 2027-02-22 now also carries a [Colour_f] diff (`chair-of-st-peter`'s own corrected colour, RG124b) and falls to [M21] below -- all three are still genuinely unresolvable on THIS axis, just no longer matched by THIS entry's own exact-shape predicate (`diffs = [ Comm_identity_unresolved ]`, [test_oracle.ml]'s own [layer_m_reason]), which never re-fires once a second diff joins it. Fixing this at the root (an English name on every temporal-cycle candidate) is a data/lectionary-bootstrap task, not something this comparator can do for itself -- register §6, neighbouring the RG 113 tie-break section, records it as an open item. The 17 dates: 2026-02-24, 2026-03-19, 2026-03-25, 2026-12-02, 2026-12-03, 2026-12-07, 2026-12-11, 2026-12-21, 2027-02-24, 2027-12-02, 2027-12-03, 2027-12-06, 2027-12-07, 2027-12-11, 2027-12-13, 2027-12-16, 2027-12-21.")
- (expected_rows 18))
+ (note "17 rows (was 20 before the ef-sanctoral-audit task; three moved to new entries below, not re-adjudicated) where at least one of colitur's own admitted commemorations is TEMPORAL-origin -- there is no English name on colitur's side to compare against missalemeum's title text at all, so identity cannot be attempted for the WHOLE row, only reported as unresolved (test_oracle.ml's own [identity_diff]: any unresolved name bails the whole comparison out, regardless of how many others resolve cleanly). Not a rubric dispute and not a data gap either engine is wrong about. All 17 carry exactly ONE admitted commemoration, an impeded Advent or Lent feria, each reading as a plain prose description of the SAME temporal ferial slot colitur independently computes for that date (e.g. 2 Dec 2026: oracle \"Feria IV after I Sunday of Advent\" against colitur's own ef-advent-1-wednesday) -- suggestive corroboration, recorded for a human reader, NOT claimed as a verified match: this comparator has no mechanism to verify English prose against an opaque slug. (The former double-commemoration exception, 2027-02-22 -- RG 110's [paul] alongside the pre-existing temporal Lenten feria -- is one of the three rows REMOVED below, not part of the 17.) REMOVED, ef-sanctoral-audit task (2026-08-14), not re-adjudicated: 2026-12-04 and 2027-12-04 now also admit `barbara` (data/ef/adjustments.sexp's own new `Add`), so both carry a [Comm_count] diff instead and fall to [M22] below; 2027-02-22 now also carries a [Colour_f] diff (`chair-of-st-peter`'s own corrected colour, RG124b) and falls to [M21] below -- all three are still genuinely unresolvable on THIS axis, just no longer matched by THIS entry's own exact-shape predicate (`diffs = [ Comm_identity_unresolved ]`, [test_oracle.ml]'s own [layer_m_reason]), which never re-fires once a second diff joins it. Fixing this at the root (an English name on every temporal-cycle candidate) is a data/lectionary-bootstrap task, not something this comparator can do for itself -- register §6, neighbouring the RG 113 tie-break section, records it as an open item. The 17 dates: 2026-02-24, 2026-03-19, 2026-03-25, 2026-12-02, 2026-12-03, 2026-12-07, 2026-12-11, 2026-12-21, 2027-02-24, 2027-12-02, 2027-12-03, 2027-12-06, 2027-12-07, 2027-12-11, 2027-12-13, 2027-12-16, 2027-12-21. WIDENED (Nativity-Octave fix, 2026-08-18): 18 -> 22. Four more dates, all the same limit: colitur now commemorates the day within the Octave of the Nativity on 26/27/28 December (RG 67/109(c), the calendarium's own Com. octavae Nativitatis), which is what closed M11 -- but that candidate is TEMPORAL-origin, so it carries no English name and its identity cannot be resolved against missalemeum's own For Octave of the Nativity. Both streams commemorate the same thing; only the comparator cannot prove it.")
+ (expected_rows 22))
((id M21)
(citation "RG 124 (\"XVIII - De coloribus paramentorum\", \"C) De colore rubro\"), both photographic scans word for word: 124(b) \"adhibetur color ruber in Officio et Missa de festis: ... Sanctorum Apostolorum et Evangelistarum, in eorum die natalicio, excepto festo S. Ioannis (27 decembris)\"; 124(e) \"Sanctorum Martyrum, quorum colitur aut martyrium\"; ef-sanctoral-audit task")
(verdict colitur)
diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp
index 727ce1b..1ba222d 100644
--- a/data/ef/expected-divergences.sexp
+++ b/data/ef/expected-divergences.sexp
@@ -85,8 +85,8 @@ CITATION component, new this task: Important 3(a) (tools/bootstrap_lectionary.ml
VERDICT, split by the SAME 138-row population, not two entries: on the 119 rows where 29-31 December is an ordinary WEEKDAY that year, colitur's `Tit. 3,4-7` citation is CONFIRMED CORRECT against the Missal (verdict colitur would be accurate for this subset alone). On the 19 rows where 29-31 December IS ITSELF a Sunday that year (2006-12-31, 2007-12-30, 2012-12-30, 2013-12-29, 2017-12-31, 2018-12-30, 2019-12-29, 2023-12-31, 2024-12-29, 2028-12-31, 2029-12-30, 2030-12-29, 2034-12-31, 2035-12-30, 2040-12-30, 2041-12-29, 2045-12-31, 2046-12-30, 2047-12-29 -- independently re-derived against `date -d <date> +%u` for every one of the 138 dates, not estimated), RG 69's own unconditional rule means the SUNDAY'S distinct Office should be observed instead -- colitur's `Temporal_ef` does not distinguish the two cases at the slug level at all, so it emits the weekday formulary there too, which is WRONG by this reading. This is a genuine [Temporal_ef] defect (not a lectionary/bootstrap issue, and not something this generator can fix on its own), out of this task's own safe scope -- a behaviour change to a shared, multi-round-reviewed kernel-adjacent function, the same discipline C25 below explains for its own one-hop-removed consequence of this identical gap. [verdict] is [open], not [colitur], because a single per-entry verdict cannot honestly claim BOTH sub-populations at once, and the coordinator's own instruction was explicit: mark it questioned, not leave a verdict the evidence contradicts.
-Gated on the literal date window (month=12, day in {29,30,31}) AND colitur's own slug family (`nativity_octave_day_slugs`) AND `subset diffs [ Slug_f; First_f; Gospel_f ]` (widened this task from the exact-match `diffs = [ Slug_f ]` the pre-citation-comparison entry used -- narrowing back to exact-match would have silently re-excluded the very citation divergence this task exists to surface). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 138.")
- (expected_rows 138))
+Gated on the literal date window (month=12, day in {29,30,31}) AND colitur's own slug family (`nativity_octave_day_slugs`) AND `subset diffs [ Slug_f; First_f; Gospel_f ]` (widened this task from the exact-match `diffs = [ Slug_f ]` the pre-citation-comparison entry used -- narrowing back to exact-match would have silently re-excluded the very citation divergence this task exists to surface). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 138. NARROWED (Nativity-Octave fix, 2026-08-18): 138 -> 119. Nineteen of these days are 26-28 December, which colitur now builds as days WITHIN the Octave of the Nativity (RG 67) rather than generic Christmastide ferias, so their temporal identity -- and with it their divergence shape -- changed. Not a re-adjudication: the same RG 69 disagreement on the days that remain.")
+ (expected_rows 119))
((id C8)
(citation "RG 87 (Minor Litanies/Rogations, Mon/Tue before Ascension); register §3c item 3")
(verdict colitur)
diff --git a/lib/rites/rite_ef/precedence_ef.ml b/lib/rites/rite_ef/precedence_ef.ml
index c9e6a55..dd75765 100644
--- a/lib/rites/rite_ef/precedence_ef.ml
+++ b/lib/rites/rite_ef/precedence_ef.ml
@@ -1325,9 +1325,39 @@ let disposition ~(winner : Vocab_ef.rank Precedence.candidate)
accurate, already decides every real case this codebase's current data
produces; the slug fallback below is exercised only between two
[Commemoration_only] candidates tied at {!unclassified} (138 of the 599,
- all order/count-invisible -- RG 91 has no table position for either of
- them to compare, so there is nothing more specific RG 113 could supply
- here either). {!band} needs a [context] this function itself does not
+ RG 91 having no table position for either of them to compare).
+
+ CORRECTED 2026-08-18: this used to add "all order/count-invisible", which
+ was true of 2005-2050 -- the range it was measured over -- and is NOT true
+ generally. 2038-06-02 is a live counter-example, found when the 2035/2038
+ oracle windows began comparing commemorations: the Ascension Vigil is II
+ class, RG 111(c) admits exactly ONE commemoration, and the two candidates
+ are `rogation-wednesday` and `sts-marcellinus-peter-erasmus` -- both
+ genuinely [Commemoration_only] (2 June reads "Commemoratio ... Comm." in
+ the calendarium itself, LT.txt:5148 and scan1.txt:2828, so the data is
+ right, not defective). The slug fallback therefore decides which
+ commemoration the day KEEPS, not merely how two kept ones are ordered.
+ missalemeum keeps the saints; this keeps the Rogation, on nothing but
+ "rogation-" sorting before "sts-".
+
+ AND THE RUBRIC GENUINELY DOES NOT SETTLE IT, checked rather than assumed.
+ RG 113's second sentence needs a table position and neither has one. Its
+ FIRST sentence, "Commemoratio de Tempore fit primo loco", looked like the
+ answer -- a Rogation being plausibly *de Tempore* -- but RG 81 forecloses
+ it in terms: "De Litaniis maioribus ... Earum autem commemoratio NON EST
+ HABENDA commemoratio «de Tempore»" (LT.txt:1399-1401), and RG 89 extends
+ RG 81 to the minor Litanies. So a Rogation commemoration is explicitly not
+ *de Tempore*, and tagging the entry [Subject.Temporal] to reach that
+ sentence would have been WRONG -- the [Subject.Saint] it carries,
+ inherited from the Major Litanies precedent, stands. RG 114 says only that
+ what exceeds the number is omitted, never which.
+
+ What remains is therefore a genuine LACUNA, not an unfound rule: the slug
+ order below is a documented CONVENTION for a case the Rubricae Generales
+ leave open, deliberately kept rather than changed to match the oracle --
+ which would be adopting an answer with no more warrant than this one, from
+ a source already adjudicated wrong six times over. See
+ docs/research/rules-register.md §6.16. {!band} needs a [context] this function itself does not
have (date/season/weekday) -- unlike [dignity], which read [rank] alone
-- so {!Precedence.resolve} now computes each candidate's own [band]
value once, generically, and hands it to [admit] as the trailing [int]
diff --git a/lib/rites/rite_ef/temporal_ef.ml b/lib/rites/rite_ef/temporal_ef.ml
index dacae9c..fa78cbe 100644
--- a/lib/rites/rite_ef/temporal_ef.ml
+++ b/lib/rites/rite_ef/temporal_ef.ml
@@ -276,9 +276,35 @@ let named d =
citations bootstrap, Plan 4, not the sanctoral one, Plan 3, which
already shipped in this branch). *)
Some (Advent, "ef-nativity-vigil", Colour.Violet, Class1)
- else if m = 12 && (dd = 29 || dd = 30 || dd = 31) then
- (* Days within the Octave of the Nativity; 26-28 Dec are Stephen, John and
- the Innocents, hence sanctoral (Plan 3). Colitur slugs -- lectionary gap. *)
+ else if m = 12 && dd >= 26 && dd <= 31 && Date.weekday d <> Date.Sun then
+ (* Days within the Octave of the Nativity, RG 67: "Dies infra octavam sunt
+ II classis". The octave runs 25 December to 1 January, so 26-31 are its
+ days 2-7.
+
+ CORRECTED 2026-08-18: this covered 29-31 ONLY, on the reasoning that
+ "26-28 Dec are Stephen, John and the Innocents, hence sanctoral". Their
+ OFFICE is sanctoral -- those three II-class feasts win the day -- but
+ they remain DAYS WITHIN THE OCTAVE, and the calendarium directs a
+ commemoration of the octave under each, verbatim (LT.txt:5454-5459):
+
+ 26 S. STEPHANI PROTOMARTYRIS, II classis. Com. octavae Nativitatis.
+ 27 S. IOANNIS AP. ET EV., II classis. Com. octavae Nativitatis.
+ 28 Ss. INNOCENTIUM Mm., II classis. Com. octavae Nativitatis.
+
+ Leaving 26-28 as generic Class4 ferias meant there was no octave-day
+ candidate for the feast to be commemorated OVER, so colitur emitted no
+ commemoration at all there -- the gap test_oracle.ml's own M11 records,
+ and the one entry in that file adjudicated against colitur rather than
+ the oracle. RG 109(c) makes "de diebus infra octavam Nativitatis
+ Domini" PRIVILEGED, so once the candidate exists RG 111(c)'s single
+ slot on a II-class day goes to it.
+
+ The Sunday guard is RG 69, not an implementation detail: "De dominica
+ infra octavam Nativitatis Domini, quae scilicet a die 26 ad 31
+ decembris occurrit, SEMPER fit Officium cum commemoratione festi forte
+ occurrentis" -- a Sunday falling 26-31 December keeps its OWN office
+ and commemorates the feast, the reverse of the other days. That Sunday
+ is built below; overriding it here would invert RG 69. *)
Some (Christmastide, Printf.sprintf "ef-nativity-octave-day-%d" (dd - 24), Colour.White, Class2)
else if m = 1 && dd = 1 then
(* RG 91 entry 5: 1 Jan is the Octave Day of the Nativity, the same table
@@ -1070,11 +1096,25 @@ let temporal d =
let anchors y =
let easter = Computus.gregorian_easter y in
let off n = Date.add_days easter n in
- [ ("ef-nativity", mk y 12 25);
+ (* Days within the Octave, 26-31 December, but ONLY those that are not
+ Sundays. RG 69 gives a Sunday occurring 26-31 December its OWN office
+ ("semper fit Officium cum commemoratione festi forte occurrentis"), so
+ in such a year that date carries the Sunday-within-the-octave slug, and
+ asserting an octave-day anchor there would assert the rubric's own
+ opposite. This list named 29/30/31 unconditionally until 2026-08-18 --
+ wrong whenever one fell on a Sunday, corrected alongside [named]'s own
+ Sunday guard and confirmed against the oracle, which shows "Sunday in
+ the Octave of Christmas" on 2035-12-30 where colitur used to show a
+ feria. 26-28 join for the first time: they are days within the octave
+ too (RG 67), which is what M11's missing commemoration turned on. *)
+ List.filter_map
+ (fun dd ->
+ let d = mk y 12 dd in
+ if Date.weekday d = Date.Sun then None
+ else Some (Printf.sprintf "ef-nativity-octave-day-%d" (dd - 24), d))
+ [ 26; 27; 28; 29; 30; 31 ]
+ @ [ ("ef-nativity", mk y 12 25);
("ef-nativity-vigil", mk y 12 24);
- ("ef-nativity-octave-day-5", mk y 12 29);
- ("ef-nativity-octave-day-6", mk y 12 30);
- ("ef-nativity-octave-day-7", mk y 12 31);
("ef-circumcision", mk y 1 1);
("ef-epiphany", mk y 1 6);
("ef-time-after-epiphany-sunday-1", holy_family_sunday y);
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index df56bcc..5177716 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -983,7 +983,17 @@ let m15_dates =
[ "2026-02-24"; "2026-03-19"; "2026-03-25"; "2026-12-02"; "2026-12-03"; "2026-12-04";
"2026-12-07"; "2026-12-11"; "2026-12-21"; "2027-02-22"; "2027-02-24"; "2027-12-02";
"2027-12-03"; "2027-12-04"; "2027-12-06"; "2027-12-07"; "2027-12-11"; "2027-12-13";
- "2027-12-16"; "2027-12-21" ]
+ "2027-12-16"; "2027-12-21";
+ (* WIDENED (Nativity-Octave fix, 2026-08-18): the four days on which
+ colitur now commemorates the day within the Octave of the Nativity
+ (RG 67/109(c), the calendarium's own "Com. octavae Nativitatis"
+ under 26/27/28 December). Both streams commemorate it -- this fix
+ closed M11, which existed because colitur commemorated NOTHING
+ there -- but the candidate is TEMPORAL-origin, so Temporal_ef sets
+ no English name and the comparator cannot resolve its identity
+ against missalemeum's "For Octave of the Nativity". Exactly this
+ entry's own limit, on four more dates. *)
+ "2026-12-26"; "2026-12-28"; "2027-12-27"; "2027-12-28" ]
(* M16 -- Task B: a genuine IDENTITY mismatch, both sides otherwise agreeing
on rank/colour/count/presence. 27 March 2026 (Friday of Passion Week):
@@ -1892,7 +1902,7 @@ let classify_2038 (c : colitur_row) (o : oracle_row) diffs =
dedicated task rather than settled by whichever answer happens to match
the oracle. *)
else if has_comm "rogation-wednesday" then
- Some "COMM-ONLY-TIE-BREAK (alphabetical, arbitrary -- see register 6.16)"
+ Some "COMM-ONLY-TIE-BREAK (RG-under-determined convention -- register 6.16)"
(* The documented comparator LIMIT, not a calendar disagreement: colitur
resolves a commemoration's identity through its own English name, and a
TEMPORAL-origin commemoration (an impeded feria, an Ember or Rogation
@@ -2029,11 +2039,11 @@ let test_2038_class_counts () =
("CHRISTMAS-MULTI-MASS (M27)", 1);
("COLOUR (M21)", 7);
("COMM-NAME-FORM (same entity, different English name)", 2);
- ("COMM-ONLY-TIE-BREAK (alphabetical, arbitrary -- see register 6.16)", 1);
+ ("COMM-ONLY-TIE-BREAK (RG-under-determined convention -- register 6.16)", 1);
("JOSEPH-ANNUNCIATION-TRANSFER-ORDER (C14's own collision)", 2);
("JUDITH (M28, register 6.6)", 2);
("MISSAL-TWO-PART-CITATION (register 6.9)", 1);
- ("NATIVITY-OCTAVE-COMM-MISSING (M11, colitur's own gap, verdict open)", 2);
+ ("COMM-IDENTITY-UNRESOLVED (temporal-origin, no English name -- M15's limit)", 2);
("PERPETUA-COMMON (register 6.8)", 1);
("PETER-COMPANION-ABSENT-UPSTREAM (M19)", 1)
]
diff --git a/test/test_temporal_ef.ml b/test/test_temporal_ef.ml
index 4e97d33..4995ee1 100644
--- a/test/test_temporal_ef.ml
+++ b/test/test_temporal_ef.ml
@@ -526,8 +526,18 @@ let test_christmastide_feria_slugs () =
itself uses 3 January and 10 January below instead -- both, checked
directly against data/ef/sanctoral.sexp, have no competing entry in
any year, so the BVM Saturday office genuinely IS reachable there. *)
- Alcotest.(check string) "26 Dec (Sat)" "ef-christmas-0-saturday" (slug_of (d 2026 12 26));
- Alcotest.(check string) "28 Dec (Mon)" "ef-christmas-0-monday" (slug_of (d 2026 12 28));
+ (* CORRECTED 2026-08-18: these pinned "ef-christmas-0-<weekday>", the generic
+ Christmastide ferial slugs 26-28 December used to fall through to. Those
+ are days WITHIN the Octave of the Nativity (RG 67, "Dies infra octavam
+ sunt II classis") and now carry the octave-day slug exactly as 29-31
+ always did -- which is what gave M11's missing "Com. octavae Nativitatis"
+ a candidate to be commemorated over. The days are still Saturday and
+ Monday; only the temporal identity changed, and only because it was
+ wrong. *)
+ Alcotest.(check string) "26 Dec (Sat): day 2 within the Octave" "ef-nativity-octave-day-2"
+ (slug_of (d 2026 12 26));
+ Alcotest.(check string) "28 Dec (Mon): day 4 within the Octave" "ef-nativity-octave-day-4"
+ (slug_of (d 2026 12 28));
(* 3 Jan 2026 is a SATURDAY, genuinely reachable (data/ef/sanctoral.sexp
has no 3 January entry) -- the real demonstration for the "-1-"
stretch that 26 December's own Saturday could not honestly provide. *)