Files
pluriwave/openspec/changes/eq-device-autoswitch-ux/verify-report.md
T
FreeTLab bccc5c48b8
Build & Deploy PluriWave / Análisis de código (push) Successful in 38s
Build & Deploy PluriWave / Build APK + AAB release (push) Successful in 2m30s
docs(openspec): add SDD artifact trail for recent alarm and EQ changes
Persist the exploration, proposal, spec, design, tasks, and
verify/archive reports produced during the multi-device EQ,
alarm-countdown, and notification-visual-polish SDD cycles.
2026-07-04 12:42:11 +02:00

135 lines
4.7 KiB
Markdown

# Verify Report: EQ Device Auto-Switch UX
**Change**: eq-device-autoswitch-ux
**Date**: 2026-06-28
**Verdict**: PASS WITH WARNINGS
---
## Build / Test Evidence
| Check | Result |
|-------|--------|
| flutter test | 223 tests — ALL PASS |
| flutter analyze | No issues found |
---
## Task Completeness
| Phase | Status | Notes |
|-------|--------|-------|
| 1 Service layer | COMPLETE | All [x] |
| 2 State layer | COMPLETE | All [x] |
| 3 UI layer | PARTIAL | 3.3 and 3.9 deferred |
| 4 L10n | PARTIAL | ARBs written for only 6 of 13 locales |
| 5 Cleanup | COMPLETE | All [x] |
---
## Spec Compliance Matrix (18 scenarios)
### Startup device initialization
| Scenario | Test | Status |
|----------|------|--------|
| Correct preset at startup — device known | 2.1 | PASS |
| First-seen device bootstrapped at startup | 2.2 | PASS |
| obtenerDispositivoActual() fails gracefully | 2.3 | PASS |
| Toggle off — no device query at startup | 2.4 | PASS |
### Device name persistence
| Scenario | Test | Status |
|----------|------|--------|
| Rename persists across restarts | 1.2 + 1.3 | PASS |
| Rename is immediately readable | 2.6a | PASS |
| Empty name is not persisted | 2.6b | PASS |
| Feature toggle off — no name storage | NO TEST | FAIL |
### Display name fallback chain
| Scenario | Test | Status |
|----------|------|--------|
| Custom name wins over platform name | 2.8a | PASS |
| Platform name used when no custom name | 2.8b unit test | PASS (unit only) |
| Device ID used as last resort | 2.8c | PASS |
### Connection status indicator
| Scenario | Test | Status |
|----------|------|--------|
| Active device shows green indicator | 3.1 | PASS |
| Indicator updates after device change | Implicit only | PARTIAL |
| No indicator when toggle is off | 7.1-A | PASS |
### Device edit modal
| Scenario | Test | Status |
|----------|------|--------|
| Modal opens on device row tap | 3.2 | PASS |
| Rename confirmed in modal persists | 3.6 | PASS |
| EQ changes in modal apply to device preset | NO TEST | FAIL |
| Modal dismiss without save leaves state unchanged | 3.7 | PASS |
| Modal is scrollable (small screen) | DEFERRED | UNTESTED |
---
## Design Compliance
| ADR | Implemented |
|-----|-------------|
| Bug fix via obtenerDispositivoActual() after subscription | YES |
| SP key eq_nombres_dispositivos_v1 | YES |
| nombresDispositivos field in ConfiguracionEcualizador | YES |
| renombrarDispositivo, obtenerNombreDispositivo, nombreVisible | YES |
| showModalBottomSheet with showDragHandle+isScrollControlled | YES |
| Green connection dot per row | YES |
| Fallback chain in state, not UI | YES |
| cambiarPresetDispositivo convenience method (data flow diagram) | NO — not implemented |
---
## Issues
### CRITICAL
**CRITICAL-1: Toggle-off no-op for rename not implemented**
Spec: when eqMultiDeviceEnabled is false, renombrarDispositivo MUST be a no-op.
Code: no guard on _eqMultiDeviceEnabled in renombrarDispositivo (estado_ecualizador.dart line 314).
No test for this scenario.
**CRITICAL-2: EQ changes in modal do NOT persist to device preset**
Spec: EcualizadorWidget changes MUST be saved to presetsDispositivo[deviceId].
Code: onCambio only calls setState on local _presetActual; _guardar() only calls renombrarDispositivo.
No public cambiarPresetDispositivo on EstadoEcualizador. EQ edits are silently discarded on confirm.
Files: pantalla_ajustes.dart lines 857-860 and 892.
No test for this scenario.
### WARNING
**WARNING-1: Platform name fallback (level-2) unreachable from device list UI**
FilaDispositivo calls eq.nombreVisible(deviceId, '') with empty platform name.
DispositivoAudio.nombre is not passed to the widget. Level-2 fallback is effectively dead code in the UI.
File: pantalla_ajustes.dart line 769.
**WARNING-2: L10n incomplete — 7 of 12 non-template locales missing translations**
Missing eqDevice* keys in: app_pt.arb, app_it.arb, app_ja.arb, app_zh.arb, app_ru.arb, app_bn.arb, app_id.arb.
Generator falls back to Spanish. App does not crash but shows Spanish copy in those locales.
**WARNING-3: FakeServicioEcualizador.guardarPrincipal and guardarActivo drop nombresDispositivos**
Both methods reconstruct _config without nombresDispositivos, silently resetting it to empty.
Hidden test infrastructure defect. File: test/helpers/fakes.dart lines 308-329.
### SUGGESTION
**SUGGESTION-1**: Implement task 3.3 scrollability widget test before PR merge.
**SUGGESTION-2**: Add widget test for connection indicator update after device change.
---
## Final Verdict
**PASS WITH WARNINGS** — 2 CRITICAL, 3 WARNING, 2 SUGGESTION.
The two CRITICALs are real spec violations: toggle-off no-op for rename is missing, and EQ preset changes in the edit modal are silently discarded. Both must be fixed before archiving.