docs(qa/brand): update ClaudeBrandingReview + ClaudeReport
This commit is contained in:
parent
3ae3f36ad4
commit
2aaeef3d45
|
|
@ -15,10 +15,12 @@ verify.
|
|||
`illustration_streak_milestone` — which rule 1 exempts *if* they read on both themes (verify, don't assume). Decoupled
|
||||
in-app-Dark + system-Light now renders the dark art correctly app-wide after the **C-DARKART-002** fix (see below), so
|
||||
the "light/pink art on a dark screen" defect class is closed for these surfaces.
|
||||
- **Backlog 2 (custom glyphs) — assets DONE, wiring MOSTLY OPEN.** **~63 `glyph_*.xml` now exist** (the entire icon
|
||||
backlog below has been created), but only **23 distinct glyphs are wired in code** and **~196 generic `Icons.*` call
|
||||
sites remain unreplaced** (ArrowBack ×31, Lock ×17, Person ×16, Favorite ×12, Check ×11, …). So this is no longer
|
||||
"make glyphs" — it's a **code task: swap each `Icons.*` for the already-made `glyph_*`** (rule 2). See the icon table.
|
||||
- **Backlog 2 (custom glyphs) — ✅ DONE (2026-06-28).** Every generic Material icon has been replaced with a Closer
|
||||
glyph: **0 `Icons.*` call sites and 0 `androidx.compose.material.icons` imports remain** (was 187 across ~49 distinct
|
||||
icons). Wiring goes through a central `ui/components/CloserGlyphs.kt` accessor object (`@Composable` getter vals →
|
||||
`ImageVector.vectorResource(R.drawable.glyph_*)`), used by 53 files; `CategoryGlyph.kt` resolves category glyphs the
|
||||
same way. Build + 205 unit tests green; verified live both themes (back, check, close, lock, chat, heart, photo,
|
||||
camera, mic, category badges all render with correct tint). **BRAND-ICON-CUSTOM is resolved.**
|
||||
- **C-DARKART-002 (theming mechanism, fixed 2026-06-28):** `MainActivity` now drives `AppCompatDelegate.setDefaultNightMode`
|
||||
from the in-app `ThemeMode`, so the real Configuration `uiMode` follows the app theme and **all** art resolution —
|
||||
`painterResource` AND `BrandIllustration`, `drawable-night*` included — follows the in-app theme. This supersedes the
|
||||
|
|
@ -75,16 +77,12 @@ removal candidate. **Debug-only now:** `illustration_quiet_hours` was removed fr
|
|||
> to get the right `-night` variant. `scripts/painter-xml-scan.sh` (crash guard) + Pass C's decoupled check (system-light +
|
||||
> in-app-Dark) remain the per-round guards.
|
||||
|
||||
## Icon/glyph audit — glyphs are MADE; the open work is WIRING them (swap `Icons.*` → `glyph_*`)
|
||||
> Re-audited against the code 2026-06-28: **~63 `glyph_*.xml` now exist — the entire list below has been created** — but
|
||||
> the code still has **~196 generic `Icons.*` call sites** and only **23 distinct glyphs are wired**. Brand rule #2 is
|
||||
> therefore now a **CODE task, not asset work**: replace each `Icons.*` with `ImageVector.vectorResource(R.drawable.glyph_*)`
|
||||
> + `Icon(tint=…)`. The "(≈uses)" counts below are the **remaining unreplaced** Material call sites (2026-06-28).
|
||||
> **Already wired (23):** paired_cards · how_well · sealed_answer · connection_challenge · memory_capsule · date_card_heart
|
||||
> · question_packs · bucket_list · past_games · spin_wheel · couple_premium · privacy_lock · delete_account · couple ·
|
||||
> daily_card · forward · home · lock · play · settings · streak · chat · closer_heart_keyhole. **NB:** `lock`, `play`,
|
||||
> `forward`, `home` are wired in *some* places but Material equivalents (`Icons.Filled.Lock` ×17, `PlayArrow` ×5,
|
||||
> `ArrowForward` ×8, `Home` ×1) still linger — finish those swaps. Every glyph named in the table below already exists.
|
||||
## Icon/glyph audit — ✅ COMPLETE (every Material icon is now a Closer glyph)
|
||||
> Done 2026-06-28: all 187 `Icons.*` call sites (~49 distinct icons) were swapped to `glyph_*` via the central
|
||||
> `CloserGlyphs` accessor; **0 `Icons.*` and 0 `androidx.compose.material.icons` imports remain.** The table below is kept
|
||||
> for the historical mapping (Material icon → glyph) and as the reference for any *new* icon added later: never introduce a
|
||||
> raw `Icons.*` — add a `CloserGlyphs` accessor + `glyph_*.xml` instead. A `scripts/` guard that fails on any `Icons.`
|
||||
> call site would keep this at zero (recommended).
|
||||
|
||||
| Generic icon (≈remaining uses) | Used for | Wire to `glyph_*` (✅ asset exists) |
|
||||
|---|---|---|
|
||||
|
|
@ -321,9 +319,8 @@ Legend: ✅ on-brand / no art needed · ➕ reuse/wire existing art · 🔤 bran
|
|||
1. **Dark illustration variants — ✅ DONE.** `drawable-night-nodpi/` has a dark variant for every non-transparent
|
||||
surface (all 22 `illustration_*` + all 10 `pack_art_*`). Remaining: verify the 3 transparent celebration assets
|
||||
(`premium_unlock`, `spin_wheel`, `streak_milestone`) read on dark, and Pass-C spot-check the new variants.
|
||||
2. **Custom glyphs — ✅ ASSETS DONE, ⚠️ WIRING OPEN.** ~63 `glyph_*.xml` exist (the full backlog is created), but
|
||||
**~196 generic `Icons.*` call sites are still unwired** and only 23 glyphs are referenced in code. The open task is a
|
||||
**code swap** — replace each `Icons.*` with `ImageVector.vectorResource(R.drawable.glyph_*)` — not new asset work.
|
||||
2. **Custom glyphs — ✅ DONE.** Assets created AND wired: all 187 `Icons.*` call sites swapped to `glyph_*` via the
|
||||
central `CloserGlyphs` accessor; 0 Material icons / 0 material-icon imports remain. BRAND-ICON-CUSTOM resolved.
|
||||
|
||||
Do not regenerate **completed** illustration/glyph art unless a QA pass logs a specific defect.
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@
|
|||
| 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) | **3** (TEST-002 flaky capsule-determinism test; P-GRAMMAR-001 13 stress-Q agreement errors — asset fix; BucketList FAB hardcoded→`primary`) |
|
||||
| P3 | **2** (BRAND-DARK-COVERAGE [assets present; Pass-C spot-check pending], C-ORIENT-001) | **4** (TEST-002 flaky capsule-determinism test; P-GRAMMAR-001 13 stress-Q agreement errors — asset fix; BucketList FAB hardcoded→`primary`; **BRAND-ICON-CUSTOM** — all 187 Material icons → Closer glyphs) |
|
||||
|
||||
_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
|
||||
|
|
@ -127,7 +127,7 @@ routed correctly, so that was a test artifact, not a bug.)_
|
|||
| M-001 | P2 | Settings / notifications | **Quiet hours did not suppress backgrounded/killed partner pushes.** "Quiet hours — 10 PM–8 AM, no notifications" was stored **local-only** (DataStore); partner pushes carry a `notification` block the OS shows directly when the recipient is backgrounded/killed, and the only client check (`PartnerNotificationManager.isInQuietHours`) runs **foreground-only** (`AppMessagingService.onMessageReceived`). So the "no notifications" promise was broken for the main case. Repro: Sam QH ON @22:28 CST, backgrounded → QA chat → "QA sent a message" posted to Sam's shade. | Client mirrors window+tz to `users/{uid}`; Cloud Functions (`onMessageWritten`/`onAnswerWritten`/`onAnswerRevealed`/`onGameSessionUpdate`) suppress via fail-open `notifications/quietHours.ts:recipientInQuietHours()`; `firestore.rules` user-doc allowlist extended for `quietHours*`+`timezone`. | **Fixed — verified live R15** (fn log suppress vs notify; deployed prod). Pending 1 confirm. |
|
||||
| TEST-001 | P2 | QA infra / unit tests | **Unit suite was silently RED (5 failures) — the regression net was non-functional, undetected until R16 ran it for the first time** (test-vs-code drift). (a) `PartnerNotificationManagerTest` (4×) stubbed `quietHoursManager.isInQuietHours(any())`, but the method's default `now: Calendar = Calendar.getInstance()` param made the stub pin the instant captured at stub time → never matched the SUT's call-time clock → `MockKException`. (b) `CloserBrandCopyTest` asserted every privacy message `≤64` chars, which predated the **intentional** 150-char flagship `primaryMessage` (commit `6d74c6a`; `BrandMessageRotator` wraps it at `maxLines=3`). | **Test-side only** (production correct: quiet hours verified live R15; flagship is committed design). Stub → `isInQuietHours(any(), any())`; brand test caps short slogans `≤64` + flagship `1..160`. | **Fixed — verified R16** (`./gradlew testDebugUnitTest` 205 ✅, functions 24 ✅). Pending 1 confirm. |
|
||||
| BRAND-DARK-COVERAGE | P3 | Art / theme | Most illustrations are **light-only** — only 12 of ~25 have a `drawable-night-nodpi/` dark variant. All `illustration_couple_*` heroes (paywall/subscription/onboarding/invite/history), `daily_question`, `partner_activation`, `tonight_partner_prompt`, `together_empty`, and **all 10 `pack_art_*` banners** show the **light/pink image on a dark screen** (feathered edges don't change the image colors). | Generate dark/aubergine-palette variants for each light-only asset → `drawable-night-nodpi/` (identical filename); `BrandIllustration` auto-selects per in-app theme. Re-run the decoupled-theme check. List in `ClaudeBrandingReview.md`. | **Open (P3)** |
|
||||
| BRAND-ICON-CUSTOM | P3 | Icons / brand | **~60 distinct generic Material icons** across ~201 call sites (generic hearts `Favorite`/`FavoriteBorder`, `Person`, `Lock`, `Star`, `PlayArrow`, `ArrowBack`, …) — these are placeholders, not the Closer brand. | Replace each with a bespoke `glyph_*` in the house style (`ImageVector.vectorResource` + `Icon(tint)`), highest-traffic first; ship bar = **0 generic Material icons**. Backlog table in `ClaudeBrandingReview.md`. | **Open (P3)** |
|
||||
| BRAND-ICON-CUSTOM | P3 | Icons / brand | **~60 distinct generic Material icons** across ~201 call sites (generic hearts `Favorite`/`FavoriteBorder`, `Person`, `Lock`, `Star`, `PlayArrow`, `ArrowBack`, …) — these are placeholders, not the Closer brand. | Replace each with a bespoke `glyph_*` in the house style (`ImageVector.vectorResource` + `Icon(tint)`), highest-traffic first; ship bar = **0 generic Material icons**. Backlog table in `ClaudeBrandingReview.md`. | **FIXED (R18, 2026-06-28)** — all 187 `Icons.*` call sites (~49 distinct) swapped to `glyph_*` via central `ui/components/CloserGlyphs.kt` (+ `CategoryGlyph.kt`); **0 `Icons.*` / 0 material-icon imports remain**; build + 205 tests green; verified live both themes. Pending 1 confirm. |
|
||||
|
||||
## Resolved & confirmed (archived — full detail in git history)
|
||||
A-001 · A-003 · **A-201** · A-OBS · B-001 · B-002 · B-003 · B-004 · C-CC-001 · **C-DARKART-001** · **C-DARK-UI-001** · **C-DARK-UI-002** · **C-DARK-UI-003** · C-DS-001 · **C-ART-EDGE-001** · **C-ART-EDGE-002** · **C-HOME-001** · **C-NAV-001** · **C-NAV-002** · **C-NAV-003** · **C-PW-001** · **C-SEC-001** · D-001 · E-001 · E-002 · E-003 · **E-GAME-002** · **E-GAME-003** · E-OBS · F-OBS · F-RACE-001 · **I-001** · **I-002** · **J-OBS** · **N-001** · **N-002** — all fixed and re-verified (R16 pruned **N-001** [Bucket List non-functional → CRUD works; confirmed live add/delete] + **N-002** [Date Builder no-op → Home "Date coming up"; confirmed live]) (R14 pruned the 5 R13 fixes — **C-DARK-UI-001** ToT dark redesign · **C-DARK-UI-002** check-in label/value · **C-DARK-UI-003** bottom-inset clearance · **C-ART-EDGE-002** 8 opaque heroes feathered · **J-OBS** 48dp touch targets — held through R14's full A–J sweep; in working tree) (R13 pruned **A-201** [Date-Match premium ideas ungated → now gated to Paywall via `CouplePremiumChecker`] — fixed R12, confirmed live R13; in working tree) (R12 pruned C-DARKART-001 [in-app-theme `-night` art] + C-ART-EDGE-001 [feathered edges] — fixed R11, held through R12 visual sweep; in working tree) (R11 pruned the 5 R10 P2 fixes — C-HOME-001 single Home card · C-NAV-002 `popUpTo(WHEEL_SESSION){inclusive}` present + R10-live · C-NAV-003 single app bar re-confirmed live · C-PW-001 dark paywall pills legible re-confirmed live · C-SEC-001 recovery row active for accepter re-confirmed live — all committed in `9c84c36`; E-GAME-003 `onGamePartFinished` deployed + committed `2cd0af6`) (E-GAME-002 confirmed live R10: `startNotifiedAt` set + partner_started_game queued to right partner + foreground banner + Join→joined active ToT at same Q1; commits 6e79cd9/38fdc6d) (commits in history; F-RACE-001 re-confirmed R8; **I-001** query→`whereIn(dayKeys)` + **I-002** Long-score→`Number.toInt()`, fixed `ab29f6b`, re-confirmed live R9: 0 outcomes denials/CCE). Pruned per the one-confirmation-round rule. (C-OBS / `outcomes` list / SubscriptionScreen per-user gate = investigated, **not bugs**.)
|
||||
|
|
|
|||
Loading…
Reference in New Issue