- Bump the service worker API cache to v3 so activation deletes the v2
cache, whose recipe-candidate responses used the full page URL as
candidate_id; test that activation deletes v1 and v2 and keeps v3.
- Give candidate offers a 30-minute lifetime, drop expired offers when
new ones are stored, and clear a dinner's offers on every hand
grounding (candidate, link or manual) and on archive. A candidate
search still running when its dinner is cleared stores nothing, so a
stale candidate_id gets the same 400 as an unknown one.
- Make the link leak assertions in TestDinnerResponsesHideTokenInLinkPath
and TestCreateRegularNeverNamesFromLink check phrases a ULID cannot
contain, so a dinner id holding "KEY" no longer fails them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Release corrections from the review of promotion pull request #98:
- MQ-98-01: recipe-candidates returns an opaque candidate_id (an HMAC of
the dinner and page under a per-process key) that the server resolves
to the page it last offered that dinner. Candidate URLs, which may
carry a token, no longer reach responses or the service-worker cache.
- MQ-98-02: "Turn on notifications" no longer finishes onboarding
silently when notifications are unavailable (or denied); the step says
plainly that nothing was turned on and offers "Finish setting up".
The placeholder stays until Feature 19 wires Web Push.
- MQ-98-03: GroundPendingDinner clears the pasted recipe_url when
background grounding succeeds, as manual grounding already did.
Maestro task 6819ce33-3715-4bd4-9208-a54a8b5cee02.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>