| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
RG 299 located (scan1:1096-1098), which does two things at once.
First it closes a standing gap: the ferial-Mass selection rule was
recorded in the register as unconfirmed against the primary source, and
step 3 said so in its own comment -- "lectio's own observed behaviour,
not a confirmed Missal citation". It is confirmed now. "In reliquis
feriis dicitur Missa dominicae praecedentis, nisi a rubricis aliter
provisum sit", restated in the propers as "...nisi propria Missa
assignetur".
Second, that escape clause splits M26 shape 2 in half, which is why the
shape was never resolvable as one thing.
Shape 2(a), the week after Trinity, is fixed. Trinity is the temporal
identity of its own Sunday, so a plain walkback lands on Trinity's Mass
-- but the Missal prints a named formula for the following week, "Missa
dominicae I post Pentecosten" (scan1:21758), precisely because the feast
has taken that Sunday's own. Those ferias now resolve at step 2 from it
and never reach the walkback.
Shape 2(b), Christ the King's week, turns out not to be a bug at all. No
proper Mass is assigned there -- checked directly, no rubric precedes
that Mass heading (scan1:39163ff) -- so RG 299's default governs and "the
Mass of the preceding Sunday" genuinely is Christ the King's own, which
is what colitur emits and missalemeum does not. Kept open only because no
rubric specific to that week was located either way; the verdict is now
argued from the primary text rather than resting on oracle disagreement.
No Thursday in the slug list: Corpus Christi is Easter+60, which IS that
week's Thursday every year, so the ferial slug never exists. Found by the
bootstrap's own reachability guard refusing to emit a key no Temporal_ef
slug can match, not reasoned out in advance.
Allow-lists: C35 opened (69 rows, verdict colitur -- lectio still walks
back); C17 narrowed 406 to 397, nine Saturdays moving to C35 because they
carry both a citation and a colour difference, with C35 gated to require
the citation so a colour-only Saturday still falls to C17; M26 narrowed
30 to 27; M18 widened 352 to 355, the same three days keeping only their
observed-identity difference.
Register: section 6.11.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Comment and citation corrections found by review, plus one finding that
survived an attempt to reconstruct it. No behaviour change; the suite is
unchanged at 358 green.
The ferial rubric "Diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut
die 1 ianuarii" was attributed to RG 17(a) in three test comments. It is
not RG 17(a). RG 17(a) (LT.txt:843) fixes only WHEN the Holy Name is
kept -- "celebrandum dominica quae occurrit a die 2 ad 5 ianuarii; secus
die 2 ianuarii". The rubric quoted is a Mass-propers rubric printed
under the Sanctissimi Nominis Iesu heading (scan1:6523-6526, corroborated
scan2:7216), governing what the ordinary ferias of that window say when
they are not the feast at all. Two rules sharing a date window. Fix
round 1 had already corrected this on the data side; the generator's own
comment was right throughout. Only the test comments were stale.
test_differential.ml named bootstrap_lectionary.ml's derived_entries as
the source of ef-holy-name's citations. That binding no longer exists --
it was the mechanism that derived them from ef-holy-name-sunday's
wrongly-widened ini translation, removed in Task 9 because the
derivation was itself the error. They are hand-authored from the scans
now, as holy_name_entries.
M26's shape 1 described its 21 rows as votive Masses of the BVM "on an
otherwise-unoccupied feria, not only a Saturday", splitting them into 4
BVM-Saturday rows and 17 "ordinary weekday ferias". Every one of the 21
is a Saturday, each checked individually against date -d. The error was
not merely verbal: it made the gap look broader than a single cause and
pointed away from the one rule that explains all 21. The sub-groups
differ by season, not weekday, and only in what colitur shows in the
votive Mass's place. One gap -- the office is built (RG 91 entry 27),
the seasonal selection among the five Masses is not.
Recorded, not fixed: step 4 of the reading chain has no oracle witness
at all. This began as a note to write up a live-oracle confirmation for
Felicitas and Perpetua; the reconstruction contradicted its premise. The
sweep ran over 2028, where 6 March resolves as a Lenten feria with the
saint admitted only as a commemoration, so her own Mass is never read
that year. The finding underneath is firmer: only five saints route
through a Common, they are the observed office on five days in all of
2005-2050 (isidore-of-seville 2008/2035/2046, frances-rome and
sts-felicitas-perpetua both 2038), two are never observed in 46 years,
and none falls in layer 4's window. Layer 3 does not cover it either --
lectio resolves the literal "-"/"-" sentinel there, which is what C18 is
gated on, so it confirms only that colitur emits a citation where lectio
emits none, never that it is right. Closing it needs the oracle fixture
extended to 2035, 2038 or 2046; that is a fixture-scope decision.
Register: sections 6.6 and 6.7. CLAUDE.md's layer-blindness list gains
the step-4 entry.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A live-missalemeum sweep over a full liturgical year (2028, 364 days)
returned 333 matching and 31 differing days: 17 already-known or pure
notation, 3 new. All three now adjudicated against the photographic
scans of the 1962 Missal.
The Assumption's Epistle reads "Iudith 13, 22-25; 15, 10" (scan1:35357).
Both engines carried "Judith 13:22-25; 13:15; 13:10" -- a chapter
carry-over defect that re-applied chapter 13 to the second citation and
so invented two verses the Missal never cites. The Seven Sorrows reads
"Iudith 13, 22 et 23-25" (scan1:36938, corroborated at 28468); both
carried "Judith 13:22; 13:25", dropping the range. The third, St Monica,
resolves the other way: the Missal gives 1 Timothy (scan2:32679, heading
and incipit both legible; scan1:29524 agrees) where missalemeum serves
the Common of Holy Women's Proverbs -- colitur is right, no change.
Layer 3 could not have found either citation defect. colitur's data is
bootstrapped from lectio, and lectio is the other side of that
differential, so while both engines produced the identical wrong answer
the comparison held it against itself and reported agreement -- the
shared-lineage blindness CLAUDE.md names, now with a second live witness
beside Holy Thursday's colour. Only an external oracle could see it, and
only outside the committed fixture's own window.
Fixed upstream in lectio, re-bootstrapped here (provenance SHA-256 moved
to 54f6bfc5, verified against the source), fixture regenerated.
The upstream fix inverted layer 3 from blind to load-bearing here:
reverting the Assumption citation now reddens both layers, where before
it would have reddened neither. Verified by mutation, both directions.
Allow-lists:
- C22 closed and removed (128 rows -> 0), not re-adjudicated -- the other
engine was fixed to agree, the same shape as the C2-C5/C7/C9-C13/C21
closures. Its own note had already flagged the Lenten Ember dead-key
bug for upstream; lectio now also fails its build on any unreachable
lectionary key rather than serving a plausible wrong Mass.
- M28 opened (3 rows, verdict colitur), pinning both sides' citation
text rather than the date and diff shape alone, so a different
divergence landing on the same date cannot be swallowed.
- M8's gate widened, expected_rows unchanged at 2: 2027-08-15 carries
both its cause and M28's, and one entry is admitted per day. It stays
under M8, which now requires its own commemoration difference to be
present and admits the citation difference only when it satisfies
M28's two-sided predicate. Neither cause absorbs the other.
layer_m_reason's oracle-row parameter, kept named since M2 closed for
exactly such a future reader, is live again.
Register: docs/research/rules-register.md section 6.6.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Layer 4 (test_oracle.ml) now extracts and compares the Epistle/Gospel
citation for every one of the 730 days in the 2026-2027 fixture, the
same axis Task 8 already added to layer 3. tools/
extract_missalemeum_oracle.py gained a structural citation-span
detector (the first "*...*"-wrapped span under 40 chars containing a
chapter:verse-shaped digit pair), verified exhaustively over all 1 458
Lectio/Evangelium sections. 728 of 730 days are comparable; the 2 that
are not (Good Friday, both years) have no such section in missalemeum's
own JSON at all -- a structural limit on the oracle's own side (M23),
not a colitur gap. 451 of 730 days differ and are all explained across
19 cited entries; 0 unexplained. Chain step 4 (the Commons) has no
layer-4 witness: confirmed empirically (a scratch sweep, not merely
re-asserted from Task 6's own report) that none of the 15 Commons/proper
saints is ever the observed office in this window.
The comparison surfaced three genuine colitur bugs in
data/ef/lectionary.sexp, all fixed at the source in
tools/bootstrap_lectionary.ml:
1. Holy Name of Jesus (ef-holy-name-sunday/ef-holy-name) carried a
mis-derived citation, borrowed by analogy from an unrelated ini
section ("ef-christmas-sunday-0", the Sunday-within-the-Octave's own
Mass) on the wrong assumption the two share a Mass. Disproved by
missalemeum's own extraction for both real Holy Name Sundays in its
window, confirmed against the Missal itself, twice, both scans
(Acts 4:8-12/Luke 2:21, not Gal 4:1-7/Luke 2:33-40).
2. RG 17(a)'s own "diebus ferialibus" rubric (immediately following the
Holy Name heading, both scans) was never implemented: 2-5 January
ferias repeat 1 January's Mass, 7-12 January ferias before Holy
Family Sunday repeat Epiphany's, and Holy Family's own week has a
named formula ("Missa Dominicae Primae post Epiphaniam"). All three
fell to step 3's undifferentiated Sunday walkback instead. Fixed for
three 5-weekday families, deliberately excluding Saturday from all
three -- RG 78's BVM Saturday Office wins there unconditionally,
confirmed against missalemeum's own title on this window's own such
Saturdays.
3. Corpus Christi and Sacred Heart (both real, never-impeded I-class
movable feasts) had no lectionary entry at all. Both engines
independently fell back to Trinity Sunday's own citation and
silently agreed on the wrong answer -- the "Holy Thursday violet in
both" shape CLAUDE.md names for exactly this reason.
Because lectionary.sexp is shared with layer 3 (the lectio differential,
2005-2050), these fixes changed colitur's output for the whole domain,
not only 2026-2027. data/ef/expected-divergences.sexp and
test_differential.ml needed matching updates: C1 narrowed 361->173 and
C25 narrowed 57->13 (rows that now resolve correctly moved to new
entries), C16's note corrected (count unchanged), and six new entries
added (C29-C34, 397 rows total, all verdict colitur). test_lectionary.ml
and test_lectionary_ef.ml's own pins were updated to match (entry count
131->148; one step-3 regression test re-pointed to a date that still
genuinely exercises that step).
One entry, M26 (30 rows, verdict open), is a genuine unfixed gap: colitur's
step-3 "resume the preceding Sunday" fallback is its only ferial-Mass
mechanism, and missalemeum's own selection is more granular in three
confirmed ways (a rotating votive Mass of the BVM, a named weekly
formula for at least one week, and later Time-after-Pentecost weeks this
task's own investigation did not narrow to a single rule) -- the same
"needs a season-keyed selection mechanism, new behaviour not new data"
shape data/ef/expected-divergences.sexp's own C6/C25 and Task 6's own
residual concern already name, out of this task's own scope to build.
dune test: 358 tests green. COLITUR_EXHAUSTIVE_SWEEP=1 dune test
--force: 359 tests green, 89.5s.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two Ember Saturdays shipped an apostle's Mass verbatim from lectio's
own ini, the exact shape already found and fixed for Passion Tuesday
(C26): ef-advent-ember-sat carried St Thomas the Apostle's Mass (Eph
2:19-22 / John 20:24-29, 21 December) instead of the real "Sabbato
Quatuor Temporum Adventus" (2 Thess 2:1-8 / Luke 3:1-6); ef-september-
ember-sat carried St Matthew's Mass (Ezek 1:10-14 / Matt 9:9-13, 21
September) instead of the real "Sabbato Quatuor Temporum septembris"
(Heb 9:2-12 / Luke 13:6-17). Both verified against both primary-source
scans independently. Both readings are explicitly labelled "Lectio
Epistolae" in the Missal on both days, so neither needed the "last
lesson before the Gospel" convention Holy Wednesday/Good Friday relied
on -- a textual fact, not an editorial choice.
Fixed at the source in tools/bootstrap_lectionary.ml: colitur_keys
excludes both wrong ini sections; a new ember_saturday_corrections list
hand-authors the real citations. New allow-list entries C27/C28 (40
rows each, not the naive 46 -- traced to the identical 6 civil years
where 21 September and 21 December, always exactly 91 days apart, land
on a Saturday and the fixed saint's feast wins outright). Both values
pinned in test_lectionary.ml and mutation-tested.
Also: C25's per-weekday breakdown was mislabelled (right multiset,
rotated weekday labels) in both test_differential.ml and expected-
divergences.sexp -- corrected to Wednesday 6/Thursday 19/Friday
19/Saturday 13, and the claim that this split came directly from the
comparator's own output is narrowed to what's actually true (only the
total, 57, does). C26's scan2 citation range was extended to include
the Gospel (previously stopped after the Epistle).
lib/kernel/liturgical_day.mli's "citations always empty until Plan 4"
comment is now stale on this branch -- left untouched (Task 11's own
documentation pass), noted in the task report so it isn't lost.
dune test: 358 tests green; COLITUR_EXHAUSTIVE_SWEEP=1: 359 green.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Critical, and worse than what it replaced: removing a lectionary key does
not mean "no reading" to Lectionary_ef.readings -- it means step 3 silently
resumes the preceding Sunday. Good Friday, which has no Mass at all, was
emitting Palm Sunday's own Epistle and Passion narrative every year; Holy
Wednesday had the same defect. Fixed by authoring both days fully: the
Gospel was always unambiguous and is now always authored; the Epistle uses
the same "last lesson before the Gospel" convention this file's own Lenten
Ember Wednesday entry already established for an identical two-peer-lesson
shape, applied for consistency rather than invented to close this gap. C24
is retired, folded into a widened C23 covering all six Holy Week days.
Important: Passion Tuesday was shipping Holy Tuesday's Mass, a defect the
previous round's own footnote had found and left unrecorded. Fixed at the
source -- colitur_keys now excludes lectio's own (wrong) ini section for
this one weekday rather than translating it; a new passion_tuesday_entry
hand-authors the real Missal citation (Dan 14:27, 28-42 / John 7:1-13, both
scans). New entry C26 records the resulting divergence, 43 of 46 years,
traced (not merely counted) to three years where a competing I-class feast
impedes the day entirely.
Important: the allow-list header was stale one level up, still naming and
restating the diagnosis of an id (C21) retired in the previous round.
Rewritten in full rather than layered with another correction.
Minors: all three Lent Ember values now pinned (only Wednesday was before);
C22's citation corrected to attribute the date-anchor text and the rank
text to their own separate sources; assert_reachable's own comment no
longer overclaims what it can catch; C25's falsified reasoning replaced
with the directly observed fact (a first replacement derivation was itself
found wrong on a second reading and is recorded as rejected, not silently
discarded); hand-authored citations standardised to English book names
with a colon, matching this file's own dominant convention, with one
stated exception where a value must stay byte-identical to lectio's own
data rather than be reformatted.
dune test: 358/358. COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force: 359/359.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two Critical findings, both real: Holy Week (including the entire Sacred
Triduum) was reading Passion Week's Masses -- the original colitur_keys
widened lectio's single, conflated ini section into both weeks instead of
Passion week alone. Narrowed to Passion week only; Holy Week's own four
cleanest days (Monday, Tuesday, Thursday, Saturday) are hand-authored
directly from the Missal, verified twice against both scans (C23); Holy
Wednesday and Good Friday are genuinely multi-lesson liturgies with no
single Epistle slot and are deliberately left unanswered, not guessed (C24).
The Lenten Ember days were still dead keys: Temporal_ef computes
ef-lent-ember-{wed,fri,sat}, lectio's ini names the same data
ef-lent-1-{wednesday,friday,saturday}, and colitur_keys never translated
it -- both engines independently fell through to the same wrong ferial
answer, so even the differential stayed green (C22, a genuine lectio bug
recorded for upstream). Fixed the instance and the class: colitur_keys
gained the rename, and tools/bootstrap_lectionary.ml gained
assert_reachable, sweeping Rite_ef.Temporal_ef.temporal at generation time
so a translation table entry naming a slug colitur never computes dies
loudly instead of shipping silently, plus an informational log of every
real slug with no entry at all.
C21 ("colitur's step 3 cannot reach a correct answer for the fixed
Christmastide slugs") is retired, superseded rather than merely patched:
the Nativity-Octave days now have their own direct Missal formulary
(Tit. 3,4-7/Luc. 2,15-20, "Diebus infra octavam Nativitatis Domini"),
resolved at step 2, not step 3 at all. That surfaced a real RG 69 gap
underneath it: a Sunday landing 26-31 December should keep its own Office,
not the fixed weekday placeholder, which Temporal_ef does not currently
distinguish. C6's verdict is re-opened (open, not colitur) for the 19 of
its 138 rows where this applies directly, and a new entry C25 (57 rows)
records the same gap propagating one hop further through step 3 into Holy
Name week. Both are out of this task's own scope -- a behaviour change to
a shared, multi-round-reviewed kernel-adjacent function -- and recorded,
not fixed, per the coordinator's own instruction.
C6's own note is rewritten in full rather than layered with another
correction; C18's stale trailing count is fixed to match its own pin; the
Vigil-misapplication risk flagged as a Minor closed itself once the
Nativity-Octave fix landed, confirmed by inspection rather than assumed.
dune test: 358/358. COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force: 359/359.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Layer 3 is NOT blind to the ferial resumption rule, unusually for this
project: lectio implements the same rubric independently, so the differential
checks colitur's rule against a second implementation rather than against
silence.
It IS blind to the Commons -- lectio has no such concept -- so chain step 4
rests on layer 4 alone.
Divergence triage, 1 532 of 16 801 days differ (15 269 match exactly),
0 unexplained:
- A genuine colitur bug found and fixed: data/ef/lectionary.sexp carried
lectio's own ini section names verbatim, never translated into the slugs
Temporal_ef actually computes for the identical office. Data the bootstrap
already held (Passiontide both weeks, the Pentecost Ember days, Holy Name
Sunday) was unreachable by chain step 2, silently falling through to a
wrong step-3 answer -- invisible until citation content became comparable.
tools/bootstrap_lectionary.ml gained colitur_keys (rename/widen), a
hand-authored ef-nativity-vigil entry cross-sourced from lectio's own
sanctoral calendar and corroborated by colitur's own (overlay-suppressed)
sanctoral bootstrap of the same source, and a derived ef-holy-name entry
(RG 17(a)'s single Mass heading covers both the Sunday and 2-January
shapes). One guess (giving the fixed Nativity-Octave days Holy Name
Sunday's own citation uniformly) was tried and reverted once measured
against the fixture -- Missal-verified to be right only for the genuine
"Sunday within the Octave" case, wrong whenever the true preceding Sunday
is Christmas Day or Advent IV instead.
- 10 existing/widened Layer C entries (C1/C6/C8/C14/C15/C16/C17/C18 --
C6 and C17 narrowed with the removed population accounted for, not
silently re-absorbed) plus two new ones: C19 (the already-adjudicated
Time-after-Epiphany week-numbering offset, now visible in citation
content), C20 (lectio computes no reading at all for the seven
readingless saints Task 6 gave a Common or proper -- colitur is more
complete, not wrong).
- One entry, C21, is a genuine colitur LOGIC limitation found but not
fixed: Lectionary_ef.readings' step 3 is a single hop to the preceding
Sunday, insufficient for a run of colitur-only fixed Christmastide slugs
whose own preceding Sunday is itself another entry-less fixed slug.
Recorded verdict open (data/ef/expected-divergences-missalemeum.sexp's
own established precedent for this shape), not left silently failing --
fully diagnosed in task-8-report.md, recommended as a dedicated
follow-up task rather than a hasty fix to a shared, multi-round-reviewed
kernel-adjacent function.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fifteen class-3 saints had no readings anywhere in colitur -- the 6 March -
5 April cluster whose RANKS lectio's generator fix of 2026-08-12 restored
without backfilling readings, and lectio has no Commons concept to have
backfilled them from. They are exactly the fifteen `status Feast` entries in
data/ef/sanctoral.sexp carrying `(citations ())`.
The Missal splits them eight/seven, and NOT as the plan predicted. It
expected propers for Benedict, Patrick, Thomas Aquinas and Gregory the
Great; only Thomas Aquinas has one. Benedict ("Missa Os iusti, de Communi
Abbatum"), Patrick ("Missa Statuit, de Communi Confessoris Pontificis I
loco") and Gregory the Great ("Missa Si diligis me, de Communi unius aut
plurium Summorum Pontificum") are all sent to a Common, with only Oratio,
Secreta and Postcommunio printed at the date. All three reversals verified
on the page images (pp. 488, 492) as well as in both OCR text layers.
PROPERS (data/ef/adjustments.sexp, `Edit ... Set_citation`):
thomas-aquinas 7 Mar Sap 7:7-14 / Mt 5:13-19
john-of-god 8 Mar Eccli 31:8-11 / Mt 22:34-46
forty-holy-martyrs 10 Mar Hebr 11:33-39 / Luc 6:17-23
cyril-of-jerusalem 18 Mar Eccli 39:6-14 / Mt 10:23-28
gabriel-the-archangel 24 Mar Dan 9:21-26 / Luc 1:26-38
john-damascene 27 Mar Sap 10:10-17 / Luc 6:6-11
john-of-capistrano 28 Mar Sap 10:10-14 / Luc 9:1-6
francis-of-paola 2 Apr Philipp 3:7-12 / Luc 12:32-34
COMMONS (data/ef/commons.sexp), each quoting the Missal's own instruction at
the saint's date:
sts-felicitas-perpetua 6 Mar non Virginum I Eccli 51:1-8,12 / Mt 13:44-52
frances-rome 9 Mar non Virginum II Prov 31:10-31 / Mt 13:44-52
gregory-the-great 12 Mar Summ. Pontificum 1 Petri 5:1-4,10-11 / Mt 16:13-19
patrick 17 Mar Conf. Pont. I Eccli 44:16-27;45:3-20 / Mt 25:14-23
benedict 21 Mar Abbatum Eccli 45:1-6 / Mt 19:27-29
isidore-of-seville 4 Apr Doctorum 2 Tim 4:1-8 / Mt 5:13-19
vincent-ferrer 5 Apr Conf. non Pont. I Eccli 31:8-11 / Luc 12:35-40
Every value read in three independent places -- both OCR text layers (two
DIFFERENT printings, whose Commune Sanctorum pagination differs by 1-2, so
the data keys on heading plus Mass incipit and never on the bracketed page
number) and the rendered page images. That caught a genuine typographical
error in one printing: it gives St Gabriel's Gospel as "Luc. 2, 26-38" (on
the page image, so not an OCR artefact). Luke 1:26-38 is settled by the
other printing, by the pericope text in both, and by the SAME edition citing
the identical pericope correctly two pages later at the Annunciation.
Step 4 EXECUTES SECOND (order 1, 4, 2, 3), not last as the plan sketched.
Measured: every day on which one of the fifteen is actually the observed
office already has a non-empty step-2 or step-3 answer waiting, so a step 4
placed after the ferial fallback is unreachable on every date in 1583-9999 --
and wrong where it would fire (2038-03-06 would emit Septuagesima II
Saturday's Mass on a day whose office is Sts Perpetua and Felicity). Step 4
is also the only step in the chain with a direct primary-source warrant: the
Missal names the Mass at each such saint's own date, while steps 2 and 3 rest
only on lectio's observed behaviour. Guarded so it can never divert a day
whose observed office IS its temporal office -- ferias, Sundays, the Triduum
and the RG 78 Saturday Office of the BVM (which deliberately shares the
ferial slug) are structurally excluded. Step NUMBERS are unchanged so every
"step 3" already written down still names the same branch.
The Commons are caller-supplied, like the lectionary: `Rite_ef.context` gains
a REQUIRED `~commons`, not an optional one -- a silently-defaulted empty
table would give a rite whose class-3 saints quietly lose their Mass, and
nothing in layers 3-5 compares citations, so that loss would be invisible.
`Commons.load` rejects the four defects indistinguishable downstream from
"this saint has no Common": duplicate common id, duplicate assignment, empty
formulary, assignment naming a common that does not exist.
KNOWN LIMITS, recorded rather than papered over. There is no oracle: lectio
has no readings for these feasts and missalemeum's 2026-2027 window never
observes one of the fifteen. Eight of the fifteen are NEVER the observed
office anywhere in the domain (10-28 March always falls to a Lenten or
Passiontide feria that outranks a III-class feast), so they have no
end-to-end witness and are covered by dedicated table tests instead. The
Commune Sanctorum's own opening rubric permits any Epistle or Gospel of a
Common in any Mass of that Common unless one is assigned, so what is emitted
is the reading PRINTED WITH the named formulary, not the only lawful one;
labelled alternatives (e.g. the widow's Epistle 1 Tim 5:3-10, squarely
available to St Frances of Rome) are noted in the data and deliberately not
encoded. The BVM Common is NOT authored: the RG 78 Saturday Office shares the
ordinary ferial slug, so assigning a Common to it would hand the BVM Mass to
every feria sharing that slug; routing it needs a subject-keyed lookup and a
season-keyed choice among the Missal's five "Missae de sancta Maria in
sabbato" -- new behaviour, not new data. It currently emits its feria's Mass,
now pinned as such.
Blast radius, measured (git archive HEAD binary vs HEAD, full 1583-9999
`colitur day` sweep, diffed): ZERO differing lines, 3 074 246 lines each
side, byte-identical -- the CLI prints no citations, so this change is
invisible to layers 2-5 by construction, and the sanctoral overlay perturbed
nothing else.
357 tests green (344 before), 358 with the exhaustive sweep. Mutation-tested
six ways, all reverted after confirming: relegating step 4 to last reddens
exactly the four step-4 pins and nothing else; corrupting a Common's citation,
dropping an assignment, dropping a proper Edit, and corrupting either an
unreachable proper or an unreachable Common each redden their own pins. The
load-bearing assertion is stated over the loaded layer rather than a
hard-coded list: every sanctoral entry that can ever BE the observed office
now has either a proper or an assigned Common -- fifteen failures before,
zero after, and a future re-bootstrap adding a readingless class-3 feast
fails there instead of silently emitting its feria's Mass.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Critical (coordinator review): a clean `dune build` produced a `colitur`
that died at startup on EVERY subcommand, including ones touching no
lectionary data at all. Root cause was two-fold: data/ef/lectionary.sexp was
never added to the root default-build alias (only materialised as a side
effect of the test suite's own deps, which is why every check in the prior
report passed), and Rite_ef.context loaded it as a module-init side effect
via failwith, undoing Lectionary.load's own "never raises" promise at a
point no caller could catch.
Fixed structurally: Rite_ef.context is now a function taking ~lectionary,
Lectionary_ef.readings takes ~lectionary, and neither touches the filesystem
any more -- the same caller-supplied discipline the sanctoral layer already
had, restoring rite_ef.mli's own pre-existing claim about it and leaving a
seam for a future diocesan lectionary overlay. bin/main.ml grows
load_ef_lectionary, a sibling of load_ef_layer, routed through the same
colitur: %s / exit 2 path. data/ef/lectionary.sexp added to the root default
alias. Every caller of Rite_ef.context updated to supply it.
Also: two new tests that genuinely distinguish chain step 1 from step 2
(19 March 2026, Joseph's own proper over a competing temporal entry; 13
January 2030, Holy Family reached only through the temporal slug, the
Baptism entirely absent) -- the prior two tests both survived swapping the
chain order. Both new pins verified directly against the real data. The
chain's own comment now states plainly that its warrant is lectio's observed
behaviour, not a confirmed Missal citation, per the rules register's own
open item.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Full re-extraction of the primary CALENDARIUM (both photographic scans,
missale-romanum-1962.pdf and Missale Romanum 1962_text.pdf, rendered page
images read directly rather than trusting either PDF's own OCR text
layer) against all 327 base sanctoral entries plus the two prior overlay
Adds. Both scans agree throughout; no OCR ambiguity required adjudication
this round.
Add `barbara` (4 December): both scans carry a Commemoratio nested under
Peter Chrysologus's own entry, absent from data/ef/sanctoral.sexp AND
from lectio's own tridentine-calendar.ini (confirmed directly) — the same
upstream-gap shape as the five entries the ef-rebootstrap task already
added (agnes-secundo/boniface-martyr/eusebius-confessor/evaristus/
theodore).
Correct 21 sanctoral colours against RG 124 ("De coloribus paramentorum"),
scan-verified word for word: 124(b) red for an Apostle/Evangelist's own
feast day except John's (27 December, already correct); 124(e) red for a
Martyr's own martyrdom; RG 117's five-colour residual otherwise white.
Every one of the 21 is a confirmed lectio/missalemeum bootstrap defect —
checked individually against lectio's own ini, several of whose Polish
name fields already contradict that same record's own colour tag (e.g.
`martha`: "Dziewicy", Virgin, no "Męczennicy", yet `colour = red`) — the
identical root cause and mechanism the `eusebius-confessor` fix already
established. Colour is confirmed read nowhere in Precedence_ef's
resolution logic (grep), so these are output-correctness fixes with zero
observed-office blast radius; three (apollinaris/josaphat/chair-of-st-
peter) additionally disagree with missalemeum's own oracle, not only with
lectio, so they are adjudicated from RG 124's text directly rather than
by which engine happens to agree.
Both corrections applied via data/ef/adjustments.sexp's established
Overlay mechanism (data/ef/sanctoral.sexp stays generated, untouched).
Pinned: test_rite_ef.ml (two new tests, verified to fail against the
pre-fix data); test_differential.ml's new C18 predicate (526 rows,
2005-2050) and test_oracle.ml's new M21/M22 predicates (20 + 2 rows,
2026-2027), each with data/ef/expected-divergences{,-missalemeum}.sexp
entries citing RG124 or the matching upstream-gap precedent;
test_golden.ml's 1902-02-22 pin corrected (chair-of-st-peter was white in
the stale pin, RG124(b) makes it red). All 329 tests green, including the
full 1583-9999 exhaustive sweep.
Full method, per-entry adjudication table and corrected bucket counts:
docs/research/rules-register.md (gitignored) and
.superpowers/sdd/2026-08-12-colitur-rg16a/sanctoral-audit-report.md
(gitignored).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The BVM Saturday Office is itself "de B. Maria Virg."; RG 112(d) (Caput
XVI, "De Commemorationibus") excludes another commemoration whose own
oration invokes the SAME BVM's intercession. our-lady-of-mt-carmel (16
July, Commemoration_only) was wrongly admitted as an ordinary
commemoration alongside the Office on every 16-July-Saturday -- its own
collect explicitly invokes "her" (eius) patronage, and both photographic
scans print a rubric anticipating exactly this collision (an either/or
of Mass texts, not a joint commemoration).
Precedence_ef gains marian_slugs (a closed, hand-verified list of
sanctoral slugs that are themselves feasts of the BVM) and is_bvm_office
(true for subject = Bvm OR a marian_slugs member -- the disjunction is
load-bearing: the Office is identified only by subject, since its own
slug is deliberately reused from the ordinary ferial fallback; Mt Carmel
is identified only by the list, since its own subject tag is Saint, not
Bvm). disposition gains a new branch, checked before the pre-existing
Commemoration_only catch-all, since the one live witness is
Commemoration_only and that branch's own "always Commemorate" had no
exception for this shape.
Checked exhaustively against every Marian-named sanctoral entry: only
Commemoration_only-status entries can ever reach this branch live (a
Feast-status one always wins outright instead of losing). Of the two
such entries in the data, only Mt Carmel is reachable --
our-lady-of-ransom (24 September) is provably unreachable: 24 September
falling on a Saturday forces 1 September to a Thursday, which by
construction makes 24 September the September Ember Saturday, Class2,
every time, not a sampled coincidence.
Re-measured against the full pre-change binary: the original 75,853-day
blast radius is unchanged in total, splitting into 74,633 colour-only +
1,220 colour+comms (16-July Saturdays). Mutation-tested: exactly 3 new
tests redden, nothing else.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The BVM Saturday office is now genuinely correct, so both comparators'
allow-lists move -- every count derived from the harnesses' own failure
output, never transcribed or guessed.
lectio differential (data/ef/expected-divergences.sexp, C17, new,
colitur): lectio builds no equivalent office at all, so it keeps
showing the plain season colour on every otherwise-unoccupied Class4
Saturday where colitur now shows white. Season, slug and rank all still
agree (the office deliberately reuses the ordinary ferial slug), so
Colour_f alone is the complete diff set -- gated on colitur's own
rank/weekday/colour rather than a date list, the same shape M2 used, at
416 rows over 2005-2050.
missalemeum oracle (data/ef/expected-divergences-missalemeum.sexp): M2
is CLOSED, REMOVED, the same shape as this file's own M4/M6/M7/M9/M12/
M14/M17 precedents -- not re-adjudicated to a different verdict, gone
because the colour divergence it named no longer occurs on any of its
former 22 dates. What is left on all 22 is Observed_identity_unresolved
alone (colitur's BVM-Saturday candidate is temporal-origin and
deliberately carries no English name) -- exactly M18's own shape, not a
distinct citation any more. Keeping M2 as a separate id would have kept
silently absorbing these rows under a stale "colour differs" citation
whose own reason had stopped firing (subset's own diff-set test admits
a SMALLER set than the one named) -- the same "count proving cardinality
where identity was required" trap this project's review process
watches for. M18's own expected_rows moves 373 -> 395 accordingly.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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").
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Before this task's Holy Family fix, colitur's generic Sunday
fallback lost outright to the fixed Commemoration of the Baptism of
the Lord on 13 January whenever it fell on a Sunday, producing the
SAME slug lectio's own tridentine-calendar.ini shows there --
squarely inside C1's own 6-13 January blanket (only Season differed).
Now that Holy Family (RG 17(b)) correctly outranks the fixed Baptism
and excludes it as a commemoration (RG 91 entry 14, RG 112(a)),
colitur's own slug on those seven dates (2008, 2013, 2019, 2030,
2036, 2041, 2047) changes to ef-time-after-epiphany-sunday-1 -- a
genuine identity divergence against lectio, which has no Holy Family
at all. C1's own predicate does not absorb it (jan_6_13_slug has no
entry for that slug), so it surfaced as unexplained, exactly the
check the task brief asked for: split it out into its own cited
entry rather than widening C1's predicate to swallow it silently.
C1's own expected_rows moves 368 -> 361 (back to its pre-rebootstrap
value, for a third and different reason than either of the first two
moves recorded in its own note); the new C15 covers the 7 rows,
gated on the literal date list AND colitur's own slug, the same
identity guard C1/C6/C8/C14 already apply.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Both are the "cardinality where identity was required" flavour, and both
were demonstrated passing a real defect by the fixture-refresh review
rather than argued.
C6 accepted `subset diffs [ Slug_f; Rank ]` while its own note said the
shape had narrowed to slug-only after lectio's Christmas-octave rank was
corrected. That did not merely over-permit: every one of the 138 rows
already carries a Slug_f diff, so an added Rank diff changed neither the
diff-set membership nor the count, and the entry was blind. Dropping the
RG 91 entry 17 elevation in temporal_ef (Class2 -> Class4 on octave days
5-7) left both differential tests green with C6 still reporting 138.
Narrowed to `diffs = [ Slug_f ]`; the same mutation now reddens both.
C14 gated on lectio's date alone, with no colitur-slug guard, though fix
round 1's finding 1 had established that a predicate must pin which
celebration its citation is about -- C1, C6 and C8 all carry that guard.
With compare_deferred switched to RG 98 origin order the observed
celebration flips to the Annunciation on all three dates, and C14 still
matched exactly 3 rows with its count pin green; the suite reddened only
because the sibling dates fell outside every predicate. Guard added.
No behaviour change: 277 tests green, and the allow-list counts are
unmoved (C6 138, C14 3).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
lectio moved 2386a45 -> 3b32c00 (seven EF calendar defects fixed, plus a
sanctoral-generator root-cause fix); the committed fixture predates all
of them. Regenerated with the same command the provenance note already
named (`go run ./cmd/lectio-ef-dump 2005 2050`), read-only against
lectio -- nothing there was touched. New SHA-256 asserted in both the
provenance note and test_differential.ml's fixture_sha256. The dumper's
two new name_en/name_pl columns are kept verbatim (the fixture is meant
to be the exact command's raw output; the comparator already discards
everything past field 7).
Every C-entry's expected_rows was re-derived independently against the
refreshed fixture (a Python re-implementation of diff_fields/
layer_c_reason, cross-checked against the real OCaml comparator's own
failure output), not transcribed from a green run. Nine entries -- C2,
C3, C4, C5, C7, C10, C11, C12, C13 -- now match zero rows and are
closed: sexp row removed, layer_c_reason predicate and its now-dead
helper bindings removed, citation preserved in
docs/research/rules-register.md's new §3d with the specific lectio
commit that fixed each one. C1 (361 -> 368) absorbs C13's former 7 rows
now that lectio's own slug matches there too. C6 (138, unchanged count)
narrows to a slug-only shape now that lectio's rank agrees. C8 (31,
unchanged) survives untouched -- lectio still computes no Rogation days.
C9's old shape ("Joseph observed ON a Lent Sunday") is also closed, but
a narrower, different divergence survived under the same saint's slug: 3
years (2008, 2035, 2046) where Joseph's own congested RG96 walk collides
with the Annunciation's separately-transferred "sedes propria". The old
predicate's broad "any diff involving this slug" match was silently
absorbing both under one citation -- split into a new id, C14, rather
than folded back into C9, since the two are unrelated rules. lectio's
own commit history (09a1444) documents this residual as a gap it
deliberately left unresolved; colitur gives Joseph a real transferred
day either way, which is why C14's verdict stands regardless of a
genuinely open sub-question (recorded in the register, not resolved
here) about which of the two feasts should claim the contested day
first under RG98's "prius impeditum" wording.
Re-triaged the full remaining 4975 raw differences: only 10 distinct
field-diff signatures now, all resolving to Layer A/B noise or the four
surviving citations, 0 unexplained. The crude "Sunday-rank" and "Holy
Thursday" residues the task flagged both fully resolve once the real
Layer A/B machinery runs (season-spelling and week-numbering artifacts,
not substantive divergences) -- see the task report for the derivation.
Teeth proof: perturbing ferial_rank to reproduce C4's old defect made
140 rows reappear as unexplained (the exact prior C4 count), reverted
after capturing the failure message.
277 tests green (dune test) and 278 with COLITUR_EXHAUSTIVE_SWEEP=1 (the
extra case is the 1583-9999 sweep itself).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
13 January retagged subject=Lord (previous commit's regeneration) makes
RG16(a) fire on the 7 years it falls on a Sunday within 2005-2050 (2008,
2013, 2019, 2030, 2036, 2041, 2047): colitur now observes the Baptism of
the Lord itself where it used to observe the generic Sunday slug. The diff
signature against lectio's fixture widens from {season;colour} to
{season;slug;colour} -- but jan_6_13_slug already pre-authorised this exact
slug across the whole 6-13 January window (correctly, for the other 39
non-Sunday years), so layer_c_reason routed the new, wider-shape rows into
C1 unchanged, and C1's own expected_rows (a pure row count) did not move.
A count proving cardinality where identity was required -- on the one day
this branch itself already flags as still wrong under RG 112.
Split into its own entry, C13, matched by an exact 7-date literal list
checked before C1 in the if/elif chain. C1's own expected_rows corrected
368 -> 361 (independently re-derived: a Python script reading
data/ef/sanctoral.sexp's regenerated output and the committed lectio
fixture directly, replicating diff_fields/layer_c_reason's own logic
outside the OCaml comparator -- not transcribed from the failing
comparator's own count).
C13's own citation records a refinement over the coordinator's framing,
checked directly rather than assumed: lectio's committed fixture is a
frozen snapshot that predates lectio's own equivalent fix to this entry's
class field (the same staleness shape as C12). Confirmed by building
lectio's own cmd/lectio-ef-dump from its current source tree (read-only)
and running it fresh for all 7 dates -- lectio's LIVE engine now agrees
with colitur's slug/rank/colour exactly, disagreeing only on season (the
already-understood C1 divergence). This is not evidence colitur's answer
is right against the Missal -- it is not (register's own RG112 item) --
only that this specific divergence from the fixture is a staleness
artifact, not a live disagreement between the two engines' current logic.
Also fixes F5: C12's own note said "5 of the 15 corrected slugs" while
listing and counting 7 -- corrected to 7.
Also corrects the module header's stale "13 January ... slug/rank/colour
already equal lectio's exactly, in all 46 years" claim (true only for the
39 non-Sunday years now).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Re-bootstrapping sanctoral.sexp (previous commit) makes 7 of the 15
newly-corrected III-class feasts win an occurrence they previously lost as
Commemoration_only: RG 91 entry 24 (a universal III-class feast) outranks
entry 28 (a IV-class feria), and the occurrence code that resolves this
already existed and needed no change. lectio's own committed differential
fixture (test/fixtures/lectio-ef-2005-2050.txt) is a frozen snapshot
predating lectio's own equivalent generator fix, so it still shows the
class-4 feria observed with the same saint only as a trailing
commemoration -- a new, expected divergence from that fixture, 14 rows in
the 2005-2050 window.
expected_rows (14) is independently re-derived by grepping the regenerated
sanctoral.sexp's own post-regeneration civil-day output against the
committed lectio fixture directly (two flat-file extractions cross-checked
against each other), not transcribed from the comparator's own failing-test
output.
C12 reuses an id last used, and removed, by the RG16(a) task's own reverted
Purification retag -- noted at both the old and new entries' own comments
so the id's history is visible to a future reader.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Both entries carried (subject Lord) in data/ef/sanctoral.sexp, inherited
unchecked from lectio's own class = lord field. The calendarium says
otherwise: 2 February reads "IN PURIFICATIONE B. MARIAE VIRG." and
12 September reads "Sanctissimi Nominis Mariae" -- both name Mary, not
the Lord, unlike the four genuine Lord entries' own "D. N. I. C."
formula (Precious Blood, Transfiguration, Exaltation of the Holy Cross,
Dedication of the Archbasilica of the Most Holy Saviour), all of which
were checked against the same calendarium and left untouched.
This matters together with RG16(a): applying the rule while the
Purification was still mistagged Lord would have made it outrank an
occurring II-class Sunday and then wrongly suppress that Sunday's own
commemoration under RG16(a) too, the opposite of the intended fix.
Retagged, the Purification no longer bands at RG91 entry 14, so the
Sunday is observed and the Purification survives as its own ordinary
commemoration.
Corrected via a new data/ef/adjustments.sexp overlay (Set_subject Bvm),
the same mechanism that file already uses to suppress vigil-of-christmas
as a bootstrap duplicate, not a hand-edit of sanctoral.sexp itself: that
file's own header asks for edits to go through the generator, and its
SHA-256 provenance covers a byte-faithful mirror of lectio's INI. The
Purification retag changes which day the lectio differential observes on
2 February whenever it falls on a Sunday (six years, 2005-2050); allow-
listed as C12 in data/ef/expected-divergences.sexp, expected_rows derived
independently (date -d <year>-02-02 for each year in range), not
transcribed from a comparator run.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
RG 128(b) excepts "Missa sive Chrismatis sive in Cena Domini feria V
Hebdomadae sanctae" from the Septuagesima-to-Easter-Vigil violet span
as a whole-Mass exception (unlike Palm Sunday's blessing/procession,
which the same sentence carves out as only part of that day) -- so
Holy Thursday's Mass is white, not violet. temporal_ef.ml fell through
to the generic Passiontide ferial path (season_colour Passiontide =
violet) for this date, since [named] has no entry for the Triduum at
all (rank was already correct via [privileged_feria]; only colour was
wrong).
Found via Task 16's missalemeum oracle comparison: every other Triduum
day's oracle colour set includes violet as an option (Good Friday
"bv", Holy Saturday "vw" -- already-flagged, deliberately deferred
per-action gaps, register §3b), but Holy Thursday's is white alone.
This is a genuine NEW divergence from lectio too (lectio has no such
exception and still prints violet for Holy Thursday) -- added as
Layer C11 to the differential harness and data/ef/expected-divergences
.sexp, 46 rows (2005-2050), rather than silently changing what that
harness accepts.
Also corrected a stale comment on season_colour claiming white's RG
paragraph was never pinned -- RG 119 was found and cited in the
register on 2026-08-11 but the correction was never copied into this
file's own comment.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fix round 1 on Task 15's review, four findings closed.
C1 and C6 previously gated on calendar date alone -- unlike every other
Layer C entry, which also checks the actual colitur slug that won. A
future sanctoral change producing an unrelated celebration with the same
diff shape (e.g. a promoted 29-31 December saint landing on C6's own
[Slug_f; Rank]) would have been silently absorbed under a citation that
has nothing to do with the real cause. Both entries now require, whenever
Slug_f is in the diff set, that colitur's own slug be a member of an
explicit closed list (jan_6_13_slug, nativity_octave_day_slugs) -- the
same style advent_feria_slug already used for C4. Constructed the exact
substitution via a temporary (unshipped) overlay Replace directive
promoting thomas-becket to Class1 Feast White; confirmed the tightened
predicate refuses to absorb it (46 unexplained rows, one per year); reverted.
C10 gained the diff-field-subset restriction every other entry already
had (it previously fired on the two pinned dates regardless of which
fields differed).
Fixed a stale doc comment ("SIX" columns; field has five constructors).
The fixture's provenance note now records its SHA-256, and the suite
asserts it as its own first test case (test_fixture_checksum), so a
hand-edited or partially re-copied fixture fails loudly instead of
silently becoming an unlabelled snapshot. Computed via the system
sha256sum binary through Sys.command plus a redirected-output temp file
-- no new library dependency, not even unix. Constructed a one-byte
fixture edit and confirmed the checksum test fails independently of the
row-comparison test; reverted.
237/237 tests green, clean-build verified.
|
|
|
Validation layer 3 (design spec's five): compares colitur's real day-by-day
EF output against lectio (sibling project, Go), 2005-2050, one line per
civil day. Of 16801 day-pairs, 11206 already agree on the seven leading
columns; the 5595 that don't resolve into exactly 25 distinct field-diff
signatures, all triaged.
Three strictly separate layers, per the controller's ruling (the brief's
single flat allow-list assumed a handful of differences, not 5595):
- Layer A (test_differential.ml, norm_season/norm_slug): vocabulary. An
explicit, closed table of naming synonyms with no liturgical substance
(lectio's easter/christmas vs colitur's paschaltide/christmastide; a
handful of slugs that are two names for the identical office). No
wildcards -- every entry is a literal string pair.
- Layer B (strip_epiphany_index): numbering. The one slug family whose
lectio/colitur index offset is not a constant (Time-after-Epiphany week
numbering, register 3c#5) has its embedded digit stripped to a common
form on both sides before comparing; rank and colour stay fully compared.
- Layer C (data/ef/expected-divergences.sexp): the cited allow-list. Ten
genuine liturgical disagreements, each citing its RG paragraph and
naming which engine is right (always colitur, verified against the
Missal/register, never against lectio's own behaviour). This is the
only layer permitted to cover a difference in rank, colour, or which
celebration is observed. Five extend or restate register 3c's already-
documented divergences (season boundary, Sunday I-class, Advent Ember
ferias, Rogations); five are new, found and adjudicated in this task
(Lent Ember days, the Nativity Octave, Ember-day-vs-saint precedence,
the St Joseph transfer off a Lent Sunday, and the 2011 Sacred Heart /
Precious Blood / Visitation collision). expected_rows on each entry is
an exact regression pin, asserted by the test, not documentation.
13 January (register 6's long-open "Baptism of the Lord" item) is
confirmed empirically fixed already -- Task 11's sanctoral wiring closed
it before this task started -- so it is not allow-listed; the only
residual difference there is the season boundary already covered by C1.
Two stated limits carried from the brief (commemorations are not
comparable; lectio's own EF oracle asserts season only, 2025-2026 only,
so a rank/colour difference is not presumptive evidence against colitur)
plus a third found during this task (the week column is a display
convention on both sides, not a liturgical fact, and is not compared at
all) are documented in the test file's own doc comment.
Fixture: test/fixtures/lectio-ef-2005-2050.txt, committed as plain text
(1.4 MB), generated by lectio commit 2386a45; provenance recorded in the
sibling .provenance file. Colitur's side is recomputed fresh from the
library on every run, through the same Calendar/Rite_ef pipeline
`colitur day` uses, not the compiled binary.
Proved the harness has teeth by two reverted perturbations: a genuine
colour difference injected into a fully-covered fixture row fails the
"no unexplained differences" check with the exact mismatched row printed;
a one-row drift in an allow-list entry's expected_rows fails the count
check independently, showing it is not merely a duplicate of the first
assertion. 236/236 tests green, clean-build verified, deterministic
across OCAMLRUNPARAM=R.
|