summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md11
-rw-r--r--README.md11
-rw-r--r--bin/main.ml2
-rw-r--r--colitur.opam2
-rw-r--r--dune-project2
5 files changed, 20 insertions, 8 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 89b2281..73421b7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,17 @@
One line per release. Versions are git tags (`vX.Y.Z`).
+## [1.2.0] - 2026-08-28
+- **Reading the output yourself, rather than through `awk`.** `--pretty` draws each day as its own box instead of a row: a heading with the date and the liturgical colour, then the celebration, its rank and season, and any commemorations, each on its own line. The box art is **pure ASCII** -- only `+`, `-` and `|`, never Unicode box-drawing -- because this format exists to be pasted or piped into a document, a mail or a plain-text ordo, and U+2500 and its relatives survive that only when every stage agrees about encoding and font; alignment counts UTF-8 code points rather than bytes, so a name carrying a ligature still lines the right edge up. Colour is written only when stdout is a terminal, `NO_COLOR` is honoured on presence whatever its value (the convention's own rule -- reading it as a boolean is how tools get it wrong), and the colour column degrades to its initial rather than simply vanishing when piped. Nothing should be written to parse it: its layout is free to change, which is precisely what the default format is not.
+- **`--month N`, `--date YYYY-MM-DD` and `--today`** narrow a report to part of a year. They matter most under `--pretty`, whose boxes span seven lines and so survive no line-wise `grep` at all -- the nearest equivalent is a paragraph-mode `awk` incantation that works only because the boxes happen to be blank-line separated -- but they are **independent** of it and narrow the default format too. The three are **alternatives, not a stack**: naming two is an error rather than a silent win for one. `--date` and `--today` NAME a year, so on those two the year may be omitted (`colitur day --today` is a complete command) and must agree when given as well, the same rule the positional year and `--year` already follow; the disagreement message names the flag, because with `--today` the second year appears nowhere on the command line for the reader to find. `--month` names no year and so still needs one. `temporal` refuses `--year` yet accepts `--date`/`--today` including as its year source, which is not an inconsistency: `--year` is a second spelling of the positional year, which `temporal` deliberately does not offer, whereas `--date` selects a DAY and merely happens to determine which year contains it.
+- Both are accepted by `day`, `readings`, `rubrics` and `temporal`, and **refused** by every other command rather than accepted and quietly ignored -- `emit`/`table`/`render`/`publish` already choose their shape through `--format` or `--template`, and `easter` prints six key/value lines rather than a day grid. `--pretty` had shipped undocumented in both `--help` and `colitur(1)`; both now describe it, alongside a new NARROWING A REPORT section. Default output is byte-identical to 1.1.0 across seven years, five commands and both rites, and across all five emit formats and the shipped templates. 916 tests.
+
+## [1.1.0] - 2026-08-27
+- **The Ordinary Form, as a peer rite.** `--rite of` on every command that a rite can affect. This release exists as much for what it tested as for what it adds: the `Rite` abstraction was designed against a single rite, and until now nothing had shown it generalised. It does -- `rite_of` satisfies `Rite.t` with no kernel special-casing. Six modules (vocab, temporal, precedence, rubrics, lectionary, and the bundle); the calendar transcribed from the **2002 Latin typical edition**, 209 entries, with **one independently citable overlay per post-2002 decree** rather than a merged file, so every change since the typical edition can be read, cited and reverted on its own; 1 725 reading citations. Where `--rite` cannot affect a command, the refusal says why in substance rather than reporting a scope boundary. EF output is byte-identical to 1.0.0, verified across `day`, `readings`, `rubrics`, `temporal` and `easter` for 2026, 1583 and 9999, and across all five emit formats.
+- **Building a second rite found five places the kernel had absorbed EF assumptions.** Two are fixed: `Validate`'s hardcoded `[First; Gospel]` reading set is now rite-supplied, and `transfer_target`'s "strictly later" obligation became "must differ from origin", which is the real invariant. The other three are documented with the rule that forced them.
+- **The known limitation, stated plainly**: the OF has no published-ordo witness, where the EF has three. Its external validation rests on litcal -- a second *implementation*, not a second *publication* -- whose identity comparison reaches about 12% of non-Triduum days. A wrong-saint-same-grade defect would not be caught today.
+- *(This entry was backfilled on 2026-08-28; 1.1.0 was tagged without one. Its content is taken from the v1.1.0 tag message, not reconstructed.)*
+
## [1.0.0] - 2026-08-24
- **colitur now prints what a real ordo prints for the Mass.** That is the whole of this release, and the scoping rule it was built to: nothing more, nothing less. `colitur rubrics <year>` gives, per day, which Mass formulary is said and how that was reached (`proper`/`own`/`preceding-sunday`/`common`/`votive`), the Gloria, the Creed and the preface; commemorations gained their Low-Mass/sung distinction. **The Creed** is RG 475-476, whose clause (a) reads the TEMPORAL cycle rather than the observed day — *"in qualibet dominica, etsi eius Officium alicui festo locum cedat"*, a Sunday impeded by a feast still says it — and whose clause (e) turns on *natalicia*, which is why the rubric must name the Chair of St Peter and St Barnabas explicitly and why the Conversion of St Paul is excluded; the Apostle list was derived from the shipped data and verified entry by entry rather than transcribed. **The Gloria** is RG 431-432, whose clause (a) defers a Mass question to the Breviary — *"quotiescumque ad Matutinum dictus est hymnus Te Deum"* — so the Te Deum is implemented as its own cited predicate from Breviary nn. 237-238 rather than collapsed into a colour heuristic. **The preface** is RG 482-499's chain, proper else seasonal else common, with RG 483 bounding it: no commemoration ever induces a proper preface. **Chants are deliberately absent** and always will be: a priest has the Missal open, and an ordo's job is what the book cannot tell you when you open it.
- **Four rubrical defects, every one found by an external witness rather than by inspection.** *The Creed was said at Requiem Masses* — RG 476(f) forbids it, and All Souls had been wrong every year; closed via a `Colour.Black` proxy sound because black occurs exactly twice in the whole engine. *The bissextile shift was missing entirely* — the calendarium's own February footnote moves St Matthias to 25 February and St Gabriel to 28 February in a leap year, *"et bis dicitur sexto calendas"*; 2 041 leap years, 6 983 days, and it surfaced only because a witness year covering 2024 was added. *Rogation Monday and Tuesday were violet* — RG 119(b) makes Paschaltide white and RG 128 does not list Rogations at all; the violet belongs to the votive Rogation Mass, not the day's office, and fixing it cascaded correctly into the Gloria. *The ferias after the Ascension resumed the preceding Sunday's Mass* — the Missal's own marginal rubric repeats the Ascension's through the week; 16 350 days.
diff --git a/README.md b/README.md
index 32cd61a..6e88778 100644
--- a/README.md
+++ b/README.md
@@ -33,8 +33,8 @@ and rules research under `docs/` (local).
opam switch create . 5.2.0 -y # first time: local OCaml switch
opam install -y dune alcotest qcheck qcheck-alcotest sexplib ppx_sexp_conv
dune build
-dune test # fast suite, 887 tests (~8s)
-COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force # + every year 1583-9999 (~80s)
+dune test # fast suite, 909 tests (~40s)
+COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force # + every year 1583-9999 (~8min)
dune exec colitur -- easter 2026 # Easter and its Easter-relative anchors
dune exec colitur -- temporal 2026 # the EF temporal cycle only, one line per day
dune exec colitur -- day 2026 # the full resolved EF calendar (temporal + sanctoral)
@@ -151,9 +151,10 @@ sections, `lang/traditions.ini` in full, and all three `--sigla-*` flags.
## Status
-Tagged releases (`v1.0.0` and earlier) are EF only; this line is being
-written from an unreleased branch that adds the OF module (see above).
-**887 tests**, of which the property suite runs against every year in
+Releases through `v1.0.0` are EF only; `v1.1.0` added the OF module as a
+peer rite (see above), and `v1.2.0` adds `--pretty` and the `--month`/
+`--date`/`--today` narrowing flags.
+**916 tests**, of which the property suite runs against every year in
1583-9999 rather than a sample — that is how confidence extends past the
~2050 horizon of any reference to check against. The six layers below
describe the EF's own validation specifically; the OF's own (also
diff --git a/bin/main.ml b/bin/main.ml
index 8b514b0..7565090 100644
--- a/bin/main.ml
+++ b/bin/main.ml
@@ -1984,7 +1984,7 @@ let publish_report ~rite ~lang ~sigla ~from_y ~to_y ~out ~overlays ~dtstamp ~pru
same reason. Deliberately NOT embedded in [help_text]: the cram test pins
help's first line, and a version in it would make every release edit a
test expectation for no gain. *)
-let version = "1.1.0"
+let version = "1.2.0"
let help_text =
{|colitur -- deterministic liturgical calendar engine (Roman rite, 1962)
diff --git a/colitur.opam b/colitur.opam
index fd59ec9..4460ac4 100644
--- a/colitur.opam
+++ b/colitur.opam
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
-version: "1.1.0"
+version: "1.2.0"
synopsis: "Deterministic liturgical calendar engine (computus liturgicus)"
depends: [
"ocaml"
diff --git a/dune-project b/dune-project
index 246c0ad..9b47223 100644
--- a/dune-project
+++ b/dune-project
@@ -1,6 +1,6 @@
(lang dune 3.0)
(name colitur)
-(version 1.1.0)
+(version 1.2.0)
(generate_opam_files true)
(cram enable)