8 cases that exercise the schedule-resolution path against a
testcontainer Postgres + the canonical recurrence engine + the
reminder worker's helper seam:
1. **Bi-weekly RRULE** — `FREQ=WEEKLY;INTERVAL=2;BYDAY=WE` anchored
on a known Wednesday emits week 1, skips week 2, emits week 3.
Pins the pre-existing worker bug closed.
2. **Monthly** — `FREQ=MONTHLY;BYMONTHDAY=1` emits 3 first-of-month
slots across a 3-month window; in-between days don't fire.
3. **Quarterly** — `FREQ=MONTHLY;INTERVAL=3;BYMONTHDAY=15` emits 3
slots across 9 months; off-quarter months don't fire.
4. **Rolling** — `rollingIntervalDays = 7`. Initial intake on day 0
targets day 7 as the next slot; an earlier intake on day 5
re-anchors to day 12, not day 14. Rolling emits only the
immediately-next slot; past rolling occurrences are historical
intake events, not predictable forward slots.
5. **One-shot lifecycle** — a take flips `medication.active` to
false; a skip leaves it true.
6. **endsOn cap** — a daily schedule with `endsOn = today + 3d`
emits 4 slots (today + day1 + day2 + day3); day 4+ skip.
7. **Legacy fallback** — a row with `rrule = null`,
`daysOfWeek = "i2;3"` behaves the same as the explicit RRULE
bi-weekly Wednesday case. Proves the engine's legacy path closes
the worker bug for pre-v1.5 rows too — covers tenants that
haven't been backfilled (defensive).
8. **One-shot skipped intake** — separate case verifying that
skipping a one-shot does NOT auto-deactivate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>