- Replace [now+14min, now+16min] window with (now, now+16min] catch-up - Replace minuteBucket-keyed Set with uid-keyed Map for exactly-once dedup - Lead-accurate body: 'Starts in N min' (Math.max(1, round(lead/60000))) - CR-01 pruning: drop entries whose dtstart <= now (event started) - WR-01 preserved: mark uid sent after all dispatches complete - Drop gte import; add gt import from drizzle-orm