<feed xmlns='http://www.w3.org/2005/Atom'>
<title>lectio.git/internal/calendar/oracle_ef_test.go, branch main</title>
<subtitle>offline Catholic daily readings and liturgical calendar in Go, with CLI, TUI and web clients</subtitle>
<id>https://git.labunix.xyz/lectio.git/atom?h=main</id>
<link rel='self' href='https://git.labunix.xyz/lectio.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/'/>
<updated>2026-08-18T14:35:41Z</updated>
<entry>
<title>feat(ef): Rogation Monday and Tuesday (RG 87)</title>
<updated>2026-08-18T14:35:41Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T14:35:41Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=25aa1fa687ec714e145a998714c29a5f5728a603'/>
<id>urn:sha1:25aa1fa687ec714e145a998714c29a5f5728a603</id>
<content type='text'>
RG 87: "Litaniae minores seu Rogationes, per se, assignantur feriis II, III et
IV ante festum Ascensionis Domini." Easter+36 and +37 are that Monday and
Tuesday. RG 128(d) gives them violet -- "for the procession and Mass of the
Greater and Lesser Litanies" -- a penitential note inside white Paschaltide.
lectio computed no Rogation days at all and showed a plain paschaltide feria.

The WEDNESDAY is deliberately not built, and the test asserts its absence.
Easter+38 is by construction the Vigil of the Ascension, II class, which wins
the day outright; what the rubric asks for there is a COMMEMORATION, and this
function returns one office per day. colitur reaches it through a movable-date
entry in its sanctoral overlay. Extending the Rogation branch to +38 to
"complete" the rubric would silently displace the Vigil, so the test pins the
Vigil rather than leaving the omission to a comment.

Rank is left as the feria's: these are IV-class days and any III-class saint
displaces them, which is what makes the office rare. In 2026 all three are
impeded and none appears; 2027 has the Monday unimpeded, and lectio and
colitur are byte-identical across 2-5 May that year.

One oracle allow-list entry: missalemeum builds no Rogation days either and
shows a white feria, so it is the outlier here rather than lectio.
</content>
</entry>
<entry>
<title>fix(ef): Christmas Time runs to 13 January (RG 72)</title>
<updated>2026-08-18T14:02:17Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T14:02:17Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=27acee1930dc728b286c655cb66bd5e44804df6f'/>
<id>urn:sha1:27acee1930dc728b286c655cb66bd5e44804df6f</id>
<content type='text'>
RG 72: "Tempus natalicium decurrit a I Vesperis Nativitatis Domini usque ad
diem 13 ianuarii INCLUSIVE." 6-13 January is the Epiphany section OF Christmas
Time, not the start of Time after Epiphany. RG 119(a) backs the same boundary
from the colour side, white "usque ad expletum tempus Epiphaniae". lectio
ended Christmas Time on 5 January, so eight days a year came out green that
should be white, and Epiphany itself reported the wrong season.

NOT a one-line boundary change, which is why an earlier attempt was reverted
rather than shipped. efSeason both named the slugs and reported the season, so
moving the boundary renamed every slug in the window -- ef-time-after-epiphany-*
became ef-christmas-* -- and orphaned the ef-time-after-epiphany-sunday-1
lectionary key. The two are now separate axes:

  efSlugSeason  names slugs and numbers weeks; unchanged behaviour
  efSeason      the liturgical season, which the colour follows; RG 72's

The split is not a new idea in this file. The resumed-Sundays branch already
does exactly this and says so -- "Season stays time-after-pentecost
(calendrical); the Epiphany slug only routes the readings" -- it simply had no
name, so the one place that needed it could not reuse it.

Result, checked against colitur across all 365 days of 2026: SEASON now agrees
on every single day, where it previously differed on eight. Colour differences
drop to nine, every one a Saturday and every one the BVM Saturday Office
(RG 78, colitur C17) which lectio does not build. Slugs and week numbers are
byte-identical to before.

The oracle's season axis now consults the allow-list and excludes excused days
from its threshold. Neither was true before, because no cited divergence had
ever BEEN a season difference -- the January window showed up as a colour one,
since the wrong season produced the wrong colour too. With the season right,
what is left is a season difference against missalemeum, and an axis whose
threshold is a t.Fatalf would have failed regardless of any allow-list.

TestTemporalEFChristmastideBoundary pins the boundary AND the split, mutation-
tested both ways: reverting the boundary reddens it, and re-merging the two
seasons so the slug is built from the liturgical one reddens it differently,
naming the orphaned lectionary key.
</content>
</entry>
<entry>
<title>fix(ef): twelve RG 124 colours -- missalemeum has the rule inverted</title>
<updated>2026-08-18T13:39:48Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T13:39:48Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=967e911728eefb85dc53065c73c5c5d4cdce6a59'/>
<id>urn:sha1:967e911728eefb85dc53065c73c5c5d4cdce6a59</id>
<content type='text'>
RG 124, "De coloribus paramentorum", section C, both photographic scans word
for word: 124(b) gives red to "Sanctorum Apostolorum et Evangelistarum, in
eorum die natalicio, excepto festo S. Ioannis (27 decembris)", and 124(e) to
"Sanctorum Martyrum, quorum colitur aut martyrium". Red is for Apostles,
Evangelists and Martyrs. A Confessor, Doctor or non-martyr Virgin is white.

missalemeum has twelve of these INVERTED IN BOTH DIRECTIONS: ten confessors,
doctors and virgins in red (Ephrem, Julia of Falconieri, John Gualbert,
Camillus de Lellis, Jerome Emiliani, Martha, Alphonsus Liguori, Augustine,
Rose of Lima, John of San Fecundo), and two actual martyrs in white
(Apollinaris and Josaphat, both Bishop and Martyr). Both directions failing is
why this reads as one rule applied backwards rather than twelve separate
slips, and why they are corrected as a block.

Adjudicated by colitur against the scans -- its C18 carries the per-slug
reasoning and its M21 the oracle side, verdict colitur. Two of its fourteen,
conversion-of-st-paul and chair-of-st-peter, already agreed here.

Found by a full-year sweep comparing clectio's output against colitur day by
day, not by the patch tool that produced the earlier corrections. That tool
reads colitur's sanctoral.sexp directly and so misses everything in
adjustments.sexp, the overlay where all twenty of colitur's colour edits
actually live -- its SECOND structural blind spot, after temporal days.

All twelve go into the generator's missalOverrides table, so regeneration
preserves them, and into TestTridentineMissalOverrides, now sixteen pinned
fields. Mutation-tested in BOTH directions: reverting a martyr to white and a
confessor to red each redden the test with the rubric named. Pinning only one
direction would have let a careless "make them all white" fix pass ten of
twelve.

The oracle allow-list gains one entry covering the twelve dates in both years.
</content>
</entry>
<entry>
<title>fix(ef): adopt eight corrections from colitur, with their citations</title>
<updated>2026-08-18T11:02:49Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T11:02:49Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=910ea22fd90ded9d4bf1845d5a4cfd9f11a624e1'/>
<id>urn:sha1:910ea22fd90ded9d4bf1845d5a4cfd9f11a624e1</id>
<content type='text'>
lectio's EF data has been the upstream for colitur, whose data was
bootstrapped from this ini. colitur has since validated that data against the
1962 Missal itself, and these eight fields are where the two now disagree and
the Missal decides against us. Each carries the rubric.

Calendar. St Ubaldus (16 May) and St Didacus (13 November) become III-class
feasts rather than commemorations: the Missal's own universal calendarium
ranks both "III classis" outright with no commemoration rubric, and each has
its own Mass entry in the Proprium taking its readings from a Common with
only its Oratio proper -- which a bare commemoration never has. Found by
auditing all 290 of colitur's fixed-date entries against that calendarium;
these two were the only status defects in the file. The Vigil of the
Assumption becomes violet from white and the Vigil of St Lawrence violet from
red: RG 128 gives violet to vigils of II and III class outside Paschaltide,
and its sole exception is the Ascension's vigil, inside Paschaltide, which is
white and is untouched here.

Lectionary. Both Ember Saturdays carried the wrong saint's Mass entirely --
St Thomas the Apostle's under ef-advent-ember-sat and St Matthew's under
ef-september-ember-sat, in both cases because 21 December and 21 September
fall on a Saturday in the same six years and a bootstrap generalised one
year's coincidence into a template value.

Two oracle allow-list entries, both placed ahead of the BVM-Saturday entry
deliberately. When 16 May or 13 November falls on a Saturday, that entry's
predicate also matches and would absorb the divergence under a reason no
longer true of it -- it says both engines agree the day is unimpeded, and the
point here is that the day IS impeded. The vigil entry excludes Sundays for
the mirror reason: RG 33 omits a vigil falling on one, and without the guard
2026-08-09 is stolen from the RG 33 entry that actually explains it.

Six days of the 730-day oracle window are affected. Readings are untouched by
that test, so the two lectionary corrections cost it nothing.
</content>
</entry>
<entry>
<title>caldata: the Lenten Ember days were serving Lent I Sunday's Mass</title>
<updated>2026-08-17T08:05:55Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-17T08:05:55Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=dde760c31c6e8cffa84446b0804ab6d6372ccb30'/>
<id>urn:sha1:dde760c31c6e8cffa84446b0804ab6d6372ccb30</id>
<content type='text'>
Three lectionary sections were keyed ef-lent-1-{wednesday,friday,saturday}
while temporal_ef.go's efEmberSlug computes ef-lent-ember-{wed,fri,sat}. The
lookup in caldata.Readings takes the observed slug and has no alias table, so
it missed the entries entirely and fell through to the preceding-Sunday
fallback. Every Lenten Ember day since the data was added has served Lent I
Sunday's Mass -- three days a year, in a season that prints a proper Mass daily.

The values were already right; only the keys were wrong, and they were stale
rather than mistaken: they predate Lent being added to efEmberSlug, and
scripts/genlect.go keys off day.Observed.Slug, so re-running it would already
write the correct names. Advent and September were never affected -- both
already use the -ember- form.

Renamed, and verified the whole file: every one of the 119 section names is now
a slug the calendar actually computes, checked by sweeping 2005-2050. Those
three were the only dead keys.

Added TestEFLectionaryKeysAreReachableSlugs to make the class detectable rather
than just this instance. Mutation-tested: reverting the three keys fails it,
naming all three.

Found by differencing against colitur, the sibling OCaml engine, while giving
it a lectionary of its own. Worth recording how nearly it escaped: colitur
inherited the same wrong keys from this file during its bootstrap, so both
engines produced the same wrong Mass and the differential between them was
silent. It only surfaced when colitur's data was checked against the Missal
itself. Two implementations agreeing is not evidence when one was seeded from
the other.
</content>
</entry>
<entry>
<title>oracle_ef_test: three structural coverage gaps in the strengthened test</title>
<updated>2026-08-12T12:51:33Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T12:51:33Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=96b14d17e5210b93f1c126fe165fd81ec1e839af'/>
<id>urn:sha1:96b14d17e5210b93f1c126fe165fd81ec1e839af</id>
<content type='text'>
Cheap fixes flagged in review, all confirmed against the committed
snapshot before being applied:

1. An unmapped season phrase skipped the RANK AND COLOUR checks too,
   not just the season comparison -- `continue` in the wrong place.
   Confirmed live: neither Holy Thursday ("maundy"/"holy week" do
   not match the title "Holy Thursday" itself) nor any of the six
   September Ember days (no "ember" case exists at all; the Advent
   and Lent Ember days only ever passed by an incidental substring
   match on "advent"/"lent") had any oracle coverage at all --
   reverting the Holy Thursday colour fix left this test green.
   Season skip and rank/colour checks are now independent.

2. Colour membership alone cannot catch a Rose regression: violet is
   a member of every rose/violet pair by construction (Gaudete/
   Laetare), so "got violet, want one of [rose violet]" passed even
   with RG 131's Rose support removed entirely. On the day the pair
   actually names (oracle rank 1, the Sunday itself, not a weekday
   reusing its propers), a colour set containing rose now demands
   rose specifically.

3. `has("sexagesima")` never matched missalemeum's own ligatured
   "Sexagesimæ" -- confirmed in the committed snapshot: the ligatured
   form appears 10 times, the unligatured form only 4, and every
   ligatured instance mapped to season "" (skipped from ALL coverage,
   not merely a season miss, given finding 1 above). Normalised once,
   generally (æ -&gt; ae), not as a single hardcoded word, so any other
   ligature this generator's own data may carry is covered too.

Net effect on TestOracleEF: 730 checked (up from 691), 29 skipped
(down from 39) -- the 10 reclaimed by fix 3. Still green: 0
unallow-listed rank or colour mismatches over the full snapshot.
</content>
</entry>
<entry>
<title>test(ef): un-gate the oracle test now the seven defects are fixed</title>
<updated>2026-08-12T11:06:47Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T11:06:47Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=4722236b26d3439ed56893cb2863121bb705c7cf'/>
<id>urn:sha1:4722236b26d3439ed56893cb2863121bb705c7cf</id>
<content type='text'>
Remove the LECTIO_EF_ORACLE_STRICT gate added when the strengthened
rank/colour assertions first landed. All seven defects are fixed as
of the previous four commits; TestOracleEF now passes unconditionally
as part of the normal go test ./... run, with its small, cited
allow-list (four entries, none of them one of the seven) doing the
only remaining filtering.
</content>
</entry>
<entry>
<title>test(ef): strengthen the oracle test to assert rank and colour</title>
<updated>2026-08-12T11:03:57Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T11:03:57Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=ca3403893bfbebb325fe3ab6a98081640574bf2a'/>
<id>urn:sha1:ca3403893bfbebb325fe3ab6a98081640574bf2a</id>
<content type='text'>
internal/calendar/oracle_ef_test.go asserted Season only. lectio's own
EF oracle test comment said as much ("rank/colour are reported
informationally"), which is exactly why several precedence/colour
defects in precedence_ef.go and temporal_ef.go shipped without ever
failing a test: the suite was green while the observed office's own
rank and liturgical colour could be wrong.

Rebuild the oracle from the committed missalemeum snapshot
(sources/snapshot.tar.gz, missalemeum/en/YYYY-MM-DD.json, 2026-01-01
.. 2027-12-31, 730 days) instead of a live 2025-2026 fetch, via a
rewritten scripts/build-oracle-ef.sh -- offline, reproducible, and
correctly separating info.rank/info.colors from info.id (whose
embedded rank is the rank of the propers REUSED that day, not the
day's own rank -- e.g. 2026-01-02 is a class-4 feria carrying id
"sancti:01-01:1:w" because it reuses the Circumcision's propers).
info.colors is an array (14 of 730 days carry two values -- Gaudete/
Laetare "pv", Palm Sunday "rv", Good Friday "bv", Holy Saturday
"vw"), so the new Colour assertion is membership, not equality.

The strengthened assertions immediately expose several real defects
(rank mismatches on every Advent/Lent Sunday, the Ember days, the
late-Advent and Christmas-octave ferias, and more) -- that is the
point, this is the regression net subsequent commits fix against.
Since the repo's convention is go test ./... green at every commit,
TestOracleEF is gated behind LECTIO_EF_ORACLE_STRICT=1 for now rather
than landed red; a later commit removes the gate once the fixes are
in. Season alone stays green throughout (unchanged, always was).

A small, cited allow-list (efAllowList) is included from this commit:
genuine, defensible divergences unrelated to the fixes ahead of it --
RG 91 entry 27's un-built BVM Saturday Office, the pre-existing 6-13
January Christmastide/time-after-Epiphany season-boundary divergence,
missalemeum's own RG 33 gap on a Sunday 9 August, and one collision
(St Joseph vs the Friday of Passion Week, 2027) left explicitly
unresolved even by the sibling project's much deeper primary-source
pass. None of the four is one of the seven defects this branch fixes.
</content>
</entry>
<entry>
<title>test(calendar): EF oracle vs missalemeum 2025-2026 (0 season mismatches)</title>
<updated>2026-07-27T12:12:31Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-27T12:12:31Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=e01cfff5ddddd9cefdb19536e31257cdae5821f6'/>
<id>urn:sha1:e01cfff5ddddd9cefdb19536e31257cdae5821f6</id>
<content type='text'>
temporalEF validated against Divinum Officium data. Season-mapping handles the
Whit octave (Paschaltide), the Christmas vigil (Advent), and the resumed
Epiphany Sundays (within Time after Pentecost).
</content>
</entry>
</feed>
