From 682a9d8ea78626fda5c743fbb7a612817a4db806 Mon Sep 17 00:00:00 2001 From: null Date: Thu, 25 Jun 2026 11:32:32 -0500 Subject: [PATCH] =?UTF-8?q?qa(r3):=20Pass=20E=20live=20notif=20tests=20?= =?UTF-8?q?=E2=80=94=20chat=5Fmessage=20full=20chain=20OK;=20log=20E-003?= =?UTF-8?q?=20+=20E-OBS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chat_message: deliver (bg) + content-free + tap deep-links to exact conversation with content loaded. partner_started_game: deliver + content-free OK; tap -> generic Play hub (not the game). E-003 (P2): game pushes routeFor->AppRoute.PLAY (not the specific game/results) despite 'Tap to join!'; extend B-002's game-route resolver to notifications. E-OBS (P3): backgrounded pushes use fcm_fallback_notification_channel, bypassing code-defined CHANNEL_GAMES/chat channels (server sends notification not data-only). Co-Authored-By: Claude Opus 4.8 --- ClaudeReport.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ClaudeReport.md b/ClaudeReport.md index 3e49b2c5..becc6568 100644 --- a/ClaudeReport.md +++ b/ClaudeReport.md @@ -82,7 +82,15 @@ Verified render cleanly, readable, **no FATAL, no new dark-mode contrast issues* - D4 (wrapped couple key / KDF), D5 (App Check, gitignored SA JSONs, allowBackup=false), D6 (analytics metadata-only) unchanged since Round 1 — code identical, still hold. - **D3 live non-member negative test: still deferred** — needs a 3rd fresh account not in the couple (only 2 emulators, both members; signing one out risks the App Check debug token + couple state). Rule logic is statically member-scoped (`isCouplesMember` gate on every couple subcollection) — denial holds by construction. -_Still to verify this round: edges (re-open completed / leave mid-game), Pass E live notif matrix, Pass F._ +**Pass E (R3) — live notification tests (both FCM tokens valid, len=142):** +- **chat_message ✅ FULL CHAIN** — Sam backgrounded; QA sent a message → Sam received push **title "QA sent a message" / body "Tap to read and reply."** (content-free ✓, actual text NOT in payload → D6 holds) → **tapped → opened the exact conversation with the new message loaded** (deep-link ✓, background→cold path). +- **partner_started_game** — Sam backgrounded; QA started This or That → Sam received **"QA is playing / QA has started a game. Tap to join!"** (delivery ✓, content-free ✓). **BUT tap → landed on the generic Play hub, NOT the game.** +- **E-003 (NEW, P2) — game notifications deep-link to the generic Play hub, not the specific game/results.** Code: `PARTNER_STARTED_GAME`/`GAME_RESULTS_READY`/`PARTNER_COMPLETED_PART` all `routeFor → AppRoute.PLAY` (PartnerNotificationManager L270-272). The body says "Tap to **join**!" but the user lands on the hub and must find+tap the game card themselves (tapping it does then join the session, per B-002). Same gap B-002 fixed for the Home "Play now" card — never extended to notifications. Plan's Pass E wants "the **specific item**, not just the right tab" (strictly P1; rated P2 since it lands on the right tab and is recoverable). **Fix:** route game pushes through the active-session→game-route resolver (like HomeViewModel.gameRouteFor) so the deep-link joins the game. Report-only. +- **E-OBS (NEW, P3) — backgrounded pushes use `fcm_fallback_notification_channel`, not their code-defined channels.** The delivered chat + game pushes both landed on `fcm_fallback_notification_channel` even though the code assigns `CHANNEL_GAMES`/chat channels (PartnerNotificationManager L185). Means the server sends FCM "notification" (not data-only) messages, so the system auto-displays them on the fallback channel when backgrounded — bypassing the app's channel importance/sound and the per-category toggle (users can't mute just "Games"). **Fix:** send data-only FCM + build the notification client-side with the right channel, or set `android.notification.channel_id` in the FCM payload. Report-only. +- Foundations ✅ — both users registered FCM tokens; routing centralized in `PartnerNotificationType`; E-001 (daily_question/challenge_day_ready) + E-002 (partner_left→HOME) fixes present in code. date_match push live-verified R2-B2. +- _Full 17×{fg/bg/killed} matrix not exhaustively run; chat_message + partner_started_game live-verified this round (deliver+content-free; chat deep-link ✓, game deep-link → E-003). Remaining types: routing code-verified._ + +_Still to verify this round: edges (re-open completed / leave mid-game), Pass F._ ## Pass A — Couple-shared premium ✅ pass complete **Target:** if either partner is premium, all premium features unlock for both.