From a0bd5fa1ac19dd2a7191308f80597eceb8e2cfcf Mon Sep 17 00:00:00 2001 From: null Date: Tue, 30 Jun 2026 18:15:11 -0500 Subject: [PATCH] docs(date-memories): update QAPlan with date memories and reflection coverage --- ClaudeQAPlan.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/ClaudeQAPlan.md b/ClaudeQAPlan.md index 924040a0..8ae43090 100644 --- a/ClaudeQAPlan.md +++ b/ClaudeQAPlan.md @@ -891,7 +891,13 @@ open**. No duplicates; rate limiter (20/day, 100/week) doesn't drop legit ones. `memory_capsule_unlocked`(scheduled → capsule) & `memory_capsule_created` (if present → Memory Lane/locked capsule) · `challenge_day_ready`(→ Connection Challenges) & `challenge_day_completed` (if present → challenge progress) · `outcome_reminder`(scheduledOutcomesReminder) · `reengagement`(reengagement/gameRetention) · - `gentle_reminder`(sendGentleReminderCallable) · `spki`(key identity/confirm → security/key screen) · + `gentle_reminder`(sendGentleReminderCallable) · + `thinking_of_you`(**sendThinkingOfYouCallable** ← partner-bubble sheet "💜 Thinking of you" → partner → Home; + generic copy, **no name**; rate-limited 10/rolling-24h; **quiet hours suppresses the push but still writes the + in-app/Together record**; tapping the push → Home, not a dead-end) · + `date_reflection_partner`/`date_reflection_ready`(**onDateReflectionWritten** → partner → the date reflection; + "your turn" when one reflects, "ready to reveal" when both; gated `notifPartnerAnswered`+quiet hours) · + `date_logged`(**onDateHistoryCreated** → partner → reflect on the just-logged date) · `spki`(key identity/confirm → security/key screen) · `subscription_entitlement_changed` & `security_recovery` (if present). - **Game-notification suite (per game):** A starts from Play hub → B gets the start/join push (if supported) → B taps and lands on the correct join/waiting/active screen → B can join from there → A sees B joined/answered → both finish @@ -1210,6 +1216,26 @@ The non-game interactive surfaces that have no functional home (Pass B is games - **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. +- **Partner bubble → quick-actions sheet (R22):** tapping the Home partner avatar opens the bottom sheet (NOT the old + dead-end into "Together"). Verify the glance (avatar + name + "💜 N nights · together since {Mon yyyy}"; streak clause + hidden when 0); **Message** → inbox, **Together** → feed, **Your relationship** → relationship settings, header → + partner page; **💜 Thinking of you** sends the nudge (Pass E `thinking_of_you`) → "Sent 💜" + in-flight disable + + friendly rate-limit/error message on failure; **unpaired account → the bubble still opens the invite flow** (never an + empty sheet); a missing/locked partner name (E2EE key absent) shows **"Your partner"**, never ciphertext/🔒. +- **"Together" feed is actionable (R22):** rows deep-link by type (message→inbox, game→Play, capsule→Memory Lane, + challenge→Challenges, date→Date Matches, answer/reveal→Today); affection/reminder rows (`thinking_of_you`/ + `gentle_reminder`/`streak`) have no deeper target and stay non-tappable; opening the feed clears the unread dot; + sent `thinking_of_you` nudges show up here. +- **Date Memories & Replay (R22) — the private→reveal loop on real dates:** on a mutual match, **"We did this"** + → logs `date_history` (idempotent; admin shows PLAINTEXT title/category + completedAt) → opens the reflection. + Both partners answer the 3 prompts privately; **admin read of the partner's `date_reflections/.../secure/payload` + is DENIED until both have reflected** (the privacy gate, same proof as the daily question) → then both **reveal + side-by-side** (real-time, no refresh). The **Date memories** timeline (entry on Date Matches) lists completed + dates newest-first with the reflection chip (Reflect / Waiting / View); empty state shows + `illustration_date_memories_empty`. Locked-key → placeholder, never ciphertext. **Home nudge:** while a completed + date has no reflection from you, Home surfaces a **"Reflect on your date with [partner] 💭"** card + (`glyph_date_replay`) → opens the Replay timeline; it clears once you've reflected. Notifications covered in + Pass E (`date_reflection_*` / `date_logged`). - **Bucket List:** add / check-complete / edit / delete an item; empty state; both-device sync; at rest encrypted (D1); premium state if applicable (A). - **Plan a Date / Date Builder:** build a plan (shape/steps) → save → **persists + the partner sees it**; date plan +