qa(R8): re-confirm F-RACE-001 live (race -> 1 session, loser joins same set) + prune
Round 8 chunk 1. Simultaneous mood-tap on both emulators -> exactly 1 active session (was 2 pre-fix); race-loser hit WaitingForPartner -> "Join the game" -> joined the winner's session at the same Q1 (shared reveal preserved). Regression smoke clean: no FATAL, game opens both devices, inbox loads, messages + date_swipes ciphertext at rest. F-RACE-001 pruned to the archived-ID line per report hygiene; 0 open P0-P3. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
96987bf29a
commit
11208c6fb5
|
|
@ -71,7 +71,7 @@ Full live two-device run (games + messages):
|
|||
- **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**.
|
||||
|
||||
## Pass F — Resilience / lifecycle / concurrency / time
|
||||
- **Concurrency race:** F-RACE-001 (P1) found + **fixed** (atomic transactional create on per-couple `sessions/_active` pointer) + **verified live** (parallel-tap race → 1 session, was 2). *Pending one confirmation round, then prune.*
|
||||
- **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.)*
|
||||
- **Offline:** airplane mode → Today renders from cache, no crash.
|
||||
- **Lifecycle:** rotation/config-change → state preserved; ~6 cold restarts → clean to Home (auth persists).
|
||||
- **Robustness:** malformed/abusive deep-link intents (unknown type, missing extras, injection/path-traversal) → 0 crash; killed-state cold-start chat deep-link → conversation loads.
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@
|
|||
> to the archived-ID line below (full detail stays in git history). See **Report hygiene** in `ClaudeQAPlan.md`.
|
||||
|
||||
## Run-state (current)
|
||||
`Round 7 (multi-angle deep dive) — COMPLETE | 0 open P0–P3 | NEXT ACTION: Round 8 re-QA — confirm F-RACE-001, then prune it; run Passes I/J live.`
|
||||
- **Build:** client HEAD `23dd6a7` (includes the F-RACE-001 fix, verified live), Cloud Functions deployed.
|
||||
`Round 8 (re-QA + Passes I/J) — IN PROGRESS | 0 open P0–P3 | F-RACE-001 re-confirmed + pruned | NEXT ACTION: Pass I (performance), then Pass J (a11y).`
|
||||
- **Build:** client HEAD `23dd6a7`, Cloud Functions deployed.
|
||||
- **Devices / accounts:** emulator-5554 = QA (`Y05AKO2IlTPMa0JQW1BiNIM0uzK2`) · emulator-5556 = Sam (`imDjjO…`) · paired, coupleId `Xal3Kw3gjSdn0niERYKJ`, both free (baseline restored).
|
||||
- **Docs:** Playbook `ClaudeQAPlan.md` · Coverage `ClaudeQACoverage.md` · Ideas `Future.md` `## QA` · Branding `ClaudeBrandingReview.md`.
|
||||
|
||||
|
|
@ -15,20 +15,15 @@
|
|||
| Severity | Open | Fixed (pending 1 confirm) |
|
||||
|---|---|---|
|
||||
| P0 | 0 | 0 |
|
||||
| P1 | 0 | 1 (F-RACE-001) |
|
||||
| P1 | 0 | 0 |
|
||||
| P2 | 0 | 0 |
|
||||
| P3 | 0 | 0 |
|
||||
|
||||
## Open issues
|
||||
**None.**
|
||||
|
||||
## Fixed this round — pending one confirmation round (then prune)
|
||||
| ID | Severity | Area | Description | Fix | Status |
|
||||
|---|---|---|---|---|---|
|
||||
| F-RACE-001 | P1 | Games / concurrency | Both partners starting the *same* game within ~1s created **2 divergent active sessions** (different question sets) → no shared reveal; core loop silently defeated. Non-transactional check-then-create in `GameSessionManager.startGameWithCouple`. | Atomic Firestore transaction on a per-couple pointer `couples/{cid}/sessions/_active` (`startSessionAtomically`): reads pointer → `AlreadyActive`→join, else atomically sets session + re-points lock. All 7 games funnel through it. Member-writable `sessions/_active` rule deployed. Files: `QuestionSessionRepository[Impl].kt`, `GameSessionManager.kt`, `firestore.rules`. | **Fixed + verified live (`23dd6a7`):** parallel-tap race → **1 session** (was 2); sequential 2nd start → joins; pointer self-heals on completion; 0 FATAL. **→ Round 8: re-confirm, then delete this row.** |
|
||||
|
||||
## Resolved & confirmed (archived — full detail in git history)
|
||||
A-001 · A-003 · A-OBS · B-001 · B-002 · B-003 · B-004 · C-CC-001 · C-DS-001 · C-NAV-001 · D-001 · E-001 · E-002 · E-003 · E-OBS · F-OBS — all fixed and re-verified across Rounds 2–6 (commits cited in history). Pruned from the live report per the one-confirmation-round rule. (C-OBS / `outcomes` list / SubscriptionScreen per-user gate = investigated, **not bugs**.)
|
||||
A-001 · A-003 · A-OBS · B-001 · B-002 · B-003 · B-004 · C-CC-001 · C-DS-001 · C-NAV-001 · D-001 · E-001 · E-002 · E-003 · E-OBS · F-OBS · F-RACE-001 — all fixed and re-verified (commits in history; **F-RACE-001** fixed `23dd6a7`, re-confirmed live R8: race → 1 session, loser joins same set). Pruned per the one-confirmation-round rule. (C-OBS / `outcomes` list / SubscriptionScreen per-user gate = investigated, **not bugs**.)
|
||||
|
||||
## Security cornerstone — clean (Pass D, deep dive, Round 7)
|
||||
- **D1 at-rest:** chat text + `lastMessagePreview` + all 4 game-answer collections (ToT / How Well / Desire Sync / Wheel, both users) + Memory Lane capsules + date-swipe actions = `enc:v1:`. No plaintext content; only metadata in clear.
|
||||
|
|
@ -37,6 +32,7 @@ A-001 · A-003 · A-OBS · B-001 · B-002 · B-003 · B-004 · C-CC-001 · C-DS-
|
|||
- **Robustness:** malformed/abusive deep-link intents (unknown type, missing extras, injection/path-traversal) → 0 crash; killed-state cold-start chat deep-link → conversation loads.
|
||||
|
||||
## Round history (one line each)
|
||||
- **R8** (in progress) — F-RACE-001 re-confirmed live (race → 1 session; loser joins winner's same-set session via "Join the game") + pruned; running Passes I/J.
|
||||
- **R7** — multi-angle security/concurrency deep dive → cornerstone fully clean; F-RACE-001 found + fixed + verified. 0 new open.
|
||||
- **R6** — branding drop + Future.md backlog regression (white-keyhole icons/loader/splash, inclusive gender, copy, rate-limit split, results-push suppression, paywall retry/offline) → 0 new open.
|
||||
- **R5** — Cloud Functions deployed (E-OBS channel fix, E-003 results routing) + new Pass G (account creation / fake-account abuse) clean → 0 open.
|
||||
|
|
|
|||
Loading…
Reference in New Issue