diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/bootstrap_lectionary.ml | 207 |
1 files changed, 150 insertions, 57 deletions
diff --git a/tools/bootstrap_lectionary.ml b/tools/bootstrap_lectionary.ml index ed40c92..4939770 100644 --- a/tools/bootstrap_lectionary.ml +++ b/tools/bootstrap_lectionary.ml @@ -135,6 +135,28 @@ let colitur_keys name = [ "ef-lent-ember-wed" ] else if String.equal name "ef-lent-1-friday" then [ "ef-lent-ember-fri" ] else if String.equal name "ef-lent-1-saturday" then [ "ef-lent-ember-sat" ] + else if String.equal name "ef-passiontide-0-tuesday" then + (* Important, fix round 2 (coordinator review): the general + Passiontide rename below carries every OTHER weekday's citation + straight through from lectio's own ini, correct for Passion week + (Critical 1's own fix, this comment's own sibling branch). Tuesday + is the ONE exception, already flagged, not yet acted on, by + [holy_week_entries]'s own footnote in the previous fix round: the + ini's "ef-passiontide-0-tuesday" section is not Passion week's own + Mass at all -- it is HOLY Tuesday's (Jer 11:18-20 / the Passion + according to Mark), confirmed independently against BOTH scans at + the time. Passion week's own real Tuesday Mass ("Feria tertia, III + classis, Statio ad S. Cyriacum", scan1.txt:11085-11121, corroborated + scan2.txt:12063-12104) is Dan 14:27, 28-42 / John 7:1-13 -- a + DIFFERENT Epistle and a DIFFERENT Gospel from what the ini section + carries. Excluded here (empty translation, not a rename) so the + wrong ini value is never used; the correct one is hand-authored + below, [passion_tuesday_entry]. lectio itself never surfaces this, + since its own computed reading is drawn from the SAME (Holy + Tuesday's) data on the day it labels "Passion Tuesday" too -- + data/ef/expected-divergences.sexp's own new entry records the + resulting divergence. *) + [] else ( match List.find_opt (fun wd -> String.equal name ("ef-passiontide-0-" ^ wd)) weekdays with | Some wd -> @@ -147,16 +169,14 @@ let colitur_keys name = CONFLATES the two weeks -- it has no Holy Week propers of its own -- not that the Missal does: Holy Monday's real Mass (docs/research/scan1.txt, "Feria II Hebdomadae sanctae, I - classis") is Isai. 50,5-10 / Io. 12,1-9, nothing like - Passion-week Monday's Ionae 3,1-10 / Io. 7,32-39 that the widen - was putting there, and Holy Thursday's is 1 Cor. 11,20-32 / Io. - 13,1-15 -- the Mass of the Lord's Supper reading Passion + classis") is Isa 50:5-10 / John 12:1-9, nothing like + Passion-week Monday's Jonas 3:1-10 / John 7:32-39 that the widen + was putting there, and Holy Thursday's is 1 Cor 11:20-32 / John + 13:1-15 -- the Mass of the Lord's Supper reading Passion Sunday's own ferial Mass was the actual defect, not merely a citation nicety. Narrowed to Passion week ONLY; Holy Week's own - citations (Monday, Tuesday, Thursday, Saturday) are - hand-authored below, [holy_week_entries] -- see its own comment - for which two days of Holy Week (Wednesday, Good Friday) are - deliberately NOT included and why. *) + citations (all six weekdays, fix round 2) are hand-authored + below, [holy_week_entries]. *) [ "ef-passiontide-1-" ^ wd ] | None -> [ name ]) @@ -196,6 +216,19 @@ let convert sec = generator's own single-ini design cannot reach on its own. *) let slug_or_die name = match Slug.of_string name with Ok s -> s | Error e -> die "%s" e +(* CITATION FORMAT, fix round 2 (coordinator review, Minor): every + hand-authored reference below uses ENGLISH book abbreviations with a + colon before the verse ("John 12:1-9"), matching the form already + DOMINANT in this file's own ini-derived data (counted directly: "John" + 40 occurrences vs "Io." 2; "Luke" 34 vs "Luc." 3; "Titus" 1 vs "Tit." 3 + -- the Latin forms were ALL this generator's own earlier, inconsistent + choice, not lectio's), the same "one form per book, matching what's + already dominant" discipline data/ef/commons.sexp's own header already + states for hand-authored citations. An earlier version of every entry + below used Latin book names and Missal-style comma verse separators + ("Isai. 50, 5-10"), inconsistent with the rest of the file and, in one + entry, inconsistent with ITSELF (Ier./Mark mixed in the same pair) -- + all converted here, content unchanged, only the spelling. *) let pair ~first ~gospel = [ { Citation.part = Citation.First; reference = first }; { Citation.part = Citation.Gospel; reference = gospel } ] @@ -213,60 +246,98 @@ let vigil_entries = between): - [ef-passiontide-2-monday] (Holy Monday, "Feria II Hebdomadae sanctae, - I classis"): Isai. 50,5-10 / Io. 12,1-9 -- scan1.txt "Lectio Isaiae + I classis"): Isa 50:5-10 / John 12:1-9 -- scan1.txt "Lectio Isaiae Prophetae... Isai. 50, 5-10" + "Sequentia... secundum Ioannem. Io. 12, 1-9"; scan2.txt corroborates both citations word for word. - [ef-passiontide-2-tuesday] (Holy Tuesday, "Feria III Hebdomadae - sanctae, I classis"): Ier. 11,18-20 / the Passion according to Mark, - 14,32-72;15,1-46 -- scan1.txt "Lectio Ieremiae Prophetae... Ier. 11, + sanctae, I classis"): Jer 11:18-20 / the Passion according to Mark, + 14:32-72; 15:1-46 -- scan1.txt "Lectio Ieremiae Prophetae... Ier. 11, 18-20" + "Evangelium Passionis et Mortis Domini secundum Marcum. 14,32-72; 15,1-46"; scan2.txt corroborates both. - [ef-passiontide-2-thursday] (Holy Thursday, "Feria V in Cena Domini"): - 1 Cor. 11,20-32 / Io. 13,1-15 -- scan1.txt "Lectio Epistolae beati + 1 Cor 11:20-32 / John 13:1-15 -- scan1.txt "Lectio Epistolae beati Pauli Apostoli ad Corinthios... 1 Cor. 11, 20-32" + "Sequentia... secundum Ioannem... Io. 13,1-15"; scan2.txt corroborates both. - [ef-passiontide-2-saturday] (Holy Saturday, Missa Vigiliae Paschalis' own Epistle+Gospel -- the actual Mass, distinct from the earlier - prophecies, explicitly labelled "Lectio EPISTOLAE"): Col. 3,1-4 / - Matt. 28,1-7 -- scan1.txt "Lectio Epistolae beati Pauli Apostoli ad + prophecies, explicitly labelled "Lectio EPISTOLAE"): Col 3:1-4 / + Matt 28:1-7 -- scan1.txt "Lectio Epistolae beati Pauli Apostoli ad Colossenses... Col. 3,1-4" + "Sequentia... secundum Matthaeum. Mt. 28,1-7"; scan2.txt corroborates both. - DELIBERATELY NOT INCLUDED, and recorded here rather than guessed: + Fix round 2 (coordinator review, Critical): the remaining two days, + Holy Wednesday and Good Friday, were left ENTIRELY absent by the first + pass, on the reasoning that neither has a single reading in the + "Epistle" position. That reasoning was correct for the FIRST slot but + the wrong conclusion for the pair as a whole, and it broke something + worse than what it replaced: an absent lectionary key does not mean + "no reading" to {!Rite_ef.Lectionary_ef.readings} -- it means STEP 3 + resumes the preceding Sunday, so Good Friday -- which has no Mass at + all -- was emitting Palm Sunday's own Epistle and Passion narrative. + Fixed properly: - - [ef-passiontide-2-wednesday] (Holy Wednesday, "Feria IV Hebdomadae - sanctae"): TWO Old Testament lessons (Isai. 62,11;63,1-7, then Isai. - 53,1-12), neither labelled "Epistola", before the Passion according - to Luke (22,39-71;23,1-53) -- no single reading occupies the - "Epistle" position this schema's [First]/[Gospel] pair assumes every - other entry in this file has, unlike Holy Saturday's genuinely - labelled Epistle above. - - [ef-passiontide-2-friday] (Good Friday, "Feria VI in Passione et - Morte Domini"): not even a Mass ("Solemnis Actio liturgica"), with - TWO peer lessons (Osee 6,1-6, then Exodus 12,1-11), again neither - labelled "Epistola", directly into the Passion according to John - (18,1-40;19,1-42). - - Forcing either into a single First/Gospel pair would be an editorial - choice this generator has no textual warrant to make on its own -- - unlike Holy Saturday, where the Mass's own Epistle is explicitly - labelled and distinct from its own preceding prophecies. Left absent: - data/ef/expected-divergences.sexp's own Layer C entry records what this - means for the differential (colitur emits [], an honest absence, not a - guess). *) + - The GOSPEL is unambiguous on both days -- one labelled Passion + narrative each, nothing to choose among -- so it is always authored: + Holy Wednesday, Luke 22:39-71; 23:1-53 (scan1.txt "Evangelium + Passionis et Mortis Domini secundum Lucam. 22, 39-71; 23, 1-53"); + Good Friday, John 18:1-40; 19:1-42 (scan1.txt "Evangelium Passionis + et Mortis Domini secundum Ioannem. 18,1-40; 19,1-42"). Both + corroborated scan2.txt. + - The FIRST slot is filled too, by the SAME "last lesson before the + Gospel" convention this file's own Lenten Ember Wednesday entry + (below, in [colitur_keys]'s own ini translation, not hand-authored + here) already applies to an identical two-lesson shape: Exodi + 24,12-18 then 3 Reg. 19,3-8 (scan1.txt:8311/8377), and the file ships + the SECOND. Applied here for the same reason -- consistency with + already-shipped precedent, not a fresh editorial choice invented for + this entry: Holy Wednesday's own two Isaiah lessons are Isai. 62, + 11;63,1-7 THEN Isai. 53,1-12 (scan1.txt:12379/12415, corroborated + scan2.txt) -- the file ships Isa 53:1-12, the second. Good Friday's + own two lessons are Osee 6,1-6 THEN Ex. 12,1-11 (scan1.txt: + 13143/13181, corroborated scan2.txt) -- the file ships Ex 12:1-11, + the second. Neither lesson is labelled "Epistola" on either day + (unlike Holy Saturday's genuinely labelled Epistle above), so this + remains a stated CONVENTION, not a textual fact the Missal asserts + -- but it is the SAME convention already load-bearing elsewhere in + this exact file, not a new one invented to paper over this gap. *) let holy_week_entries = - [ (slug_or_die "ef-passiontide-2-monday", pair ~first:"Isai. 50, 5-10" ~gospel:"Io. 12, 1-9"); + [ (slug_or_die "ef-passiontide-2-monday", pair ~first:"Isa 50:5-10" ~gospel:"John 12:1-9"); (slug_or_die "ef-passiontide-2-tuesday", - pair ~first:"Ier. 11, 18-20" ~gospel:"Mark 14, 32-72; 15, 1-46"); - (slug_or_die "ef-passiontide-2-thursday", pair ~first:"1 Cor. 11, 20-32" ~gospel:"Io. 13, 1-15"); - (slug_or_die "ef-passiontide-2-saturday", pair ~first:"Col. 3, 1-4" ~gospel:"Matt. 28, 1-7") + pair ~first:"Jer 11:18-20" ~gospel:"Mark 14:32-72; 15, 1-46"); + (* The Gospel's own punctuation ("15, 1-46", not "15:1-46") is + deliberately kept exactly as lectio's own ini already has it + (`ef-passiontide-0-tuesday`'s own `gospel` field, byte for byte) + rather than normalised to this file's own colon convention: this + value is not merely CORROBORATED by lectio's data, it is the + SAME data (Holy Tuesday's Mass, which the ini's Tuesday section + happens to carry outright) -- reformatting it would turn a + genuine byte-identical match into a false, punctuation-only + divergence the differential would then have to explain away. *) + (slug_or_die "ef-passiontide-2-wednesday", + pair ~first:"Isa 53:1-12" ~gospel:"Luke 22:39-71; 23:1-53"); + (slug_or_die "ef-passiontide-2-thursday", pair ~first:"1 Cor 11:20-32" ~gospel:"John 13:1-15"); + (slug_or_die "ef-passiontide-2-friday", pair ~first:"Ex 12:1-11" ~gospel:"John 18:1-40; 19:1-42"); + (slug_or_die "ef-passiontide-2-saturday", pair ~first:"Col 3:1-4" ~gospel:"Matt 28:1-7") ] +(* Important, fix round 2 (coordinator review): Passion week's own real + Tuesday Mass ("Feria tertia, III classis, Statio ad S. Cyriacum", + scan1.txt:11085-11121, corroborated scan2.txt:12063-12104, word for + word both scans): Dan 14:27, 28-42 / John 7:1-13. [colitur_keys]'s own + "ef-passiontide-0-tuesday" branch above excludes lectio's ini value for + this one weekday (it is Holy Tuesday's Mass, not Passion Tuesday's -- + see that branch's own comment for the full account) rather than + translating it, so this is the ONLY source of a citation for + "ef-passiontide-1-tuesday" at all -- not a widen, not a correction of + an existing translated value. *) +let passion_tuesday_entry = + [ (slug_or_die "ef-passiontide-1-tuesday", pair ~first:"Dan 14:27, 28-42" ~gospel:"John 7:1-13") ] + (* Important 3(a), fix round 1 (coordinator review): the fixed Nativity- Octave days (RG 91 entry 17, 29-31 December, colitur's own [ef-nativity-octave-day-{5,6,7}]) have a DIRECT formulary in the Missal, not merely a resolvable-by-walk-back gap -- "Diebus infra - octavam Nativitatis Domini, II classis": Tit. 3,4-7 / Luc. 2,15-20 + octavam Nativitatis Domini, II classis": Titus 3:4-7 / Luke 2:15-20 (docs/research/scan1.txt:6281-6329, scan2.txt:6900-6960, both word for word), and each specific date's own rubric points straight at it ("Die 29 decembris... Missa Puer natus est nobis, ut supra [28]", @@ -278,7 +349,7 @@ let holy_week_entries = REJECTED, and recorded so it is not re-attempted: the FIRST guess tried here gave these three slugs [ef-holy-name-sunday]'s own citation - instead (Gal. 4,1-7 / Luc. 2,33-40, "Dominica infra octavam Nativitatis + instead (Gal 4:1-7 / Luke 2:33-40, "Dominica infra octavam Nativitatis Domini" -- a DIFFERENT heading, for the Sunday specifically, not the weekdays). Measured against the real fixture and reverted: lectio's own citation for these dates is not uniform across years (2005-12-29 reads @@ -307,7 +378,7 @@ let holy_week_entries = the same RG 67/69 gap data/ef/expected-divergences-missalemeum.sexp's own M11 already tracks from a different differential layer. *) let nativity_octave_entries = - let cs = pair ~first:"Tit. 3, 4-7" ~gospel:"Luc. 2, 15-20" in + let cs = pair ~first:"Titus 3:4-7" ~gospel:"Luke 2:15-20" in List.map (fun n -> (slug_or_die (Printf.sprintf "ef-nativity-octave-day-%d" n), cs)) [ 5; 6; 7 ] (* One more colitur-only slug, DERIVED from [ef-holy-name-sunday]'s own @@ -358,13 +429,29 @@ let sha256 path = slug it ever actually produces. [assert_reachable] then requires every key this generator is about to EMIT to be a member of that set (an emitted key that is not a real Temporal_ef slug is dead data, - unreachable by any caller -- exactly the shape both Critical findings - had), dying loudly and naming every offender if not. Separately, - informational only, it prints every real Temporal_ef slug that has NO - entry in the final table -- not an error (most such gaps are the - correctly-unproper ferias step 3 already resolves, task-5-report.md's - own "297 of 304" measurement), but a standing audit log a human reader - can check against that same report rather than trusting silence. + unreachable by any caller), dying loudly and naming every offender if + not. + + CORRECTED, fix round 2 (coordinator review): the paragraph above used + to claim this check "is exactly the shape both Critical findings had". + Wrong for one of the two, and worth being precise about the limit: this + assertion catches an emitted KEY that names no real office (Critical 2, + the Lent Ember dead keys) -- it cannot catch, and did not catch, a real, + live key carrying the WRONG VALUE (Critical 1, fix round 1's own Holy + Week widening: "ef-passiontide-2-monday" etc were all perfectly + reachable slugs, just paired with Passion week's citations instead of + Holy Week's own). A reachability sweep is a name check, not a content + check; nothing in this generator verifies citation VALUES against the + Missal except the human cross-referencing docs/research/scan1.txt and + scan2.txt line by line, which is why every hand-authored entry in this + file states its own two-scan citation. + + Separately, informational only, [assert_reachable] also prints every + real Temporal_ef slug that has NO entry in the final table -- not an + error (most such gaps are the correctly-unproper ferias step 3 already + resolves, task-5-report.md's own "297 of 304" measurement), but a + standing audit log a human reader can check against that same report + rather than trusting silence. 1583 is deliberately NOT the sweep's start: the full 1583-9999 domain is the KERNEL's own contract, not this rite-specific bootstrap tool's -- @@ -427,8 +514,8 @@ let () = let secs = parse_ini src in let translated = List.concat_map convert secs in let entries = - translated @ vigil_entries @ holy_week_entries @ nativity_octave_entries - @ derived_entries translated + translated @ vigil_entries @ holy_week_entries @ passion_tuesday_entry + @ nativity_octave_entries @ derived_entries translated in assert_reachable entries; let lect = @@ -444,7 +531,9 @@ let () = ; generator against a newer lectio and commit the diff instead. Every\n\ ; emitted key is asserted, at generation time, to be a slug\n\ ; Rite_ef.Temporal_ef actually computes (see this generator's own\n\ - ; [assert_reachable]) -- a dead key cannot ship silently again.\n\ + ; [assert_reachable]) -- a dead key cannot ship silently again (a\n\ + ; wrongly-VALUED live key still can; [assert_reachable]'s own comment\n\ + ; says why this check cannot be widened to catch that).\n\ ;\n\ ; Source: %s\n\ ; SHA-256: %s\n\ @@ -452,14 +541,18 @@ let () = ; Temporal_ef vocabulary via [colitur_keys]; %d hand-authored from a\n\ ; second source file [vigil_entries]; %d hand-authored directly from\n\ ; the Missal [holy_week_entries]; %d hand-authored directly from the\n\ - ; Missal [nativity_octave_entries]; %d derived from an already-\n\ - ; translated entry above rather than re-typed [derived_entries] --\n\ - ; see this generator's own comments on all five). Regenerate with:\n\ + ; Missal, one entry [passion_tuesday_entry]; %d hand-authored directly\n\ + ; from the Missal [nativity_octave_entries]; %d derived from an\n\ + ; already-translated entry above rather than re-typed\n\ + ; [derived_entries] -- see this generator's own comments on all six).\n\ + ; Regenerate with:\n\ ; eval $(opam env) && dune exec tools/bootstrap_lectionary.exe -- %s %s\n" src (sha256 src) (List.length entries) (List.length secs) (List.length vigil_entries) - (List.length holy_week_entries) (List.length nativity_octave_entries) + (List.length holy_week_entries) (List.length passion_tuesday_entry) + (List.length nativity_octave_entries) (List.length entries - List.length translated - List.length vigil_entries - - List.length holy_week_entries - List.length nativity_octave_entries) + - List.length holy_week_entries - List.length passion_tuesday_entry + - List.length nativity_octave_entries) src dst; Sexplib.Sexp.output_hum oc (Lectionary.sexp_of_t lect); output_char oc '\n'; |
