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