test(05): UAT — Test 5 PASS (coalescing); Test 4 issue (blocked-notif recovery link broken)

SettingsSheet 'How to enable' calls onClose instead of showing instructions;
leaves no recovery path once browser-blocked. Test 4 push delivery still
unverified (needs a subscribed Android session).
This commit is contained in:
Lucas Berger
2026-06-10 14:06:13 -04:00
parent 24f4589c4e
commit 1f3c672194
@@ -38,20 +38,24 @@ result: [pending]
### 4. Android FCM: event-change push arrives after the other member modifies a calendar event
expected: When member A modifies a shared event title/time/location, member B receives a push notification on Android within the next 5-minute poll cycle, showing "A updated an event" with the event title.
why_human: End-to-end push delivery through FCM to a real Android device with a subscribed session cannot be driven by playwright-cli.
result: [pending]
note: "Delivery chain to a real device (VAPID → push service → SW showNotification) is now proven via the iOS path; the Android-specific leg (FCM endpoint + a subscribed Android session) is still untested."
result: issue
reported: "On Android, could not enable notifications. Once the browser has blocked notifications, the SettingsSheet shows a 'Notifications are blocked' hint with a 'How to enable' link, but the link does nothing except close the settings sheet — no instructions shown, leaving the user with no recovery path. Could not get a subscribed Android session, so the event-change push leg itself remains untested."
severity: major
root_cause: "BUG in apps/pwa/src/components/SettingsSheet.tsx: the 'How to enable' button (the denied-permission hint) is wired to onClick={onClose} — it just dismisses the sheet. It should open the OS-specific InstructionSheet (Android/iOS steps) the same way PermissionDeniedBanner.tsx does. The InstructionSheet component exists but is local to PermissionDeniedBanner and unused by SettingsSheet. Note: being unable to RE-enable from within the web app once the browser blocked the site is expected (browsers won't let a page re-prompt after denial) — but the recovery guidance must work; right now it doesn't."
note: "Event-change push delivery itself (the actual Test 4 assertion) is still UNVERIFIED — blocked on getting a subscribed Android session, which requires unblocking notifications in Chrome site settings first."
### 5. List-change push coalescing is observable
expected: Member B making 5 rapid grocery-list edits results in a SINGLE push notification to member A (not 5), naming the actor and the list, arriving after the 45-second coalesce window.
why_human: Requires two devices/sessions, real timing, and real push delivery. Playwright-cli can exercise the API hooks but not multi-device push receipt.
result: [pending]
result: pass
note: "Confirmed on-device — 5 rapid list edits produced a single coalesced push (not 5)."
## Summary
total: 5
passed: 2
issues: 0
pending: 3
passed: 3
issues: 1
pending: 1
skipped: 0
blocked: 0
@@ -70,3 +74,13 @@ blocked: 0
test: 1
artifacts: [apps/api/src/broker/reminderScheduler.ts, apps/api/src/broker/poller.ts, apps/api/src/broker/outboxWorker.ts]
note: "Side benefit: the node-cron→setInterval fix also restores the CalDAV poller (5-min sync) and outbox drain (15s), which were ALSO being skipped by node-cron in the long-running process."
- truth: "When notifications are browser-blocked, the user is given a working path to re-enable them"
status: failed
reason: "SettingsSheet 'How to enable' link only closes the sheet (onClick={onClose}); shows no instructions. Blocks Test 4 (could not get a subscribed Android session to test event-change push)."
severity: major
test: 4
artifacts: [apps/pwa/src/components/SettingsSheet.tsx, apps/pwa/src/components/PermissionDeniedBanner.tsx]
missing:
- "Wire SettingsSheet 'How to enable' to open the OS-specific InstructionSheet (extract/share it from PermissionDeniedBanner) instead of calling onClose."
- "After unblocking in Chrome site settings, re-run Test 4: modify a shared event as member A, confirm member B's Android device receives the 'updated an event' push within the 5-min poll cycle."