aboutsummaryrefslogtreecommitdiff
path: root/lib/rites/rite_of/rubrics_of.ml
blob: e85ba1a4546ae5ed5411617de5d9b194dac67d63 (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
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
(* Institutio Generalis Missalis Romani, editio typica tertia (2002)
   (docs/research/of/igmr-2002-latin.pdf; extracted with `pdftotext
   docs/research/of/igmr-2002-latin.pdf`, line numbers below are that
   extraction's own line numbers) -- CITATION DISCIPLINE, restated from
   vocab_of.ml/temporal_of.ml: the Missale Romanum PDF (docs/research/of/
   missale-romanum-2002.pdf) carries BOTH the Normae universales and the
   IGMR, each independently numbered from 1. Every citation below names
   "IGMR n. N" for that reason, never a bare "n. N". Gloria and Credo are
   IGMR questions (Ordo Missae structure); Normae has nothing to say about
   either.

   GLORIA (IGMR n. 53, igmr.txt:456-460), quoted in full:

     "53. Gloria est antiquissimus et venerabilis hymnus, quo Ecclesia, in
   Spiritu Sancto congregata, Deum Patrem atque Agnum glorificat eique
   supplicat. Huius hymni textus cum alio commutari nequit. [...]
   Cantatur autem vel dicitur diebus dominicis extra tempus Adventus et
   Quadragesimae, necnon in sollemnitatibus et festis, et in peculiaribus
   celebrationibus sollemnioribus."

   So: every Sunday OUTSIDE Advent and Lent; every Sollemnitas; every
   Festum; and, permissively ("in peculiaribus celebrationibus
   sollemnioribus" -- "in particular more solemn celebrations", "dicitur"
   not "dicendum est" elsewhere in this paragraph's own register), certain
   occasions this engine has no dimension to model at all -- the same
   "votive Mass class" scope limit {!Rite_ef.Rubrics_ef}'s own header
   states for RG 431(d)/(e)/432(c) -- genuinely N/A, not silently skipped.

   CREED / SYMBOLUM (IGMR n. 67-68, igmr.txt:568-577), quoted in full.
   NAMED [creed] below, not [credo]: n. 67's own heading is "Professio
   fidei" and its body says "Symbolum", never "Credo" (checked directly,
   igmr.txt:568-577) -- "Credo" is this file's own prose shorthand, kept
   in comments and test labels, but the exported name matches
   {!Colitur_kernel.Rite.t.creed}'s own field exactly, so the OF rite
   bundle can write [creed = Rubrics_of.creed] with no gratuitous
   mismatch, the same discipline {!Rite_ef.Rubrics_ef.creed} already
   follows:

     "67. Symbolum seu professio fidei eo tendit ut universus populus
   congregatus verbo Dei in lectionibus e sacra Scriptura nuntiato et per
   homiliam exposito respondeat [...]
   68. Symbolum cantandum vel dicendum est a sacerdote cum populo diebus
   dominicis et in sollemnitatibus; dici potest etiam in peculiaribus
   celebrationibus sollemnioribus."

   NARROWER than n. 53, on purpose, not by oversight: n. 68 names only
   "dominicis et... sollemnitatibus" -- NO "et festis" clause at all, unlike
   n. 53's explicit third member. An ordinary [Festum] (the Presentation,
   the Transfiguration, the Exaltation of the Holy Cross...) therefore does
   NOT get the Credo, exactly matching real practice (only Sundays and
   solemnities carry it) and confirmed by the literal absence of the word
   "festis" from n. 68 where n. 53 has it -- checked directly, not assumed.
   The trailing "dici potest... peculiaribus... sollemnioribus" is the same
   permissive, unmodelled N/A clause as n. 53's.

   Neither n. 53 nor n. 68 carries an Easter-relative WINDOW the way RG
   475(d)'s three EF octaves do (Nativity/Easter/Pentecost) -- checked by
   reading both paragraphs in full above, not merely by their absence from
   this file's own branches: nothing in IGMR nn. 52-69 (the whole "Actus
   paenitentialis" through "Oratio universalis" span, igmr.txt:440-585)
   mentions an octave at all. [creed]'s own [date] parameter is therefore
   genuinely unread, kept only for {!Colitur_kernel.Rite.t}'s shared shape
   -- an honest [None]-shaped fact about this rubric, not a gap.

   THE REQUIEM QUESTION -- IGMR IS GENUINELY SILENT, FLAGGED AS SUCH. RG
   476(f)/432(d) name "in Missis defunctorum" explicitly for EF; IGMR nn.
   379-385 ("II. DE MISSIS DEFUNCTORUM", igmr.txt:2327-2349), read in full,
   say nothing at all about the Gloria or the Symbolum -- confirmed by
   reading every line of that section, not by a failed grep. The Missale's
   own printed propers corroborate the OMISSION reading only indirectly:
   every OTHER Mass text in the extracted Proper of Time/Sanctoral carries
   an explicit "Dicitur Gloria in excelsis."/"Non dicitur..." or "Dicitur
   Credo."/"Non dicitur Credo." marker (roughly 147 occurrences combined,
   docs/research/of/missale-romanum-2002.pdf via `pdftotext -layout`,
   recounted directly rather than estimated), but the THREE "IN
   COMMEMORATIONE OMNIUM FIDELIUM DEFUNCTORUM" (2 November) Mass
   formularies (numbered 1, 2, 3, one Mass text block each -- lines
   ~21831, ~21867, ~21898 of that extraction) carry NEITHER marker on any
   of the three -- consistent with (not proof of) universal, uncontested
   funeral-liturgy practice that a Requiem Mass never has either. Picked
   as the reading with the better textual support, per this task's own
   brief, and applied as narrowly as the evidence allows: {!requiem_slugs}
   is a CLOSED, directly-checked list of the ONE slug in
   data/of/calendar-2002.sexp this can ever apply to (grepped for
   "defunct"/"requiem"/"exsequial": zero other hits), the same "checked,
   not assumed, closed population" discipline {!Rite_ef.Rubrics_ef}'s own
   [Colour.Black] proxy uses for the identical EF question. *)

open Colitur_kernel

let requiem_slugs = [ "all-souls" ]

let is_requiem (observed : Vocab_of.rank Celebration.t) =
  List.mem (Slug.to_string observed.Celebration.slug) requiem_slugs

let gloria ~(temporal : (Vocab_of.season, Vocab_of.rank) Temporal.t)
    ~(observed : Vocab_of.rank Celebration.t) ~(date : Date.t) : bool =
  let easter = Computus.gregorian_easter (Date.year date) in
  let n = Date.to_rata date - Date.to_rata easter in
  if is_requiem observed then false
  else if
    (* Missale Romanum, "FERIA V IN CENA DOMINI", Ad Missam vespertinam, n.
       7 (docs/research/of/missale-romanum-2002.pdf, pdftotext -layout,
       line ~8534): "Dicitur Gloria in excelsis. Dum cantatur hymnus,
       pulsantur campanae, eoque expleto, silent usque ad Gloria in
       excelsis Vigiliae paschalis..." -- the Missal's own PROPER-OF-TIME
       rubric for the Mass of the Lord's Supper (Easter-3) explicitly
       requires the Gloria despite the day sitting inside Lent (Tabula I.1
       territory once the evening Mass begins; Precedence_of.band's own
       comment on WHY the civil day itself stays a Holy Week feria, not the
       Triduum, is unaffected -- this rubric is keyed to the Mass, not the
       day's own band), and the same sentence extends the silence "usque
       ad" (UP TO) the Easter Vigil's own Gloria (Easter-1), confirming
       that Mass also has one. Independently corroborated by a THIRD numbered
       rubric set inside the same PDF -- not the IGMR, not the Normae, but
       the Easter Vigil's own praenotanda ("VIGILIA PASCHALIS IN NOCTE
       SANCTA", missale-romanum-2002.pdf line ~9452), which restarts its
       own paragraph numbering at 1: Vigil n. 31 (line ~9925), "Post
       ultimam lectionem e Vetere Testamento cum suo psalmo responsorio et
       sua oratione, accenduntur cerei altaris, et sacerdos intonat hymnum
       Gloria in excelsis Deo, quem omnes prosequuntur, dum pulsantur
       campanae..." -- confirming the Vigil's own Gloria directly, from a
       second, independent source, not merely the Holy Thursday rubric's
       forward-looking "usque ad" clause. A third numbered document inside
       one PDF is exactly the citation-ambiguity trap vocab_of.ml's own
       top-of-file comment warns about for the Normae/IGMR pair -- naming
       it "Vigil n. 31", not a bare "n. 31", for the same reason. Neither
       day is ever a Sunday (both are fixed Easter-offsets within Holy
       Week), so this must be checked ahead of, and independently of, the
       season/weekday branches below -- the identical lex-specialis
       placement {!Rite_ef.Rubrics_ef.gloria}'s own RG 431(c) branch uses
       for the same two days. *)
    n = -3 || n = -1
  then true
  else if
    (* IGMR n. 53: "extra tempus Adventus et Quadragesimae" -- read off
       [temporal], never [observed]: Temporal_of.temporal tags every Sunday
       of Advent, Lent AND Easter [Sollemnitas] (temporal_of.ml, [build]'s
       own [match s with Advent | Lent | Easter -> Sollemnitas | ...]), so
       an [observed.rank] test alone would wrongly grant an Advent or Lent
       Sunday the Gloria this clause explicitly withholds -- confirmed by
       Palm Sunday specifically ([Vocab_of.Lent], [Sollemnitas],
       [named]'s own entry): real, uncontested practice omits the Gloria
       there, and only a temporal-read guard gets that right. *)
    temporal.Temporal.weekday = Date.Sun
    && (temporal.Temporal.season = Vocab_of.Advent || temporal.Temporal.season = Vocab_of.Lent)
  then false
  else if
    (* IGMR n. 53: every remaining Sunday (Christmas time, Easter, Ordinary
       Time -- outside Advent/Lent by the branch just above). Read off
       [temporal.weekday], not [observed.rank]: an ordinary Sunday per
       annum is [Festum]-ranked (temporal_of.ml, the same [build] match
       above), not [Sollemnitas], and would otherwise only reach a [true]
       answer via the [Festum] arm below -- redundant for it, but this
       branch is what makes an Easter- or Christmas-season Sunday's [true]
       answer trace to n. 53's OWN "diebus dominicis" clause rather than
       accidentally to its "et festis" clause. *)
    temporal.Temporal.weekday = Date.Sun
  then true
  else
    (* IGMR n. 53: "in sollemnitatibus et festis" -- every remaining
       Sollemnitas or Festum, whatever day of the week it falls on (a
       solemnity transferred onto an ordinary weekday, or one that was
       never a Sunday to begin with). St Joseph, 19 March, is ALWAYS
       inside Lent by construction: Gregorian Easter's earliest possible
       date is 22 March, so Ash Wednesday can never fall later than
       10 March and Easter itself can never fall before 22 March, putting
       19 March always at least three days before Easter. The Annunciation,
       25 March, is NOT: unlike 19 March, 25 March sits AFTER Easter's own
       earliest possible date, so in a sufficiently early-Easter year it
       falls inside the Easter Octave instead of Lent, or is impeded and
       transferred under Normae n. 60/5 (Precedence_of.mli's own
       [transfer_target] citation: "the Annunciation falling anywhere in
       Holy Week goes to Easter + 8") -- 2008 (Easter 23 March, so
       25 March is Easter+2, the Octave itself) is a real, checked
       instance, not a hypothetical. Functionally inert either way: this
       branch reads [observed.rank]/[temporal] as they actually resolve on
       the given date, never assumes a season from the calendar date alone
       -- but the comment should not claim more than that. [Memoria_
       obligatoria], [Memoria_ad_libitum] and [Feria] are not named by
       n. 53 at all and correctly fall through to [false]. *)
    observed.Celebration.rank = Vocab_of.Sollemnitas || observed.Celebration.rank = Vocab_of.Festum

let creed ~(temporal : (Vocab_of.season, Vocab_of.rank) Temporal.t)
    ~(observed : Vocab_of.rank Celebration.t) ~(date : Date.t) : bool =
  ignore date;
  (* IGMR n. 67-68's own [date]-independence: see this file's own header. *)
  if is_requiem observed then false
  else if
    (* IGMR n. 68: "diebus dominicis" -- EVERY Sunday, Advent and Lent
       included (unlike [gloria]'s own n. 53 carve-out: n. 68 has no such
       exception in its text, checked directly). Read off [temporal], not
       [observed], for the same reason [gloria]'s own Sunday branch is:
       an ordinary (non-privileged-season) Sunday per annum is [Festum]-
       ranked, and n. 68's own [Sollemnitas] branch below would silently
       miss it if this branch were dropped. *)
    temporal.Temporal.weekday = Date.Sun
  then true
  else
    (* IGMR n. 68: "in sollemnitatibus". NO "et festis" here -- the one
       place this function's shape most visibly narrows on EF's RG
       475(b)/(c): a bare [Festum] (the Presentation, the Transfiguration,
       a I-class-shaped feast of the Lord with no Sunday privilege) does
       NOT get the Credo. [Memoria_obligatoria]/[Memoria_ad_libitum]/
       [Feria] fall through to [false], matching real practice (an
       obligatory memorial on a weekday never carries the Creed). *)
    observed.Celebration.rank = Vocab_of.Sollemnitas

(* PREFACE CHOICE (IGMR n. 364-365, igmr.txt:2244-2263) -- quoted in full:

     "364. Plurimae praefationes, quibus Missale Romanum ditatur, eo
   spectant ut argumenta gratiarum actionis in Prece eucharistica plenius
   eniteant, et variae rationes mysterii salutis pleniore luce
   proponantur.
     365. Electio inter Preces eucharisticas, quae in Ordine Missae
   inveniuntur, his normis opportune regitur: [...]"

   n. 364-365 govern choosing among the FOUR EUCHARISTIC PRAYERS (I-IV),
   NOT which preface accompanies whichever Mass is said -- a different
   question this engine has no need to answer (colitur resolves a Mass's
   readings/rubrics, never which of the interchangeable Canons a celebrant
   picks). Genuinely N/A, cited here only because n. 364-365 is the
   nearest thing to a "how is the Eucharistic Prayer/preface chosen"
   numbered rubric in the whole IGMR, and this file should say plainly
   that it is not the rule this function needs, rather than leave a reader
   to wonder why it was not used.

   UNLIKE RG 482-499, the IGMR carries NO numbered rubric governing preface
   ASSIGNMENT at all -- confirmed by reading nn. 1-386 in full, not merely
   by a failed grep for "praefatio" (which itself found zero hits: the
   word never appears with that spelling anywhere in
   docs/research/of/igmr-2002-latin.pdf's extracted text; every occurrence
   in the Missale PDF instead uses the ligature "praefationem"/"praefatio"
   spelt with <ae> or the printed <æ>, confirming this is a genuine textual
   absence, not an extraction artifact). Preface assignment in the 2002
   editio typica tertia is done PER MASS, inline throughout the Proper of
   Time, Proper of Saints and Commons (each Mass's own rubric names its
   preface directly, e.g. "Praefatio de Nativitate, pp. 520-522.") -- the
   collection itself is indexed at the Missal's own back matter under
   "INDEX PRAEFATIONUM" (missale-romanum-2002.pdf, pdftotext -layout,
   extracted lines ~34107-34247), transcribed here in full because it is
   the evidence the verdict below rests on:

     A. De Tempore: Advent I-II (2); Nativity I-III (3); Epiphany (1);
        Lent ("de Quadragesima") I-IV plus five Sunday-specific variants
        V-IX (9); Passion ("de Passione Domini") I-III, III being Palm
        Sunday's own (3); Paschal (Easter) I-V (5); Ascension I-II, BOTH
        titled "De mysterio Ascensionis" (2); Pentecost (1); Sundays "per
        annum" I-VIII (8); Praefationes communes I-VII (7).
     B. In festis et mysteriis Domini: Trinity (1); the Annunciation's own
        "De mysterio Incarnationis" (1); the Baptism of the Lord (1);
        Sacred Heart (1); "De victoria Crucis gloriosae", 14 September (1);
        Corpus Christi ("de Ss.ma Eucharistia") I-II (2); the Presentation
        (1); Christ the King (1); the Transfiguration (1); the Dedication
        of a Church I-II (2); "de Spiritu Sancto" I-II (2).
     C. In festis sanctorum: the BVM I-V (5); the Angels (1); the
        Precursor/John the Baptist (1); St Joseph, "De missione S.
        Ioseph", 19 March/1 May (1); Peter-and-Paul (1); Apostles I-II
        (2); Saints I-III (3); Martyrs I-II (2); Pastors (1); Virgins and
        Religious (1).
     Pro defunctis (Requiem): I-V (5).

   AGAINST THIS CENSUS, {!Preface.t}'s 15 constructors split into two
   failure shapes, and every single one fails one of them -- NONE is safe
   to reuse:

   (1) NINE constructors name an OF occasion with MULTIPLE distinct texts:
       [Nativity] (3 OF variants), [Lent] (4, or 9 counting the
       Sunday-specific set), [Easter] (5), [Ascension] (2), [Holy_spirit]
       (2), [Bvm] (5), [Apostles] (2), [Common] (15, split across two
       independent numbered families -- "per annum" I-VIII and
       "communes" I-VII, neither of which [Preface.t]'s single [Common]
       constructor could ever pick between), [Requiem] (5). Returning any
       one of them would silently pick ONE of several genuinely different
       texts and call it "the" answer -- structurally lossy, independent
       of any wording question.

   (2) SIX constructors name an OF occasion with exactly ONE text, the same
       cardinality EF has for it -- [Epiphany], [Trinity], [Sacred_heart],
       [Christ_the_king], [St_joseph], and [Holy_cross] (EF's RG 487 "de
       sancta Cruce" against OF's single "De victoria Crucis gloriosae",
       both keyed to 14 September). These are the genuinely tempting
       cases -- same feast, same "exactly one" cardinality on both sides --
       and each was checked and rejected anyway, on TWO grounds:
         (a) {!Preface.t}'s own header ties every constructor to an RG
             paragraph ("Nativity RG 484", "Trinity RG 494", ...) -- it
             denotes THAT SPECIFIC EF TEXT, not an abstract cross-rite
             theme, by its own documented contract.
         (b) IGMR n. 364's own opening word choice is direct evidence the
             2002 Missal does not consider its preface collection a bare
             carry-over: "praefationes, QUIBUS Missale Romanum DITATUR"
             ("the prefaces WITH WHICH the Missal is ENRICHED") -- language
             describing an addition/expansion, not an inheritance,
             corroborating the well-documented fact that the post-1970
             preface collection was substantially newly composed, the
             Sacred Heart preface actually read while building this
             module ("Qui, mira caritate, exaltatus in cruce... de
             transfixo latere sanguinem fudit et aquam...",
             missale-romanum-2002.pdf line ~30575) being the one
             instance directly compared line-by-line against what its RG
             491 EF namesake is known to open with, and found to be a
             different composition, not merely a different printing of
             the same one.
       Reusing any of the six on the strength of matching cardinality and
       matching feast alone would be exactly the "sounds similar" trap
       this task's own brief warns against -- confidently wrong output
       every test in this suite would agree with, because nothing in this
       codebase yet stores preface TEXT to catch the mismatch against.

   VERDICT: [preface] returns [None] unconditionally. This is not a stub
   -- every branch above was checked and its failure mode recorded -- and
   it is not a defect in {!Preface.t} either: that type was built for one
   rite and correctly refuses to pretend it fits a second one it was never
   shown. The finding worth carrying forward (task brief's own "spec §7"
   framing): OF preface selection needs its own type, most plausibly one
   with a per-occasion NUMBERED-VARIANT dimension ("Nativity of 1 | 2 | 3",
   ...) rather than {!Preface.t}'s flat enumeration, plus its own IGMR/
   Missale-cited population census -- table-driven, the same shape as
   {!requiem_slugs} above, once a task is actually chartered to build it.
   Building that type is explicitly out of this task's own scope. *)
let preface ~(temporal : (Vocab_of.season, Vocab_of.rank) Temporal.t)
    ~(observed : Vocab_of.rank Celebration.t) ~(date : Date.t) : Preface.t option =
  ignore temporal;
  ignore observed;
  ignore date;
  None