fix(checkups): keep a missed rolling reminder due until it is measured

A rolling reminder ("every N days") is anchored on its last reading, but
the reminder tick rolled any cycle of a week or less on after a delivered
reminder, re-anchoring it on the send. A missed every-two-days blood
pressure reading therefore moved two days ahead each evening, read "in 2
days" on the card, and never showed as today or overdue.

A rolling reminder now stays due after its reminder, whatever its
interval, until a reading lands or it is done, skipped or snoozed. While
it stays open the repeat follows its interval, capped at a week, still in
its notify hour and under the per-day claim. Calendar rules that recur
within a week (a twice-daily course) keep rolling on; appointments are
unchanged.

holdsOpenAfterReminder stays the one definition for the tick and the
edit route. The daily digest asks the narrower question underneath it,
hasLongCycle, so a short rhythm still waits for its time of day on the
start page and is not pinned under the rail cap.

Refs #1369
This commit is contained in:
Marc-André Bombeck committed 2026-11-10 22:14:02 +01:00
1 parent d110f0456c
commit ea3fcce80c
15 files changed
+530 -116

No files matched your search

+7 -6
View File
@@ -16986,12 +16986,13 @@ paths:
- MeasurementReminders
summary: List Vorsorge reminders (v1.17.1)
description: "Returns the owner's live (non-tombstoned) Vorsorge reminders, sorted by server-computed nextDueAt
ascending (nulls last). Each row carries the canonical nextDueAt the client renders without recomputing. Since
v1.39.2 a reminder whose cycle is longer than seven days (intervalDays > 7, an rrule whose next occurrence is
more than seven days out) or that has no cadence keeps its nextDueAt after its reminder is sent, with or without
a measurementType: it stays due, then overdue, until it is satisfied (a matching reading or lab result, or
completed), skipped or snoozed, and the server repeats the reminder at most once every seven local days while it
stays open. A reminder on a weekly or shorter cycle still rolls on to its next slot after a delivered reminder."
ascending (nulls last). Each row carries the canonical nextDueAt the client renders without recomputing. A
rolling reminder (intervalDays, any length), an rrule reminder whose next occurrence is more than seven days
out, and a reminder with no cadence keep their nextDueAt after their reminder is sent, with or without a
measurementType: they stay due, then overdue, until satisfied (a matching reading or lab result, or completed),
skipped or snoozed. While one stays open the server repeats the reminder every intervalDays local days for a
rolling reminder, capped at seven, and every seven local days otherwise. An rrule reminder that recurs within
seven days rolls on to its next slot after a delivered reminder."
responses:
"200":
description: The owner's measurement reminders.