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
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
|
(* RG 475-476 (docs/research/LT.txt, grep "dicitur symbolum"; scan1.txt line
~3872-3888), quoted here in full so every branch below can cite its own
letter without re-quoting the whole rubric:
"475. Post Evangelium aut homiliam, dicitur symbolum:
a) in qualibet dominica, etsi eius Officium alicui festo locum
cedat, vel Missa votiva II classis celebretur;
b) in festis I classis et in Missis votivis I classis;
c) in festis II classis Domini et B. Mariae Virg.;
d) per octavas Nativitatis Domini, Paschatis et Pentecostes, etiam
in festis occurrentibus et in Missis votivis;
e) in festis nataliciis Apostolorum et Evangelistarum, necnon in
festis Cathedrae S. Petri et S. Barnabae Ap.
476. Non dicitur symbolum:
a) in Missis sive chrismatis sive in Cena Domini, feria V
Hebdomadae sanctae, et in Missa Vigiliae paschalis;
b) in festis II classis, iis exceptis quae supra, n. 475 c et e,
recensentur;
c) in Missis votivis II classis;
d) in Missis festivis et votivis III et IV classis;
e) ratione alicuius commemorationis in Missa occurrentis;
f) in Missis defunctorum."
SCOPE NOTE, checked once here rather than at every clause below: this
engine resolves ONE observed office and ONE Mass per civil day (see
Rite.t.readings' own doc comment) -- it has no separate "which votive
Mass is said" dimension. So the "vel/et...votivis" halves of 475(a)/(b),
476(c) entirely, and 476(d)'s "et votivis" half are genuinely
inapplicable to this implementation -- a documented scope limit, not a
defect. 476(e) needs no branch at all: [creed] below reads only
[observed], never a day's admitted commemorations, so a commemoration
can never change its answer by construction.
476(f) ("in Missis defunctorum") is DIFFERENT: this file used to carry
it in the same "not modelled" list above, on the reasoning that
[creed]'s inputs (temporal/observed/date) have no notion of "this Mass
is a Requiem". That reasoning was wrong, found by the LMS Ordo layer
(test_lms_ordo.ml, allow-list entry L1, now closed -- see
expected-divergences-lms.sexp) on 2025-11-03, All Souls' Day: colitur
said the Creed where the Ordo, correctly, does not. [observed] DOES
carry a usable signal -- RG 117 assigns black to Masses of the dead,
and {!Colour.Black} is used by exactly TWO celebrations in this whole
engine, verified by grepping every [colour Black]/[Colour.Black] site
in lib/ and data/: [commemoration-of-all-souls] in
data/ef/sanctoral.sexp, and Good Friday in temporal_ef.ml (which is a
Holy Week FERIA, RG 23(b), already excluded by the [n >= -6 && n <=
-1] branch below regardless of colour, and has no Mass at all in the
1955-restored Holy Week). So on every day this engine can actually
construct, [colour = Black] if and only if the Mass is a Requiem --
a citable implication ON THIS DATA, not a heuristic guess. [creed]
below uses it as 476(f)'s own guard. This is a PROXY, not a general
"is this a Requiem Mass" field, and it is only as good as that
two-member population: {!test_rubrics_ef}'s own
[test_colour_black_population_is_exactly_two] fails loudly the day a
third [Colour.Black] celebration is added anywhere, so the proxy
cannot silently rot into covering (or missing) a non-Requiem black
Mass. If that ever happens, this guard needs re-deriving, not merely
re-approving. *)
open Colitur_kernel
(* RG 475(e): "in festis nataliciis Apostolorum et Evangelistarum, necnon in
festis Cathedrae S. Petri et S. Barnabae Ap." NATALICIUM means the feast
of the saint's own death (dies natalis) -- not every feast that merely
names him. That is precisely why the clause has to name the Chair of St
Peter and St Barnabas EXPLICITLY: neither is a natalicium (Peter's own is
29 June, shared with Paul; Barnabas's is his own day, 11 June, but the
clause names him anyway, redundantly with the natalicium reading, rather
than leave it to inference), so neither would be covered without the
explicit "necnon".
DERIVED, not copied from any list supplied with this task: grepped
data/ef/sanctoral.sexp directly for every entry whose English or Polish
name mentions "Apostle"/"Evangelist"/"Aposto{l/ł}a", then each
candidate's own date, rank and status checked against the calendarium
and against whether it is that saint's own dies natalis. Every entry
below was cross-checked against the shipped data, not assumed:
andrew (30 Nov, Class2) -- his natalicium.
barnabas (11 June, Class3) -- named explicitly; also his own natalicium.
bartholomew (24 Aug, Class2) -- his natalicium.
chair-of-st-peter (22 Feb, Class2) -- named explicitly ("Cathedrae S.
Petri"); NOT a natalicium (Peter's own is 29 June, shared with Paul)
-- exactly why the clause has to name it.
james-the-greater (25 July, Class2) -- his natalicium.
john-the-evangelist (27 Dec, Class2) -- his natalicium (the one Apostle
traditionally held to have died a natural death; "natalicium" still
names his own feast day, not only a martyr's).
luke-the-evangelist (18 Oct, Class2) -- his natalicium.
mark (25 April, Class2) -- the Evangelist ("Marka Ewangelisty" in the
data's own Polish name); NOT "mark-i" (7 Oct), a different saint (a
Pope), excluded.
matthew (21 Sep, Class2) -- Apostle and Evangelist, his natalicium.
matthias (24 Feb, Class2) -- his natalicium.
sts-peter-paul (29 June, Class1) -- the natalicium of both.
sts-philip-james (11 May, Class2) -- the natalicium of both (James the
Less; there is no separate "james-the-less" entry in the data).
sts-simon-jude (28 Oct, Class2) -- the natalicium of both.
thomas (21 Dec, Class2) -- his natalicium.
Checked and DELIBERATELY EXCLUDED (the Trap this clause is built around):
conversion-of-st-paul (25 Jan, Class3) -- not a natalicium: it
commemorates an EVENT of his life, not his death.
in-commemoratione-sancti-pauli-apostoli (30 June, Class3, status
Feast, so it CAN be observed, unlike the two entries below) -- a
secondary commemoration of Paul, not his dies natalis (his own is 29
June, with Peter); its own name says so ("In Commemoratione", not a
feast of his martyrdom).
"peter" (25 Jan) and "paul" (22 Feb) -- both status
[Commemoration_only] (RG 110's own Peter/Paul companions, on the
Conversion and Chair days respectively: {!Precedence_ef.disposition}'s
own citation), so neither can ever be [observed]; moot either way,
but neither is a natalicium regardless.
mark-i (7 Oct) -- a different saint (Pope St Mark), not the
Evangelist. *)
let creed_apostle_slugs =
[ "andrew"; "barnabas"; "bartholomew"; "chair-of-st-peter"; "james-the-greater";
"john-the-evangelist"; "luke-the-evangelist"; "mark"; "matthew"; "matthias";
"sts-peter-paul"; "sts-philip-james"; "sts-simon-jude"; "thomas" ]
let creed ~(temporal : (Vocab_ef.season, Vocab_ef.rank) Temporal.t)
~(observed : Vocab_ef.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
let m = Date.month date and dd = Date.day date in
let slug = Slug.to_string observed.Celebration.slug in
if
(* RG 475(d): "per octavas Nativitatis Domini, Paschatis et
Pentecostes, etiam in festis occurrentibus et in Missis votivis" --
an unconditional window override, checked first: EVEN a saint's
feast that wins the day within one of the three octaves (St Stephen,
26 December, is the live witness -- RG 67's own "Com. octavae
Nativitatis" note, quoted in full in temporal_ef.ml's [named]) still
says the Creed. Pure date/Easter-offset arithmetic, not season or
rank: Ascension (Easter+39) and the Pentecost Vigil (Easter+48) are
both [Class1] and both fall inside the Paschaltide SEASON but
outside either 8-day OCTAVE, so a rank- or season-based test here
would wrongly include them -- checked and rejected for exactly this
reason.
Nativity: 25-31 December (its own day plus 7) + 1 January (RG 91
entry 5's own "Octave Day of the Nativity", the identical table
entry as 24 December's vigil -- temporal_ef.ml's [named]). Easter:
Easter Sunday (offset 0) through Low Sunday (offset 7) -- RG 11's
own "dominicae Paschatis et Pentecostes sunt pariter festa I classis
CUM OCTAVA". Pentecost: Pentecost (offset 49) through Trinity Sunday
(offset 56), the RG 91-entry-14-adjacent "octave day" Trinity Sunday
itself names in temporal_ef.ml. *)
(m = 12 && dd >= 25 && dd <= 31)
|| (m = 1 && dd = 1)
|| (n >= 0 && n <= 7)
|| (n >= 49 && n <= 56)
then true
else if
(* RG 475(a): "in qualibet dominica, ETSI EIUS OFFICIUM ALICUI FESTO
LOCUM CEDAT" -- the Creed is said on any Sunday even when a feast
displaces the Sunday's own office (RG 16(a): a Feast of the Lord I
or II class occurring on a II-class Sunday takes its place "cum
omnibus iuribus et privilegiis"). Read off [temporal]'s own weekday
-- the day's calendar fact, independent of whatever [observed] turns
out to be -- never off [observed]'s slug or rank, which is exactly
what would go silently wrong the day such an impeding feast wins:
see {!Colitur_kernel.Precedence.rules.admit}'s own [~temporal]
parameter (precedence.mli) for the identical argument, made there
for RG 111(b) rather than RG 475(a). *)
temporal.Temporal.weekday = Date.Sun
then true
else if
(* RG 23 (Caput IV, "De Feriis"): "Feriae I classis sunt: a) feria IV
cinerum; b) omnes feriae Hebdomadae sanctae." Ash Wednesday and every
feria of Holy Week (Monday through Saturday -- RG 91 entry 2's
Sacred Triduum, Thursday-Saturday, is a THIRD sub-case of this same
"feria", not a "festum": RG 35, immediately below in Caput VI,
defines "festum" as a distinct liturgical-day category from "feria",
RG 21-27) are FERIAE, never FESTA, however high their RG 91 rank --
so 475(b)/(c)'s "in festis" never reaches them, regardless of rank.
This single structural check subsumes 476(a)'s own explicit naming
of the Chrism Mass, the Mass of the Lord's Supper (both Holy
Thursday) and the Easter Vigil Mass (Holy Saturday's date): both are
already excluded here as Holy Week feriae, so 476(a) needs no
separate branch. (Good Friday needs no rubric at all -- RG 28's own
closing sentence on the Paschal Vigil aside, Good Friday's own
liturgical action has no Mass in the 1955-restored Holy Week to
begin with, so the question is moot there independent of this
check -- but this structural test correctly excludes it too, since
it is also named in RG 23(b).)
RG 24-25 (immediately following, same Caput IV) name TWO MORE
ferial classes this branch does not reach: feriae II classis (RG
24 -- the Advent ferias 17-23 December, and the Quatuor Temporum
sets of Advent, Lent and September) and feriae III classis (RG 25
-- the numbered Lenten/Passiontide ferias from the Thursday after
Ash Wednesday to the Saturday before Passion Sunday II, and the
un-Embered Advent ferias to 16 December). NEITHER is excluded by a
check anywhere in this module -- this branch and RG 33's vigil
branch immediately below are the whole of what [creed] tests
before falling through to 475(b)/(c)/(e)'s own rank/subject/slug
guards. They do not need an explicit exclusion of their own for
475(b): temporal_ef.ml's own [ferial_rank] never returns [Class1]
for them (only Ash Wednesday and Holy Week do, RG 23's own population,
already excluded above), so that branch is unreachable for them
regardless of anything checked here. But RG 24's own II-class set
DOES reach 475(c)'s [Class2] guard below, and 475(e)'s
apostle-slug guard carries no rank floor at all, so both classes
genuinely reach a live branch of this function. Getting [false]
there is NOT established by this exclusion, or by any check in
this file: it rests on an unstated property of {!Temporal_ef} --
every ferial-origin office it builds carries [subject = Temporal]
and an "ef-"-prefixed slug, never [Lord]/[Bvm] or a name on
{!creed_apostle_slugs}. Verified directly in temporal_ef.ml: the
Ember/Rogation/generic-ferial branches all go through [build]'s
own default [subject = Temporal], with exactly two documented
exceptions, neither able to reach a live branch below -- the
Sacred Triduum ([subject = Lord], but [Class1], already excluded
above) and the votive Office of the BVM on Saturday, RG 91 entry
27 ([subject = Bvm], but [Class4], never satisfying 475(c)'s own
[Class2] guard).
(CORRECTED, review fix: this comment, and 475(b)'s own immediately
below, previously read as though "the two exclusions immediately
above" disposed of ferias in general -- they dispose of feria I
classis only. RG 24/25's own higher classes were excluded by NO
check, an unstated-invariant gap now named here rather than
silently relied on: test/test_rubrics_ef.ml's own ferial-invariant
sweep now asserts the Temporal_ef property above directly against
real output, so a future change that broke it would fail that
test rather than silently changing the Creed.) *)
n = -46 || (n >= -6 && n <= -1)
then false
else if
(* RG 28-34 (Caput V, "De Vigiliis"): a vigil is its OWN liturgical-day
category, distinct from "festum" (RG 35, Caput VI) the same way a
feria is (immediately above) -- so 475(b)/(c)'s "in festis" does not
reach a vigil either, regardless of its own RG 91 rank. This is also
why 476(a) has to name the Easter Vigil explicitly: RG 28's own
closing sentence says the Paschal Vigil, uniquely, "non sit dies
liturgicus" [is not a liturgical day] at all, so it is not even a
"vigilia" in RG 29-32's numbered sense -- nothing else in this
taxonomy would have excluded it without that explicit clause, unlike
every OTHER vigil, which is excluded merely by being one.
{!Precedence_ef.is_vigil} already tests both slug conventions this
codebase's data uses (the temporal cycle's "-vigil" suffix and the
sanctoral bootstrap's "vigil-of-" prefix) for the identical RG 33
question; reused here rather than re-derived, on the same footing as
{!Precedence_ef.marian_slugs} just below. *)
Precedence_ef.is_vigil slug
then false
else if
(* RG 476(f): "in Missis defunctorum" -- the Creed is never said at a
Requiem Mass, checked here, ahead of 475(b)'s rank branch, the same
"category excludes regardless of rank" position as the feria and
vigil checks immediately above (All Souls' Day is [Class1], so
without this guard 475(b) would grant it [true] unopposed, which is
exactly the defect this guard fixes -- see this file's own header
for the two-member [Colour.Black] population this proxy rests on,
and {!Colour.Black}'s own citation, RG 117, for why colour is the
Requiem signal. Placed before, not after, 475(b)/(c)/(e) so a black
Class1 or Class2 day can never reach them; nothing above this point
(the Nativity/Easter/Pentecost octave override, the Sunday rule, the
feria and vigil exclusions) is ever reachable by a Requiem Mass on
the shipped data either -- a Requiem is never kept on a Sunday or
inside a privileged octave -- so this guard's own position relative
to THOSE branches is moot on real data, checked, not merely assumed:
{!creed_apostle_slugs} and [marian_slugs] contain no Black-coloured
entry, and 2 November can never fall inside any of the three
octaves 475(d) names. *)
observed.Celebration.colour = Colour.Black
then false
else if
(* RG 475(b): "in festis I classis". Genuine feasts only, by
construction of the two exclusions immediately above (feria I
classis -- Ash Wednesday and Holy Week, the only feriae that are
ever [Class1]; RG 24/25's II- and III-class feriae are a different
population and never reach this rank at all, see the RG 23
comment's own note above -- and vigils) -- every remaining
[Class1] candidate reaching this branch is a real festum: the
Nativity, Epiphany, Ascension, Corpus Christi, the Sacred Heart,
Christ the King, a I-class sanctoral feast (the Assumption, the
Immaculate Conception...), or a I-class Sunday (already [true]
above via 475(a), so this branch is never the FIRST to grant those
a [true], only ever redundant with it). *)
observed.Celebration.rank = Vocab_ef.Class1
then true
else if
(* RG 475(c): "in festis II classis Domini et B. Mariae Virg." --
[subject = Lord] is reliably set on genuine II-class sanctoral
feasts of the Lord (Exaltation of the Holy Cross, the Purification,
the Transfiguration, the Commemoration of the Baptism of the Lord,
the Dedication of the Lateran Archbasilica -- checked directly
against data/ef/sanctoral.sexp: six [subject = Lord] entries ship,
none a vigil or feria) and on the two temporal-cycle Class2 Lord
feasts (Holy Family, Holy Name of Jesus). [subject = Bvm], by
contrast, is NOT reliable for the BVM half: checked directly against
the data, almost every Marian sanctoral entry (the Assumption, the
Annunciation, the Immaculate Heart, the Nativity of the BVM...)
ships [subject = Saint] instead -- {!Precedence_ef.marian_slugs} is
the list built (and, here, reused rather than re-derived) precisely
because the [subject] field cannot be trusted alone for this
question; see its own citation in precedence_ef.mli.
This [Class2] guard is also the one live branch RG 24's own
II-class feriae (Advent 17-23, the Advent/Lent/September Ember
sets) genuinely reach -- the RG 23 comment above (this file, the
[n = -46 ...] branch) has the full account of why they still come
out [false] here: an unstated Temporal_ef property, checked by a
test, not a guard in this file. *)
observed.Celebration.rank = Vocab_ef.Class2
&& (observed.Celebration.subject = Subject.Lord
|| observed.Celebration.subject = Subject.Bvm
|| List.mem slug Precedence_ef.marian_slugs)
then true
else
(* RG 475(e): see {!creed_apostle_slugs}'s own citation. Checked last
and without a rank guard, on purpose -- Barnabas is only [Class3]
and the Chair of St Peter's own [subject] is [Saint], so neither
would ever be reached by the two branches above; every [Class1]
entry on the list (Sts Peter & Paul) is already [true] via 475(b),
so this branch is redundant, never wrong, for those. *)
List.mem slug creed_apostle_slugs
(* Breviarium Romanum, 1961 Codex Rubricarum, "N) De hymno Te Deum"
(docs/research/breviary/rubricae-breviarii-1961.txt; docs/research/
breviary/PROVENANCE.md has this source's own provenance and weakness in
full), quoted here in full so every branch below can cite its own
letter without re-quoting the whole rubric:
"237. Hymnus Te Deum dicitur ad Matutinum, post ultimam lectionem, loco
noni vel tertii responsorii:
a) in dominica in albis, in dominica Pentecostes, et in Matutino
dominicae Resurrectionis, quod recitatur ab iis qui Vigiliae paschali
non interfuerunt;
b) in dominicis II classis, exceptis dominicis in Septuagesima, in
Sexagesima et in Quinquagesima;
c) in omnibus festis;
d) per octavas Nativitatis Domini, Paschatis et Pentecostes;
e) in Officio feriali temporis natalicii et temporis paschalis;
f) in vigiliis Ascensionis et Pentecostes;
g) in Officio sanctae Mariae in sabbato.
238. Omittitur vero hymnus Te Deum:
a) in Officiis de Tempore a dominica I Adventus usque ad vigiliam
Nativitatis Domini inclusive; et a dominica in Septuagesima usque ad
Sabbatum sanctum inclusive;
b) in vigiliis II et III classis, excepta vigilia Ascensionis
Domini;
c) in omnibus feriis per annum;
d) in Officio defunctorum."
THE WEAKNESS, restated (PROVENANCE.md has the full account): this is a
SINGLE WEB TRANSCRIPTION (ceremoniaire.net), not yet checked against a
photographic scan -- the weakest-sourced rule in this project. Mitigated,
not resolved, by the FIUV universal Ordo's own Te Deum column
(test/fixtures/fiuv-ordo-2025-2026.sexp, 262 "Te Deum" rows out of 400 --
an independent day-level witness, never itself derived from this
transcription) -- see test_fiuv_ordo.ml, which compares [te_deum]'s own
output against it. A mismatch there may indict this transcription rather
than [te_deum]; adjudicated per that file's own allow-list, not assumed
either way.
SCOPE: this predicate exists ONLY because RG 431(a) below defers a MASS
question to it. Building it is not the Divine Office arriving in scope --
CLAUDE.md's own "Divine Office remains out of scope" line, and the
2026-08-21 design spec's own SS1, are both unchanged: this borrows ONE
Breviary FACT per day (whether Te Deum was said at Matins), never models
Matins/Vespers/the psalter/concurrence. *)
let te_deum ~(temporal : (Vocab_ef.season, Vocab_ef.rank) Temporal.t)
~(observed : Vocab_ef.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
let m = Date.month date and dd = Date.day date in
let slug = Slug.to_string observed.Celebration.slug in
if
(* 238(d): "in Officio defunctorum" -- checked first, the same position
and the same {!Colour.Black} proxy [creed]'s own 476(f) branch uses
(this file's own header has the full argument for why colour is a
sound proxy for "this is a Requiem" on the shipped data, and
{!test_colour_black_population_is_exactly_two} in test_rubrics_ef.ml
is the SAME two-member population this predicate also depends on --
no separate test needed). *)
observed.Celebration.colour = Colour.Black
then false
else if
(* 237(a): the three explicitly named Paschaltide days -- Easter
Sunday's own Matins (n=0), Low Sunday (n=7), Pentecost Sunday
(n=49). Pure Easter-offset arithmetic, the same style [creed]'s own
475(d) uses and for the identical reason: season/rank alone cannot
express "this exact day", and nothing else in 237/238 names these
three individually.
HISTORY WORTH KEEPING: this task's own FIRST pass REPLACED this
branch (and 237(b) below) with a blanket "every Sunday" rule,
having found what looked like a clean 15-for-15 FIUV Ordo
contradiction of 237(b)'s own Septuagesima/Sexagesima/Quinquagesima
exception. That evidence was ITSELF corrupted: tools/extract_fiuv_
ordo.ml's own Te Deum parser recognised only ONE of the source's two
negative phrasings ("non dicitur Te Deum"), so every "sine Te Deum"
occurrence -- which is how the source actually negates a SUNDAY's
own Te Deum, found only by reading the raw pdftotext dump by hand,
not by trusting the fixture's own coverage counts -- fell through to
a bare "Te Deum" substring match and was wrongly recorded [true].
Fixed in the extractor (see its own citation, tools/extract_fiuv_
ordo.ml); the fixture was regenerated; 24 of the fixture's 400 rows
flipped, EVERY ONE true->false, EVERY ONE a day this branch or
237(b) below governs. The blanket rule was reverted the moment the
corrected data confirmed the ORIGINAL literal reading instead:
238(a)'s own window DOES silence Advent/Septuagesima/Lent/
Passiontide Sundays after all. Left as a worked example, not
scrubbed from history: the failure mode was believing a clean-
looking oracle correlation over re-deriving the primary text,
exactly backwards from what "adjudicate, don't assume" should have
produced -- caught only by cross-checking the raw source directly
once the shape looked suspiciously total. *)
n = 0 || n = 7 || n = 49
then true
else if
(* 237(f): the vigils of Ascension (n=38) and Pentecost (n=48), checked
BEFORE 238(b)'s general vigil omission below -- both are otherwise
reachable by it (Ascension's vigil is [Class2], squarely inside
238(b)'s own "II et III classis"; Pentecost's is [Class1], RG 91
entry 9, so 238(b) could never have reached it regardless, but is
named here anyway rather than left to fall through to 237(c), the
same "cite the specific clause, not a catch-all" discipline this
whole module holds to). *)
n = 38 || n = 48
then true
else if
(* 237(d): the three privileged octaves -- reuses [creed]'s own three
windows verbatim (that function's own 475(d) comment has the full
citation and the argument for why a season- or rank-based test
would wrongly include the Ascension/Pentecost-Vigil days this
window must exclude). Overlaps 237(a) at n=0/7/49 -- redundant, not
wrong, the same "never the FIRST branch to grant those [true]"
pattern 475(b) documents for I-class Sundays. *)
(m = 12 && dd >= 25 && dd <= 31)
|| (m = 1 && dd = 1)
|| (n >= 0 && n <= 7)
|| (n >= 49 && n <= 56)
then true
else if
(* 238(b): "vigiliis II et III classis" -- {!Precedence_ef.is_omissible_vigil}
is exactly this rank test (Class2 or Class3), reused rather than
re-derived, paired with {!Precedence_ef.is_vigil} the same way
[creed]'s own RG 28-34 branch already pairs them. The Ascension
vigil (237(f) above, already [true]) can never reach this branch;
the four sanctoral vigils (StJohnBaptist, SsPeter&Paul, StLawrence,
the Assumption -- {!Precedence_ef.vigil_feast_table}'s own
population) are exactly what this branch excludes. *)
Precedence_ef.is_omissible_vigil observed.Celebration.rank && Precedence_ef.is_vigil slug
then false
else if
(* NOT 238(b)'s own text (which names only "II et III classis"): the
Nativity Vigil ([Class1], RG 91 entry 5) is excluded here on the
SAME RG 21/35 taxonomy argument [creed]'s own RG 28-34 comment
already makes for the Paschal Vigil -- "vigilia" is its own
liturgical-day category, distinct from "festum", regardless of
class; RG 30's "beyond losing" is a PRECEDENCE exemption (nothing
lesser can displace it), not a claim that a vigil IS a festum for
Breviary purposes. Flagged honestly as an INFERENCE, not a literal
238(b) citation -- checked against the FIUV Ordo's own Te Deum
marker for 24 December in test_fiuv_ordo.ml, since this is exactly
the shape a transcription gap could get wrong either direction. *)
Precedence_ef.is_vigil slug
then false
else if
(* 238(c)/RG 23: Ash Wednesday and every feria of Holy Week, the Sacred
Triduum included -- reuses [creed]'s own RG 23 test verbatim (that
function's own comment has the full citation and the argument for
why this excludes feria I classis specifically, not ferias in
general). *)
n = -46 || (n >= -6 && n <= -1)
then false
else if
(* 237(b): "in dominicis II classis, exceptis dominicis in Septuagesima,
in Sexagesima et in Quinquagesima" -- colitur's own single
[Septuagesima] season covers exactly those three Sundays (see
[season_colour]'s own grouping, temporal_ef.ml), so the exception is
one season-equality test. RE-VERIFIED, not merely restored: the
corrected FIUV extraction (237(a)'s own comment above has the full
account) shows all three Septuagesima-season Sundays [false], and
every OTHER, ordinary Class2 Sunday the fixture's window reaches
[true] -- exactly this clause's own literal text, no correction
needed here after all. Reads [temporal.weekday]/[.season], not
[observed]'s slug: unlike [creed]'s own 475(a), the Breviary's text
carries NO "even when a feast displaces the Sunday's own Office"
exception -- when a feast genuinely takes the Sunday's place (RG
16(a)), Matins says the FEAST's own Office, and 237(c) below decides
it on the feast's own terms, not this clause. Advent/Lent/
Passiontide Sundays are [Class1], never [Class2] ([creed]'s own RG
11-12 citation, temporal_ef.ml), so this guard correctly excludes
them without a separate season check; [observed.rank], not
[temporal]'s own season-derived rank, is read here on purpose, for
the same RG 16(a) reason [Precedence.rules.admit]'s own
[~temporal] parameter exists: a feast that wins the day can carry a
DIFFERENT rank than the Sunday it displaced. *)
temporal.Temporal.weekday = Date.Sun
&& observed.Celebration.rank = Vocab_ef.Class2
&& temporal.Temporal.season <> Vocab_ef.Septuagesima
then true
else if
(* 237(g): the votive Office of the BVM on Saturday, RG 78/91 entry 27
-- {!Temporal_ef}'s own [subject = Bvm]/[Class4] pairing, the same
shape [creed]'s own 476(d) comment and the register's RG 112(d) fix
already establish as unique to this office (every OTHER
[subject = Bvm] candidate in the shipped data is [Commemoration_only]
and can therefore never be [observed]). *)
observed.Celebration.subject = Subject.Bvm && observed.Celebration.rank = Vocab_ef.Class4
then true
else if
(* 237(e): "Officio feriali temporis natalicii et temporis paschalis" --
every remaining (non-octave, non-vigil, non-BVM-Saturday) FERIA of
Christmastide or Paschaltide: the 2-5 January ferias, and the
ordinary weeks of Paschaltide (Rogation Monday/Tuesday included).
[temporal.weekday <> Sun] keeps this to FERIAS only, matching the
clause's own "Officio FERIALI" text; a Sunday in either season is
already [true] via the Sunday rule above regardless, so this guard
changes no OUTCOME, only which clause gets credit for it. *)
(temporal.Temporal.season = Vocab_ef.Christmastide
|| temporal.Temporal.season = Vocab_ef.Paschaltide)
&& temporal.Temporal.weekday <> Date.Sun
then true
else
(* 237(c): "in omnibus festis" -- every remaining genuine festum. By
this point every named Paschaltide day, every ordinary Sunday
(Class2, outside Septuagesima), every vigil, every feria I classis,
every Christmastide/Paschaltide feria and every BVM Saturday Office
has already been excluded or granted above, so what reaches here is
exactly: {!Temporal_ef.named}'s remaining population
(Epiphany, Ascension, Corpus Christi, the Sacred Heart, Christ the
King -- tested by PRESENCE in that table, since every [named] entry
carries [subject = Temporal] like any other, see [creed]'s own
475(c) comment); and every genuine sanctoral feast actually observed
([subject = Saint], or one of the handful of [subject = Lord]/[Bvm]
entries -- Holy Family, Holy Name of Jesus, the six [Lord]-tagged
sanctoral feasts, [most-holy-name-of-mary] -- [creed]'s own 475(c)
comment has the full census). The two ferial exceptions that ALSO
carry [Lord]/[Bvm] (the Sacred Triduum, the BVM Saturday Office) are
unreachable here: both were already excluded above (feria I
classis; 237(g)).
[Temporal_ef.named]'s FIRST disjunct EXCLUDES Passion Sunday and
Palm Sunday BY THEIR OWN SLUG -- not by [temporal.weekday <> Sun],
which a first pass of this fix tried and had to REVERT: Christ the
King is ALSO always a Sunday (its own [christ_the_king] anchor
IS "the last Sunday of October"), [Class1] like Passion/Palm
Sunday, so a blanket weekday guard wrongly excluded it too --
caught immediately by the LMS Ordo's own Gloria axis
(2024-10-27, "colitur gloria=false, Ordo gloria=true"), a
regression a same-session review round found before this task
closed. Passion Sunday and Palm Sunday are excluded because
neither is a genuine "festum" (RG 35's own taxonomy makes
"dominica" its own category, distinct from "festum") -- {!Temporal_
ef.named} carries them anyway (RG 91 entry 6, for its own
occurrence-table reasons), so without SOME exclusion both would
wrongly reach [true] here BY ACCIDENT of table membership --
confirmed wrong directly against the corrected FIUV extraction
(237(a)'s own comment above has the full account of the extractor
bug this was found alongside): both dates are [false] in the
source. Epiphany, Ascension, Corpus Christi, the Sacred Heart and
Christ the King -- {!Temporal_ef.named}'s only OTHER population --
are genuine festa and must NOT be excluded, which is exactly why
the exclusion is two named slugs, not a day-of-week predicate. The
SECOND disjunct (subject) carries no such guard: a genuine feast
that has fully displaced a Sunday's own Office (RG16(a)) still
deserves 237(c)'s grant on the FEAST's own terms, regardless of
what day of the week it falls on.
A plain, unnamed weekday feria (no Sunday, no vigil, no octave,
[named] = [None], [subject = Temporal]) correctly falls through to
[false] here -- 238(c)'s own "in omnibus feriis". *)
(Temporal_ef.named date <> None && slug <> "ef-passion-sunday" && slug <> "ef-palm-sunday")
|| observed.Celebration.subject = Subject.Saint
|| observed.Celebration.subject = Subject.Lord
|| observed.Celebration.subject = Subject.Bvm
(* Missale Romanum, Rubricae Generales, Caput XVII("De Ritibus servandis in
celebratione Missae"), "C) De hymno Glória in excélsis" (docs/research/
LT.txt, grep "Hymnus Glória"), quoted here in full:
"431. Hymnus Gloria in excelsis dicitur:
a) in Missis quae respondent Officio diei, quotiescumque ad
Matutinum dictus est hymnus Te Deum;
b) in Missis festivis de quibus n. 302;
c) in Missis feriae V in Cena Domini, et in Missa Vigiliae
paschalis;
d) in Missis votivis I, II et III classis, nisi adhibeatur color
violaceus paramentorum;
e) in Missis votivis IV classis de Angelis, quocumque die, et de B.
Maria Virg. quae in sabbato celebrantur.
432. Hymnus Gloria in excelsis omittitur:
a) in Missis quae respondent Officio diei, quando ad Matutinum
omittitur hymnus Te Deum;
b) in omnibus Missis in quibus adhibetur color violaceus
paramentorum;
c) in Missis votivis IV classis, iis exceptis de quibus n. 431 e;
d) in Missis defunctorum."
SCOPE NOTE, checked once here rather than at every clause, the same
discipline [creed]'s own header uses: this engine resolves ONE Mass per
civil day (Rite.t.readings' own doc comment) -- it has no separate
"which votive Mass is said" dimension. n. 301-303 (LT.txt, immediately
above 431), quoted in substance: 301 defines "Missa de festo" in the
NARROW sense as the Mass of the day's own Office -- exactly what
[Rite_ef.Lectionary_ef.readings] already resolves for every day,
including a BORROWED formulary (a weekday resuming the preceding
Sunday's Mass, a saint using his assigned Common): still "the Mass which
corresponds to the day's own Office" in 431(a)/432(a)'s own sense, so
431(a)/432(a) alone already cover it. 302's WIDER sense -- (a) a
III-class feast's own Mass said despite being impeded by another
III-class feast, (b) a commemoration's own Mass said in place of the
day's Office, (c) a saint's Mass said on his Martyrology elogium day --
are all cases of a DIFFERENT Mass than the day's own resolved Office
being said, which this engine does not model; 431(b) is therefore
genuinely N/A, not merely unread. 431(d)/(e) and 432(c) are about VOTIVE
MASS CLASSES (I-IV), a dimension this engine has no field for at all --
also N/A, EXCEPT 431(e)'s own "de B. Maria Virg. quae in sabbato
celebrantur" half: colitur does not model that Office as a votive Mass
(it has no votive-Mass dimension to model it AS), it models it as an
ORDINARY Office (RG 78's own text, [te_deum]'s own 237(g) branch above),
so its Gloria is produced as a side effect of 431(a) reading [te_deum],
not by a dedicated 431(e) branch -- checked directly: [te_deum]'s 237(g)
branch is unconditional (not colour-gated), and this Office's own colour
is white (never violet), so 432(b) below can never suppress it either.
431(e)'s "de Angelis" half (the votive Mass of the Angels) has no data
in this engine at all and stays N/A. *)
let gloria ~(temporal : (Vocab_ef.season, Vocab_ef.rank) Temporal.t)
~(observed : Vocab_ef.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
(* 432(d): "in Missis defunctorum" -- checked first, the same
{!Colour.Black} proxy [creed]'s own 476(f) and [te_deum]'s own
238(d) branch both use. Correctly also excludes Good Friday
(n=-2, [Colour.Black], temporal_ef.ml's own RG 132 citation) --
which has no Mass at all in the 1955-restored Holy Week, so the
question is moot there regardless; the same "belt and braces"
stance [creed]'s own 476(f) comment takes for the identical day. *)
observed.Celebration.colour = Colour.Black
then false
else if
(* 431(c): "in Missis feriae V in Cena Domini, et in Missa Vigiliae
paschalis" -- Holy Thursday (n=-3) and the Easter Vigil Mass (n=-1,
Holy Saturday's own date). Checked BEFORE 432(b)'s general violet
exclusion below and before [te_deum] is ever read: this clause is
lex specialis over both. It must outrank 432(b) specifically
because colitur's own per-day colour model gives Holy Saturday
[Colour.Violet] (Passiontide's [season_colour], temporal_ef.ml --
the historical vestment change from violet to white happens AT the
Gloria itself, a per-action nuance this whole day/colour model
already cannot express, the same acknowledged gap RG 126's palm
procession and RG 128's Good Friday Communion carry, temporal_ef.ml's
own citations) -- without this clause checked first, 432(b) would
wrongly silence the one Mass whose own Gloria is historically
unmistakable (the bells and organ restored at the Vigil). It must
also outrank [te_deum]: neither day's own Matins says Te Deum
(both are governed by [te_deum]'s own feria-I-classis exclusion,
n=-46/[-6,-1], the Sacred Triduum included), so without this
explicit override the Gloria would be wrongly silenced there too. *)
n = -3 || n = -1
then true
else if
(* 432(b): "in omnibus Missis in quibus adhibetur color violaceus
paramentorum" -- independent and colour-keyed, exactly as the task
brief states; NOT a substitute for [te_deum] below, which still
decides every Mass this clause does not itself silence. Genuinely
unconditional ("in omnibus Missis") -- checked directly against
every violet day in the domain-wide sweep (see the module's own
test file), never merely assumed.
[Colour.Rose] found and DELIBERATELY NOT added here, a real
"checked, then reverted" episode kept for the record: a first pass
of this task, WHILE the (since-reverted) blanket "every Sunday
says Te Deum" mutation to [te_deum] was in place, found Gaudete
and Laetare ([is_rose_sunday]) wrongly getting [gloria]=true and
fixed it by unioning [Colour.Rose] into this branch. Once
[te_deum] reverted to 237(b)'s own literal [Class2] guard, the
fix became REDUNDANT, not merely coincidentally silent: Rose can
ONLY ever colour a Sunday of Advent or Lent
({!Temporal_ef.is_rose_sunday}'s own two cases), and EVERY Sunday
of Advent or Lent is [Class1] BY CONSTRUCTION
({!Temporal_ef.temporal}'s own [match s with Advent | Lent ->
Class1 | _ -> Class2]) -- a structural guarantee, not a
coincidence of the shipped data, so [te_deum]'s own [Class2] guard
ALREADY excludes every Rose day before this branch is ever
reached. Verified, not assumed: removing this branch's own Rose
arm and re-running the full suite (including the two LMS dates,
2023-12-17 and 2024-03-10, this finding was originally pinned
against) left every test green. Left out rather than kept as
dead code that would misleadingly read as load-bearing. *)
observed.Celebration.colour = Colour.Violet
then false
else
(* 431(a)/432(a): "in Missis quae respondent Officio diei,
quotiescumque/quando... Te Deum [dictus est/omittitur]" -- the
Gloria mirrors [te_deum] exactly for every Mass not already decided
above. This is the ONE call site [te_deum] exists to serve. *)
te_deum ~temporal ~observed ~date
|