# TV UI/UX Audit Methodology

## Grep Diagnostic Patterns

Run these scans on every audit pass. Record counts for trend tracking.

### Critical (must be 0)
```bash
rg -n 'FocusRequester\.Default' app/src/main/java --glob '*.kt'
rg -n 'moveFocus\(' app/src/main/java --glob '*.kt'
rg -n 'clearFocus\(force' app/src/main/java --glob '*.kt'
rg -n 'import androidx\.compose\.material3\.MaterialTheme' app/src/main/java --glob '*.kt'
rg -n 'import androidx\.compose\.material3\.Text' app/src/main/java --glob '*.kt'
```

### Major (should be decreasing)
```bash
rg -n 'tween\([^)]*durationMillis\s*=\s*[0-9]' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
rg -n 'spacedBy\([^)]*\.dp' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
rg -n 'RoundedCornerShape\([^)]*\.dp' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
rg -n 'BorderStroke\([^)]*\.dp' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
rg -n 'fontSize\s*=\s*[0-9]+\.sp' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
rg -n '\.padding\([^)]*\.dp[^)]*\)' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
rg -n 'Color\(0x' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
```

### Minor (acceptable but should trend down)
```bash
rg -n 'alpha\s*=' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
rg -n 'aspectRatio' app/src/main/java/com/unspooled/app/ui/screens --glob '*.kt'
rg -n 'semantics|contentDescription|stateDescription|Role\.' app/src/main/java/com/unspooled/app/ui --glob '*.kt'
```

## Scorecard Template

```
Build X — Scorecard

Visual Design:    X/20
TV Navigation:    X/20
Focus System:     X/20
Consistency:      X/15
Accessibility:    X/10
Performance:      X/10
Polish:           X/5
Total:            X/100

Top 20 Issues:
1. [Critical] Description — File:Line — Impact — Recommendation
2. ...

Regressions:
- Item that became worse

Competitor Gap:
- Netflix: ...
- Apple TV: ...
- Plex: ...
- Jellyfin: ...
- Stremio: ...
```

## OpenCode Plan Template

```markdown
# OpenCode task: Fix Top 20 Android TV UI/UX Audit Issues (Build X)

You are working in `/home/rurouni/Unspooled` on branch `master`.

Use model: DeepSeek Flash. This is a new OpenCode session.

## Goal
Implement fixes for the production UI/UX audit Top 20 issues.

## Constraints
- TV-FIRST APP. Use `androidx.tv.material3.*` — never `androidx.compose.material3.*`.
- No `moveFocus()`.
- Prefer `requestFocusAfterFrames()` in `LaunchedEffect`.
- Avoid `FocusRequester.Default`.
- Use `UnifiedTokens`, `NuvioTheme`, `TvLayoutMetrics`.
- Do not delete features. Do not perform broad unrelated refactors.

## Top 20 fixes required
1. **Issue name**
   - File: `path/to/File.kt:line`
   - Problem: `current code`
   - Fix: `desired code`

... (20 items)

## Verification
```bash
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
./gradlew :app:assembleDebug
```

## Final response expected
- Summary of implemented changes by issue number.
- Build result.
- Any issues intentionally left unresolved, with reason.
```

## Build Progression Tracking

Track score progression across builds:

| Build | Score | Delta | Key Changes |
|-------|-------|-------|-------------|
| A (baseline) | 54/100 | — | 6 critical D-pad blockers, 14 visual consistency issues |
| B (D-pad fixes) | 69/100 | +15 | Watchlist/History/Player More menu D-pad fixed |
| C (visual consistency) | 78/100 | +9 | Watchlist visual language, settings consolidation, empty states |
| D (hardcoded values) | 85/100 | +7 | Watched/PersonDetail/CloudManager/AddonUrlInput typography, spacing, borders |

Target: 90+/100 for production readiness.
