<feed xmlns='http://www.w3.org/2005/Atom'>
<title>lectio.git/internal/caldata/readings.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-18T15:15:27Z</updated>
<entry>
<title>fix(ef): the ferias between Epiphany and the Sunday after it</title>
<updated>2026-08-18T15:15:27Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T15:15:27Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=d27336dc65c7348dcda639b7e43e8948e7bb1caa'/>
<id>urn:sha1:d27336dc65c7348dcda639b7e43e8948e7bb1caa</id>
<content type='text'>
They repeat Epiphany's own Mass, Isa 60:1-6 / Matt 2:1-12. lectio gave them
the Mass of the first Sunday AFTER Epiphany (Rom 12:1-5 / Luke 2:42-52), which
belongs to the ferias that follow that Sunday, not to the ones before it.

The two groups cannot be told apart by slug: both are
ef-time-after-epiphany-1-&lt;weekday&gt;, because the week numbering starts at the
Sunday and the days before it fall in the same numbered week. So the split is
made on the date, against the same anchor efWeek uses.

Saturdays need no exclusion here -- an unoccupied Saturday in the window
carries Our Lady's office and her Mass, and that check runs first. colitur
reaches the same result by listing only the five non-Saturday weekdays.

7, 9 and 12 January 2026 now all match colitur, the 12th being the boundary
case: it follows the Sunday of the 11th and correctly keeps Rom 12:1-5.
</content>
</entry>
<entry>
<title>feat(ef): the Most Holy Name of Jesus, and the ferias of 2-5 January</title>
<updated>2026-08-18T15:02:47Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T15:02:47Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=9572942a0db4a89aaddd42cd33182d44a6e1fefb'/>
<id>urn:sha1:9572942a0db4a89aaddd42cd33182d44a6e1fefb</id>
<content type='text'>
RG 17(a): "festum Ss.mi Nominis Iesu, celebrandum dominica quae occurrit a die
2 ad 5 ianuarii, secus die 2 ianuarii." The Most Holy Name is kept on the
Sunday falling 2-5 January and, when no Sunday falls in that window, on 2
January instead. lectio built neither shape, so the day was an ordinary Sunday
within the octave and read Gal 4:1-7.

The FALLBACK matters more than it looks. The window is four days wide, so in
about three years in seven no Sunday lands in it -- in those years there was no
Holy Name office at all, a missing II-class feast rather than a misnamed one.
The test pins both shapes, checks the fallback does NOT also fire in a year
where the Sunday carries the feast, and asserts across 2005-2050 that every
year gets it exactly once by one shape or the other.

Separately, the ferial days of that window get their own Mass. The Missal's
rubric at the feast says it directly: "Diebus ferialibus a 2 ad 5 ianuarii
Missa dicitur ut die 1 ianuarii" -- the Circumcision's Mass, Titus 2:11-15 /
Luke 2:21. They had been falling through to the Sunday within the octave.

Ferial only, and the exclusions are the interesting part: the Sunday carries
the Holy Name and its own Mass, and an unoccupied Saturday carries Our Lady's
office and hers. 3 January 2026 is such a Saturday and correctly reads
Titus 3:4-7, not 2:11-15 -- which works because the BVM check runs first.

All four days of 2-5 January 2026 now match colitur.
</content>
</entry>
<entry>
<title>fix(ef): the weekdays within the Octave of the Nativity have their own Mass</title>
<updated>2026-08-18T14:32:52Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T14:32:52Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=5ee75098e1c86fdce195df2e37784c18a2b081a5'/>
<id>urn:sha1:5ee75098e1c86fdce195df2e37784c18a2b081a5</id>
<content type='text'>
29, 30 and 31 December are named days in the Missal's calendarium -- "De V die
infra octavam Nativitatis Domini, II classis" and so on -- with a direct
formulary, "Diebus infra octavam Nativitatis Domini": Titus 3:4-7 /
Luke 2:15-20, and each date's own rubric pointing at it ("Die 29 decembris ...
Missa Puer natus est nobis, ut supra").

lectio treated them as ordinary Christmas ferias, so they fell back to the
preceding Sunday and served "Dominica infra octavam Nativitatis Domini"
(Gal 4:1-7 / Luke 2:33-40) -- a different heading, for the Sunday
specifically.

Worth recording because it is not a guess: colitur made the IDENTICAL mistake,
gave these three days the Sunday's citation, measured it against real years
and reverted it. Its bootstrap_lectionary.ml keeps the rejection on record
with the scan references for both headings, which is how this one was
diagnosed rather than re-derived.

Only the weekdays. When 29-31 December falls on a Sunday the day really IS
Dominica infra octavam and keeps the Sunday's Mass -- 2030-12-29 is the case,
and it is asserted, because a fix applied by date alone would pass on the
weekdays and silently swallow the Sunday. Mutation-tested: dropping the Sunday
exclusion reddens exactly that assertion and nothing else.
</content>
</entry>
<entry>
<title>feat(ef): the Mass of Our Lady on Saturday (RG 309(a))</title>
<updated>2026-08-18T14:27:05Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T14:27:05Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=2dc44fbbc581430e2038e2ff6d67265fe716791c'/>
<id>urn:sha1:2dc44fbbc581430e2038e2ff6d67265fe716791c</id>
<content type='text'>
RG 78 gave the day Our Lady's office and its white colour; this gives it her
Mass. RG 309(a): "Missae de sancta Maria in sabbato ... iuxta temporum
diversitatem" -- the Missal prints five formularies and the season selects
among them.

Without it the day was kept as Our Lady's and then read the FERIA's Mass, so a
Saturday in Septuagesima announced Our Lady and read the parable of the
labourers. colitur hit and fixed the identical bug in its own v0.3.0.

The five, with the two seams that are easy to get wrong:
  Advent            Isa 7:10-15      / Luke 1:26-38
  Christmas Time    Titus 3:4-7      / Luke 2:15-20
  ...and on until the Purification (2 February), not merely to the end of
     Christmas Time
  thereafter        Ecclus 24:14-16  / Luke 11:27-28
  Paschaltide       Ecclus 24:14-16  / John 19:25-27  -- same first reading,
     different gospel, which is why the test asserts the gospel separately

Citations are colitur's, verified there against both photographic scans.

The Advent formulary is unreachable as the Saturday office -- Advent has no
IV-class ferias -- and is kept anyway, because RG 309's subject is the Masses
themselves and a missing branch would fall through silently if the rank rules
ever changed.

Guarded on the office rather than the day: a sanctoral feast that outranks the
Saturday keeps its own readings, so the observed slug must still be the
temporal one. All twelve BVM Saturdays of 2026 now agree with colitur on
readings, where none did before.
</content>
</entry>
<entry>
<title>fix(EF): fill reading gaps (major feasts, feria-repeat-through-feast, sundays)</title>
<updated>2026-07-28T12:46:17Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T12:46:17Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=cf45e9f7f3146bca6039b63e2be02463b02f8043'/>
<id>urn:sha1:cf45e9f7f3146bca6039b63e2be02463b02f8043</id>
<content type='text'>
EF readings had ~1.8% of days with no readings (major feasts falling back to
the wrong Sunday, feria-repeats broken when the preceding Sunday was a feast).
Now 0 gaps over 9496 days (2025-2050); reading correctness spot-checks match
missalemeum except the resumed-Epiphany-Sunday edge (next commit).

- calendar.TemporalSlug: the green-season weekday-repeats-the-Sunday rule uses
  the Sunday's TEMPORAL slug, so a Monday still finds its Sunday Mass when that
  Sunday was displaced by a feast (e.g. the Purification on Feb 2).
- Add the missing EF temporal Masses (from missalemeum): the Nativity Day Mass
  (Heb 1:1-12 / John 1:1-14), Epiphany (Isa 60:1-6 / Matt 2:1-12), the Octave
  Day of Christmas (Titus 2:11-15 / Luke 2:21), the 6th Sunday after Epiphany
  (1 Thess 1:2-10 / Matt 13:31-35), and the last Sunday after Pentecost
  (Col 1:9-14 / Matt 24:15-35).
</content>
</entry>
<entry>
<title>fix(of): partial-proper memorials compose proper part + ferial (match USCCB)</title>
<updated>2026-07-28T08:54:28Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T08:54:28Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=f0bfe1efb93e04e0e3b9a33b8b085fc09e86af36'/>
<id>urn:sha1:f0bfe1efb93e04e0e3b9a33b8b085fc09e86af36</id>
<content type='text'>
A memorial marked 'PROPER Gospel' (Guardian Angels, Mary Magdalene, Our Lady of
Sorrows, Joseph the Worker, the Passion of John the Baptist, Sts Martha/Mary/
Lazarus) uses the FERIAL first reading + its proper gospel; one marked 'PROPER
First Reading' (Barnabas) uses its proper first + the ferial gospel. Previously we
imported catholic-resources' *suggested* first for the gospel-proper ones, which
differs from what USCCB publishes.

- readings.go: when the observed's inline Mass has only a proper gospel (or only a
  proper first), fill the missing reading/psalm from the day's ferial and sort into
  canonical order. A fully-proper feast is untouched. Factored out ofFerial().
- gen-of-sanctoral-readings.py: keep only the strictly-proper part per the CR
  source-note.

Verified vs USCCB: Guardian Angels (2025-10-02) now = Nehemiah 8 / Ps 19 /
Matt 18:1-5,10 exactly. Updates TestUniversalSanctoralReadings.
</content>
</entry>
<entry>
<title>feat(of): full sanctoral calendar + weekday/memorial readings</title>
<updated>2026-07-27T22:47:16Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-27T22:47:16Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=e829b48b08c683d9dcef5e4b9502c1c42bc895f1'/>
<id>urn:sha1:e829b48b08c683d9dcef5e4b9502c1c42bc895f1</id>
<content type='text'>
Populate the OF General Roman Calendar sanctoral and extend the OF readings to
weekdays and sanctoral days.

Sanctoral calendar (roman-calendar.ini: 29 -&gt; 202 celebrations):
- scripts/gen-sanctoral.go generates it from calapi.inadiutorium.cz (authoritative
  General Roman Calendar) -- English name/rank/colour from general-en, Latin from
  general-la, Polish from niedziela DayInfo (obligatory celebrations). Fixed dates
  the temporal engine already computes are excluded. VALIDATED: my engine's
  observed rank agrees with calapi on all 86 obligatory sanctoral days of 2026
  (0 mismatches).

Precedence fix (precedence.go): an optional memorial no longer displaces the
weekday as the DEFAULT observed celebration (it sorts below the ferial, shown as
an option) -- matching the General Roman Calendar / calapi.

Readings (of-lectionary.ini: 254 -&gt; 1018 entries) via genlect-of.go:
- Weekday (ferial) 2-year cycle I/II, keyed &lt;ferial-slug&gt;-&lt;WeekdayCycle&gt;, harvested
  from niedziela over 2020-2025 (multiple years per cycle; retry-on-failure so a
  glitch year never poisons a key; only TRUE ferials + optional-memorial days,
  where niedziela shows the ferial).
- Obligatory memorials keyed by their OWN slug (niedziela shows their proper, e.g.
  Barnabas -&gt; Acts 11, or the ferial for memorials without a proper) -- never
  miskeyed to a ferial position.
- caldata.Readings: OF resolves slug+SundayCycle | slug+WeekdayCycle, else a
  memorial falls back to the day's ferial readings.
- Source-glitch normalisation (1J-&gt;1 J, PnP-&gt;Pnp).

books.ini: canonical names "Song of Solomon" and "The Acts" added as their own
[en] forms (ToEnglishRef emits the canonical; it must resolve). Fixes ~32
cross-chapter Song-of-Songs/Acts citations.

Coverage: 359/365 days of 2026 render (98.4%); 6 residual ferial positions never a
true-ferial in 2020-2025. EF sanctoral and OF psalm renumbering still pending.
</content>
</entry>
<entry>
<title>feat(caldata): OF Sunday/solemnity readings by slug+cycle (seed table)</title>
<updated>2026-07-27T21:27:07Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-27T21:27:07Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=4a35093c4358be17da6f0f374197caed743bda26'/>
<id>urn:sha1:4a35093c4358be17da6f0f374197caed743bda26</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(calfeed): shared day builder + reusable reading resolver</title>
<updated>2026-07-27T19:30:56Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-27T19:30:56Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=bec7c034aca15537900d74a7063d85c0f4deacae'/>
<id>urn:sha1:bec7c034aca15537900d74a7063d85c0f4deacae</id>
<content type='text'>
</content>
</entry>
</feed>
