From dbf8a6f18e3130b3c3700078f8c7a91b490471d8 Mon Sep 17 00:00:00 2001 From: null Date: Fri, 26 Jun 2026 00:00:31 -0500 Subject: [PATCH] =?UTF-8?q?qa(R8):=20wrap=20=E2=80=94=20Pass=20E=20new-typ?= =?UTF-8?q?e=20status=20(not=20implemented),=20couple-premium-unlock=20ide?= =?UTF-8?q?a=20to=20Future.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Code check: the speculative Pass E types added by the merged playbook (join_game, partner_joined_game, game_ended, date_plan_update, subscription_entitlement_changed, ...) are not implemented (0 files) -> marked not implemented -> Future.md. Logged the worthwhile ones to Future.md ## QA (notify free partner on couple premium unlock; join/ end pushes). Round 8 at the flawless bar: 0 open P0-P2 (1 P3 J-OBS); I-001/I-002 fixed+ verified pending Round 9 confirm. Co-Authored-By: Claude Opus 4.8 --- ClaudeQACoverage.md | 3 ++- Future.md | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ClaudeQACoverage.md b/ClaudeQACoverage.md index d78f2e89..d6213a4b 100644 --- a/ClaudeQACoverage.md +++ b/ClaudeQACoverage.md @@ -68,7 +68,8 @@ Full live two-device run (games + messages): - **partner_started_game** ✅ — channel `game_activity`, "QA is playing… Tap to join!" (content-free); tap → joins the active session. - **partner_finished_game / results** ✅ — results push delivered to backgrounded partner, channel `game_activity`, content-free; tap → per-session results (per E-003 fix). - **results-suppression** ✅ — partner foregrounded on the session received 0 pushes (ActiveGameSessionMonitor), while backgrounded partner got the results push. Delivery + suppression both confirmed. -- **Deferred (Round 8):** the full 17-type × {fg/bg/killed} matrix isn't exhaustively run live — remaining types are routing-code-verified + centralized in `PartnerNotificationType`; date_match push verified live. New types added to the plan's Pass E inventory (`join_game`, `partner_joined_game`, `game_ended`, `date_plan_update`, etc.) = **todo**. +- **New speculative types — `not implemented → Future.md` (R8 code check, 0 files each):** `join_game`/`game_invite`, `partner_joined_game`, `game_abandoned`/`game_ended`, `date_plan_update`, `memory_capsule_created`, `challenge_day_completed`, `subscription_entitlement_changed`. Worthwhile ones (couple-premium-unlock push; join/end pushes) logged to `Future.md` `## QA`. Not counted as pass. +- **Deferred (Round 9):** the full implemented-type × {fg/bg/killed} matrix isn't exhaustively re-run live — implemented types are routing-code-verified + centralized in `PartnerNotificationType`; chat/game start/finish/results + date_match verified live (R3/R5/R6). ## Pass F — Resilience / lifecycle / concurrency / time - **Concurrency race:** F-RACE-001 (P1) fixed + **re-confirmed live (R8):** simultaneous mood-tap on both devices → **1 session** (was 2); race-loser landed on WaitingForPartner → **"Join the game"** → joined the winner's session at the **same Q1** (shared reveal preserved). Archived. *(Minor pre-existing note: loser can alternatively land on Play hub; not seen this run.)* diff --git a/Future.md b/Future.md index ff13bafc..72df3b3e 100644 --- a/Future.md +++ b/Future.md @@ -14,6 +14,15 @@ Improvement & feature ideas surfaced while QA-testing as a consumer (each works quiet-hours moon) used consistently would strengthen identity. Generate the G-set, drop the assets in, then wire them in. *Prompted by:* Pass H branding review. +- **Notify the free partner when the couple gains premium.** When one partner subscribes, the other's app unlocks + (couple-shared premium) but they get **no notification** — they only find out next time they open a gated feature. A + `subscription_entitlement_changed` push ("You both have Premium now ✨") would close the loop. *Prompted by:* Pass E + (R8): the type isn't implemented; couple-shared unlock is silent for the non-subscriber. +- **Minor proactive-notification gaps (low priority).** No push when a partner *joins* your active game + (`partner_joined_game`) or *ends/abandons* one (`game_ended`/`game_abandoned`) — the other partner sees it + in-session / on WaitingForPartner, so nothing's broken, just less proactive. *Prompted by:* Pass E (R8) inventory — + these speculative types aren't implemented. + ### Security hardening (defense-in-depth — not vulnerabilities; rules already hold) - **Enforce App Check on Firestore (currently OFF).** Round 7 raw-API test: an authenticated request with **no App