aboutsummaryrefslogtreecommitdiff
path: root/lib/rites/rite_of
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-25 23:51:36 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-25 23:51:36 +0200
commit0994587b3694bb87d9a8ee32d60babf25c784acf (patch)
tree5585419d69e0b89fa839aba94ef50a3297251fbc /lib/rites/rite_of
parent98d698b261c75a287ba3992744032babfb6ad763 (diff)
downloadcolitur-0994587b3694bb87d9a8ee32d60babf25c784acf.tar.gz
colitur-0994587b3694bb87d9a8ee32d60babf25c784acf.zip
fix(of): correct subject over-match, provenance truth, and stale hazard comment
Four fixes from fix round 2 review: classify_subject's "maria"/"b.m.v" substring test over-matched 12 saints who merely carry "Maria" in their own name (Maximilian Mary Kolbe, John Mary Vianney, Mary Magdalene among them) as Bvm. Replaced with an explicit BVM_DATES table of the 13 genuinely Marian entries. Bvm 25 -> 13. The provenance header claimed lectio is "never a source", which omitted that slugs and English names both come from it. Corrected to state exactly what does (slugs, en names) and does not (every substantive field) come from lectio. A missing lectio file used to degrade silently to a different SHA-256 with no en names and no warning; it now fails loudly. lectio's own SHA-256 is now pinned alongside the Missal PDF's. Four more entries carried a second pdftotext artifact distinct from the letter-spacing already handled -- a combining diacritic rendered as a stray spacing character (Kim Taegŏn/Chŏng Ha-sang, Đũng Lạc, Makhlūf, Kęty). Hand-repaired the same way Peter Damian was, each corroborated by the identical corruption recurring in the Missal's own index. precedence_of.ml's PHASE 3 HAZARD comment about All Souls (2 November) was asserting a gap that no longer exists now that OF sanctoral data ships. Added test_all_souls_beats_an_ordinary_sunday, which resolves the shipped All Souls entry against a real per-annum Sunday (2025-11-02) through the actual Precedence.resolve pipeline, and updated the comment to record the resolution instead of demanding it.
Diffstat (limited to 'lib/rites/rite_of')
-rw-r--r--lib/rites/rite_of/precedence_of.ml57
1 files changed, 38 insertions, 19 deletions
diff --git a/lib/rites/rite_of/precedence_of.ml b/lib/rites/rite_of/precedence_of.ml
index ab5e394..0587f0a 100644
--- a/lib/rites/rite_of/precedence_of.ml
+++ b/lib/rites/rite_of/precedence_of.ml
@@ -140,25 +140,44 @@ let band (ctx : Vocab_of.season Precedence.context)
30 (* Tabula I.3 -- universal or temporal-origin, never proper; see the
[is_proper] comment above for why this is not [is_universal].
- ENTRY 3 HAS A SECOND CLAUSE THIS BRANCH DOES NOT IMPLEMENT (transcription
- line 840, identical in the 1969 Calendarium at OCR line 936):
- "Commemoratio omnium fidelium defunctorum" -- All Souls, 2 November.
- Nothing constructs it: there is no sanctoral data yet (Phase 3), and
- Vocab_of.rank has no constructor for it -- the 2002 Calendarium prints
- 2 November UNGRADED ("Omnium Fidelium defunctorum" / "Commemoratio
- omnium Fidelium defunctorum"), so the natural rank tag is ambiguous:
- Memoria_obligatoria (band 100, loses to a per annum Sunday, WRONG),
- Memoria_ad_libitum (band 120, worse), or Sollemnitas (band 30, the
- right precedence but a rank word the source never applies to this
- day). The 1969 Calendarium's own printing of this clause additionally
- carries a qualifier the 2002 text drops -- "quae tamen locum cedit
- dominicae occurrenti" -- an edition difference Phase 3 will also need.
- PHASE 3 HAZARD: transcribing 2 November with the natural ungraded
- rank will silently make it an ordinary weekday whenever it falls on a
- Sunday, with every test in this branch still green, because no test
- here knows entry 3 has a second clause. Phase 3 must settle how this
- day is tagged (or add a dedicated slug test here, mirroring
- [entry_2_named]) before shipping OF sanctoral data. *)
+ ENTRY 3'S SECOND CLAUSE -- RESOLVED, fix round 2, Task 1
+ (2026-08-25; transcription line 840, identical in the 1969
+ Calendarium at OCR line 936): "Commemoratio omnium fidelium
+ defunctorum" -- All Souls, 2 November. The 2002 Calendarium
+ prints 2 November UNGRADED ("Commemoratio omnium Fidelium
+ defunctorum"), so no grade word could be transcribed literally;
+ data/of/calendar-2002.sexp (tools/extract_of_calendar.py's own
+ ALL_SOULS_OVERRIDE) tags it [Sollemnitas] anyway, on this table's
+ own authority -- entry 3 itself names "Commemoratio omnium
+ fidelium defunctorum" in the SAME line as "Sollemnitates ...
+ Sanctorum in Calendario generali inscriptae", i.e. this table
+ places it at THIS precedence tier regardless of what word the
+ calendar page prints next to it. (For the record, the two
+ rejected alternatives were Memoria_obligatoria, band 100, loses
+ to a per annum Sunday, WRONG; and Memoria_ad_libitum, band 120,
+ worse.) Proved, not merely asserted:
+ test/test_precedence_of.ml's [test_all_souls_beats_an_ordinary_
+ sunday] loads the SHIPPED "all-souls" entry and resolves it
+ against a real per-annum Sunday (2 November 2025, itself a
+ Sunday) through {!Colitur_kernel.Precedence.resolve} and
+ [rules] below -- not [band] in isolation -- confirming All Souls
+ is [observed], not the Sunday.
+
+ STILL OPEN, deliberately out of this task's scope: the 1969
+ Calendarium's own printing of this clause carries a qualifier
+ the 2002 text drops -- "quae tamen locum cedit dominicae
+ occurrenti" -- an edition difference not reconciled here.
+
+ A LOSING All Souls -- unreachable on universal data (nothing
+ shipped outranks a Tabula I.3 Sollemnitas except the Triduum's
+ own Easter-bound window, which can never reach 2 November) but
+ real the moment an overlay puts something higher there --
+ would be TRANSFERRED, not omitted: [disposition] below sends
+ any losing Sollemnitas forward via Normae n. 60, and nothing
+ distinguishes "Commemoratio" from an ordinary Sollemnitas for
+ that purpose. The same shape as [Rite_ef.Precedence_ef]'s own
+ [entry_14_movable_band] (CLAUDE.md, "Carried into Plan 4") --
+ recorded here rather than built defensively against. *)
else if c.cel.rank = Vocab_of.Sollemnitas && is_proper layer then
40 (* Tabula I.4 *)
else if c.cel.rank = Vocab_of.Festum && c.cel.subject = Subject.Lord