aboutsummaryrefslogtreecommitdiff
path: root/lib/rites/rite_ef/rubrics_ef.ml
blob: eea92a9b4970c120f50a8cde2fca67cf5b6c78fd (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
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
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
(* 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

(* Missale Romanum, Rubricae Generales, Caput XVII, "H) De praefatione" (RG
   482-499; docs/research/LT.txt, grep "praefatione dicitur quae cuique"),
   quoted here in full so every branch below can cite its own paragraph
   without re-quoting the whole rubric:

     "482. Praefatio dicitur quae cuique Missae propria est; qua deficiente,
   dicitur praefatio de Tempore, secus communis.

     483. Nulla commemoratio, in Missa occurrens, praefationem propriam
   inducit.

     484. Praefatio de Nativitate Domini dicitur:
       a) tamquam propria in Missis de Nativitate Domini et de eiusdem
   octava, necnon in festo Purificationis B. Mariae Virg.;
       b) tamquam de Tempore, infra octavam Nativitatis Domini, etiam in
   Missis quae secus praefationem propriam haberent, exceptis iis Missis
   quae praefationem propriam de divinis mysteriis vel Personis habent; et
   a die 2 ad 5 ianuarii.

     485. Praefatio de Epiphania Domini dicitur:
       a) tamquam propria in Missis de festo Epiphaniae et de
   Commemoratione Baptismatis D. N. Iesu Christi;
       b) tamquam de Tempore diebus a 7 ad 13 ianuarii.

     486. Praefatio de Quadragesima dicitur:
       a) tamquam propria in Missis de Tempore a feria IV cinerum usque ad
   sabbatum ante dominicam I Passionis;
       b) tamquam de Tempore in ceteris Missis quae celebrantur eodem
   tempore, et praefatione propria carent.

     487. Praefatio de sancta Cruce dicitur:
       a) tamquam propria in Missis de tempore a dominica I Passionis usque
   ad feriam V in Cena Domini; in Missis tam festivis quam votivis de
   sancta Cruce, de Passione Domini et instrumentis Passionis Domini, de
   pretiosissimo Sanguine D. N. Iesu Christi, de Ss.mo Redemptore;
       b) tamquam de Tempore in omnibus Missis a dominica I Passionis usque
   ad feriam IV Hebdomadae sanctae, quae praefatione propria carent.

     488. Praefatio de Missa chrismatis dicitur feria V in Cena Domini, in
   sua Missa.

     489. Praefatio paschalis dicitur:
       a) tamquam propria in Missis de Tempore a Missa Vigiliae paschalis
   usque ad vigiliam Ascensionis Domini;
       b) tamquam de Tempore in ceteris Missis quae celebrantur eodem
   tempore, et praefatione propria carent.

     490. Praefatio de Ascensione Domini dicitur:
       a) tamquam propria in festo Ascensionis Domini;
       b) tamquam de Tempore in omnibus Missis a feria VI post Ascensionem
   usque ad feriam VI ante vigiliam Pentecostes, quae praefatione propria
   carent.

     491. Praefatio de Ss.mo Corde Iesu dicitur in Missis festivis et
   votivis de Ss.mo Corde Iesu.

     492. Praefatio de D. N. Iesu Christo Rege dicitur in Missis festivis
   et votivis de D. N. Iesu Christo Rege.

     493. Praefatio de Spiritu Sancto dicitur:
       a) tamquam propria in Missis de Tempore a vigilia Pentecostes usque
   ad subsequens sabbatum; et in Missis festivis et votivis de Spiritu
   Sancto;
       b) tamquam de Tempore in ceteris Missis quae celebrantur eodem
   tempore, et praefatione propria carent.

     494. Praefatio de Ss.ma Trinitate dicitur:
       a) tamquam propria in Missis de festo et votivis Ss.mae Trinitatis;
       b) tamquam de Tempore in dominicis Adventus, et in omnibus dominicis
   II classis, extra tempus natalicium et paschale.

     495. Praefatio de beata Maria Virgine dicitur in Missis festivis et
   votivis beatae Mariae Virginis, praeterquam in festo Purificationis B.
   Mariae Virg.

     496. Praefatio de S. Ioseph dicitur in Missis festivis et votivis S.
   Ioseph.

     497. Praefatio de Apostolis dicitur in Missis festivis et votivis
   Apostolorum et Evangelistarum.

     498. Praefatio communis dicitur in Missis quae praefatione propria
   carent, nec sumere debent praefationem de Tempore.

     499. Praefatio defunctorum dicitur in Missis defunctorum."

   THE SHAPE OF THE RULE, once, rather than at every branch: RG 482's own
   chain is "propria, else de Tempore, else communis". Read literally, 484-
   497 look like FOURTEEN SEPARATE RULES, but on inspection each numbered
   rubric's own (a)/(b) pair (where it has both) produces the SAME preface
   identity either way -- (a) is the propria reading ("this Mass's OWN
   preface"), (b) is the de-Tempore reading ("this OTHER Mass, lacking one
   of its own, borrows it") -- so for the single question this function
   answers (WHICH preface, not WHETHER it counts as propria or de Tempore
   for some other purpose) the two halves collapse into one PRIORITY-
   ORDERED decision: a fixed list of "genuinely proper" triggers (title/
   mystery feasts, independent of season), checked first in a citable
   order, falling through to a fixed list of SEASONAL windows, falling
   through to [Common]. RG 483 (a commemoration never induces a proper)
   holds by construction, the same way [creed]'s own 476(e) does: every
   branch below reads only [observed], never a day's admitted
   commemorations.

   THE PRIORITY ORDER ITSELF was cross-checked against 358 real,
   individually classifiable entries in the FIUV Ordo's own [praef] column
   (test/fixtures/fiuv-ordo-2025-2026.sexp, test_fiuv_ordo.ml) spanning the
   WHOLE liturgical year -- not merely derived from the Latin text in
   isolation. Two findings the plain text alone would not have settled,
   both empirically confirmed rather than assumed:

     - 484(b)'s own "exceptis iis Missis quae praefationem propriam de
       divinis mysteriis vel Personis habent" is NARROWER than every other
       window's implicit "unless it already has a genuine proper" -- St
       John the Evangelist (27 December, on {!creed_apostle_slugs}, so his
       OWN Apostles preface (497) would otherwise apply) is overridden to
       [Nativity] inside the octave (confirmed: the Ordo's own 27 December
       entry reads "de Nativ.", not "App."), while St Barnabas/Sts Philip &
       James/the other Apostles OUTSIDE the octave keep their own Apostles
       preface even inside another window (Sts Philip & James, 11 May,
       inside the Easter window: confirmed "App." in the Ordo, not
       "Pasch."). So [Apostles] is checked AFTER the Nativity window below,
       but every OTHER title trigger (Holy Cross/Sacred Heart/Christ the
       King/Trinity/St Joseph/BVM) is checked BEFORE it -- RG 484(b)'s own
       narrower carve-out, read literally: unreachable on the shipped
       calendar for the other five (no such feast falls 25 December-5
       January), so this ordering is defensive for them, not observed live,
       the same "checked, not merely assumed" discipline
       {!Precedence_ef.marian_slugs}'s own citation follows elsewhere.
     - RG 495's own "et votivis" half is live on this engine's data after
       all, for the ONE office this project already models as a votive-
       shaped Mass without a votive-Mass DIMENSION (RG 78/91 entry 27, the
       Saturday Office of the BVM, {!Temporal_ef}'s own [subject = Bvm]
       tag): confirmed directly (3 January and 10 January 2026, both the
       Saturday Office, both read "BMV" in the Ordo) -- including on 3
       January, itself inside the Nativity's own "2 ad 5 ianuarii" de-
       Tempore window, where BVM still wins, corroborating the same
       "genuine propria outranks every window" ordering the Apostles
       finding above established from the opposite direction.

   Good Friday's own printed [praef] text ("comm. Feria VI prima in
   mense.") was NOT used to check this function's own [None] answer for
   that day: {!test_fiuv_ordo.ml}'s own F1 (Gloria) already adjudicated
   this exact date's raw text as unreliable (a copied, not a considered,
   line -- see that allow-list entry's own citation for the full argument,
   confirmed against the PDF's own page image, not merely the extracted
   fixture) -- the same defect, read again, would apply equally to
   whatever trails "praef." on the identical corrupted line, so this
   function's [None] rests on RG 28's own "no Mass" structural argument
   alone (the same argument [creed]/[gloria]/[te_deum] already give for
   this date), not on any Ordo corroboration. *)

(* RG 487(a): the two GENUINE fixed-date feast triggers in the shipped
   universal calendar -- the Exaltation of the Holy Cross (14 September)
   and the Most Precious Blood (1 July), both [subject = Lord]. RG 487(a)'s
   own further-named categories ("de Passione Domini et instrumentis
   Passionis Domini, de Ss.mo Redemptore") have NO corresponding entry
   anywhere in data/ef/sanctoral.sexp (checked directly, grepping for
   "instrument"/"redeem": zero hits) -- genuinely absent from the shipped
   1962 universal calendar, not merely unmatched by this list, so they are
   N/A rather than silently unreachable. *)
let preface_holy_cross_slugs =
  [ "exaltation-of-the-holy-cross"; "precious-blood-of-our-lord-jesus-christ" ]

(* RG 496: the two St Joseph feasts in the shipped calendar (19 March, 1
   May) -- both [subject = Saint], so (unlike RG 495's own BVM feasts) no
   [subject]-based fallback exists or is needed; this closed list is the
   whole of what RG 496 can ever reach on shipped data. *)
let preface_st_joseph_slugs = [ "joseph-spouse-of-the-bl-virgin-mary"; "joseph-the-workman" ]

(* RG 497's own [Apostolorum et Evangelistarum] population is WIDER than
   {!creed_apostle_slugs}: RG 475(e) is restricted to a NATALICIUM ("festis
   NATALICIIS Apostolorum...", that module's own citation), but RG 497 has
   no such restriction at all ("in Missis festivis et votivis Apostolorum
   et Evangelistarum" -- ANY festive/votive Mass of an Apostle or
   Evangelist). FOUND, not assumed: the FIUV Ordo's own 30 June entry
   ("In Commemoratione S. Pauli Ap.", data/ef/adjustments.sexp's own RG
   110(c) [Add], {!Precedence_ef}'s own citation -- a genuine [Feast]-
   status office of Paul the Apostle, but NOT his own dies natalis, so
   {!creed_apostle_slugs} deliberately excludes it) reads "App. I", not
   "comm." -- checked directly while building this comparison, not
   guessed. [creed_apostle_slugs] itself is UNCHANGED (RG 475(e)'s own
   narrower "natalicium" reading still holds for the Creed); this is a
   SEPARATE, wider list for RG 497 alone.

   "conversion-of-st-paul" (25 January, Class3, the SAME "not a
   natalicium" shape {!creed_apostle_slugs}'s own citation excludes it
   for) is a plausible SECOND candidate by the identical RG 497 reasoning
   -- deliberately NOT added: it is UNWITNESSED (25 January falls on a
   Sunday, hence impeded, in the one fixture year this engine's Ordo
   evidence covers, {!test_fiuv_ordo.ml}'s own window), and "a wrong
   citation is worse than a missing one" ({!Precedence_ef.marian_slugs}'s
   own citation, the precedent this follows). Left for a future fixture
   year to confirm or refute. *)
let preface_apostle_slugs = "in-commemoratione-sancti-pauli-apostoli" :: creed_apostle_slugs

(* RG 495's own [beatae Mariae Virginis] population is also WIDER than
   {!Precedence_ef.marian_slugs}: that list was built for a DIFFERENT
   rubric (RG 112(d), whether a commemoration invokes HER OWN
   intercession specifically) with a correspondingly narrower, oration-
   checked standard, and its own citation explicitly EXCLUDES "dedication-
   of-the-basilica-of-st-mary-major" (5 August) for exactly that reason --
   "whose own oration could not be found... to confirm it invokes her
   intercession". RG 495 asks a different, WIDER question ("is this Mass
   festive or votive OF the Blessed Virgin Mary at all"), which the
   Dedication of St Mary Major answers on its own title alone, without
   needing the oration-level standard RG 112(d) requires. FOUND, not
   assumed: the FIUV Ordo's own 5 August entry reads "BMV Et te in
   Festivitate.", not "comm." -- checked directly. *)
let preface_bvm_slugs = "dedication-of-the-basilica-of-st-mary-major" :: Precedence_ef.marian_slugs

let preface ~(temporal : (Vocab_ef.season, Vocab_ef.rank) Temporal.t)
    ~(observed : Vocab_ef.rank Celebration.t) ~(date : Date.t) : Preface.t option =
  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 28-34/RG 23(b), the same structural "no Mass at all" position
       [creed]'s own vigil comment and [gloria]'s own 432(d) comment both
       take for Good Friday specifically: the 1955-restored Holy Week has
       no Mass whatsoever that day (only the afternoon liturgical action),
       so there is no Mass to preface. Checked ahead of the
       {!Colour.Black} Requiem proxy immediately below -- unlike All
       Souls, Good Friday sharing that colour is coincidental, not
       diagnostic (temporal_ef.ml's own RG 132 citation), and the two need
       DIFFERENT answers here (unlike [creed]/[gloria]/[te_deum], where
       both collapse to the same boolean) -- so this function cannot reuse
       their shared single guard and must split Good Friday out first. *)
    n = -2
  then None
  else if
    (* RG 499: "in Missis defunctorum" -- the same {!Colour.Black} proxy
       [creed]'s own 476(f), [te_deum]'s own 238(d) and [gloria]'s own
       432(d) already use (this file's own header has the full argument
       and the two-member population this proxy rests on). With Good
       Friday split out above, the one remaining member is All Souls. *)
    observed.Celebration.colour = Colour.Black
  then Some Preface.Requiem
  else if
    (* RG 487(a)'s own fixed-feast half -- checked first among the title
       triggers per this file's own header (arbitrary among these six,
       since none can ever co-occur with another on shipped data; Holy
       Cross is placed first only because it is also the anchor for the
       Passiontide WINDOW checked later below, keeping both citations
       adjacent in this file). *)
    List.mem slug preface_holy_cross_slugs
  then Some Preface.Holy_cross
  else if
    (* RG 491: "in Missis festivis... de Ss.mo Corde Iesu" -- the Friday
       after the Octave of Corpus Christi (Easter+68), {!Temporal_ef}'s own
       named slug. Confirmed against the Ordo (12 June 2026: "de Ss.mi
       Corde Iesu"). *)
    slug = "ef-sacred-heart"
  then Some Preface.Sacred_heart
  else if
    (* RG 492: "in Missis festivis... de D. N. Iesu Christo Rege" -- the
       last Sunday of October, {!Temporal_ef.christ_the_king}'s own named
       slug. Confirmed against the Ordo (25 October 2026: "de Domino
       Nostro Jesu Rege"). *)
    slug = "ef-christ-the-king"
  then Some Preface.Christ_the_king
  else if
    (* RG 490(a): "in festo Ascensionis Domini" -- the feast itself
       (Easter+39), checked here by slug rather than folded into the
       Ascension WINDOW below (which starts the day AFTER, Easter+40):
       Ascension Day itself needs no window at all, its own slug already
       identifies it uniquely. Confirmed against the Ordo (14 May 2026:
       "Ascensionis, Communic pr."). *)
    slug = "ef-ascension"
  then Some Preface.Ascension
  else if
    (* RG 494(a): "in Missis de festo... Ss.mae Trinitatis" -- Trinity
       Sunday itself (Easter+56), {!Temporal_ef}'s own named slug. Checked
       ahead of 494(b)'s own WIDER de-Tempore grant (checked last below,
       after every other window) for the same "specific propria before any
       season fallback" reason every other title trigger is. Confirmed
       against the Ordo (31 May 2026: "Trinit. II"). *)
    slug = "ef-trinity"
  then Some Preface.Trinity
  else if
    (* RG 496: see {!preface_st_joseph_slugs}'s own citation. *)
    List.mem slug preface_st_joseph_slugs
  then Some Preface.St_joseph
  else if
    (* RG 495: "in Missis festivis et votivis beatae Mariae Virginis" --
       {!preface_bvm_slugs} (its own citation has the full account of why
       it is wider than {!Precedence_ef.marian_slugs}) covers every
       genuine Marian FEAST; [subject = Bvm] covers the one VOTIVE-shaped
       office this engine models without a votive-Mass dimension of its
       own (RG 78/91 entry 27, the Saturday Office of the BVM -- this
       file's own header has the empirical confirmation, 3/10 January
       2026). The Purification is deliberately ABSENT from both:
       {!Precedence_ef.marian_slugs} already excludes it by name (its own
       citation), and it never carries [subject = Bvm] (tagged [Lord]
       instead, register §6.0) -- RG 495's own "praeterquam in festo
       Purificationis" exclusion therefore holds by construction, not by
       a guard written here.

       [not (is_vigil slug)]: RG 495's own "festivis" reads "festum", not
       "vigilia" -- the SAME RG 21/35 taxonomy distinction {!creed}'s own
       RG 28-34 comment already makes ("a vigil is its OWN liturgical-day
       category, distinct from 'festum'"), applied here for the first
       time in THIS function because it is the first branch a vigil can
       actually reach: {!Precedence_ef.marian_slugs} includes
       "vigil-of-the-assumption" (that list's own citation), which without
       this guard would wrongly claim [Bvm] for 14 August. FOUND, not
       assumed: the FIUV Ordo's own 14 August entry reads "comm. I", not
       "BMV" -- checked directly, the same as every other finding in this
       branch's own history. Corroborates, from the opposite direction,
       {!creed}'s own RG 28-34 comment: colitur's own Nativity WINDOW
       below already excludes 24 December (the Nativity Vigil) by
       construction (it starts at 25 December, never 24th), so this guard
       makes the SAME "a vigil is not a festum" answer explicit here too,
       rather than relying on a second, unrelated accident of a date
       range to produce it. *)
    (not (Precedence_ef.is_vigil slug))
    && (List.mem slug preface_bvm_slugs || observed.Celebration.subject = Subject.Bvm)
  then Some Preface.Bvm
  else if
    (* RG 484(a)'s own explicit Purification clause ("necnon in festo
       Purificationis B. Mariae Virg.") -- 2 February, nowhere near the
       Nativity's own Christmas-to-Epiphany calendar position, so this is
       a standalone slug check, not part of the WINDOW test below (unlike
       every other 484 trigger, which IS date-based). Checked here, after
       the BVM check immediately above (which the Purification's own
       [subject = Lord] tag never reaches) and before the Nativity window
       (which its own actual date, 2 February, never reaches either) --
       positioned with the rest of 484's own citations for readability,
       not because anything below could otherwise pre-empt it. *)
    slug = "purification-of-the-blessed-virgin-mary"
  then Some Preface.Nativity
  else if
    (* RG 484(a)/(b) merged, per this file's own header: 25 December-1
       January (the Nativity itself and its octave, propria) UNION 2-5
       January (498(b)'s own explicit extra de-Tempore days) -- one
       contiguous window, since both halves produce the identical
       preface. Checked BEFORE Apostles (below) but AFTER every genuine
       "divine mysteries/Persons" propria above, per this file's own
       header (St John the Evangelist, 27 December, is the live witness:
       Apostles would otherwise apply and does not). *)
    (m = 12 && dd >= 25) || (m = 1 && dd <= 5)
  then Some Preface.Nativity
  else if
    (* RG 497: "in Missis festivis et votivis Apostolorum et
       Evangelistarum" -- {!preface_apostle_slugs} (its own citation has
       the full account of why it is wider than {!creed_apostle_slugs}),
       confirmed by this file's own header to produce the SAME preface
       answer as the Ordo on every Apostle date outside the Nativity
       octave: 11 June (Barnabas), 29-30 June (Peter & Paul, In
       Commemoratione Pauli), 11 May (Philip & James, RG 484(b)'s own
       witness against the Nativity window immediately above). Checked
       AFTER the Nativity window specifically (RG 484(b)'s own narrower
       carve-out), but before every OTHER season window below -- an
       Apostle feast keeps his own preface inside Lent, Passiontide,
       Paschaltide etc., where nothing narrows the exception the way
       484(b) does. No [is_vigil] guard is needed here the way RG 495's
       own branch above needs one: checked directly, no entry on
       {!preface_apostle_slugs} is ever a vigil slug (every Apostle vigil
       in the shipped data -- "vigil-of-sts-peter-paul" -- carries its own
       distinct slug, absent from this list). *)
    List.mem slug preface_apostle_slugs
  then Some Preface.Apostles
  else if
    (* RG 485(a): "in Missis de festo Epiphaniae et de Commemoratione
       Baptismatis D. N. Iesu Christi" -- the feast itself and its own
       named commemoration (13 January, {!Precedence_ef}'s own
       "commemoration-of-the-baptism-of-the-lord" -- {!creed}'s own 475(c)
       comment already documents this entry's [subject = Lord] tag), both
       checked by slug so 485(b)'s own WIDER window below need not repeat
       them. *)
    slug = "ef-epiphany" || slug = "commemoration-of-the-baptism-of-the-lord"
  then Some Preface.Epiphany
  else if
    (* RG 485(b): "diebus a 7 ad 13 ianuarii" -- every OTHER Mass in this
       window (Holy Family Sunday, an ordinary Time-after-Epiphany feria
       or Sunday, a saint's feast with no propria of its own), confirmed
       against the Ordo's own 11 January 2026 entry (Holy Family Sunday:
       "de Epiphania. II", not a Holy-Family-specific preface -- this
       engine has none to offer it anyway). Colitur's own Christmastide
       season already spans 25 December-13 January (RG 72-73,
       {!Vocab_ef.season}'s own citation), so this window is exactly its
       OWN post-Epiphany tail; written as an explicit date range rather
       than a season test only because the Nativity window above already
       claims the season's FIRST half by date, not by season either, for
       symmetry. *)
    m = 1 && dd >= 6 && dd <= 13
  then Some Preface.Epiphany
  else if
    (* RG 486(a)/(b) merged: Ash Wednesday (Easter-46) through the
       Saturday before Passion Sunday I (Easter-15) inclusive -- every
       Lenten feria/Sunday's own Mass (a), and every OTHER Mass in the
       same span lacking a proper of its own (b). Confirmed against the
       Ordo throughout (e.g. 18 February/19-20 February 2026: "Quadr.").
       {!creed}'s own RG 23 comment already explains why Ash Wednesday
       (feria I classis) reaches this branch on [observed]'s own terms
       regardless of rank -- this function reads no rank at all here,
       only the date. *)
    n >= -46 && n <= -15
  then Some Preface.Lent
  else if
    (* RG 487(a)/(b) merged: Passion Sunday I (Easter-14) through Holy
       Thursday (Easter-3) inclusive -- (a)'s own "de tempore"/festive-
       votive half extends through Holy Thursday itself (the Mass of the
       Lord's Supper), (b)'s own narrower saint-Mass half stops one day
       earlier (Holy Wednesday) but reaches no LIVE day this check does
       not already cover identically (Holy Thursday is a feria I classis,
       RG 23(b), so no saint's feast can ever occupy it -- {!creed}'s own
       RG 23 citation). Confirmed against the Ordo throughout (22 March
       2026, Passion Sunday: "de Sancta Cruce."; 2 April 2026, Holy
       Thursday: "de Sancta Cruce, Communicantes..."). *)
    n >= -14 && n <= -3
  then Some Preface.Holy_cross
  else if
    (* RG 489(a)/(b) merged: the Easter Vigil Mass (Easter-1, on Holy
       Saturday's own date) through the vigil of the Ascension (Easter+38)
       inclusive. [n = -1] is this engine's own OVERLOADED representation
       of "the Vigil Mass", not Holy Saturday's daytime (which has no Mass
       of its own at all, unlike Good Friday's [n = -2] this function
       excludes by name above) -- [gloria]'s own RG 431(c) comment already
       establishes the same convention for the identical date, and RG
       489(a) resolves the question on its own terms regardless: the
       Paschal preface's window STARTS at the Vigil Mass, so [n = -1] is
       correctly [Easter]. Confirmed against the Ordo throughout (5 April
       2026, Easter Sunday: "Pasch."; 13 May 2026, the Ascension Vigil:
       "Pasch. I"); the fixture prints nothing at all for Holy Saturday's
       own daytime square (4 April 2026), corroborating rather than
       contradicting this reading -- see test_fiuv_ordo.ml's own citation. *)
    n >= -1 && n <= 38
  then Some Preface.Easter
  else if
    (* RG 490(b): "a feria VI post Ascensionem usque ad feriam VI ante
       vigiliam Pentecostes" -- the Friday after Ascension (Easter+40)
       through the Friday before the Pentecost vigil (Easter+47)
       inclusive; Ascension Day itself (Easter+39) is already handled by
       its own slug check above, not repeated here. Confirmed against the
       Ordo throughout (15-22 May 2026: "Ascensionis"). *)
    n >= 40 && n <= 47
  then Some Preface.Ascension
  else if
    (* RG 493(a)/(b) merged: the vigil of Pentecost (Easter+48) through
       "subsequens sabbatum" (the FOLLOWING Saturday, i.e. the Ember
       Saturday within the Octave of Pentecost, Easter+55) inclusive.
       Confirmed against the Ordo throughout (23-24 May 2026, the vigil
       and Pentecost itself: "de Spirito Sancto"; 30 May 2026, the Ember
       Saturday: "de Spirito Sancto"). *)
    n >= 48 && n <= 55
  then Some Preface.Holy_spirit
  else if
    (* RG 494(b): "in dominicis Adventus, et in omnibus dominicis II
       classis, extra tempus natalicium et paschale". Read off
       [temporal]'s own season, NOT [observed]'s rank -- CORRECTED from an
       earlier version of this branch that DID read [observed.rank] and
       required it to equal [Class2], which is wrong for the identical RG
       16(a) reason {!Precedence.rules.admit}'s own [~temporal] parameter
       exists and [creed]'s own 237(b)/475(a) comments already give: a
       feast that has WON the day can carry a different rank than the
       Sunday it stands on. FOUND, not assumed: All Saints' Day (1
       November), Class1, observed outright over an ordinary
       Time-after-Pentecost Sunday it commemorates
       ([+ef-time-after-pentecost-sunday-23]), reads "Trinit." in the
       Ordo -- [observed.rank] there is [Class1], so the OLD guard wrongly
       answered [Common]; there is no dedicated preface for All Saints
       among RG 484-497's own fourteen, so RG 482's chain correctly falls
       through to the SUNDAY's own de-Tempore grant regardless of which
       rank actually won the day.

       {!Temporal_ef.temporal}'s own [match s with Advent | Lent -> Class1
       | _ -> Class2] means EVERY Sunday's own TEMPORAL identity is
       [Class2] except in Advent and Lent -- so "in omnibus dominicis II
       classis" and "in dominicis Adventus" collapse into ONE test, "any
       Sunday outside Christmastide and Paschaltide" (Lent's own Sundays
       need no explicit exclusion here: {!creed}'s own RG 23/Lent-window
       reasoning already means every one of them is claimed by the LENT
       window earlier in this very priority chain, provably unreachable
       here, the same "checked, not merely assumed" position the previous
       version of this comment already took for Christmastide/Paschaltide
       -- confirmed by the SAME domain sweep in test_rubrics_ef.ml, which
       still finds zero Christmastide/Paschaltide/Lent days reaching this
       branch after this change). Confirmed against the Ordo throughout
       (e.g. every Advent/Time-after-Epiphany/Septuagesima/Time-after-
       Pentecost Sunday not otherwise claimed: "Trinit."), now including
       All Saints' Day itself. *)
    temporal.Temporal.weekday = Date.Sun
    && temporal.Temporal.season <> Vocab_ef.Christmastide
    && temporal.Temporal.season <> Vocab_ef.Paschaltide
  then Some Preface.Trinity
  else
    (* RG 498: "in Missis quae praefatione propria carent, nec sumere
       debent praefationem de Tempore" -- everything else: an ordinary
       weekday feria outside every window above, a plain sanctoral saint
       with no title of his own, an ordinary (non-Sunday, non-Class2, or
       Christmastide/Paschaltide) day. Confirmed against the Ordo
       throughout (the single most common value in the fixture, 188 of
       360 comparable rows). *)
    Some Preface.Common