1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
|
; data/ef/adjustments.sexp -- hand-authored overlay over data/ef/sanctoral.sexp
; (Task 11). NOT generated by tools/bootstrap_sanctoral.ml -- edit directly.
;
; Suppresses `vigil-of-christmas` (24 Dec, data/ef/sanctoral.sexp, lectio's
; own bootstrapped entry): it is the SAME celebration as colitur's temporal
; cycle's own `ef-nativity-vigil` (rite_ef/temporal_ef.ml's [named], also 24
; Dec, RG 91 entry 5), not a second, distinct one. Once the sanctoral layer
; is live, that date would otherwise carry two candidates for one feast.
; Recorded as an Overlay directive rather than filtered out of the bootstrap
; or special-cased in code, per the task brief -- an auditable, diagnosable
; removal (Overlay.apply's own diagnostic fires if this slug is ever absent,
; e.g. after a re-bootstrap that renames it), not a silent drop.
;
; RG16(a) task (docs/research/rules-register.md §6.0): corrects one of
; data/ef/sanctoral.sexp's six `(subject Lord)` entries, inherited unchecked
; from lectio's own `class = lord` field (tridentine-calendar.ini) --
; `most-holy-name-of-mary` (12 Sep): calendarium line "Sanctissimi Nominis
; Mariae, III classis" -- "Nominis Mariae", the Name of MARY, not of the
; Lord, with no counter-evidence found anywhere (the "D. N. I. C." formula
; the genuinely Lord-tagged entries carry, e.g. 6 Aug "IN TRANSFIGURATIONE
; D. N. I. C.", is simply absent here, and nothing else in the calendarium
; suggests otherwise). This tag has no behavioural effect either way today
; ({!Precedence_ef.band}'s entry 14, the only place [subject] is tested for
; a II-class candidate, requires [Class2]; this entry is [Class3]) -- kept
; for the data's own accuracy, not because anything currently reads it.
;
; The tag [Bvm] itself carries no further systematic meaning in this
; codebase beyond "not Lord" -- after this correction it exists on exactly
; this one entry, while every other Marian feast (the Assumption, the
; Immaculate Conception, the Nativity of the BVM, ...) stays `(subject
; Saint)`. Nothing reads [Bvm] specifically; {!Subject.t}'s four-way split
; is not fully exercised by this codebase's own logic, only [Lord] is.
;
; RG16(a) task, fix round 1 (CRITICAL finding, reverted): a companion Edit
; here previously also retagged `purification-of-the-blessed-virgin-mary`
; (2 Feb) to [Bvm], on the same calendarium-title argument ("B. Mariae
; Virg.", not "D. N. I. C."). REVERTED -- the user has ruled: follow the
; oracle. missalemeum (this project's designated EF oracle) treats the
; Purification as taking an occurring II-class Sunday's place OUTRIGHT, with
; NO commemoration of the Sunday (`2020-02-02`, `2014-02-02`: title
; "Purification of the Blessed Virgin Mary", `"commemorations": []`),
; exactly RG 16(a)'s own "festum Domini" treatment -- and NOT the treatment
; it gives an ordinary Marian feast on a Sunday (`2019-09-08`, the Nativity
; of the BVM: title "XIII Sunday after Pentecost", the FEAST demoted to a
; commemoration, the Sunday observed -- the opposite pattern). Genuine
; primary-text counter-evidence for the Marian reading remains on record
; (RG 120(b): the white-colour rule groups 2 February under "B. Mariae
; Virg.", a SEPARATE category from "Domini" -- register §6.0 quotes it in
; full), so the calendarium TITLE and the oracle's BEHAVIOUR disagree here;
; the user's ruling resolves that disagreement in the oracle's favour for
; this codebase's own purposes, not by declaring the calendarium argument
; wrong. See register §6.0 for the full account of both sides.
;
; ef-rebootstrap (2026-08-12): both directives re-examined against the
; regenerated source (tridentine-calendar.ini, SHA-256 1b303ef2...), which
; independently fixed several of the same defects this file was written to
; patch. Neither directive was removed -- reasoning below, per the task's
; own instruction to decide deliberately rather than delete on sight.
;
; `Edit most-holy-name-of-mary` -- the base bootstrap no longer needs this
; correction: the regenerated INI's own `[most-holy-name-of-mary]` section
; has DROPPED its `class = lord` field entirely (confirmed by direct grep
; against the source), so `tools/bootstrap_sanctoral.ml`'s `parse_subject`
; now falls through to its own default, `Subject.Saint` -- not `Lord` --
; before this overlay ever runs. Checked what {!Overlay.apply}'s [Edit]
; actually does with a directive whose target slug is present but whose
; field is no longer wrong, rather than assuming: [Edit] has no notion of
; "already correct" -- it looks up the slug, and if found (as this one
; still is) unconditionally folds every field_edit over the current value,
; firing NO diagnostic either way (overlay.ml's [apply_directive], the
; [Edit] branch: the only diagnostic is "slug not present", never "already
; matches"). So this is not a no-op: it still forces `Saint -> Bvm` on
; every run, identically to before, just starting from a different base
; value than it used to. Decision: KEEP, for two independent reasons, not
; one -- (1) DATA PRECISION, unaffected by the base bootstrap's own fix:
; the calendarium's "Sanctissimi Nominis Mariae" title names Mary
; specifically, so [Bvm] remains the more accurate tag than the generic
; [Saint] default, on the same textual grounds as the original entry
; above, regardless of what lectio's own `class` field happens to say this
; week. (2) REGRESSION DEFENCE: because [Set_subject] is unconditional, it
; also now stands as a guard against `class = lord` ever being
; RE-introduced for this slug by a future lectio regeneration -- the
; overlay would still force the result away from [Lord] (the one subject
; value {!Precedence_ef.band}'s RG 16(a) branch behaviourally reads),
; rather than silently letting a re-introduced bootstrap defect through.
; Removing the directive now would trade a currently-harmless redundancy
; for the loss of that guard.
;
; `Suppress vigil-of-christmas` -- re-verified, not assumed: `[vigil-of-
; christmas]` (24 Dec) is still present, unchanged, in both the
; regenerated INI and the regenerated `data/ef/sanctoral.sexp` (still the
; same duplicate of `rite_ef/temporal_ef.ml`'s own `ef-nativity-vigil`
; this directive was written to remove), so `Layer.mem` still finds it and
; {!Overlay.apply}'s [Suppress] branch still fires its ordinary
; slug-present path (no diagnostic) exactly as before. Nothing about this
; regeneration touched the reason this directive exists; kept unchanged.
;
; `Edit eusebius-confessor` -- NEW (ef-rebootstrap fix round 1, F3): this
; new entry's own bootstrapped colour, `Red`, is a LECTIO DATA DEFECT,
; found by checking the primary scan directly rather than trusting lectio's
; ini or missalemeum's own `:r` colour tag, which agree with each other but
; not with the Missal -- exactly the "two non-primary witnesses agreeing
; against the primary text" trap this project's own transcription-audit
; task already named once. `missale-romanum-1962.pdf`, 14 August, the
; commemoration's own proper: *"Eodem die 14 augusti / S. Eusebii Conf. /
; Commemoratio / Missa Iustus, ut in festo S. Pauli primi Eremitae, die 15
; ianuarii..."* -- "Conf." (Confessor, not Martyr), and the borrowed Mass
; "Iustus" is the SAME Mass 15 January's own St Paul the First Hermit uses
; -- a Confessor, white in both lectio's own data and colitur's
; (`paul-the-first-hermit`, `data/ef/sanctoral.sexp`) -- for the Common of
; Confessors. Corroborated negatively: lectio gives WHITE to every other
; Confessor/Abbot commemoration in its own data (`maur-abbot`, `giles`,
; `remigius`, `didacus`, `ubaldus`, `hilarion`, `sabbas`, `silvester`,
; `alexis`) -- Eusebius Confessor is the one exception, with no textual
; support found for it. No behavioural impact today (`Commemoration_only`
; entries are never the OBSERVED celebration, so this colour is never
; printed by the current pipeline -- but `Record`/rendering will read it
; the moment a template does), fixed for the data's own accuracy via the
; SAME overlay mechanism as the other two directives, since
; `data/ef/sanctoral.sexp` is generated and the source is upstream. Logged
; as a lectio-side generator/data defect in docs/research/rules-register.md
; for a future generator fix, not merely patched here silently.
;
; `Add commemoration-of-st-peter` -- NEW (ef-holyname-rg110 task, RG 110).
; A genuine DATA GAP in lectio's own source, not merely a colitur bootstrap
; miss: `~/git/projects/lectio/internal/caldata/tridentine-calendar.ini` has
; no 30 June entry for this at all (checked directly, `grep -n '30 June'`
; equivalent), so there is nothing for `tools/bootstrap_sanctoral.ml` to
; have picked up even correctly. RG 110's own text (docs/research/rules-
; register.md §4, Caput XIV): "In Officio et Missa S. Petri semper fit
; commemoratio S. Pauli, ET VICISSIM" -- in the Office and Mass of EITHER
; Peter or Paul, a commemoration of the OTHER is always made -- confirmed a
; THIRD time by the calendarium's own June table, BOTH photographic scans,
; word for word: "In Commemoratione S. Pauli Ap., III classis. /
; Commemoratio S. Petri Ap." -- exactly the SAME pattern already present in
; the base bootstrap for the other two RG 110 pairs (25 January's
; `conversion-of-st-paul` + `peter`; 22 February's `chair-of-st-peter` +
; `paul`), just missing here. `Precedence_ef.admit`'s own RG 110 mechanism
; (precedence_ef.ml) looks this slug up by name whenever
; `in-commemoratione-sancti-pauli-apostoli` is the day's own observed office
; -- a distinct slug from `peter` (25 January), because `peter` is already a
; DIFFERENT dated entry and this codebase's slugs are date-canonical, one
; date per slug (design spec §3.2). Class3/Commemoration_only/Saint, the
; SAME shape as `peter`/`paul`'s own two entries; names copied verbatim from
; `peter`'s own entry (the identical saint, the identical commemoration
; text, on a second date) -- NOT independently sourced from a missalemeum
; title (missalemeum shows no commemoration on this date at all, checked
; directly against its own fixture rows for both 2026 and 2027: neither
; year's `In Commemoratione Sancti Pauli Apostoli` row carries any
; commemoration -- missalemeum has the SAME gap this directive closes,
; verdict colitur in data/ef/expected-divergences-missalemeum.sexp's own
; M19). Colour Red: this ENTRY's own field has no independent primary-source
; pin (a bare "Commemoratio" line's own colour is not independently stated
; by the calendarium the way a full feast's class-and-colour line is -- the
; same honestly-flagged inference shape this file's own `romanus`/`eusebius-
; confessor` history already documents elsewhere in this project), chosen to
; match `paul`'s own entry and the HOST DAY's own Red -- and the host day's
; own Red IS now primary-sourced (fix round 1, coordinator finding F4), not
; merely RG 117's generic apostle/martyr default: RG 124(c), scan-verified
; word for word, `missale-romanum-1962.pdf`: "124. Item adhibetur color
; ruber in Officio et Missa de festis: ... c) Commemorationis S. Pauli
; Apostoli (30 iunii)" -- red is ALSO used in the Office and Mass of the
; feasts of ... (c) the Commemoration of St Paul the Apostle (30 June) --
; naming this exact date by number. Inert either way today
; (Commemoration_only entries are never the OBSERVED celebration, so this
; entry's OWN colour is never printed by the current pipeline, the same
; note `Edit eusebius-confessor` above makes for its own colour field).
;
; `Add major-litanies` -- NEW (ef-major-litanies task). RG 80 (Caput X, "De
; Litaniis maioribus et minoribus", §A "De Litaniis maioribus"; all three
; primary documents -- both photographic scans AND the electronic
; transcription -- word for word, no divergence to adjudicate): "80.
; Litaniae maiores assignatae sunt diei 25 aprilis; si vero eo die
; occurrit dominica Paschatis vel feria II post Pascha, transferuntur in
; sequentem feriam III." RG 81, same division: "81. De Litaniis maioribus
; nihil fit in Officio, sed tantum in Missa. Earum autem commemoratio non
; est habenda commemoratio 'de Tempore'." RG 109(f) (Caput XVI, "De
; Commemorationibus"): "f) de Litaniis maioribus, in Missa" -- a
; privileged commemoration. The calendarium's own April table (all three
; documents, e.g. the transcription: "iv c vii 25 Litania Maior. - S.
; MARCI EVANGELISTAE, II classis.") prints "Litania Maior" as part of 25
; April's own descriptive line, alongside St Mark, not as a second,
; separately class-numbered row -- corroborating RG 81's "nihil fit in
; Officio" the same way Maurice's own "Commemoratio ... " line (no class
; number) corroborates a demoted feast elsewhere in this project (see
; precedence_ef.ml's [band], top-of-function guard).
;
; MODELLING DECISION: `Commemoration_only`, `Fixed(4, 25)`, the same shape
; as `commemoration-of-st-peter` above -- because RG 81 denies the
; Litanies any Office standing at all ("nihil fit in Officio"), so they
; can never be the OBSERVED day (RG 91's table enumerates "dies
; liturgici", Office days, and this is explicitly none), only ever a Mass
; commemoration. `Precedence_ef.disposition`/`.privilege_of` wire RG
; 109(f)'s privilege and RG 80's own transfer condition (both cited in
; full at `Precedence_ef.major_litanies_slug` and its two call sites); see
; that module for the reasoning and precedence_ef.ml's own comments for
; why the transfer reuses the existing RG 96 placement machinery
; ({!Colitur_kernel.Precedence.Transfer}) rather than new machinery.
;
; `rank Class4`: RG 91's Table of Precedence has NO row for the Major
; Litanies at all (RG 81 denies them Office standing; the calendarium's
; own printed line above confirms it), so there is no class this data
; field could faithfully report -- the same situation `band`'s own
; top-of-function guard already documents for every `Commemoration_only`
; entry ("never had a row in the table for that occasion to begin with").
; `Class4` is chosen as the lowest/inertest value available, deliberately
; NOT `Class1` (which would make `Precedence_ef.privilege_of`'s branch (b),
; "of a I-class day", grant this entry Privileged status for the WRONG
; cited reason, silently making the (f) branch this task wires dead code
; again). `band` ignores rank entirely for any `Commemoration_only`
; candidate (checked first, unconditionally); `admit`'s only rank-keyed
; test for an ordinary (non-privileged) II-class-Sunday commemoration
; never applies here either, since this entry is always Privileged. No
; live behavioural consequence either way -- recorded as a deliberate,
; honestly-flagged placeholder, not a citation.
;
; `colour Violet`: NOT independently scan-verified for this specific
; entry (out of this task's scope -- Mass propers are Plan 4, `citations`
; stays `()`). Matches, by internal consistency, the colour this same
; codebase already assigns the sibling Minor Litanies/Rogation days
; (`rite_ef/temporal_ef.ml`'s own Rogation branch: `~colour:Colour.Violet`
; for RG 87's Monday/Tuesday before Ascension) -- both are "Litaniae",
; major and minor, sharing the same penitential/processional character;
; RG 80/81/109(f) themselves say nothing about colour. Inert today
; regardless (`Commemoration_only` entries are never OBSERVED, so this
; field is never printed by the current pipeline -- the same note `Edit
; eusebius-confessor` above makes for its own colour field).
;
; `subject Saint`: no clean fit among {Lord, Bvm, Saint, Temporal} -- the
; Litanies are tied to no particular Divine Person or to the BVM (RG 80/81
; name no one), and are far from an ordinary saint's feast either, but
; `Subject.Temporal` is reserved for the temporal cycle's OWN office
; (`subject.mli`), which this Fixed, sanctoral-origin entry structurally
; is not. `Saint` is the same "no special exclusion applies" default this
; codebase's own other `Commemoration_only` sanctoral entries already use
; (RG 110's own Peter/Paul companion entries, `commemoration-of-st-peter`
; immediately below) -- its only live behavioural consequence anywhere in
; this codebase, RG 112(a)/(d)'s Lord/BVM mutual-exclusion rules, is one
; this entry should NOT trigger either way, so `Saint` is safe as well as
; consistent.
;
; `names`: English ("The Major Litanies") is a plain translation of RG
; 80's own "Litaniae maiores", not independently primary-sourced (no
; English title exists in any of the three documents, all Latin). Polish
; ("Litanie Większe") likewise a plain vernacular rendering, not verified
; against any external Polish liturgical reference -- flagged here rather
; than presented as sourced, the same honesty this file's own
; `commemoration-of-st-peter` entry gives its own colour field above.
;
; ef-sanctoral-audit (2026-08-14, branch ef-sanctoral-audit): a full
; extraction of the CALENDARIUM (both photographic scans, missale-romanum-
; 1962.pdf and Missale Romanum 1962_text.pdf, pdftoppm-rendered page images
; read directly, not their pre-existing OCR text layers, which the task
; brief's own worked examples show are unreliable for exactly this kind of
; check) against all 327 base entries plus the two prior overlay Adds.
; Method and full findings: docs/research/rules-register.md's own audit
; rewrite (bucket recomputation) and .superpowers/sdd/2026-08-12-colitur-
; rg16a/sanctoral-audit-report.md. Two shapes of finding follow.
;
; `Add barbara` -- a genuine DATA GAP, the same shape as the ef-rebootstrap
; task's five (agnes-secundo/boniface-martyr/eusebius-confessor/evaristus/
; theodore, above): both scans, 4 December, carry a second line under S.
; Petri Chrysologi's own entry, "Commemoratio S. Barbarae Virg. et Mart."
; -- a real, standing commemoration, absent from `data/ef/sanctoral.sexp`
; AND from lectio's own `tridentine-calendar.ini` (checked directly: its
; 12-04 block holds only `peter-chrysologus`, then jumps straight to
; `sabbas`/12-05) -- not a colitur bootstrap miss, the same upstream gap
; shape the ef-rebootstrap task's own five entries already documented.
; Rank `Class3`: bootstrapped by the SAME convention every other
; `Commemoration_only` entry in this file uses (see the rank-inference note
; below) -- the calendarium gives a bare "Commemoratio", no class numeral,
; for any commemoration, hers included. Colour Red: RG 124(e), scan-
; verified word for word (both photographic scans, "XVIII - De coloribus
; paramentorum", "C) De colore rubro"): "adhibetur color ruber in Officio
; et Missa de festis: ... e) Sanctorum Martyrum, quorum colitur aut
; martyrium..." -- red for the feast of a Martyr's own martyrdom, and the
; calendarium's own line names her "Virg. et Mart." Names: English a plain
; translation of "Barbarae"; Polish a plain vernacular rendering -- neither
; independently primary-sourced, the same honesty this file's own
; `commemoration-of-st-peter` entry already gives its names.
;
; Sixteen `Edit ... ((Set_colour ...))` directives -- confirmed lectio/
; missalemeum bootstrap DATA DEFECTS, the identical shape and root cause as
; `eusebius-confessor` above (checked individually against
; `~/git/projects/lectio/internal/caldata/tridentine-calendar.ini`: every
; one of these 17 slugs' wrong colour is already wrong AT THE SOURCE, not
; introduced by colitur's own bootstrap step -- e.g. `martha`'s own Polish
; field there already reads "św. Marty, Dziewicy" (Virgin, no "Męczennicy"
; suffix), contradicting that SAME ini record's own `colour = red`). Two
; rules, both scan-verified word for word against RG 124 ("XVIII - De
; coloribus paramentorum", missale-romanum-1962.pdf, both photographic
; scans agree): (124.b) "adhibetur color ruber in Officio et Missa de
; festis: ... Sanctorum Apostolorum et Evangelistarum, in eorum die
; natalicio, EXCEPTO FESTO S. IOANNIS (27 decembris)" -- red for an
; Apostle/Evangelist's OWN feast day, John's 27 December the one named
; exception (already correctly White in the base data, untouched here);
; (124.e) "Sanctorum Martyrum, quorum colitur aut martyrium" -- red for a
; Martyr's own martyrdom. Every plain Confessor/Bishop/Virgin entry below
; (no "Mart."/"Mm." in the calendarium's own line, not an Apostle) is
; White by RG 117's five-colour residual (not itself independently
; RG-124-cited the way the red corrections are, since 124 enumerates the
; RED exceptions, not a white default) -- flagged as inferred-by-category,
; the same distinction the design spec draws throughout. `peter` (25
; January, a commemoration of the Apostle nested under `conversion-of-st-
; paul`) is corrected by CONSISTENCY with this file's own established
; precedent, not a fresh RG 124 citation of its own: `paul`'s sibling
; commemoration (22 February, under `chair-of-st-peter`) already carries
; Red in the base bootstrap, and `commemoration-of-st-peter` above (30
; June) was deliberately set Red "to match the host day's own Red" by an
; earlier task -- the identical RG 110 Peter/Paul-pair shape, so `peter`
; is the one inconsistent survivor, not a newly-discovered rule.
((id ef-adjustments)
(directives
((Suppress vigil-of-christmas)
(Edit most-holy-name-of-mary ((Set_subject Bvm)))
(Edit eusebius-confessor ((Set_colour White)))
(Add
((date (Fixed (month 6) (day 30)))
(cel
((slug commemoration-of-st-peter)
(names
((en "St. Peter") (pl "\197\155w. Piotra, Aposto\197\130a")))
(rank Class3) (status Commemoration_only) (colour Red)
(subject Saint) (citations ()) (layer ef-universal)))))
(Add
((date (Fixed (month 4) (day 25)))
(cel
((slug major-litanies)
(names ((en "The Major Litanies") (pl "Litanie Większe")))
(rank Class4) (status Commemoration_only) (colour Violet)
(subject Saint) (citations ()) (layer ef-universal)))))
(Add
((date (Fixed (month 12) (day 4)))
(cel
((slug barbara)
(names
((en "St. Barbara") (pl "\197\155w. Barbary, Dziewicy i M\196\153czennicy")))
(rank Class3) (status Commemoration_only) (colour Red)
(subject Saint) (citations ()) (layer ef-universal)))))
(Edit prisca ((Set_colour Red)))
(Edit conversion-of-st-paul ((Set_colour Red)))
(Edit peter ((Set_colour Red)))
(Edit chair-of-st-peter ((Set_colour Red)))
(Edit vitus ((Set_colour Red)))
(Edit margaret ((Set_colour Red)))
(Edit apollinaris ((Set_colour Red)))
(Edit agapitus ((Set_colour Red)))
(Edit josaphat ((Set_colour Red)))
(Edit john-of-san-fecundo ((Set_colour White)))
(Edit ephrem-of-syria ((Set_colour White)))
(Edit julia-of-falconieri ((Set_colour White)))
(Edit john-gualbert ((Set_colour White)))
(Edit camillus-de-lellis ((Set_colour White)))
(Edit jerome-emiliani ((Set_colour White)))
(Edit liborii ((Set_colour White)))
(Edit martha ((Set_colour White)))
(Edit alphonsus-liguori ((Set_colour White)))
(Edit augustine ((Set_colour White)))
(Edit rose-of-lima ((Set_colour White)))
(Edit mark-i ((Set_colour White))))))
|