7685 lines
341 KiB
JSON
7685 lines
341 KiB
JSON
{
|
||
"product": "Chanora",
|
||
"load_rule": "Load 00_AGENT_ROUTER.md + one phase file + SOP only if needed.",
|
||
"counts": {
|
||
"P0": 500,
|
||
"P1": 81,
|
||
"P2": 11,
|
||
"SOP": 310
|
||
},
|
||
"accepted_mvp_defaults": {
|
||
"Release sequence": "Internal Alpha → External Beta → MVP Public",
|
||
"MVP platforms": "Windows, macOS, Linux, Android, iOS (staged release allowed)",
|
||
"Active connections": "One active server connection",
|
||
"UI design system": "Material 3 + Chanora Design System",
|
||
"Product language": "MODIFIED — English + Chinese (Simplified) at MVP; i18n-ready architecture",
|
||
"Server content": "Preserve and display Unicode; do not translate",
|
||
"Diagnostics": "Local, user-initiated export only",
|
||
"Telemetry": "None",
|
||
"Crash reporting": "None unless later approved",
|
||
"Secret storage": "Platform secure storage",
|
||
"Non-secret local storage": "SQLite (rusqlite bundled)",
|
||
"Audio processing": "Platform-native first; fallback strategy documented",
|
||
"AEC": "Enabled by default where supported",
|
||
"AGC": "Enabled by default (user-toggleable)",
|
||
"Noise suppression": "Enabled by default (user-toggleable)",
|
||
"High-pass filter": "Enabled by default",
|
||
"Android minimum": "MODIFIED — API 28 (Android 9.0), raised from the original recommendation of API 24",
|
||
"Android target": "API 35 or newer per current Google Play policy on upload date",
|
||
"iOS minimum": "iOS 13",
|
||
"Apple App Store SDK gate": "Xcode 26+ / iOS 26 SDK+ for uploads on or after 2026-04-28",
|
||
"Audio crate": "cpal (desktop, Android); iOS deferred",
|
||
"Bridge": "Stable typed Flutter/Rust bridge; flutter_rust_bridge 2.x pinned",
|
||
"Implementation directory layout": "apps/chanora_flutter/, core/chanora_core/, crates/chanora_*",
|
||
"License": "Dual-licensed under Apache-2.0 OR MIT, recipient's choice (DEC-020)"
|
||
},
|
||
"decisions": [
|
||
{
|
||
"id": "DEC-001",
|
||
"decision": "Release type",
|
||
"accepted_value": "Internal Alpha first, then External Beta, then MVP Public / Store Release",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-002",
|
||
"decision": "MVP platform scope",
|
||
"accepted_value": "MVP target remains Windows, macOS, Linux, Android, and iOS; first release may be staged by channel/platform",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-003",
|
||
"decision": "Minimum iOS version",
|
||
"accepted_value": "iOS 13 minimum for Flutter support baseline; test latest iOS release separately",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-004",
|
||
"decision": "Minimum Android version",
|
||
"accepted_value": "**Android API 28 (Android 9.0)** minimum, raised from the original recommendation of API 24 by explicit owner ruling on 2026-05-14. Rationale: simplifies the audio path (AAudio is unconditionally available from API 26+ and stable from API 28), narrows the TLS / privacy / scoped-storage compatibility surface, and matches typical 2026 Android baselines. The original cpal-on-Oboe Android spike was built with `minSdk = 24` and `cargo-ndk -P 26`; product code in `apps/chanora_flutter` uses `minSdk = 28` and the Android product audio backend is now direct Oboe, so Chanora no longer carries the API 24/25 OpenSL ES fallback branch.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-005",
|
||
"decision": "Android target SDK",
|
||
"accepted_value": "Target the Google Play-required API level on the upload date; current release gate uses API 35+ unless newer Google policy applies",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-006",
|
||
"decision": "Multiple server connections in MVP",
|
||
"accepted_value": "Not in MVP; support one active server connection per client instance",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-007",
|
||
"decision": "AEC default state",
|
||
"accepted_value": "Enabled by default on platforms/audio backends where supported and stable",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-008",
|
||
"decision": "AGC default state",
|
||
"accepted_value": "Enabled by default, with user setting to disable",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-009",
|
||
"decision": "Noise suppression default state",
|
||
"accepted_value": "Enabled by default, with user setting to disable",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-010",
|
||
"decision": "High-pass filter default state",
|
||
"accepted_value": "Enabled by default",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-011",
|
||
"decision": "Audio processing implementation path",
|
||
"accepted_value": "Use platform-native audio processing first where available; use Rust/WebRTC-style processing as controlled fallback or later architecture option",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-011.1",
|
||
"decision": "Audio crate choice",
|
||
"accepted_value": "`cpal` for desktop (empirically verified on Linux/PipeWire by `poc/audio-capture-playback-spike` on 2026-05-13) and direct `oboe-rs` for Android product code. The earlier cpal-on-Oboe spike remains evidence that Rust audio reaches Oboe/AAudio on a Motorola Moto G Stylus 5G (2023) running Android 14 arm64-v8a, but product code chooses direct Oboe because P0 Android needs explicit `VoiceCommunication` input preset, `VoiceCommunication`/`Speech` output attributes, low-latency/exclusive stream requests with shared fallback, audio-session ids for hardware AEC/NS/AGC binding, and diagnostics of requested/achieved stream values. iOS crate TBD pending an iOS spike that requires macOS + Xcode hardware",
|
||
"status": "Accepted (desktop + Android) / Deferred (iOS)"
|
||
},
|
||
{
|
||
"id": "DEC-012",
|
||
"decision": "Official SDK / trademark / licensing review",
|
||
"accepted_value": "Public/store release is blocked until legal confirms TeamSpeak non-affiliation wording, trademark usage, OSS licenses, and `tsclientlib` license posture",
|
||
"status": "Accepted (as a release gate)"
|
||
},
|
||
{
|
||
"id": "DEC-013",
|
||
"decision": "Local database choice",
|
||
"accepted_value": "Use SQLite or equivalent embedded local database for non-secret local state; secrets remain in platform secure storage",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-013.1",
|
||
"decision": "SQLite crate",
|
||
"accepted_value": "`rusqlite` with the `bundled` feature (SQLite statically linked into the binary; no system libsqlite3 dependency); verified by `poc/sqlite-storage-spike` on 2026-05-13",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-013.2",
|
||
"decision": "Linux secure-storage backend policy",
|
||
"accepted_value": "Prefer Secret Service (libsecret / gnome-keyring / kwallet / KeePassXC) on Linux; if the default collection is locked or D-Bus is unavailable, fall back to kernel keyutils with a clear user notice. Both backends are \"equivalent\" per SysRS-053 / SysRS-162; verified by `poc/secure-storage-spike` on 2026-05-13",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-014",
|
||
"decision": "Bridge choice",
|
||
"accepted_value": "Use a stable typed Flutter/Rust bridge with generated or schema-controlled DTOs; **`flutter_rust_bridge` 2.x pinned** (empirically verified at 2.12.0 by `poc/flutter_rust_bridge_hello` on 2026-05-13)",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-015",
|
||
"decision": "Product language for MVP",
|
||
"accepted_value": "**English + Chinese (Simplified) for MVP**, raised from the original recommendation of English-only by explicit owner ruling on 2026-05-14. Rationale: the demonstrated test-server population (verified live against `cn.teamspeak.app`) and broader TS3 audience include substantial Chinese-speaking users; shipping zh-Hans alongside en at MVP avoids a launch-window UX gap. Architecture remains i18n-ready so additional languages can be added later mechanically. Server-provided content is preserved verbatim and never translated (ADR-008 UTF-8 boundary, DEC-015 server-content rule retained).",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-016",
|
||
"decision": "Diagnostics upload policy",
|
||
"accepted_value": "No automatic upload for MVP; user-initiated local diagnostic export only",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-017",
|
||
"decision": "Crash reporting",
|
||
"accepted_value": "Disabled for MVP unless explicit opt-in provider and privacy policy are approved",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-018",
|
||
"decision": "Public product name",
|
||
"accepted_value": "Chanora",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-019",
|
||
"decision": "Public non-affiliation statement",
|
||
"accepted_value": "Use legal-approved wording; drafted text accepted as working copy: \"Chanora is independent and is not affiliated with, endorsed by, sponsored by, or officially associated with TeamSpeak.\" Subject to final legal review under DEC-012 before public release.",
|
||
"status": "Accepted (drafted wording)"
|
||
},
|
||
{
|
||
"id": "DEC-021",
|
||
"decision": "Apple App Store submission SDK",
|
||
"accepted_value": "Use Xcode 26 or later and the iOS 26 / iPadOS 26 SDK or later for App Store submission on or after 2026-04-28, unless Apple publishes a newer applicable requirement before upload",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-020",
|
||
"decision": "License model",
|
||
"accepted_value": "**Dual-licensed under Apache-2.0 OR MIT (recipient's choice)**, the standard Rust-ecosystem permissive license model. Accepted on 2026-05-14. Compatible with every direct dependency in the PoC tree (`tsclientlib` MIT-OR-Apache-2.0, `flutter_rust_bridge` MIT, `cpal` Apache-2.0, `rusqlite` MIT, `keyring` MIT-OR-Apache-2.0, etc.) and with the Flutter framework's BSD-3-Clause. The license texts ship as `LICENSE-APACHE` and `LICENSE-MIT` at the repository root; an aggregator `LICENSE` points to both. `NOTICE` enumerates current direct-dependency attributions. The full OSS legal review (transitive deps, license obligations, OSS notices) remains under DEC-012 and is still required before public release.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-022",
|
||
"decision": "Canonical implementation directory layout",
|
||
"accepted_value": "Accept the README's sketch as canonical: `apps/chanora_flutter/`, `core/chanora_core/`, `crates/chanora_protocol/`, `crates/chanora_audio/`, `crates/chanora_state/`, `crates/chanora_storage/`, `crates/chanora_diagnostics/`, `crates/chanora_bridge/`. Matches SAD §7.2 module decomposition",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-023",
|
||
"decision": "Windows desktop Global PTT priority",
|
||
"accepted_value": "**P0 in MVP.** Resolves PTT-OPEN-001 from `gen2/chanora-desktop-ptt-review-summary-v0.9.2.md`. The Windows backend ladder (Raw Input → low-level keyboard hook → Focused fallback) is mandatory for the first public release; release notes shall not claim Global PTT support on Windows until live measurement confirms a Global level from a non-fallback rung.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-024",
|
||
"decision": "macOS desktop Global PTT priority",
|
||
"accepted_value": "**P0 in MVP, with explicit permission UX flow.** Resolves PTT-OPEN-002. The macOS backend shall request the Input Monitoring / Accessibility permission, accept user denial gracefully (continue at `L0Focused` without functional regression), and upgrade to Global asynchronously when the user grants the permission.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-025",
|
||
"decision": "Officially-tested Linux environment for first public release",
|
||
"accepted_value": "**GNOME on Wayland (only).** Resolves PTT-OPEN-003. The Linux backend shall use the freedesktop `org.freedesktop.portal.GlobalShortcuts` interface on GNOME-on-Wayland and fall back to Focused PTT on every other Linux environment (X11, sway, KDE, untested compositors). Release notes shall not claim Global PTT support outside the tested compositor.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-026",
|
||
"decision": "Mouse side-button support in first desktop PTT release",
|
||
"accepted_value": "**Supported on Windows and macOS; Linux follows whatever the GlobalShortcuts portal exposes.** Resolves PTT-OPEN-004. The Raw Input backend (Windows) and the Event Tap backend (macOS) shall accept Mouse4 / Mouse5 bindings; the Linux portal binding accepts whatever the session exposes and the release notes shall not over-claim.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-027",
|
||
"decision": "PTT diagnostics privacy posture",
|
||
"accepted_value": "**Capability and availability state only — no raw key codes ever leave the device.** Resolves PTT-OPEN-005. The diagnostic export shall name only `PttCapabilityLevel`, `backend_id`, `bound_input_class`, and `fallback_exercised`; the user's actual key value (scan code, virtual key, keysym) shall never be logged, persisted, or exported. `PttSanitizer` enforces this at write time.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-028",
|
||
"decision": "Missed-key-up watchdog requirement",
|
||
"accepted_value": "**P0.** Resolves PTT-OPEN-006. The audio engine shall include a missed-key-up watchdog that clears `transmit_active` after a configured ceiling (default 30 s) when no key-up event arrives. The watchdog is a P0 release-gate item rather than an implementation-level concern because the failure mode (stuck transmission after the user has released the binding) is user-visible and reputation-relevant.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-029",
|
||
"decision": "Flutter global-hotkey packages rejected for PTT",
|
||
"accepted_value": "**Use the native Rust `DesktopPttBackend` trait + per-OS implementations (already specified in SDD-083 / SDD-084 / SDD-085); do not adopt `hotkey_manager`, `super_hot_key`, or any equivalent pub.dev package for PTT.** Rationale: those packages wrap the OS `RegisterHotKey` / `RegisterEventHotKey` semantics — they consume the key (suppressing it from other applications), they do not deliver a key-up event, and they do not support mouse side-buttons. PTT requires the opposite primitive (observe, do not consume, deliver both up and down).",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-030",
|
||
"decision": "Voice activity detection deferred to P1",
|
||
"accepted_value": "**`TransmitMode::VoiceActivity` ships as a reserved enum variant with no v1 implementation.** The settings UI shows it as a disabled \"coming soon\" option. The actual implementation choice is deferred to a future baseline. Rationale: three viable backends were compared (RMS energy threshold — trivial but quality-poor; WebRTC VAD via the `webrtc-vad` crate — frozen-but-stable C++ BSD-3 dep, ~200 KB binary, industry baseline; Silero VAD via ONNX Runtime — best quality but ~8–16 MB binary uplift per platform plus an ONNX-runtime dependency surface). The v1 dependency-surface budget does not have room for the trade-off review required to pick correctly. Choosing too early risks either user-visible quality regression (RMS) or a forced ONNX adoption (Silero) before there is a comparable need for ML inference elsewhere (noise suppression, AEC).",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-031",
|
||
"decision": "Missed-key-up watchdog disabled on P0; redesign deferred to P1",
|
||
"accepted_value": "**The `MissedKeyUpWatchdog` is constructed and unit-tested but is NOT spawned by `ChanoraSession::start_audio` in the P0 baseline.** Supersedes DEC-028 for the v1 ship. Rationale: the original 30 s ceiling cut real users off mid-sentence when speaking through PTT for longer than the timeout — Mumble and TeamSpeak do not ship a comparable watchdog, so the protection is stricter than industry baseline while imposing a real UX cost. The watchdog's purpose (catching OS-level key-up loss when the app loses focus / is minimised / hits App Nap) remains valid; the fixed-timeout shape is the wrong implementation. P1 will reintroduce a redesigned variant using one of: (a) raised ceiling (~5 min, owner-tunable) only, (b) active OS-level key-state polling via `GetAsyncKeyState` / `CGEventSourceKeyState` / `XQueryKeymap` so we detect the actual OS desync directly, (c) audio-activity (RMS-silence) fallback once the level meter lands, or (d) a combination. The Rust unit tests for `MissedKeyUpWatchdog::spawn_on_signal` remain in `crates/chanora_audio/src/ptt.rs` so the P1 re-enable is non-breaking.",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-001",
|
||
"decision": "Product Owner",
|
||
"accepted_value": "Release type sequence",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-002",
|
||
"decision": "Product Owner / Engineering",
|
||
"accepted_value": "MVP platform strategy",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-003",
|
||
"decision": "Product Owner / iOS Owner",
|
||
"accepted_value": "Minimum iOS version",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-004",
|
||
"decision": "Product Owner / Android Owner",
|
||
"accepted_value": "Minimum Android version",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-005",
|
||
"decision": "Android Owner / Release Manager",
|
||
"accepted_value": "Android target SDK",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-006",
|
||
"decision": "Product Owner / Software Architect",
|
||
"accepted_value": "Multiple server connections in MVP",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-007",
|
||
"decision": "Audio Owner / Product Owner",
|
||
"accepted_value": "AEC default",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-008",
|
||
"decision": "Audio Owner / Product Owner",
|
||
"accepted_value": "AGC default",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-009",
|
||
"decision": "Audio Owner / Product Owner",
|
||
"accepted_value": "Noise suppression default",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-010",
|
||
"decision": "Audio Owner",
|
||
"accepted_value": "High-pass filter default",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-011",
|
||
"decision": "Software Architect / Audio Owner",
|
||
"accepted_value": "Audio processing path",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-011.1",
|
||
"decision": "Software Architect / Audio Owner",
|
||
"accepted_value": "Audio crate (desktop / mobile)",
|
||
"status": "Accepted (desktop: `cpal`; Android product: direct `oboe-rs`) / Deferred (iOS)"
|
||
},
|
||
{
|
||
"id": "DEC-012",
|
||
"decision": "Legal / Compliance",
|
||
"accepted_value": "SDK/trademark/licensing review",
|
||
"status": "Accepted as a release gate"
|
||
},
|
||
{
|
||
"id": "DEC-013",
|
||
"decision": "Software Architect / Storage Owner",
|
||
"accepted_value": "Local database",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-013.1",
|
||
"decision": "Software Architect / Storage Owner",
|
||
"accepted_value": "SQLite crate",
|
||
"status": "Accepted (`rusqlite` bundled)"
|
||
},
|
||
{
|
||
"id": "DEC-013.2",
|
||
"decision": "Software Architect / Storage Owner / Security Reviewer",
|
||
"accepted_value": "Linux secure-storage backend policy",
|
||
"status": "Accepted (Secret Service preferred, keyutils fallback)"
|
||
},
|
||
{
|
||
"id": "DEC-014",
|
||
"decision": "Software Architect",
|
||
"accepted_value": "Bridge choice",
|
||
"status": "Accepted (`flutter_rust_bridge` 2.x pinned)"
|
||
},
|
||
{
|
||
"id": "DEC-015",
|
||
"decision": "Product Owner",
|
||
"accepted_value": "Product language for MVP",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-016",
|
||
"decision": "Product Owner / Legal / Security",
|
||
"accepted_value": "Diagnostics upload policy",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-017",
|
||
"decision": "Product Owner / Legal / Security",
|
||
"accepted_value": "Crash reporting",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-018",
|
||
"decision": "Product Owner",
|
||
"accepted_value": "Public product name",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-019",
|
||
"decision": "Legal / Compliance",
|
||
"accepted_value": "Public non-affiliation statement",
|
||
"status": "Accepted (drafted wording)"
|
||
},
|
||
{
|
||
"id": "DEC-020",
|
||
"decision": "Product Owner / Legal",
|
||
"accepted_value": "License model",
|
||
"status": "Accepted (Apache-2.0 OR MIT dual-license)"
|
||
},
|
||
{
|
||
"id": "DEC-021",
|
||
"decision": "iOS Owner / Release Manager",
|
||
"accepted_value": "Apple App Store SDK gate",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-022",
|
||
"decision": "Software Architect",
|
||
"accepted_value": "Canonical implementation directory layout",
|
||
"status": "Accepted (README sketch)"
|
||
},
|
||
{
|
||
"id": "DEC-023",
|
||
"decision": "Product Owner / Windows Platform Owner",
|
||
"accepted_value": "Windows desktop Global PTT priority",
|
||
"status": "Accepted (P0 / MVP)"
|
||
},
|
||
{
|
||
"id": "DEC-024",
|
||
"decision": "Product Owner / macOS Platform Owner",
|
||
"accepted_value": "macOS desktop Global PTT priority",
|
||
"status": "Accepted (P0 / MVP, permission-UX required)"
|
||
},
|
||
{
|
||
"id": "DEC-025",
|
||
"decision": "Product Owner / Linux Platform Owner",
|
||
"accepted_value": "Officially-tested Linux environment",
|
||
"status": "Accepted (GNOME on Wayland only)"
|
||
},
|
||
{
|
||
"id": "DEC-026",
|
||
"decision": "Product Owner / UX Owner",
|
||
"accepted_value": "Mouse side-button support",
|
||
"status": "Accepted (Windows + macOS; Linux portal-dependent)"
|
||
},
|
||
{
|
||
"id": "DEC-027",
|
||
"decision": "Security / Privacy Reviewer",
|
||
"accepted_value": "PTT diagnostics privacy posture",
|
||
"status": "Accepted (capability + availability only, no key codes)"
|
||
},
|
||
{
|
||
"id": "DEC-028",
|
||
"decision": "Audio Owner / Software Architect",
|
||
"accepted_value": "Missed-key-up watchdog",
|
||
"status": "Accepted (P0)"
|
||
},
|
||
{
|
||
"id": "DEC-029",
|
||
"decision": "Software Architect / Audio Owner",
|
||
"accepted_value": "Flutter global-hotkey packages rejected for PTT",
|
||
"status": "Accepted"
|
||
},
|
||
{
|
||
"id": "DEC-030",
|
||
"decision": "Audio Owner / Product Owner",
|
||
"accepted_value": "Voice activity detection deferred to P1",
|
||
"status": "Accepted (deferred to P1)"
|
||
},
|
||
{
|
||
"id": "DEC-031",
|
||
"decision": "Audio Owner / Product Owner",
|
||
"accepted_value": "Missed-key-up watchdog disabled on P0; redesign deferred to P1",
|
||
"status": "Accepted (supersedes DEC-028 for P0)"
|
||
},
|
||
{
|
||
"id": "DEC-032",
|
||
"decision": "Android `abiFilters` set during P0 smoke-test cycle",
|
||
"accepted_value": "Canonical three-ABI set `{arm64-v8a, armeabi-v7a, x86_64}` (per SDD-073 item 4 / SDD-118 item 3) restored 2026-05-18 after the `audiopus_sys` + `cmake-rs` + NDK toolchain-file `ANDROID_ABI` propagation gap was closed via a workspace `[patch.crates-io]` override pinning `cmake` to a fork carrying cmake-rs PR #257",
|
||
"status": "**Resolved**"
|
||
},
|
||
{
|
||
"id": "DEC-032",
|
||
"decision": "Build/Toolchain",
|
||
"accepted_value": "Temporary reduction of Android `abiFilters` to `arm64-v8a` only during P0 smoke-test cycle",
|
||
"status": "Resolved (2026-05-18)"
|
||
}
|
||
],
|
||
"requirements_by_phase": {
|
||
"P0": [
|
||
{
|
||
"id": "SAD-001",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall use a Flutter App Shell as the top-level software composition root."
|
||
},
|
||
{
|
||
"id": "SAD-002",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Review, Widget Test",
|
||
"statement": "The architecture shall use a Chanora Design System package above Material 3."
|
||
},
|
||
{
|
||
"id": "SAD-003",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Feature Modules, Design System",
|
||
"verification": "Static Inspection",
|
||
"statement": "The architecture shall isolate feature screens from direct theme-token construction."
|
||
},
|
||
{
|
||
"id": "SAD-004",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Unit Test",
|
||
"statement": "The architecture shall implement connection-state token mapping in the design system."
|
||
},
|
||
{
|
||
"id": "SAD-005",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Unit Test",
|
||
"statement": "The architecture shall implement voice-state token mapping in the design system."
|
||
},
|
||
{
|
||
"id": "SAD-006",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Unit Test",
|
||
"statement": "The architecture shall implement latency, packet-loss, diagnostics, and error token mapping."
|
||
},
|
||
{
|
||
"id": "SAD-007",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Widget Test",
|
||
"statement": "The architecture shall expose tokens through Flutter theming mechanisms."
|
||
},
|
||
{
|
||
"id": "SAD-008",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell",
|
||
"verification": "Widget Test, Integration Test",
|
||
"statement": "The architecture shall provide an Adaptive Shell that owns window-class resolution."
|
||
},
|
||
{
|
||
"id": "SAD-009",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Adaptive Shell",
|
||
"verification": "Integration Test",
|
||
"statement": "The architecture shall implement a compact layout branch."
|
||
},
|
||
{
|
||
"id": "SAD-010",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Adaptive Shell",
|
||
"verification": "Integration Test",
|
||
"statement": "The architecture shall implement a medium layout branch."
|
||
},
|
||
{
|
||
"id": "SAD-011",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Adaptive Shell",
|
||
"verification": "System Test",
|
||
"statement": "The architecture shall implement an expanded layout branch."
|
||
},
|
||
{
|
||
"id": "SAD-012",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Components, Feature Modules",
|
||
"verification": "Widget Test",
|
||
"statement": "The architecture shall implement a Connection Status UI component."
|
||
},
|
||
{
|
||
"id": "SAD-013",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Components, Voice Feature",
|
||
"verification": "Widget Test, Integration Test",
|
||
"statement": "The architecture shall implement a persistent VoiceBar component."
|
||
},
|
||
{
|
||
"id": "SAD-014",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Components, Localization",
|
||
"verification": "Accessibility Test",
|
||
"statement": "The architecture shall implement accessible semantics for critical controls."
|
||
},
|
||
{
|
||
"id": "SAD-015",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI",
|
||
"verification": "Widget Test, System Test",
|
||
"statement": "The architecture shall implement keyboard focus traversal for desktop and tablet keyboard use."
|
||
},
|
||
{
|
||
"id": "SAD-016",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Adaptive Shell, Components",
|
||
"verification": "Accessibility Test",
|
||
"statement": "The architecture shall protect critical controls under increased text scaling."
|
||
},
|
||
{
|
||
"id": "SAD-017",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell, Platform Services",
|
||
"verification": "Platform Test",
|
||
"statement": "The architecture shall centralize safe-area and inset handling."
|
||
},
|
||
{
|
||
"id": "SAD-018",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Services",
|
||
"verification": "Platform Test",
|
||
"statement": "The architecture shall model Android back behavior through platform services."
|
||
},
|
||
{
|
||
"id": "SAD-019",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Services",
|
||
"verification": "Platform Test",
|
||
"statement": "The architecture shall model iOS navigation, keyboard avoidance, safe area, and haptics through platform services."
|
||
},
|
||
{
|
||
"id": "SAD-020",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The architecture shall implement a Localization Service for product-owned strings."
|
||
},
|
||
{
|
||
"id": "SAD-021",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service, Protocol DTOs, Flutter UI",
|
||
"verification": "Integration Test",
|
||
"statement": "The architecture shall separate product localization from server-provided content."
|
||
},
|
||
{
|
||
"id": "SAD-022",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Bridge, Rust Core, Flutter UI",
|
||
"verification": "Integration Test",
|
||
"statement": "The architecture shall preserve Unicode through protocol, bridge, state, and UI paths."
|
||
},
|
||
{
|
||
"id": "SAD-023",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Platform Adapter, Bridge",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "The architecture shall isolate non-UTF-8 conversion in boundary adapters."
|
||
},
|
||
{
|
||
"id": "SAD-024",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Storage",
|
||
"verification": "Test, Audit",
|
||
"statement": "The architecture shall preserve multilingual content in diagnostics except for intentional redaction."
|
||
},
|
||
{
|
||
"id": "SAD-025",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI",
|
||
"verification": "Localization Test",
|
||
"statement": "The architecture shall support bidirectional text where the platform text engine supports it."
|
||
},
|
||
{
|
||
"id": "SAD-026",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service, Diagnostics UI",
|
||
"verification": "Localization Test",
|
||
"statement": "The architecture shall centralize locale-aware formatting."
|
||
},
|
||
{
|
||
"id": "SAD-027",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Localization Service",
|
||
"verification": "Inspection, Test",
|
||
"statement": "The architecture shall keep diagnostic machine fields language-neutral."
|
||
},
|
||
{
|
||
"id": "SAD-028",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "UX, Software Engineering",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall maintain downstream UI/UX and design-system documentation."
|
||
},
|
||
{
|
||
"id": "SAD-029",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Inspection",
|
||
"statement": "The architecture shall enforce SRS-only source traceability for SAD."
|
||
},
|
||
{
|
||
"id": "SAD-030",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Design",
|
||
"verification": "Inspection",
|
||
"statement": "The architecture shall enforce SAD-only source traceability for SDD."
|
||
},
|
||
{
|
||
"id": "SAD-031",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell",
|
||
"verification": "Integration Test",
|
||
"statement": "The architecture shall initialize theme, localization, and platform services before first feature render."
|
||
},
|
||
{
|
||
"id": "SAD-032",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, Protocol Adapter",
|
||
"verification": "Integration Test",
|
||
"statement": "The architecture shall isolate TeamSpeak-compatible protocol integration behind Rust protocol components."
|
||
},
|
||
{
|
||
"id": "SAD-033",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, State Sync",
|
||
"verification": "System Test",
|
||
"statement": "The architecture shall isolate authoritative server state in Rust Core and state synchronization components."
|
||
},
|
||
{
|
||
"id": "SAD-034",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Platform Audio",
|
||
"verification": "Audio Test",
|
||
"statement": "The architecture shall isolate real-time audio processing in the audio subsystem."
|
||
},
|
||
{
|
||
"id": "SAD-052",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall maintain an interface catalog for architecturally significant software interfaces."
|
||
},
|
||
{
|
||
"id": "SAD-056",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Architecture, Bridge, Rust Core, Platform Services",
|
||
"verification": "Review, Integration Test",
|
||
"statement": "The architecture shall define software interface error-handling responsibilities at the architectural level."
|
||
},
|
||
{
|
||
"id": "SAD-061",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "iOS Build Configuration, Platform Services",
|
||
"verification": "Platform Test, Inspection",
|
||
"statement": "The software architecture shall isolate iOS runtime minimum version configuration from feature logic."
|
||
},
|
||
{
|
||
"id": "SAD-062",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Release Pipeline, iOS Build Configuration",
|
||
"verification": "Release Inspection",
|
||
"statement": "The software architecture shall treat Apple App Store SDK compliance as a release pipeline and build configuration responsibility."
|
||
},
|
||
{
|
||
"id": "SAD-063",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Android Build Configuration, Platform Services, Release Pipeline",
|
||
"verification": "Platform Test, Release Inspection",
|
||
"statement": "The software architecture shall isolate Android runtime minimum version and Play target API compliance in Android build configuration and platform services. The Android minimum runtime baseline is API 28 (Android 9.0) per DEC-004 (Accepted "
|
||
},
|
||
{
|
||
"id": "SAD-064",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Rust Core, State Sync, Audio Subsystem, Protocol Adapter",
|
||
"verification": "System Test, Review",
|
||
"statement": "The software architecture shall model one active connection as the MVP runtime invariant across UI, Rust Core, state synchronization, audio routing, and protocol adapter components."
|
||
},
|
||
{
|
||
"id": "SAD-065",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Platform Audio, Settings UI",
|
||
"verification": "Audio Test",
|
||
"statement": "The software architecture shall assign audio processing defaults and capability detection to the audio subsystem and settings presentation layer."
|
||
},
|
||
{
|
||
"id": "SAD-067",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Platform Secure Storage",
|
||
"verification": "Storage Test, Security Audit",
|
||
"statement": "The software architecture shall isolate non-secret local persistence in a database repository layer and secret persistence in platform secure storage services."
|
||
},
|
||
{
|
||
"id": "SAD-068",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge Facade, Flutter State, Rust Core",
|
||
"verification": "Integration Test, Architecture Review",
|
||
"statement": "The software architecture shall use a stable typed bridge facade with schema-controlled DTO boundaries between Flutter and Rust."
|
||
},
|
||
{
|
||
"id": "SAD-069",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Privacy, Release Pipeline",
|
||
"verification": "Privacy Review, Security Audit",
|
||
"statement": "The software architecture shall exclude automatic telemetry, automatic diagnostic upload, and automatic crash reporting from MVP components and release configuration."
|
||
},
|
||
{
|
||
"id": "SAD-070",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Architecture, Documentation Control",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The software architecture shall record the product decisions affecting platform baselines, connection scope, audio defaults, audio implementation path, storage, bridge, diagnostics, and crash reporting in the ADR and decision baseline."
|
||
},
|
||
{
|
||
"id": "SAD-071",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio, Platform Input",
|
||
"verification": "Architecture Review, Unit Test",
|
||
"statement": "The software architecture shall isolate desktop PTT into a `DesktopPttBackend` trait owned by the audio subsystem, with the active implementation selected at runtime by a `platform_input::select` factory. Only the factory and the audio engi"
|
||
},
|
||
{
|
||
"id": "SAD-072",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Windows)",
|
||
"verification": "Platform Test (Windows), Architecture Review",
|
||
"statement": "The Windows PTT backend shall be a three-level ladder (`WindowsRawInputBackend` -> `WindowsHookBackend` -> `FocusedPttBackend`). The ladder is evaluated once at audio-engine start; the chosen rung is fixed for the lifetime of that engine an"
|
||
},
|
||
{
|
||
"id": "SAD-073",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (macOS)",
|
||
"verification": "Platform Test (macOS), Architecture Review",
|
||
"statement": "The macOS PTT backend shall be a two-level ladder (`MacOSEventTapBackend` -> `FocusedPttBackend`) with explicit permission state surfaced through `PttCapabilityLevel`. The permission query shall not block the audio-engine start path; an und"
|
||
},
|
||
{
|
||
"id": "SAD-074",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Linux)",
|
||
"verification": "Platform Test (Linux, GNOME Wayland), Architecture Review",
|
||
"statement": "The Linux PTT backend shall be a two-level ladder (`LinuxGnomeWaylandBackend` using the freedesktop `org.freedesktop.portal.GlobalShortcuts` interface, -> `FocusedPttBackend`). Untested display servers, untested compositors, and missing D-B"
|
||
},
|
||
{
|
||
"id": "SAD-075",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio",
|
||
"verification": "Unit Test, Audio Test",
|
||
"statement": "The audio engine shall expose `AudioTransmitGate`, a thin object that owns the `transmit_active` AtomicBool and exposes `set` and `load` operations only. The Opus encoder feed shall consult `AudioTransmitGate::load()` once per outbound fram"
|
||
},
|
||
{
|
||
"id": "SAD-076",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge, Audio, Diagnostics",
|
||
"verification": "Architecture Review, Privacy Review",
|
||
"statement": "The bridge shall expose PTT events through the existing `BridgeEvent` stream, adding a `BridgeEvent::PttCapability { level, backend_id }` variant. The bridge shall never carry raw key codes or scan codes across the FFI boundary; the trait s"
|
||
},
|
||
{
|
||
"id": "SAD-077",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics",
|
||
"verification": "Unit Test, Privacy Review",
|
||
"statement": "The diagnostics subsystem shall add a `PttSanitizer` decorator over the `RedactingLogLayer` log sink. The decorator shall scan each record's field set for the well-known names `key_code`, `scan_code`, `virtual_key`, `vk`, `keysym`, `keysym_"
|
||
},
|
||
{
|
||
"id": "SAD-078",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI",
|
||
"verification": "UI Review, User Acceptance Test",
|
||
"statement": "The Flutter UI shall consume `BridgeEvent::PttCapability` and render a small capability badge in the Voice Bar. When the capability resolves to `L0` on a platform that the user reasonably expected to support Global PTT (for example Windows "
|
||
},
|
||
{
|
||
"id": "SAD-079",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The audio engine shall own the missed-key-up watchdog as a single tokio task that subscribes to `transmit_active` transitions through a `tokio::sync::watch` channel; on a configured timeout (default 30 s, owner-tunable) without a release ev"
|
||
},
|
||
{
|
||
"id": "SAD-080",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Windows / macOS / Linux), Bridge, Flutter UI",
|
||
"verification": "Unit Test, Platform Test, UI Review",
|
||
"statement": "The software architecture shall expose a mouse-side-button input class as a first-class member of the cross-platform PTT binding type so the Windows and macOS backends can drive `transmit_active` from `Mouse4` / `Mouse5` events while the Li"
|
||
},
|
||
{
|
||
"id": "SAD-081",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio, Bridge, Flutter UI",
|
||
"verification": "Integration Test, UI Review",
|
||
"statement": "The software architecture shall remove the `start_audio` and `stop_audio` bridge calls from the public bridge surface and shall replace them with `voice_join(channel_id) -> Result<(), VoiceError>` and `voice_leave() -> Result<(), VoiceError"
|
||
},
|
||
{
|
||
"id": "SAD-082",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software architecture shall add a `ReleaseTailTimer` element to the audio subsystem, owned by the `PttController` and acting as an adapter between the `DesktopPttBackend` `transmit` signal and the `AudioTransmitGate::set()` call. On key"
|
||
},
|
||
{
|
||
"id": "SAD-083",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software architecture shall add a `TransmitModeSelector` element owned by the audio engine that consults the current `TransmitMode` from the identity store on every state evaluation. In `Ptt` mode the selector defers to the `PttControll"
|
||
},
|
||
{
|
||
"id": "SAD-084",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Platform Audio Adapter (Android)",
|
||
"verification": "Platform Test (Android), Audio Test, Architecture Review",
|
||
"statement": "The software architecture shall allocate Android in-call audio-mode management to an `AndroidAudioModeController` element inside the Android platform audio adapter, owned by the audio subsystem and bound to the voice-session lifecycle rathe"
|
||
},
|
||
{
|
||
"id": "SAD-085",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Services (Android Permission Adapter), Audio Subsystem, Flutter UI, Bridge",
|
||
"verification": "Platform Test (Android), Integration Test, Privacy Review",
|
||
"statement": "The software architecture shall extend the Android platform permission adapter (within Platform Services) to own the runtime `RECORD_AUDIO` permission flow on behalf of the audio subsystem, and shall recognise listen-only operation (`captur"
|
||
},
|
||
{
|
||
"id": "SAD-086",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Services (Android), Audio Subsystem",
|
||
"verification": "Platform Test (Android), Integration Test",
|
||
"statement": "The software architecture shall allocate Android foreground-service behaviour for active voice sessions to an `AndroidVoiceForegroundService` element owned by the Android platform services container, bound to the voice-session lifecycle (st"
|
||
},
|
||
{
|
||
"id": "SAD-087",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "macOS Build Configuration, Platform Services (macOS), Release Pipeline",
|
||
"verification": "Platform Test (macOS), Release Inspection, Architecture Review",
|
||
"statement": "The software architecture shall isolate macOS runtime baseline configuration, universal-binary packaging, framework layout, and CocoaPods integration in macOS build configuration and platform services, parallel to SAD-061 (iOS runtime) and "
|
||
},
|
||
{
|
||
"id": "SAD-088",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem (`chanora_audio` crate, `benches/` directory; extends SAD-034)",
|
||
"verification": "Inspection (bench-function presence and metric coverage), Bench Run (criterion executes on the host runner), Architecture Review",
|
||
"statement": "The software architecture shall add a `criterion`-based realtime-audio benchmark harness as a first-class architectural element of the `chanora_audio` crate, extending the existing audio-subsystem allocation in SAD-034. The harness lives in"
|
||
},
|
||
{
|
||
"id": "SAD-089",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem (`chanora_audio` crate, `benches/baselines/` subdirectory; output sink of SAD-088)",
|
||
"verification": "Inspection (file path, schema), Bench Run (file is regenerable end-to-end)",
|
||
"statement": "The software architecture shall pin the baseline-JSON on-disk path for the SAD-088 harness to `crates/chanora_audio/benches/baselines/x86_64-unknown-linux-gnu.json`, a single deterministic file per host architecture under the crate's `bench"
|
||
},
|
||
{
|
||
"id": "SAD-090",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Build, Release, Operations (`.github/workflows/bench-advisory.yml`; extends SAD-037 — CI surface, SE-18 realization)",
|
||
"verification": "Inspection (workflow trigger / runner / non-blocking exit), CI Dry Run (synthetic PR exercises markdown rendering end-to-end), Architecture Review",
|
||
"statement": "The software architecture shall add an advisory CI workflow file `.github/workflows/bench-advisory.yml` to the build/release/operations allocation (extending SAD-037), realizing the SRS-218 advisory-reporting workflow. Triggers: `pull_reque"
|
||
},
|
||
{
|
||
"id": "SAD-091",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Build, Release, Operations (`.github/workflows/bench-baseline-update.yml`; extends SAD-037 — CI surface, SE-18 realization; sole writer of SAD-089)",
|
||
"verification": "Inspection (trigger is `workflow_dispatch` only; commit destination is SAD-089's path), CI Dry Run (manual invocation regenerates baseline end-to-end), Architecture Review",
|
||
"statement": "The software architecture shall add a separate baseline-update CI workflow file `.github/workflows/bench-baseline-update.yml` to the build/release/operations allocation (extending SAD-037), realizing the SRS-218 clause 5 baseline-update-iso"
|
||
},
|
||
{
|
||
"id": "SAD-092",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, State Sync",
|
||
"verification": "Architecture Review, Integration Test, System Test",
|
||
"statement": "The software architecture shall assign authoritative current-channel membership ownership to Rust Core and the State Synchronization Engine. The authoritative current channel is the last channel membership state confirmed by Rust Core from "
|
||
},
|
||
{
|
||
"id": "SAD-093",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Flutter State, Bridge Facade, Rust Core",
|
||
"verification": "UI Test, Integration Test, System Test",
|
||
"statement": "The software architecture shall model a channel-join request as user intent crossing the bridge, not as an immediate local membership mutation. Flutter may expose the requested target channel as a non-authoritative pending target for visual"
|
||
},
|
||
{
|
||
"id": "SAD-094",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, State Sync, Protocol Adapter, Bridge Facade, Diagnostics, Flutter State",
|
||
"verification": "Integration Test, System Test, Diagnostics Review",
|
||
"statement": "The software architecture shall preserve the previous authoritative current channel on channel-join failure or timeout and shall clear the non-authoritative pending target through Rust Core / State Sync events. Join denial, network/protocol"
|
||
},
|
||
{
|
||
"id": "SAD-095",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync, Rust Core, Protocol Adapter, Bridge Facade, Flutter State, Verification Support",
|
||
"verification": "Architecture Review, SDD Inspection, Unit Test, Integration Test, System Test",
|
||
"statement": "The downstream SDD shall define deterministic State Sync handling for channel-join edge cases while preserving the SAD-092 authoritative ownership boundary. Required SDD coverage includes duplicate join requests, a different target requeste"
|
||
},
|
||
{
|
||
"id": "SAD-096",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, State Sync, Protocol Adapter, Bridge Facade, Diagnostics, Verification Support",
|
||
"verification": "Architecture Review, Integration Test, System Test, Diagnostics Review",
|
||
"statement": "The software architecture shall expose an explicit Protocol Adapter command seam for leaving the current voice channel / moving the current client out of channel membership; downstream design may name the seam `leave_channel`, `move_out_of_"
|
||
},
|
||
{
|
||
"id": "SDD-001",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "`ChanoraApp` shall initialize theme, localization, platform services, and routing before rendering feature content."
|
||
},
|
||
{
|
||
"id": "SDD-002",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraThemeFactory` shall create Material 3 ThemeData for light and dark modes."
|
||
},
|
||
{
|
||
"id": "SDD-003",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraThemeFactory` shall support seed-color replacement without feature-screen changes."
|
||
},
|
||
{
|
||
"id": "SDD-004",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraSemanticColors` shall define connection state colors independently from base ColorScheme."
|
||
},
|
||
{
|
||
"id": "SDD-005",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraSemanticColors` shall define voice state colors independently from base ColorScheme."
|
||
},
|
||
{
|
||
"id": "SDD-006",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraSemanticColors` shall define latency, packet-loss, diagnostics, and error semantic roles."
|
||
},
|
||
{
|
||
"id": "SDD-007",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraSpacing` shall define reusable spacing values for compact, medium, and expanded layouts."
|
||
},
|
||
{
|
||
"id": "SDD-008",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraShape` shall define reusable corner and shape values for cards, buttons, panels, badges, and sheets."
|
||
},
|
||
{
|
||
"id": "SDD-009",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraMotion` shall define standard durations and reduced-motion behavior."
|
||
},
|
||
{
|
||
"id": "SDD-010",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Static Inspection",
|
||
"statement": "Feature widgets shall read tokens through Flutter theme accessors only."
|
||
},
|
||
{
|
||
"id": "SDD-011",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ChanoraAdaptiveShell` shall classify window width into compact, medium, or expanded."
|
||
},
|
||
{
|
||
"id": "SDD-012",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`ChanoraAdaptiveShell` shall dispatch to `CompactShell`, `MediumShell`, or `ExpandedShell`."
|
||
},
|
||
{
|
||
"id": "SDD-013",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`CompactShell` shall render single-column content and mobile navigation."
|
||
},
|
||
{
|
||
"id": "SDD-014",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`MediumShell` shall render side navigation or navigation rail behavior."
|
||
},
|
||
{
|
||
"id": "SDD-015",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`ExpandedShell` shall render persistent pane regions and persistent voice controls."
|
||
},
|
||
{
|
||
"id": "SDD-016",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`ConnectionStatusPresenter` shall provide non-color-only connection state presentation data."
|
||
},
|
||
{
|
||
"id": "SDD-017",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`ChanoraVoiceBar` shall expose mute, deaf, push-to-talk, input meter, current channel, and latency properties."
|
||
},
|
||
{
|
||
"id": "SDD-018",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`ChanoraVoiceBar` shall remain renderable as a persistent shell slot."
|
||
},
|
||
{
|
||
"id": "SDD-019",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`ChanoraChannelTree` shall support hierarchical channel nodes and client rows."
|
||
},
|
||
{
|
||
"id": "SDD-020",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`ChanoraChannelTree` shall support selected state, expansion state, join intent, and context-menu intent."
|
||
},
|
||
{
|
||
"id": "SDD-021",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test, Accessibility Test",
|
||
"statement": "`ChanoraClientTile` shall display client status with text, icon, and semantic state cues."
|
||
},
|
||
{
|
||
"id": "SDD-022",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test, Accessibility Test",
|
||
"statement": "`ChanoraStatusBadge` shall expose visible text or icon and accessibility semantics."
|
||
},
|
||
{
|
||
"id": "SDD-023",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "`ChanoraAudioMeter` shall display audio input level and support reduced-motion fallback."
|
||
},
|
||
{
|
||
"id": "SDD-024",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Accessibility Test",
|
||
"statement": "All icon-only buttons shall provide localized semantic labels."
|
||
},
|
||
{
|
||
"id": "SDD-025",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "Focusable components shall define focus order and visible focus style."
|
||
},
|
||
{
|
||
"id": "SDD-026",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Accessibility Test",
|
||
"statement": "Adaptive shell panes shall support increased text scale without losing critical actions."
|
||
},
|
||
{
|
||
"id": "SDD-027",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test",
|
||
"statement": "`PlatformInsetsService` shall provide safe area, keyboard inset, display cutout, and desktop inset data."
|
||
},
|
||
{
|
||
"id": "SDD-028",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test, Widget Test",
|
||
"statement": "`BackIntentService` shall normalize Android/system back behavior into route-level intents."
|
||
},
|
||
{
|
||
"id": "SDD-029",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test",
|
||
"statement": "`HapticsService` shall expose platform-aware haptic feedback operations."
|
||
},
|
||
{
|
||
"id": "SDD-030",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test",
|
||
"statement": "`KeyboardAvoidancePolicy` shall prevent critical controls from being covered by virtual keyboards."
|
||
},
|
||
{
|
||
"id": "SDD-031",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`LocalizationService` shall load product string resources for the active locale."
|
||
},
|
||
{
|
||
"id": "SDD-032",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`LocalizationService` shall fall back to the baseline English locale when a key is missing."
|
||
},
|
||
{
|
||
"id": "SDD-033",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`LocalizationService` shall allow new locale resources without changes to protocol, audio, state, or storage modules."
|
||
},
|
||
{
|
||
"id": "SDD-034",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Integration Test",
|
||
"statement": "`ContentTextAdapter` shall pass through server-provided names and messages without translation."
|
||
},
|
||
{
|
||
"id": "SDD-035",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "`UnicodeTextBoundary` shall validate cross-layer text DTOs as UTF-8 compatible strings."
|
||
},
|
||
{
|
||
"id": "SDD-036",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "Protocol-boundary conversion shall be implemented only in protocol adapter code."
|
||
},
|
||
{
|
||
"id": "SDD-037",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "Platform-boundary conversion shall be implemented only in platform adapter code."
|
||
},
|
||
{
|
||
"id": "SDD-038",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Test, Audit",
|
||
"statement": "Diagnostics export shall preserve Unicode after redaction."
|
||
},
|
||
{
|
||
"id": "SDD-039",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Localization Test",
|
||
"statement": "Bidi text rendering shall use Flutter text widgets and directionality behavior compatible with platform support."
|
||
},
|
||
{
|
||
"id": "SDD-040",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "Locale-aware formatting shall be centralized in localization utilities."
|
||
},
|
||
{
|
||
"id": "SDD-041",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "Diagnostics event keys shall remain stable and language-neutral."
|
||
},
|
||
{
|
||
"id": "SDD-042",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "UI/UX supporting documents shall be versioned with the software architecture baseline."
|
||
},
|
||
{
|
||
"id": "SDD-043",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "SAD source validation shall reject direct lower-layer source fields."
|
||
},
|
||
{
|
||
"id": "SDD-044",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "SDD source validation shall reject direct non-SAD source fields."
|
||
},
|
||
{
|
||
"id": "SDD-045",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Integration Test",
|
||
"statement": "Theme/localization/platform initialization shall be tested before first feature render."
|
||
},
|
||
{
|
||
"id": "SDD-046",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Integration Test",
|
||
"statement": "Bridge facade DTOs shall expose only stable UI-safe data structures."
|
||
},
|
||
{
|
||
"id": "SDD-047",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "Core event mapping shall convert Rust Core events into feature view models."
|
||
},
|
||
{
|
||
"id": "SDD-048",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "Audio state view models shall separate UI state from real-time audio processing."
|
||
},
|
||
{
|
||
"id": "SDD-049",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "Storage access shall be isolated from feature widgets behind repository or service APIs."
|
||
},
|
||
{
|
||
"id": "SDD-050",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Widget Test",
|
||
"statement": "Diagnostics UI shall obtain localized display text from diagnostics presentation services."
|
||
},
|
||
{
|
||
"id": "SDD-066",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`SoftwareUnitTraceChecker` shall verify that SDD items link directly to SAD IDs only."
|
||
},
|
||
{
|
||
"id": "SDD-071",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Inspection, Platform Test",
|
||
"statement": "`IOSBuildConfig` shall define the iOS minimum runtime deployment target as iOS 13 unless an approved platform change raises it."
|
||
},
|
||
{
|
||
"id": "SDD-072",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Release Inspection",
|
||
"statement": "`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."
|
||
},
|
||
{
|
||
"id": "SDD-073",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test, Release Inspection, Build Test",
|
||
"statement": "`AndroidBuildConfig` shall define Android API 28 (Android 9.0 Pie) as the minimum Android runtime baseline per DEC-004 and shall expose target SDK configuration for release inspection. This supersedes the prior API 24 recommendation and is "
|
||
},
|
||
{
|
||
"id": "SDD-074",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, System Test",
|
||
"statement": "`ConnectionSessionManager` shall enforce a single active server connection in MVP."
|
||
},
|
||
{
|
||
"id": "SDD-075",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Audio Test",
|
||
"statement": "`AudioProcessingSettings` shall default AEC, AGC, Noise Suppression, and High-Pass Filter to enabled where supported and stable."
|
||
},
|
||
{
|
||
"id": "SDD-077",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Storage Test",
|
||
"statement": "`LocalDatabaseRepository` shall persist non-secret local state through SQLite or an equivalent embedded database abstraction."
|
||
},
|
||
{
|
||
"id": "SDD-078",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Security Audit",
|
||
"statement": "`SecretStorageRepository` shall persist secrets only through platform secure storage service interfaces."
|
||
},
|
||
{
|
||
"id": "SDD-079",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Integration Test, Inspection",
|
||
"statement": "`TypedBridgeFacade` shall define generated or schema-controlled DTOs for Flutter/Rust commands, results, and events."
|
||
},
|
||
{
|
||
"id": "SDD-080",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Privacy Review, Security Audit",
|
||
"statement": "`DiagnosticsPrivacyGate` shall disable automatic diagnostic upload, telemetry upload, and crash reporting in MVP release configuration unless an approved decision enables them."
|
||
},
|
||
{
|
||
"id": "SDD-081",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Inspection",
|
||
"statement": "`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) -> Resu"
|
||
},
|
||
{
|
||
"id": "SDD-082",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`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 r"
|
||
},
|
||
{
|
||
"id": "SDD-083",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Windows), Unit Test",
|
||
"statement": "`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 resu"
|
||
},
|
||
{
|
||
"id": "SDD-084",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Windows), Unit Test",
|
||
"statement": "`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`"
|
||
},
|
||
{
|
||
"id": "SDD-085",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (macOS), User Acceptance Test",
|
||
"statement": "`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"
|
||
},
|
||
{
|
||
"id": "SDD-086",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Linux, GNOME Wayland), Unit Test",
|
||
"statement": "`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 o"
|
||
},
|
||
{
|
||
"id": "SDD-087",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, UI Review",
|
||
"statement": "`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\"`."
|
||
},
|
||
{
|
||
"id": "SDD-088",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "`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 `P"
|
||
},
|
||
{
|
||
"id": "SDD-089",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test",
|
||
"statement": "`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 t"
|
||
},
|
||
{
|
||
"id": "SDD-090",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Privacy Review",
|
||
"statement": "`PttSanitizer` shall implement `tracing_subscriber::Layer` and decorate the existing `RedactingLogLayer`. Records whose field names match any of the following banned field names shall be dropped before `on_event` reaches the wrapped sink: `"
|
||
},
|
||
{
|
||
"id": "SDD-091",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "UI Review, User Acceptance Test",
|
||
"statement": "`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"
|
||
},
|
||
{
|
||
"id": "SDD-092",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "`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 ->"
|
||
},
|
||
{
|
||
"id": "SDD-093",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Platform Test (Windows / macOS / Linux), UI Review",
|
||
"statement": "`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 `a"
|
||
},
|
||
{
|
||
"id": "SDD-094",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Integration Test, UI Review",
|
||
"statement": "`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::engi"
|
||
},
|
||
{
|
||
"id": "SDD-095",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, UI Review",
|
||
"statement": "`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)`"
|
||
},
|
||
{
|
||
"id": "SDD-096",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "`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 `t"
|
||
},
|
||
{
|
||
"id": "SDD-097",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "UI Review, Widget Test",
|
||
"statement": "`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; "
|
||
},
|
||
{
|
||
"id": "SDD-098",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test, Release Inspection",
|
||
"statement": "`IOSAudioSessionConfig` shall be a Swift unit that configures `AVAudioSession` with category `.playAndRecord`, mode `.default`, and options `.defaultToSpeaker | .allowBluetoothHFP | .allowBluetoothA2DP`. `setCategory` shall be called from `"
|
||
},
|
||
{
|
||
"id": "SDD-099",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test, Demo",
|
||
"statement": "`IOSPermissionRequester` shall call `AVAudioSession.sharedInstance().requestRecordPermission` approximately 1 second after app launch. The permission result shall be logged. A denied permission shall surface as an audio engine failure at `v"
|
||
},
|
||
{
|
||
"id": "SDD-100",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test TC-9.3",
|
||
"statement": "Swift shall observe `AVAudioSession.routeChangeNotification`. On route change where `reason == .oldDeviceUnavailable` or `reason == .newDeviceAvailable`, Swift shall call the Rust bridge method `handleRouteChange()`. The Rust side shall inv"
|
||
},
|
||
{
|
||
"id": "SDD-101",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test TC-9.1, TC-9.2",
|
||
"statement": "Swift shall observe `AVAudioSession.interruptionNotification`. On `.began` the audio shall pause via `VPIO.stop()`. On `.ended` with `shouldResume == true` the audio shall resume via `VPIO.start()`. A phone call shall yield the audio sessio"
|
||
},
|
||
{
|
||
"id": "SDD-102",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test TC-8",
|
||
"statement": "`Info.plist` shall contain `UIBackgroundModes = [audio]`. The VPIO unit shall continue running when the app backgrounds. iOS shall show the red microphone indicator in the status bar while background audio is active. `AVAudioSession` shall "
|
||
},
|
||
{
|
||
"id": "SDD-103",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test TC-3, TC-12",
|
||
"statement": "iOS P0 shall use `FocusedPttBackend` only. There shall be no `DesktopPttBackend` ladder on iOS. `PttCapabilityLevel` shall always be `L0Focused`. The UI shall render an on-screen PTT button. A capability badge shall explain the iOS limitati"
|
||
},
|
||
{
|
||
"id": "SDD-104",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test, Audio Test",
|
||
"statement": "`VoiceProcessingIO` AudioUnit shall provide hardware AEC, AGC, and noise suppression. These shall always be engaged and shall not be user-disableable. The Flutter audio processing settings UI shall display these as hardware-enabled with swi"
|
||
},
|
||
{
|
||
"id": "SDD-105",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Android), Inspection",
|
||
"statement": "`AndroidJniBootstrap` shall own the JNI initialisation surface for `chanora_bridge` on Android, covering native library load, `JNI_OnLoad` `JavaVM*` capture, and `initChanoraContext(Context)` invocation. This item back-fills the existing im"
|
||
},
|
||
{
|
||
"id": "SDD-106",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Android), Integration Test, UI Review",
|
||
"statement": "`AndroidPermissionRequester` shall own the Android runtime acquisition of `RECORD_AUDIO` on behalf of the audio subsystem and shall expose the current permission state to the audio engine and to Flutter through the existing `BridgeEvent` st"
|
||
},
|
||
{
|
||
"id": "SDD-107",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Android), Integration Test, Release Inspection",
|
||
"statement": "`AndroidVoiceForegroundService` shall own the Android foreground service lifecycle for active voice sessions. It shall be started by the audio engine on first `voice_join` and stopped on the last `voice_leave` or on engine `shutdown_if_idle"
|
||
},
|
||
{
|
||
"id": "SDD-108",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Android), Unit Test, Audio Test",
|
||
"statement": "`AndroidAudioModeController` shall own engagement and release of Android's in-call audio mode for the voice subsystem. It shall snapshot the prior `AudioManager.getMode()` on first engage and restore it on last release, shall be reference-c"
|
||
},
|
||
{
|
||
"id": "SDD-110",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Android), UI Review",
|
||
"statement": "`AndroidPttCapability` shall pin Android P0 to `FocusedPttBackend` only. There shall be no `DesktopPttBackend` ladder on Android, no system-wide global key hook, and no global accessibility-service-based PTT. `PttCapabilityLevel` shall alwa"
|
||
},
|
||
{
|
||
"id": "SDD-111",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test (Rust), Platform Test (Android), Build Verification (cross-platform `cargo build` for android / ios / desktop targets)",
|
||
"statement": "`AndroidVoiceAudioBackend` shall be the Android-side implementation of a new platform-abstracted voice-audio capture+playback element. The cross-platform abstraction shall be expressed as a Rust trait — provisionally `MobileVoiceAudioBacken"
|
||
},
|
||
{
|
||
"id": "SDD-112",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test (Rust, config-validation paths), Platform Test (Android, achieved-value recording)",
|
||
"statement": "`AndroidVoiceStreamConfig` shall be the immutable, validated configuration passed by the audio engine into `android_voice_unit::AndroidVoiceUnit::open()` (per SDD-111). It shall encode the AAudio / Oboe stream-construction parameters that S"
|
||
},
|
||
{
|
||
"id": "SDD-113",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Platform Test (Android, device-matrix from SDD-116), Unit Test (Rust, fallback-path branch coverage)",
|
||
"statement": "`AndroidHardwareAudioEffects` shall be the element responsible for engaging the Android platform hardware voice-audio effects — `AcousticEchoCanceler`, `NoiseSuppressor`, `AutomaticGainControl` — on the active microphone capture session, an"
|
||
},
|
||
{
|
||
"id": "SDD-114",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Manifest Inspection (CI), Platform Test (Android)",
|
||
"statement": "`AndroidVoiceManifestRequirements` shall enumerate, at the SDD layer, the Android manifest declarations required for the voice audio backend (SDD-111..SDD-113) and the foreground-service hosting (SDD-107). This unit is a back-fill of declar"
|
||
},
|
||
{
|
||
"id": "SDD-115",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Integration Test (Rust + Android), Platform Test (Android, device-matrix from SDD-116)",
|
||
"statement": "`AndroidVoiceLifecycleSequencing` shall fix the sequencing of voice-session lifecycle operations across the elements introduced in SDD-107 (foreground service), SDD-108 (audio mode controller), SDD-111 (voice audio backend), and SDD-113 (ha"
|
||
},
|
||
{
|
||
"id": "SDD-116",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Aggregation — this SDD is itself a contract for verification engineers; the per-case verification is owned by SWE4-UV / SWE5-IV / SWE6-SV ranges cross-linked below.",
|
||
"statement": "`AndroidVoiceVerificationMatrix` shall specify the minimum Android device matrix that the SDD-111..SDD-115 implementation must be exercised against before the implementation can be declared verified for the purposes of closing risk RISK-AUD"
|
||
},
|
||
{
|
||
"id": "SDD-118",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Build-system Test (Gradle task wiring, up-to-date semantics), Platform Test (Android — verify per-ABI `.so` present in produced AAB / APK and loadable per SDD-105), Unit Test (preflight failure-mode messages)",
|
||
"statement": "`AndroidBridgeBuildAutomation` shall specify how the `chanora_bridge` Rust cdylib is produced and staged for the Android build automatically, without manual `cargo-ndk` invocations and without environment mutation. This unit complements SDD"
|
||
},
|
||
{
|
||
"id": "SDD-119",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Build-system Test (CocoaPods integration on a clean derived-data state), Platform Test (iOS device build, macOS desktop build, both with `chanora_bridge` symbols resolving at runtime).",
|
||
"statement": "`iOSAndMacOSBridgeBuildAutomation` shall record, as a documentation-after-code back-fill, the existing CocoaPods-podspec-driven automation that builds the `chanora_bridge` Rust cdylib for iOS and macOS and embeds the result as an `@rpath`-b"
|
||
},
|
||
{
|
||
"id": "SDD-121",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "",
|
||
"verification": "Unit Test (reducer transition table), Integration Test (bridge + protocol adapter seams), Widget Test (pending visual state), Fault-Injection Test (timeout/reconnect/stale outcome)",
|
||
"statement": "`chanora_state::channel_join` shall own the single deterministic reducer for user-initiated channel-join pending state, authoritative current-channel membership, and reconnect/snapshot reconciliation. Flutter and `chanora_bridge` shall send"
|
||
},
|
||
{
|
||
"id": "SRS-001",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Review",
|
||
"statement": "The software requirements specification shall define software requirements derived from the approved Chanora SysDes baseline."
|
||
},
|
||
{
|
||
"id": "SRS-002",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Inspection",
|
||
"statement": "Each software requirement shall have a unique `SRS-XXX` identifier, type, stage, software allocation, source SysDes link, verification method, acceptance criteria, and feasibility analysis."
|
||
},
|
||
{
|
||
"id": "SRS-003",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Review",
|
||
"statement": "The software requirements shall be structured by software component and cross-cutting concern to support allocation to the software team."
|
||
},
|
||
{
|
||
"id": "SRS-004",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Inspection",
|
||
"statement": "The software requirements shall be prioritized using P0 / MVP, P1 / Beta, P2 / Production, and P3 / Future stage labels."
|
||
},
|
||
{
|
||
"id": "SRS-005",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Inspection",
|
||
"statement": "The software requirements shall maintain bidirectional traceability to SysDes design items only; upstream system-requirement coverage shall be inherited through the approved SysDes allocation baseline."
|
||
},
|
||
{
|
||
"id": "SRS-006",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Review",
|
||
"statement": "The software requirements shall analyze impact on the operating environment for OS services, audio hardware, network connectivity, external compatible servers, secure storage, deployment, and mobile lifecycle constraints."
|
||
},
|
||
{
|
||
"id": "SRS-007",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Review",
|
||
"statement": "The agreed SRS baseline shall be communicated to SAD, SDD, implementation, and verification authors."
|
||
},
|
||
{
|
||
"id": "SRS-008",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Application Container",
|
||
"verification": "Review",
|
||
"statement": "The software shall be implemented as a cross-platform client application and shall not be implemented or described as an operating system."
|
||
},
|
||
{
|
||
"id": "SRS-009",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Application Container, Rust Core",
|
||
"verification": "Review, System Test",
|
||
"statement": "The software shall operate without requiring Chanora-operated backend infrastructure for MVP voice, channel, and text operation."
|
||
},
|
||
{
|
||
"id": "SRS-010",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Application Container, Protocol Adapter",
|
||
"verification": "Inspection",
|
||
"statement": "The software shall not implement TeamSpeak-compatible server hosting functionality in MVP."
|
||
},
|
||
{
|
||
"id": "SRS-011",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "All Software Components",
|
||
"verification": "Inspection",
|
||
"statement": "The software shall use a layered structure that separates Flutter UI, Flutter State, Bridge, Rust Core, Protocol Adapter, State Sync, Audio, Storage, Diagnostics, and Platform Adapters."
|
||
},
|
||
{
|
||
"id": "SRS-012",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Audio Subsystem",
|
||
"verification": "Inspection, Performance Test",
|
||
"statement": "The software shall keep real-time audio processing outside Flutter UI."
|
||
},
|
||
{
|
||
"id": "SRS-013",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Rust Core, Platform Adapters",
|
||
"verification": "Build Test",
|
||
"statement": "The software shall support Windows, macOS, Linux, iOS, and Android through shared Flutter UI, shared Rust Core, and platform-specific adapters."
|
||
},
|
||
{
|
||
"id": "SRS-014",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "The software shall isolate OS-specific permissions, audio routing, lifecycle, secure storage, notification, and packaging behavior behind platform adapter interfaces."
|
||
},
|
||
{
|
||
"id": "SRS-015",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, State Sync, Audio, Diagnostics, Platform Adapters",
|
||
"verification": "Inspection, Demo",
|
||
"statement": "The software shall provide verification hooks for protocol, state, audio, security, packaging, and platform behavior."
|
||
},
|
||
{
|
||
"id": "SRS-016",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Application Container",
|
||
"verification": "Integration Test",
|
||
"statement": "The software shall provide an application container that initializes Flutter UI, Bridge, Rust Core, platform adapters, storage, and diagnostics in a deterministic startup sequence."
|
||
},
|
||
{
|
||
"id": "SRS-017",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI",
|
||
"verification": "UI Test",
|
||
"statement": "The software shall provide a home or entry screen for manual connection, recent servers, and saved bookmarks."
|
||
},
|
||
{
|
||
"id": "SRS-018",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI",
|
||
"verification": "UI Test",
|
||
"statement": "The software shall provide a manual connection UI that accepts host or IP address, port, nickname, and optional server password."
|
||
},
|
||
{
|
||
"id": "SRS-019",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Flutter State",
|
||
"verification": "UI Test, System Test",
|
||
"statement": "The software shall display connection states including Disconnected, Connecting, Synchronizing, Connected, Reconnecting, and Failed or equivalent user-safe states."
|
||
},
|
||
{
|
||
"id": "SRS-020",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Flutter State",
|
||
"verification": "UI Test, System Test",
|
||
"statement": "The software shall display a server channel tree derived from the Rust Core snapshot and delta events."
|
||
},
|
||
{
|
||
"id": "SRS-021",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Flutter State",
|
||
"verification": "UI Test, System Test",
|
||
"statement": "The software shall display online clients in their channels and update the display after client join, leave, and move events."
|
||
},
|
||
{
|
||
"id": "SRS-022",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Flutter State",
|
||
"verification": "UI Test",
|
||
"statement": "The software shall visually identify the current user and current channel when the data is available from Rust Core."
|
||
},
|
||
{
|
||
"id": "SRS-023",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Bridge, Rust Core",
|
||
"verification": "System Test",
|
||
"statement": "The software shall provide a channel join interaction that sends a join command through the Bridge and waits for Rust Core or protocol confirmation before treating the join as authoritative."
|
||
},
|
||
{
|
||
"id": "SRS-024",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Bridge, Rust Core",
|
||
"verification": "UI Test, System Test",
|
||
"statement": "The software shall provide channel text chat UI for message display and message input."
|
||
},
|
||
{
|
||
"id": "SRS-025",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Audio Subsystem",
|
||
"verification": "UI Test, System Test",
|
||
"statement": "The software shall provide a persistent voice control surface for microphone mute, output deaf, push-to-talk state, input level, and current channel."
|
||
},
|
||
{
|
||
"id": "SRS-026",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Audio Subsystem, Storage",
|
||
"verification": "UI Test",
|
||
"statement": "The software shall provide an audio settings UI for input device, output device, Echo Canceller, Automatic Gain Control, Noise Suppression, High-Pass Filter, and related defaults."
|
||
},
|
||
{
|
||
"id": "SRS-027",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Platform Adapters",
|
||
"verification": "UI Test, Privacy Review",
|
||
"statement": "The software shall provide permission explanation UI before requesting microphone, notification, or mobile foreground-service related permissions where platform guidelines allow."
|
||
},
|
||
{
|
||
"id": "SRS-029",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Flutter State",
|
||
"verification": "Inspection",
|
||
"statement": "The Flutter UI shall not directly invoke `tsclientlib`, access raw protocol types, or own authoritative server state."
|
||
},
|
||
{
|
||
"id": "SRS-030",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter State",
|
||
"verification": "Inspection, UI Test",
|
||
"statement": "The Flutter UI shall subscribe to UI-safe core events and reduce them into presentation state only."
|
||
},
|
||
{
|
||
"id": "SRS-031",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge Layer",
|
||
"verification": "Integration Test",
|
||
"statement": "The software shall provide a typed Flutter-Rust Bridge API for connection, channel, chat, voice, settings, storage, and diagnostics commands."
|
||
},
|
||
{
|
||
"id": "SRS-032",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge Layer, Rust Core",
|
||
"verification": "Integration Test",
|
||
"statement": "The Bridge shall expose long-lived event streams from Rust Core to Flutter for connection, snapshot, delta, chat, voice, audio device, error, and diagnostic events."
|
||
},
|
||
{
|
||
"id": "SRS-033",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge Layer",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "The Bridge shall serialize and deserialize only bridge-safe DTOs and shall not expose Rust internal references or raw protocol library objects."
|
||
},
|
||
{
|
||
"id": "SRS-034",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge Layer, Rust Core",
|
||
"verification": "Integration Test",
|
||
"statement": "The Bridge shall map Rust Core errors into user-safe Flutter error DTOs."
|
||
},
|
||
{
|
||
"id": "SRS-035",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge Layer, Rust Core",
|
||
"verification": "Performance Test",
|
||
"statement": "The Bridge shall execute commands asynchronously and shall not block the Flutter UI thread during network, storage, or audio operations."
|
||
},
|
||
{
|
||
"id": "SRS-036",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The Rust Core shall own authoritative connection lifecycle and server state for each active connection."
|
||
},
|
||
{
|
||
"id": "SRS-037",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core",
|
||
"verification": "Inspection, Unit Test",
|
||
"statement": "The Rust Core shall manage connection actors or equivalent isolated execution contexts for connection-specific commands and events."
|
||
},
|
||
{
|
||
"id": "SRS-038",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, Bridge",
|
||
"verification": "Integration Test",
|
||
"statement": "The Rust Core shall expose connect, disconnect, reconnect, join channel, send message, audio control, settings, bookmark, identity, and diagnostics commands to the Bridge."
|
||
},
|
||
{
|
||
"id": "SRS-039",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core",
|
||
"verification": "Inspection",
|
||
"statement": "The Rust Core shall coordinate protocol, state synchronization, audio, storage, diagnostics, and platform adapter interfaces without leaking implementation details to Flutter."
|
||
},
|
||
{
|
||
"id": "SRS-040",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, State Sync",
|
||
"verification": "Unit Test, System Test",
|
||
"statement": "The Rust Core shall emit connection status events for Connecting, Synchronizing, Connected, Reconnecting, Disconnected, and failure states."
|
||
},
|
||
{
|
||
"id": "SRS-041",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core",
|
||
"verification": "System Test",
|
||
"statement": "The Rust Core shall suppress automatic reconnect after user-triggered disconnect."
|
||
},
|
||
{
|
||
"id": "SRS-042",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, Protocol Adapter, State Sync",
|
||
"verification": "System Test",
|
||
"statement": "The Rust Core shall apply reconnect policy after recoverable network or protocol failures."
|
||
},
|
||
{
|
||
"id": "SRS-043",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, State Sync",
|
||
"verification": "System Test, Event Replay Test",
|
||
"statement": "The Rust Core shall rebuild server state from a fresh snapshot after reconnect succeeds."
|
||
},
|
||
{
|
||
"id": "SRS-044",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter",
|
||
"verification": "Inspection",
|
||
"statement": "The Protocol Adapter shall be the only software component that directly depends on `tsclientlib`."
|
||
},
|
||
{
|
||
"id": "SRS-045",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Rust Core",
|
||
"verification": "Protocol Integration Test",
|
||
"statement": "The Protocol Adapter shall connect to TeamSpeak 3-compatible servers through `tsclientlib` using user-provided host, port, nickname, identity, and optional password."
|
||
},
|
||
{
|
||
"id": "SRS-046",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, State Sync",
|
||
"verification": "Protocol Integration Test",
|
||
"statement": "The Protocol Adapter shall fetch server information, channel list, client list, and current-user information needed to build the initial snapshot."
|
||
},
|
||
{
|
||
"id": "SRS-047",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, State Sync",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The Protocol Adapter shall translate raw `tsclientlib` events into internal protocol events."
|
||
},
|
||
{
|
||
"id": "SRS-048",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Rust Core",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The Protocol Adapter shall translate protocol errors into normalized Chanora protocol errors."
|
||
},
|
||
{
|
||
"id": "SRS-049",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter",
|
||
"verification": "Protocol Integration Test",
|
||
"statement": "The Protocol Adapter shall implement channel join commands and report success or failure to Rust Core."
|
||
},
|
||
{
|
||
"id": "SRS-050",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter",
|
||
"verification": "Protocol Integration Test",
|
||
"statement": "The Protocol Adapter shall implement channel text message send and receive paths."
|
||
},
|
||
{
|
||
"id": "SRS-051",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Audio Subsystem",
|
||
"verification": "Protocol Integration Test, Audio Test",
|
||
"statement": "The Protocol Adapter shall implement voice packet send and receive paths required by the audio subsystem."
|
||
},
|
||
{
|
||
"id": "SRS-052",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Diagnostics",
|
||
"verification": "Demo",
|
||
"statement": "The Protocol Adapter shall expose protocol-probe diagnostics for connection, snapshot, event, text, and voice compatibility."
|
||
},
|
||
{
|
||
"id": "SRS-054",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync",
|
||
"verification": "Unit Test",
|
||
"statement": "The State Synchronization Engine shall maintain a connection state model containing connection status, server info, current user, channels, clients, channel tree, permissions, chat state, and voice state where available."
|
||
},
|
||
{
|
||
"id": "SRS-055",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The State Synchronization Engine shall produce a full snapshot event after initial synchronization."
|
||
},
|
||
{
|
||
"id": "SRS-056",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync",
|
||
"verification": "Unit Test",
|
||
"statement": "The State Synchronization Engine shall apply live server events as deterministic deltas."
|
||
},
|
||
{
|
||
"id": "SRS-057",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync, Rust Core",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The State Synchronization Engine shall preserve per-connection event ordering."
|
||
},
|
||
{
|
||
"id": "SRS-058",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync",
|
||
"verification": "Unit Test",
|
||
"statement": "The State Synchronization Engine shall use reducer functions or equivalent deterministic logic for snapshot, channel, client, chat, voice, and connection events."
|
||
},
|
||
{
|
||
"id": "SRS-059",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync",
|
||
"verification": "Event Replay Test, System Test",
|
||
"statement": "The State Synchronization Engine shall replace stale server state with a fresh snapshot after reconnect."
|
||
},
|
||
{
|
||
"id": "SRS-060",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync, Rust Core",
|
||
"verification": "Unit Test, Fuzz/Negative Test",
|
||
"statement": "The State Synchronization Engine shall tolerate malformed or unexpected protocol events without crashing the application."
|
||
},
|
||
{
|
||
"id": "SRS-062",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Integration Test",
|
||
"statement": "The Audio Subsystem shall coordinate audio capture, preprocessing, audio processing, Opus-compatible encoding, voice packet handoff, receive decoding, jitter buffering, per-user controls, mixing, and playback."
|
||
},
|
||
{
|
||
"id": "SRS-063",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Test",
|
||
"statement": "The Audio Subsystem shall process outgoing microphone PCM frames before encoding."
|
||
},
|
||
{
|
||
"id": "SRS-064",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Processing Test",
|
||
"statement": "The Audio Subsystem shall apply a High-Pass Filter before voice encoding when enabled."
|
||
},
|
||
{
|
||
"id": "SRS-065",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Processing Test",
|
||
"statement": "The Audio Subsystem shall apply Noise Suppression before voice encoding when enabled."
|
||
},
|
||
{
|
||
"id": "SRS-066",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Platform Adapters",
|
||
"verification": "Audio Processing Test",
|
||
"statement": "The Audio Subsystem shall apply Echo Canceller before voice encoding when enabled and when playback reference audio is available or the selected backend provides equivalent behavior."
|
||
},
|
||
{
|
||
"id": "SRS-067",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Processing Test",
|
||
"statement": "The Audio Subsystem shall apply Automatic Gain Control before voice encoding when enabled."
|
||
},
|
||
{
|
||
"id": "SRS-068",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Flutter UI, Storage",
|
||
"verification": "UI Test, Unit Test",
|
||
"statement": "The Audio Subsystem shall expose enable/disable settings for Echo Canceller, Automatic Gain Control, Noise Suppression, and High-Pass Filter."
|
||
},
|
||
{
|
||
"id": "SRS-069",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Platform Adapters",
|
||
"verification": "Review, Audio Test",
|
||
"statement": "The Audio Subsystem shall support conservative default audio processing configuration per platform."
|
||
},
|
||
{
|
||
"id": "SRS-071",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Test",
|
||
"statement": "The Audio Subsystem shall encode outgoing voice using an Opus-compatible encoder."
|
||
},
|
||
{
|
||
"id": "SRS-072",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Test",
|
||
"statement": "The Audio Subsystem shall decode incoming voice using an Opus-compatible decoder."
|
||
},
|
||
{
|
||
"id": "SRS-073",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Test",
|
||
"statement": "The Audio Subsystem shall use jitter buffering for incoming voice packets."
|
||
},
|
||
{
|
||
"id": "SRS-074",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Flutter UI",
|
||
"verification": "Audio Test, UI Test",
|
||
"statement": "The Audio Subsystem shall support per-user mute during playback."
|
||
},
|
||
{
|
||
"id": "SRS-076",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem",
|
||
"verification": "Audio Test",
|
||
"statement": "The Audio Subsystem shall mix decoded incoming voice streams before playback."
|
||
},
|
||
{
|
||
"id": "SRS-077",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Rust Core, Flutter UI",
|
||
"verification": "System Test",
|
||
"statement": "The Audio Subsystem shall implement microphone mute as a gate that prevents local voice transmission."
|
||
},
|
||
{
|
||
"id": "SRS-078",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Rust Core, Flutter UI",
|
||
"verification": "System Test",
|
||
"statement": "The Audio Subsystem shall implement output deaf as a gate that prevents incoming voice playback."
|
||
},
|
||
{
|
||
"id": "SRS-079",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Flutter UI",
|
||
"verification": "System Test",
|
||
"statement": "The Audio Subsystem shall implement push-to-talk gating before outgoing voice packet transmission."
|
||
},
|
||
{
|
||
"id": "SRS-080",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Flutter UI",
|
||
"verification": "Audio Test, UI Test",
|
||
"statement": "The Audio Subsystem shall provide input level metering to Rust Core or Flutter through UI-safe events."
|
||
},
|
||
{
|
||
"id": "SRS-081",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, State Sync, Flutter UI",
|
||
"verification": "Audio Test, UI Test",
|
||
"statement": "The Audio Subsystem shall provide speaking indicator events for local and remote users where available."
|
||
},
|
||
{
|
||
"id": "SRS-084",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software shall persist bookmarks in local non-secret storage."
|
||
},
|
||
{
|
||
"id": "SRS-086",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Audio Subsystem",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software shall persist audio settings in local non-secret storage."
|
||
},
|
||
{
|
||
"id": "SRS-089",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage",
|
||
"verification": "Inspection",
|
||
"statement": "The software shall use SQLite or an equivalent embedded data store for non-secret local data."
|
||
},
|
||
{
|
||
"id": "SRS-090",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Platform Adapters",
|
||
"verification": "Inspection, Security Audit",
|
||
"statement": "The software shall access platform secure storage only through a secure storage provider abstraction."
|
||
},
|
||
{
|
||
"id": "SRS-091",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Platform Secure Storage",
|
||
"verification": "Security Audit",
|
||
"statement": "The software shall store identity private keys using platform secure storage and shall not persist them in plaintext files."
|
||
},
|
||
{
|
||
"id": "SRS-092",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Platform Secure Storage, Diagnostics",
|
||
"verification": "Security Audit",
|
||
"statement": "The software shall store server passwords using platform secure storage and shall not persist them in plaintext logs or non-secret database fields."
|
||
},
|
||
{
|
||
"id": "SRS-093",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Storage",
|
||
"verification": "Security Audit",
|
||
"statement": "The software shall redact secrets before writing diagnostic logs or diagnostic exports."
|
||
},
|
||
{
|
||
"id": "SRS-094",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Rust Core, Protocol Adapter, Storage",
|
||
"verification": "Unit Test, Security Test",
|
||
"statement": "The software shall validate user input before passing values to protocol operations or storage operations."
|
||
},
|
||
{
|
||
"id": "SRS-095",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics",
|
||
"verification": "Inspection, Demo",
|
||
"statement": "The software shall produce structured diagnostic logs for connection, protocol, state, audio, storage, platform, and release-relevant events."
|
||
},
|
||
{
|
||
"id": "SRS-101",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "All Software Components",
|
||
"verification": "Privacy Review",
|
||
"statement": "The software shall minimize personal data collection in MVP."
|
||
},
|
||
{
|
||
"id": "SRS-102",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics",
|
||
"verification": "Security Audit",
|
||
"statement": "The software shall not automatically upload diagnostics in MVP."
|
||
},
|
||
{
|
||
"id": "SRS-103",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Rust Core, Bridge, Diagnostics",
|
||
"verification": "UI Test, Security Review",
|
||
"statement": "The software shall display user-safe errors without raw internal stack traces."
|
||
},
|
||
{
|
||
"id": "SRS-104",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters, Audio Subsystem",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The software shall provide a platform adapter interface for microphone capture."
|
||
},
|
||
{
|
||
"id": "SRS-105",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters, Audio Subsystem",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The software shall provide a platform adapter interface for speaker/headphone playback."
|
||
},
|
||
{
|
||
"id": "SRS-106",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters, Audio Subsystem, Flutter UI",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The software shall provide a platform adapter interface for audio device enumeration and selection where supported."
|
||
},
|
||
{
|
||
"id": "SRS-107",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters, Audio Subsystem",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The software shall provide a platform adapter interface for audio route changes."
|
||
},
|
||
{
|
||
"id": "SRS-108",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters, Flutter UI",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The software shall provide a platform adapter interface for microphone permission requests."
|
||
},
|
||
{
|
||
"id": "SRS-110",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters, Audio Subsystem",
|
||
"verification": "iOS Integration Test",
|
||
"statement": "The iOS software shall integrate with AVAudioSession or equivalent platform audio session behavior for foreground voice sessions."
|
||
},
|
||
{
|
||
"id": "SRS-111",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters, Audio Subsystem",
|
||
"verification": "Android Integration Test",
|
||
"statement": "The Android software shall integrate with foreground service behavior for active voice sessions."
|
||
},
|
||
{
|
||
"id": "SRS-121",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Application Container, Flutter UI, Deployment Scripts",
|
||
"verification": "Legal Review, Inspection",
|
||
"statement": "The software release metadata and in-app wording shall not imply official TeamSpeak affiliation."
|
||
},
|
||
{
|
||
"id": "SRS-123",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Diagnostics",
|
||
"verification": "Demo",
|
||
"statement": "The software shall include or support a protocol probe tool for validating `tsclientlib` adapter behavior against compatible test servers."
|
||
},
|
||
{
|
||
"id": "SRS-124",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "State Sync, Diagnostics",
|
||
"verification": "Unit Test, Demo",
|
||
"statement": "The software shall include reducer tests and event replay tests for state synchronization."
|
||
},
|
||
{
|
||
"id": "SRS-125",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Diagnostics",
|
||
"verification": "Audio Test, Demo",
|
||
"statement": "The software shall include audio loopback and audio processing tests for capture, playback, codec, jitter buffer, mixer, Echo Canceller, AGC, Noise Suppression, and High-Pass Filter."
|
||
},
|
||
{
|
||
"id": "SRS-126",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Diagnostics, Platform Adapters",
|
||
"verification": "Security Audit",
|
||
"statement": "The software shall include security verification support for secure storage, private-key handling, password handling, input validation, and diagnostic redaction."
|
||
},
|
||
{
|
||
"id": "SRS-128",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "All Software Components",
|
||
"verification": "System Test, Demo",
|
||
"statement": "The software shall support MVP acceptance verification demonstrating connection, channel tree, online clients, channel join, send/receive voice, mute, deaf, push-to-talk, required audio processing, channel text, bookmarks, secure storage, a"
|
||
},
|
||
{
|
||
"id": "SRS-129",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Rust Core, Audio Subsystem, Platform Adapters",
|
||
"verification": "System Test",
|
||
"statement": "The software shall expose clear user-facing errors when client hardware lacks a usable microphone, output device, CPU capacity, storage, or network interface required for the requested operation."
|
||
},
|
||
{
|
||
"id": "SRS-130",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Rust Core, Protocol Adapter",
|
||
"verification": "System Test",
|
||
"statement": "The software shall expose clear user-facing errors when network connectivity prevents server connection or real-time voice operation."
|
||
},
|
||
{
|
||
"id": "SRS-131",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Rust Core, Flutter UI",
|
||
"verification": "System Test",
|
||
"statement": "The software shall handle external compatible server permissions, availability, and event behavior as external dependencies and shall not assume administrative control."
|
||
},
|
||
{
|
||
"id": "SRS-132",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Rust Core, Protocol Adapter, Storage",
|
||
"verification": "UI Test, System Test",
|
||
"statement": "The software shall allow server details, credentials, and identity selection to be supplied by the user rather than hardcoding a server environment."
|
||
},
|
||
{
|
||
"id": "SRS-133",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapters, Rust Core, Flutter UI",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The software shall integrate with OS-level secure storage, permission, audio, network, notification, lifecycle, and app sandboxing policies through platform adapters."
|
||
},
|
||
{
|
||
"id": "SRS-134",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Software Requirements Engineering",
|
||
"verification": "Review, Protocol Probe",
|
||
"statement": "The software team shall analyze `tsclientlib` feasibility for all MVP protocol features and document unsupported or risky features before MVP acceptance."
|
||
},
|
||
{
|
||
"id": "SRS-135",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Platform Adapters",
|
||
"verification": "Review, Audio Test",
|
||
"statement": "The software team shall analyze real-time audio feasibility on each target platform for capture, playback, required audio processing, and latency."
|
||
},
|
||
{
|
||
"id": "SRS-136",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, State Sync, Audio Subsystem, Diagnostics, Storage",
|
||
"verification": "Review, Performance Test",
|
||
"statement": "The software team shall analyze memory growth and define limits for event queues, chat history, logs, audio buffers, and diagnostic bundles."
|
||
},
|
||
{
|
||
"id": "SRS-137",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Diagnostics, Platform Adapters, Flutter UI",
|
||
"verification": "Security Review, Privacy Review",
|
||
"statement": "The software team shall analyze security and privacy impacts of local secrets, logs, diagnostics, permissions, and release configuration."
|
||
},
|
||
{
|
||
"id": "SRS-139",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Review",
|
||
"statement": "The software requirements baseline shall account for SysDes-037: SE-19 Engineering Process and Evidence shall be a defined system element in the Chanora architecture with responsibility for: Architecture reviews, traceability records, verif"
|
||
},
|
||
{
|
||
"id": "SRS-140",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Review",
|
||
"statement": "The software requirements baseline shall account for SysDes-062: The permission-blocked mode shall prevent unsafe voice operations while preserving user visibility into corrective actions."
|
||
},
|
||
{
|
||
"id": "SRS-141",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SRS shall use SysDes design items as the mandatory architectural allocation source for every software requirement."
|
||
},
|
||
{
|
||
"id": "SRS-142",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering, Change Control",
|
||
"verification": "Review, Inspection",
|
||
"statement": "If the software team identifies a required software behavior, constraint, or interface that cannot be derived from an existing SysDes design item, the SRS shall not be baselined until the SysDes is revised."
|
||
},
|
||
{
|
||
"id": "SRS-143",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Requirements Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SRS shall maintain a SysDes-to-SRS coverage matrix for all SysDes items that require software implementation, software enablement, software-facing constraint handling, or software verification support."
|
||
},
|
||
{
|
||
"id": "SRS-144",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell, Design System",
|
||
"verification": "Review, Widget Test",
|
||
"statement": "The software shall initialize the Flutter client theme using Material 3 as the baseline UI system."
|
||
},
|
||
{
|
||
"id": "SRS-145",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Inspection, Widget Test",
|
||
"statement": "The software shall provide a Chanora Design System layer above Material 3 for product-specific semantic states."
|
||
},
|
||
{
|
||
"id": "SRS-146",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Unit Test",
|
||
"statement": "The software shall define semantic tokens for connection states."
|
||
},
|
||
{
|
||
"id": "SRS-147",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Unit Test",
|
||
"statement": "The software shall define semantic tokens for voice states including speaking, muted, deafened, and push-to-talk active states."
|
||
},
|
||
{
|
||
"id": "SRS-148",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Unit Test",
|
||
"statement": "The software shall define semantic tokens for latency, packet loss, diagnostics, and error states."
|
||
},
|
||
{
|
||
"id": "SRS-149",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Inspection, Widget Test",
|
||
"statement": "The software shall expose design tokens through `ThemeData`, `ColorScheme`, `TextTheme`, component themes, `ThemeExtension`, or equivalent Flutter theming mechanisms."
|
||
},
|
||
{
|
||
"id": "SRS-150",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter Feature Screens",
|
||
"verification": "Review, Static Inspection",
|
||
"statement": "Feature screens shall not hardcode product semantic colors, spacing, shape, density, or motion values."
|
||
},
|
||
{
|
||
"id": "SRS-151",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell",
|
||
"verification": "Widget Test, Integration Test",
|
||
"statement": "The software shall provide an Adaptive Shell that resolves compact, medium, and expanded layout classes."
|
||
},
|
||
{
|
||
"id": "SRS-152",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell",
|
||
"verification": "Widget Test, Integration Test",
|
||
"statement": "The compact layout shall use a single-column primary content structure and mobile-appropriate primary navigation."
|
||
},
|
||
{
|
||
"id": "SRS-155",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell, Connection UI",
|
||
"verification": "Integration Test",
|
||
"statement": "The software shall keep connection status visible or directly reachable in compact, medium, and expanded layouts."
|
||
},
|
||
{
|
||
"id": "SRS-156",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell, Voice UI",
|
||
"verification": "Integration Test",
|
||
"statement": "The software shall keep primary voice controls visible or directly reachable in compact, medium, and expanded layouts."
|
||
},
|
||
{
|
||
"id": "SRS-157",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Design System",
|
||
"verification": "Accessibility Test",
|
||
"statement": "The software shall provide screen-reader semantics for critical connection, voice, channel, diagnostics, and settings controls."
|
||
},
|
||
{
|
||
"id": "SRS-158",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Localization Service",
|
||
"verification": "Accessibility Test, Localization Test",
|
||
"statement": "The software shall provide localized accessibility labels for icon-only controls."
|
||
},
|
||
{
|
||
"id": "SRS-159",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Design System",
|
||
"verification": "Widget Test, Accessibility Test",
|
||
"statement": "The software shall not express critical states by color alone; it shall also use text, iconography, shape, position, or semantic labeling."
|
||
},
|
||
{
|
||
"id": "SRS-161",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI",
|
||
"verification": "Accessibility Test",
|
||
"statement": "The software shall keep critical actions reachable under increased text scaling."
|
||
},
|
||
{
|
||
"id": "SRS-162",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell, Platform Adapter",
|
||
"verification": "Platform Test",
|
||
"statement": "The software shall apply platform safe area, display cutout, system bar, virtual keyboard, and desktop window inset constraints through shared shell behavior."
|
||
},
|
||
{
|
||
"id": "SRS-165",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software shall provide a Localization Service for product-owned user-visible strings."
|
||
},
|
||
{
|
||
"id": "SRS-166",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service",
|
||
"verification": "Inspection",
|
||
"statement": "The software shall externalize product-owned user-visible strings into localization resources or an equivalent mechanism."
|
||
},
|
||
{
|
||
"id": "SRS-167",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service",
|
||
"verification": "Localization Test",
|
||
"statement": "The software shall provide English as the baseline product locale."
|
||
},
|
||
{
|
||
"id": "SRS-168",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service",
|
||
"verification": "Unit Test",
|
||
"statement": "The software shall implement deterministic fallback behavior when a translation key is missing."
|
||
},
|
||
{
|
||
"id": "SRS-170",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Protocol DTOs",
|
||
"verification": "Integration Test",
|
||
"statement": "The software shall display server-provided server names, channel names, client nicknames, and text messages as content rather than translating them."
|
||
},
|
||
{
|
||
"id": "SRS-171",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Bridge, Rust Core, Flutter UI",
|
||
"verification": "Integration Test",
|
||
"statement": "The software shall preserve Unicode text received from compatible servers through protocol adapter, bridge DTO, state store, and UI rendering paths."
|
||
},
|
||
{
|
||
"id": "SRS-172",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge, Rust Core, Storage, Diagnostics, Protocol Adapter",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "The software shall use UTF-8 internally for cross-layer text DTOs unless a boundary adapter requires conversion."
|
||
},
|
||
{
|
||
"id": "SRS-174",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Storage",
|
||
"verification": "Test, Audit",
|
||
"statement": "The software shall not corrupt multilingual Unicode content in logs or diagnostic exports unless redaction intentionally removes sensitive content."
|
||
},
|
||
{
|
||
"id": "SRS-180",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Engineering",
|
||
"verification": "Inspection",
|
||
"statement": "The software requirements baseline shall derive requirements only from `SysDes-XXX` sources."
|
||
},
|
||
{
|
||
"id": "SRS-181",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Engineering",
|
||
"verification": "Inspection",
|
||
"statement": "The SRS shall not use direct upstream system-requirement source fields or direct system-requirement trace links."
|
||
},
|
||
{
|
||
"id": "SRS-182",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Inspection",
|
||
"statement": "The software architecture shall derive architecture items only from `SRS-XXX` sources."
|
||
},
|
||
{
|
||
"id": "SRS-183",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Design",
|
||
"verification": "Inspection",
|
||
"statement": "The software detailed design shall derive detailed design items only from `SAD-XXX` sources."
|
||
},
|
||
{
|
||
"id": "SRS-184",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell, Design System, Localization Service, Platform Adapter",
|
||
"verification": "Integration Test",
|
||
"statement": "Theme, localization, and initial platform adaptation shall be initialized before feature screens render user-visible content."
|
||
},
|
||
{
|
||
"id": "SRS-185",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "iOS Build Configuration, Platform Adapter",
|
||
"verification": "Platform Test, Release Inspection",
|
||
"statement": "The software shall define iOS 13 as the minimum iOS runtime deployment baseline unless approved platform constraints raise the minimum version."
|
||
},
|
||
{
|
||
"id": "SRS-186",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "iOS Build Configuration, Release Pipeline",
|
||
"verification": "Release Inspection",
|
||
"statement": "The iOS/iPadOS release build process shall require Xcode 26 or later and the iOS 26 / iPadOS 26 SDK or later for App Store Connect upload on or after 2026-04-28, unless Apple publishes a newer applicable upload requirement before upload."
|
||
},
|
||
{
|
||
"id": "SRS-187",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Android Build Configuration, Platform Adapter",
|
||
"verification": "Platform Test, Release Inspection",
|
||
"statement": "The software shall define Android API 28 (Android 9.0) as the minimum Android runtime baseline, per DEC-004 (Accepted 2026-05-14, which raised the original API 24 recommendation to API 28). The minimum may be raised further only if Flutter,"
|
||
},
|
||
{
|
||
"id": "SRS-188",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Android Build Configuration, Release Pipeline",
|
||
"verification": "Release Inspection",
|
||
"statement": "The Android release build process shall target the Android API level required by Google Play on the upload date."
|
||
},
|
||
{
|
||
"id": "SRS-189",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, Flutter UI, Protocol Adapter, State Sync",
|
||
"verification": "System Test",
|
||
"statement": "The software shall permit only one active server connection per client instance in MVP."
|
||
},
|
||
{
|
||
"id": "SRS-190",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Settings UI, Platform Audio",
|
||
"verification": "Audio Test",
|
||
"statement": "The software shall enable AEC, AGC, Noise Suppression, and High-Pass Filter by default where supported and stable, with user or platform control to disable supported processing where applicable."
|
||
},
|
||
{
|
||
"id": "SRS-192",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Platform Secure Storage",
|
||
"verification": "Storage Test, Security Audit",
|
||
"statement": "The software shall use SQLite or an equivalent embedded local database for non-secret local state and platform secure storage for secrets."
|
||
},
|
||
{
|
||
"id": "SRS-193",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge, Flutter State, Rust Core",
|
||
"verification": "Integration Test, Architecture Review",
|
||
"statement": "The software shall use a stable typed Flutter/Rust bridge with generated or schema-controlled DTOs."
|
||
},
|
||
{
|
||
"id": "SRS-194",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Privacy, Release Pipeline",
|
||
"verification": "Privacy Review, Security Audit",
|
||
"statement": "The software shall not perform automatic diagnostic upload, automatic telemetry upload, or automatic crash reporting in MVP unless a later approved decision updates privacy, security, legal, release, and verification baselines."
|
||
},
|
||
{
|
||
"id": "SRS-195",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio, Platform Input",
|
||
"verification": "Architecture Review, Unit Test",
|
||
"statement": "The software shall expose a `DesktopPttBackend` trait owned by the audio subsystem, with one implementation per supported desktop platform (Windows, macOS, Linux/GNOME-Wayland) and a `FocusedPttBackend` implementation used as the universal "
|
||
},
|
||
{
|
||
"id": "SRS-196",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio, Rust Core",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software shall publish a `PttCapabilityLevel` enum value (`L0` Focused, `L1` Global-shortcut-activation, `L2` Global-hold-to-talk, `L3` Global-with-mouse-buttons, `L4` Device-aware) from the active backend, and the value shall match the"
|
||
},
|
||
{
|
||
"id": "SRS-197",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Windows)",
|
||
"verification": "Platform Test (Windows), Unit Test",
|
||
"statement": "The Windows desktop backend shall attempt Raw Input first; if Raw Input is unavailable or initialisation fails, it shall attempt a low-level keyboard hook; if that also fails it shall return `PttCapabilityLevel::L0` and engage Focused PTT. "
|
||
},
|
||
{
|
||
"id": "SRS-198",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (macOS)",
|
||
"verification": "Platform Test (macOS), User Acceptance Test",
|
||
"statement": "The macOS desktop backend shall query the operating-system Input Monitoring / Accessibility permission state, return `PttCapabilityLevel::L0` while the permission is undecided or denied, and upgrade to the appropriate Global level only afte"
|
||
},
|
||
{
|
||
"id": "SRS-199",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Linux)",
|
||
"verification": "Platform Test (Linux, GNOME Wayland), Unit Test",
|
||
"statement": "The Linux desktop backend shall probe the active display server and compositor at runtime. On GNOME-on-Wayland (the officially-tested target per DEC-026), the backend shall use the freedesktop GlobalShortcuts portal. On any other Linux envi"
|
||
},
|
||
{
|
||
"id": "SRS-200",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Windows/macOS/Linux)",
|
||
"verification": "Platform Test, User Acceptance Test",
|
||
"statement": "The software shall support mouse side buttons (typically labelled Mouse4 / Mouse5 or \"back\" / \"forward\") as bindable inputs for Global PTT on the Windows and macOS backends per DEC-027. The Linux GlobalShortcuts portal binding shall accept "
|
||
},
|
||
{
|
||
"id": "SRS-201",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The audio engine shall expose `capture_active` and `transmit_active` as independent atomic states. `capture_active` shall reflect the input-stream lifecycle and the platform input-permission state; `transmit_active` shall reflect the PTT su"
|
||
},
|
||
{
|
||
"id": "SRS-202",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Audio",
|
||
"verification": "Privacy Review, Unit Test, Diagnostic Inspection",
|
||
"statement": "The diagnostics subsystem shall reject any log record carrying a raw key code, scan code, virtual-key value, or key-press timing sequence. The diagnostic export shall include the active `PttCapabilityLevel`, the active backend identifier, a"
|
||
},
|
||
{
|
||
"id": "SRS-203",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software shall implement a missed-key-up watchdog per DEC-028: if `transmit_active` has been true for longer than a configured upper bound without a corresponding release event (for example because the OS suppressed the key-up while the"
|
||
},
|
||
{
|
||
"id": "SRS-204",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio, Bridge, Flutter UI",
|
||
"verification": "Integration Test, UI Review",
|
||
"statement": "The audio engine shall open the input and output streams on the user's first voice-channel join of the session and shall close them on the last voice-channel leave. The software shall expose no `start_audio` or equivalent manual-start opera"
|
||
},
|
||
{
|
||
"id": "SRS-205",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio, Bridge, Flutter UI",
|
||
"verification": "Unit Test, UI Review",
|
||
"statement": "The software shall represent the user's voice transmit mode as a `TransmitMode` enum with variants `Ptt`, `Continuous`, and `VoiceActivity` (the last reserved with no v1 implementation per DEC-030). The setting shall be persisted per identi"
|
||
},
|
||
{
|
||
"id": "SRS-206",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software shall expose a `release_tail_ms` configuration value (default 200 ms, validated range 0 through 500 ms inclusive) and shall delay the `true → false` transition of `transmit_active` by `release_tail_ms` after the PTT backend rep"
|
||
},
|
||
{
|
||
"id": "SRS-207",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio, Flutter UI",
|
||
"verification": "Functional Test, UI Review",
|
||
"statement": "The software shall expose a hard-mute toggle in the Voice Bar UI. While hard-mute is engaged, `transmit_active` shall be forced false regardless of the active transmit mode, the PTT key state, or any other internal signal. Hard-mute state s"
|
||
},
|
||
{
|
||
"id": "SRS-208",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Android), Platform Adapter (Android)",
|
||
"verification": "Android Integration Test, Audio Test",
|
||
"statement": "The Chanora Android client shall engage the Android in-call audio mode (for example via `AudioManager.setMode(MODE_IN_COMMUNICATION)` or an equivalent platform routing-assist mechanism) no later than the moment a voice session becomes conne"
|
||
},
|
||
{
|
||
"id": "SRS-209",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapter (Android), Audio, Flutter UI",
|
||
"verification": "Android Integration Test, UI Test, Privacy Review",
|
||
"statement": "The Chanora Android client shall request the runtime microphone permission (`RECORD_AUDIO`) at or before voice session activation, and shall not begin microphone capture without that permission having been granted. If the permission is deni"
|
||
},
|
||
{
|
||
"id": "SRS-210",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Android), Platform Adapter (Android)",
|
||
"verification": "Android Integration Test, Audio Test, Loopback Latency Measurement",
|
||
"statement": "The Chanora Android voice audio path shall achieve a round-trip mouth-to-ear (\"glass-to-glass\") latency of at most 150 ms on Android devices that support AAudio low-latency performance mode, and at most 250 ms on Android devices that do not"
|
||
},
|
||
{
|
||
"id": "SRS-211",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Android), Platform Adapter (Android)",
|
||
"verification": "Android Integration Test, Audio Test",
|
||
"statement": "The Chanora Android voice-capture path shall request the platform \"voice communication\" input preset where the operating system exposes one, so that the OS-side capture chain (gain shaping, far-end suppression, microphone selection) is the "
|
||
},
|
||
{
|
||
"id": "SRS-212",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Android), Platform Adapter (Android), Audio Engine",
|
||
"verification": "Android Integration Test, Audio Test",
|
||
"statement": "Where the Android device exposes the hardware voice-audio effect APIs `AcousticEchoCanceler`, `NoiseSuppressor`, and `AutomaticGainControl`, the Chanora Android client shall engage each available effect on the active microphone capture sess"
|
||
},
|
||
{
|
||
"id": "SRS-213",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Android), Platform Adapter (Android)",
|
||
"verification": "Android Integration Test, Audio Test",
|
||
"statement": "The Chanora Android voice-output stream shall declare `AAUDIO_USAGE_VOICE_COMMUNICATION` and `AAUDIO_CONTENT_TYPE_SPEECH` at stream construction so that the Android audio policy engine routes the stream under the voice-communication routing"
|
||
},
|
||
{
|
||
"id": "SRS-214",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio (Android), Platform Adapter (Android)",
|
||
"verification": "Android Integration Test, Audio Test",
|
||
"statement": "The Chanora Android voice input and output streams shall request `AAUDIO_SHARING_MODE_EXCLUSIVE` on a best-effort basis at stream construction, and shall gracefully fall back to `AAUDIO_SHARING_MODE_SHARED` when the platform denies exclusiv"
|
||
},
|
||
{
|
||
"id": "SRS-215",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapter (Android), Audio (Android), Android Manifest",
|
||
"verification": "Android Integration Test, Manifest Review",
|
||
"statement": "The Chanora Android client shall maintain active microphone capture while the application is backgrounded by hosting voice transmission inside an Android foreground service whose manifest declares `foregroundServiceType=\"microphone\"`. This "
|
||
},
|
||
{
|
||
"id": "SRS-216",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "`chanora_audio` crate (realtime capture and playback modules, plus a co-located `benches/` directory)",
|
||
"verification": "SWE.4 — automated benchmark execution against the instrumentation surface; reviewers confirm the five metric families enumerated in SysDes-156 each have at least one benchmark target.",
|
||
"statement": "The `chanora_audio` software shall expose its realtime capture and playback paths to benchmark instrumentation that covers the five metrics enumerated by SysDes-156: (1) heap allocation count per realtime callback after a warmup window of a"
|
||
},
|
||
{
|
||
"id": "SRS-217",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "`chanora_audio` crate (the bench harness publishes the baseline JSON), plus the SDD-decided on-disk path under the repository root.",
|
||
"verification": "Review — the JSON record format is review-checkable against this clause by inspecting a sample baseline file.",
|
||
"statement": "Baseline measurements produced by the SRS-216 benchmark instrumentation shall be stored as structured JSON committed to a deterministic location inside the repository, so that the baseline becomes a reviewable, version-controlled artefact r"
|
||
},
|
||
{
|
||
"id": "SRS-218",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "CI tooling under `.github/workflows/` (or the SDD-decided equivalent integration point) — specifically a new advisory benchmark workflow file; the exact filename is delegated to SAD/SDD.",
|
||
"verification": "Demo — a synthetic pull-request run shall demonstrate the workflow firing, the markdown comparison table rendering, the status check reporting `success` even when a 🔴 marker is present, and the absence of any write to the baseline JSON file under the PR-triggered path. Human reviewers confirm in the PR.",
|
||
"statement": "A continuous-integration workflow shall execute the SRS-216 benchmark suite under the constraints authored by SysDes-157, namely: (1) the workflow shall trigger on every pull request opened against the default branch and on every merge to t"
|
||
},
|
||
{
|
||
"id": "SRS-219",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "CI tooling co-located with the SRS-218 workflow (the comparison logic resides in the same SE-18 surface).",
|
||
"verification": "Review — the comparison logic and the tolerance table are review-checkable against this clause; a small synthetic data set (one baseline, one PR run for each of the five metric families with values at, just inside, and just outside the tolerance window) demonstrates each marker assignment.",
|
||
"statement": "The advisory comparison performed by the SRS-218 workflow shall apply the per-metric tolerance window and the comparison methodology authored by SysDes-158. The tolerance window shall be evaluated per metric as follows: (a) heap allocation "
|
||
},
|
||
{
|
||
"id": "SysDes-001",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "This SysDes shall establish the Chanora system architectural design and allocate all SysRS requirements to system elements."
|
||
},
|
||
{
|
||
"id": "SysDes-002",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "This SysDes shall treat Chanora as a cross-platform application system, not as an operating system."
|
||
},
|
||
{
|
||
"id": "SysDes-003",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "This SysDes shall be used as the system-level design baseline for downstream SRS, SAD, SDD, and Verification artifacts."
|
||
},
|
||
{
|
||
"id": "SysDes-004",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SysDes structure shall provide evidence for static architecture, dynamic architecture, architecture analysis, bidirectional traceability, consistency, and architecture communication."
|
||
},
|
||
{
|
||
"id": "SysDes-005",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SysDes shall identify system elements, their responsibilities, their relationships, and their external interfaces."
|
||
},
|
||
{
|
||
"id": "SysDes-006",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem, Platform, Software: Diagnostics, Verification, Deployment / Operations",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SysDes shall describe dynamic behavior for connection, synchronization, voice transmission, voice reception, text messaging, reconnect, permissions, diagnostics, and release operation."
|
||
},
|
||
{
|
||
"id": "SysDes-007",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SysDes shall include architecture analysis, major design rationale, known risks, mitigations, and special characteristics."
|
||
},
|
||
{
|
||
"id": "SysDes-008",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SysDes shall maintain bidirectional traceability between every SysRS requirement and at least one allocated system element."
|
||
},
|
||
{
|
||
"id": "SysDes-009",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SysDes shall identify affected parties for review, agreement, and communication of the system architecture."
|
||
},
|
||
{
|
||
"id": "SysDes-010",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Protocol Adapter, Software: State Sync, Software: Audio Subsystem, Software: Diagnostics, Verification",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall separate user interface, protocol logic, state synchronization, audio processing, storage, diagnostics, and platform-specific services."
|
||
},
|
||
{
|
||
"id": "SysDes-011",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall isolate direct `tsclientlib` usage inside the protocol adapter."
|
||
},
|
||
{
|
||
"id": "SysDes-012",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Rust Core",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall support required target platforms through shared Flutter UI, shared Rust Core, and platform-specific adapters."
|
||
},
|
||
{
|
||
"id": "SysDes-013",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall support production-grade audio processing including Echo Canceller, Automatic Gain Control, Noise Suppression, and High-Pass Filter."
|
||
},
|
||
{
|
||
"id": "SysDes-014",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Audio Subsystem",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall support real-time voice behavior without placing real-time audio processing in Flutter UI."
|
||
},
|
||
{
|
||
"id": "SysDes-015",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Diagnostics, Verification",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall support secure local handling of identities, passwords, and diagnostics."
|
||
},
|
||
{
|
||
"id": "SysDes-016",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall support operation without a Chanora-operated central backend in MVP."
|
||
},
|
||
{
|
||
"id": "SysDes-017",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter, Software: Audio Subsystem, Deployment / Operations",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall provide traceable verification hooks for protocol, state, audio, security, packaging, and platform behavior."
|
||
},
|
||
{
|
||
"id": "SysDes-018",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "External Server, Software: Audio Subsystem, Deployment / Operations",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The static architecture shall define Chanora as a client application system interacting with users, audio hardware, OS services, networks, deployment environments, and external compatible voice servers."
|
||
},
|
||
{
|
||
"id": "SysDes-019",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "User / Operator, Platform, Software: Diagnostics, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-01 User and Operator shall be a defined system element in the Chanora architecture with responsibility for: Human users who operate Chanora, provide server details, manage permissions, and initiate diagnostic export."
|
||
},
|
||
{
|
||
"id": "SysDes-020",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Hardware, Software: Audio Subsystem",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-02 Client Device Hardware shall be a defined system element in the Chanora architecture with responsibility for: Physical device running Chanora, including CPU, memory, storage, network interfaces, microphone, speaker/headphone, and opti"
|
||
},
|
||
{
|
||
"id": "SysDes-021",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform, Software: Audio Subsystem, Platform Secure Storage",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-03 Operating System Services shall be a defined system element in the Chanora architecture with responsibility for: OS services used by Chanora: permissions, secure storage, audio stack, network stack, notifications, windowing, lifecycle"
|
||
},
|
||
{
|
||
"id": "SysDes-022",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Network",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-04 Network Environment shall be a defined system element in the Chanora architecture with responsibility for: IP network path between client and external compatible server, including DNS, routing, NAT, firewall, VPN, Wi-Fi, cellular, and"
|
||
},
|
||
{
|
||
"id": "SysDes-023",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "External Server, Software: Audio Subsystem, Platform",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-05 External Compatible Voice Server shall be a defined system element in the Chanora architecture with responsibility for: TeamSpeak 3-compatible external server providing channels, clients, identity authentication, voice packets, text m"
|
||
},
|
||
{
|
||
"id": "SysDes-024",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software, Platform",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-06 Chanora Application Container shall be a defined system element in the Chanora architecture with responsibility for: Installed Chanora client application package on each target platform. Owns app lifecycle at the application boundary."
|
||
},
|
||
{
|
||
"id": "SysDes-025",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Audio Subsystem, Platform, Software: Diagnostics, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-07 Flutter UI Layer shall be a defined system element in the Chanora architecture with responsibility for: Cross-platform user interface for connection, channel tree, chat, voice controls, settings, permissions, and diagnostics."
|
||
},
|
||
{
|
||
"id": "SysDes-026",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter State, Software: Rust Core, Software: State Sync",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-08 Flutter State Layer shall be a defined system element in the Chanora architecture with responsibility for: UI-facing state model derived from Rust Core events and snapshots; owns only presentation state."
|
||
},
|
||
{
|
||
"id": "SysDes-027",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Bridge, Software: Rust Core",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-09 Flutter-Rust Bridge Layer shall be a defined system element in the Chanora architecture with responsibility for: Generated/native bridge for commands, DTOs, asynchronous calls, event streams, and error propagation between Flutter and "
|
||
},
|
||
{
|
||
"id": "SysDes-028",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Audio Subsystem, Software: Diagnostics, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-10 Rust Core and Connection Manager shall be a defined system element in the Chanora architecture with responsibility for: Authoritative application core coordinating connection actors, commands, events, storage, audio, diagnostics, and "
|
||
},
|
||
{
|
||
"id": "SysDes-029",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter, Software: Audio Subsystem",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-11 Protocol Adapter using tsclientlib shall be a defined system element in the Chanora architecture with responsibility for: Protocol subsystem wrapping `tsclientlib`, isolating protocol library types, errors, events, and voice packet op"
|
||
},
|
||
{
|
||
"id": "SysDes-030",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: State Sync",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-12 State Synchronization Engine shall be a defined system element in the Chanora architecture with responsibility for: Snapshot + delta state model, deterministic reducers, connection state machine, event ordering, and replayable state b"
|
||
},
|
||
{
|
||
"id": "SysDes-031",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-13 Audio Subsystem shall be a defined system element in the Chanora architecture with responsibility for: Capture/playback coordination, Opus-compatible encoding/decoding, jitter buffer, mixer, push-to-talk, mute/deaf, level metering, an"
|
||
},
|
||
{
|
||
"id": "SysDes-032",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem, Platform, Platform Secure Storage, Deployment / Operations",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-14 Platform Adapter Layer shall be a defined system element in the Chanora architecture with responsibility for: Platform-specific adapters for audio devices, permissions, lifecycle, notifications, secure storage integration, and release"
|
||
},
|
||
{
|
||
"id": "SysDes-033",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem, Software: Storage",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-15 Local Data Store shall be a defined system element in the Chanora architecture with responsibility for: Embedded local database or equivalent storage for bookmarks, recent servers, audio settings, UI settings, per-user volume and mute"
|
||
},
|
||
{
|
||
"id": "SysDes-034",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Secure Storage",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-16 Secure Storage Provider shall be a defined system element in the Chanora architecture with responsibility for: Platform secure storage integration for identity private keys, server passwords, and future sensitive tokens."
|
||
},
|
||
{
|
||
"id": "SysDes-035",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem, Software: Diagnostics, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-17 Diagnostics and Observability shall be a defined system element in the Chanora architecture with responsibility for: Structured logs, redaction, event recording, event replay, network diagnostics, audio diagnostics, diagnostic bundle "
|
||
},
|
||
{
|
||
"id": "SysDes-036",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Storage, Deployment / Operations",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-18 Deployment and Release Environment shall be a defined system element in the Chanora architecture with responsibility for: Packaging, signing, notarization, app-store release, installers, Linux packages, CI/CD, release metadata, and di"
|
||
},
|
||
{
|
||
"id": "SysDes-037",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "SE-19 Engineering Process and Evidence shall be a defined system element in the Chanora architecture with responsibility for: Architecture reviews, traceability records, verification evidence, compatibility matrix, open decisions, and downs"
|
||
},
|
||
{
|
||
"id": "SysDes-038",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Flutter State, Software: Bridge, Software: Rust Core",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall use a layered decomposition in which Flutter UI and Flutter State Layer communicate with Rust Core only through the Bridge Layer."
|
||
},
|
||
{
|
||
"id": "SysDes-039",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Protocol Adapter, Software: State Sync, Software: Audio Subsystem, Software: Diagnostics, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall place protocol, state synchronization, audio processing, storage coordination, diagnostics, and business rules inside Rust Core or Rust Core-owned elements."
|
||
},
|
||
{
|
||
"id": "SysDes-040",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Flutter State, Software: Protocol Adapter",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall prevent Flutter UI and Flutter State Layer from invoking `tsclientlib` or depending on raw `tsclientlib` types."
|
||
},
|
||
{
|
||
"id": "SysDes-041",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Rust Core, Software: Audio Subsystem",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall place real-time audio processing outside Flutter UI and inside the Rust Core audio subsystem or platform-native audio processing adapters."
|
||
},
|
||
{
|
||
"id": "SysDes-042",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Every SysRS requirement shall be allocated to at least one system element."
|
||
},
|
||
{
|
||
"id": "SysDes-043",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "External Server, Deployment / Operations, System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "A SysRS requirement may be allocated to multiple system elements when the requirement depends on cooperation between application software, OS services, hardware, network, external server, deployment, or engineering evidence."
|
||
},
|
||
{
|
||
"id": "SysDes-044",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Rust Core",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Functional user-facing requirements shall be allocated to Flutter UI, Rust Core, and the relevant subsystem element that executes the behavior."
|
||
},
|
||
{
|
||
"id": "SysDes-045",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Hardware, Platform, Network",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Runtime environment requirements shall be allocated to client device hardware, operating system services, platform adapters, network environment, or external compatible server elements."
|
||
},
|
||
{
|
||
"id": "SysDes-046",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform, Platform Secure Storage, Software: Diagnostics, Verification, System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Security, privacy, and diagnostics requirements shall be allocated to secure storage, diagnostics, platform adapters, and engineering process evidence."
|
||
},
|
||
{
|
||
"id": "SysDes-047",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "MVP acceptance requirements shall be allocated to the system elements that implement or enable the accepted behavior."
|
||
},
|
||
{
|
||
"id": "SysDes-048",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Audio Subsystem, Platform, Software: Diagnostics, Verification",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-001 User Interface shall expose connection, bookmark, channel tree, online client, chat, voice control, audio setting, permission, and diagnostic workflows."
|
||
},
|
||
{
|
||
"id": "SysDes-049",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Bridge, Software: Protocol Adapter",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-003 Flutter-Rust Command Interface shall use bridge-safe DTOs and shall not expose raw protocol or `tsclientlib` types."
|
||
},
|
||
{
|
||
"id": "SysDes-050",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: State Sync, Software: Audio Subsystem, Software: Diagnostics, Verification",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-004 Rust Core Event Interface shall deliver connection status, snapshots, deltas, voice indicators, errors, and diagnostic events as typed streams."
|
||
},
|
||
{
|
||
"id": "SysDes-051",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-005 Protocol Adapter Interface shall isolate all direct `tsclientlib` operations and convert protocol data into Chanora internal data structures."
|
||
},
|
||
{
|
||
"id": "SysDes-052",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "External Server, Software: Protocol Adapter",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-006 External Server Protocol Interface shall use `tsclientlib` to communicate with reachable TeamSpeak 3-compatible external servers."
|
||
},
|
||
{
|
||
"id": "SysDes-053",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-007 Audio Capture Interface shall provide PCM capture frames, device state, route changes, and capture errors to the audio subsystem."
|
||
},
|
||
{
|
||
"id": "SysDes-054",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-008 Audio Playback Interface shall provide mixed PCM playback frames, playback reference for echo cancellation where required, and playback route events."
|
||
},
|
||
{
|
||
"id": "SysDes-055",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Storage, Platform Secure Storage",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-009 Secure Storage Interface shall store identity private keys, server passwords, and future sensitive tokens through platform-secure mechanisms."
|
||
},
|
||
{
|
||
"id": "SysDes-056",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Storage",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-010 Local Data Store Interface shall persist non-secret data through SQLite or an equivalent embedded database."
|
||
},
|
||
{
|
||
"id": "SysDes-057",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Diagnostics, Verification",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-011 Diagnostics Export Interface shall export user-initiated diagnostic bundles with redaction applied before export."
|
||
},
|
||
{
|
||
"id": "SysDes-058",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Diagnostics, Verification",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-013 Network Interface shall provide connectivity to external compatible servers and network diagnostic inputs for reconnect and troubleshooting."
|
||
},
|
||
{
|
||
"id": "SysDes-059",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem, Platform",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "IF-014 Permission Interface shall mediate microphone, notification, audio session, foreground service, and lifecycle permission behavior on supported platforms."
|
||
},
|
||
{
|
||
"id": "SysDes-060",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core",
|
||
"verification": "System Test, Demo",
|
||
"statement": "The connection state machine shall be owned by Rust Core and reflected to Flutter as UI-safe connection status events."
|
||
},
|
||
{
|
||
"id": "SysDes-061",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter, Software: Audio Subsystem, Platform",
|
||
"verification": "System Test, Demo",
|
||
"statement": "The voice activity mode shall be active only when a channel context, audio device state, permission state, and protocol voice path are valid."
|
||
},
|
||
{
|
||
"id": "SysDes-062",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem, Platform",
|
||
"verification": "System Test, Demo",
|
||
"statement": "The permission-blocked mode shall prevent unsafe voice operations while preserving user visibility into corrective actions."
|
||
},
|
||
{
|
||
"id": "SysDes-063",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: State Sync",
|
||
"verification": "System Test, Demo",
|
||
"statement": "The reconnect mode shall preserve UI responsiveness and rebuild authoritative server state from a fresh snapshot after reconnect."
|
||
},
|
||
{
|
||
"id": "SysDes-064",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Diagnostics, Verification",
|
||
"verification": "System Test, Demo",
|
||
"statement": "The diagnostics export mode shall be explicitly user-initiated and shall apply redaction before export."
|
||
},
|
||
{
|
||
"id": "SysDes-065",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Bridge, Software: Rust Core",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Manual connection flow shall pass host, port, nickname, optional password, and identity reference from Flutter UI to Rust Core through bridge DTOs."
|
||
},
|
||
{
|
||
"id": "SysDes-066",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Protocol Adapter",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Rust Core shall use the protocol adapter to establish server connection and authentication through `tsclientlib`."
|
||
},
|
||
{
|
||
"id": "SysDes-067",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: State Sync",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Initial synchronization shall fetch server information, channel list, client list, and required self-client information before emitting a full snapshot."
|
||
},
|
||
{
|
||
"id": "SysDes-068",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: State Sync",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Live server events shall be converted into internal events, applied through deterministic reducers, and emitted as UI-safe delta events."
|
||
},
|
||
{
|
||
"id": "SysDes-069",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Protocol Adapter",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Channel join flow shall wait for Rust Core/protocol confirmation before treating the UI state as authoritative."
|
||
},
|
||
{
|
||
"id": "SysDes-070",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Protocol Adapter",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Text message flow shall route user text from Flutter to Rust Core to protocol adapter and route received messages back as core events."
|
||
},
|
||
{
|
||
"id": "SysDes-071",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter, Software: Audio Subsystem",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Outgoing voice flow shall capture PCM frames, apply required processing, encode voice, and send voice packets through the protocol adapter."
|
||
},
|
||
{
|
||
"id": "SysDes-072",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Incoming voice flow shall receive voice packets, jitter-buffer, decode, apply per-user controls, mix, and play through platform playback."
|
||
},
|
||
{
|
||
"id": "SysDes-073",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software",
|
||
"verification": "System Test, Demo",
|
||
"statement": "User-triggered disconnect flow shall transition to Disconnected and shall suppress automatic reconnect."
|
||
},
|
||
{
|
||
"id": "SysDes-074",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: State Sync",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Recoverable network failure flow shall transition to Reconnecting, apply reconnect policy, and rebuild state from a fresh snapshot."
|
||
},
|
||
{
|
||
"id": "SysDes-075",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem, Platform",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Audio device change flow shall report route/device changes through platform adapters and shall recover or enter a user-safe blocked/degraded state."
|
||
},
|
||
{
|
||
"id": "SysDes-076",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Storage, Platform Secure Storage, Software: Diagnostics, Verification",
|
||
"verification": "System Test, Demo",
|
||
"statement": "Secure storage flow shall store and retrieve secrets through platform secure storage without exposing plaintext secrets to logs or diagnostic export."
|
||
},
|
||
{
|
||
"id": "SysDes-077",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Protocol Adapter, Software: Audio Subsystem, Software: Diagnostics, Verification",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall select Flutter + Rust Core to meet cross-platform UI requirements while centralizing protocol, state, audio, storage, and diagnostics logic."
|
||
},
|
||
{
|
||
"id": "SysDes-078",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall isolate `tsclientlib` inside the protocol adapter to reduce impact if protocol implementation must be patched, forked, or replaced."
|
||
},
|
||
{
|
||
"id": "SysDes-079",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: State Sync, System Engineering, Verification",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall use snapshot + delta synchronization to support deterministic state recovery, reconnect behavior, event replay, and UI consistency."
|
||
},
|
||
{
|
||
"id": "SysDes-080",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem, Platform, Platform Secure Storage, Deployment / Operations",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall use platform adapters to isolate OS-specific permission, audio routing, lifecycle, secure storage, notification, and packaging concerns."
|
||
},
|
||
{
|
||
"id": "SysDes-081",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall implement audio processing through a backend abstraction that supports platform-native and Rust-based processing options."
|
||
},
|
||
{
|
||
"id": "SysDes-082",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall define external compatible server behavior as an external dependency and shall not assume control over server-side permissions, availability, or configuration."
|
||
},
|
||
{
|
||
"id": "SysDes-083",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall not introduce Chanora-operated backend infrastructure for MVP voice, channel, or text operation."
|
||
},
|
||
{
|
||
"id": "SysDes-084",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter, Software: Audio Subsystem, Platform, Software: Diagnostics, Verification, Deployment / Operations",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall treat real-time audio behavior, secure secret storage, protocol compatibility, mobile lifecycle policy, diagnostic redaction, and release signing as special characteristics requiring explicit verification."
|
||
},
|
||
{
|
||
"id": "SysDes-085",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Flutter UI, Software: Bridge, Software: Rust Core",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall allocate UI responsiveness to Flutter UI, Bridge Layer, Rust Core asynchronous command handling, and non-blocking reconnect behavior."
|
||
},
|
||
{
|
||
"id": "SysDes-086",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Hardware, Network, Software: Audio Subsystem, Platform",
|
||
"verification": "Test, Analysis",
|
||
"statement": "The architecture shall allocate local audio latency requirements to client device hardware, OS audio stack, platform adapters, audio subsystem, codec processing, and network environment."
|
||
},
|
||
{
|
||
"id": "SysDes-087",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Audio Subsystem, Software: Diagnostics, Verification",
|
||
"verification": "Test, Analysis",
|
||
"statement": "The architecture shall allocate memory growth constraints to Rust Core queue management, diagnostics log retention, chat history limits, and audio buffer bounds."
|
||
},
|
||
{
|
||
"id": "SysDes-088",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Protocol Adapter, Software: State Sync, Software: Audio Subsystem",
|
||
"verification": "Test, Analysis",
|
||
"statement": "The architecture shall allocate reliability recovery requirements to Rust Core reconnect policy, protocol adapter error mapping, state engine snapshot replacement, and platform audio recovery."
|
||
},
|
||
{
|
||
"id": "SysDes-089",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Secure Storage, Software: Diagnostics, Verification",
|
||
"verification": "Audit",
|
||
"statement": "The architecture shall allocate security requirements to platform secure storage, secret redaction, diagnostics redaction, user-safe error mapping, and input validation."
|
||
},
|
||
{
|
||
"id": "SysDes-090",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform, Software: Diagnostics, Verification",
|
||
"verification": "Audit",
|
||
"statement": "The architecture shall allocate privacy requirements to user-controlled diagnostics, minimal data collection, and permission explainers."
|
||
},
|
||
{
|
||
"id": "SysDes-091",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Storage, Deployment / Operations, System Engineering, Verification",
|
||
"verification": "Inspection, Demo",
|
||
"statement": "The architecture shall allocate packaging and release requirements to deployment environment, signing/notarization/app-store packaging, and release metadata review."
|
||
},
|
||
{
|
||
"id": "SysDes-092",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Each SysRS requirement shall trace forward to one or more system elements and to one or more SysDes design items with Type, Stage, Allocation, and Verification attributes."
|
||
},
|
||
{
|
||
"id": "SysDes-093",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Each system element shall trace backward to one or more SysRS requirements unless explicitly marked as supporting infrastructure."
|
||
},
|
||
{
|
||
"id": "SysDes-094",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Each interface shall trace backward to the SysRS requirements that require the interaction or runtime dependency."
|
||
},
|
||
{
|
||
"id": "SysDes-095",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Each dynamic flow shall trace backward to the SysRS functional, state, performance, security, or operational requirements that require the behavior."
|
||
},
|
||
{
|
||
"id": "SysDes-096",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Architecture changes shall update the SysRS allocation matrix, affected interfaces, affected dynamic flows, and verification hooks."
|
||
},
|
||
{
|
||
"id": "SysDes-097",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Consistency review shall check that SysDes does not contradict SysRS, does not introduce unapproved scope, and does not remove required MVP capabilities."
|
||
},
|
||
{
|
||
"id": "SysDes-098",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Rust Core, Software: Audio Subsystem, Deployment / Operations, System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The system architecture shall be reviewed by product, system engineering, Rust Core engineering, Flutter engineering, audio engineering, platform engineering, QA, security/privacy, and release stakeholders."
|
||
},
|
||
{
|
||
"id": "SysDes-099",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Architecture review evidence shall include review date, participants, open issues, decisions, accepted risks, and approval status."
|
||
},
|
||
{
|
||
"id": "SysDes-100",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The agreed SysDes baseline shall be communicated to downstream SRS, SAD, SDD, and Verification authors."
|
||
},
|
||
{
|
||
"id": "SysDes-101",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Protocol Adapter, Software: Audio Subsystem, Platform, Platform Secure Storage, Deployment / Operations, System Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Any change affecting `tsclientlib` isolation, real-time audio processing, secure storage, mobile lifecycle, or release wording shall trigger architecture impact review."
|
||
},
|
||
{
|
||
"id": "SysDes-102",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "External Server, Software: Protocol Adapter",
|
||
"verification": "Test, Demo",
|
||
"statement": "Protocol verification shall use a protocol probe tool and compatibility matrix to verify external server compatibility and `tsclientlib` adapter behavior."
|
||
},
|
||
{
|
||
"id": "SysDes-103",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: State Sync",
|
||
"verification": "Test, Demo",
|
||
"statement": "State verification shall use reducer tests and event replay tests to verify snapshot, delta, reconnect, and malformed-event behavior."
|
||
},
|
||
{
|
||
"id": "SysDes-104",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Audio Subsystem",
|
||
"verification": "Test, Demo",
|
||
"statement": "Audio verification shall use audio loopback and processing tests to verify capture, playback, codec, jitter buffer, mixer, Echo Canceller, AGC, Noise Suppression, and High-Pass Filter."
|
||
},
|
||
{
|
||
"id": "SysDes-105",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Secure Storage, Software: Diagnostics, Verification",
|
||
"verification": "Audit",
|
||
"statement": "Security verification shall audit secure storage, private-key handling, password handling, input validation, and diagnostic redaction on all target platforms."
|
||
},
|
||
{
|
||
"id": "SysDes-106",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software: Storage, Deployment / Operations",
|
||
"verification": "Inspection, Demo",
|
||
"statement": "Deployment verification shall verify release package creation, signing, notarization, app-store builds, and release metadata wording."
|
||
},
|
||
{
|
||
"id": "SysDes-107",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Verification",
|
||
"verification": "Test, Demo",
|
||
"statement": "MVP acceptance verification shall demonstrate all acceptance requirements from SysRS-241 through SysRS-257."
|
||
},
|
||
{
|
||
"id": "SysDes-108",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Software Requirements Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SysDes shall be the mandatory architectural allocation layer between SysRS and SRS; downstream SRS requirements shall use SysDes IDs as their direct source and shall not use SysRS IDs as their direct source."
|
||
},
|
||
{
|
||
"id": "SysDes-109",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Software Requirements Engineering",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The SysDes shall provide enough allocation information for SWE.1 to derive software requirements without directly reinterpreting SysRS requirements."
|
||
},
|
||
{
|
||
"id": "SysDes-110",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Software Requirements Engineering, Change Control, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "If a downstream software requirement cannot be derived from an existing SysDes design item, the SysDes shall be revised before the SRS is revised or baselined."
|
||
},
|
||
{
|
||
"id": "SysDes-111",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Design System",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The system architecture shall adopt Material 3 as the baseline UI design system for the Flutter client and shall define Chanora-specific UI semantics above it."
|
||
},
|
||
{
|
||
"id": "SysDes-112",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System, Flutter UI",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The system architecture shall allocate Material 3 theming to a dedicated Design System element rather than to feature screens."
|
||
},
|
||
{
|
||
"id": "SysDes-113",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Inspection, Test",
|
||
"statement": "The Design System element shall own `ThemeData`, `ColorScheme`, typography mapping, shape mapping, elevation mapping, motion mapping, and product semantic token mapping."
|
||
},
|
||
{
|
||
"id": "SysDes-114",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System",
|
||
"verification": "Review, Inspection, Test",
|
||
"statement": "The system architecture shall define Chanora semantic tokens for connection state, voice state, latency state, channel state, diagnostics state, and accessibility state."
|
||
},
|
||
{
|
||
"id": "SysDes-115",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Adaptive Shell",
|
||
"verification": "Test, Demo",
|
||
"statement": "The system architecture shall allocate compact, medium, and expanded layout selection to an Adaptive Shell element."
|
||
},
|
||
{
|
||
"id": "SysDes-116",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Adaptive Shell, Voice UI",
|
||
"verification": "System Test, Demo",
|
||
"statement": "The Adaptive Shell shall keep connection status and primary voice controls visible or directly reachable across compact, medium, and expanded layouts."
|
||
},
|
||
{
|
||
"id": "SysDes-117",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Design System, Verification",
|
||
"verification": "Accessibility Test, Review",
|
||
"statement": "The system architecture shall allocate accessibility semantics, non-color-only state expression, text scaling, and focus visibility to the Flutter UI and Design System elements."
|
||
},
|
||
{
|
||
"id": "SysDes-118",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapter, Flutter Shell",
|
||
"verification": "Platform Test, Integration Test",
|
||
"statement": "The platform architecture shall allocate safe areas, display cutouts, system bars, virtual keyboards, desktop insets, Android back behavior, and iOS navigation behavior to Platform Adapter and Flutter Shell elements."
|
||
},
|
||
{
|
||
"id": "SysDes-119",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service, Flutter UI, Diagnostics",
|
||
"verification": "Inspection, Test",
|
||
"statement": "The system architecture shall allocate user-visible string localization to a Localization Service used by Flutter UI and diagnostics presentation."
|
||
},
|
||
{
|
||
"id": "SysDes-120",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Protocol Adapter, Rust Core, Flutter UI",
|
||
"verification": "Integration Test, System Test",
|
||
"statement": "The system architecture shall allocate server-provided names and messages to a Content Text path that is displayed without product localization or translation."
|
||
},
|
||
{
|
||
"id": "SysDes-121",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI, Bridge, Rust Core, Storage, Diagnostics, Protocol Adapter",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "The system architecture shall standardize UTF-8 as the internal text representation across Flutter, Rust Core, storage, diagnostics, and protocol-facing adapter DTOs."
|
||
},
|
||
{
|
||
"id": "SysDes-126",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "System Engineering, Software Engineering, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The system architecture shall enforce lifecycle traceability so that SysDes covers SysRS, SRS covers software-related SysDes, SAD covers SRS, and SDD covers SAD."
|
||
},
|
||
{
|
||
"id": "SysDes-127",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Engineering, System Engineering",
|
||
"verification": "Inspection",
|
||
"statement": "The system architecture shall prevent SRS requirements from linking directly to SysRS IDs; SRS shall use `Source SysDes` only."
|
||
},
|
||
{
|
||
"id": "SysDes-128",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Architecture, System Engineering",
|
||
"verification": "Inspection",
|
||
"statement": "The system architecture shall prevent SAD architecture items from linking directly to SysRS or SysDes IDs; SAD shall use `Source SRS` only."
|
||
},
|
||
{
|
||
"id": "SysDes-129",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Software Design, System Engineering",
|
||
"verification": "Inspection",
|
||
"statement": "The system architecture shall prevent SDD detailed design items from linking directly to SysRS, SysDes, or SRS IDs; SDD shall use `Source SAD` only."
|
||
},
|
||
{
|
||
"id": "SysDes-130",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Design System, Localization Service, Flutter UI",
|
||
"verification": "Accessibility Test, Inspection",
|
||
"statement": "The system architecture shall allocate localized accessibility labels for icon-only controls to the Design System and Localization Service."
|
||
},
|
||
{
|
||
"id": "SysDes-131",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Localization Service",
|
||
"verification": "Test",
|
||
"statement": "The system architecture shall allocate language fallback behavior to the Localization Service and require deterministic fallback to the baseline product language."
|
||
},
|
||
{
|
||
"id": "SysDes-132",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter App Shell, Design System, Localization Service",
|
||
"verification": "Integration Test",
|
||
"statement": "The system architecture shall allocate theme and localization initialization to application startup before feature screens render user-visible content."
|
||
},
|
||
{
|
||
"id": "SysDes-133",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapter, Release / Operations, Verification",
|
||
"verification": "Review, Platform Test",
|
||
"statement": "The system architecture shall allocate iOS runtime minimum version policy to platform configuration, platform verification, release readiness, and iOS platform services."
|
||
},
|
||
{
|
||
"id": "SysDes-134",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Release / Operations, iOS Build Configuration, Verification",
|
||
"verification": "Release Inspection",
|
||
"statement": "The system architecture shall allocate Apple App Store Connect upload SDK compliance to release engineering and release readiness rather than runtime feature logic."
|
||
},
|
||
{
|
||
"id": "SysDes-135",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Adapter, Android Build Configuration, Release / Operations, Verification",
|
||
"verification": "Review, Platform Test, Release Inspection",
|
||
"statement": "The system architecture shall allocate Android minimum runtime version policy and Google Play target SDK compliance to Android platform configuration, platform verification, and release readiness."
|
||
},
|
||
{
|
||
"id": "SysDes-136",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Rust Core, Flutter UI, State Sync, Audio Subsystem, Protocol Adapter",
|
||
"verification": "Review, System Test",
|
||
"statement": "The system architecture shall constrain MVP runtime state, UI, audio routing, and protocol orchestration to one active server connection per client instance."
|
||
},
|
||
{
|
||
"id": "SysDes-137",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Subsystem, Platform Audio, Settings UI",
|
||
"verification": "Audio Test, Review",
|
||
"statement": "The system architecture shall allocate AEC, AGC, Noise Suppression, and High-Pass Filter default enablement to the audio subsystem with platform capability detection and user-setting control."
|
||
},
|
||
{
|
||
"id": "SysDes-139",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Storage, Platform Secure Storage, Security",
|
||
"verification": "Storage Test, Security Audit",
|
||
"statement": "The system architecture shall allocate non-secret local state to SQLite or an equivalent embedded database and secrets to platform secure storage."
|
||
},
|
||
{
|
||
"id": "SysDes-140",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Bridge, Flutter State, Rust Core",
|
||
"verification": "Architecture Review, Integration Test",
|
||
"statement": "The system architecture shall allocate Flutter/Rust communication to a stable typed bridge with generated or schema-controlled DTOs."
|
||
},
|
||
{
|
||
"id": "SysDes-141",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Privacy, Release / Operations, Security",
|
||
"verification": "Privacy Review, Security Audit",
|
||
"statement": "The system architecture shall exclude automatic diagnostic upload, telemetry upload, and automatic crash reporting from MVP runtime behavior unless a later approved decision updates privacy, security, legal, release, and verification baseli"
|
||
},
|
||
{
|
||
"id": "SysDes-142",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Input, Rust Core, Flutter UI, Audio Engine",
|
||
"verification": "Architecture Review, Platform Test",
|
||
"statement": "The desktop Push-to-Talk subsystem shall be allocated to a dedicated **Platform PTT Backend** layer that is selected at runtime per operating system, display server, and granted permission set, with the **Rust Core PTT State Machine** ownin"
|
||
},
|
||
{
|
||
"id": "SysDes-143",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Input, Rust Core, Flutter UI, Bridge",
|
||
"verification": "Integration Test, Architecture Review",
|
||
"statement": "The platform PTT backend layer shall report a typed `PttCapabilityLevel` (`L0` Focused, `L1` Global-shortcut-activation, `L2` Global-hold-to-talk, `L3` Global-with-mouse-buttons, `L4` Device-aware) to the Rust Core, and the Rust Core shall "
|
||
},
|
||
{
|
||
"id": "SysDes-144",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Engine, Rust Core",
|
||
"verification": "Audio Test, Integration Test",
|
||
"statement": "The audio capture pipeline shall expose two distinct atomic states: `capture_active` (the input stream is open and frames flow into the encoder feeder) and `transmit_active` (the encoder is producing outbound Opus frames and the protocol la"
|
||
},
|
||
{
|
||
"id": "SysDes-145",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Platform Input",
|
||
"verification": "Platform Test (Win/macOS/Linux), Architecture Review",
|
||
"statement": "The Windows desktop backend shall be allocated to a Raw-Input-first implementation with a low-level-hook fallback and a Focused-PTT terminal fallback. The macOS desktop backend shall be allocated to a permission-aware Global PTT implementat"
|
||
},
|
||
{
|
||
"id": "SysDes-146",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Diagnostics, Platform Input",
|
||
"verification": "Privacy Review, Diagnostic Inspection, Unit Test",
|
||
"statement": "A **diagnostics sanitizer** shall sit between the platform PTT backend and the application log sink. The sanitizer shall reject any record carrying raw key codes, scan codes, virtual-key values, or key-press timing sequences before the reco"
|
||
},
|
||
{
|
||
"id": "SysDes-147",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Flutter UI",
|
||
"verification": "User Acceptance Test, UI Review",
|
||
"statement": "The Flutter Voice UI shall surface the active PTT capability level and the active backend identifier as user-facing status (capability badge, fallback notice) so the user understands when a Global PTT binding cannot be honoured and a Focuse"
|
||
},
|
||
{
|
||
"id": "SysDes-148",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Release / Operations, Verification",
|
||
"verification": "Release Inspection, Architecture Review",
|
||
"statement": "The release verification record shall carry per-platform PTT capability evidence (detected `PttCapabilityLevel`, active backend identifier, fallback exercised yes/no) before any release artefact may claim Global PTT support. Release notes s"
|
||
},
|
||
{
|
||
"id": "SysDes-149",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Engine, Bridge, Flutter UI",
|
||
"verification": "Unit Test, UI Review",
|
||
"statement": "The system architecture shall define a `TransmitMode` element carried as an enum at the audio + bridge + UI boundary with variants `Ptt`, `Continuous`, and a reserved `VoiceActivity` placeholder that has no allocated implementation in this "
|
||
},
|
||
{
|
||
"id": "SysDes-150",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Engine, Bridge, Flutter UI",
|
||
"verification": "Integration Test, UI Review",
|
||
"statement": "The audio engine lifecycle shall be allocated to voice-channel membership: the input and output streams shall open on the user's first voice-channel join of the session and shall close on the last voice-channel leave. The output-stream open"
|
||
},
|
||
{
|
||
"id": "SysDes-151",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Audio Engine",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "A release-tail element shall be allocated to the audio subsystem as a system-level timer adapter on the `transmit_active` atomic defined in SysDes-144, parameterised by a configurable release-tail period (default 200 ms; user-configurable r"
|
||
},
|
||
{
|
||
"id": "SysDes-152",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Android Platform Adapter, Audio Subsystem (consumer)",
|
||
"verification": "Integration Test, System Test",
|
||
"statement": "The system architecture shall allocate engagement of the Android voice-communication audio mode (for example `AudioManager.setMode(MODE_IN_COMMUNICATION)` or an equivalent platform routing-assist mechanism) to the Android Platform Adapter a"
|
||
},
|
||
{
|
||
"id": "SysDes-153",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Android Platform Adapter, Permission Subsystem, Audio Subsystem (consumer), Voice Subsystem (consumer), Flutter UI (re-request affordance)",
|
||
"verification": "Integration Test, System Test",
|
||
"statement": "The system architecture shall allocate Android runtime microphone permission (`RECORD_AUDIO`) acquisition and denial-handling to the Android Platform Adapter as the system-design partitioning between the Permission Subsystem and the Voice S"
|
||
},
|
||
{
|
||
"id": "SysDes-154",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "Android Platform Adapter (owner), Audio Subsystem (consumer through trait), Platform Adapter Layer, Diagnostics (sharing-mode telemetry)",
|
||
"verification": "Integration Test, System Test, Audio Test",
|
||
"statement": "The system architecture shall allocate the Android voice audio backend as a dedicated subsystem owned by the Android Platform Adapter and exposed to the cross-platform Audio Subsystem (SE-13) through a trait-based backend abstraction, mirro"
|
||
},
|
||
{
|
||
"id": "SysDes-155",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "macOS Build Configuration (owner), Platform Adapter Layer (macOS Platform Services), Release / Operations (Release Pipeline), Verification",
|
||
"verification": "Review, Platform Test (macOS), Release Inspection",
|
||
"statement": "The system architecture shall allocate the macOS runtime baseline as a dedicated platform-baseline element parallel to SysDes-133 (iOS) and SysDes-135 (Android), covering (a) the macOS deployment-target policy as a single-source-of-truth sy"
|
||
},
|
||
{
|
||
"id": "SysDes-156",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "SE-13 (Audio Subsystem) — owns the realtime path being measured; the realtime callback, the Opus encode/decode paths, and the resampler are all SE-13 surfaces",
|
||
"verification": "Automated Benchmark Execution (criterion crate per SDD); Inspection of the JSON baseline records committed to the default branch",
|
||
"statement": "The system architecture shall allocate to SE-13 (Audio Subsystem) the obligation to expose its realtime capture and playback paths to benchmark instrumentation, such that the maintained numeric performance baselines authorized by SysRS-307 "
|
||
},
|
||
{
|
||
"id": "SysDes-157",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "SE-18 (Deployment and Release Environment) — owns CI/CD per SysDes-036; the CI workflow definitions, the GitHub Actions runner selection, the PR status-check surface, the PR comment rendering, and the baseline-update workflow all live here",
|
||
"verification": "Demo (a CI run on a synthetic PR demonstrates the markdown table report, the visual markers, the non-blocking `success` status on a simulated regression, and the \"no baseline\" fallback on a metric with no prior baseline)",
|
||
"statement": "The system architecture shall allocate to SE-18 (Deployment and Release Environment) the integration of the realtime-audio benchmark suite (SysDes-156) into the existing CI workflow as an **advisory** regression-reporting surface, satisfyin"
|
||
},
|
||
{
|
||
"id": "SysDes-158",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P0 / MVP",
|
||
"allocation": "SE-18 (Deployment and Release Environment) — the comparison logic lives in CI tooling co-located with the workflow authored in SysDes-157",
|
||
"verification": "Review (the per-metric tolerance values are subject to periodic review; SDD ratifies the values as authored here and may refine the harness implementation; future SAD/SDD revisions may re-tune the values as baseline noise characteristics are observed empirically)",
|
||
"statement": "The system architecture shall allocate to SE-18 (Deployment and Release Environment) the per-metric tolerance window and the baseline-comparison methodology used by the advisory CI surface (SysDes-157), satisfying SysRS-309. The tolerance w"
|
||
}
|
||
],
|
||
"P1": [
|
||
{
|
||
"id": "SAD-035",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Storage, Platform Secure Storage",
|
||
"verification": "Security Test, Inspection",
|
||
"statement": "The architecture shall isolate local storage and secure storage behavior behind storage components."
|
||
},
|
||
{
|
||
"id": "SAD-036",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics",
|
||
"verification": "Audit, Test",
|
||
"statement": "The architecture shall isolate diagnostics and redaction behavior in diagnostics components."
|
||
},
|
||
{
|
||
"id": "SAD-037",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Build, Release, Operations",
|
||
"verification": "Inspection, Demo",
|
||
"statement": "The architecture shall isolate deployment, release, and packaging support in build and release assets."
|
||
},
|
||
{
|
||
"id": "SAD-038",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Verification Support",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall provide verification hooks for requirements traceability and platform validation."
|
||
},
|
||
{
|
||
"id": "SAD-039",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Flutter State",
|
||
"verification": "Unit Test, Review",
|
||
"statement": "The architecture shall use view models as the boundary between feature screens and application state."
|
||
},
|
||
{
|
||
"id": "SAD-040",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Bridge Facade",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "The architecture shall use a bridge facade as the only Flutter-to-Rust command boundary."
|
||
},
|
||
{
|
||
"id": "SAD-041",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Bridge, Flutter State",
|
||
"verification": "Integration Test",
|
||
"statement": "The architecture shall map asynchronous Rust events into Flutter UI state updates."
|
||
},
|
||
{
|
||
"id": "SAD-042",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Verification Support",
|
||
"verification": "Review, Test",
|
||
"statement": "The architecture shall define test seams for theme, localization, adaptive shell, platform services, and bridge facade."
|
||
},
|
||
{
|
||
"id": "SAD-043",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Design System, Flutter App Shell",
|
||
"verification": "Widget Test",
|
||
"statement": "The architecture shall support light and dark theme mode behavior."
|
||
},
|
||
{
|
||
"id": "SAD-044",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Design System",
|
||
"verification": "Widget Test",
|
||
"statement": "The architecture shall allow dynamic color as an optional enhancement without overriding Chanora semantic state tokens."
|
||
},
|
||
{
|
||
"id": "SAD-051",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall include a SWE.2 evaluation checklist covering software elements, allocation, interfaces, dynamic behavior, resource objectives, feasibility, testability, traceability, consistency, and communication."
|
||
},
|
||
{
|
||
"id": "SAD-053",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Review, Analysis",
|
||
"statement": "The architecture shall include performance and resource views for UI responsiveness, audio latency, memory growth, reconnect, localization, and diagnostics."
|
||
},
|
||
{
|
||
"id": "SAD-054",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall document assumptions and dependencies that affect design feasibility."
|
||
},
|
||
{
|
||
"id": "SAD-057",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Software Architecture, Software Design",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall explicitly support detailed design refinement of interface names, types, units, resolutions, ranges, and default values."
|
||
},
|
||
{
|
||
"id": "SAD-058",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Software Architecture, Software Design",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall define software units as the target decomposition level for SWE.3 detailed design."
|
||
},
|
||
{
|
||
"id": "SAD-059",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Software Design, Verification",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall define that SDD detail must be sufficient to support implementation and unit verification."
|
||
},
|
||
{
|
||
"id": "SAD-060",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Software Architecture, Software Design, Verification",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall require SAD and SDD changes to be communicated to relevant affected parties before downstream implementation or verification updates are treated as baseline."
|
||
},
|
||
{
|
||
"id": "SAD-066",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Audio Subsystem, Platform Audio Adapter",
|
||
"verification": "Architecture Review, Audio Test",
|
||
"statement": "The software architecture shall hide platform-native and fallback audio processing implementations behind the audio subsystem interface."
|
||
},
|
||
{
|
||
"id": "SDD-051",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`ArchitectureViewDocs` shall maintain context, container, component, runtime, deployment, data, security, diagnostics, UI, audio, protocol, and i18n views."
|
||
},
|
||
{
|
||
"id": "SDD-052",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`ArchitectureViewDocs` shall maintain an ADR index for accepted, deprecated, and superseded architectural decisions."
|
||
},
|
||
{
|
||
"id": "SDD-053",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`DeploymentConfig` shall define platform-specific packaging and release configuration units."
|
||
},
|
||
{
|
||
"id": "SDD-054",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Audit",
|
||
"statement": "`DiagnosticsArchitecture` shall centralize logging, event keys, localized descriptions, redaction, and export presentation."
|
||
},
|
||
{
|
||
"id": "SDD-055",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`ArchitectureTraceChecker` shall check that SDD items reference only SAD IDs."
|
||
},
|
||
{
|
||
"id": "SDD-056",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`ArchitectureTraceChecker` shall check that SAD items reference only SRS IDs."
|
||
},
|
||
{
|
||
"id": "SDD-057",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`ArchitectureViewDocs` shall define reviewable architecture views for context, containers, components, runtime behavior, deployment, data, security, diagnostics, UI, audio, protocol, and i18n."
|
||
},
|
||
{
|
||
"id": "SDD-058",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`ArchitectureViewDocs` shall define an ADR record structure with ID, title, status, decision, rationale, consequences, affected units, and change history."
|
||
},
|
||
{
|
||
"id": "SDD-059",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`InterfaceDetailCatalog` shall refine SAD architectural interfaces into unit-level interface entries."
|
||
},
|
||
{
|
||
"id": "SDD-060",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`InterfaceDetailCatalog` shall define command, event, localization, Unicode, diagnostics, adaptive layout, audio meter, and platform-intent interfaces."
|
||
},
|
||
{
|
||
"id": "SDD-061",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review, Analysis",
|
||
"statement": "`PerformanceDesignNotes` shall record UI responsiveness, audio latency, memory growth, reconnect, localization, and diagnostics resource considerations."
|
||
},
|
||
{
|
||
"id": "SDD-062",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`AssumptionRegister` shall record software design assumptions and dependencies that affect feasibility."
|
||
},
|
||
{
|
||
"id": "SDD-064",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review, Inspection",
|
||
"statement": "Each software unit detailed design shall include responsibility, inputs, outputs, interfaces, dynamic behavior, error behavior, resource behavior, and verification hooks where applicable."
|
||
},
|
||
{
|
||
"id": "SDD-065",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`UnitConstructionGuideline` shall state that software units are constructed according to the SDD rather than reverse-documented from code."
|
||
},
|
||
{
|
||
"id": "SDD-067",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`SoftwareUnitTraceChecker` shall support impact analysis from changed SAD items to affected SDD items."
|
||
},
|
||
{
|
||
"id": "SDD-068",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`DetailedDesignReviewRecord` shall capture review evidence for SDD completeness, testability, and consistency with SAD."
|
||
},
|
||
{
|
||
"id": "SDD-069",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`UnitVerificationHandoff` shall identify verification method candidates for each software unit."
|
||
},
|
||
{
|
||
"id": "SDD-070",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Inspection",
|
||
"statement": "`SoftwareUnitRegistry` shall maintain the list of software units, their owning component, source SAD items, and implementation status."
|
||
},
|
||
{
|
||
"id": "SDD-076",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Unit Test, Audio Test",
|
||
"statement": "`AudioProcessingBackendSelector` shall select platform-native audio processing first where available and stable and isolate any fallback backend behind the audio subsystem interface."
|
||
},
|
||
{
|
||
"id": "SDD-109",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "",
|
||
"verification": "Build Test, Release Inspection",
|
||
"statement": "`AndroidAaBuildPipeline` shall define the Android App Bundle (`.aab`) packaging pipeline used for release builds, covering bundletool configuration, ABI splits, signing assertions in CI, and version-code / version-name derivation."
|
||
},
|
||
{
|
||
"id": "SRS-028",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Flutter UI, Diagnostics",
|
||
"verification": "UI Test, Security Audit",
|
||
"statement": "The software shall provide a diagnostics UI that allows user-initiated diagnostic export and displays user-safe diagnostic status."
|
||
},
|
||
{
|
||
"id": "SRS-053",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Protocol Adapter, Bridge",
|
||
"verification": "Architecture Review",
|
||
"statement": "The Protocol Adapter shall support future patching, forking, or replacement of protocol implementation without changing Flutter UI contracts."
|
||
},
|
||
{
|
||
"id": "SRS-061",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "State Sync, Diagnostics",
|
||
"verification": "Demo",
|
||
"statement": "The State Synchronization Engine shall provide replayable event recording hooks for debugging state synchronization."
|
||
},
|
||
{
|
||
"id": "SRS-070",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Audio Subsystem, Platform Adapters",
|
||
"verification": "Inspection",
|
||
"statement": "The Audio Subsystem shall provide an audio processing backend abstraction supporting platform-native and Rust-based implementations."
|
||
},
|
||
{
|
||
"id": "SRS-075",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Audio Subsystem, Flutter UI, Storage",
|
||
"verification": "Audio Test, UI Test",
|
||
"statement": "The Audio Subsystem shall support per-user volume during playback."
|
||
},
|
||
{
|
||
"id": "SRS-082",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Audio Subsystem, Platform Adapters",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The Audio Subsystem shall recover from audio route or device changes by reconfiguring audio streams or entering a user-safe blocked/degraded state."
|
||
},
|
||
{
|
||
"id": "SRS-083",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Audio Subsystem, Diagnostics",
|
||
"verification": "Demo",
|
||
"statement": "The Audio Subsystem shall provide audio loopback and processing test hooks for verification."
|
||
},
|
||
{
|
||
"id": "SRS-085",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Storage",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software shall persist recent servers in local non-secret storage."
|
||
},
|
||
{
|
||
"id": "SRS-087",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Storage, Flutter UI",
|
||
"verification": "Unit Test, Integration Test",
|
||
"statement": "The software shall persist UI settings in local non-secret storage."
|
||
},
|
||
{
|
||
"id": "SRS-088",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Storage, Audio Subsystem",
|
||
"verification": "Unit Test",
|
||
"statement": "The software shall persist per-user volume and per-user mute preferences where applicable."
|
||
},
|
||
{
|
||
"id": "SRS-096",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics, Flutter UI",
|
||
"verification": "Demo, Security Audit",
|
||
"statement": "The software shall support user-initiated diagnostic export."
|
||
},
|
||
{
|
||
"id": "SRS-097",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics, Protocol Adapter, State Sync",
|
||
"verification": "Demo",
|
||
"statement": "The software shall provide protocol event recording in development or diagnostics mode."
|
||
},
|
||
{
|
||
"id": "SRS-098",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics, State Sync",
|
||
"verification": "Demo",
|
||
"statement": "The software shall provide event replay support for state synchronization debugging."
|
||
},
|
||
{
|
||
"id": "SRS-099",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics, Audio Subsystem, Platform Adapters",
|
||
"verification": "Demo",
|
||
"statement": "The software shall provide audio diagnostics for capture, processing backend, codec, jitter buffer, mixer, playback, and route/device status."
|
||
},
|
||
{
|
||
"id": "SRS-100",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics, Rust Core, Protocol Adapter",
|
||
"verification": "Demo",
|
||
"statement": "The software shall provide network diagnostics for connection status, reconnect attempts, latency where available, and protocol-relevant network failures."
|
||
},
|
||
{
|
||
"id": "SRS-109",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Platform Adapters, Flutter UI",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The software shall provide a platform adapter interface for notification permission requests where required."
|
||
},
|
||
{
|
||
"id": "SRS-112",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Platform Adapters, Audio Subsystem",
|
||
"verification": "Android Integration Test",
|
||
"statement": "The Android software shall handle audio focus and Bluetooth route changes where platform APIs expose them."
|
||
},
|
||
{
|
||
"id": "SRS-113",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Platform Adapters, Audio Subsystem",
|
||
"verification": "Desktop Integration Test",
|
||
"statement": "The desktop software shall support validated audio backends for Windows, macOS, and Linux."
|
||
},
|
||
{
|
||
"id": "SRS-114",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Platform Adapters, Rust Core, Audio Subsystem",
|
||
"verification": "Platform Integration Test",
|
||
"statement": "The software shall provide platform adapter lifecycle events for foreground/background, app resume, app suspend, audio interruption, and shutdown where supported."
|
||
},
|
||
{
|
||
"id": "SRS-115",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Platform Adapters, Diagnostics, Flutter UI",
|
||
"verification": "Review, Demo",
|
||
"statement": "The software shall document unsupported or degraded platform behaviors through user-safe status and diagnostics."
|
||
},
|
||
{
|
||
"id": "SRS-116",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Application Container, Deployment Scripts",
|
||
"verification": "Build Test",
|
||
"statement": "The software shall produce build artifacts for Windows installer packaging."
|
||
},
|
||
{
|
||
"id": "SRS-118",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Application Container, Deployment Scripts",
|
||
"verification": "Build Test",
|
||
"statement": "The software shall produce Linux release packages using the selected supported package formats."
|
||
},
|
||
{
|
||
"id": "SRS-119",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Application Container, Deployment Scripts",
|
||
"verification": "Build Test",
|
||
"statement": "The software shall produce Android AAB release builds."
|
||
},
|
||
{
|
||
"id": "SRS-120",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Application Container, Deployment Scripts",
|
||
"verification": "Build Test",
|
||
"statement": "The software shall produce iOS TestFlight and App Store release builds when signing assets are available."
|
||
},
|
||
{
|
||
"id": "SRS-122",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Application Container, Diagnostics, Deployment Scripts",
|
||
"verification": "Inspection, Security Review",
|
||
"statement": "The software shall provide release-build configuration that disables development-only diagnostic capture unless explicitly enabled for test builds."
|
||
},
|
||
{
|
||
"id": "SRS-127",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Deployment Scripts, Application Container",
|
||
"verification": "Build Test, Release Audit",
|
||
"statement": "The software shall include release verification support for package creation, signing, notarization, app-store builds, and release metadata wording."
|
||
},
|
||
{
|
||
"id": "SRS-138",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Platform Adapters, Audio Subsystem, Deployment Scripts",
|
||
"verification": "Review, Platform Test",
|
||
"statement": "The software team shall analyze operating-environment impacts of mobile lifecycle, foreground service behavior, AVAudioSession behavior, route changes, and app store policies."
|
||
},
|
||
{
|
||
"id": "SRS-153",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Flutter App Shell",
|
||
"verification": "Widget Test, Integration Test",
|
||
"statement": "The medium layout shall support side navigation or equivalent navigation rail behavior where available display width permits."
|
||
},
|
||
{
|
||
"id": "SRS-160",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Flutter UI",
|
||
"verification": "Widget Test, System Test",
|
||
"statement": "The software shall support visible focus indication and logical focus traversal for desktop and tablet keyboard use."
|
||
},
|
||
{
|
||
"id": "SRS-163",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Flutter App Shell, Platform Adapter",
|
||
"verification": "Platform Test",
|
||
"statement": "The software shall model Android back navigation as a platform back intent handled by the shell or platform service layer."
|
||
},
|
||
{
|
||
"id": "SRS-164",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Flutter App Shell, Platform Adapter",
|
||
"verification": "Platform Test",
|
||
"statement": "The software shall model iOS navigation gestures, safe areas, keyboard avoidance, and haptics through platform-aware UI services."
|
||
},
|
||
{
|
||
"id": "SRS-169",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Localization Service, Flutter UI",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The software shall allow additional locales to be added without changing protocol, audio, state synchronization, or storage modules."
|
||
},
|
||
{
|
||
"id": "SRS-173",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Protocol Adapter, Platform Adapter, Bridge",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "The software shall isolate non-UTF-8 or platform-specific string conversion in boundary adapters."
|
||
},
|
||
{
|
||
"id": "SRS-176",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Localization Service, Diagnostics UI",
|
||
"verification": "Localization Test",
|
||
"statement": "The software shall use locale-aware formatting for user-visible dates, times, numbers, and diagnostic timestamps."
|
||
},
|
||
{
|
||
"id": "SRS-177",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics",
|
||
"verification": "Inspection, Test",
|
||
"statement": "The software shall keep diagnostic event keys, codes, and machine-readable fields language-neutral."
|
||
},
|
||
{
|
||
"id": "SRS-178",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics, Localization Service",
|
||
"verification": "Inspection, Localization Test",
|
||
"statement": "The software shall allow user-facing diagnostic descriptions to be localized independently of machine-readable diagnostic fields."
|
||
},
|
||
{
|
||
"id": "SRS-179",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "UX, Software Engineering",
|
||
"verification": "Review",
|
||
"statement": "The software shall maintain UI/UX guideline, design token, component catalog, adaptive layout, and platform behavior documents as downstream design baselines."
|
||
},
|
||
{
|
||
"id": "SRS-191",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Audio Subsystem, Platform Audio Adapter",
|
||
"verification": "Architecture Review, Audio Test",
|
||
"statement": "The software shall use platform-native audio processing first for MVP where available and stable, and shall isolate any Rust/WebRTC-style fallback behind the audio subsystem boundary."
|
||
},
|
||
{
|
||
"id": "SysDes-122",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Protocol Adapter, Platform Adapter, Bridge",
|
||
"verification": "Inspection, Integration Test",
|
||
"statement": "The system architecture shall isolate non-UTF-8 or platform-specific string conversion at explicit boundary adapters."
|
||
},
|
||
{
|
||
"id": "SysDes-123",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Flutter UI, Localization Service",
|
||
"verification": "Test",
|
||
"statement": "The system architecture shall allocate bidirectional text rendering and locale-aware formatting to Flutter UI and Localization Service components."
|
||
},
|
||
{
|
||
"id": "SysDes-124",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Diagnostics, Localization Service",
|
||
"verification": "Inspection, Test",
|
||
"statement": "The diagnostics architecture shall keep machine-readable diagnostic keys language-neutral while allowing user-facing descriptions to be localized."
|
||
},
|
||
{
|
||
"id": "SysDes-125",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "System Engineering, UX, Software Team",
|
||
"verification": "Review",
|
||
"statement": "The system architecture shall define UI/UX guideline, design token, component catalog, adaptive layout, and platform behavior documents as downstream design baselines."
|
||
},
|
||
{
|
||
"id": "SysDes-138",
|
||
"source": "architecture/sysdes.md",
|
||
"stage": "P1 / Beta",
|
||
"allocation": "Audio Subsystem, Platform Audio Adapter, Rust Core",
|
||
"verification": "Architecture Review, Audio Test",
|
||
"statement": "The system architecture shall prefer platform-native audio processing for MVP and isolate any Rust/WebRTC-style fallback behind the audio subsystem boundary."
|
||
}
|
||
],
|
||
"P2": [
|
||
{
|
||
"id": "SAD-045",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Software Design",
|
||
"verification": "Inspection",
|
||
"statement": "The architecture shall keep future SDD derivation independent from non-SAD requirement IDs."
|
||
},
|
||
{
|
||
"id": "SAD-046",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall include C4-style architecture views in the SAD baseline."
|
||
},
|
||
{
|
||
"id": "SAD-047",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall include ADRs for architecturally significant decisions."
|
||
},
|
||
{
|
||
"id": "SAD-048",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall identify software stakeholders and architecture concerns."
|
||
},
|
||
{
|
||
"id": "SAD-049",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Release Architecture",
|
||
"verification": "Review, Inspection",
|
||
"statement": "The architecture shall include deployment and operational architecture views."
|
||
},
|
||
{
|
||
"id": "SAD-050",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Diagnostics Architecture",
|
||
"verification": "Review, Test",
|
||
"statement": "The architecture shall include diagnostics and observability architecture views."
|
||
},
|
||
{
|
||
"id": "SAD-055",
|
||
"source": "architecture/sad.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Software Architecture",
|
||
"verification": "Review",
|
||
"statement": "The architecture shall include a glossary for architecture-specific terms."
|
||
},
|
||
{
|
||
"id": "SDD-063",
|
||
"source": "architecture/sdd.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "",
|
||
"verification": "Review",
|
||
"statement": "`ArchitectureGlossary` shall provide definitions for architecture and detailed design terms."
|
||
},
|
||
{
|
||
"id": "SRS-117",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Application Container, Deployment Scripts",
|
||
"verification": "Build/Release Audit",
|
||
"statement": "The software shall produce signed and notarized macOS release builds for production release."
|
||
},
|
||
{
|
||
"id": "SRS-154",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Flutter App Shell",
|
||
"verification": "Integration Test, System Test",
|
||
"statement": "The expanded layout shall support persistent side panes and persistent voice controls where available display width permits."
|
||
},
|
||
{
|
||
"id": "SRS-175",
|
||
"source": "requirements/srs.md",
|
||
"stage": "P2 / Production",
|
||
"allocation": "Flutter UI",
|
||
"verification": "Localization Test",
|
||
"statement": "The software shall support bidirectional text display where the Flutter platform text engine supports it."
|
||
}
|
||
],
|
||
"SOP": [
|
||
{
|
||
"id": "SysRS-001",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall be a cross-platform client application for channel-based voice communication."
|
||
},
|
||
{
|
||
"id": "SysRS-002",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support Windows, macOS, Linux, iOS, and Android as target client platforms."
|
||
},
|
||
{
|
||
"id": "SysRS-003",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall use Flutter for the user-facing client interface."
|
||
},
|
||
{
|
||
"id": "SysRS-004",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall use Rust Core for protocol handling, connection management, state synchronization, audio processing, storage coordination, diagnostics, and business logic."
|
||
},
|
||
{
|
||
"id": "SysRS-005",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall use `tsclientlib` as the TeamSpeak-compatible protocol client library."
|
||
},
|
||
{
|
||
"id": "SysRS-006",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall operate as an independent client and shall not present itself as an official TeamSpeak product."
|
||
},
|
||
{
|
||
"id": "SysRS-007",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow users to connect to TeamSpeak 3-compatible servers reachable from the client device network."
|
||
},
|
||
{
|
||
"id": "SysRS-008",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow users to participate in channel-based voice communication when the external server and user permissions allow it."
|
||
},
|
||
{
|
||
"id": "SysRS-009",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow users to send and receive supported text messages when the external server and user permissions allow it."
|
||
},
|
||
{
|
||
"id": "SysRS-010",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide local bookmark, recent server, identity reference, UI setting, and audio setting management on the client device."
|
||
},
|
||
{
|
||
"id": "SysRS-011",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support end users who manually connect to compatible voice servers."
|
||
},
|
||
{
|
||
"id": "SysRS-012",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support regular users who rely on saved bookmarks, persistent identity, audio settings, and common voice controls."
|
||
},
|
||
{
|
||
"id": "SysRS-013",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support testers and support operators who export diagnostics for troubleshooting."
|
||
},
|
||
{
|
||
"id": "SysRS-014",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The SysRS shall provide requirements traceability suitable for engineering, QA, system administration, and release operations."
|
||
},
|
||
{
|
||
"id": "SysRS-015",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The SysRS shall document external environment dependencies that may need administrator configuration, including network reachability and OS-level audio permissions."
|
||
},
|
||
{
|
||
"id": "SysRS-016",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall treat external TeamSpeak 3-compatible servers as external systems outside Chanora control."
|
||
},
|
||
{
|
||
"id": "SysRS-017",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not require a Chanora-operated central server for MVP voice, channel, or text operation."
|
||
},
|
||
{
|
||
"id": "SysRS-018",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not host or operate TeamSpeak-compatible server functionality in the MVP."
|
||
},
|
||
{
|
||
"id": "SysRS-019",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall rely on operating system services for microphone permission, secure storage, audio routing, notifications, and mobile lifecycle behavior."
|
||
},
|
||
{
|
||
"id": "SysRS-020",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall treat app stores, package repositories, installers, and update services as deployment environment components."
|
||
},
|
||
{
|
||
"id": "SysRS-021",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall treat physical microphones, speakers, wired headsets, USB audio devices, and Bluetooth audio devices as external hardware interfaces."
|
||
},
|
||
{
|
||
"id": "SysRS-022",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall treat routers, firewalls, VPNs, NAT devices, and ISPs as external network environment components."
|
||
},
|
||
{
|
||
"id": "SysRS-023",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall expose user-safe errors when external dependencies prevent successful operation."
|
||
},
|
||
{
|
||
"id": "SysRS-024",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a Flutter UI component responsible for rendering screens, receiving user input, and presenting application state."
|
||
},
|
||
{
|
||
"id": "SysRS-025",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a Flutter State Layer responsible for UI state derived from Rust Core events."
|
||
},
|
||
{
|
||
"id": "SysRS-026",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a Bridge Layer responsible for commands, DTOs, asynchronous calls, and event streams between Flutter and Rust Core."
|
||
},
|
||
{
|
||
"id": "SysRS-027",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a Rust Core component responsible for authoritative connection, protocol, state, audio, storage, settings, and diagnostics behavior."
|
||
},
|
||
{
|
||
"id": "SysRS-028",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a protocol adapter component that isolates direct `tsclientlib` usage."
|
||
},
|
||
{
|
||
"id": "SysRS-029",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a state synchronization component that implements snapshot + delta state handling."
|
||
},
|
||
{
|
||
"id": "SysRS-030",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include an audio subsystem component that coordinates capture, processing, encoding, decoding, jitter buffering, mixing, and playback."
|
||
},
|
||
{
|
||
"id": "SysRS-031",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a local storage component for non-secret data such as bookmarks, recent servers, UI settings, and audio settings."
|
||
},
|
||
{
|
||
"id": "SysRS-032",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a secure storage adapter for private identities, passwords, and future sensitive tokens."
|
||
},
|
||
{
|
||
"id": "SysRS-033",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include a diagnostics component for structured logging, redaction, event recording, event replay, audio diagnostics, network diagnostics, and user-initiated export."
|
||
},
|
||
{
|
||
"id": "SysRS-034",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall include platform adapter components for desktop and mobile platform services."
|
||
},
|
||
{
|
||
"id": "SysRS-035",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device shall use a CPU architecture supported by Flutter, Rust, and the selected target platform."
|
||
},
|
||
{
|
||
"id": "SysRS-036",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device shall provide sufficient CPU capacity to run the Chanora application, Opus-compatible voice processing, and enabled audio processing features in real time."
|
||
},
|
||
{
|
||
"id": "SysRS-037",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device shall provide sufficient memory for the Chanora application to run without unbounded growth in logs, chat history, audio buffers, or event queues."
|
||
},
|
||
{
|
||
"id": "SysRS-038",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device shall provide persistent local storage for Chanora application data, settings, logs, and cached metadata."
|
||
},
|
||
{
|
||
"id": "SysRS-039",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device shall provide a microphone or supported audio input device for voice transmission."
|
||
},
|
||
{
|
||
"id": "SysRS-040",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device shall provide speakers, headphones, or a supported audio output device for voice playback."
|
||
},
|
||
{
|
||
"id": "SysRS-041",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device shall provide network connectivity to the selected compatible voice server."
|
||
},
|
||
{
|
||
"id": "SysRS-042",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The desktop client environment should be validated on devices with at least 4 GB RAM for MVP operation."
|
||
},
|
||
{
|
||
"id": "SysRS-043",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The desktop client environment should be validated with at least 500 MB free local storage for installation, settings, logs, and diagnostic bundle creation."
|
||
},
|
||
{
|
||
"id": "SysRS-044",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device should provide stable audio device identifiers where the target platform supports persistent device selection."
|
||
},
|
||
{
|
||
"id": "SysRS-045",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device should provide hardware or OS support for low-latency audio capture and playback."
|
||
},
|
||
{
|
||
"id": "SysRS-046",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client device should provide Bluetooth audio support where the target operating system supports it."
|
||
},
|
||
{
|
||
"id": "SysRS-047",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall document platform-specific hardware limitations discovered during compatibility testing."
|
||
},
|
||
{
|
||
"id": "SysRS-048",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Windows runtime environment shall support native desktop window integration for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-049",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Windows runtime environment shall provide microphone capture, speaker/headphone playback, audio device selection, and secure credential storage to the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-050",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The macOS runtime environment shall support native desktop window integration for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-051",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The macOS runtime environment shall provide microphone permission prompts, microphone capture, speaker/headphone playback, audio device selection, and Keychain access to the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-052",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Linux runtime environment shall support the desktop environments targeted by the selected release package."
|
||
},
|
||
{
|
||
"id": "SysRS-053",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Linux runtime environment shall provide microphone capture, speaker/headphone playback, audio device selection, and secure storage through Secret Service, libsecret, or equivalent where available."
|
||
},
|
||
{
|
||
"id": "SysRS-054",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The iOS runtime environment shall provide microphone permissions, foreground voice session capability, audio route change handling, audio interruption recovery, Keychain access, and AVAudioSession behavior to the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-055",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Android runtime environment shall provide microphone permissions, foreground voice session capability, foreground service behavior, audio focus, Bluetooth route handling, Android Keystore access, and production audio integration through"
|
||
},
|
||
{
|
||
"id": "SysRS-056",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall define minimum supported operating system versions for each target platform before beta release."
|
||
},
|
||
{
|
||
"id": "SysRS-057",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall document OS-level permissions required by each target platform before public release."
|
||
},
|
||
{
|
||
"id": "SysRS-058",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall fail safely with a user-safe message when a required OS service is unavailable."
|
||
},
|
||
{
|
||
"id": "SysRS-059",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support microphone input for voice transmission."
|
||
},
|
||
{
|
||
"id": "SysRS-060",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support speaker or headphone output for voice playback."
|
||
},
|
||
{
|
||
"id": "SysRS-061",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support audio input and output device selection where the target platform exposes selectable devices."
|
||
},
|
||
{
|
||
"id": "SysRS-062",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall handle audio route changes where the target platform reports them."
|
||
},
|
||
{
|
||
"id": "SysRS-063",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall recover gracefully from audio device changes where possible."
|
||
},
|
||
{
|
||
"id": "SysRS-064",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support Echo Canceller for reducing playback audio leaking into microphone input."
|
||
},
|
||
{
|
||
"id": "SysRS-065",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support Automatic Gain Control for normalizing microphone input level."
|
||
},
|
||
{
|
||
"id": "SysRS-066",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support Noise Suppression for reducing stationary background noise."
|
||
},
|
||
{
|
||
"id": "SysRS-067",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support High-Pass Filter for reducing low-frequency rumble and handling noise."
|
||
},
|
||
{
|
||
"id": "SysRS-068",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support an audio processing backend abstraction so platform-native and Rust-based processing can be selected per platform."
|
||
},
|
||
{
|
||
"id": "SysRS-069",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow Echo Canceller to use playback reference audio when the selected implementation requires it."
|
||
},
|
||
{
|
||
"id": "SysRS-070",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall expose audio processing settings to Rust Core and persist them locally."
|
||
},
|
||
{
|
||
"id": "SysRS-071",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide conservative default settings for Echo Canceller, Automatic Gain Control, Noise Suppression, and High-Pass Filter."
|
||
},
|
||
{
|
||
"id": "SysRS-072",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow platform-specific disabling of audio processing features when a feature is unstable or incompatible with a device configuration."
|
||
},
|
||
{
|
||
"id": "SysRS-073",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall provide an audio loopback test tool for development and compatibility testing."
|
||
},
|
||
{
|
||
"id": "SysRS-074",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall provide an audio processing test tool for development and compatibility testing."
|
||
},
|
||
{
|
||
"id": "SysRS-075",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client network environment shall provide IP network connectivity from the client device to the selected compatible voice server."
|
||
},
|
||
{
|
||
"id": "SysRS-076",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow the user to configure the server host or IP address."
|
||
},
|
||
{
|
||
"id": "SysRS-077",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow the user to configure the server port."
|
||
},
|
||
{
|
||
"id": "SysRS-078",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application should support a default TeamSpeak 3-compatible voice port when the user does not provide an explicit port."
|
||
},
|
||
{
|
||
"id": "SysRS-079",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client network environment shall permit the protocol traffic required by `tsclientlib` and the selected compatible server."
|
||
},
|
||
{
|
||
"id": "SysRS-080",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client network environment shall support latency suitable for real-time voice communication under expected operating conditions."
|
||
},
|
||
{
|
||
"id": "SysRS-081",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The client network environment should minimize packet loss for acceptable voice quality."
|
||
},
|
||
{
|
||
"id": "SysRS-082",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall detect recoverable network failures where possible."
|
||
},
|
||
{
|
||
"id": "SysRS-083",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall enter reconnect behavior after recoverable network failures."
|
||
},
|
||
{
|
||
"id": "SysRS-084",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall rebuild server state from a fresh snapshot after reconnect."
|
||
},
|
||
{
|
||
"id": "SysRS-085",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not require VPN connectivity unless the target server or user environment requires it."
|
||
},
|
||
{
|
||
"id": "SysRS-086",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall present network failures through user-safe error messages."
|
||
},
|
||
{
|
||
"id": "SysRS-087",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application should include network diagnostics in user-initiated diagnostic exports."
|
||
},
|
||
{
|
||
"id": "SysRS-088",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall be TeamSpeak 3-compatible for Chanora MVP operation."
|
||
},
|
||
{
|
||
"id": "SysRS-089",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall be reachable from the client device network."
|
||
},
|
||
{
|
||
"id": "SysRS-090",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall permit client connection using the identity, nickname, password, and permissions supplied by the user."
|
||
},
|
||
{
|
||
"id": "SysRS-091",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall expose server information required for initial synchronization."
|
||
},
|
||
{
|
||
"id": "SysRS-092",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall expose channel listing required for the channel tree."
|
||
},
|
||
{
|
||
"id": "SysRS-093",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall expose client listing required for the online client view."
|
||
},
|
||
{
|
||
"id": "SysRS-094",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall support channel join operations for accessible channels."
|
||
},
|
||
{
|
||
"id": "SysRS-095",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall emit channel movement events required for state synchronization."
|
||
},
|
||
{
|
||
"id": "SysRS-096",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall emit client join and leave events required for state synchronization."
|
||
},
|
||
{
|
||
"id": "SysRS-097",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall emit channel create, update, and delete events required for state synchronization where those events occur."
|
||
},
|
||
{
|
||
"id": "SysRS-098",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall support channel text message send and receive where user permissions allow."
|
||
},
|
||
{
|
||
"id": "SysRS-099",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall support voice packet send and receive where user permissions allow."
|
||
},
|
||
{
|
||
"id": "SysRS-100",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The external voice server shall expose disconnect behavior or connection failure signals that can be mapped by the protocol adapter."
|
||
},
|
||
{
|
||
"id": "SysRS-101",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall document server-side permissions that can affect channel join, voice transmission, and text messaging."
|
||
},
|
||
{
|
||
"id": "SysRS-102",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow the user to manually connect to a compatible server."
|
||
},
|
||
{
|
||
"id": "SysRS-103",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow the user to provide hostname or IP address, port, nickname, and optional server password before connection."
|
||
},
|
||
{
|
||
"id": "SysRS-104",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support persistent local identity for compatible server authentication."
|
||
},
|
||
{
|
||
"id": "SysRS-105",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall display connection status to the user."
|
||
},
|
||
{
|
||
"id": "SysRS-106",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow the user to disconnect from the active server connection."
|
||
},
|
||
{
|
||
"id": "SysRS-107",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall display the server channel tree after synchronization."
|
||
},
|
||
{
|
||
"id": "SysRS-108",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall display online clients after synchronization."
|
||
},
|
||
{
|
||
"id": "SysRS-109",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow the user to join an accessible voice channel."
|
||
},
|
||
{
|
||
"id": "SysRS-110",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow the user to send and receive channel text messages where permitted."
|
||
},
|
||
{
|
||
"id": "SysRS-111",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall capture and transmit voice where permitted."
|
||
},
|
||
{
|
||
"id": "SysRS-112",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall receive and play voice where permitted."
|
||
},
|
||
{
|
||
"id": "SysRS-113",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide microphone mute control."
|
||
},
|
||
{
|
||
"id": "SysRS-114",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide output deaf control."
|
||
},
|
||
{
|
||
"id": "SysRS-115",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide push-to-talk control."
|
||
},
|
||
{
|
||
"id": "SysRS-116",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall display microphone input level where available."
|
||
},
|
||
{
|
||
"id": "SysRS-117",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall display speaking indicators where available."
|
||
},
|
||
{
|
||
"id": "SysRS-118",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow users to save and reuse server bookmarks."
|
||
},
|
||
{
|
||
"id": "SysRS-119",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow users to configure audio processing features."
|
||
},
|
||
{
|
||
"id": "SysRS-120",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall allow users to export redacted diagnostics."
|
||
},
|
||
{
|
||
"id": "SysRS-121",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall use `tsclientlib` inside the protocol subsystem."
|
||
},
|
||
{
|
||
"id": "SysRS-122",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall isolate direct `tsclientlib` calls inside the `chanora_protocol` component."
|
||
},
|
||
{
|
||
"id": "SysRS-123",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall prevent raw `tsclientlib` types from crossing into Flutter UI or Flutter State Layer."
|
||
},
|
||
{
|
||
"id": "SysRS-124",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall convert `tsclientlib` errors into Chanora protocol errors."
|
||
},
|
||
{
|
||
"id": "SysRS-125",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall convert `tsclientlib` events into internal protocol events."
|
||
},
|
||
{
|
||
"id": "SysRS-126",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support future patching, replacement, or forking of protocol implementation without changing Flutter UI contracts."
|
||
},
|
||
{
|
||
"id": "SysRS-127",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall provide protocol compatibility test coverage for MVP features."
|
||
},
|
||
{
|
||
"id": "SysRS-128",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall include a protocol probe tool for validating target server compatibility."
|
||
},
|
||
{
|
||
"id": "SysRS-129",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall maintain one authoritative connection state per active server connection."
|
||
},
|
||
{
|
||
"id": "SysRS-130",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall synchronize state using a snapshot + delta model."
|
||
},
|
||
{
|
||
"id": "SysRS-131",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall emit a full snapshot after initial synchronization."
|
||
},
|
||
{
|
||
"id": "SysRS-132",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall emit delta events after live server-side changes."
|
||
},
|
||
{
|
||
"id": "SysRS-133",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall apply protocol events through deterministic reducers."
|
||
},
|
||
{
|
||
"id": "SysRS-134",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall preserve event ordering per connection."
|
||
},
|
||
{
|
||
"id": "SysRS-135",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall rebuild state from a fresh snapshot after reconnect."
|
||
},
|
||
{
|
||
"id": "SysRS-136",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall prevent Flutter from directly mutating server state."
|
||
},
|
||
{
|
||
"id": "SysRS-137",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall implement the defined connection state machine from Disconnected through Connecting, Synchronizing, Connected, and Reconnecting."
|
||
},
|
||
{
|
||
"id": "SysRS-138",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not automatically reconnect after user-triggered disconnect."
|
||
},
|
||
{
|
||
"id": "SysRS-139",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall include an event replay tool for development and debugging of state synchronization."
|
||
},
|
||
{
|
||
"id": "SysRS-140",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store server bookmarks locally."
|
||
},
|
||
{
|
||
"id": "SysRS-141",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store recent servers locally."
|
||
},
|
||
{
|
||
"id": "SysRS-142",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store audio settings locally."
|
||
},
|
||
{
|
||
"id": "SysRS-143",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store UI settings locally."
|
||
},
|
||
{
|
||
"id": "SysRS-144",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store per-user volume preferences locally where applicable."
|
||
},
|
||
{
|
||
"id": "SysRS-145",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store muted user preferences locally where applicable."
|
||
},
|
||
{
|
||
"id": "SysRS-146",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall use SQLite or an equivalent embedded database for non-secret local data."
|
||
},
|
||
{
|
||
"id": "SysRS-147",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall use platform secure storage for sensitive data."
|
||
},
|
||
{
|
||
"id": "SysRS-148",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store identity private keys using platform secure storage."
|
||
},
|
||
{
|
||
"id": "SysRS-149",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store server passwords using platform secure storage."
|
||
},
|
||
{
|
||
"id": "SysRS-150",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not store private keys in plaintext files."
|
||
},
|
||
{
|
||
"id": "SysRS-151",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not write passwords to logs."
|
||
},
|
||
{
|
||
"id": "SysRS-152",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall redact secrets from diagnostic exports."
|
||
},
|
||
{
|
||
"id": "SysRS-153",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall store sensitive data using platform secure storage."
|
||
},
|
||
{
|
||
"id": "SysRS-154",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall redact secrets from logs."
|
||
},
|
||
{
|
||
"id": "SysRS-155",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall redact secrets from diagnostic bundles."
|
||
},
|
||
{
|
||
"id": "SysRS-156",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall avoid exposing internal stack traces to normal users."
|
||
},
|
||
{
|
||
"id": "SysRS-157",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall validate user input before passing it to protocol operations."
|
||
},
|
||
{
|
||
"id": "SysRS-158",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Windows runtime environment shall support Windows Credential Manager, DPAPI, or equivalent secure credential storage for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-159",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The macOS runtime environment shall support Keychain-based secure credential storage for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-160",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The iOS runtime environment shall support Keychain-based secure credential storage for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-161",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Android runtime environment shall support Android Keystore or equivalent secure credential storage for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-162",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Linux runtime environment shall support Secret Service, libsecret, or equivalent secure storage where available."
|
||
},
|
||
{
|
||
"id": "SysRS-163",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall minimize collection of personal data."
|
||
},
|
||
{
|
||
"id": "SysRS-164",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall require user action before exporting diagnostics."
|
||
},
|
||
{
|
||
"id": "SysRS-165",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall explain microphone permission usage before requesting permission where platform guidelines allow."
|
||
},
|
||
{
|
||
"id": "SysRS-166",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall explain notification permission usage before requesting permission where platform guidelines allow."
|
||
},
|
||
{
|
||
"id": "SysRS-167",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not automatically upload diagnostics in MVP."
|
||
},
|
||
{
|
||
"id": "SysRS-168",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall produce structured diagnostic logs."
|
||
},
|
||
{
|
||
"id": "SysRS-169",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support log redaction."
|
||
},
|
||
{
|
||
"id": "SysRS-170",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support protocol event recording in development or diagnostics mode."
|
||
},
|
||
{
|
||
"id": "SysRS-171",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support event replay for debugging state synchronization."
|
||
},
|
||
{
|
||
"id": "SysRS-172",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support audio diagnostics."
|
||
},
|
||
{
|
||
"id": "SysRS-173",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support network diagnostics."
|
||
},
|
||
{
|
||
"id": "SysRS-174",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall support user-initiated diagnostic export."
|
||
},
|
||
{
|
||
"id": "SysRS-175",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "Diagnostic export shall exclude or redact sensitive data."
|
||
},
|
||
{
|
||
"id": "SysRS-176",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall document the expected support workflow for diagnostic bundle collection."
|
||
},
|
||
{
|
||
"id": "SysRS-177",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall include compatibility test tracking for supported platforms."
|
||
},
|
||
{
|
||
"id": "SysRS-178",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall keep the UI responsive during connection, synchronization, and reconnect."
|
||
},
|
||
{
|
||
"id": "SysRS-179",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall avoid visible UI freezes longer than 100 ms during normal operation."
|
||
},
|
||
{
|
||
"id": "SysRS-180",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall minimize local audio pipeline latency."
|
||
},
|
||
{
|
||
"id": "SysRS-181",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application should target local audio pipeline latency under 100 ms where platform conditions permit."
|
||
},
|
||
{
|
||
"id": "SysRS-182",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall avoid unbounded memory growth in chat history."
|
||
},
|
||
{
|
||
"id": "SysRS-183",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall avoid unbounded memory growth in logs."
|
||
},
|
||
{
|
||
"id": "SysRS-184",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall avoid unbounded memory growth in audio buffers."
|
||
},
|
||
{
|
||
"id": "SysRS-185",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall avoid unbounded memory growth in event queues."
|
||
},
|
||
{
|
||
"id": "SysRS-186",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall perform required audio processing without sustained underruns on supported devices."
|
||
},
|
||
{
|
||
"id": "SysRS-187",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall keep reconnect processing non-blocking for UI interaction."
|
||
},
|
||
{
|
||
"id": "SysRS-188",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall recover from transient network loss where possible."
|
||
},
|
||
{
|
||
"id": "SysRS-189",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall recover gracefully from audio device changes where possible."
|
||
},
|
||
{
|
||
"id": "SysRS-190",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall isolate connection failures to the affected connection."
|
||
},
|
||
{
|
||
"id": "SysRS-191",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall avoid crashing on malformed or unexpected protocol events."
|
||
},
|
||
{
|
||
"id": "SysRS-192",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall support Windows installer packaging for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-193",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall support macOS signed and notarized builds for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-194",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall support Linux packaging through AppImage, Flatpak, deb, rpm, or a selected subset."
|
||
},
|
||
{
|
||
"id": "SysRS-195",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall support Android AAB release builds for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-196",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall support iOS TestFlight and App Store release builds for the Chanora application."
|
||
},
|
||
{
|
||
"id": "SysRS-197",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall document platform signing, packaging, and release requirements before public release."
|
||
},
|
||
{
|
||
"id": "SysRS-198",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall ensure release metadata does not imply official TeamSpeak affiliation."
|
||
},
|
||
{
|
||
"id": "SysRS-199",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall define release channels for internal, beta, and production builds before external testing."
|
||
},
|
||
{
|
||
"id": "SysRS-200",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a user interface for manual server connection."
|
||
},
|
||
{
|
||
"id": "SysRS-201",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a user interface for bookmark management."
|
||
},
|
||
{
|
||
"id": "SysRS-202",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a user interface for channel tree navigation."
|
||
},
|
||
{
|
||
"id": "SysRS-203",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a user interface for chat."
|
||
},
|
||
{
|
||
"id": "SysRS-204",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a user interface for voice controls."
|
||
},
|
||
{
|
||
"id": "SysRS-205",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a user interface for audio processing settings."
|
||
},
|
||
{
|
||
"id": "SysRS-206",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a bridge interface between Flutter and Rust Core."
|
||
},
|
||
{
|
||
"id": "SysRS-207",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a protocol interface between Rust Core and `tsclientlib`."
|
||
},
|
||
{
|
||
"id": "SysRS-208",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide an audio hardware interface through platform capture and playback adapters."
|
||
},
|
||
{
|
||
"id": "SysRS-209",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide secure storage interfaces through platform-specific secure storage mechanisms."
|
||
},
|
||
{
|
||
"id": "SysRS-210",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall provide a network interface to external TeamSpeak 3-compatible servers through `tsclientlib`."
|
||
},
|
||
{
|
||
"id": "SysRS-211",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not directly expose raw `tsclientlib` types to Flutter."
|
||
},
|
||
{
|
||
"id": "SysRS-212",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not store private keys in plaintext files."
|
||
},
|
||
{
|
||
"id": "SysRS-213",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not write passwords to logs."
|
||
},
|
||
{
|
||
"id": "SysRS-214",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not imply official TeamSpeak affiliation in UI, documentation, or release metadata."
|
||
},
|
||
{
|
||
"id": "SysRS-215",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall not automatically upload diagnostic information in MVP."
|
||
},
|
||
{
|
||
"id": "SysRS-216",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall comply with iOS background execution policies."
|
||
},
|
||
{
|
||
"id": "SysRS-217",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application shall comply with Android foreground service requirements for active voice sessions."
|
||
},
|
||
{
|
||
"id": "SysRS-218",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not require Chanora-operated backend infrastructure for voice, channels, or text."
|
||
},
|
||
{
|
||
"id": "SysRS-219",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The selected `tsclientlib` version can support or be extended to support required MVP protocol features."
|
||
},
|
||
{
|
||
"id": "SysRS-220",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "Required audio processing features can be implemented through a combination of platform-native APIs, Rust DSP, and external audio processing libraries."
|
||
},
|
||
{
|
||
"id": "SysRS-221",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "Mobile foreground voice behavior is sufficient for MVP."
|
||
},
|
||
{
|
||
"id": "SysRS-222",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "Background voice behavior will remain constrained by iOS and Android platform policies."
|
||
},
|
||
{
|
||
"id": "SysRS-223",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "External compatible server administrators are responsible for server availability, permissions, and configuration."
|
||
},
|
||
{
|
||
"id": "SysRS-224",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "End users are responsible for providing valid server connection details and network access."
|
||
},
|
||
{
|
||
"id": "SysRS-225",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not include TeamSpeak-compatible server hosting functionality."
|
||
},
|
||
{
|
||
"id": "SysRS-226",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not include full server administration functionality."
|
||
},
|
||
{
|
||
"id": "SysRS-227",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not include a complete permission editor."
|
||
},
|
||
{
|
||
"id": "SysRS-228",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not include a plugin system."
|
||
},
|
||
{
|
||
"id": "SysRS-229",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not include 3D positional audio unless explicitly reprioritized."
|
||
},
|
||
{
|
||
"id": "SysRS-230",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not include advanced whisper list management unless explicitly reprioritized."
|
||
},
|
||
{
|
||
"id": "SysRS-231",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not include Server Query administration tools."
|
||
},
|
||
{
|
||
"id": "SysRS-232",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall not include automatic cloud sync of bookmarks, identities, settings, or diagnostics."
|
||
},
|
||
{
|
||
"id": "SysRS-233",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall maintain a requirements traceability matrix from SysRS requirements through SysDes, SRS, SAD, SDD, and Verification evidence."
|
||
},
|
||
{
|
||
"id": "SysRS-234",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall verify protocol compatibility through a protocol probe tool."
|
||
},
|
||
{
|
||
"id": "SysRS-235",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall verify state synchronization through reducer tests and event replay tests."
|
||
},
|
||
{
|
||
"id": "SysRS-236",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall verify audio capture, processing, encode/decode, and playback through audio loopback and processing tests."
|
||
},
|
||
{
|
||
"id": "SysRS-237",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall verify secure storage behavior on every target platform before public release."
|
||
},
|
||
{
|
||
"id": "SysRS-238",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall verify diagnostic redaction before enabling diagnostic export for external testers."
|
||
},
|
||
{
|
||
"id": "SysRS-239",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall verify release packaging on every target platform before production release."
|
||
},
|
||
{
|
||
"id": "SysRS-240",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The project shall verify that public wording does not imply official TeamSpeak affiliation."
|
||
},
|
||
{
|
||
"id": "SysRS-241",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall connect to a TeamSpeak 3-compatible server using `tsclientlib`."
|
||
},
|
||
{
|
||
"id": "SysRS-242",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall display the server channel tree."
|
||
},
|
||
{
|
||
"id": "SysRS-243",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall display online clients."
|
||
},
|
||
{
|
||
"id": "SysRS-244",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall allow the user to join a voice channel."
|
||
},
|
||
{
|
||
"id": "SysRS-245",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall send voice."
|
||
},
|
||
{
|
||
"id": "SysRS-246",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall receive voice."
|
||
},
|
||
{
|
||
"id": "SysRS-247",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall support microphone mute."
|
||
},
|
||
{
|
||
"id": "SysRS-248",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall support output deaf."
|
||
},
|
||
{
|
||
"id": "SysRS-249",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall support push-to-talk."
|
||
},
|
||
{
|
||
"id": "SysRS-250",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall support Echo Canceller."
|
||
},
|
||
{
|
||
"id": "SysRS-251",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall support Automatic Gain Control."
|
||
},
|
||
{
|
||
"id": "SysRS-252",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall support Noise Suppression."
|
||
},
|
||
{
|
||
"id": "SysRS-253",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall support High-Pass Filter."
|
||
},
|
||
{
|
||
"id": "SysRS-254",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall send and receive channel text messages."
|
||
},
|
||
{
|
||
"id": "SysRS-255",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall save and reuse server bookmarks."
|
||
},
|
||
{
|
||
"id": "SysRS-256",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall use secure storage for sensitive data."
|
||
},
|
||
{
|
||
"id": "SysRS-257",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The MVP shall export redacted diagnostic logs."
|
||
},
|
||
{
|
||
"id": "SysRS-258",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall use Material 3 as the baseline design system for the Flutter client user interface."
|
||
},
|
||
{
|
||
"id": "SysRS-259",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall define a Chanora-specific design system above Material 3 for voice, connection, channel, latency, diagnostics, accessibility, and platform-adaptive states."
|
||
},
|
||
{
|
||
"id": "SysRS-260",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support compact, medium, and expanded window classes for responsive client layout."
|
||
},
|
||
{
|
||
"id": "SysRS-261",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall preserve visibility of connection status and primary voice controls across compact, medium, and expanded layouts."
|
||
},
|
||
{
|
||
"id": "SysRS-262",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall provide screen-reader semantics for critical interactive controls and critical status indicators."
|
||
},
|
||
{
|
||
"id": "SysRS-263",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall not communicate critical connection, voice, latency, permission, or error states by color alone."
|
||
},
|
||
{
|
||
"id": "SysRS-264",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support keyboard focus traversal and visible focus indication on desktop-class and tablet keyboard environments."
|
||
},
|
||
{
|
||
"id": "SysRS-265",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall keep critical controls reachable when the user increases text size using platform accessibility settings."
|
||
},
|
||
{
|
||
"id": "SysRS-266",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall respect platform safe areas, display cutouts, system bars, virtual keyboards, and desktop window insets."
|
||
},
|
||
{
|
||
"id": "SysRS-267",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall provide platform-appropriate handling for Android system back navigation, including predictive-back-compatible behavior where supported by the platform."
|
||
},
|
||
{
|
||
"id": "SysRS-268",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall provide platform-appropriate handling for iOS navigation gestures, safe areas, keyboard avoidance, haptics, and system permission presentation."
|
||
},
|
||
{
|
||
"id": "SysRS-269",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support localization of user-visible client application strings."
|
||
},
|
||
{
|
||
"id": "SysRS-270",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall externalize user-visible strings from source code into localization resources or an equivalent localization mechanism."
|
||
},
|
||
{
|
||
"id": "SysRS-271",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support English as the baseline product language."
|
||
},
|
||
{
|
||
"id": "SysRS-272",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support adding additional product languages without changing protocol, audio, state synchronization, or storage architecture."
|
||
},
|
||
{
|
||
"id": "SysRS-273",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall preserve and display Unicode server names, channel names, client nicknames, and text messages received from compatible servers."
|
||
},
|
||
{
|
||
"id": "SysRS-274",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall use UTF-8 internally for text exchanged between Flutter, Rust Core, local storage, diagnostics, and protocol-facing adapters unless a platform API requires conversion at the boundary."
|
||
},
|
||
{
|
||
"id": "SysRS-275",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall perform encoding conversion at explicit boundary adapters when external server, operating system, or platform APIs use a different text representation."
|
||
},
|
||
{
|
||
"id": "SysRS-276",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall not corrupt or drop multilingual Unicode content in logs or diagnostic exports, except where redaction intentionally removes sensitive content."
|
||
},
|
||
{
|
||
"id": "SysRS-277",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support bidirectional text display for user-visible localized strings and server-provided text where the platform text engine supports it."
|
||
},
|
||
{
|
||
"id": "SysRS-278",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support locale-aware formatting for dates, times, numbers, and diagnostic timestamps where those values are user-visible."
|
||
},
|
||
{
|
||
"id": "SysRS-279",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support fallback behavior when a translation key is missing."
|
||
},
|
||
{
|
||
"id": "SysRS-280",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall keep machine-readable diagnostic fields stable and language-neutral while allowing user-facing diagnostic descriptions to be localized."
|
||
},
|
||
{
|
||
"id": "SysRS-281",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall separate product localization from server-provided content; server-provided names and messages shall be displayed as content, not translated by the client."
|
||
},
|
||
{
|
||
"id": "SysRS-282",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support accessibility labels and localization for icon-only controls."
|
||
},
|
||
{
|
||
"id": "SysRS-283",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall define a UI/UX guideline document as a downstream non-normative design baseline derived from this SysRS and SysDes."
|
||
},
|
||
{
|
||
"id": "SysRS-284",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall define design tokens for color, typography, spacing, shape, elevation, motion, density, connection state, voice state, latency state, and diagnostics state."
|
||
},
|
||
{
|
||
"id": "SysRS-285",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall maintain traceability across the hierarchy `SysRS -> SysDes -> SRS -> SAD -> SDD` without allowing SRS, SAD, or SDD to bypass the immediately preceding lifecycle layer."
|
||
},
|
||
{
|
||
"id": "SysRS-286",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support iOS runtime deployment on iOS 13 or later unless Flutter, plugin, audio, or platform constraints require raising the minimum version."
|
||
},
|
||
{
|
||
"id": "SysRS-287",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "For Apple App Store Connect upload on or after 2026-04-28, the Chanora iOS/iPadOS build shall be produced with Xcode 26 or later using the iOS 26 / iPadOS 26 SDK or later, unless Apple publishes a newer applicable upload requirement before "
|
||
},
|
||
{
|
||
"id": "SysRS-288",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora Android application shall support Android API 28 (Android 9.0) or later as the minimum runtime baseline, per DEC-004 (Accepted 2026-05-14, which raised the original API 24 recommendation to API 28). The minimum may be raised fur"
|
||
},
|
||
{
|
||
"id": "SysRS-289",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "For Google Play submission, the Chanora Android build shall target the Android API level required by Google Play on the upload date."
|
||
},
|
||
{
|
||
"id": "SysRS-290",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora MVP shall support one active server connection per client instance; multiple simultaneous active server connections shall be deferred outside MVP scope."
|
||
},
|
||
{
|
||
"id": "SysRS-291",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora MVP shall enable Echo Canceller, Automatic Gain Control, Noise Suppression, and High-Pass Filter by default where supported and stable, while allowing user or platform policy to disable supported processing where applicable."
|
||
},
|
||
{
|
||
"id": "SysRS-292",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall prefer platform-native audio processing for MVP where available and stable, with Rust/WebRTC-style audio processing retained as a controlled fallback or later architecture option."
|
||
},
|
||
{
|
||
"id": "SysRS-293",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall use SQLite or an equivalent embedded local database for non-secret local state, while storing secrets only through platform secure storage."
|
||
},
|
||
{
|
||
"id": "SysRS-294",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall use a stable typed Flutter/Rust bridge with generated or schema-controlled DTOs; `flutter_rust_bridge` is the default candidate unless prototype evidence selects a better option."
|
||
},
|
||
{
|
||
"id": "SysRS-295",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora MVP shall not perform automatic diagnostic upload, automatic telemetry upload, or automatic crash reporting unless a later approved decision updates privacy, security, legal, release, and verification documents."
|
||
},
|
||
{
|
||
"id": "SysRS-296",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora desktop application shall support **Focused Push-to-Talk** on Windows, macOS, and Linux. Focused PTT is the minimum required behaviour: the user shall be able to hold a bound input (keyboard key, mouse button) inside the focused"
|
||
},
|
||
{
|
||
"id": "SysRS-297",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora desktop application shall additionally support **Global Push-to-Talk** where the operating system, the user-granted permission set, the display server, and the available input backend together permit it. Where global PTT is not "
|
||
},
|
||
{
|
||
"id": "SysRS-298",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The detected desktop PTT capability level shall be exposed to the user interface and to the release verification record. The exposed value shall match the actual runtime capability — the application shall not advertise a Global PTT level wh"
|
||
},
|
||
{
|
||
"id": "SysRS-299",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora Windows desktop application shall prefer the Raw Input backend for Global PTT, with a low-level keyboard hook used only as a fallback when Raw Input is unavailable, and Focused PTT used as the final fallback when no Global PTT b"
|
||
},
|
||
{
|
||
"id": "SysRS-300",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora macOS desktop application shall request the operating-system permission required for Global PTT (Input Monitoring / Accessibility), use the permission-aware Global PTT backend when the permission is granted, and fall back to Foc"
|
||
},
|
||
{
|
||
"id": "SysRS-301",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora Linux desktop application shall use a capability-dependent Global PTT backend selected from the available display server (X11 or Wayland) and compositor support (GNOME on Wayland is the officially-tested target for the first pub"
|
||
},
|
||
{
|
||
"id": "SysRS-302",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall not log, store, persist, or include in the user-initiated diagnostic export any raw desktop key-event history, key code stream, or key-press timing sequence. Diagnostic export may include the detected PT"
|
||
},
|
||
{
|
||
"id": "SysRS-303",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall define the v1 voice transmit mode set as `Ptt` and `Continuous`, with `VoiceActivity` reserved on the enum surface but unimplemented in this baseline (deferred per DEC-030). The default mode on a fresh i"
|
||
},
|
||
{
|
||
"id": "SysRS-304",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall apply a configurable PTT release-tail interval between the moment the bound PTT input reports key-up and the moment the transmit gate closes, so that the trailing syllable of a spoken word is not clipped"
|
||
},
|
||
{
|
||
"id": "SysRS-305",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "When the Chanora Android application has an active voice session connected, the system shall engage the Android in-call audio mode (for example via `AudioManager.setMode(MODE_IN_COMMUNICATION)` or an equivalent platform routing-assist mecha"
|
||
},
|
||
{
|
||
"id": "SysRS-306",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora Android application shall acquire the Android runtime microphone permission (`RECORD_AUDIO`) at or before the point of voice session activation, and shall not begin microphone capture without that permission having been granted "
|
||
},
|
||
{
|
||
"id": "SysRS-307",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora project shall maintain measured numeric performance baselines for the realtime audio capture and playback paths. The baseline set shall include, at minimum: (i) heap allocation count per realtime audio callback measured after wa"
|
||
},
|
||
{
|
||
"id": "SysRS-308",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora project's continuous-integration workflow shall execute the realtime-audio benchmark suite on every pull request against the default branch and on every merge to the default branch, on at least one host architecture (Linux x86_6"
|
||
},
|
||
{
|
||
"id": "SysRS-309",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The advisory CI regression comparison authorized by SysRS-308 shall use an explicitly declared tolerance window — a numeric percentage (or a numeric per-metric percentage set) above the maintained baseline (SysRS-307) — beyond which the adv"
|
||
},
|
||
{
|
||
"id": "SysRS-310",
|
||
"source": "requirements/sysrs.md",
|
||
"stage": "",
|
||
"allocation": "",
|
||
"verification": "",
|
||
"statement": "The Chanora application system shall support macOS runtime deployment on macOS 10.15 (Catalina) or later as the minimum supported runtime, unless Flutter, plugin, audio, or platform constraints require raising the minimum version. This clau"
|
||
}
|
||
]
|
||
}
|
||
}
|