Compare commits
No commits in common. "2dc07de350974a112e688f5001f0bf2bbab5b72d" and "654be1fefffc81360f0fcb973a28368faff8100e" have entirely different histories.
2dc07de350
...
654be1feff
|
|
@ -1,10 +1,5 @@
|
|||
# iOS↔Android E2EE Parity — Status Memo
|
||||
|
||||
> **Status (stamped 2026-07-11): snapshot as of 2026-06-28; iOS work is PAUSED — the ship scope is
|
||||
> Android-only (owner decision, see `release_guide.md`).** Still accurate as the resume-point memo
|
||||
> for whenever iOS work restarts; nothing here has been invalidated, but nothing has advanced either
|
||||
> (canonical-vector CI run still `TODO_ANDROID_RUN` per the Engineering Manual).
|
||||
>
|
||||
> **Phase: iOS E2EE code-complete, parity verified in isolation, deployment pending Mac/CI infrastructure.**
|
||||
> **Author:** Ripley (Ripley subagent), 2026-06-28
|
||||
> **Audience:** Next session (you, Scarlett, Bishop, Neo, future Claude), and anyone resuming the iOS E2EE work
|
||||
|
|
|
|||
|
|
@ -1,10 +1,5 @@
|
|||
# Closer UI Upgrade
|
||||
|
||||
> **Status (stamped 2026-07-11): historical planning doc (written 2026-07-01), not a live tracker.**
|
||||
> Much of its direction shipped via the R30 polish round (see `ClaudeReport.md` R30) and the brand
|
||||
> system in `docs/brand/`. For current visual/brand backlog use `ClaudeBrandingReview.md`
|
||||
> (BRAND-ICON-CUSTOM) — do not work items from this file without checking they aren't already done.
|
||||
|
||||
This document is the focused visual upgrade plan for making Closer feel more beautiful, polished, and emotionally specific without turning it into a decorative wellness app.
|
||||
|
||||
The direction: keep the app calm and private, but make important relationship moments feel more intentional.
|
||||
|
|
|
|||
|
|
@ -1,13 +1,5 @@
|
|||
# Copy migration — brand-voice copy → `CloserCopy` [CLOSED]
|
||||
# Copy migration — brand-voice copy → `CloserCopy`
|
||||
|
||||
> **⛔ CLOSED (2026-07-11) — stopped by owner decision after Slice 1.** The ROI review concluded
|
||||
> pure copy-relocation wasn't worth the churn; effort went to higher-value work instead (server/
|
||||
> removal, benefit-list reconciliation). **Slices 2–4 are CANCELLED, not pending.** The catalog's
|
||||
> scope is frozen at paywall + subscription + age-gate (`ui/brand/CloserCopy.kt`). Also note: the
|
||||
> 2026-07-11 "Closer Couples" in-app prose rename REWROTE many strings quoted below (e.g. the
|
||||
> age-gate disclaimer is now "Closer Couples is an 18+ app.") — treat quoted copy as historical.
|
||||
> Rename record: `docs/NameChange.md`.
|
||||
>
|
||||
> Incremental migration of **brand-voice** hardcoded copy into the typed `CloserCopy` catalog.
|
||||
> Builds on the paywall + subscription slice (commit `51efff3f`). Status tracked per slice below.
|
||||
|
||||
|
|
@ -88,5 +80,4 @@ Three **domain-scoped** catalogs, by design (not a smell to unify):
|
|||
- **Slice 1 (age-gate): ✅ done.** Min-age error de-triplicated → `CloserCopy.AgeGate.ageError(minAge)`;
|
||||
both disclaimer variants + the duplicated DOB prompt consolidated. 6 call sites across
|
||||
SignUp{Screen,ViewModel} + CreateProfile{Screen,ViewModel} now source from the catalog. Compile clean.
|
||||
- Slices 2–4: **cancelled** (2026-07-11 close-out — see header). Several of their target strings were
|
||||
since edited in place by the "Closer Couples" prose rename instead.
|
||||
- Slices 2–4: pending.
|
||||
|
|
|
|||
|
|
@ -96,6 +96,6 @@ Removed the two unreferenced banner-like generated-art files so there is a singl
|
|||
- **Launcher untouched:** `app_name` in `strings.xml` and `CFBundleDisplayName` in `Info.plist` both still "Closer".
|
||||
- No build required (no source touched); optional `./gradlew :app:assembleDebug` still succeeds unchanged.
|
||||
|
||||
## Pre-existing issue noted (RESOLVED 2026-07-11)
|
||||
## Pre-existing issue noted (NOT fixed here)
|
||||
|
||||
The support-URL inconsistency (`couplesconnect.app` vs `closer.app`) is resolved in code — `ExternalLinks.kt` uses `https://closer.app/support`; `store-assets.md` §3 updated accordingly. Only the Play-console listing fields remain (set when the listing is created).
|
||||
`store-assets.md:106` — support URL `couplesconnect.app` vs the `closer.app` domain used elsewhere; unrelated to this rename, leave for separate cleanup.
|
||||
|
|
|
|||
|
|
@ -1,10 +1,5 @@
|
|||
# Date Planning Feature Roadmap
|
||||
|
||||
> **Status (stamped 2026-07-11): historical vision doc (2026-06-16); the core shipped.** Date Match,
|
||||
> Date Builder/Plan, Date Memories/Reflection, and match notifications are all live and QA-covered
|
||||
> (`ClaudeQACoverage.md` Pass N). Remaining ideas here are unscheduled product backlog — pull them
|
||||
> through `Future.md` if/when prioritized; don't treat this file as a commitment list.
|
||||
|
||||
## Vision
|
||||
|
||||
Build a complete Date Operating System for Closer — not a simple list of date ideas.
|
||||
|
|
|
|||
|
|
@ -1,11 +1,5 @@
|
|||
# Closer — Private MVP QA Checklist [SUPERSEDED]
|
||||
# Closer — Private MVP QA Checklist
|
||||
|
||||
> **Status (stamped 2026-07-11): SUPERSEDED — do not run this checklist.** The live QA system is
|
||||
> `ClaudeQAPlan.md` (playbook, passes A–P) with state in `ClaudeQACoverage.md` + `ClaudeReport.md`;
|
||||
> it covers everything here plus security/E2EE/notifications/billing depth this list predates. It
|
||||
> also references files since removed by the 2026-07-09 dead-file sweep. Kept only as a historical
|
||||
> record of the 2026-06 MVP pass.
|
||||
>
|
||||
> Manual testing checklist for the internal MVP build. Covers every top-level flow in the app and notes known gaps discovered during the 2025-06 QA pass.
|
||||
> Last updated: 2026-06-21 — reflects pairing security hardening, notification preferences, appearance screen, email invite removal, real PartnerHomeScreen, real SubscriptionScreen, ProGuard log stripping, strings.xml, and support URL fix. All 17 release blocker items resolved or pending deploy.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
# Batch 8 — Responsive Visual QA Code Review
|
||||
|
||||
> **Status (stamped 2026-07-11): completed historical batch (2026-07-02).** Its findings were fixed
|
||||
> and are regression-covered by the recurring QA rounds (`ClaudeQACoverage.md` Pass C/J). Reference
|
||||
> only — new responsive issues go through the live QA playbook, not this file.
|
||||
|
||||
## Scope
|
||||
Reviewed Compose UI files under `app/src/main/java/app/closer/ui/` for responsive layout issues:
|
||||
- Missing `maxLines` + `TextOverflow.Ellipsis` in constrained containers
|
||||
|
|
|
|||
|
|
@ -1,13 +1,6 @@
|
|||
# Closer — Internal Testing Build Checklist [SUPERSEDED]
|
||||
# Closer — Internal Testing Build Checklist
|
||||
|
||||
> **Status (stamped 2026-07-11): SUPERSEDED by `docs/release/store-assets.md` (§5 signing, §8
|
||||
> pre-launch) and the ship-readiness plan (`release_guide.md`, Phases 1–2b), which reflect the
|
||||
> current release-guard build config, keystore plan, and Play internal-testing path.** Also note a
|
||||
> factual error below: the applicationId is `closer.app` — `app.closer` is the code namespace (the
|
||||
> same swap that produced the Manage-subscription deep-link bug fixed in `4e807cb0`). Kept as
|
||||
> historical context only.
|
||||
>
|
||||
> Steps to prepare, sign, and distribute an internal testing build for the private MVP. Assumes Android Gradle Plugin 8.7.3, Kotlin 2.0.21, minSdk 26, targetSdk/compileSdk 35, and ~~`app.closer`~~ **`closer.app`** applicationId.
|
||||
> Steps to prepare, sign, and distribute an internal testing build for the private MVP. Assumes Android Gradle Plugin 8.7.3, Kotlin 2.0.21, minSdk 26, targetSdk/compileSdk 35, and `app.closer` applicationId.
|
||||
|
||||
Internal testing should verify the product goal: **private, mutual-reveal relationship questions with real encryption and calmer UX**.
|
||||
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ private rhythm for checking in, listening better, and making time for each other
|
|||
- [ ] Privacy policy URL defined and reachable: currently `https://closer.app/privacy`.
|
||||
- [ ] Terms of service URL defined and reachable: currently `https://closer.app/terms`.
|
||||
- [ ] Subscription terms URL defined and reachable: currently `https://closer.app/subscription-terms`.
|
||||
- [x] ~~Support URL migration in code~~ **done in code** (verified 2026-07-11): `ExternalLinks.kt` now uses `https://closer.app/support` (the old `couplesconnect.app` claim was stale). **Remaining action is console-only**: set the store-listing support URL / contact email to the `closer.app` values when the listing is created.
|
||||
- [ ] **Action needed**: Support URL currently points to `https://couplesconnect.app/support` in `ExternalLinks.kt`; migrate to `closer.app` domain and update store listing support/contact email.
|
||||
- [ ] All legal pages load over HTTPS.
|
||||
- [ ] Privacy policy accurately describes data collected (answers, FCM tokens, purchase data, couple pairing info).
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,5 @@
|
|||
# Code standardization & modernization review (2026-07-06)
|
||||
|
||||
> **Status (stamped 2026-07-11): point-in-time review; the "Applied" section shipped, the rest is
|
||||
> backlog.** Unapplied items overlap the refactor backlog tracked in `Future.md` (session-game
|
||||
> engine dedupe, DispatcherProvider injection, error-surfacing standardization) — `Future.md` is
|
||||
> the live list; this file is the evidence/rationale record behind it.
|
||||
|
||||
A grounded pass over the Android app (313 Kotlin files), Cloud Functions (TypeScript), and build. Each
|
||||
item is a *real, measured* inconsistency (with counts), not generic advice.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,5 @@
|
|||
# Closer iOS App — Architecture Audit
|
||||
|
||||
> **Status (stamped 2026-07-11): STALE in places — verify against current Android source before
|
||||
> porting.** Known drift since this was generated: the `server/` Express backend it references was
|
||||
> DELETED (Cloud Functions is the only backend); the RevenueCat webhook auth is now HMAC-SHA256
|
||||
> (`X-RevenueCat-Webhook-Signature`), not Ed25519; a 2026-07-09 dead-file sweep removed several
|
||||
> Android classes it may cite; in-app prose now reads "Closer Couples". iOS work is paused
|
||||
> (Android-only ship). Canonical architecture reference: `docs/Engineering_Reference_Manual.md`.
|
||||
>
|
||||
> Generated from the Android (Kotlin) codebase at `app/src/main/java/app/closer/`,
|
||||
> Cloud Functions at `functions/src/`.
|
||||
>
|
||||
|
|
|
|||
|
|
@ -7,11 +7,11 @@
|
|||
"icon_name": "favorite",
|
||||
"schema_version": "question_v2",
|
||||
"metadata": {
|
||||
"total_questions": 266,
|
||||
"free_questions": 90,
|
||||
"premium_questions": 176,
|
||||
"total_questions": 250,
|
||||
"free_questions": 75,
|
||||
"premium_questions": 175,
|
||||
"type_counts": {
|
||||
"written": 166,
|
||||
"written": 150,
|
||||
"single_choice": 40,
|
||||
"multi_choice": 20,
|
||||
"scale": 25,
|
||||
|
|
@ -5278,278 +5278,6 @@
|
|||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_251",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is one small thing I do that makes you feel quietly desired?",
|
||||
"depth": 2,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"desired",
|
||||
"small_moments",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_252",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is a flirty look that always lands for you?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"flirting",
|
||||
"looks",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_253",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What kind of small touch still gives you a little jolt?",
|
||||
"depth": 2,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"touch",
|
||||
"sparked",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_254",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is one thing I could wear that you would notice all night?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"visual",
|
||||
"notice",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_255",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is a smell that makes you want to be close to me?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"scent",
|
||||
"senses",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_256",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is a song that always makes you want to dance with me?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"music",
|
||||
"dance",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_257",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is one flirty text you would smile at on a random Tuesday?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"flirting",
|
||||
"text",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_258",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is a small surprise that would feel sweet before bed?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"surprise",
|
||||
"bedtime",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_259",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is one way to make our next hug last a little longer?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"hug",
|
||||
"closeness",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_260",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is a small voice-note that would make your whole day?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"voice_note",
|
||||
"small_gesture",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_261",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is one thing I do that makes you feel a little extra attractive?",
|
||||
"depth": 2,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"attractive",
|
||||
"noticed",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_262",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is the most playful way I could ask for a kiss?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"kiss",
|
||||
"playful",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_263",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is a tiny moment from this week that felt quietly romantic?",
|
||||
"depth": 2,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"romance",
|
||||
"small_moments",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_264",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is one ordinary thing we already do that flirts with me?",
|
||||
"depth": 2,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"flirting",
|
||||
"ordinary",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_265",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is the easiest way to make you laugh and feel close at once?",
|
||||
"depth": 1,
|
||||
"access": "free",
|
||||
"tags": [
|
||||
"laughter",
|
||||
"closeness",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sex_and_desire_266",
|
||||
"category_id": "sex_and_desire",
|
||||
"type": "written",
|
||||
"text": "What is one kind of playful challenge we could try this month?",
|
||||
"depth": 2,
|
||||
"access": "premium",
|
||||
"tags": [
|
||||
"playful",
|
||||
"challenge",
|
||||
"sex_and_desire",
|
||||
"fun_first"
|
||||
],
|
||||
"answer_config": {
|
||||
"max_length": 500
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue