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.
4.7 KiB
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.