- Move ASPICE docs to chanoraapp/docs submodule at docs/ - Move development docs to dev-docs/ (superpowers, offline-knowledge, impl-mapping) - Add AGENTS.md with project conventions for AI agents - Add impl-mapping.md (SAD component → source file mapping) - Archive completed plans to dev-docs/superpowers/plans/_archived/ - Remove AGENTS.md from .gitignore (now tracked)
3.1 KiB
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:
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:
flutter test --exclude-tags e2e