summaryrefslogtreecommitdiff
path: root/CHANGELOG.md
blob: 866a33821f5bf72d741f4530d5b564af7dc82626 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Changelog

One line per release. Versions are git tags (`vX.Y.Z`).

## [0.6.0] - 2026-08-18
- Writing a local calendar gets a feedback loop. An overlay is still **applied, not validated** — the five test layers assert things about the *shipped* calendar and cannot vouch for a user's file — but until now the only way to learn whether yours did what you meant was to generate a year of output and grep for your own slug, and the only way to see that a directive matched nothing was to notice a warning scroll past among 365 lines. **`colitur check FILE ...`** loads each overlay, applies it to the real shipped calendar, and reports the directive counts, the slug each one targets, and any directive that found no target; it exits 2 on a load failure or an unmatched directive, so it composes into a Makefile or a pre-commit hook. It answers three narrow questions — does the file parse, does every directive find its target, what does the merged result contain — and does *not* check a calendar against the rubrics, which the help text and man page both say, because the name invites a stronger reading than the command earns. **`colitur new-overlay`** prints a commented starter to stdout for redirection, rather than writing a file where it likes; every value in it is a placeholder that will appear in `day` output if left unedited, so a half-finished overlay is visible rather than silently inert. **The format is less hostile too**: `citations` and `layer` may now be omitted from an added celebration, defaulting to empty and to the overlay's own `id` — they were the two of eight fields carrying nothing an author could supply, and omitting them used to fail with `lib/kernel/celebration.ml.t_of_sexp: the following record elements were undefined`, naming a source file the author will never open. An explicitly stated value still wins, pinned in both directions. Parse errors stop naming kernel source paths. The leniency is scoped to overlays alone: `Layer.load`, which reads the shipped sanctoral, stays strict, because a missing field there is a defect rather than a convenience. 398 tests.

## [0.5.0] - 2026-08-18
- Two corrections, both found in primary sources the project already had but had not fully read. **`ubaldus` (16 May) and `didacus` (13 November) are III-class feasts, not commemorations** — found by auditing *all 290* fixed-date sanctoral entries against the Missal's own universal calendarium, anchored on the Roman calends column because the arabic day numbers are OCR-wrecked and the dominical letters vanish in some months. They were the only two status defects in the file; the 15 days the automated pass could not reach were read by hand. Universality is structural, not a judgement call: the calendarium carries no *pro aliquibus locis* marker in its 573 lines while the wider Missal carries 79 elsewhere, and each saint has his own Mass entry in the Proprium, which a bare commemoration never has. Neither needed a proper authored — each takes its Mass from a Common with only its Oratio proper — though one Common was newly transcribed (*Missa Iustus*, 1 Cor 4:9-14 / Luke 12:32-34, read independently in both scans). 13 036 days change, every one classified. **RG 113's first sentence is now implemented**: *"Commemoratio de Tempore fit primo loco"* — only its second sentence was, so ordering ran through the precedence table for every commemoration including the seasonal one. Reconciled with RG 110(c)'s *"ante omnes alias commemorationes"* by the term the two rubrics share, whose sense RG 113's own sentence fixes: season, then the inseparable Peter/Paul pair, then table order. 3 533 days change, **every one order-only** — identical commemoration sets, verified as sorted multisets. Also: every Latin quotation in the rules register re-audited against the electronic transcription — all 26 rubric quotations verbatim, zero errors — which established that rubrics must be checked against the transcription and propers against the photographic scans, the confusion that nearly lost RG 110(c). 396 tests.

## [0.4.0] - 2026-08-18
- Three colour corrections, and the first findings in this project's history made against sources **outside its own data lineage**. colitur was bootstrapped from lectio, lectio's ini is generated from missalemeum, and missalemeum uses Divinum Officium's data files — so the differential and the oracle, layers 3 and 4, are one witness counted twice, and an error inherited at the root is invisible to both. Two sources outside that tree were admitted this release, each with its rubrical edition established *before* use: a published **1962 Ordo** (three liturgical years, 1091 days, 1504 permitted Masses) and **O'Connell's *The Celebration of Mass*, 4th ed. (1964)**, revised throughout to the Codex Rubricarum (1960) and the 1962 Missal. **Good Friday is black, not violet** (RG 128(b)'s own exception for the *Actio liturgica ... usque ad Communionem exclusive*, with RG 132) — recorded in the register as an acknowledged gap since Task 16 and closed here. **The Vigil of the Assumption and the Vigil of St Lawrence are violet**, not white and red (RG 128, "vigils of II and III class outside Paschaltide"); the Ascension's vigil is untouched, being the one such vigil *inside* Paschaltide. That rule had sat transcribed in the register since 11 August, disagreeing with the shipped data the whole time, while both layers stayed green on the shared error. 22 809 days change across 1583–9999, every one colour-only, none unclassified — and the two vigils' identical 7 196 was verified against an independent implementation rather than accepted. Also: **rose stays on Gaudete and Laetare**, now a decided position rather than an unexamined one (RG 131 is permissive, so the colour field carries a permission there, not a requirement). Divergences from every Divinum-Officium-lineage source are cited, not adopted: C37 and M29. 395 tests.

## [0.3.1] - 2026-08-18
- Adjudications and evidence only; no behaviour change. **M13 closed** — St Joseph is not displaced from Passion Friday: the hypothesis the entry rested on (a rubric at Joseph's own propers entry, "the same shape as the Annunciation's") was checked directly and is false, and the analogue does not exist either, the Annunciation's exception living in RG 96 rather than its propers. **Mass I of the BVM Saturday** needs no corroborating oracle year because none can exist: Advent has no IV-class ferias, so that office never falls there. **A third oracle window, 2035**, witnessing `isidore-of-seville` and with him `common-of-doctors`, the one Common no window had ever tested — closing step 4's blind spot as far as the method allows, the last two saints being unreachable by construction. 393 tests.

## [0.3.0] - 2026-08-17
- Three EF corrections and a new resolution step, all argued from the Missal rather than from oracle agreement. **The votive Mass of Our Lady on Saturday** (RG 309(a)): the office had been kept since v0.1 but read the feria's Mass, so the day observed Our Lady and read the parable of the weeds; it now selects among the Missal's five *Missae de sancta Maria in sabbato* by season — 87 611 reading rows, every one a Saturday. **The Seven Sorrows of Passion Friday**, a movable commemoration colitur had no trace of, buildable only once `Date_spec` grew `Easter_offset`; adding it *reversed* an allow-list verdict, since RG 111(d) admits two commemorations on a III-class day and colitur admits exactly two where the oracle drops one. **The week after Trinity**, which now says the Mass the Missal prints for it, under RG 299's *nisi propria Missa assignetur* — and the same rule shows the Christ-the-King-week divergence was never a bug at all. RG 299 also closes a standing gap: the ferial-Mass rule was recorded as unconfirmed against the primary source and is now cited.

## [0.2.0] - 2026-08-17
- `Date_spec` carries movable dates: `Easter_offset` and `Nth_weekday` beside `Fixed`, whose on-disk form is unchanged so all 327 sanctoral entries parse untouched. Easter comes from the rite, not the kernel, which ships both Gregorian and Julian and must not pick. `Layer` keeps a split index — fixed entries year-independent as before, movable ones resolved per civil year. That unblocked **Rogation Wednesday** (RG 87/88/89), recorded as architecturally blocked since 13 August on reasoning that turned out to rest on `Date_spec`'s expressiveness rather than the entity's nature: 2 257 days across the domain, and in the other 6 160 an impeded feast takes the single slot RG 111 allows. And it unblocked **`colitur --overlay FILE`** (repeatable, ordered), which applies a user calendar on top of the shipped one — never instead of it — so a diocese or parish can add local feasts, fixed or movable. An overlay is applied, not validated: the five test layers assert things about the shipped calendar and cannot vouch for a user's file. Also: a second oracle year (2038, live-captured) closing the Common route's blind spot, `--version`, a Makefile, and a man page.

## [0.1.0] - 2026-08-17
- First tag. The Extraordinary Form (1962 Roman Missal) end to end: the complete temporal cycle, the resolution engine (occurrence, precedence, commemorations, transfers) against the sanctoral calendar, and the Mass reading citations for every day — correct and total over 1583–9999, with no clock, randomness or environment read below the CLI. Four commands (`easter`, `temporal`, `day`, `readings`) plus `--help`/`--version`, a man page, and a Makefile that installs binary, calendar data and man page into `~/.local` by default. Validated in five layers: types, QCheck properties over every year in the domain, a 16 801-day differential against the sibling lectio engine, two independent missalemeum oracle windows (2026–2027 and 2038), and ~36 hand-verified golden pins — 375 tests. Rules are computed against the Missal and its *Rubricae Generales*, with every published-calendar divergence adjudicated against the primary text rather than adopted; several are resolved in this engine's favour and cited in the register. Not included: the Ordinary Form, the chants (Psalm/Gradual/Tract/Alleluia/Sequence, deliberately rejected rather than guessed), and template-driven output.