# Chanora Software Detailed Design **Lifecycle:** SWE.3 Software Detailed Design and Unit Construction Handoff **Document status:** DV meeting baseline candidate **Date:** 2026-05-29 **Direct upstream source:** `docs/architecture/sad.md` **Related software requirements:** `docs/srs.md` ## 1. Purpose This Software Detailed Design defines the module-level design details needed for SWE.4 unit verification and SWE.5 integration verification. It is based on the current repository layout and the SWE.2 architecture baseline. ## 2. Module Catalogue | SDD module | Source location | Primary responsibility | Upstream SAD component | |---|---|---|---| | SDD-MOD-001 Flutter app bootstrap | `apps/chanora_flutter/lib/services/app_bootstrap.dart`, `main.dart` | Initialize Rust bridge, localization, app services, theme/design baseline | Flutter app shell | | SDD-MOD-002 Connect UI | `apps/chanora_flutter/lib/widgets/connect_widgets.dart` | Host/bookmark inputs, connect actions, pre-request UX | Flutter widget layer | | SDD-MOD-003 Snapshot and channel UI | `snapshot_view.dart`, `snapshot_state_mapper.dart`, `channel_spacer.dart` | Present channel tree, clients, and mapped state | Flutter widget/service layer | | SDD-MOD-004 Chat UI | `chat_views.dart`, `bbcode_text.dart` | Channel text rendering and BBCode-safe display | Flutter widget layer | | SDD-MOD-005 Voice UI | `voice_bar.dart`, `voice_compact.dart`, `voice_settings*.dart`, `voice_level_meter.dart`, `ptt_capability_badge.dart` | Voice controls, processing settings, metering, PTT capability | Flutter widget layer | | SDD-MOD-006 Platform services | `android_permissions_service.dart`, `ios_permissions_service.dart`, `audio_lifecycle_service.dart`, `back_intent_*`, `link_trust_service.dart` | Permission, lifecycle, navigation, route/link trust behavior | Flutter service layer | | SDD-MOD-007 Bridge API | `crates/chanora_bridge/src/api.rs`, generated Dart/Rust bridge files | Typed command/event boundary | Bridge layer | | SDD-MOD-008 Rust core supervisor | `core/chanora_core/src/lib.rs`, `ptt.rs` | Connection orchestration, reconnect, PTT state, storage coordination | Rust core | | SDD-MOD-009 Protocol adapter | `crates/chanora_protocol/src/` | `tsclientlib` isolation, DTO/error mapping | Protocol adapter | | SDD-MOD-010 State sync | `crates/chanora_state/src/lib.rs`, `channel_join.rs` | Snapshot/delta model, reducer, channel join support | State sync | | SDD-MOD-011 Audio subsystem | `crates/chanora_audio/src/` | Audio capture/playback, DSP, Opus, PTT, mode stack, platform units | Audio subsystem | | SDD-MOD-012 Storage | `crates/chanora_storage/src/lib.rs` | Bookmarks, identity storage, encrypted local records, keyring abstraction | Storage | | SDD-MOD-013 Diagnostics | `crates/chanora_diagnostics/src/lib.rs` | Redaction, log sink, known-secret registry, export bundle | Diagnostics | | SDD-MOD-014 Resolution and prefetch | `crates/chanora_resolver/src/lib.rs`, `crates/chanora_server_prefetch/src/lib.rs`, `prefetch_debouncer.dart` | SRV/TSDNS/DNS fallback and generation-safe resolution warming | Server resolver / prefetch | | SDD-MOD-015 Build and release hooks | `.github/workflows/`, `tools/`, platform project files | CI, unsigned iOS build, benchmark advisory, platform smoke procedures | Release / platform architecture | ## 3. Bridge Boundary Design The bridge boundary is the only supported Flutter-to-Rust command path. Dart code uses generated APIs under `apps/chanora_flutter/lib/src/rust/`; Rust exposes bridge functions through `crates/chanora_bridge/src/api.rs`. Design rules: | Rule | Detail | |---|---| | DTO stability | DTO fields must be explicit and serializable through Flutter Rust Bridge generation | | Error safety | Rust errors exposed to Flutter must be user-safe or mapped before display | | Secret handling | Secrets may cross only as command inputs or protected DTO fields and must be registered for diagnostic redaction where relevant | | Capability reporting | Platform and PTT capability fields must reflect actual active backend state | | Regeneration control | Generated bridge files are implementation artifacts and must be regenerated when bridge API signatures change | ## 4. Connection and State Design | Detail | Design | |---|---| | Connection lifecycle | Rust core owns connect/disconnect/reconnect decisions and suppresses reconnect after user disconnect | | Backoff | Reconnect uses exponential backoff as described in implementation status, capped at 60 seconds | | Server resolution | Resolver performs SRV/TSDNS/DNS fallback; prefetch cache may warm but must not be required for connect success | | Snapshot mapping | Rust state and bridge DTOs are mapped into Flutter view models by `snapshot_state_mapper.dart` | | Channel join | Channel join logic and errors are represented through Rust state/protocol handling and Flutter error mapper service | | Reducers | `chanora_state` owns snapshot/delta reducer design with unit coverage for snapshot, delta, reconnect, duplicate normalization, disconnected/lost suppression, unknown-client voice activity, deterministic ordering, and channel-delete/client cleanup. Current runtime UI refresh still flows through `chanora_core` snapshot/probe paths; full live-event folding through `chanora_state::reduce` is an integration follow-up. | ## 5. Audio Detailed Design | Audio element | Design detail | |---|---| | Capture/playback | Platform-specific units handle Android, iOS, desktop/fallback paths behind Rust audio abstractions | | Codec | Opus encode/decode lives in `opus_voice.rs` and associated audio modules | | DSP chain | High-pass filter, noise suppression, echo cancellation, and AGC are represented by audio processing modules/backends | | Transmit control | `TransmitMode` supports `Ptt`, `Continuous`, and reserved `VoiceActivity`; `VoiceActivity` has no active MVP implementation | | PTT | Desktop/mobile backends expose capability level and active backend; missed-key-up watchdog prevents stuck transmit | | Release tail | Tail handling prevents abrupt cutoffs after PTT release where configured | | Benchmarks | Realtime capture, Opus, and resampler benchmarks provide advisory baseline evidence | ## 6. Storage and Secret Design | Storage item | Design detail | |---|---| | Bookmarks | Stored locally through the storage crate and surfaced in Flutter connect UI | | Identity references | Stored through `IdentityFileStore` and platform secure storage where available | | Passwords/secrets | Encrypted at rest using the current storage design; Android Keystore-backed DEK is deferred and must be disclosed | | CI keyring behavior | CI disables real keyring access with `CHANORA_DISABLE_KEYRING=1` to avoid headless blocking | | Fallback behavior | Platform fallback modes must be represented as limitations in release/security evidence | ## 7. Diagnostics Detailed Design | Diagnostic element | Design detail | |---|---| | Log sink | Runtime logs can be captured by diagnostic sinks for export | | Known-secret registry | Runtime secrets are registered for redaction where applicable | | Redactor | Redacts configured sensitive patterns before export | | Export bundle | Diagnostic export is JSON-based and user-initiated | | Upload policy | MVP has no automatic diagnostic, telemetry, or crash upload | ## 8. Flutter UI Detailed Design | UI area | Design detail | |---|---| | Design tokens | `chanora_tokens.dart` centralizes product styling over Material 3 | | Platform capability display | `platform_capabilities.dart` and PTT capability widgets expose platform-specific support honestly | | Localization | Generated localization files provide English and Simplified Chinese resources | | Responsive behavior | Current widgets support compact/mobile-oriented layouts; expanded side-pane hardening remains P1/P2 as recorded | | Accessibility | Critical status should use text/icons/semantics and not color alone; verification remains through UI tests/audit | | UI settings persistence | `UiPreferencesService` persists host, nickname, permission explanation state, and theme mode through `shared_preferences`; invalid stored theme values fall back to system theme | ## 9. Build and Release Detailed Design | Build/release item | Design detail | |---|---| | Rust CI | `.github/workflows/ci.yml` runs cargo check/test and advisory clippy | | Flutter CI | `.github/workflows/ci.yml` runs Flutter pub get, analyze, and tests | | Supply chain | CI runs cargo-deny and license inventory checks | | iOS unsigned build | CI runs `flutter build ios --release --no-codesign` | | Audio benchmarks | `bench-advisory.yml` runs audio benchmarks and posts advisory evidence | | Platform packages | Public binary packaging/signing/notarization remains release-gated | ## 10. Verification Hook Design | Module | SWE.4 unit hooks | SWE.5/SWE.6 integration hooks | |---|---|---| | Flutter services/widgets | Dart unit/widget tests under `apps/chanora_flutter/test/` | Widget/system demos and candidate device smoke | | Bridge | API compile/generation checks | Flutter-to-Rust command/event smoke | | Rust core | Cargo tests | Compatible-server lifecycle demo | | Protocol | DTO/error mapping tests | Protocol compatibility matrix and server demo | | State sync | Reducer tests | Snapshot/delta/reconnect integration evidence | | Audio | DSP/codec/PTT tests and benchmarks | Platform audio loopback/device demo | | Storage | Repository/encryption/keyring-disabled tests | Platform secure-storage audit | | Diagnostics | Redaction/export tests | User-initiated export inspection | | Release hooks | CI workflow validation | Release readiness record and artifact evidence | ## 11. Traceability to SAD | SAD component | SDD modules | |---|---| | Flutter app shell | SDD-MOD-001 | | Flutter service layer | SDD-MOD-006, SDD-MOD-014 | | Flutter widget layer | SDD-MOD-002 through SDD-MOD-005 | | Bridge layer | SDD-MOD-007 | | Rust core | SDD-MOD-008 | | Protocol adapter | SDD-MOD-009 | | State sync | SDD-MOD-010 | | Audio subsystem | SDD-MOD-011 | | Storage | SDD-MOD-012 | | Diagnostics | SDD-MOD-013 | | Server resolver/prefetch | SDD-MOD-014 | | Release/platform architecture | SDD-MOD-015 | ## 12. Open Detailed-Design Risks | Risk | Impact | Control | |---|---|---| | Detailed item IDs from historical SDD references are not reconstructed | Existing references such as `SDD-109` are not itemized in this baseline | Treat this as a DV baseline SDD and add strict item numbering later if required | | Some module designs are summarized rather than API-by-API | May be insufficient for final process audit | Use this as DV baseline; deepen high-risk modules before final release gate | | Android Keystore-backed DEK is not implemented | Limits storage/security design claims | Controlled by waiver and release-readiness records | | Full event replay tooling and live reducer integration evidence are absent | Limits state verification design beyond reducer unit behavior | Controlled as P1 gap and runtime-integration follow-up | ## 13. DV Conclusion This SWE.3 baseline is sufficient to remove the missing-SDD traceability gap for DV review and to feed SWE.4/SWE.5 verification plans. It does not close release evidence gaps or replace source-level tests.