diff --git a/ClaudeQACoverage.md b/ClaudeQACoverage.md index deb36e43..a82b0e80 100644 --- a/ClaudeQACoverage.md +++ b/ClaudeQACoverage.md @@ -28,7 +28,10 @@ Pass A: **complete** (1 systemic P1). **A-001 FIXED** (e8892a9) — couple-share | Spin the Wheel | pass (launch) | partial | todo | pass | launch ok | | Date Match | todo | todo | todo | todo | todo | -_Note: stale active session blocked games (B-001); cleared via in-app "End their game" (recovery verified). Full two-device start→finish + results = partial this round._ +_Note: stale active session blocked games (B-001); cleared via in-app "End their game" (recovery verified)._ +**REQUIREMENT (updated): each game must be played ONE COMPLETE time through on both devices (every step → finish/ +reveal/results), not just launched.** All rows above are currently `launch ok / partial` only → **full playthrough +still owed for every game** in Round 2 (premium games need a premium toggle). A launch-only row counts as `partial`, not `pass`. ## Pass C — Visual (light + dark), all ~50 routes _todo — enumerate from AppRoute.kt; 5554=Dark, 5556=Light._ diff --git a/ClaudeQAPlan.md b/ClaudeQAPlan.md index 0002c247..deb52b32 100644 --- a/ClaudeQAPlan.md +++ b/ClaudeQAPlan.md @@ -75,12 +75,18 @@ Gated files (for the fix): `ui/play/PlayHubViewModel`, `ui/desiresync/DesireSync `ui/wheel/{CategoryPicker,SpinWheel,WheelHistory}*`, `ui/questions/QuestionPackLibrary*`, `ui/dates/{DateMatch,DateMatches}Screen`, `ui/memorylane/MemoryLaneScreen`, `ui/challenges/ConnectionChallengesScreen`. -### Pass B — Games lifecycle (start / play / finish + results) +### Pass B — Games lifecycle (MANDATORY: play each game ONE complete time through) Games: This or That, How Well Do You Know Me, Desire Sync, Connection Challenges, Memory Lane, Spin the Wheel, + Date Match. -- Start on A → `status=active`; both play through → `status=completed`; reveal/results correct on both. -- Edges: re-open a completed session, leave mid-game, no stuck session, no crash. +- **A launch/crash check is NOT sufficient. Each game MUST be played one full way through, end-to-end, on BOTH + devices** — start → answer/interact through **every** step/round/question on each device → reach the + **finish/reveal/results** screen → confirm the result renders correctly for both partners. Verify each + intermediate screen and interaction works (selections register, progress advances, both-answered gating, + reveal/scoring/summary correct). Premium games (Desire Sync, Memory Lane) need a premium toggle to play. +- The session lifecycle is exercised by the real playthrough: `status` active→completed; reveal/results correct on both. +- Edges: re-open a completed session, leave mid-game (resume), no stuck session, no crash, logcat clean. - Game start/finish pushes (`onGameSessionUpdate`) exercised here; full delivery/deep-link audit in **Pass E**. - **Media permissions** (CAMERA, RECORD_AUDIO): granted works, denied degrades gracefully. +- **Done = every game has one verified complete playthrough** (a launch-only "opens, no crash" row is `partial`, not `pass`). ### Pass C — Visual pass, light + dark, ALL screens Every route in `core/navigation/AppRoute.kt` (~50), in **both** modes: text contrast/readability (no invisible/ diff --git a/ClaudeReport.md b/ClaudeReport.md index 5b254978..fd3468b2 100644 --- a/ClaudeReport.md +++ b/ClaudeReport.md @@ -1,6 +1,6 @@ # Claude QA Report — Full-App QA (living report) -> **RUN-STATE: Round 2 (re-QA + deferred coverage) NEXT | NEXT ACTION: re-verify A-001 + E-001 fixes; then complete deferred — Pass C deep/stateful screens (reveal, wheel session, dates, bucket list, auth/onboarding) in both themes, full live notification matrix, D3 live non-member test.** +> **RUN-STATE: Round 2 (re-QA + deferred coverage) NEXT | NEXT ACTION: re-verify A-001 + E-001 fixes; **play each game ONE complete time through on both devices** (Pass B was launch-only — full playthroughs still owed); then Pass C deep/stateful screens (reveal, wheel session, dates, bucket list, auth/onboarding) in both themes, full live notification matrix, D3 live non-member test.** > Round 1 complete (all 5 passes run report-only; P0–P2 found were fixed in-line). Fixes: A-001 (e8892a9), E-001 (ce12abb). Open P3: A-003, B-001, E-002. > 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`. @@ -51,6 +51,8 @@ certification: exhaustive deep/stateful screens (Pass C), full live notification _Deep/stateful screens (answer reveal, wheel session/complete, date match/builder/matches, bucket list, memory capsule, history, paywall, auth/onboarding/pairing) need their states set up — pending next chunk._ +**Pass B requirement (updated):** each game must be **played one complete time through on both devices** (start → every step → finish/reveal/results), not just launched. Round 1 did launch-only → **full playthroughs owed in Round 2** for all 7 (premium games need a premium toggle). A launch-only result = `partial`, not `pass`. + ## Pass D — Security & Encryption ✅ clean (no P0/P1 found) - **D1 at-rest:** all private content is ciphertext — message `text` + `lastMessagePreview` + thread messages = `enc:v1:`; daily answers `encryptedPayload` = `sealed:v1:`. Metadata (dates, types, commitmentHash, ids) plaintext as expected. Chat media bytes = Tink ciphertext (verified prior round + unchanged code path). **No plaintext content leak.** - **D2 rules:** no catch-all `match /{document=**}`, no blanket `if true`; **`hasPremium` server-only** (client create/update blocked, rules L172/174); entitlements `write:false`; conversations/messages/typing/reactions + entitlement partner-read scoped to members.