<feed xmlns='http://www.w3.org/2005/Atom'>
<title>lectio.git/scripts, branch v0.45.0</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=v0.45.0</id>
<link rel='self' href='https://git.labunix.xyz/lectio.git/atom?h=v0.45.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/'/>
<updated>2026-07-29T09:13:03Z</updated>
<entry>
<title>bible(grb): restrict to the Vulgate canon; restore Hosea and Zechariah</title>
<updated>2026-07-29T09:13:03Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-29T09:13:03Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=ab9a02b34d88e6c85e4d494077bb474dc19adbce'/>
<id>urn:sha1:ab9a02b34d88e6c85e4d494077bb474dc19adbce</id>
<content type='text'>
grb failed corpus-check outright: 15 errors, and two whole books absent from
lectio at runtime with no error and no warning.

Upstream grb is a standalone Septuagint reader carrying 87 books. lectio needs
one uniform canon, so scripts/gen-grb-lectio.py derives the 73 books vul has
rather than forking -- upstream stays intact and keeps everything.

Eleven books have no Vulgate counterpart and are dropped, including 2 Esdras,
which upstream's README explains IS Ezra + Nehemiah under the Septuagint's
name; verified byte-identical, so nothing is lost. Five books ARE canonical
under other names and are remapped, and the verse counts show which witness
the Vulgate follows -- Jerome translated Theodotion, not the Old Greek:

    Bel and the Dragon (Theodotion)  42 = vul Daniel 14 (42)   exact
    Bel and the Dragon (LXX)         37                        no
    Sussana (Theodotion)             64 = vul Daniel 13 (65)
    Sussana (LXX)                    37                        no
    Letter of Jeremiah               73 = vul Baruch 6  (72)
    Wisdom of Solomon               435 = vul Wisdom   (439)

Upstream's plain "Daniel" is the Old Greek and is missing chapter 4 outright,
so Theodotion supplies Daniel throughout: complete, and the tradition the
lectionary actually cites. lectio thereby GAINS Wisdom, Daniel 4, Daniel 13-14
and Baruch 6 in Greek rather than losing them.

Three upstream defects are repaired in transit:

  * 408 rows carried 5 fields, not 6 -- a lost tab fused the book number and
    chapter ("281" = book 28, chapter 1). Every one was in Hosea or Zechariah,
    and neither book had a single well-formed row, so bible.go skipped both
    entirely. Hosea (197 verses) and Zechariah (211) are back.
  * 5 merged verse labels ("27-28") that strconv.Atoi turns into verse 0.
  * A UTF-8 BOM welded to the first book name, making "Genesis" a phantom
    74th book matching nothing.

The SBLGNT apparatus sigla are stripped, as TestGrbNoApparatusMarkers
requires; regenerating from raw upstream reintroduces ~8700 of them.

grb now passes. The remaining warnings are the Septuagint being itself --
Jeremiah is LXX-numbered (grb 33:2 is the Vulgate's 26:2), Esther integrates
its additions into chapters 1-10, LXX Malachi has three chapters, and 3
Kingdoms carries supplements like 10:22a that upstream stores as a duplicate
verse 22. Silencing those would mean deleting real Greek text.
</content>
</entry>
<entry>
<title>bible(wuj): rebuild from source, repair to exact Vulgate parity</title>
<updated>2026-07-29T09:12:24Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-29T09:12:24Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=390535ff00d61df63a15de6fba23761a2c57cead'/>
<id>urn:sha1:390535ff00d61df63a15de6fba23761a2c57cead</id>
<content type='text'>
The Wujek corpus was missing text and mis-numbering what it had: 453
corpus-check warnings, 8 absent chapters, 84 duplicate rows, and 357 chapters
holding fewer verses than the Vulgate.

Most of it was never a sourcing problem. The original harvest of
biblia.info.pl assumed one verse is one &lt;p&gt;, but many psalms print the
superscription in the anchored paragraph and the psalm's opening line in an
unanchored one behind a drop cap -- so 44 psalms lost their first line, and
Acts 6:5 and others went the same way. Re-harvested with the anchor treated as
a verse START rather than a whole verse (scripts/scrape-wujek.py), which also
had to cope with four anchor shapes across books, hidden page markers opening
paragraphs mid-verse, chapter ids that are simply wrong (Mark labels 87
anchors "15:*" across chapters 14-16), and Psalms heading its divisions
"Psalm CXVII" where every other book says "Rozdzial N".

Structure was then repaired against the Clementine Vulgate, by hand where a
rule would have guessed:

  * The Acts 5 interleaved three streams -- Acts 4:27-37 duplicated, the real
    5:1-37, and 5:38-39 mislabelled 28-29. Verified against the Latin, the
    duplicates dropped, the two renumbered. Acts 4:27 kept the site's own
    wording in place of a 1962 reading, removing a seam.
  * The site heads psalms by Hebrew division; its "Psalm 114" is two psalms.
    Split into Vulgate 113:9-26 and 114:1-9, confirmed at all four boundaries.
  * A corrupt anchor for 1 Chronicles 9:11 pushed 34 paragraphs of genealogy
    into chapter 10. Counts corroborate: 10 + 34 = 44 verses, remainder 14,
    both exactly the Vulgate's.
  * 16 chapters looked short at the end; only two verses were truly absent.
    The rest were merges, split at anchors read off the Latin -- including one
    across a chapter boundary (Colossians 4:1 sat inside 3:25) and four
    numbering offsets where a mid-chapter merge shifted everything after it.

wuj now carries exactly the Vulgate's verse set: 35810 rows, every one of the
1334 chapters matching, no duplicates, no gaps. corpus-check: 0 warnings.

The ~300 verses that could not come from biblia.info.pl are recorded in
NOTICE; they are not public domain.
</content>
</entry>
<entry>
<title>scripts: add validate-engine.py per-day oracles (litcal/missalemeum)</title>
<updated>2026-07-28T13:14:33Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T13:14:33Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=f7344bb3de2885323a785bdc8d087bc034407fc4'/>
<id>urn:sha1:f7344bb3de2885323a785bdc8d087bc034407fc4</id>
<content type='text'>
Manual QA validators (not run by go test) that build the CLI and compare its
computed calendar/readings day-by-day against authoritative online sources:
  of-calendar  -- OF season/cycle/observed vs the LiturgicalCalendar API (litcal)
  of-readings  -- every OF reading resolves against a corpus (offline)
  ef           -- EF reading gaps + tail/resumed-Sunday gospels vs missalemeum
  ranks        -- OF sanctoral ranks vs litcal

These found the defects fixed in the flawlessness pass; keep them as standing
regression oracles. API responses cache under scripts/.oracle-cache/ (ignored).
</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): Christmas-season weekday ferials from catholic-resources.org (date-based)</title>
<updated>2026-07-28T08:45:09Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T08:45:09Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=d571091e25e87758c3c77fbc8b2d935bcc8304a4'/>
<id>urn:sha1:d571091e25e87758c3c77fbc8b2d935bcc8304a4</id>
<content type='text'>
Completes the seasonal weekday lectionary. The Christmas-season weekdays sit on
the AdventChristmas page in a SHIFTED 6-column layout (Day in c[1], not c[2] like
Advent's 7-column) -- the generator now finds the Day column wherever it is. Adds
date-based slugs to temporal.go: christmas-dec-&lt;29..31&gt; (octave), christmas-jan-&lt;2..7&gt;
(before Epiphany), christmas-after-epiphany-&lt;weekday&gt; (before the Baptism). Fixes
the christmas-octave-fri coverage gap and the by-date/by-week collision.

362/362 seasonal ferial-days render across 2026-2029 with 0 gaps. Extends
TestOFSeasonalFerials. All of Advent/Lent/Easter/Christmas weekdays now CR-sourced;
only the Commons remain (optional -- memorials default to the ferial).
</content>
</entry>
<entry>
<title>feat(of): seasonal weekday ferials from catholic-resources.org + date-based late Advent</title>
<updated>2026-07-28T08:35:21Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T08:35:21Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=44cb30b7ffcd776b26952080d1ec3587282a3db4'/>
<id>urn:sha1:44cb30b7ffcd776b26952080d1ec3587282a3db4</id>
<content type='text'>
Re-sources the proper weekdays of Advent (weeks 1-3), Lent, and Eastertide from
catholic-resources.org (scripts/genlect-of-season-ferials-cr.py; single-cycle, so
both -I/-II keys get the same readings). The diff caught real niedziela defects:
- Easter weekday first readings contaminated (easter-3-mon had 1 Cor 15 instead
  of Acts 6:8-15; easter-4-thu had Rev 12 instead of Acts 13:13-25).
- The Easter octave weekdays (Easter Mon-Sat) had no readings at all.
- Stray psalm-numbering artifacts (147A(146), Ps42(41)) cleared.

Late Advent (Dec 17-24) is proper to the DATE, not the Advent week, so temporal.go
now keys those days 'advent-dec-&lt;day&gt;' (fixing the same by-date/by-week collision
as the OT numbering) and the generator supplies them (Dec 17 = the genealogy
Matt 1:1-17; Dec 24 = the Benedictus).

157 seasonal ferial-days render across 2026-2028 with 1 residual gap
(christmas-octave-fri). Adds TestOFSeasonalFerials, credits the source, bumps to
0.43.0. Christmas-season weekdays (Dec 29-31, Jan 2-5) remain niedziela-sourced
(CR's shifted layout + Epiphany-dependent assignment -- a documented follow-up).
</content>
</entry>
<entry>
<title>chore: drop accidentally-committed __pycache__, ignore it</title>
<updated>2026-07-28T08:20:50Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T08:20:50Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=9af8c834c393050179f6ff48c0766e9871e18240'/>
<id>urn:sha1:9af8c834c393050179f6ff48c0766e9871e18240</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(of): complete Sunday lectionary from catholic-resources.org (restore 2nd readings)</title>
<updated>2026-07-28T08:20:23Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T08:20:23Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=a92bb734f2a1780431fd2fbab65aa814200397f7'/>
<id>urn:sha1:a92bb734f2a1780431fd2fbab65aa814200397f7</id>
<content type='text'>
The niedziela harvest had dropped the SECOND reading on 271 of ~299 Sunday-cycle
entries (a Sunday Mass is first/psalm/second/gospel). scripts/genlect-of-sundays-cr.py
re-sources the temporal Sunday &amp; solemnity lectionary (Ordinary Time, Advent,
Christmas, Lent, Easter, Trinity, Corpus Christi, Sacred Heart, Christ the King;
all three cycles A/B/C) from catholic-resources.org, keyed by liturgical position,
and merges the complete readings into of-lectionary.ini.

- Also corrects ~6 contaminated Sunday first readings the niedziela by-date
  harvest had picked up (ordinary-sunday-21-B had a Marian Prov 8; advent-2-A had
  the Immaculate Conception's Gen 3; Christ the King B/C, Trinity C, Pentecost,
  Ascension/7th-of-Easter were wrong).
- Content-validated: every changed first reading verified against the old one
  (all changes are correct fixes or the identical passage, book spelling aside).
- Handles source quirks: hyphen/en-dash/ABC cycle markers, verbose Year-A
  solemnity names, 'opt:' cycle-proper alternates, '[2025: Corpus Christi]'
  displacement notes appended to names, Palm Sunday (cycle-independent
  first/second, per-cycle Passion gospel kept), and abbreviation variants
  (Jon/Is/Mt/Act/Zac...).

157/157 Sundays render first+psalm+second+gospel across 2026-2028. Adds
TestOFSundayCompleteReadings, credits the source in NOTICE, bumps to 0.42.0.
</content>
</entry>
<entry>
<title>feat(of): proper Mass readings for the sanctoral (from catholic-resources.org)</title>
<updated>2026-07-28T07:46:54Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T07:46:54Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=97f704b659ea6c72c4aa354378b347283ecc5cac'/>
<id>urn:sha1:97f704b659ea6c72c4aa354378b347283ecc5cac</id>
<content type='text'>
OF feasts, solemnities, and proper-reading memorials had no readings of their own
and fell back to the day's ferial (Barnabas showed the ferial instead of Acts 11;
Our Lady of Sorrows / the Guardian Angels showed the ferial instead of their
proper gospel). scripts/gen-of-sanctoral-readings.py scrapes catholic-resources.org's
Proper of Saints table and inlines reading.first/psalm/second/gospel into
roman-calendar.ini for the 41 universal-calendar celebrations marked PROPER (plus
every feast/solemnity); memorials that draw on a Common keep the ferial, which is
the OF default. Handles the source quirks: 'or' alternatives (takes the first),
cycle-specific A:/B:/C: gospels (takes A), lectionary # refs, and vigil-vs-day
(keeps the day Mass). All 41 render; citations only. Adds
TestUniversalSanctoralReadings, credits the source in NOTICE, bumps to 0.41.0.
</content>
</entry>
<entry>
<title>fix(of): canonical OT ferial week numbering + CR-sourced ferial lectionary</title>
<updated>2026-07-28T07:30:22Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T07:30:22Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=6641ce335de522e6d51c47ad9d14f69726650592'/>
<id>urn:sha1:6641ce335de522e6d51c47ad9d14f69726650592</id>
<content type='text'>
The Ordinary Form ferial lectionary had two linked defects, both from harvesting
niedziela.pl by date: (1) post-Pentecost Ordinary-Time ferial WEEK NUMBERS were
one too high (temporal.go counted back from Christ the King using the weekday
itself, not its preceding Sunday, so a ferial took the next week's number), and
(2) ~17 ferial keys held a SAINT's readings (stored when a saint displaced the
ferial on the queried date, e.g. week 22 smeared with a Marian Prov 8/John 2),
plus 16 weekday slots were missing entirely.

- temporal.go: number a span-2 ferial from its preceding Sunday. Verified
  388/388 ferial-week agreement with calapi across 2026-2028.
- scripts/genlect-of-cr.py: regenerate the Ordinary-Time ferial lectionary
  (first/psalm/gospel, both years, all 34 weeks) from catholic-resources.org
  (Fr. Felix Just, S.J.), which is keyed by liturgical position (immune to
  by-date contamination) and complete. Citations only; text still rendered from
  the public-domain corpora. of-lectionary.ini OT ferials now 408 (was 392).

Fixes ~17 contaminated entries + 16 gaps + the week-numbering audit item. Psalms
already share modern numbering, so no conversion. Adds TestOFOrdinaryTimeFerialWeek.
Credits catholic-resources.org in NOTICE. Bumps to 0.40.0.
</content>
</entry>
</feed>
