Add SysRS-303/304, SysDes-149/150/151, SRS-204/205/206/207, SAD-081/082/083, SDD-094/095/096/097, DEC-029/030. Captures the v1 lifecycle redesign: - Drop manual Start-audio button; audio engine is bound to voice-channel join/leave (ensure_running on first join, shutdown_if_idle on last leave). Output stream opens regardless of mic-permission state so listen-only is a first-class flow. - TransmitMode enum (Ptt / Continuous / VoiceActivity-reserved). Default Ptt on fresh install. Persisted per identity. - PTT release tail: 200 ms default (0-500 ms configurable) before transmit gate closes, avoiding clipped trailing syllables. - Hard-mute toggle overrides transmit gate regardless of mode/PTT. - Bridge surface: drop start_audio/stop_audio; add voice_join(channel_id) / voice_leave() and BridgeEvent::VoiceState. DEC-029 rejects Flutter global-hotkey packages (hotkey_manager, super_hot_key) for PTT: they wrap RegisterHotKey/RegisterEventHotKey which consume the key and don't fire key-up, wrong primitive for PTT. Native Rust DesktopPttBackend (SDD-083/084/085) stays authoritative. DEC-030 defers Voice Activity Detection to P1. RMS / WebRTC VAD / Silero VAD trade-off review (binary-size, dependency-surface, CPU profile) postponed; TransmitMode::VoiceActivity reserved on the enum surface so a P1 increment is non-breaking. Validator clean: 304/151/207/83/97 IDs, strict layered sourcing preserved, no new warnings beyond the pre-existing 35 old-package-name filenames.
1205 lines
52 KiB
Markdown
1205 lines
52 KiB
Markdown
|
||
# Chanora SDD — Software Detailed Design
|
||
|
||
**Document type:** SDD / Software Detailed Design
|
||
**Process alignment:** ASPICE SWE.3 Software Detailed Design and Unit Construction
|
||
**Version:** 0.9.2
|
||
**Status:** Baseline Candidate
|
||
**Language:** English
|
||
**Product:** Chanora
|
||
**Lifecycle position:** `SysRS -> SysDes -> SRS -> SAD -> SDD`
|
||
|
||
**Repo path:** `docs/architecture/sdd.md` ---
|
||
|
||
## 1. Purpose
|
||
|
||
This document defines detailed software design units, APIs, data structures, and implementation-level design rules for Chanora.
|
||
|
||
The SDD derives from the SAD only.
|
||
|
||
## 2. Strict Traceability Rules
|
||
|
||
```text
|
||
SDD shall link directly to SAD only.
|
||
SDD shall not use direct software-requirement source IDs.
|
||
SDD shall not use direct system-design source IDs.
|
||
SDD shall not use direct system-requirement source IDs.
|
||
```
|
||
|
||
## 3. Software Unit Decomposition
|
||
|
||
| Software Unit | Responsibility |
|
||
|---|---|
|
||
| `ChanoraApp` | Root application widget, initialization, theme mode, localization initialization |
|
||
| `ChanoraThemeFactory` | Builds ThemeData, ColorScheme, TextTheme, component themes |
|
||
| `ChanoraSemanticColors` | ThemeExtension for connection, voice, latency, diagnostic, and error states |
|
||
| `ChanoraSpacing` | ThemeExtension for spacing tokens |
|
||
| `ChanoraShape` | ThemeExtension for shape tokens |
|
||
| `ChanoraMotion` | ThemeExtension for motion tokens and reduced-motion behavior |
|
||
| `ChanoraAdaptiveShell` | Window class detection and shell layout selection |
|
||
| `CompactShell` | Single-column shell |
|
||
| `MediumShell` | Navigation rail / medium-width shell |
|
||
| `ExpandedShell` | Persistent pane shell |
|
||
| `ChanoraVoiceBar` | Persistent voice control component |
|
||
| `ChanoraChannelTree` | Hierarchical channel and client browser |
|
||
| `ChanoraClientTile` | Client row component |
|
||
| `ChanoraStatusBadge` | Accessible status indicator |
|
||
| `ChanoraAudioMeter` | Input level display |
|
||
| `LocalizationService` | Product-owned string localization and fallback |
|
||
| `ContentTextAdapter` | Server-provided text pass-through and display preparation |
|
||
| `UnicodeTextBoundary` | Boundary string validation and conversion helper |
|
||
| `PlatformInsetsService` | Safe area, keyboard, cutout, and desktop inset data |
|
||
| `BackIntentService` | Android/system back intent abstraction |
|
||
| `HapticsService` | Platform-aware haptic feedback wrapper |
|
||
| `BridgeFacade` | Flutter-to-Rust command and event facade |
|
||
| `CoreEventMapper` | Core-event-to-view-model mapping |
|
||
| `DiagnosticsTextPresenter` | Localized diagnostic descriptions and language-neutral event keys |
|
||
| `ArchitectureViewDocs` | Maintains context, container, component, runtime, deployment, and ADR architecture documentation |
|
||
| `DeploymentConfig` | Platform packaging and release configuration |
|
||
| `ArchitectureTraceChecker` | Checks direct-layer traceability rules for documentation |
|
||
|
||
|
||
## 4. SWE.3 Detailed Design Completeness Criteria
|
||
|
||
The detailed design shall be sufficient to support implementation and unit verification. For each software unit, the SDD shall identify where applicable:
|
||
|
||
| Detail | Required information |
|
||
|---|---|
|
||
| Unit responsibility | Purpose and boundaries of the unit |
|
||
| Inputs | Name, type, allowed range, default value, optionality |
|
||
| Outputs | Name, type, allowed range, default value, error behavior |
|
||
| Interfaces | Internal and external software interfaces |
|
||
| Dynamic behavior | State changes, sequence behavior, asynchronous behavior |
|
||
| Error behavior | Recoverable errors, fatal errors, fallback behavior |
|
||
| Resource behavior | Buffering, time-sensitive operations, memory expectations |
|
||
| Unit verification hooks | Test seams and expected verification approach |
|
||
|
||
## 5. Software Unit Interface Detail Catalog
|
||
|
||
| Unit | Interface | Direction | Name | Type | Unit | Resolution | Range | Default | Error / fallback |
|
||
|---|---|---:|---|---|---|---|---|---|---|
|
||
| `ChanoraThemeFactory` | Theme creation | Input | seedColor | Color value | n/a | n/a | valid color | Chanora default seed | fallback to default theme |
|
||
| `ChanoraThemeFactory` | Theme creation | Input | brightness | enum | n/a | n/a | light/dark | system setting | fallback to light |
|
||
| `ChanoraThemeFactory` | Theme creation | Output | themeData | ThemeData | n/a | n/a | valid ThemeData | n/a | construction error treated as app initialization failure |
|
||
| `ChanoraAdaptiveShell` | Window classification | Input | widthDp | double | dp | 1dp | >=0 | current window width | compact fallback |
|
||
| `ChanoraAdaptiveShell` | Window classification | Output | windowClass | enum | n/a | n/a | compact/medium/expanded | compact | compact fallback |
|
||
| `LocalizationService` | String lookup | Input | key | string | n/a | n/a | non-empty | n/a | fallback key display or English fallback |
|
||
| `LocalizationService` | String lookup | Input | locale | locale ID | n/a | n/a | supported locale | English | English fallback |
|
||
| `LocalizationService` | String lookup | Output | localizedText | UTF-8 string | n/a | n/a | valid Unicode | English fallback | missing-key diagnostic |
|
||
| `UnicodeTextBoundary` | Text validation | Input | rawText | external string/bytes | n/a | n/a | platform/protocol dependent | n/a | boundary conversion error |
|
||
| `UnicodeTextBoundary` | Text validation | Output | contentText | UTF-8 string | n/a | n/a | valid Unicode | replacement/failure policy | conversion diagnostic |
|
||
| `BridgeFacade` | Command bridge | Input | commandDto | DTO | n/a | n/a | valid command schema | n/a | bridge error DTO |
|
||
| `BridgeFacade` | Command bridge | Output | commandResult | DTO/result | n/a | n/a | success/error | n/a | typed error |
|
||
| `CoreEventMapper` | Event mapping | Input | coreEvent | event DTO | n/a | n/a | known event type | n/a | unknown event diagnostic |
|
||
| `CoreEventMapper` | Event mapping | Output | viewModelDelta | UI model delta | n/a | n/a | valid UI state change | n/a | safe no-op + diagnostic |
|
||
| `DiagnosticsTextPresenter` | Diagnostic presentation | Input | diagnosticKey | stable key | n/a | n/a | known/unknown key | n/a | generic localized fallback |
|
||
| `DiagnosticsTextPresenter` | Diagnostic presentation | Output | diagnosticText | localized string | n/a | n/a | valid Unicode | English fallback | fallback diagnostic text |
|
||
| `ChanoraAudioMeter` | Level display | Input | level | double | normalized | 0.01 | 0.0-1.0 | 0.0 | clamp to valid range |
|
||
| `ChanoraAudioMeter` | Level display | Output | semanticValue | localized string | n/a | n/a | valid string | "No input" | localized fallback |
|
||
| `BackIntentService` | Back handling | Input | platformBackEvent | platform event | n/a | n/a | platform-defined | n/a | ignored if unsupported |
|
||
| `BackIntentService` | Back handling | Output | backIntent | enum | n/a | n/a | pop/close/ignore/exitCandidate | ignore | safe no-op |
|
||
|
||
## 6. Detailed Design Evaluation Checklist
|
||
|
||
| Evaluation area | Question |
|
||
|---|---|
|
||
| Interoperability | Are interfaces compatible across units and layers? |
|
||
| Interaction | Are runtime interactions and asynchronous flows defined? |
|
||
| Criticality | Are critical voice, connection, security, and diagnostics behaviors detailed? |
|
||
| Technical complexity | Are complex units decomposed and testable? |
|
||
| Risks | Are platform, audio, protocol, encoding, and localization risks addressed? |
|
||
| Testability | Can unit tests, widget tests, integration tests, and platform tests be derived from the design? |
|
||
| Traceability | Does every detailed item link directly to SAD only? |
|
||
| Consistency | Are SAD, SDD, unit interfaces, and verification expectations consistent? |
|
||
|
||
|
||
## 7. Detailed Design Items
|
||
|
||
**SDD-001**: `ChanoraApp` shall initialize theme, localization, platform services, and routing before rendering feature content.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraApp`
|
||
- Source SAD: SAD-001, SAD-031
|
||
- Verification method: Unit Test, Integration Test
|
||
|
||
Initialization order: platform bindings -> localization resources -> theme model -> app router -> adaptive shell.
|
||
|
||
**SDD-002**: `ChanoraThemeFactory` shall create Material 3 ThemeData for light and dark modes.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraThemeFactory`
|
||
- Source SAD: SAD-001, SAD-002, SAD-043
|
||
- Verification method: Unit Test
|
||
|
||
The factory returns ThemeData instances with Material 3 enabled and populated ColorScheme and TextTheme values.
|
||
|
||
**SDD-003**: `ChanoraThemeFactory` shall support seed-color replacement without feature-screen changes.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraThemeFactory`
|
||
- Source SAD: SAD-001, SAD-002, SAD-044
|
||
- Verification method: Unit Test
|
||
|
||
Seed color is injected into theme construction and not referenced in feature modules.
|
||
|
||
**SDD-004**: `ChanoraSemanticColors` shall define connection state colors independently from base ColorScheme.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraSemanticColors`
|
||
- Source SAD: SAD-004, SAD-007
|
||
- Verification method: Unit Test
|
||
|
||
Connection tokens include connected, connecting, reconnecting, disconnected, and error roles.
|
||
|
||
**SDD-005**: `ChanoraSemanticColors` shall define voice state colors independently from base ColorScheme.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraSemanticColors`
|
||
- Source SAD: SAD-005, SAD-007
|
||
- Verification method: Unit Test
|
||
|
||
Voice tokens include speaking, muted, deafened, push-to-talk-active, and unavailable roles.
|
||
|
||
**SDD-006**: `ChanoraSemanticColors` shall define latency, packet-loss, diagnostics, and error semantic roles.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraSemanticColors`
|
||
- Source SAD: SAD-006, SAD-007
|
||
- Verification method: Unit Test
|
||
|
||
Token names remain semantic and shall not embed raw color names in API names.
|
||
|
||
**SDD-007**: `ChanoraSpacing` shall define reusable spacing values for compact, medium, and expanded layouts.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraSpacing`
|
||
- Source SAD: SAD-002, SAD-003
|
||
- Verification method: Unit Test
|
||
|
||
Spacing APIs expose xs, sm, md, lg, xl, and xxl values.
|
||
|
||
**SDD-008**: `ChanoraShape` shall define reusable corner and shape values for cards, buttons, panels, badges, and sheets.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraShape`
|
||
- Source SAD: SAD-002, SAD-003
|
||
- Verification method: Unit Test
|
||
|
||
Shape APIs expose none, small, medium, large, extraLarge, and full values.
|
||
|
||
**SDD-009**: `ChanoraMotion` shall define standard durations and reduced-motion behavior.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraMotion`
|
||
- Source SAD: SAD-009
|
||
- Verification method: Unit Test
|
||
|
||
The unit maps reduced-motion settings to no-motion or simplified-motion behavior.
|
||
|
||
**SDD-010**: Feature widgets shall read tokens through Flutter theme accessors only.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Feature Widgets`
|
||
- Source SAD: SAD-003, SAD-007
|
||
- Verification method: Static Inspection
|
||
|
||
Feature code may call Theme.of(context) and extension accessors, but shall not instantiate semantic tokens.
|
||
|
||
**SDD-011**: `ChanoraAdaptiveShell` shall classify window width into compact, medium, or expanded.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraAdaptiveShell`
|
||
- Source SAD: SAD-008
|
||
- Verification method: Unit Test
|
||
|
||
Classification thresholds are centralized in the shell configuration.
|
||
|
||
**SDD-012**: `ChanoraAdaptiveShell` shall dispatch to `CompactShell`, `MediumShell`, or `ExpandedShell`.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraAdaptiveShell`
|
||
- Source SAD: SAD-008, SAD-009, SAD-010, SAD-011
|
||
- Verification method: Widget Test
|
||
|
||
Layout selection shall be deterministic for a given window class.
|
||
|
||
**SDD-013**: `CompactShell` shall render single-column content and mobile navigation.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `CompactShell`
|
||
- Source SAD: SAD-009
|
||
- Verification method: Widget Test
|
||
|
||
Compact layout shall avoid side-by-side pane requirements.
|
||
|
||
**SDD-014**: `MediumShell` shall render side navigation or navigation rail behavior.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `MediumShell`
|
||
- Source SAD: SAD-010
|
||
- Verification method: Widget Test
|
||
|
||
Medium layout shall preserve main content and primary navigation.
|
||
|
||
**SDD-015**: `ExpandedShell` shall render persistent pane regions and persistent voice controls.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ExpandedShell`
|
||
- Source SAD: SAD-011
|
||
- Verification method: Widget Test
|
||
|
||
Expanded layout shall support a side pane, main pane, and persistent VoiceBar slot.
|
||
|
||
**SDD-016**: `ConnectionStatusPresenter` shall provide non-color-only connection state presentation data.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ConnectionStatusPresenter`
|
||
- Source SAD: SAD-012, SAD-014
|
||
- Verification method: Unit Test
|
||
|
||
The presenter returns label, icon, severity token, and accessibility description.
|
||
|
||
**SDD-017**: `ChanoraVoiceBar` shall expose mute, deaf, push-to-talk, input meter, current channel, and latency properties.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraVoiceBar`
|
||
- Source SAD: SAD-013
|
||
- Verification method: Widget Test
|
||
|
||
VoiceBar properties are supplied from view models and shall not call Rust Core directly.
|
||
|
||
**SDD-018**: `ChanoraVoiceBar` shall remain renderable as a persistent shell slot.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraVoiceBar`
|
||
- Source SAD: SAD-007, SAD-013
|
||
- Verification method: Widget Test
|
||
|
||
The component shall not depend on a specific route.
|
||
|
||
**SDD-019**: `ChanoraChannelTree` shall support hierarchical channel nodes and client rows.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraChannelTree`
|
||
- Source SAD: SAD-003, SAD-006
|
||
- Verification method: Widget Test
|
||
|
||
The component consumes ChannelTreeVm data and supports expansion state.
|
||
|
||
**SDD-020**: `ChanoraChannelTree` shall support selected state, expansion state, join intent, and context-menu intent.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraChannelTree`
|
||
- Source SAD: SAD-006, SAD-015
|
||
- Verification method: Widget Test
|
||
|
||
UI events are emitted through callbacks and view-model intents.
|
||
|
||
**SDD-021**: `ChanoraClientTile` shall display client status with text, icon, and semantic state cues.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraClientTile`
|
||
- Source SAD: SAD-003, SAD-014
|
||
- Verification method: Widget Test, Accessibility Test
|
||
|
||
Client state shall not rely on color alone.
|
||
|
||
**SDD-022**: `ChanoraStatusBadge` shall expose visible text or icon and accessibility semantics.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraStatusBadge`
|
||
- Source SAD: SAD-012, SAD-014
|
||
- Verification method: Widget Test, Accessibility Test
|
||
|
||
Badge states include normal, warning, error, speaking, muted, and disconnected.
|
||
|
||
**SDD-023**: `ChanoraAudioMeter` shall display audio input level and support reduced-motion fallback.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ChanoraAudioMeter`
|
||
- Source SAD: SAD-009, SAD-013
|
||
- Verification method: Widget Test
|
||
|
||
Reduced-motion mode shall use simplified or static visual behavior.
|
||
|
||
**SDD-024**: All icon-only buttons shall provide localized semantic labels.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Design System Components`
|
||
- Source SAD: SAD-014, SAD-020
|
||
- Verification method: Accessibility Test
|
||
|
||
Icon-only control constructors require label keys or semantic labels.
|
||
|
||
**SDD-025**: Focusable components shall define focus order and visible focus style.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `FocusPolicy`
|
||
- Source SAD: SAD-015
|
||
- Verification method: Widget Test
|
||
|
||
Focus traversal shall be testable with keyboard navigation.
|
||
|
||
**SDD-026**: Adaptive shell panes shall support increased text scale without losing critical actions.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Adaptive Shell Components`
|
||
- Source SAD: SAD-016
|
||
- Verification method: Accessibility Test
|
||
|
||
Critical controls shall wrap, scroll, or remain reachable.
|
||
|
||
**SDD-027**: `PlatformInsetsService` shall provide safe area, keyboard inset, display cutout, and desktop inset data.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `PlatformInsetsService`
|
||
- Source SAD: SAD-017
|
||
- Verification method: Platform Test
|
||
|
||
Insets are consumed by shell layout rather than individual feature screens.
|
||
|
||
**SDD-028**: `BackIntentService` shall normalize Android/system back behavior into route-level intents.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `BackIntentService`
|
||
- Source SAD: SAD-018
|
||
- Verification method: Platform Test
|
||
|
||
Back handling shall be testable without direct platform branching in feature screens.
|
||
|
||
**SDD-029**: `HapticsService` shall expose platform-aware haptic feedback operations.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `HapticsService`
|
||
- Source SAD: SAD-019
|
||
- Verification method: Platform Test
|
||
|
||
Haptics calls are optional and shall no-op where unsupported.
|
||
|
||
**SDD-030**: `KeyboardAvoidancePolicy` shall prevent critical controls from being covered by virtual keyboards.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `KeyboardAvoidancePolicy`
|
||
- Source SAD: SAD-017, SAD-019
|
||
- Verification method: Platform Test
|
||
|
||
Inputs and primary actions remain reachable when the virtual keyboard appears.
|
||
|
||
**SDD-031**: `LocalizationService` shall load product string resources for the active locale.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `LocalizationService`
|
||
- Source SAD: SAD-020
|
||
- Verification method: Unit Test
|
||
|
||
The unit returns localized strings by key.
|
||
|
||
**SDD-032**: `LocalizationService` shall fall back to the baseline English locale when a key is missing.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `LocalizationService`
|
||
- Source SAD: SAD-020
|
||
- Verification method: Unit Test
|
||
|
||
Fallback behavior is deterministic and logged for diagnostics.
|
||
|
||
**SDD-033**: `LocalizationService` shall allow new locale resources without changes to protocol, audio, state, or storage modules.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `LocalizationService`
|
||
- Source SAD: SAD-020
|
||
- Verification method: Inspection
|
||
|
||
Locale resource registration is separated from non-UI software modules.
|
||
|
||
**SDD-034**: `ContentTextAdapter` shall pass through server-provided names and messages without translation.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ContentTextAdapter`
|
||
- Source SAD: SAD-021
|
||
- Verification method: Integration Test
|
||
|
||
Server content is treated as user/server content rather than product copy.
|
||
|
||
**SDD-035**: `UnicodeTextBoundary` shall validate cross-layer text DTOs as UTF-8 compatible strings.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `UnicodeTextBoundary`
|
||
- Source SAD: SAD-022, SAD-023
|
||
- Verification method: Unit Test, Integration Test
|
||
|
||
Invalid external encodings are handled at boundaries.
|
||
|
||
**SDD-036**: Protocol-boundary conversion shall be implemented only in protocol adapter code.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Protocol Adapter Text Boundary`
|
||
- Source SAD: SAD-023
|
||
- Verification method: Inspection
|
||
|
||
No general Flutter feature code may perform protocol encoding conversion.
|
||
|
||
**SDD-037**: Platform-boundary conversion shall be implemented only in platform adapter code.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Platform Adapter Text Boundary`
|
||
- Source SAD: SAD-023
|
||
- Verification method: Inspection
|
||
|
||
Platform-specific string conversion remains explicit and localized.
|
||
|
||
**SDD-038**: Diagnostics export shall preserve Unicode after redaction.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `DiagnosticsTextPresenter`
|
||
- Source SAD: SAD-024
|
||
- Verification method: Test, Audit
|
||
|
||
Redaction removes secrets, not arbitrary multilingual content.
|
||
|
||
**SDD-039**: Bidi text rendering shall use Flutter text widgets and directionality behavior compatible with platform support.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Flutter Text Presentation`
|
||
- Source SAD: SAD-025
|
||
- Verification method: Localization Test
|
||
|
||
Text rendering allows LTR and RTL content where supported.
|
||
|
||
**SDD-040**: Locale-aware formatting shall be centralized in localization utilities.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `LocalizationFormatting`
|
||
- Source SAD: SAD-026
|
||
- Verification method: Unit Test
|
||
|
||
Dates, times, numbers, and timestamps are formatted by locale-aware helpers.
|
||
|
||
**SDD-041**: Diagnostics event keys shall remain stable and language-neutral.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `DiagnosticsTextPresenter`
|
||
- Source SAD: SAD-027
|
||
- Verification method: Unit Test
|
||
|
||
User-facing descriptions are separate from machine-readable event keys.
|
||
|
||
**SDD-042**: UI/UX supporting documents shall be versioned with the software architecture baseline.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Documentation Set`
|
||
- Source SAD: SAD-028
|
||
- Verification method: Review
|
||
|
||
Guidelines, token docs, component docs, adaptive docs, and platform docs are maintained as supporting baselines.
|
||
|
||
**SDD-043**: SAD source validation shall reject direct lower-layer source fields.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Traceability Checker`
|
||
- Source SAD: SAD-029
|
||
- Verification method: Inspection
|
||
|
||
Automated or manual review checks SAD source fields.
|
||
|
||
**SDD-044**: SDD source validation shall reject direct non-SAD source fields.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `Traceability Checker`
|
||
- Source SAD: SAD-030, SAD-045
|
||
- Verification method: Inspection
|
||
|
||
Automated or manual review checks SDD source fields.
|
||
|
||
**SDD-045**: Theme/localization/platform initialization shall be tested before first feature render.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `App Initialization Tests`
|
||
- Source SAD: SAD-031
|
||
- Verification method: Integration Test
|
||
|
||
The app shell is tested for initialization order.
|
||
|
||
**SDD-046**: Bridge facade DTOs shall expose only stable UI-safe data structures.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `BridgeFacade`
|
||
- Source SAD: SAD-040, SAD-041
|
||
- Verification method: Integration Test
|
||
|
||
Flutter must not depend on Rust internal types.
|
||
|
||
**SDD-047**: Core event mapping shall convert Rust Core events into feature view models.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `CoreEventMapper`
|
||
- Source SAD: SAD-041
|
||
- Verification method: Unit Test
|
||
|
||
Event mapping is deterministic and testable.
|
||
|
||
**SDD-048**: Audio state view models shall separate UI state from real-time audio processing.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `VoiceViewModel`
|
||
- Source SAD: SAD-034, SAD-039
|
||
- Verification method: Unit Test
|
||
|
||
Voice UI receives status values without performing DSP.
|
||
|
||
**SDD-049**: Storage access shall be isolated from feature widgets behind repository or service APIs.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `StorageFacade`
|
||
- Source SAD: SAD-035
|
||
- Verification method: Inspection
|
||
|
||
Feature widgets shall not call database APIs directly.
|
||
|
||
**SDD-050**: Diagnostics UI shall obtain localized display text from diagnostics presentation services.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `DiagnosticsTextPresenter`
|
||
- Source SAD: SAD-027, SAD-036, SAD-050
|
||
- Verification method: Widget Test
|
||
|
||
Diagnostics UI consumes display models.
|
||
|
||
**SDD-051**: `ArchitectureViewDocs` shall maintain context, container, component, runtime, deployment, data, security, diagnostics, UI, audio, protocol, and i18n views.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `ArchitectureViewDocs`
|
||
- Source SAD: SAD-046, SAD-048, SAD-049, SAD-050
|
||
- Verification method: Review
|
||
|
||
Architecture views are updated when architecture-affecting changes occur.
|
||
|
||
**SDD-052**: `ArchitectureViewDocs` shall maintain an ADR index for accepted, deprecated, and superseded architectural decisions.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `ArchitectureViewDocs`
|
||
- Source SAD: SAD-047
|
||
- Verification method: Review
|
||
|
||
ADR entries include decision, rationale, status, and impact.
|
||
|
||
**SDD-053**: `DeploymentConfig` shall define platform-specific packaging and release configuration units.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `DeploymentConfig`
|
||
- Source SAD: SAD-049
|
||
- Verification method: Inspection
|
||
|
||
Deployment configuration separates platform package metadata from feature code.
|
||
|
||
**SDD-054**: `DiagnosticsArchitecture` shall centralize logging, event keys, localized descriptions, redaction, and export presentation.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `DiagnosticsArchitecture`
|
||
- Source SAD: SAD-050
|
||
- Verification method: Unit Test, Audit
|
||
|
||
Diagnostics behavior is implemented through centralized services.
|
||
|
||
**SDD-055**: `ArchitectureTraceChecker` shall check that SDD items reference only SAD IDs.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `ArchitectureTraceChecker`
|
||
- Source SAD: SAD-030, SAD-045
|
||
- Verification method: Inspection
|
||
|
||
A documentation check fails when non-SAD source IDs appear in SDD item source fields.
|
||
|
||
**SDD-056**: `ArchitectureTraceChecker` shall check that SAD items reference only SRS IDs.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `ArchitectureTraceChecker`
|
||
- Source SAD: SAD-029
|
||
- Verification method: Inspection
|
||
|
||
A documentation check fails when non-SRS source IDs appear in SAD item source fields.
|
||
|
||
|
||
|
||
**SDD-057**: `ArchitectureViewDocs` shall define reviewable architecture views for context, containers, components, runtime behavior, deployment, data, security, diagnostics, UI, audio, protocol, and i18n.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `ArchitectureViewDocs`
|
||
- Source SAD: SAD-046, SAD-051
|
||
- Verification method: Review
|
||
|
||
Each architecture view is maintained as part of the SAD baseline and referenced by the affected detailed design units.
|
||
|
||
**SDD-058**: `ArchitectureViewDocs` shall define an ADR record structure with ID, title, status, decision, rationale, consequences, affected units, and change history.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `ArchitectureViewDocs`
|
||
- Source SAD: SAD-047
|
||
- Verification method: Review
|
||
|
||
ADR records support architecture communication and change impact analysis.
|
||
|
||
**SDD-059**: `InterfaceDetailCatalog` shall refine SAD architectural interfaces into unit-level interface entries.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `InterfaceDetailCatalog`
|
||
- Source SAD: SAD-052, SAD-057
|
||
- Verification method: Inspection
|
||
|
||
Each entry includes name, type, unit, resolution, range, default value, and error/fallback behavior where applicable.
|
||
|
||
**SDD-060**: `InterfaceDetailCatalog` shall define command, event, localization, Unicode, diagnostics, adaptive layout, audio meter, and platform-intent interfaces.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `InterfaceDetailCatalog`
|
||
- Source SAD: SAD-052, SAD-056, SAD-057
|
||
- Verification method: Inspection
|
||
|
||
The catalog supports integration and unit verification planning.
|
||
|
||
**SDD-061**: `PerformanceDesignNotes` shall record UI responsiveness, audio latency, memory growth, reconnect, localization, and diagnostics resource considerations.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `PerformanceDesignNotes`
|
||
- Source SAD: SAD-053
|
||
- Verification method: Review, Analysis
|
||
|
||
Performance notes identify design mechanisms and verification hooks.
|
||
|
||
**SDD-062**: `AssumptionRegister` shall record software design assumptions and dependencies that affect feasibility.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `AssumptionRegister`
|
||
- Source SAD: SAD-054
|
||
- Verification method: Review
|
||
|
||
Assumptions are reviewed during change impact analysis.
|
||
|
||
**SDD-063**: `ArchitectureGlossary` shall provide definitions for architecture and detailed design terms.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P2 / Production
|
||
- Software unit: `ArchitectureGlossary`
|
||
- Source SAD: SAD-055
|
||
- Verification method: Review
|
||
|
||
The glossary reduces ambiguity across software architecture, detailed design, and verification.
|
||
|
||
**SDD-064**: Each software unit detailed design shall include responsibility, inputs, outputs, interfaces, dynamic behavior, error behavior, resource behavior, and verification hooks where applicable.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `SoftwareUnitDesignTemplate`
|
||
- Source SAD: SAD-058, SAD-059
|
||
- Verification method: Review, Inspection
|
||
|
||
The template defines the minimum expected detail for unit construction and unit verification.
|
||
|
||
**SDD-065**: `UnitConstructionGuideline` shall state that software units are constructed according to the SDD rather than reverse-documented from code.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `UnitConstructionGuideline`
|
||
- Source SAD: SAD-059
|
||
- Verification method: Review
|
||
|
||
The unit construction guideline preserves design-to-code traceability.
|
||
|
||
**SDD-066**: `SoftwareUnitTraceChecker` shall verify that SDD items link directly to SAD IDs only.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `SoftwareUnitTraceChecker`
|
||
- Source SAD: SAD-030, SAD-045, SAD-060
|
||
- Verification method: Inspection
|
||
|
||
The checker supports traceability rule enforcement.
|
||
|
||
**SDD-067**: `SoftwareUnitTraceChecker` shall support impact analysis from changed SAD items to affected SDD items.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `SoftwareUnitTraceChecker`
|
||
- Source SAD: SAD-060
|
||
- Verification method: Inspection
|
||
|
||
Impact analysis output identifies affected detailed design units.
|
||
|
||
**SDD-068**: `DetailedDesignReviewRecord` shall capture review evidence for SDD completeness, testability, and consistency with SAD.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `DetailedDesignReviewRecord`
|
||
- Source SAD: SAD-059, SAD-060
|
||
- Verification method: Review
|
||
|
||
Review records support baseline approval and communication.
|
||
|
||
**SDD-069**: `UnitVerificationHandoff` shall identify verification method candidates for each software unit.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `UnitVerificationHandoff`
|
||
- Source SAD: SAD-059
|
||
- Verification method: Review
|
||
|
||
The handoff supports unit verification planning.
|
||
|
||
**SDD-070**: `SoftwareUnitRegistry` shall maintain the list of software units, their owning component, source SAD items, and implementation status.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `SoftwareUnitRegistry`
|
||
- Source SAD: SAD-058, SAD-060
|
||
- Verification method: Inspection
|
||
|
||
The registry supports consistency between architecture, detailed design, implementation, and verification.
|
||
|
||
|
||
## 8. SAD-to-SDD Coverage Matrix
|
||
|
||
| SAD Range | SDD Coverage |
|
||
|---|---|
|
||
| SAD-001 through SAD-007 | SDD-001 through SDD-010 |
|
||
| SAD-008 through SAD-011 | SDD-011 through SDD-015 |
|
||
| SAD-012 through SAD-016 | SDD-016 through SDD-026 |
|
||
| SAD-017 through SAD-019 | SDD-027 through SDD-030 |
|
||
| SAD-020 through SAD-027 | SDD-031 through SDD-041 |
|
||
| SAD-028 through SAD-031 | SDD-042 through SDD-045 |
|
||
| SAD-032 through SAD-038 | SDD-046 through SDD-050 |
|
||
| SAD-039 through SAD-045 | SDD-046 through SDD-050, SDD-055, SDD-056 |
|
||
| SAD-046 through SAD-050 | SDD-051 through SDD-058, SDD-061 |
|
||
| SAD-051 through SAD-060 | SDD-057 through SDD-070 |
|
||
|
||
## 9. Change History
|
||
|
||
| Version | Date | Description |
|
||
|---|---|---|
|
||
| 0.1.0 | 2026-05-14 | Initial SDD baseline covering SAD-001 through SAD-045 and enforcing SAD-only direct traceability. |
|
||
| 0.2.0 | 2026-05-14 | Updated SDD coverage for expanded SAD v0.2 architecture views, ADRs, deployment architecture, diagnostics architecture, and traceability checker units. |
|
||
| 0.3.0 | 2026-05-14 | Added SWE.3 detailed-design completeness criteria, unit interface detail catalog, evaluation checklist, unit construction guideline, and additional SAD coverage. |
|
||
|
||
---
|
||
|
||
## 10. Platform Baseline and Product Decision Detailed Design Addendum
|
||
|
||
**SDD-071**: `IOSBuildConfig` shall define the iOS minimum runtime deployment target as iOS 13 unless an approved platform change raises it.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `IOSBuildConfig`
|
||
- Source SAD: SAD-061
|
||
- Verification method: Inspection, Platform Test
|
||
|
||
**SDD-072**: `IOSReleaseGate` shall verify that App Store Connect upload builds use Xcode 26 or later and the iOS 26 / iPadOS 26 SDK or later on or after 2026-04-28 unless Apple publishes a newer applicable upload requirement.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `IOSReleaseGate`
|
||
- Source SAD: SAD-062
|
||
- Verification method: Release Inspection
|
||
|
||
**SDD-073**: `AndroidBuildConfig` shall define Android API 24 as the minimum Android runtime baseline and shall expose target SDK configuration for release inspection.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `AndroidBuildConfig`
|
||
- Source SAD: SAD-063
|
||
- Verification method: Platform Test, Release Inspection
|
||
|
||
**SDD-074**: `ConnectionSessionManager` shall enforce a single active server connection in MVP.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `ConnectionSessionManager`
|
||
- Source SAD: SAD-064
|
||
- Verification method: Unit Test, System Test
|
||
|
||
**SDD-075**: `AudioProcessingSettings` shall default AEC, AGC, Noise Suppression, and High-Pass Filter to enabled where supported and stable.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `AudioProcessingSettings`
|
||
- Source SAD: SAD-065
|
||
- Verification method: Unit Test, Audio Test
|
||
|
||
**SDD-076**: `AudioProcessingBackendSelector` shall select platform-native audio processing first where available and stable and isolate any fallback backend behind the audio subsystem interface.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P1 / Beta
|
||
- Software unit: `AudioProcessingBackendSelector`
|
||
- Source SAD: SAD-066
|
||
- Verification method: Unit Test, Audio Test
|
||
|
||
**SDD-077**: `LocalDatabaseRepository` shall persist non-secret local state through SQLite or an equivalent embedded database abstraction.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `LocalDatabaseRepository`
|
||
- Source SAD: SAD-067
|
||
- Verification method: Unit Test, Storage Test
|
||
|
||
**SDD-078**: `SecretStorageRepository` shall persist secrets only through platform secure storage service interfaces.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `SecretStorageRepository`
|
||
- Source SAD: SAD-067
|
||
- Verification method: Unit Test, Security Audit
|
||
|
||
**SDD-079**: `TypedBridgeFacade` shall define generated or schema-controlled DTOs for Flutter/Rust commands, results, and events.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `TypedBridgeFacade`
|
||
- Source SAD: SAD-068
|
||
- Verification method: Integration Test, Inspection
|
||
|
||
**SDD-080**: `DiagnosticsPrivacyGate` shall disable automatic diagnostic upload, telemetry upload, and crash reporting in MVP release configuration unless an approved decision enables them.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `DiagnosticsPrivacyGate`
|
||
- Source SAD: SAD-069, SAD-070
|
||
- Verification method: Privacy Review, Security Audit
|
||
|
||
**SDD-081**: `DesktopPttBackend` shall be a Rust trait in `chanora_audio::ptt` exposing `fn capability(&self) -> PttCapabilityLevel`, `fn backend_id(&self) -> &'static str`, `fn start(&mut self, gate: Arc<AudioTransmitGate>, binding: PttBinding) -> Result<(), PttError>`, `fn stop(&mut self)`, and `fn rebind(&mut self, binding: PttBinding) -> Result<(), PttError>`. Implementations shall be Send and stop on Drop.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `DesktopPttBackend`
|
||
- Source SAD: SAD-071
|
||
- Verification method: Unit Test, Inspection
|
||
|
||
**SDD-082**: `PttCapabilityLevel` shall be a plain Rust enum (`L0Focused`, `L1GlobalShortcut`, `L2GlobalHoldToTalk`, `L3GlobalWithMouseButtons`, `L4DeviceAware`) with a public `as_str(&self) -> &'static str` mapping for diagnostics. `L4DeviceAware` is reserved and shall not be produced by any MVP implementation.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `PttCapabilityLevel`
|
||
- Source SAD: SAD-071
|
||
- Verification method: Unit Test
|
||
|
||
**SDD-083**: `WindowsRawInputBackend` shall use the `RegisterRawInputDevices` Win32 API targeting `HID_USAGE_PAGE_GENERIC` keyboard and mouse usages, run a dedicated message-only window on its own OS thread, and forward only sanitised binding-match results to the `AudioTransmitGate`. Raw `RAWINPUT` payloads shall never cross the backend boundary.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `WindowsRawInputBackend`
|
||
- Source SAD: SAD-072
|
||
- Verification method: Platform Test (Windows), Unit Test
|
||
|
||
**SDD-084**: `WindowsHookBackend` shall be used only when Raw Input registration fails. It installs `WH_KEYBOARD_LL` and `WH_MOUSE_LL` hooks on its dedicated thread; the hook callbacks compare against the active binding and call `AudioTransmitGate::set` only, never logging key data. The hook is uninstalled on Drop.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `WindowsHookBackend`
|
||
- Source SAD: SAD-072
|
||
- Verification method: Platform Test (Windows), Unit Test
|
||
|
||
**SDD-085**: `MacOSEventTapBackend` shall create a `CGEventTap` filtered to keyboard and mouse-button events, attached to the main run loop with an explicit retain. The tap callback shall consult the active binding and call `AudioTransmitGate::set` only. The backend shall expose `permission_state() -> Granted | Denied | Undetermined` via `IOHIDCheckAccess` (or the macOS-version-appropriate equivalent) and shall return `PttCapabilityLevel::L0Focused` when permission is not Granted.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `MacOSEventTapBackend`
|
||
- Source SAD: SAD-073
|
||
- Verification method: Platform Test (macOS), User Acceptance Test
|
||
|
||
**SDD-086**: `LinuxGnomeWaylandBackend` shall call `CreateSession`, `BindShortcuts`, and listen for `Activated` / `Deactivated` signals on the freedesktop `org.freedesktop.portal.GlobalShortcuts` D-Bus interface. Binding capture shall use the portal's own configuration dialog; Chanora itself does not read raw key events. Missing D-Bus or missing portal interface resolves to `PttCapabilityLevel::L0Focused`.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `LinuxGnomeWaylandBackend`
|
||
- Source SAD: SAD-074
|
||
- Verification method: Platform Test (Linux, GNOME Wayland), Unit Test
|
||
|
||
**SDD-087**: `FocusedPttBackend` shall integrate with Flutter's keyboard / pointer event stream via the existing `Listener` widget path and the bridge `set_ptt` command. Reports `PttCapabilityLevel::L0Focused` and `backend_id = "focused"`.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `FocusedPttBackend`
|
||
- Source SAD: SAD-071, SAD-072, SAD-073, SAD-074
|
||
- Verification method: Unit Test, UI Review
|
||
|
||
**SDD-088**: `PttController` shall sit in `chanora_core::ptt` and own a `Box<dyn DesktopPttBackend>`, a clone of `AudioTransmitGate`, a `watch::Sender<PttCapabilityLevel>` for live publication to the bridge, and a `tokio::sync::Mutex` over the active `PttBinding`. Public surface: `set_binding`, `current_capability`, `subscribe_capability`.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `PttController`
|
||
- Source SAD: SAD-071, SAD-076
|
||
- Verification method: Unit Test, Integration Test
|
||
|
||
**SDD-089**: `AudioTransmitGate` shall be `Arc<AudioTransmitGate>` wrapping a `tokio::sync::watch::Sender<bool>` and an internal `AtomicBool`. `set(v)` updates both atomically; `load()` reads the atomic; `subscribe()` hands out a `watch::Receiver` for the missed-key-up watchdog task.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `AudioTransmitGate`
|
||
- Source SAD: SAD-075
|
||
- Verification method: Unit Test
|
||
|
||
**SDD-090**: `PttSanitizer` shall implement `tracing_subscriber::Layer` and decorate the existing `RedactingLogLayer`. Records whose field names match the SDD-077 banned list shall be dropped before `on_event` reaches the wrapped sink. The implementation shall be allocation-free on the success path (the typical "no banned field" case).
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `PttSanitizer`
|
||
- Source SAD: SAD-077
|
||
- Verification method: Unit Test, Privacy Review
|
||
|
||
**SDD-091**: `PttCapabilityBadge` shall be a Flutter widget rendered inside the Voice Bar, subscribed to the FRB stream of `BridgeEvent::PttCapability`. The widget shall map each enum value to a short user-facing label and shall render an info icon that opens a per-platform explanation sheet when the resolved capability is `L0Focused`.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `PttCapabilityBadge`
|
||
- Source SAD: SAD-078
|
||
- Verification method: UI Review, User Acceptance Test
|
||
|
||
**SDD-092**: `MissedKeyUpWatchdog` shall be a tokio task spawned by the audio engine that holds the `watch::Receiver<bool>` from `AudioTransmitGate::subscribe()`. On each transition from `false` to `true` the task records the timestamp; on each `true -> false` transition the task clears the timestamp. If the transition timeline shows `true` for longer than the configured timeout the task calls `AudioTransmitGate::set(false)` and emits a sanitised diagnostic record.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `MissedKeyUpWatchdog`
|
||
- Source SAD: SAD-079
|
||
- Verification method: Unit Test, Integration Test
|
||
|
||
**SDD-093**: `PttInputClass` shall be a Rust enum in `chanora_audio::ptt_backends` with variants `None`, `Keyboard`, and `MouseSideButton`. The enum is the only carrier of the user's bound input class across the audio + bridge + Flutter boundary; its `as_str(&self) -> &'static str` mapping returns the diagnostic-safe label (`""` / `"keyboard"` / `"mouse-side-button"`) consumed by `PttBackendDescriptor::bound_input_class`. The Windows backend ladder and the macOS event-tap backend shall observe the `MouseSideButton` variant on their binding-rebind path and translate it into the platform's native side-button identifier internally; the Linux GNOME-Wayland portal backend shall accept whatever input class the portal returns from `BindShortcuts` and apply the same classifier already documented in `desktop-ptt-architecture.md` §5.3. The Flutter binding-capture dialog shall capture mouse side-button presses through the `PointerEvent.buttons` bitmask (back = `0x08`, forward = `0x10`) and never forward the raw bitmask beyond the dialog — the bridge `set_ptt_binding` call carries only the enum variant.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `PttInputClass`, `WindowsRawInputBackend`, `WindowsHookBackend`, `MacOSEventTapBackend`, `LinuxGnomeWaylandBackend`, `_PttBindingCaptureDialog`
|
||
- Source SAD: SAD-080
|
||
- Verification method: Unit Test, Platform Test (Windows / macOS / Linux), UI Review
|
||
|
||
**SDD-094**: `chanora_bridge::voice::voice_join(channel_id: ChannelId) -> Result<(), VoiceError>` and `chanora_bridge::voice::voice_leave() -> Result<(), VoiceError>` shall be the only public-bridge voice lifecycle calls. Internally `chanora_audio::engine::AudioEngine::ensure_running()` shall be idempotent and shall open the cpal input and output streams on the first call of the session; `chanora_audio::engine::AudioEngine::shutdown_if_idle()` shall be called from `voice_leave` and shall close both streams when no voice channels remain. The Flutter widget tree shall subscribe to `BridgeEvent::VoiceState { in_channel, transmit_mode, mute, release_tail_ms }` through the existing FRB stream and shall render the Voice Bar from that stream. The pre-existing `start_audio` and `stop_audio` FRB symbols shall be deleted from `crates/chanora_bridge/src/api.rs` together with their generated bindings; the corresponding caller in `apps/chanora_flutter/lib/main.dart` shall be removed.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `chanora_bridge::voice`, `chanora_audio::engine::AudioEngine`, `BridgeEvent::VoiceState`, `apps/chanora_flutter/lib/main.dart`
|
||
- Source SAD: SAD-081
|
||
- Verification method: Integration Test, UI Review
|
||
|
||
**SDD-095**: `chanora_audio::TransmitMode` shall be a `#[repr(u8)]` Rust enum with variants `Ptt = 0`, `Continuous = 1`, `VoiceActivity = 2`. Persistence shall be provided by `chanora_storage::IdentityStore::set_transmit_mode(&self, mode: TransmitMode)` and `chanora_storage::IdentityStore::get_transmit_mode(&self) -> TransmitMode`, the latter returning `TransmitMode::Ptt` on first read for a fresh install. The bridge surface shall carry the enum across the FFI boundary via `mirror` codegen as `BridgeTransmitMode`. The Flutter settings page in `apps/chanora_flutter/lib/widgets/voice_settings.dart` shall render three radio rows; the `VoiceActivity` row shall be rendered with `enabled: false` and a "Coming soon" trailing label until DEC-030 is resolved and an implementation is allocated.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `chanora_audio::TransmitMode`, `chanora_storage::IdentityStore::{set_transmit_mode, get_transmit_mode}`, `BridgeTransmitMode`, `apps/chanora_flutter/lib/widgets/voice_settings.dart`
|
||
- Source SAD: SAD-083
|
||
- Verification method: Unit Test, UI Review
|
||
|
||
**SDD-096**: `chanora_audio::release_tail::ReleaseTailTimer` shall be a tokio-task-owning struct exposing `arm(&self, gate: AudioTransmitGate, tail_ms: u32)`, `key_down(&self)`, `key_up(&self)`, and `cancel(&self)`. Internally the struct shall hold a `tokio::sync::watch::Sender<bool>` plus a `JoinHandle<()>` for the pending close. `key_down` shall abort any pending close handle and shall set `transmit_active = true` via the gate; `key_up` shall abort the prior close handle and shall spawn a new task that sleeps for `tail_ms` milliseconds and then sets `transmit_active = false`. The struct shall use no `unsafe`, no mutex, and shall rely only on atomic refcounts on the watch handle. The configuration value `release_tail_ms` shall live in the identity store next to `transmit_mode`, with a default of 200 and validated range 0–500 inclusive on every write.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `chanora_audio::release_tail::ReleaseTailTimer`, `chanora_storage::IdentityStore` (`release_tail_ms`)
|
||
- Source SAD: SAD-082
|
||
- Verification method: Unit Test, Integration Test
|
||
|
||
**SDD-097**: `apps/chanora_flutter/lib/widgets/voice_bar.dart` shall replace the existing `_AudioControls` widget in `apps/chanora_flutter/lib/main.dart` as the rendering surface for voice state. Its input shall be the `BridgeEvent::VoiceState` stream; its children, in render order, shall be: the channel-name pill (visible only when `in_channel` is true); the mode badge (`PTT: <key_label>` / `Continuous` / `Voice activity (coming soon)`); the hard-mute toggle button; the release-tail and threshold disclosure; the level meter; and the PTT capability badge already specified in SDD-091. The "Start audio" button shall be removed from the widget tree. The settings dialog in `apps/chanora_flutter/lib/widgets/voice_settings.dart` shall render the `TransmitMode` radio group, the bind-key button, and a release-tail slider over the range 0–500 ms with step 25 ms; the dialog shall never expose a "Start audio" affordance.
|
||
|
||
- Status: Draft
|
||
- Type: Software Detailed Design Item
|
||
- Stage: P0 / MVP
|
||
- Software unit: `apps/chanora_flutter/lib/widgets/voice_bar.dart`, `apps/chanora_flutter/lib/widgets/voice_settings.dart`, `apps/chanora_flutter/lib/main.dart`
|
||
- Source SAD: SAD-081, SAD-083
|
||
- Verification method: UI Review, Widget Test
|
||
|
||
## 11. Updated SAD-to-SDD Coverage Matrix
|
||
|
||
| SAD Range | SDD Coverage |
|
||
|---|---|
|
||
| SAD-001 through SAD-060 | Covered by inherited SDD baseline `SDD-001` through `SDD-070` |
|
||
| SAD-061 through SAD-070 | Covered by `SDD-071` through `SDD-080` |
|
||
| SAD-071 through SAD-079 | Covered by `SDD-081` through `SDD-092` |
|
||
| SAD-080 | Covered by `SDD-093` |
|
||
| SAD-081 through SAD-083 | Covered by `SDD-094` through `SDD-097` |
|
||
|
||
|
||
## Baseline Candidate 0.9.1 Update
|
||
|
||
| Version | Date | Description |
|
||
|---|---|---|
|
||
| 0.9.1 | 2026-05-14 | Updated baseline after product decision closure: Apple App Store SDK gate uses Xcode 26+ and iOS 26 / iPadOS 26 SDK+ since 2026-04-28, platform baselines and decision traceability propagated across the document set. |
|
||
|
||
|
||
## Baseline Candidate 0.9.2 Update
|
||
|
||
| Version | Date | Description |
|
||
|---|---|---|
|
||
| 0.9.2 | 2026-05-14 | Corrected Apple App Store Connect upload gate effective date and preserved layer-specific traceability. |
|
||
|
||
|
||
## Baseline Candidate 0.9.3 Update
|
||
|
||
| Version | Date | Description |
|
||
|---|---|---|
|
||
| 0.9.3 | 2026-05-15 | Added desktop PTT detailed design SDD-081 through SDD-092: `DesktopPttBackend` trait, `PttCapabilityLevel` enum, Windows Raw-Input + low-level-hook + Focused implementations, macOS event-tap + Focused implementations, Linux GNOME-Wayland portal + Focused implementations, `PttController`, `AudioTransmitGate`, `PttSanitizer` layer, `PttCapabilityBadge` widget, `MissedKeyUpWatchdog` task. Strict sourcing (`SDD -> SAD` only) preserved. |
|
||
|
||
|
||
## Baseline Candidate 0.9.4 Update
|
||
|
||
| Version | Date | Description |
|
||
|---|---|---|
|
||
| 0.9.4 | 2026-05-15 | Added `SDD-093` covering `SAD-080`. `SDD-093` fixes the `PttInputClass` enum surface, the cross-backend rebind contract for `MouseSideButton`, and the Flutter side-button capture path against the `PointerEvent.buttons` bitmask. Strict layered sourcing preserved (`SDD -> SAD` only). |
|
||
|
||
|
||
## Baseline Candidate 0.9.5 Update
|
||
|
||
| Version | Date | Description |
|
||
|---|---|---|
|
||
| 0.9.5 | 2026-05-15 | Added v1 audio + PTT lifecycle detailed design SDD-094 through SDD-097 sourced from SAD-081..083: bridge surface drops `start_audio` / `stop_audio` and exposes `chanora_bridge::voice::voice_join` / `voice_leave` with idempotent `AudioEngine::ensure_running` and `shutdown_if_idle`, `chanora_audio::TransmitMode` as `#[repr(u8)]` enum persisted via `chanora_storage::IdentityStore::{set,get}_transmit_mode` and mirrored across FRB as `BridgeTransmitMode`, `chanora_audio::release_tail::ReleaseTailTimer` as a tokio-task-owning adapter on the watch handle (no `unsafe`, no mutex; configurable 0–500 ms via `release_tail_ms`), and the new `apps/chanora_flutter/lib/widgets/voice_bar.dart` + `voice_settings.dart` surfaces replacing the legacy `_AudioControls` widget. Strict layered sourcing preserved (`SDD -> SAD` only). |
|