Closer/ClaudeReport.md

26 lines
1.2 KiB
Markdown
Raw Normal View History

# Claude QA Report — Games & Notifications
**Updated:** 2026-06-24
feat(chat): encrypted image messages, notification deep link routing, partner photo on home, rate limiter bump, chat bubble drag-to-dismiss - FirestoreQuestionThreadDataSource: sendImageMessage encrypts bytes with couple key, uploads to Storage, stores URL in Firestore; loadDecryptedMedia downloads + decrypts - QuestionMessage: type field (text/image), mediaUrl, isImage helper - QuestionDiscussionThread: image picker (gallery + camera), encrypted image rendering with produceState, messenger-style avatars on consecutive bubbles - QuestionThreadViewModel: sendImage, loadDecryptedMedia, dailyRevealed skip for already-revealed daily questions, partner photo loading - MainActivity: deepLinkRouteFromIntent resolves FCM data extras to navigation routes; pendingDeepLink state for onNewIntent - AppNavigation: LaunchedEffect waits for HOME route before navigating deep link (fixes race with onboarding) - PartnerHomeScreen: partner photoUrl loaded and displayed in identity card - NotificationRateLimiter: 20 partner/day, 100/week (was 2/4 — too tight for game activity) - MessageBubbleOverlay: drag-to-dismiss zone at bottom, no auto-timeout (persists until read) - ActiveThreadMonitor: dismisses bubble when entering conversation - onMessageWritten: includes author name + photo URL in notification payload - firestore.rules: messages create allows type=image with mediaUrl or type=text with ciphertext - storage.rules: chat_media path with 15MB cap - file_paths.xml: cache-path for camera capture
2026-06-24 15:18:41 -05:00
**Devices:** emulator-5554 (A = QATester) + emulator-5556 (B = Sam), paired (coupleId `xNd1H2UGUDNqvyrDGgfu`).
feat(chat): encrypted image messages, notification deep link routing, partner photo on home, rate limiter bump, chat bubble drag-to-dismiss - FirestoreQuestionThreadDataSource: sendImageMessage encrypts bytes with couple key, uploads to Storage, stores URL in Firestore; loadDecryptedMedia downloads + decrypts - QuestionMessage: type field (text/image), mediaUrl, isImage helper - QuestionDiscussionThread: image picker (gallery + camera), encrypted image rendering with produceState, messenger-style avatars on consecutive bubbles - QuestionThreadViewModel: sendImage, loadDecryptedMedia, dailyRevealed skip for already-revealed daily questions, partner photo loading - MainActivity: deepLinkRouteFromIntent resolves FCM data extras to navigation routes; pendingDeepLink state for onNewIntent - AppNavigation: LaunchedEffect waits for HOME route before navigating deep link (fixes race with onboarding) - PartnerHomeScreen: partner photoUrl loaded and displayed in identity card - NotificationRateLimiter: 20 partner/day, 100/week (was 2/4 — too tight for game activity) - MessageBubbleOverlay: drag-to-dismiss zone at bottom, no auto-timeout (persists until read) - ActiveThreadMonitor: dismisses bubble when entering conversation - onMessageWritten: includes author name + photo URL in notification payload - firestore.rules: messages create allows type=image with mediaUrl or type=text with ciphertext - storage.rules: chat_media path with 15MB cap - file_paths.xml: cache-path for camera capture
2026-06-24 15:18:41 -05:00
**Status: all items closed and verified live.** Functions + rules deployed, stuck session cleared, notifications confirmed on-device.
---
---
## Per-game status
feat(chat): encrypted image messages, notification deep link routing, partner photo on home, rate limiter bump, chat bubble drag-to-dismiss - FirestoreQuestionThreadDataSource: sendImageMessage encrypts bytes with couple key, uploads to Storage, stores URL in Firestore; loadDecryptedMedia downloads + decrypts - QuestionMessage: type field (text/image), mediaUrl, isImage helper - QuestionDiscussionThread: image picker (gallery + camera), encrypted image rendering with produceState, messenger-style avatars on consecutive bubbles - QuestionThreadViewModel: sendImage, loadDecryptedMedia, dailyRevealed skip for already-revealed daily questions, partner photo loading - MainActivity: deepLinkRouteFromIntent resolves FCM data extras to navigation routes; pendingDeepLink state for onNewIntent - AppNavigation: LaunchedEffect waits for HOME route before navigating deep link (fixes race with onboarding) - PartnerHomeScreen: partner photoUrl loaded and displayed in identity card - NotificationRateLimiter: 20 partner/day, 100/week (was 2/4 — too tight for game activity) - MessageBubbleOverlay: drag-to-dismiss zone at bottom, no auto-timeout (persists until read) - ActiveThreadMonitor: dismisses bubble when entering conversation - onMessageWritten: includes author name + photo URL in notification payload - firestore.rules: messages create allows type=image with mediaUrl or type=text with ciphertext - storage.rules: chat_media path with 15MB cap - file_paths.xml: cache-path for camera capture
2026-06-24 15:18:41 -05:00
**One trigger for all games:** `onGameSessionUpdate` fires on `couples/{id}/sessions/{sessionId}` `status` active→completed, so the start/finish fixes apply to every game at once. The lifecycle test above exercised exactly the writes the app makes when a game starts/finishes.
feat(chat): encrypted image messages, notification deep link routing, partner photo on home, rate limiter bump, chat bubble drag-to-dismiss - FirestoreQuestionThreadDataSource: sendImageMessage encrypts bytes with couple key, uploads to Storage, stores URL in Firestore; loadDecryptedMedia downloads + decrypts - QuestionMessage: type field (text/image), mediaUrl, isImage helper - QuestionDiscussionThread: image picker (gallery + camera), encrypted image rendering with produceState, messenger-style avatars on consecutive bubbles - QuestionThreadViewModel: sendImage, loadDecryptedMedia, dailyRevealed skip for already-revealed daily questions, partner photo loading - MainActivity: deepLinkRouteFromIntent resolves FCM data extras to navigation routes; pendingDeepLink state for onNewIntent - AppNavigation: LaunchedEffect waits for HOME route before navigating deep link (fixes race with onboarding) - PartnerHomeScreen: partner photoUrl loaded and displayed in identity card - NotificationRateLimiter: 20 partner/day, 100/week (was 2/4 — too tight for game activity) - MessageBubbleOverlay: drag-to-dismiss zone at bottom, no auto-timeout (persists until read) - ActiveThreadMonitor: dismisses bubble when entering conversation - onMessageWritten: includes author name + photo URL in notification payload - firestore.rules: messages create allows type=image with mediaUrl or type=text with ciphertext - storage.rules: chat_media path with 15MB cap - file_paths.xml: cache-path for camera capture
2026-06-24 15:18:41 -05:00
## Foundational notification fixes (client — shipped in the APK)
- **FCM token registration** — was never happening for any account (root cause of *no* push at all); now registered on sign-in. Verified: tokens stored, real push delivered.
- **POST_NOTIFICATIONS** requested on launch (Android 13+).
- Notification copy renders correctly on-device for start and finish.
feat(chat): encrypted image messages, notification deep link routing, partner photo on home, rate limiter bump, chat bubble drag-to-dismiss - FirestoreQuestionThreadDataSource: sendImageMessage encrypts bytes with couple key, uploads to Storage, stores URL in Firestore; loadDecryptedMedia downloads + decrypts - QuestionMessage: type field (text/image), mediaUrl, isImage helper - QuestionDiscussionThread: image picker (gallery + camera), encrypted image rendering with produceState, messenger-style avatars on consecutive bubbles - QuestionThreadViewModel: sendImage, loadDecryptedMedia, dailyRevealed skip for already-revealed daily questions, partner photo loading - MainActivity: deepLinkRouteFromIntent resolves FCM data extras to navigation routes; pendingDeepLink state for onNewIntent - AppNavigation: LaunchedEffect waits for HOME route before navigating deep link (fixes race with onboarding) - PartnerHomeScreen: partner photoUrl loaded and displayed in identity card - NotificationRateLimiter: 20 partner/day, 100/week (was 2/4 — too tight for game activity) - MessageBubbleOverlay: drag-to-dismiss zone at bottom, no auto-timeout (persists until read) - ActiveThreadMonitor: dismisses bubble when entering conversation - onMessageWritten: includes author name + photo URL in notification payload - firestore.rules: messages create allows type=image with mediaUrl or type=text with ciphertext - storage.rules: chat_media path with 15MB cap - file_paths.xml: cache-path for camera capture
2026-06-24 15:18:41 -05:00
## Optional follow-ups
- Live-test the Date Match push (`notifyOnDateMatch`) end-to-end (both partners "love" a date idea → "It's a match!").
- Distribute the refreshed APK: `Closer-v0.1.0-debug-2026-06-24.apk`.