mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-11 13:52:20 +00:00
A rolling reminder at the engine's ten-year maximum interval lost its next due date the moment its cadence was satisfied. The rolling branch of nextOccurrenceAfter bounded its search by the 10-year anti-spin hardCap, and a satisfied reminder computes its next slot with after === lastSatisfiedAt, so the single deterministic slot lands exactly after + 3650 days — equal to the hardCap to the millisecond. The notify-hour slot then spilled a few hours past the raw boundary and was clipped to nothing, leaving nextDueAt null. The rolling slot is one deterministic instant, not an open-ended walk, so the anti-spin cap must never gate it. Bound the rolling search by that slot's own day instead; endsOn stays enforced inside expandRolling, so a course-window reminder still self-expires. This surfaced on a ten-year tetanus booster: logging the next dose silently dropped the reminder instead of rolling it forward a decade.