EdisonJwa 63f2901a6a docs(traceability): close SRS-200 SAD/SDD coverage gap (P0 audit follow-up)
A P0 traceability audit per the project's compliance workflow
found exactly one gap across the 162 P0 SRS items:

  * SRS-200 (mouse side buttons as bindable inputs for desktop
    Global PTT) had no dedicated SAD item. The earlier baseline
    matrix folded SRS-200 under the narrative
    `SRS-195..203 -> SAD-071..079` umbrella, which technically
    covered the requirement at the table level but did not give
    SRS-200 a one-to-one SAD source the validator's strict
    discipline expects.

Per the project's gate-check workflow (Case C —
BLOCKED_MISSING_SAD) this commit closes the documentation chain
*before* claiming compliance for the already-merged mouse-side-
button code path:

  * `docs/architecture/sad.md` v0.9.4 — new `SAD-080` sources
    SRS-200, allocates `Audio (Windows / macOS / Linux), Bridge,
    Flutter UI`, and records the cross-platform mouse-side-button
    surface as a software-architecture item. The §27 coverage
    matrix gains a dedicated SRS-200 -> SAD-080 row.
  * `docs/architecture/sdd.md` v0.9.4 — new `SDD-093` sources
    SAD-080. Specifies the `PttInputClass` enum surface
    (`None` / `Keyboard` / `MouseSideButton`), the rebind
    contract on the Windows + macOS backends, the Linux portal's
    pass-through behaviour, and the Flutter
    `PointerEvent.buttons` bitmask capture (back = `0x08`,
    forward = `0x10`). The §11 coverage matrix gains the
    SAD-080 -> SDD-093 row.
  * `docs/governance/traceability-matrix.md` v0.9.4 — the
    `(DEC-026 mouse buttons)` row moves from
    `SAD-072..074 / SDD-082..086` to the dedicated
    `SAD-080 / SDD-093`.
  * `docs/governance/baseline-candidate-validation-report.md`
    v0.9.4 — ID totals advance to 302 / 148 / 203 / 80 / 93;
    direct-layer-rule and undefined-reference counts remain
    zero.
  * `docs/governance/repo-format-validation-report.md` v0.9.4 —
    same ID totals update.

Audit summary
-------------

* 162 P0 SRS items audited.
* 1 SAD-coverage gap (SRS-200) — closed by this commit.
* 0 SDD-coverage gaps (every PTT SAD has explicit SDD coverage;
  the inherited baseline `SAD-032/033` are covered through the
  documented range row, not individually).
* All Priority: P0 software requirements now have a strict
  SRS -> SAD -> SDD chain on file.

Validator output:

```
[OK] SysRS: 302 defined, 0 undefined references
[OK] SysDes: 148 defined, 0 undefined references
[OK] SRS: 203 defined, 0 undefined references
[OK] SAD: 80 defined, 0 undefined references
[OK] SDD: 93 defined, 0 undefined references
[OK] SRS direct SysRS references: 0
[OK] SAD direct SysRS references: 0
[OK] SAD direct SysDes references: 0
[OK] SDD direct SysRS references: 0
[OK] SDD direct SysDes references: 0
[OK] SDD direct SRS references: 0
```

Implementation status
---------------------

The mouse-side-button code was implemented in v1.0.0-rc.4 and
v1.0.0-rc.5 under the (then-implicit) PTT umbrella; the code
already matches the new SDD-093's contract verbatim. This
commit ships **documentation only** — it adds the SAD/SDD/matrix
rows that retroactively justify the existing implementation
under the strict traceability discipline. No code edits, no test
edits.

  * `cargo test --workspace`: 67/67 green (unchanged).
  * `cargo deny check`: advisories ok, bans ok, licenses ok,
    sources ok.
  * `cargo about generate`: zero new warnings (no Cargo.lock
    delta).
  * `flutter analyze`: clean.
  * `tools/validate_docs.py`: all SRS/SAD/SDD coverage and
    direct-layer-rule checks pass.

Outstanding open items remain live verification per
`docs/release/release-readiness-go-nogo-record.md`
(RR-PTT-001..006/008) and the DEC-012 legal review; both are
non-engineering work.
2026-05-15 17:02:26 +08:00

Chanora

Chanora is a cross-platform voice communication client for TeamSpeak-compatible servers.

It is built with a shared Flutter UI and a Rust core, with TeamSpeak-compatible protocol integration isolated behind tsclientlib.

Flutter UI + Rust Core + tsclientlib

Chanora is an independent project and is not affiliated with, endorsed by, sponsored by, or officially associated with TeamSpeak.


Status

Chanora is currently in early planning and baseline-candidate design.

Current documentation baseline: v0.9.2
Current status: Baseline Candidate
Implementation status: Not production-ready

The current engineering focus is:

  • defining the system and software architecture;
  • preparing the Flutter + Rust application structure;
  • validating TeamSpeak-compatible protocol integration through tsclientlib;
  • defining cross-platform audio behavior;
  • preparing release, verification, security, privacy, and legal gates.

Target Platforms

Chanora is intended to support:

  • Windows
  • macOS
  • Linux
  • Android
  • iOS / iPadOS

Current platform policy:

Platform Baseline
iOS / iPadOS runtime target iOS 13+ unless Flutter, plugin, audio, or product constraints require raising it
App Store Connect upload gate Xcode 26+ with iOS 26 / iPadOS 26 SDK+ for upload on or after 2026-04-28
Android runtime target Android API 24+ unless Flutter, plugin, audio, or product constraints require raising it
Google Play target API Target the Google Play-required API level on upload date

The App Store / Play Store upload gates are release requirements. They are separate from local development and internal testing requirements.


Architecture Overview

Chanora separates UI, protocol logic, state synchronization, audio processing, diagnostics, and platform services.

Flutter Application
  ├─ App Shell
  ├─ Material 3 / Chanora Design System
  ├─ Feature Modules
  ├─ View Models / State
  └─ Typed Flutter/Rust Bridge

Rust Core
  ├─ Connection Manager
  ├─ State Synchronization
  ├─ Protocol Adapter
  ├─ Audio Subsystem
  ├─ Storage Services
  └─ Diagnostics

Protocol Layer
  └─ tsclientlib
      └─ TeamSpeak-compatible server

Key architecture rules:

  • Flutter does not call tsclientlib directly.
  • Protocol-specific types do not leak into the Flutter UI layer.
  • Rust Core owns protocol coordination, state synchronization, audio logic, storage services, diagnostics, and bridge-facing DTOs.
  • Flutter owns presentation, navigation, Material 3 theming, accessibility, localization presentation, and platform UI behavior.
  • Product localization and server-provided content are separated.
  • UTF-8 is the internal cross-layer text representation.
  • Non-UTF-8 conversion, if needed, occurs only at explicit protocol or platform boundaries.

MVP Direction

The current recommended MVP scope is:

Area MVP decision
Active server connections One active server connection per client instance
UI baseline Material 3 + Chanora Design System
Product language English UI first, i18n-ready architecture
Server content Preserve Unicode and do not translate server-provided content
Audio processing defaults Echo Canceller, Automatic Gain Control, Noise Suppression, and High-Pass Filter enabled where supported and stable
Audio implementation path Platform-native first; fallback isolated behind the audio subsystem
Local non-secret storage SQLite or equivalent embedded database
Secret storage Platform secure storage
Flutter/Rust bridge Stable typed bridge with generated or schema-controlled DTOs
Diagnostics Local, user-initiated export only
Telemetry None in MVP
Crash reporting Disabled unless explicitly approved later

Desktop Push-to-Talk

Chanora's desktop Push-to-Talk (PTT) follows a capability-based design (see docs/architecture/desktop-ptt-architecture.md). Focused PTT — the user holds a bound key or mouse button inside the focused Chanora window — is mandatory on Windows, macOS, and Linux. Global PTT (recognised while the application is not focused) is capability-dependent: it requires the operating system, the user-granted permission set, the display server, and the available input backend to all permit it.

The application reports a PttCapabilityLevel (L0Focused, L1GlobalShortcut, L2GlobalHoldToTalk, L3GlobalWithMouseButtons) that matches actual runtime behaviour, not the platform's theoretical maximum. The UI capability badge shows the live value.

Per-platform strategy (resolved by owner rulings 2026-05-15, see docs/governance/product-decision-register.md DEC-023 through DEC-028):

  • Windows — Raw Input first, low-level keyboard hook fallback, Focused PTT terminal fallback. Mouse side buttons supported. P0 / MVP.
  • macOS — permission-aware Event Tap with Focused PTT fallback; Global PTT upgrades asynchronously when the user grants Input Monitoring / Accessibility. P0 / MVP.
  • Linux — officially tested on GNOME on Wayland using the org.freedesktop.portal.GlobalShortcuts interface; every other Linux environment falls back to Focused PTT. Release notes do not claim Global PTT support outside the tested compositor.
  • Raw key codes, scan codes, virtual-key values, keysyms, and key-press timing sequences are never logged or included in the user-initiated diagnostic export. The diagnostic export carries only capability level, backend identifier, and bound input class.

A missed-key-up watchdog (default 30 s) clears transmit_active when the OS suppresses a key-up event so a stuck-PTT bug class is ruled out by construction.

Repository Layout

The repository documentation is expected to live under docs/.

docs/
  requirements/
    sysrs.md
    srs.md

  architecture/
    sysdes.md
    sad.md
    sdd.md

  verification/
    verification-master-plan.md
    swe4-unit-verification-plan.md
    swe5-software-integration-verification-plan.md
    swe6-software-verification-plan.md
    sys4-system-integration-verification-plan.md

  release/
    release-readiness-go-nogo-record.md
    platform-release-policy.md

  security/
    security-privacy-legal-guideline.md
    threat-model.md
    secure-storage-audit-report.md
    diagnostic-redaction-audit-report.md
    dependency-and-supply-chain-report.md

  privacy/
    privacy-policy.md

  legal/
    trademark-and-attribution-review.md

  ui-ux/
    material3-guideline.md
    material3-design-tokens.md
    material3-component-catalog.md
    adaptive-layout-platform-guide.md

  i18n/
    localization-architecture.md

  governance/
    document-index.md
    document-naming-convention.md
    traceability-matrix.md
    baseline-approval-record.md
    baseline-candidate-validation-report.md
    document-review-report.md
    product-decision-register.md
    decision-impact-assessment.md
    git-commit-message-convention.md
    repo-format-validation-report.md
    path-migration-map.md

  references/
    external-references.md
    aspice-swe2-swe3-integration-note.md

Implementation source folders may be added later. A likely structure is:

apps/
  chanora_flutter/

core/
  chanora_core/

crates/
  chanora_protocol/
  chanora_audio/
  chanora_state/
  chanora_storage/
  chanora_diagnostics/
  chanora_bridge/

The exact implementation layout should be finalized when the repository scaffold is created.


Documentation Entry Points

Start here:

Topic Document
System requirements docs/requirements/sysrs.md
Software requirements docs/requirements/srs.md
System architecture docs/architecture/sysdes.md
Software architecture docs/architecture/sad.md
Software detailed design docs/architecture/sdd.md
Verification strategy docs/verification/verification-master-plan.md
Release readiness docs/release/release-readiness-go-nogo-record.md
Platform release policy docs/release/platform-release-policy.md
Product decisions docs/governance/product-decision-register.md
Traceability docs/governance/traceability-matrix.md
Security/privacy/legal gates docs/security/security-privacy-legal-guideline.md

Engineering Process

Chanora follows this documentation hierarchy:

SysRS -> SysDes -> SRS -> SAD -> SDD

Direct traceability rules:

Document Direct upstream source
SysDes SysRS
SRS SysDes only
SAD SRS only
SDD SAD only

Verification mapping:

SDD -> SWE.4 Unit Verification
SAD + SDD -> SWE.5 Software Integration Verification
SRS -> SWE.6 Software Verification
SysDes -> SYS.4 System Integration Verification

Release readiness is tracked separately through the Go/No-Go record.


Release Readiness

A release is not approved by design documents alone.

Before an external or public release, the project must complete:

docs/release/release-readiness-go-nogo-record.md

The release decision must explicitly state:

Go
Conditional Go
No-Go

Release readiness must include:

  • release scope;
  • build number;
  • commit SHA;
  • Git tag;
  • artifact hashes;
  • satisfied P0/MVP requirements;
  • deferred requirements;
  • verification results;
  • waivers;
  • security review status;
  • platform readiness;
  • legal and OSS review status;
  • privacy policy status;
  • approval decision and approvers.

Security, privacy, and legal evidence are required before public or store release.

Required documents include:

docs/security/threat-model.md
docs/security/secure-storage-audit-report.md
docs/security/diagnostic-redaction-audit-report.md
docs/security/dependency-and-supply-chain-report.md
docs/privacy/privacy-policy.md
docs/legal/trademark-and-attribution-review.md

Important gates:

  • identity secrets and server passwords must use platform secure storage;
  • logs and diagnostic exports must redact secrets;
  • diagnostic export must be user-initiated unless a later approved policy changes this;
  • dependency licenses and vulnerabilities must be reviewed;
  • OSS notices must be prepared where required;
  • public wording must not imply official TeamSpeak affiliation;
  • privacy policy must describe local storage, diagnostics, permissions, and data handling.

Git Commit Convention

Chanora uses a Conventional Commits style format:

<type>(<scope>): <summary>

Examples:

feat(voice): add push-to-talk state handling
fix(protocol): recover channel tree after reconnect snapshot
docs(sad): add interface catalog and performance view
i18n(ui): add fallback behavior for missing localization keys
sec(diagnostics): redact server password from export bundle
release(android): prepare internal alpha build metadata

See:

docs/governance/git-commit-message-convention.md

Development

Implementation commands will be added after the repository scaffold is finalized.

Expected future commands may include:

flutter pub get
flutter test
cargo test
cargo clippy
cargo fmt

Do not treat these as authoritative until the actual Flutter/Rust workspace has been created.


Contributing

Before making a change:

  1. Check the affected requirement/design document.
  2. Confirm the correct traceability layer.
  3. Use the Git commit convention.
  4. Update docs and verification plans when the change affects requirements, architecture, detailed design, release behavior, security, privacy, or legal gates.

License

Chanora is dual-licensed under either of:

at your option. This dual-license model was Accepted on 2026-05-14 as decision DEC-020 in docs/governance/product-decision-register.md.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Chanora by you, as defined in the Apache-2.0 license, shall be dual-licensed as above, without any additional terms or conditions.

Third-party software bundled or linked by Chanora is listed in NOTICE with its own licenses. The complete legal review of the dependency tree (DEC-012) must complete before any public/store release. See:

docs/governance/product-decision-register.md
docs/security/dependency-and-supply-chain-report.md
docs/legal/trademark-and-attribution-review.md
S
Description
No description provided
Readme
26 MiB
Languages
Rust 55.3%
Dart 34.4%
Kotlin 3.6%
Swift 1.9%
Shell 1.4%
Other 3.3%