From 32e792a0741f62fc2c0c7dcf9255408b3256fad5 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 27 Aug 2026 12:33:43 +0200 Subject: fix(cli): make the flag surface systematic An audit probed every flag against every command rather than reading --help, and found three inconsistencies. --rite reached only `day` and `readings`. main.ml's own comment gave the reason -- "has not been widened to a second rite in this task" -- a scope note that had outlived its task and hardened into apparent design. View.of_days was already polymorphic over the rite's type parameters, so widening was plumbing, not library work: `temporal`, `rubrics`, `emit`, `table`, `render` and `publish` now all take it. `temporal` was the sharpest case. Its refusal said "--rite has no effect on `temporal`", which was false: the EF has Septuagesima and Passiontide, the OF neither, and every EF slug is ef-prefixed, so the flag would change nearly every line. A message claiming no effect where the effect is total is exactly what the audit set out to find. Three ways of naming a year (positional, --year, --from/--to) now cross-accept additively; naming two that disagree is a usage error rather than one silently winning. emit --format csv gained a rite-dependent header: EF's 16 columns are unchanged, OF gets a 17th "second" between "first" and "gospel". An earlier task had recorded RFC 4180 as permanently blocking this; the rule constrains one file, not a family of them. `rubrics` keeps refusing --lang/--raw, now with its reason. An intermediate version accepted them by adding a name column, which changed the default from six tab-separated fields to seven and broke both existing consumers and the byte-identical-EF rule. The asymmetry is real but principled: the row is a date, a slug, a source keyword, two booleans and a preface key, so there is nothing to translate and nothing to strip. `easter` refuses --rite for the same kind of reason -- its six anchors sit at identical Easter offsets in both rites. EF output verified byte-identical to 8590338 across day, readings, rubrics, temporal and easter for 2026, 1583 and 9999, and across all five emit formats. --- lib/render/emit_csv.mli | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib/render/emit_csv.mli') diff --git a/lib/render/emit_csv.mli b/lib/render/emit_csv.mli index 262f660..cd7fd5a 100644 --- a/lib/render/emit_csv.mli +++ b/lib/render/emit_csv.mli @@ -6,4 +6,8 @@ double an embedded quote. Exposed for testing. *) val escape_field : string -> string +(** The header is [rite]-dependent (read from [v] itself, its own "rite" + key): EF's 16 columns are unchanged from before this field existed; + any other rite (OF) gets a 17th, "second", between "first" and + "gospel" -- see emit_csv.ml's own [columns] for the full argument. *) val year : Template.value -> string -- cgit v1.3