feat: implement the feast-transfer queue (#34) #350

Merged
manlycucumber merged 1 commit from feature/34-transfer-queue into develop 2026-07-02 03:31:24 +00:00
manlycucumber commented 2026-07-02 03:28:44 +00:00 (Migrated from github.com)

Closes #34. Epic #29, issue 5/8.

What

A displaced first-class feast is transferred, not dropped (n. 95):

  • Precedence\TransferLedger — the queue of impeded first-class feasts
    awaiting a free day. Enqueued with the day it was impeded on; drained onto free
    days highest-precedence first (earliest impeded, then canonical id).
  • PrecedenceRules::forcedTransferDate() — the one feast with a fixed
    target: the Annunciation → the Monday after Low Sunday (Easter + 8, n. 96a),
    placed directly by the sweep, bypassing the queue.

All Souls' next-day reassignment (n. 96b) falls out of the ordinary next-free-day
placement. The whole-year forward sweep that drives the queue and assembles
the day is #37.

Verification

composer lint · composer analyse (PHPStan L6, no errors) · composer test
(450 tests, 30,279 assertions — +10; Annunciation forced target computed as
Easter 2025 + 8 = 28 Apr). Commits signed + DCO.

Closes #34. Epic #29, issue 5/8. ## What A displaced **first-class** feast is transferred, not dropped (n. 95): - **`Precedence\TransferLedger`** — the queue of impeded first-class feasts awaiting a free day. Enqueued with the day it was impeded on; drained onto free days highest-precedence first (earliest impeded, then canonical id). - **`PrecedenceRules::forcedTransferDate()`** — the one feast with a fixed target: the **Annunciation → the Monday after Low Sunday** (Easter + 8, n. 96a), placed directly by the sweep, bypassing the queue. All Souls' next-day reassignment (n. 96b) falls out of the ordinary next-free-day placement. The **whole-year forward sweep** that drives the queue and assembles the day is #37. ## Verification `composer lint` · `composer analyse` (PHPStan L6, no errors) · `composer test` (450 tests, 30,279 assertions — +10; Annunciation forced target computed as Easter 2025 + 8 = 28 Apr). Commits signed + DCO.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Directorium/Core!350
No description provided.