stop lending Ruthenian law to churches it was never written for

Three Eastern Catholic jurisdictions borrowed the Ruthenian ruleset, so a
Melkite, a Romanian Greek Catholic and a Ukrainian Greek Catholic were each
told that fourteen days a year bound them under the particular law of the
Metropolia of Pittsburgh. That is the exact error the level/obligation split
exists to prevent, committed by the library itself.

Every Eastern Catholic church legislates its own fasting discipline. Those
three are now shown at the Typikon with nothing reported as binding, which is
the honest position: the calendar is known, the law is not. Their entries say
so and a test holds it, asserting both that no jurisdiction but ruthenian
carries that ruleset and that the three claim no binding days.

The README gains a section on these churches, since supporting them was never
meant to be something a reader had to infer from the jurisdiction list.
This commit is contained in:
funkpower
2026-09-18 13:03:13 -04:00
parent 18df039bbc
commit 92524e46dc
4 changed files with 76 additions and 9 deletions
+26 -1
View File
@@ -1,7 +1,8 @@
# typikon
The Orthodox liturgical day: feasts, seasons and the fast, computed rather
than fetched.
than fetched. The Byzantine Catholic churches are here too, on their own
calendars and, where the law has been sourced, under their own particular law.
Everything derives from the paschalion and the fixed calendar, so it needs no
network, cannot go stale, and answers for any year you ask about. No API key,
@@ -149,6 +150,30 @@ Bulgaria, Cyprus, Albania, Ukraine), the Finnish Orthodox Church, alone among
the Orthodox in keeping the Gregorian Paschalion, and, as an add-on, four
Byzantine Catholic churches.
## The Byzantine Catholic churches
Four are modelled, and they are not a footnote on the Orthodox ones: they keep
different paschalions, and their fasting is a different kind of thing.
| | calendar | fasting |
|---|---|---|
| `ruthenian` | Gregorian throughout | Ruthenian particular law, sourced |
| `ugcc` | Revised Julian feasts, Julian Pascha since 2023 | its own; not modelled |
| `melkite` | Gregorian; Middle Eastern parishes often keep Julian Pascha | its own; not modelled |
| `romanian-catholic` | Gregorian throughout | its own; not modelled |
**A church's law is never borrowed from another.** Ruthenian particular law is
sourced from the Metropolia of Pittsburgh and is reported for that church only.
The rest are shown at the Typikon's discipline with **nothing reported as
binding**, because their own law has not been sourced and inventing one would
tell a Melkite that fourteen days a year oblige him under a law that was never
his. When a church's law is added, its entry will say so and its obligations
will appear. A test holds that line.
See [the law and the fast](#the-law-and-the-fast-are-not-the-same-question)
for what `--typikon` does with this, which is the flag most Byzantine Catholics
will want.
## The fast
Six levels, ordered from strictest to laxest. They are the Typikon's own
+6 -5
View File
@@ -201,11 +201,12 @@ pub const JURISDICTIONS: &[Jurisdiction] = &[
// eastern catholic
Jurisdiction { key: "ruthenian", name: "Byzantine Catholic Metropolia of Pittsburgh", paschalion: GregP, menologion: RevJul, rule: Ruth, discipline: None, tradition: Sl, menaia: RUTHENIAN_MENAIA,
note: "Gregorian throughout. Fasting is reported under Ruthenian particular law, which binds far less than the Typikon prescribes." },
Jurisdiction { key: "ugcc", name: "Ukrainian Greek Catholic Church", paschalion: JulP, menologion: RevJul, rule: Ruth, discipline: None, tradition: Sl, menaia: RUTHENIAN_MENAIA,
note: "Moved the fixed feasts to the Revised Julian calendar on 1 September 2023, keeping the Julian Paschalion. Eparchies outside Ukraine vary; several keep the Gregorian Paschalion." },
Jurisdiction { key: "melkite", name: "Melkite Greek Catholic Church", paschalion: GregP, menologion: RevJul, rule: Ruth, discipline: None, tradition: Gk, menaia: NO_MENAIA,
note: "Practice is not uniform: parishes in the Middle East commonly keep the Julian Paschalion for the sake of the local Orthodox." },
Jurisdiction { key: "romanian-catholic", name: "Romanian Greek Catholic Church", paschalion: GregP, menologion: RevJul, rule: Ruth, discipline: None, tradition: Gk, menaia: NO_MENAIA, note: "" },
Jurisdiction { key: "ugcc", name: "Ukrainian Greek Catholic Church", paschalion: JulP, menologion: RevJul, rule: Orth, discipline: None, tradition: Sl, menaia: RUTHENIAN_MENAIA,
note: "Moved the fixed feasts to the Revised Julian calendar on 1 September 2023, keeping the Julian Paschalion. Eparchies outside Ukraine vary; several keep the Gregorian Paschalion. Its particular law on fasting is its own and is not modelled here, so the days are shown at the Typikon and nothing is reported as binding." },
Jurisdiction { key: "melkite", name: "Melkite Greek Catholic Church", paschalion: GregP, menologion: RevJul, rule: Orth, discipline: None, tradition: Gk, menaia: NO_MENAIA,
note: "Practice is not uniform: parishes in the Middle East commonly keep the Julian Paschalion for the sake of the local Orthodox. Its particular law on fasting is its own and is not modelled here, so the days are shown at the Typikon and nothing is reported as binding." },
Jurisdiction { key: "romanian-catholic", name: "Romanian Greek Catholic Church", paschalion: GregP, menologion: RevJul, rule: Orth, discipline: None, tradition: Gk, menaia: NO_MENAIA,
note: "Its particular law on fasting is its own and is not modelled here, so the days are shown at the Typikon and nothing is reported as binding." },
];
/// A jurisdiction key, a calendar name, or `None` for the default.
+9 -3
View File
@@ -27,9 +27,15 @@
//! only Great and Holy Wednesday turns on the reading. If your eparchy reads it
//! the other way, that Wednesday binds too.
//!
//! Source: the Byzantine Catholic Metropolitan Church of Pittsburgh. Other
//! Eastern Catholic churches legislate their own; where this library maps them
//! onto this ruleset it is an approximation, and the jurisdiction entry says so.
//! Source: the Byzantine Catholic Metropolitan Church of Pittsburgh, and that
//! church only.
//!
//! Every Eastern Catholic church legislates its own fasting discipline, and
//! this ruleset is **not** lent to the others. Borrowing it told a Melkite
//! that fourteen days a year bound him under a law that was never his, which
//! is precisely the error the level/obligation split exists to prevent. A
//! church whose particular law has not been sourced is shown at the Typikon
//! with no obligation claimed, and its entry says so.
use super::{Context, Rule, Vocabulary};
use crate::calendars::{Date, Weekday};
+35
View File
@@ -625,3 +625,38 @@ fn the_config_round_trips_all_three_axes() {
}
let _ = std::fs::remove_dir_all(&dir);
}
// ─────────────── no church is told another church's law binds ─────────────
#[test]
fn only_the_church_whose_law_was_sourced_reports_an_obligation() {
use typikon::jurisdictions::{RuleKind, JURISDICTIONS};
// Ruthenian particular law is sourced from the Metropolia of Pittsburgh.
// No other jurisdiction may borrow it: telling a Melkite that fourteen
// days a year bind him under a law that was never his is the error the
// level/obligation split exists to prevent.
for jur in JURISDICTIONS.iter() {
if jur.rule == RuleKind::Ruthenian {
assert_eq!(jur.key, "ruthenian", "{} borrows another church's law", jur.key);
}
}
for key in ["melkite", "romanian-catholic", "ugcc"] {
let jur = resolve(Some(key)).unwrap();
let binding = week(d("2026-01-01"), 365, jur)
.into_iter()
.filter(|x| x.is_obligatory())
.count();
assert_eq!(binding, 0, "{key} claims {binding} binding days it has no source for");
// And the entry has to say why nothing binds.
assert!(jur.note.contains("not modelled"), "{key}: the note must say so");
}
// The one church whose law is sourced still reports it.
let ruthenian = resolve(Some("ruthenian")).unwrap();
let binding = week(d("2026-01-01"), 365, ruthenian)
.into_iter()
.filter(|x| x.is_obligatory())
.count();
assert_eq!(binding, 14);
}