aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 16:10:00 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 16:10:00 +0200
commitd5df5e79c731ac7f7f89969c0cafe564fdc6e8ab (patch)
tree9b288fe1bfaf78330aabd4681a4811339298b103
parent957a6d88ed447be16aa8c7e71250f4c9b87a832b (diff)
downloadcolitur-d5df5e79c731ac7f7f89969c0cafe564fdc6e8ab.tar.gz
colitur-d5df5e79c731ac7f7f89969c0cafe564fdc6e8ab.zip
docs: RG 91 entry 27 (BVM Saturday) resolved
CLAUDE.md's "Unbuilt, recorded" list and Data section move to reflect the closed gap: a new item 9 records the office's own build, citations and measured blast radius; the allow-list counts move to 7 active lectio entries (C17 new) and 11 active missalemeum entries (M2 closed). docs/research/rules-register.md (gitignored, not tracked) gets the matching update: §4's entry marked RESOLVED with a cross-reference, the §6 open-item checkbox closed, and a new §6.4 with the full primary-source account -- every scan reading quoted, the blast-radius reconciliation, and the mutation-test record.
-rw-r--r--CLAUDE.md83
1 files changed, 73 insertions, 10 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index 68cb906..8cfa902 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -232,11 +232,11 @@ in its provenance header) · `data/ef/adjustments.sexp` (overlay — `Add` as we
as `Suppress`/`Edit`: RG 110's own 30 June companion, `commemoration-of-st-peter`,
is genuinely missing from lectio's own source, not merely from colitur's
bootstrap, so it is hand-authored here rather than upstream) · two cited
-allow-lists, `expected-divergences.sexp` (6 active entries, vs lectio — C1, C6,
-C8, C14, C15, C16; several more closed and recorded in the register, not deleted)
-and `expected-divergences-missalemeum.sexp` (12 active, vs the oracle — M12
-closed/M19 opened this task, net count unchanged). Fixtures live in
-`test/fixtures/` with asserted SHA-256s.
+allow-lists, `expected-divergences.sexp` (7 active entries, vs lectio — C1, C6,
+C8, C14, C15, C16, C17; several more closed and recorded in the register, not
+deleted) and `expected-divergences-missalemeum.sexp` (11 active, vs the oracle —
+M2 closed/M18 widened by the `ef-bvm-saturday` task; M12 closed/M19 opened by an
+earlier one). Fixtures live in `test/fixtures/` with asserted SHA-256s.
**CLI**: `colitur easter <year>`, `temporal <year>`, `day <year>`.
@@ -474,11 +474,12 @@ Boniface 14 May, Evaristus, Theodore); and `romanus`, which should not exist on
9 August. lectio's ini is **generated from missalemeum**, so the two are one
lineage, not two independent sources.
-**Unbuilt, recorded**: RG 91 entry 27's BVM Saturday Office; RG 112(b)/(c)/(d)
-(only (a) has a live witness this codebase's data can construct). Allow-list
-entries M11 and M13 are `verdict open` by design. Holy Name of Jesus (RG 17(a))
-and RG 110 (inseparable Peter/Paul commemorations) are **RESOLVED — see item 4
-above.** The Sacred Triduum's own identity is **RESOLVED — see item 5 below.**
+**Unbuilt, recorded**: RG 112(b)/(c)/(d) (only (a) has a live witness this
+codebase's data can construct). Allow-list entries M11 and M13 are `verdict
+open` by design. Holy Name of Jesus (RG 17(a)) and RG 110 (inseparable
+Peter/Paul commemorations) are **RESOLVED — see item 4 above.** The Sacred
+Triduum's own identity is **RESOLVED — see item 5 below.** RG 91 entry 27's
+BVM Saturday Office is **RESOLVED — see item 9 below.**
Major Litanies (25 April) and the Rogation-Wednesday commemoration are
**NARROWED, still unbuilt — see item 5 below**: both rules are now
scan-verified and register-cited, but neither is built, because both need the
@@ -573,6 +574,68 @@ candidate is exactly one and already spoken for).
Ascension Vigil by construction, so there is no `(month, day)` pair a
`Fixed` spec could anchor to and no partial build exists at all.
+9. **RG 91 entry 27, the votive Office of the BVM on Saturday — RESOLVED
+ (2026-08-13, `ef-bvm-saturday` task).** `Precedence_ef.band` already
+ routed a plain IV-class Saturday feria to entry 27's own band value
+ (312 966 times domain-wide), but `Temporal_ef.temporal` never
+ constructed the office itself. Caput IX of the Rubricae Generales, both
+ photographic scans and the electronic transcription, word for word (no
+ scan-vs-transcription conflict — RG 78/79 are General Rubrics prose, not
+ the Mass-propers body text the transcription is missing): *"78. In
+ sabbatis, in quibus occurrit Officium de feria IV classis, fit de
+ sancta Maria in sabbato."* RG 78's own protasis IS "otherwise unoccupied
+ IV-class Saturday" — decided entirely by the existing occurrence
+ machinery (`band`'s own entry-27 branch already reads
+ `rank = Class4 && weekday = Sat` unconditionally and only wins when
+ nothing outranks it), so **no change to `band`, `disposition` or
+ `admit` was needed** — rank stays Class4 either way, and none of the
+ three reads slug/colour/name to decide anything. Colour is white,
+ unconditionally (RG 120(b), not RG 119/127/128's seasonal rules — this
+ office is never "de Tempore" for colour). The slug is deliberately
+ UNCHANGED (reused from the ordinary `<season>-<week>-<weekday>` ferial
+ fallback), the same precedent the Sacred Triduum (item 5) already set —
+ identified structurally, never off the slug — and for a second, load-
+ bearing reason found while building it: a bespoke uniform slug would
+ have broken `Validate`'s own slug-uniqueness-per-liturgical-year
+ invariant (asserted with zero exceptions since Plan 2), since the
+ office recurs many times a year. Subject is tagged `Bvm` (a real
+ `Subject.t` variant that existed, unused, since the kernel's vocabulary
+ was designed — no kernel change needed) and the name is Latin only
+ ("Officium sanctae Mariae in sabbato", RG 91 entry 27's own table title
+ and RG 79's own heading), the same zero-circularity discipline items
+ 3–5 already established. The I–V numbered "Missae de sancta Maria in
+ sabbato" (both scans) are a Mass-propers selection detail (RG 309(a):
+ *"iuxta temporum diversitatem"*) governing which readings are said, not
+ which office is kept — out of scope until Plan 4's lectionary.
+ **Blast radius, measured (`git archive` pre-change binary vs HEAD, full
+ 1583–9999 `Calendar`-resolved sweep, diffed): 75 853 days, every single
+ one the identical single-field shape (`colour` alone, always on a
+ Saturday, always `class-4` on both sides) — no anomaly.** Reconciled
+ against the full 312 930-day eligible population on the same sweep
+ domain: 102 144 are actually observed (the office wins), split by
+ season — 63 195 Time after Pentecost + 7 643 Septuagesima + 5 015 Time
+ after Epiphany (75 853 total, all VISIBLE, green/violet → white) and
+ 14 213 Paschaltide + 12 078 Christmastide (26 291, all INVISIBLE — RG
+ 119 already made those seasons white); the remaining 210 786 are
+ impeded by a real sanctoral winner and genuinely unaffected. Both
+ allow-lists moved: the lectio differential gained a new cited entry
+ (C17, colitur, 416 rows — lectio builds no equivalent office); the
+ missalemeum oracle's own M2 (previously `verdict missalemeum`, "colitur
+ is missing a whole office") is **CLOSED, REMOVED** — the colour
+ divergence it named no longer occurs on any of its 22 dates, and what
+ is left (`Observed_identity_unresolved` alone, the office is temporal-
+ origin and deliberately unnamed in English) is exactly `M18`'s own
+ shape, not a distinct citation any more; `M18` widens 373 → 395
+ accordingly. Mutation-tested: reverting the office to a constant-false
+ guard reddens the dedicated unit test, an end-to-end resolve test, a
+ golden pin, and both allow-list count pins (in both directions — the
+ fix present with M2 still declared fails identically to the fix absent
+ with M2 removed), while a second end-to-end test/golden pin (the office
+ losing to a real competing feast, 12 September, the one live data
+ witness that also carries `subject = Bvm`) is correctly untouched by
+ the mutation, proving RG 26's rank-keyed omission fires before any
+ subject-keyed rule ever could.
+
## How to work here
- **Superpowers workflow**: `brainstorming` → `writing-plans` → `executing-plans`