Strengthen the Assumption's octave against a demoted St. John Eudes

Demote St. John Eudes (Aug 19) from Duplex to Semiduplex -- too minor
a confessor to keep outranking the Assumption's octave. To make that
demotion actually cede the day, raise the Assumption's octave to
`wins: duplex` (same pattern already used by Pentecost's octave), so an
ordinary-day tie no longer automatically favors the occurring saint.

Promote St. Thomas of Canterbury (Dec 29) to Duplex so he keeps
winning against the Christmas octave stack now that ordinary-day ties
are no longer a given.

Also add a closing-day tie-break to octave-vs-octave precedence
(pickWinningOctave): when two active octaves tie in rank, the one on
its own closing day now wins the label contest, ahead of the existing
"more recently started" tie-break. Needed because Assumption's day 3
and St. Lawrence's own closing day (Aug 17) now tie at Duplex, and the
closing day should still govern that date's label.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 07:39:58 -04:00
parent 9364185f70
commit 6f8f6618b9
8 changed files with 75 additions and 38 deletions
+16 -5
View File
@@ -115,11 +115,19 @@ export function strictestThreshold(octaves: ActiveOctave[]): FeastClass {
*
* - Highest effective rank (`wins`, already elevated on either octave's
* own closing day) wins outright.
* - Tied rank: the more recently *started* octave wins (smaller
* `dayNumber` today) — the reasoning given was that day 1 of a newly
* started octave needs to be fully present, which is the whole point
* of it starting; the older octave that's already been running is
* commemorated instead, same as any octave that loses this comparison.
* - Tied rank, one of them on its own closing day: the closing day wins
* — its "in Octava" day is the octave's own culminating day, so it
* takes precedence over an ordinary day of an equally-ranked octave
* even if that other octave started more recently (2026-08 user
* instruction, concrete case: Aug 17, St. Lawrence's own closing day,
* vs. the Assumption's ordinary day 3, both `duplex` once Assumption's
* octave was strengthened — Lawrence's closing day wins).
* - Tied rank, neither (or both) on their own closing day: the more
* recently *started* octave wins (smaller `dayNumber` today) — the
* reasoning given was that day 1 of a newly started octave needs to be
* fully present, which is the whole point of it starting; the older
* octave that's already been running is commemorated instead, same as
* any octave that loses this comparison.
*
* Undefined when no octave is active at all. Every other active octave
* still gets commemorated regardless of which one wins here — this
@@ -187,6 +195,9 @@ export function pickWinningOctave(active: ActiveOctave[]): ActiveOctave | undefi
if (rankCmp < 0) {
return best;
}
if (candidate.isClosingDay !== best.isClosingDay) {
return candidate.isClosingDay ? candidate : best;
}
return candidate.dayNumber < best.dayNumber ? candidate : best;
}, undefined);
}
+11
View File
@@ -10,5 +10,16 @@ rank: duplex-1-classis
common: common-of-the-bvm
propers: "assumption"
# Has a real octave (Aug 15-22) -- see calendar/types.ts's OctaveConfig.
# Strengthened to `wins: duplex` (2026-08 user decision), same pattern
# as pentecost-sunday.yml's own override -- a Semiduplex saint no
# longer just ties (and, by the ordinary-day tie rule, wins) an
# ordinary octave day here; it loses outright to the octave instead.
# Concrete motivation: st-john-eudes.yml's demotion to Semiduplex only
# actually cedes Aug 19 to the octave because of this. Side effect
# accepted by the user: st-damasus.yml (Dec 11, Immaculate Conception's
# octave) and st-nicholas-of-tolentino.yml (Sep 10, Nativity of the
# BVM's octave) are unrelated octaves not touched by this change, so
# they're unaffected -- this only strengthens Assumption's own octave.
octave:
enabled: true
wins: duplex
+8 -1
View File
@@ -4,9 +4,16 @@
# No [Ant 1] of his own -- benedictusCommon/minorHoursCommon fall back
# to the plain Common of a Confessor. No Lectio7-9 in his own file --
# defers to the Common's own Nocturn 3, not transcribed here.
#
# Deliberately demoted from the reference engine's own Duplex to
# Semiduplex (2026-08 user decision) -- a minor confessor of no
# particular standing shouldn't outrank the Assumption's own octave,
# now strengthened to `wins: duplex` (see assumption.yml) specifically
# so this demotion actually takes effect on his day (Aug 19, the
# octave's 5th day) instead of merely tying and still winning.
id: st-john-eudes
name: "St. John Eudes, Confessor"
rank: duplex
rank: semiduplex
common: common-of-a-confessor
propers: "st-john-eudes"
benedictusCommon: common-of-a-confessor
@@ -6,9 +6,15 @@
# `privileged-feria` model would have wrongly forbidden). Octave day
# commemorated in return. Own proper collect, no unique antiphon of his
# own.
#
# Deliberately promoted from the reference engine's own Semiduplex to
# Duplex (2026-08 user decision, made alongside assumption.yml's octave
# strengthening to `wins: duplex`) -- purely to keep him winning Dec 29
# outright once the common octave-vs-saint default is no longer
# uniformly Semiduplex everywhere; not a reference-engine finding.
id: st-thomas-becket
name: "St. Thomas of Canterbury, Bishop and Martyr"
rank: semiduplex
rank: duplex
common: common-of-a-martyr-bishop
propers: "st-thomas-becket"
# P/T/S/N: no [Ant Prima]/etc of its own in the source (12-29o.txt) --