From 9cec1e7e09a6c5ffc6ae75efa0f54e458cd920e2 Mon Sep 17 00:00:00 2001 From: null Date: Sun, 28 Jun 2026 16:48:48 -0500 Subject: [PATCH] docs(qa): close Future.md onboarding + bucket-list items; record O-ONBOARD-001 in ClaudeReport (root cause was ic_launcher_foreground, not the background) --- ClaudeReport.md | 5 +++-- Future.md | 22 +++++----------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/ClaudeReport.md b/ClaudeReport.md index 8ac536d6..fa923f8b 100644 --- a/ClaudeReport.md +++ b/ClaudeReport.md @@ -18,6 +18,7 @@ > to the archived-ID line below (full detail stays in git history). See **Report hygiene** in `ClaudeQAPlan.md`. ## Run-state (current) +- **R18b (2026-06-28) — Future.md review → found+fixed a P0 (user: "review Future.md and do fixes if needed. verify bugs and why").** **O-ONBOARD-001 (P0) — onboarding CRASHES on the final slide for EVERY fresh install** (and the login/signup screen too). **Verified live before/after on `emulator-5558` (fresh, API 34):** old build → onboarding slide-3 `CtaSlide` → `FATAL EXCEPTION: java.lang.IllegalArgumentException: Only VectorDrawables and rasterized asset types are supported` at `PainterResources…loadVectorResource` ← `OnboardingScreen.kt:246`; fixed build → CtaSlide renders the logo + "Create account", and the signup screen (AuthLogoMark) renders too — full onboarding→signup reachable, 0 FATAL. **Why (root cause, git-confirmed):** `ic_launcher_foreground.xml` was a `` until commit **334cb07 "brand: update app icon"** which swapped it to a **``** wrapper; `painterResource` routes any `.xml` drawable through the VectorDrawable loader, which throws on a `` root. The two Compose call sites — `OnboardingScreen.kt` `CtaSlide` + `AuthVisuals.kt` `AuthLogoMark` — weren't updated. **Regression invisible to recurring QA** because 5554/5556 are past onboarding + logged-in (signed up before 334cb07); every fresh install since crashes. (Future.md's root-cause guess — background/aapt quirk — was wrong.) **Fix:** both sites now `painterResource(R.drawable.closer_launcher_foreground)` (the raster the `` wraps; same pattern `LoadingState.kt:146` already uses); the `` XML stays for the real adaptive launcher icon. Scanned the whole app — **no other `painterResource`-on-non-vector-XML remains** (only `ic_launcher_foreground`/`_monochrome` are ``; monochrome isn't used via painterResource). Also fixed the remaining BucketList **add-FAB** hardcoded `Color(0xFFB98AF4)` → `MaterialTheme.colorScheme.primary` (closes the Future.md "BucketList mixed dark/light" item — dialog was R16, FAB was the leftover; verified live light). **Build clean; 205 unit + 24 functions green; all 3 emulators on the fixed APK.** Uncommitted (user commits): `OnboardingScreen.kt`, `AuthVisuals.kt`, `BucketListScreen.kt`, docs. NEXT: prune O-ONBOARD-001 after 1 confirm; add the onboarding route to `qa/entrypoint_smoke.sh` + a scanner guard for `painterResource` on non-vector XML (regression-prevention). - **R18 (2026-06-28) — continuing full run (user: "why are you stopping?" → don't hand back at checkpoints).** Both emulators online (5554=Dark, 5556=Light, both reset to Device-default after testing); package is `closer.app` (launcher `closer.app/app.closer.MainActivity`). **C-DARKART-002 FIXED + verified live across all 4 theme/art states** (see Severity-board R18 note + the issue row): `MainActivity` now drives `AppCompatDelegate.setDefaultNightMode` from `ThemeMode` (sync initial read → no flicker loop; `LaunchedEffect` for runtime toggles), so every `painterResource` + BrandIllustration follows the in-app theme via the real Configuration uiMode. The previously-broken **pack-art banners now render DARK** in decoupled in-app-Dark + system-light, and the Today hero does too; symmetric in-app-Light + system-dark → light; both coupled states correct. **C-DARKART-001 re-confirmed.** The test-suite gate also caught **TEST-002** (flaky `MemoryCapsuleGenerator` determinism test — un-injected `System.currentTimeMillis()` clock violated the documented "pure" contract; **no production caller yet** so zero runtime impact, but it intermittently reddened the suite) → fixed by injecting `createdAtMillis`. **Build clean; 205 unit + 24 functions green.** Uncommitted (user commits): `MainActivity.kt`, `MemoryCapsuleGenerator.kt` (+ its test), `ClaudeReport.md`. DONE this round: **Pass A ✅ / B ✅ / E ✅ / L ✅ / P ✅** + **M-001 confirmed** (recommend prune). NEXT: prune C-DARKART-002 / TEST-002 / P-GRAMMAR-001 / M-001 after this confirm round; resolve **O-AGE-001** (P2 pre-ship age gate — product call); P3 backlogs (BRAND-DARK-COVERAGE, BRAND-ICON-CUSTOM, C-ORIENT-001); optional deeper re-runs of F/G/I (last full sweep R12). Board: **0 open P0/P1 · 1 open P2 (O-AGE-001) · 3 open P3**. **Pass A ✅ (R18, live, Sam free on 5556 — both members confirmed free via admin read):** premium gate enforced across **two distinct surfaces** — Desire Sync (game) → Paywall, premium **Boundaries** pack → Paywall; negative control: **Mixed** "Communication" pack opens and a **free prompt is accessible** (answer composer shown), so the gate isn't over-broad; **Free** filter shows a graceful "Nothing in free yet" empty state (catalog note: no fully-free packs). Paywall billing plans don't load on the non-GMS emulator ("Couldn't load plans / Try again") — expected Pass K env limit, degrades gracefully (no crash). - **R17 (2026-06-28) — continuing full run (user: "complete full run, don't stop").** Both emulators on R16 build (5554=Dark, 5556=Light); HEAD `8b7bbc2` + working-tree fixes. **Theme fixes confirmed LIVE (dark, 5554):** C-THEME-005 (Wheel-History lock → surfaceVariant/primary), C-THEME-008/009 (Date-Match heart→primaryContainer + count badge→error) — joining 001/002 from R16. **NEW finding C-DARKART-002 (P2):** dark-variant art doesn't render in the decoupled in-app-Dark + system-light state — pack art (`QuestionPackLibraryScreen:223` via `packArtworkRes`) + ~7 literal `painterResource` sites resolve `-night` off SYSTEM uiMode, not the in-app theme; **proven live** (in-app-Dark + system `auto` → light pack art; system night=yes → correct dark art). The BRAND-DARK-COVERAGE batch art is correct but only shows under system-night. **Pass D1 at-rest = CLEAN (admin read R17):** messages `text`, `lastMessagePreview`, Memory Lane capsule content+title, **all 4 game answers (this_or_that/desire_sync/how_well/wheel) + date_swipe `action`** all `enc:v1:`; only metadata in clear. **Pass D3 = CLEAN (live raw-API R17):** minted non-member token → couple doc / messages / capsules / desire_sync reads + premium self-grant all **DENIED 403** (`scratchpad/d3_negative.js`). **C-DARKART-002 fully diagnosed** (routing through BrandIllustration is insufficient — `createConfigurationContext` doesn't resolve `-night` for these resources; recommended fix = sync config uiMode to in-app theme; my probe edit reverted; tree clean; build+units green; theme-scan CRIT still 0). NEXT (R18): **C-DARKART-002 fix** (uiMode-sync, architectural) + re-verify C-DARKART-001 holds; **M-001** quiet-hours backgrounded-push re-test → prune; live-confirm C-THEME-004 + light-side spot-check; then Pass A (premium gate) / B (a game) / E (full notif) / L / P. Cornerstones D1+D3 ✅ this round. - **R16 (2026-06-28) — full ClaudeQAPlan run STARTED.** Session-start: both emulators online (5554/5556), HEAD `8b7bbc2`, working tree carries a **dark-variant art batch** (pack_art_*_dark, together_empty/tonight_partner_prompt night variants → BRAND-DARK-COVERAGE progress) + my doc edits; baseline TBD. **Cheap gates (new step 3):** functions tests **24/24 ✅**; Android unit tests **found 5 failures → FIXED → 205 ✅** (**TEST-001**, test-vs-code drift: (a) `PartnerNotificationManagerTest` stubbed `isInQuietHours(any())` but the method's default `now: Calendar` param pinned a stale instant that never matched the call-time clock → stub now `any(), any()`; (b) `CloserBrandCopyTest` ≤64 cap predated the intentional 150-char flagship `primaryMessage` — `BrandMessageRotator` wraps it `maxLines=3` — → cap now applies to short slogans only, flagship bounded `1..160`. Both **test-side only**; production correct: quiet hours verified live R15, flagship is committed design `6d74c6a`). **theme-scan** 🔴9/🟠8/🟡32 (the 9 CRITICAL = C-THEME-001..009 already filed). **wiring-scan** 🔴0/🟠20/🟡35 (🔴0 = Pass N DoD met). **Done so far:** rebuilt+installed both; **smoke 5554 = 6/6 PASS, 0 blocked** (launcher + 5 notif cold-starts open & stay), 5556 in progress. **Theme triage — of the 9 filed C-THEME, 3 are NOT real shipped defects:** C-THEME-003 = `@Preview`-only (`WheelRevealPreview`) → false positive; theme-scan now **excludes @Preview** composables. C-THEME-006/007 = dead unused `PlaceholderScreen.kt` (replaced by the real dashboard; 0 source refs) → **file deleted**. **The other 6 are real → FIXED** (theme tokens): BucketList (badge→primaryContainer; AddItemDialog surface→surface + Cancel→secondaryContainer + Add→primary + CategoryChips→primary/surfaceVariant — also closes the Future.md "mixed dialog" note), DateMatch (heart→primaryContainer, count badge→error/onError), WheelHistory (lock→surfaceVariant/primary), QuestionThread (waiting banner→surfaceVariant). **theme-scan CRITICAL 9→0; build + unit tests green.** **R16 RESULT:** smoke **6/6 both (0 blocked)**; theme-scan **CRITICAL 9→0** (3 reclassified, 6 fixed); **C-THEME-001/002 + N-001 + N-002 verified LIVE (dark, 5554)**; units **205** + functions **24** green; dead `PlaceholderScreen.kt` deleted; theme-scan now excludes `@Preview`. **N-001/N-002 pruned.** Open now: **O-AGE-001** (P2 pre-ship) + 3 P3. **NEXT (R17):** live-confirm the 4 remaining C-THEME fixes (004/005/008/009) in both themes + the 6 in LIGHT on 5556; re-test **M-001** quiet-hours (backgrounded-push) to prune it; then resume passes A–N+P — esp. a live both-theme sweep of the new **dark-art batch** (BRAND-DARK-COVERAGE) + the D/E cornerstones. Uncommitted (user commits): unit-test fixes, 4 theme-fixed screens + BucketList/DateMatch, `scripts/theme-scan.sh`, **deleted** `PlaceholderScreen.kt`, dark-art batch, QA docs. @@ -48,10 +49,10 @@ ## Severity board | Severity | Open | Fixed (pending 1 confirm) | |---|---|---| -| P0 | 0 | 0 | +| P0 | 0 | **1** (**O-ONBOARD-001** onboarding/auth crash on every fresh install — fixed + verified live before/after on 5558) | | P1 | 0 | 0 | | P2 | **1** (O-AGE-001 pre-ship) | **9** (6× C-THEME fixed, M-001 quiet hours, TEST-001 unit suite, **C-DARKART-002** decoupled dark-art — fixed+verified R18) | -| P3 | **3** (BRAND-DARK-COVERAGE, BRAND-ICON-CUSTOM, C-ORIENT-001) | **2** (TEST-002 flaky capsule-determinism test; P-GRAMMAR-001 13 stress-Q subject-verb agreement errors — fixed in asset) | +| P3 | **3** (BRAND-DARK-COVERAGE, BRAND-ICON-CUSTOM, C-ORIENT-001) | **3** (TEST-002 flaky capsule-determinism test; P-GRAMMAR-001 13 stress-Q agreement errors — asset fix; BucketList FAB hardcoded→`primary`) | _R16: ran the new **cheap gates** → found+fixed **TEST-001** (unit suite was silently red, 5 failures) → **205 unit + 24 functions green**. **Entrypoint smoke 6/6 on BOTH emulators, 0 blocked.** Theme triage: of the 9 filed C-THEME, **3 were diff --git a/Future.md b/Future.md index 6c8a6323..beb225c8 100644 --- a/Future.md +++ b/Future.md @@ -4,24 +4,12 @@ Non-blocking ideas: things that work today but could be better, plus feature ide (broken/incorrect behavior) live in `ClaudeReport.md`, not here. ## UI -Themes -- **🚨 P0 — Onboarding CRASHES on slide 3 (and on Skip) — blocks every first-run user from reaching login.** Discovered 2026-06-28 on a fresh `emulator-5558` install (Pixel 7 Pro, API 34, KVM hw accel). Slides 1 + 2 render fine; tapping **Next** on slide 2 → slide 3 → `FATAL EXCEPTION: main` → app dies back to the launcher. Tapping **Skip** (which jumps to a later slide) also crashes. Existing QA emulators (`5554`/`5556`) never hit this because they're past onboarding with logged-in users — **this regression is invisible to recurring QA and hits every new install.** - - **Stack:** `java.lang.IllegalArgumentException: Only VectorDrawables and rasterized asset types are supported ex. PNG, JPG, WEBP` at `androidx.compose.ui.res.PainterResources_androidKt.loadVectorResource` from `app.closer.ui.onboarding.OnboardingScreenKt.CtaSlide(OnboardingScreen.kt:246)`. - - **Root cause:** line 246 calls `painterResource(R.drawable.ic_launcher_background)`. The XML is a valid `` (108dp square with 4 gradient paths), but `painterResource` rejects it at runtime on API 34 — likely an aapt/adaptive-icon bundling quirk where the launcher-background resource resolves to something other than `VectorDrawable`/`BitmapDrawable`. - - **Fix options** (any one closes it): (a) swap to `Image(painter = ImageVector.vectorResource(...))`, (b) drop the decorative launcher icon entirely and use a solid `Color`/`Brush` matching the brand, (c) rasterize the background to a PNG and `painterResource` that, (d) use `LocalContext.current.getDrawable(R.drawable.ic_launcher_background)` wrapped in `runCatching`. - - **Re-introduction risk / regression-prevention:** add an onboarding route to `qa/entrypoint_smoke.sh` (the cold-start/launch-integrity smoke) so the `am kill` → notification path covers the entire onboarding flow, not just the post-login launch. Also consider a `theme-scan.sh` Tier 2 check: flag `painterResource(R.drawable.ic_launcher_*)` outside `BrandIllustration` / `OnboardingScreen` review. - - **Verification before close:** fresh AVD → install → tap Next through all onboarding slides + tap Skip from slide 1 → assert no FATAL, login screen reachable. Repeat on `5554` and `5556` (dark + light). - - **Note (project convention):** `Future.md`'s header says actual bugs belong in `ClaudeReport.md`. Filing here per explicit user request 2026-06-28 — recommend also adding a `O-ONBOARD-001` row to `ClaudeReport.md` with the same repro + fix options so it shows up in the recurring QA pass sweep. (The current working-tree `ClaudeReport.md` has uncommitted R17 edits — leaving it alone until the user commits/stashes.) - -- **"Add to Bucket List" has mixed dark/light mode UI.** The input field, button, and surrounding elements use - light-mode colors even when the app is in dark mode. Needs theme alignment. +_(No open UI defects. The P0 onboarding/auth crash filed here 2026-06-28 was fixed + verified live and moved to +`ClaudeReport.md` as **O-ONBOARD-001** — root cause was `painterResource` on the `` `ic_launcher_foreground` +(not the background, as originally guessed); fixed both `OnboardingScreen.CtaSlide` + `AuthVisuals.AuthLogoMark` to use +the raster `closer_launcher_foreground`. The "Add to Bucket List mixed dark/light" item is also fully resolved — dialog +tokens R16, add-FAB `Color(0xFFB98AF4)`→`primary` R18.)_ ## QA