# 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.