| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
| |
119 entries, Epistle + Gospel only. The generator refuses a section carrying
exactly one of the two: an Epistle without a Gospel is malformed and wants
investigating, not shipping. SHA-256 of the source INI is in the provenance
header, as with sanctoral.sexp.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Sexplib.Sexp.load_sexp raises bare Failure for several malformed inputs
(unterminated list/string, empty file, more than one sexp) rather than
Sexplib.Sexp.Parse_error, so those cases escaped Lectionary.load as an
uncaught exception -- breaking the .mli's own promise and the kernel's
never-raises-on-fallible-construction constraint. Mirrors the catch-all
already present in Layer.load and Overlay.load, plus a second catch-all
on the t_of_sexp branch for defence in depth.
Adds test_load_never_raises, covering all of the above plus a missing
file, using Filename.temp_file rather than a hardcoded path. Verified the
new test fails against the pre-fix load (uncaught Failure) and passes
against the fix.
|
| |
|
|
|
|
|
| |
Data only, the same shape and discipline as Layer: slug-canonical,
duplicates rejected at construction naming the offending slug, sexp
round-trips. Which slug a day falls back to is a rubric and belongs to the
rite module, so nothing here knows about ferias or Sundays.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
M21 accepted `subset diffs [Colour_f; Comm_identity_unresolved]`, so a row
with no colour diff at all could be absorbed under a colour citation. The
unresolved allowance existed only for the 22 February rows the previous
commit reverted; with those gone the predicate tightens to exact equality
on Colour_f, matching C18's shape, and stays green.
Records two things the audit's bucket summary did not carry. The effective
dataset is 329, not 328: base 327 plus three overlay Adds minus one
Suppress, so commemoration-of-st-peter and major-litanies fall outside
both buckets despite being in the stated scope, and a suppressed entry is
counted as verified. And the summary says colour was "independently
checked against RG 124" for every entry where much of it is inferred from
the saint's category rather than read -- the per-entry basis column makes
that distinction and the summary line erases it.
Also records that "zero blast radius" holds only for the observed office:
49766 commemoration-colour changes on 8 slugs are real data changes,
invisible because the CLI omits commemoration colour.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The sanctoral audit set chair-of-st-peter (22 Feb), conversion-of-st-paul
(25 Jan) and peter (25 Jan, commemoration) to Red on RG 124(b). All three
are reverted to White.
RG 120(f), fifteen lines above RG 124(b) in the same column of the same
page, names two of them in its enumeration of white: "Cathedrae S. Petri
(22 februarii); Conversionis S. Pauli (25 ianuarii)". RG 124(b)'s own
qualifier "in eorum die natalicio" independently excludes them, and RG
475(e) confirms it a third time by naming the Chair separately from
"natalician feasts of Apostles". lectio and missalemeum both said white
because both were right. peter rested on "match the host day's Red",
whose host is white by that same clause, so the precedent inverts.
Root cause: the audit's page-image method, its real advance, was applied
to the calendarium and not to the rubric. RG 124 was read from the OCR
text layer, where the two-column interleave shreds RG 120(f) across rows
belonging to RG 115 and hyphen-splits Cathedrae, so a text-layer grep
for it returns nothing while RG 124's enumeration survives cleanly. That
read finds 124 and structurally cannot find 120(f).
Two sentinels had been reporting this correctly and were overridden. The
golden pin at 1902-02-22 asserted colour=white, was changed to red, and
had its comment rewritten to guard against "a regression back to the old
one" -- the only pin asserting a colour for any of the 21 slugs. And C18
and M21 both listed the two slugs under an RG 124(b) citation where both
oracles were right. Pin restored; slugs dropped; C18 re-derived 526->450
from the observed-day counts, M21 20->18, M15 17->18.
The audit's own discriminator would have isolated these. Its stated
corroboration was that lectio's name.pl contradicts lectio's colour; run
as a gate across all 21 that splits 17 genuine defects from 4 needing
adjudication, and three of those four are these. It was quoted as
illustration rather than used as a gate.
18 of 21 corrections stand, and the twelve whites are recited to RG
120(e) "Sanctorum non Martyrum" rather than to RG 117's negative
residual. Also records Anastasia's deliberate non-fix in the tracked
tree beside barbara, where the next auditor will be standing.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
(fix round 1, F1)
The prior fix (settled_at) recognised two settlement channels for a
transferred candidate at its target -- winning outright (observed) or
surviving as a commemoration -- but missed a third: reaching the target
and then being CAPPED OUT there, by admit's own RG-111-style admission
count limit or by disposition's own Omit. That candidate lands in the
target's own omitted list, genuinely settled and accurately labelled, but
settled_at did not check that list, so the origin reported it as
unresolved under the same wrong, hardcoded unconverged_reason -- the exact
original bug, one level further out.
Unreachable on shipped EF data (the Major Litanies are the only privileged
Commemoration_only candidate real data carries, and no second one can ever
share Easter+2), but reachable by construction: a second privileged
Commemoration_only entry on the Litanies' own transfer target that
outranks it in admit's Class1 selection, or -- without any synthetic data
-- forcing the Litanies' own RG 109(f) privilege to Ordinary, which makes
the transferred candidate lose that same cap against its own real target.
Fixed by adding target-omitted membership as a third disjunct in
settled_at. New regression test in test_calendar.ml, built the same way:
the real EF layer plus one synthetic privileged Commemoration_only entry
on the real 2011 transfer target, sorting ahead of the Litanies so it wins
the Class1 slot. Mutation-verified to fail specifically when the third
disjunct is removed. COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force stays
clean after the fix, confirming it changes no shipped day's output.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
correction
M5 (the pre-existing register-cited gap this task closes) had a genuine
backwards claim in its own note: it said missalemeum's single admitted
commemoration on 25 April 2027 (the Sunday-conflict year) was "the Major
Litanies". Checked directly against the raw fixture row while adjudicating
this task's own new divergence -- missalemeum's own commemorations field
there is "St. Mark"; "Pro rogationibus" (the Litanies) is the one listed
as displaced. Corrected in place, both the .sexp entry and this file's own
header note. M5 itself now covers only the ordinary case (25 April 2026):
presence agrees now that the entity is built, identity does not (colitur's
own English name vs missalemeum's Latin-ish descriptive string), the same
declared comparator limit M15/M18 already document, hit here for a
different reason.
The real, substantive divergence the correction exposes: colitur now
admits the Litanies on 2027-04-25 where missalemeum admits Mark. New entry
M20, adjudicated colitur -- RG 109(f) places the Litanies in the same
closed privileged list as (a)-(e), and RG 111(b)'s own text is
unconditional ("the II-class commemoration is dropped if a privileged one
is due", no table-order qualifier). The same mechanism already
primary-source-verified and used for other RG 109 categories elsewhere in
this codebase; honestly flagged as the first real, non-synthetic test of
this specific admit clause, consistent with this oracle's own
already-documented pattern of RG 108-111 gaps (M1, M8, M10).
M18's own count moves 395 -> 394 (2027-04-25 no longer falls into "observed-
identity-unresolved alone"; it moved into M20), traced to the specific date
and mechanism, not merely re-baselined.
data/ef/expected-divergences.sexp (the lectio allow-list) needed no
change: lectio computes no Major Litanies at all, and its own row type
carries no commemorations field -- layer 3 is entirely blind to this
change, confirmed rather than assumed.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
test_precedence_ef.ml: a privilege_cases row for RG109(f), deliberately
rank Class4 so it cannot pass via the pre-existing "of a I-class day"
branch by accident. Three disposition_cases rows: the two RG80 trigger
shapes (Transfer, not Commemorate) and a synthetic third row proving the
winner-slug guard is specific to the two named trigger days, not "any
I-class winner". Two transfer_target unit tests, both using a pathological
always-blocking occupant to prove no RG96 search runs at all for this
candidate -- a much stronger witness than a cooperative occupant, which
could pass by accident.
test_golden.ml: three new pinned tests through the real data pipeline --
the ordinary case (2026-04-25, matches the oracle's own M5 date), the four
Sunday-displacement years in 2005-2050 (2010, 2021, 2027, 2032, RG111(b)),
and the Easter-Monday transfer shape (2011, complementing the
Easter-Sunday shape already pinned by the existing 1666/2038 Easter-extreme
tests, now widened to include the transfer and its target).
test_rite_ef.ml: the existing "no transfer lands inside the Easter octave"
property gets a named, cited exemption for the Major Litanies (RG80's own
deliberate exception), plus a positive companion test asserting the
exemption is not vacuous (exactly two landings in 2005-2050, both
Easter+2). That companion test was written but never registered in its
own suite list -- caught while mutation-testing the transfer (a mutation
that should have failed it passed silently); fixed by registering it.
Mutation-tested, each of the three parts separately (recorded in the
task's own report): moving the data entity off 25 April fails 7 tests
(golden + oracle only -- zero unit tests, since they build synthetic
candidates); corrupting the transfer's winner-slug guard fails 6 (the two
disposition_cases rows, 3 golden pins, and the newly-registered
transfer-count test); flipping the privilege to Ordinary fails 9
(privilege_cases, the disposition SYNTHETIC row, the oracle's count pin,
5 golden pins, and the exhaustive Validate property sweep).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Entry 27's band branch has been unreachable for the right reason since
it was written: precedence_ef.ml's own comment on it acknowledged the
row existed, but the one test exercising it built a hand-typed
candidate, never a real Temporal_ef.temporal output, and nothing built
the office itself. Closes that gap on both sides:
- The band-table row now sources its candidate from Temporal_ef.temporal
directly (of_temporal), the same review-finding-3 discipline the
Ember/vigil rows already use, so a future regression in the office's
own construction fails this row too, not only the unit-level test.
- Two new resolve-level end-to-end tests, using the real band/
disposition/admit triple (not stubs): the office winning a real
otherwise-unoccupied Saturday and admitting an ordinary commemoration
alongside it (1 August 2026, Holy Machabees -- the task brief's own
worked oracle example), and the office genuinely losing to a real
competing feast and being omitted under RG 26, with no confusion from
the one live data witness that also carries subject Bvm (12 September,
Most Holy Name of Mary) -- proving RG 26's rank-keyed omission fires
before any subject-keyed rule ever could.
- Two golden pins mirroring the same two dates, checked by hand against
`colitur day 2026` before being typed in, following this file's own
"a golden test blesses whatever it is given, verified independently"
discipline. The existing 2038-03-06 pin (RG 91 entry 24 outranking a
Class4 candidate) is corrected in passing: that date is itself a
Saturday, so the displaced candidate the pin's own omitted-list check
names is now precisely entry 27's own shape, not entry 28's bare
catch-all -- the win/lose outcome the pin proves is unchanged, only
its own more precise citation.
Mutation-tested (recorded in the task report): reverting
is_bvm_saturday to a constant false reddens the dedicated unit test, the
new end-to-end resolve test, and the 2026-08-01 golden pin, while
leaving the 2026-09-12 "loses to a real feast" pin untouched, exactly as
expected since that date's outcome never depended on the fix.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
RG 91 entry 27, "Officium sanctae Mariae in sabbato", sits in the Table
of Precedence between entry 26 (III-class vigils) and entry 28 (IV-class
ferias). Precedence_ef.band already routed a plain IV-class Saturday
feria to entry 27's own band value, but nothing in Temporal_ef.temporal
ever constructed the office itself, so an otherwise-unoccupied Saturday
still surfaced with a bare ferial slug and its season's ordinary colour.
Established from Caput IX of the Rubricae Generales, both photographic
scans and the electronic transcription, word for word (no
scan-vs-transcription conflict: RG 78/79 are General Rubrics prose, not
the Mass-propers body text the transcription is documented elsewhere as
missing almost all of):
"78. In sabbatis, in quibus occurrit Officium de feria IV classis, fit
de sancta Maria in sabbato.
79. Officium sanctae Mariae in sabbato incipit a Matutino et explicit
post Nonam."
RG 78's own protasis IS "otherwise unoccupied IV-class Saturday" --
every Saturday whose temporal candidate would otherwise be Class4,
across every season that rank reaches (Christmastide, Septuagesima,
Time after Epiphany, Time after Pentecost, ordinary Paschaltide).
Nothing else was needed to decide "otherwise unoccupied": band's own
entry-27 branch already reads rank/weekday on the temporal candidate
unconditionally and only wins the day when nothing outranks it -- RG
78's own condition, decided by the existing occurrence machinery.
Colour is white, unconditionally, per RG 120(b) ("Adhibetur color albus
in Officio et Missa de festis: ... b) B. Mariae Virg."), not RG 119/127/
128's seasonal rules -- this office is never "de Tempore" for colour
purposes, so it overrides the season's own violet/green.
The slug is deliberately left UNCHANGED (reused from whatever the
generic <season>-<week>-<weekday> ferial fallback would already have
produced), for two independent reasons: it matches the Sacred Triduum's
own precedent (identified structurally, off rank/weekday, never off the
slug), and a bespoke uniform slug would have broken
Colitur_kernel.Validate's own slug-uniqueness-per-liturgical-year
invariant, sighted zero times before this task -- confirmed directly by
writing it that way first and watching the landmark-years test fail.
Subject is tagged Bvm (currently inert for precedence -- only Lord is
ever read by band/disposition/admit) and the name is the Latin
"Officium sanctae Mariae in sabbato" (RG 91 entry 27's own table title
and RG 79's own heading), deliberately not English, the same
zero-circularity discipline Holy Family/Holy Name/the Sacred Triduum
already established.
The I-V numbered "Missae de sancta Maria in sabbato" (both scans) are a
Mass-propers selection detail (RG 309(a): "iuxta temporum diversitatem")
governing which readings/texts are said, not which office is kept --
colitur computes no citations yet (Plan 4), so this is deliberately not
modelled here.
Two pre-existing tests needed correction, not because they were wrong
before, but because RG 78 genuinely changes their dates' own facts: a
Saturday inside the Holy Name of Jesus window (3 January) and two
Saturdays inside christmastide_feria_slug's own "-0-"/"-2-" stretches
(26 December, 10 January) are all otherwise-unoccupied Class4 Saturdays,
so they now legitimately carry the BVM office instead of staying a bare
Temporal-subject feria.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two corrections from the fix-round review, both to the record.
"Sabbato Sancto" is attested zero times in either photographic scan. The
scans print SABBATO SANCTO as the heading (once) and "Sabbato sancto" as
the running header (28x and 30x); the shipped casing appears only in the
electronic transcription's table of contents -- the source this
project's own methodology rule deprecates -- while the comment beside it
called the value "both photographic scans, word for word". Recased to
the running-header form, which is the convention the other three Latin
names in the file already follow, with a source note recording the
count. Third source-fidelity slip this week, and the first where the
wrong value came from the deprecated source itself.
The Major Litanies deferral was recorded with two false blockers. It
claimed a kernel signature extension was needed to suppress the feast in
transfer years: admit already takes ~temporal and disposition already
takes ~winner, both carrying the Easter office on 25 April, so a
rite-local slug test does it with zero kernel surface. And it implied
Easter Monday is unmarkable: ef-easter-1-monday occurs exactly 8417
times in 8417 years, as reliable as ef-easter-sunday. So the guarded
build -- never scored -- is a strict improvement, 8223 years newly
correct against 194 unchanged, and "worse than the gap" was true only of
the unguarded one.
Deferring is still right, for a reason nobody had found: 25 April is St
Mark, II class, so under RG 111(c) a privileged Litanies commemoration
would displace the day's existing ordinary commemoration in ~97.7% of
years -- an unmeasured blast radius through layers 3 and 4. That
measurement is the prerequisite. The 194 figure is exact and reproduces.
Also corrects a subject-audit list that named five months for six
entries, omitting the Precious Blood on 1 July.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Holy Thursday, Good Friday and Holy Saturday resolved to the generic
Passiontide ferial slugs with no distinct identity of their own -- rank
and colour were already correct (RG 91 entry 2; Holy Thursday's white
per RG 128(b)/RG 122), only Celebration.names/subject were missing.
Keeps the slug (RG 91 entry 2 is identified structurally, off rank and
Easter offset, by Precedence_ef.band -- never off the slug -- so
renaming it would touch precedence for no reason and break the lectio
differential's own slug mapping for these three lectionary keys, the
same reasoning already given for Holy Family/Holy Name). Carries the
identity in Celebration.names instead, the same treatment those two
established: Latin, not English, to avoid reading the oracle this axis
is compared against.
Names sourced from both photographic scans, word for word, corroborated
by the electronic transcription's own table-of-contents-style listing at
the identical three headings (three-way agreement, nothing to
adjudicate): "Feria V in Cena Domini" (Holy Thursday), "Feria VI in
Passione et Morte Domini" (Good Friday -- not the transcription's own
informal "Feria VI Parasceve" used in passing elsewhere), "Sabbato
Sancto" (Holy Saturday).
Also tags subject = Lord, going further than Holy Family/Holy Name
strictly required (they needed it only because band's entry 14 reads
subject to outrank a colliding fixed feast; entry 2 here needs no such
thing). Safe: disposition's RG 112(a) branch only fires when both sides
of an occurrence are tagged Lord, and no Lord-subject sanctoral entry
has a fixed civil date inside Holy Week's own movable range; any Class1
sanctoral entry landing there (e.g. a transferred Annunciation) reaches
disposition's earlier, subject-blind Transfer branch first regardless.
Verified against the full 1583-9999 domain: zero
observed/commemorations/transferred_* difference traceable to the tag.
test_golden.ml's describe gains a name_la field alongside subject, for
the same reason subject was added: a names-only change is otherwise
invisible to every pin whose rank/colour/slug are already correct (this
task's own catalogued vacuity flavour #1). Six existing pins move from
subject=temporal to subject=lord (the three Easter-extreme Holy Saturday
pins, 2016's Good Friday, and the 2026 Holy Thursday/Good Friday pair);
the rest gain name_la=- by construction (no other temporal-cycle
candidate carries a name yet).
Mutation-tested: reverting temporal_ef.ml alone (keeping the tests)
reddens the new Rite_ef unit test plus five golden pins across two
independent layers.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The re-review asked for a third commemoration in the shape-(c) row, so
that "spliced immediately after its trigger" could be told apart from
"appended at the end" -- it had proved an append-at-end variant passed
the whole suite green, the pair alone being too short to distinguish
them.
Attempting it establishes something better than the test requested. On
this day-shape a third commemoration is rubrically impossible. Shape (c)
requires the trigger to lose the day while still being admitted, and a
Class2 trigger can only lose to a I-class day (RG 111(a): one privileged
commemoration) or a II-class Sunday (RG 111(b): one, "scilicet de festo
II classis"). Both caps are one. The third candidate is now offered and
correctly refused, which is the assertion worth having.
So RG 110(c)'s "ante omnes alias commemorationes" half has no reachable
witness in the EF's rubrical space, and the re-review's own finding that
shape (c) never co-occurs with a third commemoration across 8417 years
is a consequence of the rubric rather than an accident of the data. The
append-at-end variant stays indistinguishable from the splice on every
input the engine can construct. Recorded rather than papered over with a
synthetic row proving a shape no rubric permits.
Also drops Record from the "nothing compares commemoration order" note
-- Record.t has no commemorations field at all -- and names, at
privilege_of's own (a) branch, that the Holy Name's Sunday privilege
currently rests on a substring match rather than on RG 17's closing
paragraph, which is its real warrant.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
RG 110(c), word for word: "quoties vero oratio unius Apostoli addenda
est ad modum commemorationis, huic orationi additur altera immediate,
ante omnes alias commemorationes." "Huic orationi" (dative, "to this
oration") refers to the trigger's own oration; "additur altera" means
the companion is added to it, i.e. follows it. "Ante omnes alias
commemorationes" governs the pair's position relative to other,
unrelated commemorations, not the pair's own internal order. The
previous build prepended the companion uniformly in both RG 110
shapes, citing this same clause for both -- correct for (a)/(b) (the
day's own oration, not a list member, has nothing to order against),
backwards for (c), where the trigger is itself a list member and the
companion belongs after it. Fixed in rg110_additions: shape (a)/(b)
still prepends; shape (c) now splices the companion in immediately
after its own trigger. Re-pinned the unit test that had asserted the
wrong order, and corrected both rows' comments to cite the clause that
actually governs each shape.
No layer in this codebase compares commemoration order: the lectio
differential never compares commemorations, the oracle sorts both
sides into a multiset, and the golden tests' own describe function
sorts its commemorations field too. Recorded as a new, permanent blind
spot in CLAUDE.md and the register, not merely fixed around -- the
admit_cases unit table is the only place order is asserted at all.
Re-measured the full blast radius against the same pre-change binary:
same 14,627 differing days, same four shapes and counts, confirming
the fix changed only the content of the 593 shape-(c) rows and nothing
else. Mutation-tested: reverting the splice back to a uniform prepend
reddens exactly the shape-(c) unit test; a new golden pin for a real
shape-(c) day (2004-02-22) stays green under the same mutation, living
proof that golden pins cannot see this axis, not merely a claim.
Separately, M19's own predicate checked a date and a diff shape but
not which candidate -- proved insufficient by fabricating a second,
bogus companion on 30 June and confirming the whole suite stayed
green. Fixed by requiring the admitted commemoration to be exactly
commemoration-of-st-peter, mirroring C16's own identity guard. Added a
golden pin for 30 June, the only assertion of that entry's identity
outside the allow-list.
Also: corrected a false claim in the task report that the electronic
transcription carries no corroboration of the Holy Name fallback --
its own table of contents does, at a line not checked on the first
pass. Added two further citations, both re-verified against the scan:
RG 17's own closing paragraph, settling the Sunday shape's Sunday-
exclusion at the rubric level rather than only in the propers; RG
124(c), which assigns red to 30 June by paragraph number rather than
by the generic apostle/martyr default. Noted the fragility of deriving
the Sunday shape's RG 109(a) privilege from a slug-substring match
rather than from a citation. Cosmetic: a stray blank line and an
indentation inconsistency.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
RG 110 (Caput XIV): "In Officio et Missa S. Petri semper fit
commemoratio S. Pauli, et vicissim... pro unica habeantur" -- in the
Office and Mass of either Peter or Paul, a commemoration of the other
is always made, uncapped by RG 111's own admission count. Both
photographic scans, full text including sub-clause (c) (a separate
trigger this register previously had not transcribed: the same rule
also fires when one Apostle's oration is admitted merely as an
ordinary/privileged commemoration, not only when it is the day's own
office).
Three real pairs in the 1962 calendar, all confirmed on both scans:
25 January (conversion-of-st-paul + peter), 22 February
(chair-of-st-peter + paul), 30 June
(in-commemoratione-sancti-pauli-apostoli + a new
commemoration-of-st-peter). The first two already existed as ordinary
sanctoral candidates but were wired into RG 111's ordinary, capped
admission contest instead of this rule's own uncapped one -- the
defect this closes. 30 June had no companion at all: a genuine gap
in lectio's own source data (confirmed directly against
tridentine-calendar.ini) and in missalemeum's own oracle output for
both fixture years, not only a colitur bootstrap miss, so colitur is
now uniquely correct on this date among the three engines compared.
Added via data/ef/adjustments.sexp's own Add directive, the
architecture's existing extension point for exactly this shape of
gap, since data/ef/sanctoral.sexp is generated and lectio must not be
touched.
Precedence_ef.admit gained rg110_additions/rg110_companion_slug,
layered on after admit's own four ordinarily-capped branches decide
their normal result: checks both the observed candidate and every
already-admitted candidate against the three-pair lookup and prepends
any companion found, uncapped and additional, never competing for
RG 111's own slot.
Measured full blast radius (1583-9999, pre-change binary from git
archive at 59fbda8 vs the fixed binary, 3,074,246 days each side,
14,627 differing days, all four predicted shapes, zero unclassified):
3,619 Holy Name fallback days (previous commit), 3,533 days Paul was
wrongly excluded from Chair of St Peter's own day by a competing
privileged feria, 593 days Chair of St Peter itself was admitted only
as an ordinary commemoration with Paul entirely absent, and 6,882 days
the new 30 June companion is added. The 3,533+593 figure supersedes an
earlier, narrower 852-day estimate that measured only the delta
between two older code commits, not the rule's full scope.
The lectio differential needed no change: it does not compare
commemorations at all, and this fix never touches season, slug, rank,
or colour. The missalemeum oracle allow-list needed three changes:
M12 removed (22 February 2027 no longer diverges in commemoration
count), M15's date list gained 2027-02-22 (now reaching identity
comparison for the first time, where it lands on that entry's own
pre-existing, unrelated limit -- one of the two commemorations is
temporal-origin and unnamed), and a new M19 for the 30 June gap.
Mutation-tested, both halves separately: disabling the admit-level
addition reddens the two new unit tests, the oracle's own M12-shaped
checks, and an existing golden pin (updated to expect the Paul
companion); removing only the 30 June data entry reddens solely the
oracle's new M19 count, confirming the code and data halves are
independently load-bearing.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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").
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
spot precisely
The full breakdown, precisely: of 730 days, 331 are resolved (330
matching, 1 mismatched -- M13, Joseph vs the Seven Sorrows), 399
unresolved -- 373 in M18's own bucket, 26 absorbed inside M1/M2/M3/
M16's own widened subsets where the axis fires alongside their
pre-existing citation. M18's own note previously stated only its own
373 without this fuller context.
Also names the blind spot the axis exists to close in exact terms,
not just "the observed day's identity": a TEMPORAL-origin observed
day silently replaced by a DIFFERENT temporal-origin observed day of
the SAME rank and colour -- exactly Holy Family's own shape, and the
reason every prior layer stayed green through the whole gap. States
explicitly what the count pin does and does not prove: it guards
against the 373/399 population moving silently in either direction,
but cannot say which specific day moved or why.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
test_holy_family_anchor_present_and_erosion_is_caught built its
"eroded" list by filtering the exact pair it then asserted was
absent -- removing an element and checking it is gone proves
List.filter works, not that any detector caught anything. Borrowed
the name of test_anchors_erosion_is_caught, which uses a genuine
one: missing_from_anchors, called with an "expected" set sourced
independently of T.anchors (named_slugs_for_year, via T.named).
Reworked to match that shape: the expected slug is now sourced from
T.sunday_slug (season/weekday logic, a different function entirely
from T.anchors's own hand-typed string), and both the presence and
erosion checks reuse the real missing_from_anchors detector instead
of a bespoke, self-referential one.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
On 7,197 of the 8,417 days Holy Family occurs (every year that
isn't the 13-January collision), every emitted byte was identical to
the pre-change binary -- subject appeared in no output path the CLI
or any test read. Celebration.make already takes ?names, defaulting
to empty, and Temporal_ef.build never passed it.
build now takes an optional ?names, set only on Holy Family's own
branch: a LATIN name, not English. The oracle's own observed-identity
axis (test_oracle.ml) reads only `en`, so this is deliberately
invisible to it -- an English name here would mean reading
missalemeum's own title text, the oracle this exact axis is compared
against, to decide colitur's "ground truth" name: the "expected value
promoted from actual output" vacuity flavour this project's review
process watches for. Latin has no such circularity: the calendarium's
own January table and the Mass propers' own heading, both
photographic scans, word for word, "Sanctae Familiae Iesu, Mariae,
Ioseph" -- the same genitive-title convention test_names.ml's own
worked example already uses for Easter ("Dominica Resurrectionis").
Every other temporal-cycle candidate, including the neighbouring
Sundays, still carries no name of any kind -- a targeted addition for
the one day this task built, not a claim that the general gap
(register's own open item on Holy Name of Jesus, RG 17(a)) is closed.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
cite RG95's real primary authority
F2: the disposition comment for RG112(a) claimed the electronic
transcription "carries NEITHER this paragraph's own worked example
NOR its own more specific Mass-proper rubric... exactly the
transcription's documented defect" -- wrong on both counts, checked
directly rather than taken on trust.
RG 112 has no worked example in any of the three source documents
(the transcription included) -- there was nothing to drop. The Holy
Family Mass propers' own 13-January rubric is absent from the
transcription not because it silently drops content it otherwise
has (the project's own documented defect, dropped calendarium
commemoration lines) but because that specific document (a 2006 web
capture) contains almost no Mass-propers text of any day: 5
Introit-line occurrences across 26,322 lines, against 61 and 402 in
the two photographic scans; its own "Proprium de Tempore" page is a
table of contents linking to PDFs the capture never pulled in. A
coverage gap in a partial web capture, not an instance of the
narrower, different defect the methodology note actually describes.
The ruling is unaffected -- the propers' quotation is real, on two
independent photographic scans, and settles 13 January on its own --
only the attribution is struck, here and in test_precedence_ef.ml
(the register and the task report are corrected separately).
F7: RG 95's own second paragraph -- present in all three documents,
including the transcription -- is a more direct, occurrence-level
authority for the exact collision than RG 112(a): "if two feasts of
the same Divine Person... occur together, the one higher in the
table is kept, the other omitted." Added as the primary citation on
disposition's RG112(a) branch, with RG 112(a) and the propers' note
kept as corroboration. Also corrects RG 112(b)'s own framing: it is
bidirectional ("et vicissim"), and only the Lord-feast-wins direction
(RG 16(a)) is implemented -- the Sunday-wins direction has no witness
anywhere in this codebase's data and was wrongly described as already
covered.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
entry_14_movable_band = -14 was justified only by "cannot collide
with a real table position (1..28) or unclassified" -- a collision
argument, not an ordering one. band's own value is compared by plain
<, so a negative number beats every I-class entry (1-13), not merely
the fixed Baptism it was built to beat. Not live against the shipped
universal sanctoral data (no I-class universal feast falls 7-13
January, which is why the original 1583-9999 sweep showed only the
intended shape), but entries 12/13 admit PROPER and INDULT I-class
feasts too, and those arrive via adjustments.sexp-style overlays --
this architecture's own advertised extension path. A diocesan
patronal feast landing in Holy Family's window would have made the
inversion live immediately: the I-class feast displaced and
transferred to the next day, reproduced and confirmed before this
fix, reverted after.
Fixed by rescaling every band branch to the real RG 91 entry number
times ten (unclassified untouched at max_int) instead of the bare
1..28, reserving genuine headroom immediately before each entry for
a movable sub-rank -- not an arbitrary rescale: RG 91's own text
records a "primum mobilia, deinde fixa" split at three rows, not
only entry 14 (entry 12's own ninth sub-item, entry 14, and entry
20), so this leaves room for the other two without a second rescale
if either ever gets a live witness. entry_14_movable_band now
derives from entry_14_fixed_band - 1, tied together so they cannot
drift apart.
Added a synthetic I-class end-to-end test reproducing the exact
counter-example that found this: a universal I-class candidate
inside Holy Family's own 7-13 January window is now observed and
does not transfer, with Holy Family itself falling to RG109(a)'s
ordinary privileged-Sunday-commemoration path, the same treatment
any genuine feast outranking an ordinary Sunday gets.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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 <iso> +%A" (GNU
coreutils).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
layer_m_reason's own five entries whose diff shape was checked by
EXACT list equality (M1, M2, M3, M13, M16) lost their match once the
observed-identity axis widened every row's diff set two commits ago.
Each is widened the same way commemoration-identity was already
widened for M13 once before: the axis now ALSO fires alongside their
existing citation, same root cause, same id -- M1/M3 (temporal-origin
observed day, no name), M2 (same, plus five Paschaltide dates that
used to match cleanly and now surface for the first time), M13
(Joseph, sanctoral, now a genuine title MISMATCH, not merely
unresolved), M16 (the temporal Passiontide feria observed there).
M18 covers the remainder: 373 of 730 days whose observed celebration
is temporal-origin and so carries no English name at all -- the
overwhelming majority of the window, including Holy Family's own two
dates in it (2026-01-11, 2027-01-10), counted here rather than shown
as a false Matched. Gated on the diff SHAPE alone (this file's own
convention for a population this size, the same reasoning M2's own
title-substring predicate already uses instead of a date list),
verdict unresolvable -- the same fourth verdict M15 already
established for the identical limit on the commemoration axis.
Building an English name onto the temporal cycle is Plan 4's own
scope, register §6.
Teeth, per the brief: temporarily corrupted hilary's own English
name in data/ef/sanctoral.sexp (14 January 2026, an OBSERVED sanctoral
day, rank and colour left untouched) and reran. Reddened immediately:
2026-01-14: observed-identity-mismatch differ -- colitur=(rank=3
colour=w ...) oracle=(rank=3 colours=[w] title="St. Hilary" ...)
rank and colour agree on both sides -- exactly the shape the
pre-strengthening comparator would have slept through completely.
Reverted (git diff on the data file is empty) before this commit.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two related fixes, both needed for Holy Family to actually observe
correctly on the seven years it coincides with the fixed
Commemoration of the Baptism of the Lord (13 January): 2008, 2013,
2019, 2030, 2036, 2041, 2047.
band's entry 14 ("Festa Domini II classis") gated on sanctoral
origin only, so a movable Class2 Lord feast had no row in the table
at all. RG 91 entry 14's own text says otherwise: "primum mobilia,
deinde fixa" -- movable first, then fixed. entry_14_movable_band
gives Holy Family (the one movable candidate this codebase builds
with subject Lord) a value strictly better than the fixed half's own
literal 14, negative so it can never collide with a real table
position -- without it, the two would tie at 14 and fall to
Precedence.resolve's own alphabetical tie-break, which picks the
WRONG side ("commemoration-of-the-baptism-of-the-lord" sorts before
"ef-time-after-epiphany-sunday-1").
disposition gets a new branch for RG 112(a) (Caput XVI, "De
Commemorationibus"): the Office, Mass or commemoration of a mystery
of one Divine Person excludes a commemoration of another mystery of
the SAME Divine Person. Winner and loser both subject Lord -> Omit,
not Commemorate -- without it, Holy Family observing correctly still
left the Baptism admitted as an ordinary Class2 commemoration under
RG111(b), which the primary text does not allow.
Confirmed by a MORE SPECIFIC primary source than RG 112(a) alone: the
Holy Family Mass propers' own note, found on both photographic scans,
word for word, immediately after the Postcommunio -- "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." The electronic transcription carries
neither this rubric nor RG 112(a)'s own worked example -- another
instance of its documented defect, not merely absent from one check.
Still expected red: the lectio differential (2005-2050) now shows a
new, real divergence on those seven 13-January-Sunday dates -- lectio
has no Holy Family at all, so it still shows the fixed Baptism
observed there, unlike colitur now. The oracle's own M-series entries
also still need widening for the observed-identity axis added two
commits ago. Both are the next commits.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
RG 17(b), verified against both photographic scans (missale-romanum-
1962.pdf and "Missale Romanum 1962_text.pdf" -- the electronic
transcription carries the same paragraph, so this one is not itself
a transcription-vs-scan divergence): the Holy Family of Jesus, Mary
and Joseph is celebrated on the first Sunday after Epiphany, II
class, EVERY year, taking the Sunday's own place "cum omnibus
iuribus et privilegiis" -- the same formula RG 16(a) already uses.
The slug, rank and colour temporal_ef.ml already computed for that
Sunday (ef-time-after-epiphany-sunday-1, Class2, white) turn out to
be exactly right by coincidence -- an ordinary, unnamed Sunday and
Holy Family share both. The only field that was silently wrong is
subject: always Temporal before this, when RG 91 entry 14 ("Festa
Domini II classis, primum mobilia, deinde fixa") calls Holy Family a
movable Feast of the Lord. temporal's build now takes an optional
~subject, applied only on Holy Family's own date -- every other
Sunday, including the still-unbuilt Holy Name of Jesus (RG 17(a)),
is unaffected.
RG 17(b)'s window (7-13 January) can never be empty of a Sunday --
sunday_on_or_before(6 Jan) + 7 always lands in [7, 13] regardless of
6 January's weekday -- unlike RG 17(a)'s Holy Name (2-5 January, CAN
be empty), whose calendarium entry carries an explicit "vel ea
deficiente, die 2 ianuarii" fallback right next to Holy Family's own,
fallback-free one. No fallback needed or built.
Added to anchors (holy_family_sunday is independently computed, not
routed through named -- see temporal_ef.ml's own comment on why) and
to its own dedicated anchor/erosion test in test_temporal_ef.ml,
kept separate from the generic named-days coverage test since this
genuinely isn't one of named's own outputs.
Does not yet touch precedence: band still has no notion of a movable
Class2 Lord feast (entry 14 gates on sanctoral origin only), so on
the seven years 13 January is itself Holy Family's date (2008, 2013,
2019, 2030, 2036, 2041, 2047), the fixed Commemoration of the Baptism
of the Lord still wins the day exactly as before this commit -- the
next commit fixes the ordering RG 91 entry 14's own text states
("primum mobilia, deinde fixa").
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Layer 4 (test_oracle.ml, vs missalemeum) compared the observed
celebration's rank and colour and stopped there -- it never checked
whether the observed day is actually the RIGHT one. Holy Family (11
January 2026: oracle title "The Holy Family: Jesus, Mary & Joseph")
is rank 2/white on both sides purely by coincidence -- an ordinary,
unnamed Sunday and Holy Family share both -- so this layer has been
silently blind to the missing feast since it was built.
Adds Observed_identity_mismatch/Observed_identity_unresolved,
following the shape and honesty of yesterday's commemoration-identity
comparison (Comm_identity_mismatch/Comm_identity_unresolved): colitur
identifies its own observed day by slug, missalemeum by an English
title, and the bridge is Celebration.t.names, read directly off
LD.observed. That name is only ever set for a SANCTORAL-origin
celebration -- a TEMPORAL-origin one (an ordinary Sunday, a feria, a
movable named feast) carries none, so most of the 730 days in the
fixture window land in Observed_identity_unresolved, not a clean
match. That is counted and reported, never silently skipped -- the
same discipline this file already applies to an unresolvable
commemoration.
WIP, expected red: 399 days now show observed-identity-unresolved
with nothing in the allow-list naming it, and five of the six
existing M-series entries whose own diff shape is checked by exact
list equality (M1, M2, M3, M13, M16) lose their match now that this
axis widens their diff set. Landed on its own, ahead of any
production fix, so it is the regression net the following commits are
checked against rather than a change bundled in alongside the fix
they enable. The next commits widen those five entries' own diff
shapes and add the new bucket's own cited allow-list entry, then build
Holy Family itself.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The previous commit's bootstrap_sanctoral.ml change (name.pl optional) is
correct and verified not to silently drop a present name, but nothing in
the suite would have caught a regeneration that dropped name.pl WHOLESALE
-- the exact defect lectio itself shipped once (a regeneration that lost
all 322 Polish names, only caught because that project's own review ran
cmd/lectio-ef-dump, which happens to include name fields; this project's
own test_load_and_counts checks entry/status/rank counts only, none of
which move if every name.pl vanishes).
Added a 322-of-327 count assertion (5 legitimately lack it, matching
parse_names's own list), independently re-derived: `grep -c '^name.pl'
tridentine-calendar.ini` = 322, cross-checked against `grep -c '(pl'
data/ef/sanctoral.sexp` = 322 exactly.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
data/ef/sanctoral.sexp bootstraps colour=red for this new entry (14 Aug),
inherited from lectio's own ini; missalemeum's fixture independently tags
it :r too -- two non-primary witnesses agreeing with each other, not with
the Missal, the exact "trap" this project's own transcription-audit task
already named once.
Checked directly against the scan (missale-romanum-1962.pdf), not taken on
a reviewer's transcription: the 14 August proper reads "S. Eusebii Conf. /
Commemoratio / Missa Iustus, ut in festo S. Pauli primi Eremitae, die 15
ianuarii" -- Conf. (Confessor, not Martyr), borrowing the SAME Mass 15
January's own Paul the First Hermit uses, a Confessor's Common, white in
both engines' own data for THAT entry. Every other Confessor/Abbot
commemoration in lectio's own data is white (maur-abbot, giles, remigius,
didacus, ubaldus, hilarion, sabbas, silvester, alexis); Eusebius Confessor
is the one exception, with no textual support found for it.
No behavioural impact today (Commemoration_only entries are never the
printed observed colour under the current pipeline), fixed via the overlay
mechanism since sanctoral.sexp is generated and the source is upstream.
New test proves it through the real pipeline, the same discipline already
applied to the subject retags.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
are silent
The comment on test_iii_class_feast_wins_class4_feria gave a single reason
for why 8 of the 15 rank-corrected slugs produce zero diff rows anywhere in
the domain: "always fall inside Lent/Passiontide proper, RG 91 entry 22,
which already outranks entry 24". Wrong for 3 of the 8: gabriel-the-
archangel (24 Mar), john-damascene (27 Mar) and john-of-capistrano (28 Mar)
land in Paschaltide 226/846/1108 times domain-wide, always at class-1
(inside the Easter Octave, RG91 entry 2/10), never entry 22.
The conclusion (zero diff rows) was and remains right; only the reason was
wrong -- exactly the "correct code, wrong explanation" defect this project
has repeatedly caught before. Corrected to the actual, checked shield:
every context these 8 dates ever land in domain-wide is either class-1/2
(trivially outranking any class-3 candidate and excluding it from
commemoration by RG111's own rank floors, regardless of status) or the
season's own class-3 feria at entry 22 (which outranks entry 24 for
observation but admits the losing saint's commemoration identically
whether Commemoration_only or Feast, RG111(c)/(d) having no ferial-class
gate on an ordinary sanctoral candidate).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
2008-04-02/04/05 and 2038-03-06/08/09 are the six dates the re-bootstrap's
own brief named as producing a wrong observed office under the old data
(a III-class feast wrongly demoted to Commemoration_only, unable to win
against an ordinary class-4 feria it should trivially outrank). Verified
against the Missal before pinning, per this file's own rule: RG 91 entry 24
("Festa III classis, in calendario Ecclesiae universae inscripta")
outranks entry 28 ("feriae IV classis"), a plain, unqualified table
reading, and the calendarium text for all six was already primary-verified
in the register before this task ran -- only the data was wrong.
Each pin proves the mechanism, not merely the answer: an omitted_has check
(one per season family, Paschaltide and Septuagesima) confirms the
displaced class-4 feria actually reached disposition and was actively
excluded under RG26, not merely absent because nothing was ever offered.
test_easter_extreme_2038_late_modern's own header previously recorded these
three March dates as a DELIBERATE EXCLUSION because they were known wrong;
corrected in place to point at the now-existing pin instead of continuing
to justify an exclusion whose reason no longer holds.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Each was recorded as a genuine data gap "traced upstream into lectio,
unfixable without touching lectio". That constraint is gone: all five
commemorations (St Agnes secundo 28 Jan, St Eusebius Confessor 14 Aug, St
Evaristus 26 Oct, St Theodore 9 Nov, St Boniface Martyr 14 May) are now
present in the re-bootstrapped sanctoral.sexp, and each divergence stops
occurring in the 2026-2027 oracle fixture -- verified by re-running the
comparator and confirming zero rows for all five ids, not assumed from the
data change alone.
Removed rather than kept as dead 0-row citations, matching the M17
precedent already in this file: the count pin
(test_layer_m_counts_match_citations) now enforces that none of these five
divergences can silently reappear. Corresponding dead code (m4_dates
.. m14_dates and their layer_m_reason branches) removed from
test_oracle.ml; a short pointer comment left at each id's old location.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Neither of adjustments.sexp's two directives is a no-op after the
regeneration, and neither is removed -- reasoned through deliberately
rather than deleted on sight, per Overlay.apply's own documented
diagnostic behaviour (Edit has no "already correct" case; it unconditionally
folds every field_edit over the current value when the slug is present, no
diagnostic either way).
`Edit most-holy-name-of-mary (Set_subject Bvm)`: the base bootstrap no
longer needs this correction (the source dropped `class = lord` for this
slug, so the default is already Subject.Saint), but the overlay still
forces `Saint -> Bvm`. Kept for two reasons: data precision (the
calendarium's "Sanctissimi Nominis Mariae" title still argues for Bvm over
the generic Saint default, independent of what lectio's class field says)
and as a regression guard (Set_subject is unconditional, so it would also
correct a future re-introduction of `class = lord` for this slug, the one
subject value RG16(a) behaviourally reads).
`Suppress vigil-of-christmas`: re-verified, not assumed -- the slug is
still present, unchanged, in both the regenerated source and the
regenerated sanctoral.sexp, so the directive still fires its ordinary
slug-present path.
test_rite_ef.ml's own comment on the overlay-in-effect test previously
claimed the base file carries `subject Lord` for most-holy-name-of-mary,
which the regeneration made false; corrected in place rather than left
stale, per this project's own discipline around wrong claims.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Regenerated via tools/bootstrap_sanctoral.ml against lectio's
tridentine-calendar.ini (SHA-256 6a25e634... -> 1b303ef2...), whose own
generator was independently fixed in a concurrent session. 327 entries (223
feast, 104 commemoration-only), up from 322 (208/114):
- 15 entries wrongly bootstrapped `rank = commemoration` are now
`class-3` (a real III-class Feast) -- all 6 March-5 April, all
primary-source-verified against the calendarium (register's own
"Commemoration-only entries' inferred STATUS" item).
- 5 new entries: agnes-secundo (28 Jan), boniface-martyr (14 May),
eusebius-confessor (14 Aug), evaristus (26 Oct), theodore (9 Nov) --
all Commemoration_only, all primary-source-verified (register's "Four
confirmed sanctoral DATA GAPS" item + expected-divergences-missalemeum
.sexp's former M4/M6/M7/M9/M14).
- commemoration-of-the-baptism-of-the-lord (13 Jan) is now
`(subject Lord)` (the source's own `class` field, not a colitur
overlay); most-holy-name-of-mary (12 Sep) no longer carries `class =
lord` at all (the source dropped it), so the bootstrap default
(Subject.Saint) is now correct there without help from
adjustments.sexp's own Edit.
test_sanctoral_ef.ml's pinned counts (327/104/12 Class1) are re-derived
directly from the source INI (`grep -c '^\['`, `grep '^rank' | sort |
uniq -c`), not transcribed from a bootstrap-tool or `colitur day` run.
data/ef/adjustments.sexp and the differential/oracle allow-lists still
need updating for the consequences of this regeneration -- follow-up
commits.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
All three are the project's own "correct code, wrong explanation" shape,
found by the final review of the RG 113 work. No behaviour change.
test_rite_ef.ml's registered Alcotest label said "Thomas of Villanova
observed, Maurice commemorated" while the test asserts the Ember
Wednesday is observed, Thomas is the sole commemoration and Maurice is
omitted -- the opposite of two of its three assertions. The body's own
doc comment was right; only the name a test run prints was wrong.
validate.ml's lead-in still said origin is reconstructed as Sanctoral
uniformly because the EF admit "reads only rank and slug, never origin".
That stopped being true in ea22ad2: admit now orders by band, and band
reads origin via is_temporal, so a temporal-origin commemoration
relabelled Sanctoral would be scored on the wrong table entry. The code
below already recovers the origin exactly; only this comment lagged.
precedence_ef.ml's band guard justified itself by citing
celebration.mli as saying a demoted feast retains its rank for RG 111's
admission-COUNT purposes. celebration.mli says the opposite -- it names
the ORDERING use the guard removes. The guard is right for a reason it
did not give: rank stays load-bearing through RG 111(b)'s "de festo II
classis" floor, which is what excludes these entries from a II-class
Sunday's slot. Both the citation and celebration.mli's own now-stale
line are corrected, each recording what it previously claimed.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fix round 1 on the commemoration-identity/tie-break work: the "genuine
same-band tie" M17 adjudicated as open was not a tie at all. RG 91's
table enumerates only "dies liturgici" (real feasts) -- entry 24's own
text is "Festa III classis, in calendario Ecclesiae universae
inscripta" -- so a Celebration.t.status = Commemoration_only candidate
(a saint reduced to a bare commemoration) has no row in the table to
begin with. Precedence_ef.band used to read rank alone, so it silently
lent such a candidate the same table entry as a genuine Feast of its
own rank; the calendarium's own 22 September row confirms the
distinction in its own notation ("S. Thomae de Villanova ... III
classis. / Commemoratio Ss. Mauritii et Soc. Mm." -- Thomas carries a
class number, Maurice carries none).
Fixed at the source, not by adding a status tier to compare_precedence:
band now checks status first, ahead of every rank-keyed branch, and
returns unclassified for any Commemoration_only candidate. M17 deleted
(not re-adjudicated) -- 22 September now resolves identically on both
sides, with no divergence left to name.
Blast radius measured independently (a temporary git worktree at the
pre-fix commit): 4451 days change across the whole 1583-9999 domain,
exactly 4 verified shapes -- 3576 x maurice-and-companions-martyrs ->
thomas-of-villanova and 282 x eleutherius -> philip-neri (admitted set
changes), 502 x appollonia/cyril-of-alexandria and 91 x dorothy/titus
(order only, independently confirmed against the calendarium's own
listing convention). Zero days change who is observed. Further swept
the whole domain for a genuine "two different candidates on the
identical real table entry" residual -- the shape RG 113 truly gives
no instruction for -- and found it empty: of 109201 same-rank ties
domain-wide, 83950 now resolve by band alone and the remaining 25251
are exclusively two Commemoration_only candidates tied at unclassified,
never two real feasts. The residual admit still breaks alphabetically
is real, but narrower than previously documented.
The "66 days" figure is reconciled, not merely disputed: 599 is the
tie population, 65 (whole-comparator: 67) is the real admitted-set
decision count within it (independently reproduced against the
pre-Task-B binary), 149 is order-only. Every one of the 65 real
decisions traces to the same Commemoration_only/Feast root cause as
Maurice/Thomas.
Also: validate.ml's admission fixed-point check recovers a
commemoration's real origin (by matching its slug against the day's
own temporal office) instead of reconstructing every candidate as
Sanctoral, since band -- unlike EF's own admit -- does read origin;
precedence_ef.ml/.mli's motivating example and blast-radius claims
corrected to no longer rest on the fixed Maurice/Thomas case;
test_identity_rank_corroboration's own population count corrected now
that 22 September (and 21 other Feast-status matches) became reachable;
its rank-agreement pin documents exactly what it does and does not
prove. Register (§4, §6.1, §6 checklist) and CLAUDE.md corrected in
place, including the RG 113 first-sentence gap this exercise surfaced
but did not close, recorded as a new open item.
275 -> 276 tests (with the exhaustive sweep), all green.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
test_oracle.ml (validation layer 4) used to compare commemoration
presence and List.length only -- cardinality, never which candidate is
admitted. A reviewer proved this vacuous by reversing admit's dignity
sort (the engine admitting the worst commemoration, an outright RG 111
violation) and finding every assertion in this file green across all
730 days.
tools/extract_missalemeum_oracle.py now also emits each commemoration's
own missalemeum id (field 9, commemoration_ids), parallel to the
existing title field; fixture regenerated from the same underlying
lectio snapshot (commit d7da4b0, re-verified, first 8 fields
byte-identical), read from a scratch copy so ~/git/projects/lectio was
never touched. SHA-256 pin and provenance updated.
The mapping: colitur identifies a commemoration by slug, missalemeum by
an English title string. No hand-built slug<->title table -- colitur's
own Celebration.t.names already carries the same English text for every
SANCTORAL-origin commemoration (bootstrapped from lectio, verified to
match missalemeum's titles character-for-character). This resolves
identity for every sanctoral-origin commemoration but cannot resolve a
TEMPORAL-origin one (Rite_ef.Temporal_ef never sets a celebration name)
-- that case is a new, distinct outcome (Comm_identity_unresolved),
counted and allow-listed, never silently skipped: 19 of 227
non-empty-commemoration days over 2026-2027.
Two genuine identity mismatches found and adjudicated (new allow-list
entries M15-M17, one is the unresolved bucket): M16, 27 March 2026, the
already-known unimplemented Seven Sorrows of Passion Friday office
(verdict missalemeum); M17, 22 September 2027, the RG 113 same-band
tie-break residual (verdict open, per the sibling admit fix). A new
corroborating check cross-references missalemeum's own id-embedded rank
against colitur's, split by status: Feast-status matches must agree
exactly (none reachable in this 2-year window, checked regardless);
Commemoration_only-status matches either genuinely agree or fit a known,
pre-existing, already-registered convention gap (colitur's bootstrap
rank vs missalemeum's own sentinel) -- not a title-matching defect.
Perturbation test performed and reverted: reversing admit's dignity-
based ordering (compare_precedence's real committed form uses band, not
dignity -- this reproduces the historical defect shape directly) turns
the oracle layer red: "no differences outside the cited allow-list"
fails with an unexplained commemoration-identity-mismatch on 2026-09-23
(colitur admits "St. Thecla" where the rubric and missalemeum both
require "St. Linus"). Reverted; diff against the prior commit confirms
no residue.
CLAUDE.md's "know what each layer cannot see" section updated: the
commemoration-identity gap it documented as open is now closed, with
the mapping's limits and the RG 113 tie-break finding summarised.
271 -> 273 tests (274 with the exhaustive sweep), all green.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
precedence, not slug
Precedence_ef.admit broke a same-rank tie among commemoration candidates
alphabetically by slug -- a deterministic engineering convention with no
rubrical citation. RG 113's own second sentence, primary-source-verified
against two independent scans and previously uncited in the register
(only "commemoratio de Tempore fit primo loco" was quoted before), gives
the real rule: "in admittendis et ordinandis aliis commemorationibus,
servetur ordo tabellae praecedentiae" -- admitting and ordering
commemorations both run on the rite's own table of precedence (band's
28-entry table), not RG 8's coarse four-class rank.
Precedence.resolve now computes each commemoration candidate's own band
value once, generically, and hands it to rules.admit as a third tuple
element (Precedence.rules.admit's signature changed accordingly, ditto
Precedence_ef.admit; every rule-record stub in the test suite updated to
match). Precedence_ef.admit's own compare_dignity is replaced by
compare_precedence, ordering by band then slug; a residual tie within one
identical band value still falls back to slug, since RG 113 gives no
further instruction there -- documented as a still-uncited engineering
convention, not dressed up as a rubric.
RG 98 ("in paritate autem Officium prius impeditum praecedit") was
considered as a candidate authority for that residual and rejected: it
governs the transfer queue order among several simultaneously-impeded
I-class feasts (Caput XIII), a different operation in a different
chapter from RG 113's commemoration admission (Caput XVI); nothing in the
primary text connects the two.
Blast radius measured against the pre-change binary across the entire
1583-9999 domain (not only 2005-2050): the admitted-commemoration-slug
set is byte-identical, day for day, before and after this change. The
fix corrects the citation and mechanism, not the answer, on this
codebase's current data -- both of the task brief's named examples
(22 Feb Chair-of-Peter/Lent-vs-Paul, 22 Sept Maurice-vs-Thomas-of-
Villanova) are confirmed present and unchanged in both streams. A new
test (RG113: admit picks by precedence order, not slug, when they
disagree) proves admit actually consults the passed-in precedence value
with a synthetic pair whose slug order and precedence order disagree --
teeth a same-band-only regression test could not have caught, since
every real collision found in the domain happens to agree on both axes.
271 -> 272 tests, all green; COLITUR_EXHAUSTIVE_SWEEP=1 unaffected.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
data/ef/expected-divergences-missalemeum.sexp's M6 entry and its matching
comment in test/test_oracle.ml both cited 1962-06-23,_SS_Ioannes_XXIII,
_Missale_Romanum,_LT.pdf's 14 August row ("Vigilia, II classis." --
nothing else) as if it were the calendarium itself. It is an electronic
transcription that silently drops commemoration lines the photographic
scans carry. missale-romanum-1962.pdf's 14 August row reads "Vigilia, II
classis, Commemoratio S. Eusebii Conf.", with its own proper following --
independently confirmed in the second scan, Missale Romanum 1962_text.pdf.
M6's verdict flips colitur -> missalemeum: this is a genuine colitur data
gap, the same shape as M4/M7/M9/M14 (absent from data/ef/sanctoral.sexp and
from lectio's own tridentine-calendar.ini), not a spurious oracle entry.
Not fixed here for the same reason those four are not: it requires
touching lectio's own bootstrap source, out of reach for this task.
expected_rows is unchanged (2) -- the diff shape the allow-list predicate
matches does not depend on which side is judged correct, confirmed by the
suite passing unchanged.
A companion register ruling that convicted romanus (9 August) on the
identical reasoning -- and the register's own sanctoral-audit bucket
counts that followed from it -- are corrected in docs/research/
rules-register.md (gitignored, not part of this commit). Full audit
method, the complete list of dropped commemorations found across the
whole calendarium, and every other ruling checked for the same defect
are in .superpowers/sdd/2026-08-12-colitur-rg16a/transcription-audit-
report.md (also gitignored).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fix round 1 review, MINOR finding (item 4). Both precedence_ef.ml and
test_precedence_ef.ml claimed the loser-side Class2 conjunct held because
'entry 6's own band value (6) is lower than every entry [3, 11-14]' --
false on its face (6 is not lower than 3) and, worse, the claim proves the
opposite of what it was cited for: if a band-3 candidate really did
contest a Class1 Sunday, the lower number would win, meaning the Sunday
would lose, not beat it as claimed.
The conclusion itself was never wrong, only the justification. Against
entries 11-14 (sanctoral-origin Lord feasts) the numeric argument holds
(6 < 11-14). Against entry 3 (Epiphany, Ascension, Trinity, Corpus
Christi, Sacred Heart, Christ the King) it is not numeric at all but
structural: every band-3 celebration is temporal-origin, and
Precedence.resolve takes exactly one temporal candidate per day, so a
band-3 Lord feast IS that date's own single temporal candidate, never a
second one contesting a separately-produced Sunday -- there is no band
comparison to make in the first place. Comment-only; no behaviour change.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two real dates, hand-verified against the rubric before pinning
(test_golden.ml's own discipline): 2028-08-06, the Transfiguration
suppressing an ordinary Sunday's commemoration entirely (with an
unrelated III-class saint the same fixed date, Pope Sixtus II et al.,
still getting its own ordinary commemoration -- proof the rule targets
the Sunday specifically, not every commemoration due that day); and
2025-02-02, the corrected Purification -- the Sunday observed, the
Purification surviving as an ordinary commemoration, the exact opposite
of what RG16(a) would have done to it before the data fix.
Re-ran the exhaustive sweep (COLITUR_EXHAUSTIVE_SWEEP=1 dune test
--force): 1583-9999, 0 failures, including the resolution invariants
that now see RG16(a)'s changed commemoration accounting.
|