From 96fdd67e1a48d453e868f283f55e204f35b4941c Mon Sep 17 00:00:00 2001 From: null Date: Tue, 30 Jun 2026 19:06:20 -0500 Subject: [PATCH] docs: add R23-DQ-001 reconcile check to QAPlan Pass N --- ClaudeQAPlan.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ClaudeQAPlan.md b/ClaudeQAPlan.md index 8ae43090..83c9ad4b 100644 --- a/ClaudeQAPlan.md +++ b/ClaudeQAPlan.md @@ -968,7 +968,10 @@ open**. No duplicates; rate limiter (20/day, 100/week) doesn't drop legit ones. - **Install/update/migration lifecycle:** fresh install, update over an existing signed-in install, app data retained, Room/DataStore/SharedPreferences migrations, notification channel migration, cached encryption/key material, pending deep links/notifications across update, and version-skew between partners if one device updates first. No - sign-out loops, stale build routing, lost local state, broken permissions, or migration crashes. + sign-out loops, stale build routing, lost local state, broken permissions, or migration crashes. **When local state + is lost but Firestore is intact (fresh device / cleared data), already-answered content must reconcile back rather + than re-prompt** — see the **R23-DQ-001** daily-question reconcile check in Pass N (a re-answer offered against an + immutable `secure/payload` is silent data loss). - **Crash reporting:** confirm crashes/ANRs are actually captured (Crashlytics) so field issues surface. ### Pass H — Branding & artwork (every screen: could it carry more of the brand? where would art help?) @@ -1213,6 +1216,13 @@ The non-game interactive surfaces that have no functional home (Pass B is games **Discuss** thread (Pass L) → **Answer History** → **streak** increment + milestone celebration (`streak_milestone`) → reveal `isRevealed` retry (the `onAnswerRevealed` push). Verify the premium daily-question fallback (`DailyQuestionResolver` per-user) does **not** desync the couple's shared daily Q. + - **R23-DQ-001 — fresh-device / cleared-local-DB reconcile (data-loss guard):** after answering, simulate the + Room↔Firestore desync (new device, reinstall with data cleared, or a wiped local answer store) so Firestore holds + the answer but local Room/prefs don't. Home must **not** show a stale "your turn", and opening the daily question + must show the **submitted/reveal** state (NOT an editable re-answer form) — because the `secure/payload` doc is + immutable (`allow update:false`), so a re-answer would be silently rejected and a *changed* pick lost. The guard is + `reconcileLocalAnswerFromFirestore` (Room-first; rebuilds from the read-gated couple-key payload) wired into + `DailyQuestionViewModel` + `HomeViewModel`; covered by `ReconcileLocalAnswerTest`. - **Relationship check-ins / Your Progress (outcomes):** baseline check-in (gated to show once), 30/60/90-day follow-ups, slider inputs persist (`submitOutcomeCallable`), the progress view renders patterns/milestones, `scheduledOutcomesReminder` fires, "No baseline yet" → check-in dialog (C-DARK-UI-002 area). Submit + Skip both work.