From a492be961b7a6368d7391d3de11fd72be6d7d8fd Mon Sep 17 00:00:00 2001 From: Will Estes Date: Mon, 10 Aug 2026 21:11:56 -0400 Subject: [PATCH] propers: add August's collect and antiphon text 11 collects, 4 antiphons -- including backfilling the three pre-existing August entries (Lawrence, Assumption, Augustine) now that the pulling methodology exists. Also updates three pre-existing tests whose dates collided with this month's new real content: the vigil-of-St.-Lawrence backward-transfer case now runs into a real feast at its landing day instead of an empty one (confirmed correct against the live reference engine, including the surviving commemoration on the impeded Sunday itself), and two other tests moved off Aug 9/10 to dates unaffected by the new data. Co-Authored-By: Claude Sonnet 5 --- .../propers/common/assumption-collect.yml | 17 +++ ...ecollation-of-st-john-baptist-antiphon.yml | 9 ++ ...decollation-of-st-john-baptist-collect.yml | 17 +++ .../common/finding-of-st-stephen-antiphon.yml | 11 ++ .../common/finding-of-st-stephen-collect.yml | 19 ++++ ...-cyriacus-largus-and-smaragdus-collect.yml | 17 +++ .../propers/common/st-augustine-collect.yml | 17 +++ .../propers/common/st-bartholomew-collect.yml | 17 +++ .../propers/common/st-bernard-collect.yml | 17 +++ .../propers/common/st-dominic-collect.yml | 17 +++ .../propers/common/st-lawrence-antiphon.yml | 9 ++ .../propers/common/st-lawrence-collect.yml | 17 +++ src/data/propers/common/st-louis-collect.yml | 17 +++ .../common/st-peter-ad-vincula-antiphon.yml | 12 +++ .../common/st-peter-ad-vincula-collect.yml | 17 +++ .../propers/common/st-zephyrinus-collect.yml | 21 ++++ tests/calendar/august-sanctoral.test.ts | 101 ++++++++++++++++++ tests/calendar/transfer.test.ts | 32 ++++-- tests/calendar/weekday.test.ts | 12 ++- tests/hours/resolve-common.test.ts | 2 +- 20 files changed, 387 insertions(+), 11 deletions(-) create mode 100644 src/data/propers/common/assumption-collect.yml create mode 100644 src/data/propers/common/decollation-of-st-john-baptist-antiphon.yml create mode 100644 src/data/propers/common/decollation-of-st-john-baptist-collect.yml create mode 100644 src/data/propers/common/finding-of-st-stephen-antiphon.yml create mode 100644 src/data/propers/common/finding-of-st-stephen-collect.yml create mode 100644 src/data/propers/common/ss-cyriacus-largus-and-smaragdus-collect.yml create mode 100644 src/data/propers/common/st-augustine-collect.yml create mode 100644 src/data/propers/common/st-bartholomew-collect.yml create mode 100644 src/data/propers/common/st-bernard-collect.yml create mode 100644 src/data/propers/common/st-dominic-collect.yml create mode 100644 src/data/propers/common/st-lawrence-antiphon.yml create mode 100644 src/data/propers/common/st-lawrence-collect.yml create mode 100644 src/data/propers/common/st-louis-collect.yml create mode 100644 src/data/propers/common/st-peter-ad-vincula-antiphon.yml create mode 100644 src/data/propers/common/st-peter-ad-vincula-collect.yml create mode 100644 src/data/propers/common/st-zephyrinus-collect.yml create mode 100644 tests/calendar/august-sanctoral.test.ts diff --git a/src/data/propers/common/assumption-collect.yml b/src/data/propers/common/assumption-collect.yml new file mode 100644 index 0000000..7c4d2e1 --- /dev/null +++ b/src/data/propers/common/assumption-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-08-15). +id: assumption-collect +text: + la: | + Orémus. + Famulórum tuórum, quǽsumus, Dómine, delíctis ignósce: ut qui tibi placére de áctibus nostris non valémus: Genitrícis Fílii tui Dómini nostri intercessióne salvémur: + Qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O Lord, we beseech thee, forgive the transgressions of thy servants, and, forasmuch as by our own deeds we cannot please thee, may we find safety through the prayers of the Mother of thy Son and our Lord. + Who with thee liveth and reigneth, in the unity of the Holy Spirit, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/decollation-of-st-john-baptist-antiphon.yml b/src/data/propers/common/decollation-of-st-john-baptist-antiphon.yml new file mode 100644 index 0000000..6b23816 --- /dev/null +++ b/src/data/propers/common/decollation-of-st-john-baptist-antiphon.yml @@ -0,0 +1,9 @@ +# Verified against Divinum Officium (Latin/English Sancti/08-29.txt's own +# [Ant 1] — the Lauds-hour antiphon, not Terce's. +id: decollation-of-st-john-baptist-antiphon +text: + la: "Misso Heródes * spiculatóre, præcépit amputári caput Joánnis in cárcere. Quo audíto, discípuli ejus venérunt, et tulérunt corpus ejus, et posuérunt illud in monuménto." + en: "Herod sent * an executioner, and commanded that John's head should be cut off in the prison. When they heard thereof, his disciples came and took up his body and laid it in a tomb." +status: + la: verified + en: verified diff --git a/src/data/propers/common/decollation-of-st-john-baptist-collect.yml b/src/data/propers/common/decollation-of-st-john-baptist-collect.yml new file mode 100644 index 0000000..a5dda78 --- /dev/null +++ b/src/data/propers/common/decollation-of-st-john-baptist-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-08-29). +id: decollation-of-st-john-baptist-collect +text: + la: | + Orémus. + Sancti Joánnis Baptístæ Præcursóris et Mártyris tui, quǽsumus, Dómine, veneránda festívitas: salutáris auxílii nobis præstet efféctum: + Qui vivis et regnas cum Deo Patre, in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + Lord, we beseech thee, that the keeping of this honourable feastday in memory of the holy Baptist John, thy Fore-runner, and thy Martyr, may be a mean to draw upon us the effectual outpouring of thy saving help. + Who livest and reignest with God the Father in the unity of the Holy Spirit, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/finding-of-st-stephen-antiphon.yml b/src/data/propers/common/finding-of-st-stephen-antiphon.yml new file mode 100644 index 0000000..ff3bbc5 --- /dev/null +++ b/src/data/propers/common/finding-of-st-stephen-antiphon.yml @@ -0,0 +1,11 @@ +# Verified against Divinum Officium (Latin/English Sancti/08-03.txt's own +# [Ant 1] — a deliberate, unmodified cross-reference to St. Stephen's own +# Dec 26 antiphon. Duplicated content, not a shared reference, matching +# this project's one-file-per-id convention. +id: finding-of-st-stephen-antiphon +text: + la: "Stéphanus autem * plenus grátia et fortitúdine, faciébat signa magna in pópulo." + en: "And Stephen, full of grace * and fortitude, did great signs among the people." +status: + la: verified + en: verified diff --git a/src/data/propers/common/finding-of-st-stephen-collect.yml b/src/data/propers/common/finding-of-st-stephen-collect.yml new file mode 100644 index 0000000..bcdbab7 --- /dev/null +++ b/src/data/propers/common/finding-of-st-stephen-collect.yml @@ -0,0 +1,19 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2026-08-03), +# which auto-expands the raw file's cross-reference to St. Stephen's Dec +# 26 collect with "natalícia" substituted for "Inventiónem". +id: finding-of-st-stephen-collect +text: + la: | + Orémus. + Da nobis, quǽsumus, Dómine, imitári quod cólimus: ut discámus et inimícos dilígere; quia ejus Inventiónem celebrámus, qui novit étiam pro persecutóribus exoráre Dóminum nostrum Jesum Christum Fílium tuum: + Qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + Grant us, we beseech thee, O Lord, so to imitate what we revere, that we may learn to love even our enemies; for we celebrate the Finding of the holy body of him who knew how to pray for his very persecutors to our Lord Jesus Christ: + Who with thee liveth and reigneth, in the unity of the Holy Spirit, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/ss-cyriacus-largus-and-smaragdus-collect.yml b/src/data/propers/common/ss-cyriacus-largus-and-smaragdus-collect.yml new file mode 100644 index 0000000..f84a29c --- /dev/null +++ b/src/data/propers/common/ss-cyriacus-largus-and-smaragdus-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-08-08). +id: ss-cyriacus-largus-and-smaragdus-collect +text: + la: | + Orémus. + Deus, qui nos ánnua sanctórum Mártyrum tuórum Cyríaci, Largi et Smarágdi sollemnitáte lætíficas: concéde propítius; ut, quorum gaudémus méritis, accendámur exémplis. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O God, Who gladden us by the annual festival of Your Martyrs Cyriacus, Largus, and Smaragdus, grant that we may be inspired by the example of those in whose merits we rejoice. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-augustine-collect.yml b/src/data/propers/common/st-augustine-collect.yml new file mode 100644 index 0000000..640aba6 --- /dev/null +++ b/src/data/propers/common/st-augustine-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-08-28). +id: st-augustine-collect +text: + la: | + Orémus. + Adésto supplicatiónibus nostris, omnípotens Deus: et, quibus fidúciam sperándæ pietátis indúlges, intercedénte beáto Augustíno Confessóre tuo atque Pontífice, consuétæ misericórdiæ tríbue benígnus efféctum. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + Graciously hear our supplications, O Almighty God, and as Thou hast given unto us the hope that we are of the number of them upon whom Thou wilt show mercy, grant unto us in thy goodness, that, helped by the prayers of thy blessed Confessor and Bishop Augustine, we may experience the fulfillment of thine accustomed loving-kindness. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-bartholomew-collect.yml b/src/data/propers/common/st-bartholomew-collect.yml new file mode 100644 index 0000000..bbfc2b0 --- /dev/null +++ b/src/data/propers/common/st-bartholomew-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2026-08-24). +id: st-bartholomew-collect +text: + la: | + Orémus. + Omnípotens sempitérne Deus, qui hujus diéi venerándam sanctámque lætítiam in beáti Apóstoli tui Bartholomǽi festivitáte tribuísti: da Ecclésiæ tuæ, quǽsumus; et amáre quod crédidit, et prædicáre quod dócuit. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O Almighty and everlasting God, Who hast given unto us this day to be a day worshipful, and holy, and joyful, because of the Feast of thy blessed Apostle Bartholomew, grant, we beseech thee, unto thy Church both to love that which he believed, and to preach that which he taught. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-bernard-collect.yml b/src/data/propers/common/st-bernard-collect.yml new file mode 100644 index 0000000..091e18f --- /dev/null +++ b/src/data/propers/common/st-bernard-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-08-20). +id: st-bernard-collect +text: + la: | + Orémus. + Intercéssio nos, quǽsumus, Dómine, beáti Bernárdi Abbátis comméndet: ut, quod nostris méritis non valémus, ejus patrocínio assequámur. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + May the pleading of blessed Bernard, the Abbot, make us acceptable unto thee, O Lord, we pray; that what we may not have through any merits of ours, we may gain by means of his patronage. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-dominic-collect.yml b/src/data/propers/common/st-dominic-collect.yml new file mode 100644 index 0000000..66e0e6e --- /dev/null +++ b/src/data/propers/common/st-dominic-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-08-04). +id: st-dominic-collect +text: + la: | + Orémus. + Deus, qui Ecclésiam tuam beáti Domínici Confessóris tui illumináre dignátus es méritis et doctrínis: concéde; ut ejus intercessióne temporálibus non destituátur auxíliis, et spirituálibus semper profíciat increméntis. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O God, Who hast been pleased to shed throughout thy Church the light of the worthy deeds and healthful teaching of thy blessed Confessor Dominic, grant unto the same, with the help of his prayers, that she may never be either helpless in things temporal, or barren in things spiritual. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-lawrence-antiphon.yml b/src/data/propers/common/st-lawrence-antiphon.yml new file mode 100644 index 0000000..86dd5df --- /dev/null +++ b/src/data/propers/common/st-lawrence-antiphon.yml @@ -0,0 +1,9 @@ +# Verified against Divinum Officium (Latin/English Sancti/08-10.txt's own +# [Ant 1] — the Lauds-hour antiphon, not Terce's. +id: st-lawrence-antiphon +text: + la: "Levíta Lauréntius * bonum opus operátus est, qui per signum crucis cæcos illuminávit, et thesáuros Ecclésiæ dedit paupéribus." + en: "Lawrence the Deacon * performed a pious act by giving sight to the blind through the Sign of the Cross, and by bestowing on the poor the riches of the Church." +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-lawrence-collect.yml b/src/data/propers/common/st-lawrence-collect.yml new file mode 100644 index 0000000..d9bef22 --- /dev/null +++ b/src/data/propers/common/st-lawrence-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2026-08-10). +id: st-lawrence-collect +text: + la: | + Orémus. + Da nobis, quǽsumus, omnípotens Deus: vitiórum nostrórum flammas exstínguere; qui beáto Lauréntio tribuísti tormentórum suórum incéndia superáre. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O Almighty God, Who didst give unto Blessed Lawrence power to be more than conqueror in his fiery torment, grant unto us, we beseech thee, the power to quench the flames of our sinful lusts. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-louis-collect.yml b/src/data/propers/common/st-louis-collect.yml new file mode 100644 index 0000000..036a028 --- /dev/null +++ b/src/data/propers/common/st-louis-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-08-25). +id: st-louis-collect +text: + la: | + Orémus. + Deus, qui beátum Ludovícum Confessórem tuum de terréno regno ad cæléstis regni glóriam transtulísti: ejus, quǽsumus, méritis et intercessióne; Regis regum Jesu Christi, Fílii tui, fácias nos esse consórtes: + Qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O God, Who didst give unto thy blessed Confessor Louis a glorious change from an earthly kingdom unto an heavenly, grant unto us, we beseech thee, for his sake and by his prayers, one day to enter like him into the Presence of the King of kings, even thy Son Jesus Christ. + Who with thee liveth and reigneth, in the unity of the Holy Spirit, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-peter-ad-vincula-antiphon.yml b/src/data/propers/common/st-peter-ad-vincula-antiphon.yml new file mode 100644 index 0000000..59428d9 --- /dev/null +++ b/src/data/propers/common/st-peter-ad-vincula-antiphon.yml @@ -0,0 +1,12 @@ +# Verified against Divinum Officium (Latin/English Sancti/08-01.txt's own +# [Ant 1] — a deliberate cross-reference to the Chair-of-Peter-at-Antioch +# antiphon (Feb 22, see chair-of-st-peter-at-antioch-antiphon.yml), same +# reuse pattern as Ss. Peter and Paul in June. Duplicated content, not a +# shared reference, matching this project's one-file-per-id convention. +id: st-peter-ad-vincula-antiphon +text: + la: "Tu es pastor óvium, * Princeps Apostolórum, tibi tráditæ sunt claves regni cælórum." + en: "Thou art the Shepherd * of the sheep, and the Prince of the Apostles, and unto thee are given the keys of the kingdom of heaven." +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-peter-ad-vincula-collect.yml b/src/data/propers/common/st-peter-ad-vincula-collect.yml new file mode 100644 index 0000000..f727e7f --- /dev/null +++ b/src/data/propers/common/st-peter-ad-vincula-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2026-08-01). +id: st-peter-ad-vincula-collect +text: + la: | + Orémus. + Deus, qui beátum Petrum Apóstolum, a vínculis absolútum, illǽsum abíre fecísti: nostrórum, quæsumus, absólve víncula peccatórum; et ómnia mala a nobis propitiátus exclúde. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O God, who didst loose the blessed Apostle, Peter, from his chains and didst make him go forth unharmed, loose, we pray, the chains of our sins, and in thy mercy ward off from us every evil. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-zephyrinus-collect.yml b/src/data/propers/common/st-zephyrinus-collect.yml new file mode 100644 index 0000000..5f26d9f --- /dev/null +++ b/src/data/propers/common/st-zephyrinus-collect.yml @@ -0,0 +1,21 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-08-26). +# The English "so his example may be of betterment" is corrected from a +# dropped mid-word "e" ("exampl / may be of betterment") present in both +# the raw source file and the live query output -- a transcription +# artifact, not a stylistic choice. +id: st-zephyrinus-collect +text: + la: | + Orémus. + Præsta, quǽsumus, omnípotens Deus: ut beáti Zephyríni, Mártyris tui atque Pontíficis, cujus gaudémus méritis, instruámur exémplis. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + Grant, we beseech thee, O Almighty God, that as the worthy acts of thy blessed Bishop and martyr Zephyrinus are made unto us a cause of joy, so his example may be of betterment. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/tests/calendar/august-sanctoral.test.ts b/tests/calendar/august-sanctoral.test.ts new file mode 100644 index 0000000..a1e0a71 --- /dev/null +++ b/tests/calendar/august-sanctoral.test.ts @@ -0,0 +1,101 @@ +import { describe, expect, it } from 'vitest'; +import { resolveDay } from '../../src/calendar'; +import { getDayCollect } from '../../src/hours/resolve-common'; + +// Clean per-annum years for these dates (no Sunday collision) — see +// data/calendar/saints/*.yml for per-saint source detail. +describe('August sanctoral pull (first pass)', () => { + it('St. Peter\'s Chains wins outright at Duplex majus with a real proper collect and antiphon, over a genuinely unwinnable stub', () => { + const day = resolveDay('2026-08-01'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'st-peter-ad-vincula', + name: "St. Peter's Chains", + rank: 'duplex-majus', + }); + expect(day.commemorations).toEqual([ + { kind: 'sanctoral', id: 'ss-machabees', name: 'Ss. Machabees, Martyrs', rank: 'simplex' }, + ]); + expect(getDayCollect(day).status.en).toBe('verified'); + }); + + it('a saint normally blocked by the generic Saturday-of-Mary votive wins independently once the date falls on another weekday', () => { + const day = resolveDay('2027-08-02'); // a Monday + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'st-stephen-i', + name: 'St. Stephen I, Pope and Martyr', + rank: 'simplex', + }); + expect(day.commemorations).toEqual([]); + }); + + it('St. Donatus wins outright every year in this app, unlike the real reference engine where he is occasionally displaced by a multi-day forward transfer this app does not model', () => { + // In the real Monastic 1617 engine, when Aug 3 (the Finding of St. + // Stephen) falls on a Sunday, it transfers forward past several + // higher-rank fixed feasts (Dominic, Our Lady of the Snows, the + // Transfiguration) and lands on Aug 7, displacing Donatus for that + // year (confirmed live for 2025 and 2031, both Aug-3-Sunday years). + // This app's transfer machinery doesn't chase a multi-day skip search + // like that -- see st-donatus.yml -- so Donatus wins here in every + // year, including ones where the real engine would displace him; a + // known, documented simplification rather than a guess. + const ordinary = resolveDay('2026-08-07'); + const wouldHaveTransferredInReality = resolveDay('2031-08-07'); + for (const day of [ordinary, wouldHaveTransferredInReality]) { + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'st-donatus', + name: 'St. Donatus, Bishop and Martyr', + rank: 'simplex', + }); + } + }); + + it("the Vigil of St. Lawrence's own vigil rank forces primacy over a real, otherwise-unranked secondary saint", () => { + const day = resolveDay('2025-08-09'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'vigil-of-st-lawrence', + name: 'Vigil of St. Lawrence', + rank: 'vigil', + }); + expect(day.commemorations).toEqual([ + { kind: 'sanctoral', id: 'st-romanus', name: 'St. Romanus, Martyr', rank: 'simplex' }, + ]); + }); + + it('St. Lawrence wins outright at Duplex II. classis, distinct from his own Vigil the day before', () => { + const day = resolveDay('2026-08-10'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'st-lawrence', + name: 'St. Lawrence, Martyr', + rank: 'duplex-2-classis', + }); + expect(getDayCollect(day).status.en).toBe('verified'); + }); + + it('dates within St. Lawrence and the Assumption\'s own octaves are excluded entirely, even where the source names a real secondary saint (St. Clare, Aug 12), pending octave support', () => { + const clareDay = resolveDay('2025-08-12'); + expect(clareDay.winner.kind).toBe('temporal'); + expect(clareDay.commemorations).toEqual([]); + const assumptionOctaveDay = resolveDay('2025-08-22'); + expect(assumptionOctaveDay.winner.kind).toBe('temporal'); + expect(assumptionOctaveDay.commemorations).toEqual([]); + }); + + it('the Beheading of St. John the Baptist wins outright at Duplex with a real proper collect and antiphon, over a genuinely unwinnable stub', () => { + const day = resolveDay('2025-08-29'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'decollation-of-st-john-baptist', + name: 'The Beheading of St. John the Baptist', + rank: 'duplex', + }); + expect(day.commemorations).toEqual([ + { kind: 'sanctoral', id: 'st-sabina', name: 'St. Sabina, Martyr', rank: 'simplex' }, + ]); + expect(getDayCollect(day).status.en).toBe('verified'); + }); +}); diff --git a/tests/calendar/transfer.test.ts b/tests/calendar/transfer.test.ts index e63b9f6..5c901e7 100644 --- a/tests/calendar/transfer.test.ts +++ b/tests/calendar/transfer.test.ts @@ -6,22 +6,40 @@ describe('transfer mechanism (resolveDay integration)', () => { // added to exercise this — Aug 9, 2026 is a Sunday, so the vigil (rank // 'vigil') can't win or be commemorated there (see // commemorations.ts's ordinary-sunday rule) and must transfer backward. - it('a vigil impeded by an ordinary Sunday transfers backward to Saturday, leaving the Sunday untouched', () => { + // Since the August pull, Aug 8 is no longer an empty landing day — Ss. + // Cyriacus, Largus, and Smaragdus (Semiduplex, a fixed, non-movable + // date) natively occupy it every year, so the backward-transferred + // vigil runs into collision.ts's sanctoral-vs-sanctoral rules instead of + // landing untouched: Semiduplex outranks 'vigil' on the shared + // FeastClass scale, so Cyriacus wins and the vigil is commemorated + // rather than displacing him — real transfer+collision interaction, not + // a data error, same class of finding as July's Apollinaris/Vigil-of- + // St.-James case. + it('a vigil impeded by an ordinary Sunday transfers backward to Saturday and collides with the real feast already there', () => { const saturday = resolveDay('2026-08-08'); const sunday = resolveDay('2026-08-09'); const monday = resolveDay('2026-08-10'); expect(saturday.winner).toEqual({ kind: 'sanctoral', - id: 'vigil-of-st-lawrence', - name: 'Vigil of St. Lawrence', - rank: 'vigil', + id: 'ss-cyriacus-largus-and-smaragdus', + name: 'Ss. Cyriacus, Largus, and Smaragdus, Martyrs', + rank: 'semiduplex', }); - expect(saturday.commemorations).toEqual([]); + expect(saturday.commemorations).toEqual([ + { kind: 'sanctoral', id: 'vigil-of-st-lawrence', name: 'Vigil of St. Lawrence', rank: 'vigil' }, + ]); - // The Sunday's own resolution is exactly as if the vigil didn't exist. + // The Sunday's own winner is unaffected by the vigil, but St. Romanus + // (the vigil's own stub secondary, see st-romanus.yml) still surfaces + // as a commemoration here: he lost his own local clash against the + // vigil before the vigil transferred away, and that loss stands + // independently of the transfer -- confirmed against the live + // reference engine, which shows the same commemoration on this date. expect(sunday.winner).toEqual({ kind: 'temporal', id: 'post-pentecost-11' }); - expect(sunday.commemorations).toEqual([]); + expect(sunday.commemorations).toEqual([ + { kind: 'sanctoral', id: 'st-romanus', name: 'St. Romanus, Martyr', rank: 'simplex' }, + ]); // St. Lawrence's own day (Monday) is unaffected by the backward transfer. expect(monday.winner).toEqual({ diff --git a/tests/calendar/weekday.test.ts b/tests/calendar/weekday.test.ts index 6809e0a..83663e1 100644 --- a/tests/calendar/weekday.test.ts +++ b/tests/calendar/weekday.test.ts @@ -32,10 +32,16 @@ describe('weekdayOf', () => { describe('resolveDay', () => { it('resolves a plain Sunday with no occurring feast', () => { - const day = resolveDay('2026-08-09'); - expect(day.date).toBe('2026-08-09'); + // Not 2026-08-09 (also a Sunday): since the August sanctoral pull, that + // date does carry a real commemoration (St. Romanus, impeded from + // winning by the Vigil of St. Lawrence, itself impeded by the Sunday + // and transferred away — see tests/calendar/transfer.test.ts, and + // confirmed against the live reference engine, which shows the same + // commemoration despite the vigil's own absence that day). + const day = resolveDay('2026-10-04'); + expect(day.date).toBe('2026-10-04'); expect(day.weekday).toBe('sunday'); - expect(day.winner).toEqual({ kind: 'temporal', id: 'post-pentecost-11' }); + expect(day.winner.kind).toBe('temporal'); expect(day.commemorations).toEqual([]); }); }); diff --git a/tests/hours/resolve-common.test.ts b/tests/hours/resolve-common.test.ts index c62f0a2..e098f2f 100644 --- a/tests/hours/resolve-common.test.ts +++ b/tests/hours/resolve-common.test.ts @@ -18,7 +18,7 @@ describe('getDayCollect', () => { }); it('resolves as honestly missing for a saint with no authored propers yet', () => { - const day = resolveDay('2026-08-10'); // St. Lawrence wins outright, propers: null + const day = resolveDay('2026-08-07'); // St. Donatus wins outright, propers: null expect(day.winner.kind).toBe('sanctoral'); const collect = getDayCollect(day); expect(collect.status.la).toBe('missing');