diff options
Diffstat (limited to 'lib/rites')
| -rw-r--r-- | lib/rites/rite_ef/precedence_ef.ml | 209 | ||||
| -rw-r--r-- | lib/rites/rite_ef/temporal_ef.ml | 213 |
2 files changed, 406 insertions, 16 deletions
diff --git a/lib/rites/rite_ef/precedence_ef.ml b/lib/rites/rite_ef/precedence_ef.ml index 5a2d307..7b64b83 100644 --- a/lib/rites/rite_ef/precedence_ef.ml +++ b/lib/rites/rite_ef/precedence_ef.ml @@ -364,14 +364,21 @@ let band (ctx : Vocab_ef.season Precedence.context) (c : Vocab_ef.rank Precedenc else if is_temporal && rank = Class3 && season = Advent then 250 (* 26: III-class vigils (St Lawrence). *) else if rank = Class3 && is_vigil then 260 - (* 27: Office of the BVM on Saturday -- every otherwise-unoccupied IV-class - Saturday, per the historical default that fills it; ordinary Mass - propers still make Rogation Mon/Tue/Wed proper without changing the - Office (RG 88, see temporal_ef.ml's [temporal]), so those never carry - this entry unless they happen to fall on the Saturday itself. Excludes - vigils for the same reason 11-13/14/16/19/20/23/24 do: RG 91 has no - IV-class vigil at all (RG 91's own vigil list, §4 "Vigils", - stops at III class), so one would be an anomaly, not this entry. *) + (* 27: Office of the BVM on Saturday -- RG 78 (Caput IX, "De sancta Maria + in sabbato"), both photographic scans and the electronic + transcription, word for word (docs/research/rules-register.md §4/§6.4; + Rite_ef.Temporal_ef's own [bvm_saturday_names] citation has the full + argument): "78. In sabbatis, in quibus occurrit Officium de feria IV + classis, fit de sancta Maria in sabbato" -- on Saturdays on which the + Office of a IV-class feria occurs, [the Office] is made of Holy Mary + on Saturday instead. Every otherwise-unoccupied IV-class Saturday + reaches this branch; ordinary Mass propers still make Rogation + Mon/Tue/Wed proper without changing the Office (RG 88, see + temporal_ef.ml's [temporal]), so those never carry this entry unless + they happen to fall on the Saturday itself. Excludes vigils for the + same reason 11-13/14/16/19/20/23/24 do: RG 91 has no IV-class vigil at + all (RG 91's own vigil list, §4 "Vigils", stops at III class), so one + would be an anomaly, not this entry. *) else if is_temporal && (not is_vigil) && rank = Class4 && weekday = Date.Sat then 270 (* 28: IV-class ferias -- the unqualified catch-all (temporal_ef.ml's own comment on [ferial_rank] cites the same primary text, "Feriae IV @@ -380,6 +387,162 @@ let band (ctx : Vocab_ef.season Precedence.context) (c : Vocab_ef.rank Precedenc else if (not is_vigil) && rank = Class4 then 280 else unclassified +(* RG 112(d) (Caput XVI, "De Commemorationibus"), the BVM half, fix round 1 + of the ef-bvm-saturday task (coordinator finding F1) -- both photographic + scans, word for word (docs/research/rules-register.md §4's own RG 112 + entry already carries this sub-clause, unbuilt until this fix): *"item, + Officium, Missa aut commemoratio de B. Maria Virg. aut de aliquo Sancto + vel Beato excludit aliam commemorationem aut orationem in qua eiusdem B. + Mariae Virg., vel Sancti aut Beati intercessio imploretur: quod tamen non + valet de oratione dominicae vel feriae, in qua fit invocatio eiusdem + Sancti."* -- the Office, Mass or commemoration OF the Blessed Virgin Mary + (or of some Saint or Blessed) excludes ANOTHER commemoration or oration + in which the intercession OF THE SAME BVM (or Saint or Blessed) is + invoked -- which however does not hold of the oration of a Sunday or + feria, in which invocation of the same Saint occurs. + + Found live by the fix-round review: the BVM Saturday Office (RG 91 entry + 27, [temporal_ef.ml]'s own [bvm_saturday_names]) is itself "de B. Maria + Virg." -- so when it is observed, RG 112(d) excludes any OTHER admitted + candidate whose own oration invokes the SAME BVM's intercession, not + merely commemorates her in passing. Real live witness: 16 July, + "our-lady-of-mt-carmel" (data/ef/sanctoral.sexp, Class3, + [Commemoration_only]) falls on a Saturday 8 times in the 2005-2050 + fixture alone; its own collect, both photographic scans, word for word + (Caput "Die 16 iulii, Beatae Mariae Virginis de Monte Carmelo, + Commemoratio"): *"...concede propitius; ut, cuius hodie Commemorationem + solemni celebramus officio, EIUS muniti praesidiis, ad gaudia sempiterna + pervenire mereamur"* -- "her" ("eius") -- grant, we beseech Thee, that we, + fortified by HER patronage, whose Commemoration we solemnly celebrate + today, may be permitted to arrive at everlasting joys -- an explicit + invocation of the SAME BVM's own intercession/patronage, precisely RG + 112(d)'s own trigger. + + The exception clause ("non valet de oratione dominicae vel feriae") does + NOT rescue this: RG 91 lists entry 27 as its own table row, separate from + entry 28's "feriae IV classis" -- this Office is neither a Sunday nor, + once RG 78 has substituted it in, a plain "feria" in Caput IV's own + sense (RG 21: "Nomine feriae intelleguntur singuli dies hebdomadae" -- + an ordinary weekday's OWN office, which RG 78 replaces, not merely + supplements). + + ALSO found on the very same page, both photographic scans, word for + word, confirming the collision is real and rubric-anticipated (not + merely this codebase's own inference): *"Si Commemoratio B. Mariae + Virg. de Monte Carmelo venerit in sabbato, Missa dici potest aut de + sancta Maria in sabbato, aut propria de Commemoratione B. Mariae Virg. + de Monte Carmelo."* -- if the Commemoration of the BVM of Mount Carmel + falls on a Saturday, the Mass MAY be said EITHER of Holy Mary on + Saturday OR properly of the Commemoration of the BVM of Mount Carmel -- + an explicit EITHER/OR between two MASS TEXTS, not an instruction to + commemorate one in the other's Office. Read together with RG 112(d): + the OFFICE question (is Mt Carmel commemorated at all) and the MASS + question (which of the two propers is said that day) are two different + questions -- RG 112(d) answers the first (excluded); this rubric answers + the second, and is a Mass-propers selection detail of exactly the same + kind as the I-V numbered cycle (RG 309(a)) [bvm_saturday_names]'s own + citation already puts out of scope for the SAME reason (colitur computes + no citations/readings at all yet, Plan 4) -- not modelled here either. + + [marian_slugs] is a CLOSED, HAND-VERIFIED list, not a claim to have read + every one of these entries' own Latin orations on the scan (only + Mt Carmel's, quoted above, was actually verified against the primary + text for this fix) -- built from data/ef/sanctoral.sexp's own [names.en] + field, restricted to entries that are themselves a feast/commemoration + OF the Blessed Virgin Mary in her own right (never merely a feast of + someone else that happens to mention her -- "St. Anne, Mother of the + Blessed Virgin", "St. Joseph, Spouse of the Bl. Virgin Mary", "St. + Anthony Mary Claret" and similarly-named entries are deliberately + EXCLUDED, checked one by one). This is the SAME modelling simplification + {!disposition}'s own pre-existing RG 112(a) branch already makes for + "eiusdem Divinae Personae" (read as simply "both [subject = Lord]", + that branch's own comment: "safe at today's data's own granularity") -- + here read as "titled a feast of the BVM", not verified oration-by- + oration, and said so explicitly rather than overclaimed. THREE entries found + and considered individually rather than merely omitted -- the third, + "vigil-of-the-assumption" (14 August, Class2, Feast), was MISSED by the + original enumeration and is recorded here by the fix-round re-review: it + is unambiguously de B. Maria Virg. and its collect implores her + protection ("sua nos defensione munitos"), so it BELONGS on the list on + the same reasoning as the rest. It is behaviourally inert either way -- + measured domain-wide, it wins 7196 times, always with the non-Marian + [eusebius-confessor] as its only commemoration, and never loses, since + no Class1 Marian falls on 14 August -- but a closed list's whole value is + its enumeration claim, and that claim was false as first written. The + other two were genuinely excluded after consideration: "dedication-of-the-basilica-of-st-mary-major" (5 + August, Class3, Feast) -- a DEDICATION feast (of the building, "In + Dedicatione S. Mariae ad Nives"), whose own oration could not be found + in either scan under this exact heading to confirm it invokes her + intercession the same way an ordinary Marian commemoration does, so left + out per this project's "a wrong citation is worse than a missing one" + rule; and "purification-of-the-blessed-virgin-mary" (2 February, + Class2), already deliberately tagged [subject = Lord] by an earlier + task's own ruling (register §6.0, following the oracle's Sunday- + displacing treatment) for an unrelated reason -- its own RG 112(a) + Lord-vs-Lord exclusion already covers it against another Lord-subject + winner, and at Class2 it can never lose to a Class4 candidate in the + first place (this or any other), so including or excluding it here has + no live consequence either way; excluded for consistency with the + earlier ruling rather than silently overriding it. + + What this rule COVERS: any admitted candidate on {!marian_slugs}' own + closed list, or tagged [subject = Bvm], losing to a WINNER that is + itself either {!marian_slugs}-listed or [subject = Bvm] -- currently + live only for the BVM Saturday Office (subject-tagged, its own slug + deliberately NOT on this list, {!bvm_saturday_names}'s own "Slug" + citation in temporal_ef.ml) as winner against Mt Carmel as loser, plus + (checked, not live: 24 September, "our-lady-of-ransom", the ONLY other + {!Celebration.status.Commemoration_only} Marian entry in the data) -- + PROVEN structurally unreachable: 24 September falling on a Saturday + forces 1 September to be a Thursday (23 days = 3 weeks 2 days earlier), + which by {!third_sunday_of_september}'s own construction makes 24 + September the September Ember Saturday EVERY time, RG 91 entry 18 + (Class2), always outranking entry 27 -- not a sampled coincidence, an + exact day-of-week identity, checked against several sample years above + before being generalised. What this rule does NOT cover, stated + plainly: a hypothetical non-Marian-titled saint whose own oration + happens to invoke the BVM's intercession in passing (RG 112(d)'s own + text does not restrict itself to Marian-TITLED commemorations) -- no + oration text is stored anywhere in this codebase to detect that, and + none is guessed at here. Also does not cover RG 112(d)'s OTHER half (two + commemorations of the SAME non-BVM saint) -- unbuilt, unaffected by this + fix, register §4/§6 already tracks it as open. + + Checked for what this fix does NOT change: {!Precedence.resolve} holds + [Commemoration_only] candidates out of the WINNER contest entirely, so + Mt Carmel could never have been [observed] either before or after this + fix -- only its own admission AS a commemoration changes. Verified live + against real 2033/2005 data (both years 16 July is a Saturday): before + this fix, [comms] included "our-lady-of-mt-carmel:ordinary"; after, + [comms] is empty and the omitted list carries it with reason "omitted: + yielded to a higher day", the same generic reason every other [Omit] + disposition in this function produces. *) +let marian_slugs = + [ "annunciation-of-the-blessed-virgin-mary"; + "assumption-of-the-blessed-virgin-mary"; + "immaculate-conception-of-the-blessed-virgin-mary"; + "immaculate-heart-of-mary"; + "maternity-of-the-blessed-virgin-mary"; + "most-holy-name-of-mary"; + "nativity-of-the-blessed-virgin-mary"; + "our-lady-of-lourdes"; + (* Added by the fix-round re-review: missed by the original enumeration, + behaviourally inert (it never loses; no Class1 Marian falls 14 Aug), + but it is de B. Maria Virg. and its collect implores her protection, + so it belongs on the list by the same test as every other member. *) + "vigil-of-the-assumption"; + "our-lady-of-mt-carmel"; + "our-lady-of-ransom"; + "our-lady-of-the-rosary"; + "presentation-of-the-blessed-virgin-mary"; + "queenship-of-the-blessed-virgin-mary"; + "seven-sorrows-of-the-blessed-virgin-mary"; + "visitation-of-the-blessed-virgin-mary" ] + +let is_bvm_office (c : Vocab_ef.rank Precedence.candidate) = + c.Precedence.cel.Celebration.subject = Subject.Bvm + || List.mem (Slug.to_string c.Precedence.cel.Celebration.slug) marian_slugs + (* Task 8: what happens to the day's LOSING candidate (docs/research/ rules-register.md §4, "Occurrence" RG 92-95 and "Vigils" RG 33, plus RG 94; also §6.0/Caput III "De Dominicis" RG 16(a), below). [band] above @@ -602,7 +765,35 @@ let disposition ~(winner : Vocab_ef.rank Precedence.candidate) let open Vocab_ef in let cel = loser.Precedence.cel in let is_temporal = loser.Precedence.origin = Precedence.Temporal in - if cel.Celebration.status = Celebration.Commemoration_only then + if is_bvm_office winner && is_bvm_office loser then + (* RG 112(d) -- see [marian_slugs]'s own citation above for the full + argument. + + ON THIS BRANCH'S POSITION (fix-round re-review, finding 5): it sits + ahead of RG 33's vigil branch and RG 95's Class1 Transfer branch as + well as ahead of [Commemoration_only], and only the last of those + three is a position it NEEDS. RG 112(d) governs commemorations, not + translations, so if a Class1 Marian celebration ever lost to a Marian + winner it would be silently [Omit]ed here instead of reaching RG 95 + and transferring. That is unreachable on shipped data -- the + re-review swept the whole domain and found ZERO Marian-winner / + Marian-loser pairs other than the 16 July case this branch exists + for, which is [Commemoration_only] and so could never transfer + anyway -- and it is left in place rather than moved, because + reordering a disposition branch is a behavioural change that deserves + its own measurement and review rather than a late edit. Recorded here + and in the register so the next task that touches this chain knows + the constraint: if a Class1 Marian entry is ever added, this branch + must move BELOW the Transfer branch. + + Checked FIRST, then, ahead of the [Commemoration_only] + branch immediately below, because the one live witness + (Mt Carmel, 16 July) IS [Commemoration_only] -- that branch's own + "always Commemorate, nothing overrides it" previously had no + exception for two commemorations invoking the identical BVM, the + exact gap this fix closes. *) + Precedence.Omit + else if cel.Celebration.status = Celebration.Commemoration_only then (* Always -- checked before RG 33's omission and RG 95's transfer so neither can override it: a Commemoration_only entry can never win (Precedence.resolve holds it out of the band contest entirely, see diff --git a/lib/rites/rite_ef/temporal_ef.ml b/lib/rites/rite_ef/temporal_ef.ml index 4b59ff4..4add824 100644 --- a/lib/rites/rite_ef/temporal_ef.ml +++ b/lib/rites/rite_ef/temporal_ef.ml @@ -580,6 +580,176 @@ let ferial_rank d s = let weekday_word d = Date.weekday_to_string (Date.weekday d) +(* RG 91 entry 27, "Officium sanctae Mariae in sabbato" -- the votive Office of + the BVM on Saturday. Caput IX of the Rubricae Generales, both photographic + scans and the electronic transcription, word for word (docs/research/ + rules-register.md §4/§6; no scan-vs-transcription conflict -- RG 78/79 are + General Rubrics prose, not the Mass-propers body text the transcription is + documented elsewhere as missing almost all of): + + "78. In sabbatis, in quibus occurrit Officium de feria IV classis, fit + de sancta Maria in sabbato. + 79. Officium sanctae Mariae in sabbato incipit a Matutino et explicit + post Nonam." + + -- "On Saturdays on which the Office of a IV-class feria occurs, [the + Office] is made of Holy Mary on Saturday [instead]. The Office of Holy + Mary on Saturday begins at Matins and ends after None." RG 78's own + protasis is exactly "otherwise unoccupied IV-class Saturday": WHICH + Saturdays qualify is not a season list to hand-maintain -- it is simply + every Saturday whose temporal candidate would otherwise be + {!Vocab_ef.Class4} (RG 91 entry 28's own unqualified ferial catch-all, + [ferial_rank] above), from ANY season that ferial rank reaches + (Septuagesima, Time after Epiphany, Time after Pentecost, and ordinary + Paschaltide Saturdays outside the privileged Easter/Pentecost octaves, and + the Christmastide ferial stretches [christmastide_feria_slug] builds -- + Advent/Lent/Passiontide Saturdays are already Class2/Class3, higher than + IV class, so RG 78's protasis never fires there, and Ember/Rogation/ + privileged-octave Saturdays are excluded the same way). Nothing else is + needed to decide "otherwise unoccupied": {!Precedence_ef.band}'s own + entry-27 branch already reads [rank = Class4 && weekday = Sat] on the + TEMPORAL candidate unconditionally (312 966 times across the domain, per + the task report) and only ever WINS the day (becomes [observed]) when + nothing of better table position contests it -- exactly RG 78's own + condition, decided by the existing occurrence machinery, not re-derived + here. When a real sanctoral feast DOES win such a Saturday outright, RG + 78's protasis is false for that day (the IV-class Office never "occurs" + there to begin with), and this candidate simply loses/omits exactly as + the plain ferial candidate it replaces already did (RG 26, {!disposition} + in precedence_ef.ml) -- verified: no change to {!Precedence_ef.band}, + {!Precedence_ef.disposition} or {!Precedence_ef.admit} was needed for + this, since RANK stays {!Vocab_ef.Class4} either way and none of those + three functions reads slug/colour/name to decide who wins, what a loser's + fate is, or how many commemorations are admitted. + + Rank: IV class, RG 91's own table position, unconditional ("Dies + liturgici IV classis: 27. Officium sanctae Mariae in sabbato. 28. Feriae + IV classis." -- both scans, register §4). + + Colour: white, ALWAYS, regardless of season. CORRECTED, fix round 1 + (coordinator finding F6): RG 120(b) alone is a stretch as the PRIMARY + citation -- its own text reads "in Officio et Missa DE FESTIS" (of + FEASTS), and this Office is not itself a festum (RG 91's own table + position, entry 27, sits outside the Festa rows 11-13/16/19/20/23/24 + entirely). The tighter chain, found on the same scan: RG 431(e) ("VIII -- De diversis + Missae partibus", subsection "C) De hymno Gloria in excelsis" -- NOT + "Caput XX", which does not exist: the Rubricae Generales' Caput series + ends at XIX. Corrected by the fix-round re-review; the paragraph number, + letter and subsection title were right, only the containing division was + invented) is the Missal's OWN classification of + this exact Mass, word for word: "431. Hymnus Gloria in excelsis + dicitur: ... e) in Missis votivis IV classis de Angelis, quocumque die, + et de B. Maria Virg. QUAE IN SABBATO CELEBRANTUR" -- the Gloria is said + "in IV-class VOTIVE MASSES of the Angels, on any day, and OF THE BVM + WHICH ARE CELEBRATED ON SATURDAY" -- the Missal's own words classify + this Mass as a "Missa votiva IV classis... de B. Maria Virg.", not a + festum. RG 121(a) (immediately after RG 120, same "De colore albo" + section), both photographic scans: "121. Colorem album requirunt + Missae votivae: a) quae respondent festis, de quibus numero + praecedenti" -- white colour is required by VOTIVE MASSES which + "correspond to" (respondent) the feasts named in the preceding + paragraph [120] -- 120(b)'s own "B. Mariae Virg." among them. The chain + -- RG 431(e) (this Mass IS a IV-class votive Mass of the BVM) -> RG + 121(a) (a votive Mass corresponding to a 120-listed feast-type takes + that colour) -> RG 120(b) (BVM feasts are white) -- reaches the + identical conclusion (white) through the category the Missal's own text + actually places this Mass in (votive), not by treating it as a festum + RG 91's own table structure says it is not. NOT RG 119 (the "de + Tempore" white rule for Christmastide/Paschaltide) or RG 127/128 + (season green/violet) either way: this Office is never "de Tempore" for + colour purposes, so it overrides [season_colour] unconditionally, + including on Septuagesima (violet) and Time-after-Epiphany/-Pentecost + (green) Saturdays -- confirmed against the oracle (missalemeum, 1 + August 2026, a Time-after-Pentecost Saturday: white, not the season's + green). The Missal's own "Missae de sancta Maria in sabbato" section + (both scans) carries no further per-Mass colour override the way some + OTHER votive Masses do elsewhere in the same scan ("In hac Missa + adhibetur color albus") -- it needs none, the chain above already + settles it unconditionally for every occurrence. + + Name: "Officium sanctae Mariae in sabbato" -- RG 91 entry 27's own table + title AND RG 79's own heading, both photographic scans and the electronic + transcription, word for word. Latin only, not English -- the same + zero-circularity discipline {!holy_family_sunday}/{!holy_name_names}/ + {!triduum_names} already established: an English name would mean reading + missalemeum's own title text, the oracle this axis is compared against, + to decide colitur's own "ground truth" name. + + Subject: [Bvm] -- simply true (RG 91 entry 27's own title names the BVM + directly) and currently inert for precedence purposes: neither + {!Precedence_ef.band}, {!Precedence_ef.disposition} nor + {!Precedence_ef.admit} tests [subject = Bvm] anywhere today (only [= + Lord] is ever read) -- the same "tagged anyway because it is simply true" + reasoning {!triduum_names}'s own [subject = Lord] tag already used for + the identical shape. Checked for a live interaction with the one other + [Bvm]-tagged entry this codebase's data carries + (data/ef/adjustments.sexp's `most-holy-name-of-mary`, 12 September, + Class3 Feast, not Commemoration_only): whenever 12 September falls on a + Saturday it wins outright over any Class4 candidate ({!Precedence_ef.band} + entry 24 beats entry 27 on table order alone), so this Office and that + entry can never coexist as a winner/commemorated-loser pair -- no live + RG 112(d) witness is created by this tag. + + Slug: UNCHANGED -- deliberately reuses whatever + [christmastide_feria_slug]/the generic <season>-<week>-<weekday> ferial + fallback would already have produced for this date (e.g. + "ef-septuagesima-2-saturday", "ef-time-after-pentecost-8-saturday"), not + a new bespoke key. Two independent reasons, not one: + (1) PRECEDENT: the SAME shape as the Sacred Triduum ({!triduum_names}'s + own citation above) -- "the slug deliberately STAYS the generic ... + key... identified structurally... never off the slug" -- and + {!Precedence_ef.band}'s own entry-27 branch already reads [rank = Class4 + && weekday = Sat] on the temporal candidate structurally, never its slug, + so nothing needs a bespoke key to find this office. + (2) A bespoke season-independent slug would have been actively WRONG: + [Colitur_kernel.Validate]'s own ["slugs"] check (validate.ml) asserts + every OBSERVED slug is sighted at most once per liturgical year, verified + with ZERO exceptions across the whole 1583-9999 domain before this task + (register/CLAUDE.md's own carried item 4) -- a single uniform + "ef-bvm-saturday" would be sighted 4-9 times in most liturgical years + (every otherwise-unoccupied Saturday), breaking that invariant for real, + not merely in theory (confirmed by writing it that way first: [Validate]'s + own landmark-years test failed immediately, 1583 alone sighting it on 5 + dates). Reusing the season-keyed ferial slug keeps the invariant intact + with no change to [Validate] at all, since season+week+weekday is already + guaranteed unique within a liturgical year by construction. It also + dovetails with the FIVE numbered "Missae de sancta Maria in sabbato" the + Missal's own Common of the BVM prints immediately afterward -- a heading + ("MISSAE DE S. MARIA IN SABBATO QUAE DICI ETIAM POSSUNT ALIIS DIEBUS UT + VOTIVAE DE B. MARIA VIRGINE, IUXTA RUBRICAS VEL, EX INDULTO, PRO TEMPORUM + DIVERSITATE") whose SUBSTANCE both scans corroborate but whose exact + wording is NOT "word for word" identical on both -- CORRECTED, fix round + 1 (coordinator finding F5b): both scans' own OCR is noisy here, and the + two additionally use different abbreviations for each other ("S. MARIA" + vs "SANCTA MARIA", "B. MARIA VIRGINE" vs "BEATA MARIA VIRGINE"), not + merely different OCR artifacts of one underlying text -- the task + report has the full raw-OCR comparison. Followed by five numbered + Masses, each with its own season heading, clean and consistent on both + scans: I "Tempore Adventus", II "A Nativitate Domini usque ad + Purificationem", III "A die 3 Februarii usque ad feriam IV Hebdomadae + sanctae", IV "Tempore Paschali", V "A festo Ss. Trinitatis usque ad + sabbatum ante dominicam I Adventus" -- matching the oracle's own "V Mass + of the B. V. M." title on a Time-after-Pentecost Saturday: a + season-keyed slug leaves room for a future lectionary + bootstrap (Plan 4) to map each one onto its corresponding numbered Mass's + propers, the same way [sunday_slug]'s own season-keyed Sunday slugs + already anchor the ordinary lectionary. RG 309(a)'s own words -- "Missae + quae pro sancta Maria in sabbato, IUXTA TEMPORUM DIVERSITATEM, in Missali + assignantur" -- confirm this is a MASS-TEXT selection detail (which + PROPERS are said), not an OFFICE-identity one; colitur computes no + citations/readings at all yet ([citations] is empty on every day) -- + deliberately not modelled further here, recorded per the task report. The + Missal's own five-season partition for the Mass numbering does not even + align with this rite's own RG 71-77 season boundaries (its own "III" + spans Septuagesima, all of Lent and most of Passiontide as ONE bracket), + one further reason not to try to derive a "Mass number" field from + [Vocab_ef.season] here. *) +let bvm_saturday_names = + Colitur_kernel.Names.of_list + [ (Colitur_kernel.Lang.of_string_exn "la", "Officium sanctae Mariae in sabbato") ] + +let is_bvm_saturday d (rank : Vocab_ef.rank) = Date.weekday d = Date.Sat && rank = Class4 + let temporal d = let y = Date.year d in let easter = Computus.gregorian_easter y in @@ -773,8 +943,22 @@ let temporal d = else ( match christmastide_feria_slug d with | Some slug -> - build ~season:s ~slug ~colour:(season_colour s) ~rank:(ferial_rank d s) - ~week:(week d) () + (* Every Christmastide feria this branch builds is + Class4 ([ferial_rank]'s own catch-all -- Christmastide + is never Advent/Lent/Passiontide), so + [is_bvm_saturday]'s rank test is always true here; the + weekday is the only real condition. See + [bvm_saturday_names]'s own citation above for the full + argument (rank/colour/name/subject) -- the SLUG stays + [slug], the same one this branch would otherwise have + built, per that same citation's own "Slug" paragraph + (not re-quoted at this function's two call sites). *) + if is_bvm_saturday d Class4 then + build ~subject:Colitur_kernel.Subject.Bvm ~names:bvm_saturday_names ~season:s ~slug + ~colour:Colour.White ~rank:Class4 ~week:(week d) () + else + build ~season:s ~slug ~colour:(season_colour s) ~rank:(ferial_rank d s) + ~week:(week d) () | None -> (* The days between Ash Wednesday and Lent I have proper Masses and belong to no numbered week. *) @@ -784,6 +968,26 @@ let temporal d = ~slug:(Printf.sprintf "ef-lent-after-ashes-%s" (weekday_word d)) ~colour:Colour.Violet ~rank:Class3 ~week:None () else + let week_n = week d in + let slug = + Printf.sprintf "ef-%s-%d-%s" (season_slug_word s) + (Option.value week_n ~default:0) (weekday_word d) + in + if is_bvm_saturday d (ferial_rank d s) then + (* RG 78 (Caput IX, "De sancta Maria in sabbato") -- + see [bvm_saturday_names]'s own citation above for + the full argument. This is the ordinary-season + half of the two call sites: Septuagesima, Time + after Epiphany, Time after Pentecost, and + ordinary Paschaltide Saturdays outside the + privileged Easter/Pentecost octaves are exactly + the seasons [ferial_rank] gives Class4 outside + Christmastide (the other call site, above). The + SLUG stays [slug], just computed above, the same + one this branch would otherwise have built. *) + build ~subject:Colitur_kernel.Subject.Bvm ~names:bvm_saturday_names ~season:s ~slug + ~colour:Colour.White ~rank:Class4 ~week:week_n () + else let colour = (* The Pentecost octave weekdays are red, not Paschaltide's white. *) if days_between easter d >= 50 && days_between easter d <= 55 then Colour.Red @@ -817,11 +1021,6 @@ let temporal d = else if days_between easter d = -3 then Colour.White else season_colour s in - let week_n = week d in - let slug = - Printf.sprintf "ef-%s-%d-%s" (season_slug_word s) - (Option.value week_n ~default:0) (weekday_word d) - in (* [triduum_names]'s own citation above: identity only, for the three days of the Sacred Triduum -- every other ferial day here stays unnamed, subject |
