android-review
Revisar Android de Rally Copilot sin modificar (lifecycle, background, permissions, location, audio) con findings por severidad; no arquitectura (architecture-review) ni implementar.
SKILL.md.claude/skills/android-review/SKILL.md
GitHubandroid-review
Revisión de solo lectura de :app según $ARGUMENTS. Devuelve findings; no modifica código. Sin argumento, recorrer los cinco ámbitos en orden: lifecycle, background, permissions, location, audio.
Cuándo usarla
- El diff toca ViewModels, pantallas Compose, el servicio de ubicación, la voz,
AndroidManifest.xmlo receivers. - Antes de cerrar una tarea Android.
Cuándo NO usarla
- Fronteras de módulos, capas o flujo de datos →
architecture-review. - Implementar o corregir lo hallado → agente de ingeniería correspondiente o
bugfix-flow.
Precondiciones
- Rama con cambios respecto a
maino commits locales; sin diff, revisar el estado actual de:app. - Decisiones aplicables:
docs/DECISIONES.md(ubicación sin Google Play Services, offline por defecto, TTS on-device). - Concurrencia o lifecycle complejos (Flow compartidos, scopes manuales) → escalar a revisión de arquitectura.
Pasos
- Delimitar:
git diff main...HEAD --stat(ogit diff HEAD~N) sobreapp/; leer los archivos del ámbito. - Aplicar la lista del valor de
$ARGUMENTS:
| Valor | Comprobar |
|---|---|
lifecycle |
Estado en ViewModel (StateFlow con stateIn(WhileSubscribed(5000))), sin Context/Activity retenidos; collectAsStateWithLifecycle; eventos por Channel sin pérdida; LaunchedEffect/DisposableEffect con claves y onDispose; sin GlobalScope; dispatchers inyectados; navegación y cronómetro sobreviven a rotación y muerte de proceso (estado en Room/servicio, no solo en la UI) |
background |
Foreground service tipo location iniciado desde la UI; notificación persistente; sin hilos/Timer ad hoc; trabajo pesado (cálculo de notas, rutas) fuera del hilo principal; parada ordenada |
permissions |
Mínimo en el manifest, sin huérfanos; ubicación precisa pedida en contexto con rationale, aproximada y denegación permanente tratadas; POST_NOTIFICATIONS; FOREGROUND_SERVICE_LOCATION; sin ACCESS_BACKGROUND_LOCATION no decidido; componentes exported justificados; sin coordenadas en logs |
location |
LocationManager sin Google Play Services; frecuencia y precisión acordes; detección de pérdida de señal y saltos; filtrado de fixes malos; batería; trazas guardadas solo en el dispositivo |
audio |
TTS on-device; audio focus con ducking (AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) y liberación al terminar; cola de frases sin solapes; modo silencio respetado; AudioAttributes de navegación (USAGE_ASSISTANCE_NAVIGATION_GUIDANCE) |
- Cada hallazgo con
archivo:líneaexacto y una corrección concreta. Lo no verificable en el código se pide confirmar, no se afirma. - Contrastar con las herramientas: ejecutar la validación y atribuir fallos al cambio.
- Emitir findings por severidad (CRITICA, ALTA, MEDIA, BAJA) y veredicto: limpio / con avisos / bloquea. Navegación o voz que se detienen con la pantalla apagada, o coordenadas filtradas: mínimo ALTA.
Validaciones / tests
./gradlew lintDebug testDebugUnitTesty./gradlew ktlintCheck detekt.- Comportamiento revisado sin test: finding MEDIA.
Definition of Done
- Ámbito de
$ARGUMENTS(o los cinco) recorrido por completo. - Findings
SEVERIDAD | archivo:línea | problema | corrección propuesta, ordenados por severidad. - Ningún archivo modificado; veredicto emitido.
- Escalado a revisión de arquitectura si hay concurrencia/lifecycle complejo.
- Gate
./gradlew ktlintCheck detekt lintDebug testDebugUnitTestejecutado (o fallo atribuido).
Docs a actualizar
- Ninguno si el veredicto es limpio;
registrar-decisionsi se acuerda un cambio de enfoque · docs/ESTADO.md (skillsession-handoff)