Fix privileged-feria-major: nothing is ever commemorated, any rank
Deploy / deploy (push) Successful in 1m32s

The Easter octave cascade built last commit reused the existing
"duplex-majus+ still gets a bare commemoration" branch unchanged,
trusting its own citation (St. Mark within the Easter Octave). That
citation was a misreading. Live-verified: the Annunciation (Duplex I.
classis) transfers with zero commemoration on Holy Thursday itself, and
Chair of St. Peter at Antioch does the same on Ash Wednesday - the
exception was wrong everywhere this category is used, not just Holy
Week. privileged-feria-major now matches privileged-sunday exactly:
unconditional transfer, no exceptions, any rank.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017XMSokiTD2Qc5vPP2YQu3Q
This commit is contained in:
2026-09-01 14:08:15 -04:00
parent d6c8e8b7a8
commit fc4ac33903
6 changed files with 105 additions and 36 deletions
+23 -6
View File
@@ -18,12 +18,29 @@ describe('April sanctoral pull (first pass)', () => {
expect(getDayCollect(day).status.en).toBe('verified');
});
it('St. Mark is only ever commemorated, never wins, within the Easter Octave', () => {
const day = resolveDay('2030-04-25');
expect(day.winner.kind).toBe('temporal');
expect(day.commemorations).toEqual([
{ kind: 'sanctoral', id: 'st-mark', name: 'St. Mark, Evangelist', nameLa: 'Sanctus Marcus, Evangelista', rank: 'duplex-2-classis' },
]);
it('St. Mark gets nothing at all within the Easter Octave — not even a bare commemoration — and transfers past it instead', () => {
// Corrected 2026-09-01: nothing is ever commemorated anywhere from
// Palm Sunday through Low Sunday, no exception for any rank (direct
// instruction; live-verified against the Annunciation on Holy
// Thursday and Chair of St. Peter at Antioch on Ash Wednesday, both
// Duplex-majus+ and both transferring with zero commemoration). Mark
// (Duplex II. classis) transfers off Apr 25, 2030 the same way; vu's
// own dense calendar that week pushes his actual landing all the way
// to May 5 (every day in between already spoken for).
const native = resolveDay('2030-04-25');
expect(native.winner).toEqual({ kind: 'temporal', id: 'easter-sunday' });
expect(native.commemorations).toEqual([]);
expect(native.transferredAway?.candidate.id).toBe('st-mark');
const landing = resolveDay('2030-05-05');
expect(landing.winner).toEqual({
kind: 'sanctoral',
id: 'st-mark',
name: 'St. Mark, Evangelist',
nameLa: 'Sanctus Marcus, Evangelista',
rank: 'duplex-2-classis',
transferredFrom: '2030-04-25',
});
});
it('St. Robert beats St. Catherine of Siena on their shared monastic-calendar date', () => {
+13 -12
View File
@@ -89,22 +89,23 @@ describe('decideOccurrence — privileged-feria', () => {
});
describe('decideOccurrence — privileged-feria-major', () => {
it('is never displaced, same as privileged-sunday — duplex-majus and up are commemorated', () => {
// Verified: St. Mark, Duplex II. classis, only ever commemorated —
// never wins outright — within the Easter Octave.
for (const rank of ['duplex-majus', 'duplex-2-classis', 'duplex-1-classis'] as const) {
it('is never displaced, and never gives even a bare commemoration to any rank — everything transfers forward', () => {
// Corrected 2026-09-01, direct instruction: nothing is ever
// commemorated anywhere from Palm Sunday through Low Sunday — the
// earlier "duplex-majus+ still gets a nod" claim (citing St. Mark,
// Duplex II. classis, within the Easter Octave) was a misreading.
// Live-checked two more dates: the Annunciation (Duplex I. classis)
// transfers with zero commemoration on Holy Thursday itself in years
// it lands there, and Chair of St. Peter at Antioch (Duplex majus)
// does the same on Ash Wednesday — so the fix applies to every use
// of this category, not just Holy Week.
for (const rank of ['duplex-majus', 'duplex-2-classis', 'duplex-1-classis', 'duplex', 'semiduplex', 'simplex'] as const) {
const result = decideOccurrence('privileged-feria-major', 'id', saint(rank));
expect(result.winner).toEqual({ kind: 'temporal', id: 'id' });
expect(result.commemorations).toEqual([{ kind: 'sanctoral', id: 'x', name: 'St. Ereden', rank }]);
expect(result.commemorations).toEqual([]);
expect(result.transfer).toEqual({ candidate: saint(rank), direction: 'forward' });
}
});
it('yields nothing short of duplex-majus — transfers instead', () => {
const result = decideOccurrence('privileged-feria-major', 'id', saint('duplex'));
expect(result.winner).toEqual({ kind: 'temporal', id: 'id' });
expect(result.commemorations).toEqual([]);
expect(result.transfer).toEqual({ candidate: saint('duplex'), direction: 'forward' });
});
});
describe('decideOccurrence — ordinary-sunday', () => {
+14 -7
View File
@@ -171,15 +171,17 @@ describe('multi-hop forward transfer through Holy Week/the Easter Octave', () =>
expect(tiburtius?.kind === 'sanctoral' ? tiburtius.transferredFrom : undefined).toBe('2033-04-14');
});
it("2035: the Annunciation (native Easter Sunday itself, Duplex I. classis) transfers past the whole span with zero commemoration anywhere in it — matching the real reference engine's own behavior, not just a native-date-order queue effect", () => {
it("2035: the Annunciation (native Easter Sunday itself, Duplex I. classis) transfers past the whole span with zero commemoration anywhere in it, queued behind two earlier-native-dated candidates also caught by the same span", () => {
// Easter 2035 is Mar 25 -- the Annunciation's own fixed date. Live-
// verified 2026-09-01: the real Monastic 1617 engine shows her
// transferring off Easter Day with no commemoration anywhere in Holy
// Week/the Octave/Low Sunday (Apr 1 that year), unlike a same-ranked
// *native* occurrence there (e.g. St. Mark, Duplex II. classis,
// commemorated when native within some other year's Octave) --
// confirming a transferred-in candidate never gets the "duplex-majus+
// still gets a nod" treatment on these days, only a native one does.
// Week/the Octave/Low Sunday (Apr 1 that year) -- corrected the same
// day, direct instruction: nothing is ever commemorated anywhere in
// this span, at any rank, not even duplex-majus+ -- so a *native*
// occurrence there (e.g. St. Mark within some other year's Octave)
// gets exactly the same "transfers, no exception" treatment as a
// transferred-in candidate passing through, not the "still gets a
// nod" treatment this test used to assert existed.
const easterSunday = resolveDay('2035-03-25');
expect(easterSunday.winner).toEqual({ kind: 'temporal', id: 'easter-sunday' });
expect(easterSunday.transferredAway?.candidate.id).toBe('annunciation');
@@ -189,7 +191,12 @@ describe('multi-hop forward transfer through Holy Week/the Easter Octave', () =>
expect(day.commemorations.some((c) => c.kind === 'sanctoral' && c.id === 'annunciation')).toBe(false);
}
const landing = resolveDay('2035-04-04');
// vu's own calendar also has St. Benedict (native Mar 21, also
// Duplex I. classis, also impeded that year) and St. Gabriel the
// Archangel (native Mar 24, Duplex majus) queued *ahead* of the
// Annunciation by native date -- they land Apr 4 and Apr 5
// respectively, pushing her actual landing to Apr 6.
const landing = resolveDay('2035-04-06');
expect(landing.winner).toEqual({
kind: 'sanctoral',
id: 'annunciation',