diff --git a/ClaudeQACoverage.md b/ClaudeQACoverage.md index ba20e1e8..deb36e43 100644 --- a/ClaudeQACoverage.md +++ b/ClaudeQACoverage.md @@ -15,7 +15,7 @@ | Date Match / Plan Date | pass | fail→A-001 | pass | fail→A-001 | | Subscription screen (own status) | n/a | n/a | n/a | pass (by-design per-user) | -Pass A: **complete** (1 systemic P1). +Pass A: **complete** (1 systemic P1). **A-001 FIXED** (e8892a9) — couple-shared everywhere; re-verify each feature in re-QA. New cosmetic A-003 (P3, badge). Subscription screen by-design. ## Pass B — Games lifecycle (start / play / finish + results) | Game | starts | plays | finishes/results | no crash | Status | diff --git a/ClaudeReport.md b/ClaudeReport.md index 36a5a78d..faca9f72 100644 --- a/ClaudeReport.md +++ b/ClaudeReport.md @@ -1,6 +1,6 @@ # Claude QA Report — Full-App QA (living report) -> **RUN-STATE: Round 1 | Pass C (visual light+dark) NEXT | NEXT ACTION: enumerate AppRoute screens, 5554=Dark/5556=Light, screenshot each.** (Pass A done: A-001 P1. Pass B sweep done: B-001 P3; full game lifecycle partial.) +> **RUN-STATE: Round 1 | Pass C (visual light+dark) NEXT | NEXT ACTION: set 5554=Dark/5556=Light, screenshot each AppRoute screen.** (Pass A done; A-001 P1 **FIXED** e8892a9. Pass B sweep done: B-001 P3. New: A-003 P3 badge cosmetic.) > Playbook: `ClaudeQAPlan.md`. Coverage matrix: `ClaudeQACoverage.md`. Report-only during passes (no fixes until the fix phase). > Devices: emulator-5554 (QA=`Y05AKO`) + emulator-5556 (Sam=`imDjjO`), paired (coupleId `Xal3Kw3gjSdn0niERYKJ`). Build == HEAD `64f0a7e`. @@ -12,9 +12,9 @@ _(Prior games/notifications QA from 2026-06-24 was completed + verified; superse | Severity | Open | Fixed | |---|---|---| | P0 | 0 | 0 | -| P1 | 1 | 0 | +| P1 | 0 | 1 | | P2 | 0 | 0 | -| P3 | 1 | 0 | +| P3 | 2 | 0 | --- @@ -24,7 +24,8 @@ _(Prior games/notifications QA from 2026-06-24 was completed + verified; superse | ID | Area | Screen/Route | Severity | Description | Repro | Status | |---|---|---|---|---|---|---| -| A-001 | Premium gating | PlayHubViewModel, DesireSyncScreen, MemoryLaneScreen, ConnectionChallengesScreen, QuestionPackLibraryViewModel, wheel CategoryPicker/SpinWheel/WheelHistory(VMs) | **P1** | These gate on per-user `EntitlementChecker.isPremium()` instead of couple-shared `CouplePremiumChecker.coupleHasPremium(partnerId)`. A free partner of a premium user stays locked — violates couple-shared requirement. | Set Sam premium, QA free → QA Play hub still shows 🔒 Premium on Desire Sync + Memory Lane (confirmed live). Code: only `ConversationViewModel` uses CouplePremiumChecker. | Open | +| A-001 | Premium gating | PlayHubViewModel, DesireSyncScreen, MemoryLaneScreen, ConnectionChallengesScreen, QuestionPackLibraryViewModel, wheel CategoryPicker/SpinWheel/WheelHistory(VMs) | **P1** | These gated on per-user `EntitlementChecker.isPremium()` instead of couple-shared. A free partner of a premium user stayed locked. | Set Sam premium, QA free → QA Play hub still showed 🔒 on Desire Sync + Memory Lane. | **FIXED** `e8892a9` — routed all gates through `CouplePremiumChecker` (now exposes isPremium/hasPremium resolving partner internally). Verified: Sam premium → QA enters Desire Sync; both free → QA → paywall. | +| A-003 | Premium UI (cosmetic) | PlayHubScreen (Desire Sync + Memory Lane cards) | **P3** | The "🔒 Premium" badge on these two cards is static (rendered in separate card composables that don't receive `hasPremium`), so it still shows a lock even when the couple has premium access. Feature IS accessible (gate fixed in A-001) — only the badge is misleading. | With couple premium, QA's Play hub still shows 🔒 Premium on Desire Sync/Memory Lane though tapping enters the game. | Open (deferred — thread hasPremium into the card composables) | | A-002 | Premium (control) | ConversationViewModel (chat) | — | **Working correctly** (couple-shared) — kept as the reference pattern for the A-001 fix. | Verified prior round: partner-premium unlocks chat media/reactions for the free partner. | OK | **Note (by-design, not a bug):** `SubscriptionScreen` uses per-user `isPremium()` — correct, it reflects the user's *own* subscription/account state, not a feature gate.