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.
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user