# State Sync and UI Settings Validation Design **Date:** 2026-05-29 **Status:** Approved for implementation **Scope:** P0/P1 validation-based completion for state-sync evidence and UI settings persistence ## 1. Goal Close the current DV/P0-P1 gaps for reducer/state-sync evidence and UI settings persistence with tests first, minimal behavior changes, and updated documentation evidence. ## 2. State-Sync Design `chanora_state` remains the reducer owner. The validation pass adds focused tests for known reducer contracts rather than broad refactoring. Missing behavior is implemented only when a test proves a gap. Required evidence covers: | Contract | Evidence | |---|---| | Snapshot creates ready state and deterministic normalized order | Existing and expanded reducer tests | | Reconnect discards stale state and reconnect snapshot replaces state | Existing reducer tests | | Disconnected/lost states suppress live deltas | Existing reducer tests | | Duplicate IDs are normalized deterministically | Existing reducer tests | | Unknown client voice activity is ignored | Existing reducer tests | | Channel deletion removes clients in deleted channel | New reducer regression test and implementation | | Same event sequence produces same state and deltas | Existing reducer determinism test | ## 3. UI Settings Design `UiPreferencesService` remains a Flutter service backed by `shared_preferences`. This is the minimal P0/P1-complete implementation because the current app already uses SharedPreferences and no current behavior requires SQLite-backed UI settings. `UiSettings` gains a typed `themeMode` field with values: | Value | Meaning | |---|---| | `system` | Follow platform theme | | `light` | Force light theme | | `dark` | Force dark theme | The service persists the selected theme mode, falls back to `system` for invalid stored values, and preserves independent saves for host and nickname. ## 4. App Wiring `ChanoraApp` becomes stateful enough to load and apply persisted theme mode. `_BetaHome` continues to load/save host and nickname through `UiPreferencesService`. UI controls for selecting theme mode are out of this slice unless already present; this slice provides persistence and app-level application. ## 5. Documentation Updates After tests pass: | Document | Update | |---|---| | `docs/implementation-status-2026-05-28.md` | Mark reducer scaffold statement stale/resolved and UI settings persistence implemented for SharedPreferences scope | | `docs/release/dv-waiver-register.md` | Close or soften reducer waiver; keep event replay as P1 gap | | `docs/verification/swe4-unit-verification-plan.md` | Record reducer test evidence and UI settings tests | | `docs/verification/swe6-software-verification-plan.md` | Update state sync and UI settings DV status | | `docs/architecture/sdd.md` | Record UI settings persistence design | ## 6. Validation Run focused tests: ```text cargo test -p chanora_state --locked flutter test test/services/ui_preferences_service_test.dart ``` Run wider checks if touched app-shell behavior requires it: ```text flutter test --exclude-tags e2e ```