64 lines
5.2 KiB
Markdown
64 lines
5.2 KiB
Markdown
# Future — ideas & improvements backlog
|
|
|
|
Non-blocking ideas: things that work today but could be better, plus feature ideas. Actual bugs
|
|
(broken/incorrect behavior) live in `ClaudeReport.md`, not here.
|
|
|
|
## QA
|
|
|
|
Improvement & feature ideas surfaced while QA-testing as a consumer (each works today — none are defects).
|
|
|
|
- **✅ DONE — Consistent brand glyphs across game cards + waiting surfaces.** G-set + G2 (17 glyphs) in
|
|
`res/drawable-nodpi/glyph_*.xml`; **13 wired + verified live:** every Play-hub card (This or That, How Well, Desire
|
|
Sync, Connection Challenges, Memory Lane, Date Match, Plan Date, Question Packs, Bucket List, Past Games — Spin the
|
|
Wheel keeps its full illustration), WaitingForPartner per-game glyph, and Settings (Subscription/Security/Privacy/
|
|
Delete). 4 unused have no clean slot (notif uses `ic_notification_closer`; Today uses hero art; quiet-hours uses its
|
|
illustration; no export-data row exists). Full map in `ClaudeBrandingReview.md`. _(This-or-That backdrop redesign is
|
|
Codex C-DARK-UI-001.)_
|
|
|
|
- **Minor proactive-notification gaps (low priority).** No push when a partner *joins* your active game
|
|
(`partner_joined_game`) or *ends/abandons* one (`game_ended`/`game_abandoned`) — the other partner sees it
|
|
in-session / on WaitingForPartner, so nothing's broken, just less proactive. *Prompted by:* Pass E (R8) inventory —
|
|
these speculative types aren't implemented.
|
|
- **Clarify Connection Challenges day-progress when partners are out of step.** If one partner catches up a *missed* day ("Pick it back up") while the other doesn't, the two devices show different **"Day N of 7"** (seen R10: QA Day 4 vs Sam Day 3) even though the 🔥 streak stays in sync on both. Not broken (plausibly individual-pace-through-the-series by design), but two people in the same shared challenge seeing different day numbers is confusing — consider a shared "you're on Day N together" framing or a clearer caught-up/ahead indicator. *Prompted by:* Pass B (R10) Connection Challenges playthrough.
|
|
|
|
### Security hardening (defense-in-depth — not vulnerabilities; rules already hold)
|
|
|
|
- **Enforce App Check on Firestore (currently OFF).** Round 7 raw-API test: an authenticated request with **no App
|
|
Check token** (raw Firestore REST) returned `200` for a member — so rules are the *sole* gate. Rules correctly deny
|
|
non-members/cross-couple (all `403`), so this is not a live hole, but enabling App Check enforcement on Firestore
|
|
would block non-app clients entirely (defense-in-depth). *Prompted by:* R7 D3 raw-API angle.
|
|
|
|
> Artwork to generate (ChatGPT prompts, house-style-matched) lives in `ClaudeBrandingReview.md`, not here.
|
|
|
|
<!--
|
|
Completed (2026-06-27, Future.md backend pass — deployed + verified live):
|
|
- subscription_entitlement_changed push — new Cloud Function `onEntitlementChanged` (users/{uid}/entitlements/premium
|
|
onWrite, edge-triggered inactive→active) notifies the PARTNER "X upgraded — you both have Premium now"; skips if the
|
|
partner already had premium. Client type `SUBSCRIPTION_CHANGED` added (routes to Subscription). Verified: QA premium
|
|
ON → Sam queued the push; Sam ON while QA already premium → no redundant notify. Deployed to closer-app-22014.
|
|
- users/{uid} update-rule field allowlist — `allow update` now uses `affectedKeys().hasOnly([...12 model/aux fields])`,
|
|
blocking junk keys + `hasPremium`. Verified raw-API: allowlisted field PATCH 200, junk field 403, hasPremium 403.
|
|
(Keep the list synced with User.kt + FirestoreUserDataSource — guard noted in firestore.rules.) Deployed.
|
|
|
|
Completed (2026-06-27, Future.md fix pass):
|
|
- Daily-reveal isRevealed retry — on reveal load, if local says revealed but the server doc's isRevealed is still
|
|
false (a prior best-effort markRevealed failed offline/transiently), re-issue markRevealed idempotently so
|
|
onAnswerRevealed fires and the partner gets the "opened your answers" push (AnswerRevealViewModel.load()).
|
|
- Brand glyphs — G-set copied to res/drawable/; Date Match + Plan Date cards wired to glyph_date_card_heart
|
|
(remaining surfaces tracked above + in ClaudeBrandingReview.md).
|
|
- Memory Lane "title runs into preview" — investigated, NOT a bug: the capsule list renders title (own line, ellipsized)
|
|
+ open-date; sealed content is never previewed. The R12 "run-on" was adb-typed test data landing in the title field.
|
|
|
|
Completed (2026-06-25) and removed from the backlog:
|
|
- Inclusive sex/gender options in onboarding (Female/Male/Non-binary/Prefer not to say) + honest copy
|
|
(Desire Sync is already gender-neutral, so no tailoring fallback was needed).
|
|
- Turn-aware Home "waiting to play" copy ("Your turn to play.").
|
|
- Partner-action/results pushes exempt from the weekly promotional rate-limit ceiling.
|
|
- Suppress the redundant results / "partner finished" push when the recipient is already on that
|
|
game's screen (new ActiveGameSessionMonitor mirroring ActiveThreadMonitor).
|
|
- Friendlier paywall error state: retry-with-backoff, offline-aware message, Continue hidden until plans load.
|
|
- Wire iOS illustrations into Android empty states — already wired (history, invite, daily-question,
|
|
together-empty, partner-activation all show their illustration).
|
|
- Rotating privacy messages on sign-up + forgot-password (login already had it).
|
|
-->
|