155 lines
11 KiB
Markdown
155 lines
11 KiB
Markdown
# 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_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.
|