Privacy-Period-Tracker/docs
null 5f6412856e fix: tell a broken reminder apart from a quiet cycle
Every throw in the worker became Result.success(). A repository failing
every day produced no reminders, no retries, no logs -- §45 forbids them
here -- and nothing a user or a developer could tell apart from a cycle
with nothing to say.

resultFor splits the two kinds. A file or database that could not be read
this minute is worth asking again, three times with WorkManager's backoff;
past that it gives up quietly, because a reminder that finally posts after
a day of retries answers a question nobody is still asking. Anything else
-- most likely a Prediction invariant -- fails identically every time, so
retrying would spin. Extracted and internal because the plumbing that
produces each throw is a Room handle or a corrupt file, and neither is
worth constructing to assert a when.

The catch is Exception, not Throwable, deliberately: an OOM is neither
retryable nor a success, and WorkManager recording it as a failure is
right.

An answered reminder now leaves the shade. setAutoCancel only covers the
body being tapped, so answering with a button left it sitting there to be
answered again, and confirming in the app left it asking something already
settled.

And the stop-asking notice goes through NotificationCopy. Built inline in
the worker, it sat outside every test in that file -- both suites iterate
ReminderKind and it is not one -- and hardcoded PRIVATE visibility, so a
user who explicitly asked to be told plainly got less than her mode
promises.

Also records the spotting decision in HISTORY.md: recorded, never
predicted. §25 keeps spotting from driving the cycle, so predicting it
would hand it influence the specification withholds -- and it is optional
and sparsely logged, so a forecast built on it would be a pattern invented
from whichever cycles she happened to log.

One diagnosis worth keeping. Adding the clock generation to the schedule
key made that flow infinite, which is right in production and hung the
whole app suite for an hour in tests -- a collect that waits for
completion never gets one. A thread dump named the line. The tests now
pass a finite generation flow, and the suite runs in eight seconds.

closes #73

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 01:06:13 -05:00
..
architecture fix: tell a broken reminder apart from a quiet cycle 2026-08-21 01:06:13 -05:00
data feat: the wordmark has its space, and logo and banner say so 2026-08-18 22:12:33 -05:00
design fix: step back through onboarding and the erase confirmation 2026-08-21 00:19:35 -05:00
history fix: tell a broken reminder apart from a quiet cycle 2026-08-21 01:06:13 -05:00
planning docs: correct 57 claims the code and tracker disagreed with 2026-08-18 16:33:14 -05:00
qa docs: record Batch 09, and close half the long-horizon QA gap 2026-08-20 16:39:30 -05:00
security docs: stop describing a biometric key that does not exist 2026-08-21 00:13:01 -05:00
DOC_TRUST_MAP.md docs: separate the constants that are physiology from the ones that are tuning 2026-08-20 16:32:16 -05:00
TOOLS.md docs: correct 57 claims the code and tracker disagreed with 2026-08-18 16:33:14 -05:00
WORK_CYCLE.md docs: a check-in needs the project UUID, not the slug 2026-08-18 16:35:06 -05:00