docs: add offline knowledge library with project analysis and external references

- function-inventory: complete public API for 10 Rust crates + 56 Dart files
- coverage-analysis: 312 Rust tests, 221 Dart tests, doc coverage gaps
- doc-quality-analysis: duplications, broken refs, useless content audit
- link-coverage-report: all internal/external links validated
- external/teaspeak: TeaSpeak voice server architecture & protocol
- external/respeak: ReSpeak org, tsclientlib, tsproto, crypto docs
- external/yatqa-en/de: yat.qa admin tool (English + German)
- reviews/: cross-validation reports for all analyses

All documentation only, no code changes.
This commit is contained in:
Edison Jwa
2026-06-13 02:00:26 +09:00
parent 89bbfa1e18
commit dd6e80f72a
13 changed files with 3358 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
# Chanora Offline Knowledge Library
**Generated:** 2026-06-13
**Branch:** `docs/offline-knowledge-library-2026-06-13`
**Purpose:** Comprehensive offline reference for the Chanora project, its dependencies, and related ecosystem.
---
## Contents
### Project Analysis
| Document | Description | Status |
|----------|-------------|--------|
| [function-inventory.md](function-inventory.md) | Complete public API inventory for all 10 Rust crates + 56 Dart files. Includes dead code analysis. | Reviewed |
| [coverage-analysis.md](coverage-analysis.md) | Test coverage (312 Rust tests, 221 Dart tests) and documentation coverage gaps. | Reviewed, corrected |
| [doc-quality-analysis.md](doc-quality-analysis.md) | Duplicated content, useless content, and broken references in docs/. | Reviewed, corrected |
| [link-coverage-report.md](link-coverage-report.md) | All internal/external links validated. 2 broken LICENSE links, 5 broken doc-path refs. | Reviewed, corrected |
### External Projects
| Document | Description | Status |
|----------|-------------|--------|
| [external/teaspeak-overview.md](external/teaspeak-overview.md) | TeaSpeak voice server - architecture, protocol, build system. | Reviewed |
| [external/respeak-overview.md](external/respeak-overview.md) | ReSpeak org - tsclientlib, tsproto, crypto, Chanora integration. | Reviewed |
| [external/yatqa-en.md](external/yatqa-en.md) | yat.qa TeamSpeak admin tool (English). | Reviewed |
| [external/yatqa-de.md](external/yatqa-de.md) | yat.qa TeamSpeak admin tool (German/Deutsch). | Reviewed |
### Review Reports
| Document | Description |
|----------|-------------|
| [reviews/coverage-analysis-review.md](reviews/coverage-analysis-review.md) | Cross-validation of coverage analysis |
| [reviews/doc-quality-review.md](reviews/doc-quality-review.md) | Cross-validation of doc quality analysis |
| [reviews/link-coverage-review.md](reviews/link-coverage-review.md) | Cross-validation of link coverage |
| [reviews/external-docs-review.md](reviews/external-docs-review.md) | Cross-validation of external project docs |
---
## Key Findings Summary
### Test Coverage
- **Rust**: 312 inline tests + 2 integration tests across 7/9 crates
- **Dart**: 221 tests (widgets: 58%, services: 90%)
- **Untested crates**: chanora_bridge, chanora_cache, chanora_prefetch
### Documentation Gaps
- No architecture docs for: audio engine, FFI bridge, protocol layer, state machine, cache, prefetch, diagnostics
- 15 TODO/FIXME items catalogued across codebase
### Dead/Useless Code
- No true dead code found (platform-gated items are intentional)
- 1 malformed markdown in docs/sysdes.md
- 2 missing LICENSE files (LICENSE-APACHE, LICENSE-MIT)
### Duplicated Content
- Lifecycle chain repeated in 6+ files
- Git commit examples in 3 files
- Security doc list in 2 files
### External Dependencies
- **ReSpeak/tsclientlib**: Chanora patches tsproto-types for P-256 coordinate padding
- **TeaSpeak**: Compatible voice server, C++20 + Electron architecture
- **yat.qa**: TeamSpeak admin tool, v3.9.9b, English + German docs
+375
View File
@@ -0,0 +1,375 @@
# Test & Document Coverage Analysis
**Generated:** 2026-06-13
**Scope:** All crates, Flutter app, and docs/ directory
---
## Test Coverage Summary
| Metric | Count |
|--------|-------|
| Total Rust tests (inline `#[test]`) | 312 |
| Total Rust integration tests | 2 |
| Total Dart tests (`test()` + `testWidgets()`) | 221 |
| Crates with tests | 7/9 |
| Dart services with tests | 19/21 (90%) |
| Dart widgets with tests | 13/24 (58%) |
| Overall estimated coverage | ~65% |
---
## Per-Crate Test Coverage (Rust)
### chanora_audio — 221 tests, ~48% function coverage
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| engine.rs | ~45 | 7 | ~16% |
| ptt_backends/windows.rs | ~80 | 44 | ~55% |
| ptt_backends/windows_keymap.rs | ~30 | 12 | ~40% |
| ptt_backends/macos.rs | ~35 | 12 | ~34% |
| ptt_backends/linux.rs | ~25 | 10 | ~40% |
| ptt_backends/mod.rs | ~15 | 1 | ~7% |
| transmit_selector.rs | ~20 | 10 | ~50% |
| voice_activity.rs | ~15 | 9 | ~60% |
| voice_render.rs | ~15 | 9 | ~60% |
| mobile_voice_backend.rs | ~20 | 9 | ~45% |
| processor/sonora.rs | ~15 | 8 | ~53% |
| processor/dsp/agc2.rs | ~10 | 6 | ~60% |
| mode_stack.rs | ~10 | 6 | ~60% |
| opus_voice.rs | ~10 | 5 | ~50% |
| capture_accumulator.rs | ~8 | 5 | ~63% |
| processor/dsp/ns.rs | ~8 | 4 | ~50% |
| ptt.rs | ~8 | 4 | ~50% |
| vad/mod.rs | ~6 | 4 | ~67% |
| audio_processing.rs | ~8 | 3 | ~38% |
| debug_wav.rs | ~6 | 3 | ~50% |
| processor/dsp/hpf.rs | ~5 | 3 | ~60% |
| processor/dsp/aec3.rs | ~5 | 3 | ~60% |
| transmit_mode.rs | ~4 | 3 | ~75% |
| android_render_ring.rs | ~5 | 3 | ~60% |
| vad/resampler.rs | ~4 | 3 | ~75% |
| vad/apple_coreml.rs | ~5 | 3 | ~60% |
| vad/silero_onnx.rs | ~10 | 6 | ~60% |
| render_reference.rs | ~8 | 7 | ~88% |
| capture_resampler.rs | ~3 | 2 | ~67% |
| audio_event_queue.rs | ~4 | 2 | ~50% |
| processor/webrtc_apm.rs | ~5 | 2 | ~40% |
| frame.rs | ~3 | 1 | ~33% |
| lib.rs (defaults) | ~5 | 1 | ~20% |
| release_tail.rs | ~4 | 1 | ~25% |
| route_policy.rs | ~8 | 8 | ~100% |
| **Integration: tests/ptt_privacy.rs** | — | 1 | — |
| **Integration: tests/linux_portal_smoke.rs** | — | 1 | — |
### chanora_protocol — 17 tests, ~18% function coverage
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| adapter.rs | ~80 | 13 | ~16% |
| poke_limiter.rs | ~17 | 4 | ~24% |
| dto.rs | ~0 | 0 | — |
| lib.rs | ~0 | 0 | — |
**Untested areas:** Message parsing, serialization, most adapter methods
### chanora_state — 27 tests, ~46% function coverage
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| lib.rs | ~35 | 18 | ~51% |
| channel_join.rs | ~24 | 9 | ~38% |
### chanora_storage — 15 tests, ~24% function coverage
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| lib.rs | ~62 | 15 | ~24% |
**Untested areas:** Migration logic, concurrent access patterns, error recovery
### chanora_resolver — 12 tests, ~17% function coverage
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| lib.rs | ~70 | 12 | ~17% |
| examples/cli.rs | — | 1 | — |
**Untested areas:** DNS failure modes, timeout handling, cache behavior
### chanora_diagnostics — 19 tests, ~26% function coverage
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| lib.rs | ~74 | 19 | ~26% |
### chanora_core — 11 tests, ~7% function coverage
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| lib.rs | ~140 | 10 | ~7% |
| network_diagnostics.rs | ~7 | 1 | ~14% |
**Untested areas:** Connection lifecycle, server event handling, most state transitions
### chanora_bridge — 0 tests, 0% function coverage
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| api.rs | ~200+ | 0 | 0% |
| frb_generated.rs | ~100+ | 0 | 0% |
| permission_jni.rs | ~10 | 0 | 0% |
| android_init.rs | ~5 | 0 | 0% |
| lib.rs | ~4 | 0 | 0% |
**Note:** chanora_bridge is an FFI/bridge layer; testing requires integration with Flutter.
### chanora_cache — 0 tests
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| lib.rs | ~16 | 0 | 0% |
### chanora_prefetch — 0 tests
| Source File | Functions | Tests | Coverage |
|-------------|-----------|-------|----------|
| lib.rs | ~18 | 0 | 0% |
---
## Per-Module Test Coverage (Dart/Flutter)
### Services — 155 tests across 19 test files
| Source File | Test File | Tests | Coverage |
|-------------|-----------|-------|----------|
| android_audio_output_devices.dart | ✅ android_audio_output_devices_test.dart | 2 | Tested |
| android_permissions_service.dart | ✅ android_permissions_service_test.dart | 14 | Tested |
| app_bootstrap.dart | ✅ app_bootstrap_test.dart | 4 | Tested |
| audio_lifecycle_service.dart | ✅ audio_lifecycle_service_test.dart | 4 | Tested |
| back_intent_policy.dart | ✅ back_intent_policy_test.dart | 9 | Tested |
| back_intent_service.dart | ✅ back_intent_service_test.dart | 5 | Tested |
| channel_join_error_mapper.dart | ✅ channel_join_error_mapper_test.dart | Tested |
| channel_spacer.dart | ✅ channel_spacer_test.dart | 9 | Tested |
| connection_phase_state.dart | ✅ connection_phase_state_test.dart | 8 | Tested |
| hard_mute_owners.dart | ✅ hard_mute_owners_test.dart | 3 | Tested |
| ios_audio_session_controller.dart | ✅ ios_audio_session_controller_test.dart | 6 | Tested |
| macos_permissions_service.dart | ✅ macos_permissions_service_test.dart | 20 | Tested |
| poke_active_chat.dart | ✅ poke_active_chat_test.dart | 2 | Tested |
| poke_notification_service.dart | ✅ poke_notification_service_test.dart | 2 | Tested |
| poke_preferences_service.dart | ✅ poke_preferences_service_test.dart | 4 | Tested |
| prefetch_debouncer.dart | ✅ prefetch_debouncer_test.dart | 3 | Tested |
| snapshot_state_mapper.dart | ✅ snapshot_state_mapper_test.dart | 7 | Tested |
| ts3_server_link.dart | ✅ ts3_server_link_test.dart | 3 | Tested |
| ui_preferences_service.dart | ✅ ui_preferences_service_test.dart | 5 | Tested |
| voice_join_ordering.dart | ✅ voice_join_ordering_test.dart | 4 | Tested |
| **ios_permissions_service.dart** | ❌ No test file | 0 | **UNTESTED** |
| **link_trust_service.dart** | ❌ No test file | 0 | **UNTESTED** |
### Widgets — 66 tests across 13 test files
| Source File | Test File | Tests | Coverage |
|-------------|-----------|-------|----------|
| app_snack_bar.dart | ✅ app_snack_bar_test.dart | 1 | Tested |
| audio_processing_config_state.dart | ✅ audio_processing_config_state_test.dart | 8 | Tested |
| bbcode_text.dart | ✅ bbcode_text_test.dart | Tested |
| chat_panel.dart | ✅ chat_panel_test.dart | Tested |
| chat_views.dart | ✅ chat_views_test.dart | 18 | Tested |
| client_info_sheet.dart | ✅ client_info_sheet_test.dart | Tested |
| poke_notification_settings.dart | ✅ poke_notification_settings_test.dart | Tested |
| snapshot_view.dart | ✅ snapshot_view_test.dart | Tested |
| talk_power_warning.dart | ✅ talk_power_warning_test.dart | 1 | Tested |
| voice_compact.dart | ✅ voice_compact_test.dart | Tested |
| voice_settings_controls.dart | ✅ voice_settings_controls_test.dart | 6 | Tested |
| voice_status_summary.dart | ✅ voice_status_summary_test.dart | 5 | Tested |
| mobile_ui_resilience.dart | ✅ mobile_ui_resilience_test.dart | Tested |
| **audio_debug_stats_panel.dart** | ❌ No test file | 0 | **UNTESTED** |
| **audio_device_list_tile.dart** | ❌ No test file | 0 | **UNTESTED** |
| **audio_output_tile.dart** | ❌ No test file | 0 | **UNTESTED** |
| **connect_widgets.dart** | ❌ No test file | 0 | **UNTESTED** |
| **input_dialogs.dart** | ❌ No test file | 0 | **UNTESTED** |
| **permission_state_banner.dart** | ❌ No test file | 0 | **UNTESTED** |
| **ptt_capability_badge.dart** | ❌ No test file | 0 | **UNTESTED** |
| **voice_bar.dart** | ❌ No test file | 0 | **UNTESTED** |
| **voice_haptics.dart** | ❌ No test file | 0 | **UNTESTED** |
| **voice_level_meter.dart** | ❌ No test file | 0 | **UNTESTED** |
| **voice_platform.dart** | ❌ No test file | 0 | **UNTESTED** |
| **voice_settings.dart** | ❌ No test file | 0 | **UNTESTED** |
### E2E Tests
| File | Tests | Notes |
|------|-------|-------|
| alpha_e2e_test.dart | 1 | End-to-end integration |
| beta_e2e_test.dart | 1 | End-to-end integration |
| widget_test.dart | — | Default Flutter template |
---
## Document Coverage Summary
| Metric | Count |
|--------|-------|
| Total doc files (under docs/) | 55 |
| Modules documented | ~15 areas |
| Estimated outdated docs | 3-5 |
## Document Inventory
### Architecture (4 files)
| File | Topic | Status | Notes |
|------|-------|--------|-------|
| architecture/sad.md | Software Architecture Document | Current | 190 lines, references SDD |
| architecture/sdd.md | Software Design Document | Current | 161 lines |
| architecture/sysdes.md | System Design overview | Current | 21 lines, brief |
| architecture/desktop-ptt-architecture.md | Desktop PTT subsystem design | Current | 43 lines |
| architecture/file-transfer-design.md | File transfer feature design | Current | 737 lines |
| architecture/file-transfer-research.md | File transfer research | Current | 770 lines |
| architecture/file-transfer-implementation-plan.md | File transfer implementation plan | Current | 1315 lines |
### Requirements (2 files + 2 symlinks)
| File | Topic | Status | Notes |
|------|-------|--------|-------|
| requirements/srs.md | Software Requirements Spec | Current | 22 lines (pointer) |
| requirements/sysrs.md | System Requirements Spec | Current | 22 lines (pointer) |
| srs.md | SRS (full) | Current | 2850 lines |
| sysrs.md | SysRS (full) | Current | 2014 lines |
### Verification (5 files)
| File | Topic | Status | Notes |
|------|-------|--------|-------|
| verification/verification-master-plan.md | Overall V&V plan | Current | 91 lines |
| verification/swe4-unit-verification-plan.md | Unit test plan | Current | 60 lines |
| verification/swe5-software-integration-verification-plan.md | Integration test plan | Current | 71 lines |
| verification/swe6-software-verification-plan.md | System verification plan | Current | 62 lines |
| verification/sys4-system-integration-verification-plan.md | System integration plan | Current | 58 lines |
### Security (7 files)
| File | Topic | Status | Notes |
|------|-------|--------|-------|
| security/threat-model.md | Threat model | Current | 33 lines |
| security/license-inventory.md | Rust license inventory | Current | 10970 lines |
| security/flutter-license-inventory.md | Flutter license inventory | Current | 5477 lines |
| security/diagnostic-redaction-audit-report.md | Diagnostic redaction audit | Current | 31 lines |
| security/secure-storage-audit-report.md | Secure storage audit | Current | 31 lines |
| security/dependency-and-supply-chain-report.md | Dependency audit | Current | 43 lines |
| security/security-privacy-legal-guideline.md | Security/privacy guidelines | Current | 63 lines |
### Governance (11 files)
| File | Topic | Status | Notes |
|------|-------|--------|-------|
| governance/document-index.md | Document catalog | Current | 36 lines |
| governance/document-naming-convention.md | Naming conventions | Current | 33 lines |
| governance/document-review-report.md | Review report | Current | 37 lines |
| governance/traceability-matrix.md | Requirements traceability | Current | 73 lines |
| governance/product-decision-register.md | Decision log | Current | 25 lines |
| governance/decision-impact-assessment.md | Impact assessment | Current | 18 lines |
| governance/git-commit-message-convention.md | Commit conventions | Current | 21 lines |
| governance/path-migration-map.md | Path migration plan | Current | 18 lines |
| governance/repo-format-validation-report.md | Format validation | Current | 22 lines |
| governance/baseline-candidate-validation-report.md | Baseline validation | Current | 38 lines |
| governance/baseline-approval-record.md | Baseline approval | Current | 32 lines |
| governance/maintainability-review-2026-06-08.md | Maintainability review | Current | 99 lines |
### Release (4 files)
| File | Topic | Status | Notes |
|------|-------|--------|-------|
| release/ios-build.md | iOS build instructions | Current | 47 lines |
| release/platform-release-policy.md | Release policy | Current | 26 lines |
| release/release-readiness-go-nogo-record.md | Go/no-go record | Current | 105 lines |
| release/dv-waiver-register.md | DV waiver register | Current | 36 lines |
### UI/UX (4 files)
| File | Topic | Status | Notes |
|------|-------|--------|-------|
| ui-ux/material3-guideline.md | Material 3 guidelines | Current | 8 lines (brief) |
| ui-ux/material3-design-tokens.md | Design tokens | Current | 21 lines |
| ui-ux/material3-component-catalog.md | Component catalog | Current | 38 lines |
| ui-ux/adaptive-layout-platform-guide.md | Adaptive layout guide | Current | 27 lines |
### Other
| File | Topic | Status | Notes |
|------|-------|--------|-------|
| privacy/privacy-policy.md | Privacy policy | Current | 51 lines |
| references/external-references.md | External references | Current | 21 lines |
| references/aspice-swe2-swe3-integration-note.md | ASPICE integration note | Current | 28 lines |
| legal/trademark-and-attribution-review.md | Trademark review | Current | 47 lines |
| i18n/localization-architecture.md | Localization architecture | Current | 44 lines |
| implementation-status-2026-05-28.md | Implementation status | **Possibly outdated** | Date is 2026-05-28 |
| material3-guideline.md | Material 3 guideline (duplicate) | Current | 93 lines |
### Superpowers Plans & Specs (13 files)
| File | Topic | Status |
|------|-------|--------|
| superpowers/plans/2026-05-28-server-resolution-prefetch.md | Server resolution prefetch plan | Current |
| superpowers/plans/2026-05-28-chanora-server-prefetch-crate.md | Prefetch crate plan | Current |
| superpowers/plans/2026-05-29-dv-evidence-pack.md | DV evidence pack plan | Current |
| superpowers/plans/2026-05-29-state-sync-ui-settings-validation.md | State sync validation plan | Current |
| superpowers/plans/2026-05-29-swe2-swe3-baselines.md | SWE2/SWE3 baselines plan | Current |
| superpowers/plans/2026-05-29-finish-dv-document-tree.md | DV document tree plan | Current |
| superpowers/plans/2026-06-06-chat-panel-switching.md | Chat panel switching plan | Current |
| superpowers/plans/2026-06-08-maintainability-continuation.md | Maintainability continuation | Current |
| superpowers/plans/2026-06-08-core-internal-split.md | Core internal split plan | Current |
| superpowers/specs/2026-05-28-server-resolution-prefetch-design.md | Prefetch design spec | Current |
| superpowers/specs/2026-05-28-chanora-server-prefetch-crate-design.md | Prefetch crate design | Current |
| superpowers/specs/2026-05-29-state-sync-ui-settings-validation-design.md | State sync design | Current |
| superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | Adaptive layout design | Current |
| superpowers/specs/2026-06-08-maintainability-continuation-design.md | Maintainability design | Current |
| superpowers/specs/2026-06-09-poke-without-message-design.md | Poke without message design | Current |
---
## Documentation Gaps
The following code modules have **no dedicated documentation**:
| Module | Functions | Gap Description |
|--------|-----------|-----------------|
| `chanora_audio` (engine) | ~45 | No architecture doc for audio engine internals |
| `chanora_audio` (VAD subsystem) | ~25 | VAD pipeline, model loading, fallback strategy undocumented |
| `chanora_audio` (DSP processors) | ~30 | AEC3, AGC2, NS, HPF configuration undocumented |
| `chanora_audio` (PTT backends) | ~155 | Platform-specific PTT behavior undocumented |
| `chanora_bridge` (FFI layer) | ~300 | Flutter-Rust bridge API contract undocumented |
| `chanora_cache` | ~16 | Cache strategy, eviction policy undocumented |
| `chanora_prefetch` | ~18 | Prefetch timing, debouncing strategy undocumented |
| `chanora_core` | ~147 | Core connection lifecycle, event handling undocumented |
| `chanora_state` | ~59 | State machine transitions, delta emission undocumented |
| `chanora_storage` | ~62 | Storage format, migration strategy undocumented |
| `chanora_protocol` | ~97 | Protocol message format, adapter logic undocumented |
| `chanora_resolver` | ~70 | DNS resolution, TSDNS discovery undocumented |
| `chanora_diagnostics` | ~74 | Diagnostic collection, redaction rules undocumented |
| Flutter services layer | ~21 files | No service-layer architecture doc |
| Flutter widgets layer | ~24 files | No widget catalog or component doc |
| Localization (l10n) | — | Translation workflow undocumented (only architecture doc exists) |
## Potentially Outdated Documents
| File | Reason |
|------|--------|
| `implementation-status-2026-05-28.md` | Dated 2026-05-28; code has changed significantly since |
| `docs/material3-guideline.md` | Duplicate of `docs/ui-ux/material3-guideline.md` |
| `docs/sysdes.md` | Top-level duplicate of `docs/architecture/sysdes.md` |
| `docs/srs.md` / `docs/sysrs.md` | Top-level duplicates of `docs/requirements/` versions |
---
## Key Findings
1. **chanora_audio** is the best-tested crate (204 tests), but still only ~48% function coverage due to the large codebase (~428 functions)
2. **chanora_bridge**, **chanora_cache**, and **chanora_prefetch** have zero tests
3. **chanora_core** has very low coverage (~7%) despite being the main connection orchestrator
4. **Dart widget tests** cover only 54% of widget files; 11 widget files have no tests
5. **Dart service tests** are strong at 90% coverage (only 2 files untested)
6. **Documentation** is extensive (55 files) but focuses on process/governance; code-level architecture docs are sparse
7. No dedicated docs exist for the audio engine, FFI bridge, protocol layer, or state machine internals
@@ -0,0 +1,115 @@
# Documentation Quality Analysis
## Summary
- Total docs analyzed: 64
- Duplicated content instances: 8
- Useless content items: 1 (malformed markdown only)
- Broken references: 1 (suggested file names only; SDD-109/SAD-043 are valid historical refs)
## Duplicated Content
### Instance 1: Lifecycle Documentation Chain
- **Files**: `README.md:280`, `CONTRIBUTING.md:10`, `docs/sysdes.md:90`, `docs/sysrs.md:108`, `docs/governance/traceability-matrix.md:16`, `docs/references/aspice-swe2-swe3-integration-note.md:12`
- **Content**: `SysRS -> SysDes -> SRS -> SAD -> SDD` lifecycle chain repeated across 6+ files
- **Recommendation**: Define once in `README.md` and reference from other docs
### Instance 2: Git Commit Convention Examples
- **Files**: `README.md:380`, `CONTRIBUTING.md:38`, `docs/governance/git-commit-message-convention.md:15`
- **Content**: Same commit examples (`feat(voice): add push-to-talk state handling`, `fix(protocol): recover channel tree after reconnect snapshot`, etc.) duplicated across 3 files
- **Recommendation**: Keep examples only in `docs/governance/git-commit-message-convention.md` and reference from README/CONTRIBUTING
### Instance 3: Security/Privacy/Legal Document List
- **Files**: `README.md:349-355`, `SECURITY.md:33-38`
- **Content**: Same list of 6 security documents (threat-model, secure-storage, diagnostic-redaction, dependency, privacy-policy, trademark) repeated verbatim
- **Recommendation**: Keep list in `SECURITY.md` and reference from README
### Instance 4: Architecture Component Table
- **Files**: `README.md:73-92`, `docs/architecture/sad.md:56-67`
- **Content**: Similar architecture overview showing Flutter UI, Rust Core, Protocol Layer structure
- **Recommendation**: Keep detailed version in SAD; use abbreviated version in README
### Instance 5: Platform Policy Table
- **Files**: `README.md:47-54`, `docs/release/platform-release-policy.md:12-19`
- **Content**: Platform requirements table with overlapping information
- **Recommendation**: Consolidate in `platform-release-policy.md` and reference from README
### Instance 6: Security Gate Requirements
- **Files**: `docs/security/security-privacy-legal-guideline.md:13-21`, `docs/security/threat-model.md:22-30`
- **Content**: Similar threat/mitigation tables with overlapping secure-storage and diagnostics concerns
- **Recommendation**: Threat model should reference the guideline for gate requirements
### Instance 7: DV Conclusion Pattern
- **Files**: Nearly every `docs/` file ends with a "## DV Conclusion" section
- **Content**: Repetitive pattern: "[Area] is documented for DV. [Limitation] remains."
- **Recommendation**: This is intentional for ASPICE compliance. No change needed, but consider a template.
### Instance 8: Android Runtime Gate Documentation
- **Files**: `docs/verification/swe5-software-integration-verification-plan.md:57-68`, `docs/governance/maintainability-review-2026-06-08.md:61-88`
- **Content**: Same Android ADB/emulator verification steps and `adb devices -l` requirements
- **Recommendation**: Define once in a shared reference and import
## Useless Content
### Empty Sections
| File | Line | Header | Issue |
|------|------|--------|-------|
| `docs/architecture/sysdes.md` | 1-21 | Entire file | Path record file — 21 lines pointing to `docs/sysdes.md` with no unique content |
| `docs/requirements/sysrs.md` | 1-22 | Entire file | Path record file — 22 lines pointing to `docs/sysrs.md` with no unique content |
| `docs/requirements/srs.md` | 1-22 | Entire file | Path record file — 22 lines pointing to `docs/srs.md` with no unique content |
| `docs/ui-ux/material3-guideline.md` | 1-8 | Entire file | Path record file — 8 lines pointing to `docs/material3-guideline.md` |
| `docs/sysdes.md` | 13 | `**Repo path:** ... ---` | Malformed markdown (missing blank line before `---`) |
### TODO/Placeholder Markers
No actual TODO/TBD/placeholder markers found in the documentation files. The codebase is clean of such markers.
### Broken References
| File | Line | Reference | Issue |
|------|------|-----------|-------|
| `docs/sysrs.md` | 126-130 | `docs/chanora_SysDes.md`, `docs/chanora_SRS.md`, etc. | These suggested file names do not exist. Actual files use different names (`docs/sysdes.md`, `docs/srs.md`, etc.) |
| `docs/implementation-status-2026-05-28.md` | 103 | `SDD-109` | References a specific SDD item ID that is not itemized in the current SDD baseline |
| `docs/implementation-status-2026-05-28.md` | 105 | `SAD-043` | References a specific SAD item ID that is not itemized in the current SAD baseline |
### Outdated Content
| File | Line | Content | Issue |
|------|------|---------|-------|
| `docs/sysdes.md` | 6 | Version `0.9.8` | Superseded by later governance docs dated 2026-05-29 |
| `docs/sysrs.md` | 5 | Version `0.9.11` | May need alignment with SysDes version |
| `docs/material3-guideline.md` | 4-5 | Version `0.9.2` | Change history stops at 2026-05-14; no updates for 2026-05-29 baseline |
| `tools/windows-smoke.md` | 6 | `product/scaffold-v0` branch | Default base branch changed to `main` per CHANGELOG |
| `docs/implementation-status-2026-05-28.md` | 140 | Agent spec docs reference | States docs are "deleted from the working tree but still in git HEAD" — stale cleanup note |
### Stale Content
| File | Line | Content | Issue |
|------|------|---------|-------|
| `docs/implementation-status-2026-05-28.md` | 1 | Date: 2026-05-28 | Pre-dates DV baseline (2026-05-29); may not reflect final baseline state |
| `docs/governance/git-commit-message-convention.md` | 18 | `release(android): prepare internal alpha build metadata` | Example uses `release` type which is not in the Conventional Commits standard types |
## Duplicated Code Blocks
| Code Hash | Files | Description |
|-----------|-------|-------------|
| Lifecycle chain | `README.md:280`, `CONTRIBUTING.md:10`, `docs/sysdes.md:90`, `docs/sysrs.md:108`, `docs/governance/traceability-matrix.md:16`, `docs/references/aspice-swe2-swe3-integration-note.md:12` | `SysRS -> SysDes -> SRS -> SAD -> SDD -> Verification` |
| Commit examples | `README.md:379-386`, `CONTRIBUTING.md:37-42`, `docs/governance/git-commit-message-convention.md:14-19` | 4-6 identical commit message examples |
| Security doc list | `README.md:349-355`, `SECURITY.md:33-38` | 6 identical file paths |
| Architecture ASCII art | `README.md:73-92`, `docs/architecture/sad.md:56-67` | Similar but not identical architecture diagrams |
| Platform table | `README.md:47-54`, `docs/release/platform-release-policy.md:12-19` | Overlapping platform requirement tables |
## Recommendations
### High Priority
1. **Consolidate lifecycle chain**: Define once in README, reference elsewhere
2. **Fix suggested file names**: `docs/sysrs.md` lines 126-130 reference non-existent file names
### Medium Priority
4. **Consolidate commit examples**: Keep in `git-commit-message-convention.md` only
5. **Consolidate security doc list**: Keep in `SECURITY.md` only
6. **Update outdated branch reference**: `tools/windows-smoke.md` references `product/scaffold-v0` but default is now `main`
### Low Priority
7. **Align document versions**: SysDes (0.9.8), SysRS (0.9.11), Material3 (0.9.2) have different versions
8. **Clean up implementation status**: Remove stale agent-spec references and update date
+280
View File
@@ -0,0 +1,280 @@
# ReSpeak Project Knowledge Base
> **Source**: https://github.com/ReSpeak/tsclientlib
> **Last synced**: 2026-06-13
> **License**: MIT OR Apache-2.0
## Overview
ReSpeak is an open-source project that provides a Rust implementation of the **TeamSpeak 3 protocol**. The primary goal is to enable building TeamSpeak clients and bots in Rust. The project is **not** an official TeamSpeak product — it was created for fun and to gain features/bugfixes not available in the official client.
The organization maintains a single monorepo (`ReSpeak/tsclientlib`) containing multiple crates that layer from low-level protocol handling up to a high-level client library.
**Key principle**: ReSpeak does **not** publish server-side code. They earn revenue by selling servers and ReSpeak respects that business model.
## Repository Map
| Crate | Path | Purpose | Version |
|-------|------|---------|---------|
| `tsclientlib` | `tsclientlib/` | High-level client/bot library | 0.2.0 |
| `tsproto` | `tsproto/` | Low-level TeamSpeak 3 protocol implementation | 0.2.0 |
| `ts-bookkeeping` | `utils/ts-bookkeeping/` | Server state tracking (clients, channels) | 0.1.x |
| `tsproto-packets` | `utils/tsproto-packets/` | Packet and command parsing/serialization | 0.1.x |
| `tsproto-types` | `utils/tsproto-types/` | Core types, enums, crypto primitives | 0.1.x |
| `tsproto-structs` | `utils/tsproto-structs/` | Generated structs from tsdeclarations | 0.1.x |
**External dependency**: [tsdeclarations](https://github.com/ReSpeak/tsdeclarations) — machine-readable TeamSpeak protocol declarations (embedded as git submodule).
## tsclientlib
### Architecture
`tsclientlib` is the **top-level crate** — the one consumers use. It provides:
- `Connection` struct: manages a single connection to a TeamSpeak server
- Async API built on `tokio` + `futures`
- DNS SRV resolution for server discovery (`resolver.rs`)
- Audio handling via `audiopus` (Opus codec) behind the `audio` feature flag
- Sync wrapper (`sync.rs`) for non-async contexts
- Prelude module for convenient imports
### Features
| Feature | Default | Description |
|---------|---------|-------------|
| `audio` | yes | Opus encode/decode, `AudioHandler` for jitter buffer + mixing |
| `unstable` | no | Expose internal protocol API (may break on minor releases) |
| `default-tls` | yes | reqwest with default TLS for HTTP/HTTPS |
| `bundled` | no | Bundle SDL2 |
| `static-link` | no | Statically link SDL2 |
| `audiopus-unstable` | no | Extended audiopus API from Flakebi's fork |
### Key Dependencies
- `tsproto` — protocol layer
- `ts-bookkeeping` — state management
- `tsproto-packets` — packet parsing
- `tsproto-types` — types + crypto
- `tokio` — async runtime
- `hickory-proto` / `hickory-resolver` — DNS resolution
- `reqwest` — HTTP client
- `audiopus` — Opus codec (optional)
### Source Files
| File | Purpose |
|------|---------|
| `lib.rs` | Core types, re-exports, `Connection` entry point |
| `audio.rs` | Audio subsystem — Opus encode/decode, `AudioHandler` |
| `resolver.rs` | DNS SRV resolution for TeamSpeak servers |
| `sync.rs` | Synchronous wrapper API |
| `prelude.rs` | Convenience re-exports |
| `tests.rs` | Integration tests |
### Examples
- `simple.rs` — minimal async client
- `simple-sync.rs` — minimal sync client
- `audio.rs` — audio streaming client
- `audio-latency.rs` — latency measurement
- `channeltree.rs` — channel navigation
- `many.rs` / `sync.rs` — stress tests
## tsproto
### Architecture
`tsproto` implements the **low-level TeamSpeak 3 protocol**:
- Connection establishment and handshake
- UDP packet delivery with reliability (resend logic)
- Packet encryption and compression
- Command parsing
### Source Files
| File | Purpose |
|------|---------|
| `algorithms.rs` | Packet splitting, encryption/decryption, compression, hash cash |
| `client.rs` | Client-side connection logic |
| `connection.rs` | Connection state machine, packet queuing |
| `packet_codec.rs` | Packet encoding/decoding codec |
| `resend.rs` | Reliable packet delivery with retransmission |
| `license.rs` | License system implementation |
| `log.rs` | Logging utilities |
| `utils.rs` | Helper functions |
### Protocol Details
#### Packet Types
| Type | Description |
|------|-------------|
| `Command` | High-priority commands |
| `CommandLow` | Low-priority commands |
| `Voice` | Voice data |
| `VoiceWhisper` | Whisper voice data |
| `Ack` / `AckLow` | Acknowledgments |
| `Ping` / `Pong` | Keepalive |
| `Init` | Connection initialization |
#### Packet Limits
- **Max UDP packet size**: 1500 bytes (ethernet MTU)
- **Max command packet size**: 500 bytes (including header)
- **Max fragments length**: 40960 bytes
- **Max decompressed size**: 2 MiB (for large servers with 2000+ channels)
- **Max out-of-order queue**: 200 packets
#### Compression
- Uses **QuickLZ** level 1 for command packets
- Compression only applied if result is smaller than original
- Fragmentation occurs when compressed data exceeds 500 bytes
### Cryptography
#### Key Types
| Type | Curve | Usage |
|------|-------|-------|
| `EccKeyPubP256` | P-256 (secp256r1) | Public identity key |
| `EccKeyPrivP256` | P-256 | Private identity key |
| `EccKeyPubEd25519` | Ed25519 | Public ephemeral key (handshake) |
| `EccKeyPrivEd25519` | Ed25519 | Private ephemeral key (handshake) |
#### Encryption Algorithm
1. **Key derivation**: `SHA-256(packet_type || generation_id || shared_iv)` → 16-byte key + 16-byte nonce
2. **Cipher**: AES-128 in EAX mode with 8-byte MAC
3. **Key caching**: Derived keys are cached per generation to avoid recomputation
4. **Packet ID mixing**: `key[0] ^= (packet_id >> 8)`, `key[1] ^= (packet_id & 0xff)`
#### Shared IV Computation (`compute_iv_mac`)
1. ECDH shared secret via Ed25519
2. `shared_iv = SHA-512(shared_secret)`
3. XOR with `alpha` (10 bytes) and `beta` (54 bytes) from handshake
4. `shared_mac = SHA-1(shared_iv)[..8]`
#### Hash Cash (Identity Proof-of-Work)
- Identity level = number of leading zero bits in `SHA-1(public_key_string || counter)`
- `upgrade_level(target)` iterates counter until desired level is reached
- Default target level: 8
#### Identity Format
```
Format: counter || 'V' || base64(private_key)
Example: "2792354VMG8DAgeAAgEgAiEA..."
```
#### Fake Encryption
- Used for unencrypted packet types (voice, ack, ping, etc.)
- Fixed key: `c:\windows\syste` (16 bytes)
- Fixed nonce: `m\firewall32.cpl` (16 bytes)
## ts-bookkeeping
Tracks the **server state** by processing incoming commands:
- Maintains client list, channel tree, server info
- Generates events from state changes
- Provides methods to create outgoing command packets
- Main struct: `data::Connection`
## tsproto-packets
Handles **packet serialization/deserialization**:
- `packets.rs` — packet structures (`InPacket`, `OutPacket`, `OutAck`, etc.)
- `commands.rs` — TeamSpeak command parsing
- Header constants: `C2S_HEADER_LEN`, `S2C_HEADER_LEN`
## tsproto-types
Core **types and primitives**:
- `crypto.rs` — ECC key types (P-256, Ed25519), ECDH, signatures, identity obfuscation
- `versions.rs` — TeamSpeak version strings
- `errors.rs` — Protocol error codes
### Key Crypto Functions
| Function | Description |
|----------|-------------|
| `EccKeyPrivP256::create()` | Generate new P-256 keypair |
| `EccKeyPrivP256::import_str()` | Import from base64/tomcrypt/obfuscated formats |
| `EccKeyPrivP256::create_shared_secret()` | ECDH with P-256 |
| `EccKeyPrivP256::sign()` | ECDSA signature |
| `EccKeyPubP256::verify()` | ECDSA verification |
| `EccKeyPubP256::get_uid()` | `base64(SHA-1(ts_encoded_key))` |
| `encode_password()` | `base64(SHA-1(password))` |
| `EccKeyPrivEd25519::create_shared_secret()` | ECDH with Ed25519 |
### Identity Obfuscation
TeamSpeak stores identities XOR'd with a static 128-byte pattern + SHA-1 hash of trailing data. ReSpeak implements both obfuscation and deobfuscation.
## How Chanora Uses ReSpeak
Chanora depends on **four crates** from the ReSpeak monorepo, all pinned to revision `04aa2491`:
### Dependency Chain
```
chanora_protocol/
├── tsclientlib (rev 04aa2491, features=["audio"])
├── tsproto-packets (rev 04aa2491)
├── tsproto-types (rev 04aa2491)
└── ts-bookkeeping (rev 04aa2491)
chanora_audio/
└── tsclientlib (rev 04aa2491, features=["audio"])
```
### Architectural Constraint (SAD-067 / SysDes-011 / SysDes-029)
Chanora's `chanora_protocol` crate acts as an **isolation boundary**:
> No tsclientlib types may cross out of this crate.
This prevents ReSpeak API changes from cascading through Chanora's codebase.
### Patched Fork
Chanora patches `tsproto-types` to fix **P-256 short coordinate padding**:
```toml
[patch."https://github.com/ReSpeak/tsclientlib.git"]
tsproto-types = { git = "https://github.com/EdisonJwa/tsclientlib.git", branch = "fix/p256-short-coordinate-pad" }
```
This handles cases where P-256 coordinates are shorter than 32 bytes and need left-padding.
### Key Usage Points
1. **Protocol connection**: `tsclientlib::Connection` for TeamSpeak server connections
2. **Audio handling**: `AudioHandler` from tsclientlib for decode, jitter buffer, mixing
3. **Packet types**: `tsproto-packets` for `OutAudio`, `InAudioBuf`, `AudioData`, `CodecType`, `Direction`
4. **State tracking**: `ts-bookkeeping` for server state management
## External References
- **Qint** (https://github.com/ReSpeak/Qint) — Cross-platform TeamSpeak client built on tsclientlib (not yet ready)
- **SimpleBot** (https://github.com/ReSpeak/SimpleBot) — Example chat bot
- **tsdeclarations** (https://github.com/ReSpeak/tsdeclarations) — Machine-readable protocol declarations
- **TSIdentityTool** (https://github.com/landave/TSIdentityTool) — Identity deobfuscation reference (MIT)
## Performance Benchmarks
From i7-5280K @ 3.6 GHz (single-threaded):
| Operation | Time | Throughput |
|-----------|------|------------|
| Connection creation | 199 ms | 6.5 conn/sec |
| Message send | 189 µs | 5300 msg/sec |
Bottleneck: RSA puzzle solving at connection time. Use `--features rug` for efficient big integer implementation.
+392
View File
@@ -0,0 +1,392 @@
# TeaSpeak Project Knowledge Base
## Overview
TeaSpeak is an open-source, TeamSpeak-compatible voice communication platform hosted at `https://git.did.science/TeaSpeak`. It consists of two main repositories:
- **TeaSpeak-Client** — An Electron-based desktop client (329 commits, created May 2020)
- **TeaSpeakLibrary** — A C++ shared library providing core protocol, channel, and database functionality (208 commits, created May 2020)
The project is developed by WolverinDEV / TeaSpeak and targets users who need a self-hosted, TeamSpeak-compatible voice chat solution.
## Architecture
### Two-Repository Design
```
TeaSpeak/
├── TeaSpeak-Client/ # Electron desktop application
│ ├── main.ts # Entry point (Electron main process)
│ ├── modules/ # TypeScript modules (core, renderer, shared, crash_handler)
│ ├── native/ # C++ native addons (Node.js N-API)
│ │ ├── serverconnection/ # Server connection & audio engine
│ │ ├── codec/ # Opus codec bindings
│ │ ├── crash_handler/ # Native crash handling
│ │ ├── dns/ # DNS resolution
│ │ ├── ppt/ # Protocol handling
│ │ └── updater/ # Auto-updater
│ ├── imports/ # Shared TypeScript definitions & vendor libs
│ └── resources/ # Static assets
└── TeaSpeakLibrary/ # C++ static library
├── CMakeLists.txt # CMake build system
├── src/
│ ├── protocol/ # TeamSpeak protocol implementation
│ ├── channel/ # Channel tree management
│ ├── query/ # Server query protocol
│ ├── sql/ # SQLite & MySQL database layer
│ ├── ssl/ # SSL/TLS support
│ ├── bbcode/ # BBCode parsing
│ └── misc/ # Utilities (crypto, networking, etc.)
└── test/ # Unit tests
```
### Client Architecture (Electron)
The client uses a multi-process Electron architecture:
- **Main Process** (`modules/core/main.ts`) — App lifecycle, window management, crash handling
- **Renderer Process** (`modules/renderer/`) — UI rendering, audio controls, connection management
- **Shared Module** (`modules/shared/`) — IPC definitions, version info, proxy utilities
- **Native Addons** (`native/`) — C++ bindings for performance-critical operations
Key TypeScript path aliases:
- `tc-shared/*``imports/shared-app/*`
- `tc-native/connection``native/serverconnection/exports/exports.d.ts`
## Features
### Voice Communication
- Opus audio codec support (encoder/decoder)
- Audio input/output with gain control and level metering
- Audio mixing and interleaving
- Voice activity detection (VAD) via libfvad
- Audio filtering and processing pipeline
- Sound file playback capabilities
### Server Protocol
- TeamSpeak protocol compatibility
- Custom protocol handler with crypto support (ProtocolHandlerCrypto)
- Packet acknowledgement and loss calculation
- Ring buffer for reliable packet delivery
- QuickLZ compression
- Hardware ID (HWID) generation for client identification
### Channel System
- Tree-based channel hierarchy (TreeView)
- Channel properties and permissions
- BBCode formatting support
### Data & Storage
- SQLite database support
- MySQL database support
- Client storage and profiles
- File transfer capabilities
- Connection logging
### Client Features
- Auto-updater
- Crash handler with Sentry integration
- Window management and system tray
- Keyboard shortcuts
- Context menus
- i18n (internationalization)
- Music playback
- URL preview
## Technology Stack
### Client (TeaSpeak-Client)
| Component | Technology |
|-----------|-----------|
| Runtime | Electron 8.5.5 |
| Language | TypeScript 3.9, C++ |
| UI | HTML/CSS, jQuery, EJS templates |
| Styling | SASS |
| Native addons | cmake-js, Node.js N-API |
| Build | electron-packager |
| Error tracking | Sentry |
### Library (TeaSpeakLibrary)
| Component | Technology |
|-----------|-----------|
| Language | C++20 |
| Build system | CMake 3.6+ |
| Crypto | TomCrypt, TomMath, OpenSSL, Ed25519 |
| Compression | QuickLZ |
| Database | SQLite3, MySQL Connector/C++ |
| Logging | spdlog |
| Events | libevent |
| Audio | Opus |
| JSON | jsoncpp |
| Serialization | Protocol Buffers |
| Memory | jemalloc |
| Crash reporting | Breakpad |
| Terminal | CXXTerminal (server mode) |
| Threading | Custom ThreadPool |
| String templating | StringVariable |
| Networking | DataPipes (includes libnice for ICE) |
### External Dependencies (from libraries.txt)
- PortAudio — Cross-platform audio I/O
- libfvad — Voice activity detection
- SoXR — High-quality sample rate conversion
## Protocol / API
### TeamSpeak Protocol Implementation
The protocol layer (`TeaSpeakLibrary/src/protocol/`) implements:
- **Packet** — Core packet structure and serialization
- **CryptHandler** — Encryption/decryption for secure communication
- **CompressionHandler** — QuickLZ-based packet compression
- **AcknowledgeManager** — Reliable delivery with ACK tracking
- **PacketLossCalculator** — Network quality monitoring
- **RingBuffer** — Circular buffer for packet ordering
- **Generation** — Protocol version/generation handling
### Server Connection (Client Side)
The native server connection module (`native/serverconnection/`) handles:
- **ServerConnection** — Main connection state machine
- **ProtocolHandler** — Full protocol implementation split across:
- `ProtocolHandlerCommands.cpp` — Command processing
- `ProtocolHandlerCrypto.cpp` — Crypto handshake
- `ProtocolHandlerPOW.cpp` — Proof of work (anti-spam)
- `ProtocolHandlerPackets.cpp` — Packet serialization
- **Socket** — TCP/UDP socket management
- **Audio subsystem** — Codec, drivers, filters, processing
### Query Protocol
Server query support (`src/query/`) with:
- Command parsing (v2 and v3 formats)
- Escape sequence handling
## Build & Configuration
### Building TeaSpeakLibrary
```bash
# Prerequisites: CMake 3.6+, C++20 compiler, OpenSSL, MySQL, etc.
mkdir build && cd build
cmake .. -DTEASPEAK_SERVER=ON
make -j$(nproc)
# Build tests (optional)
cmake .. -DBUILD_TESTS=ON
make -j$(nproc)
```
### Building TeaSpeak-Client
```bash
# Install dependencies
npm install
# Compile TypeScript
npm run compile-tsc
# Compile SASS
npm run compile-sass
# Generate JSON validators
npm run compile-json-validator
# Build for Linux
npm run build-linux-64
npm run package-linux-64
# Build for Windows
npm run build-windows-64
npm run package-windows-64
# Development mode
npm run start-s # Connects to localhost:8080
```
### Environment Variables
- `teaclient_deploy_secret` — Deployment signing key (in `env.sh`)
### Platform-Specific Dependencies
- **Linux**: electron-installer-debian
- **Windows**: electron-installer-windows, electron-winstaller, electron-wix-msi, rcedit
## Key Concepts
### Protocol Concepts
- **HWID** (Hardware ID) — Unique machine identifier for client authentication
- **POW** (Proof of Work) — Anti-spam mechanism in connection handshake
- **Ring Buffer** — Circular buffer for managing packet ordering and retransmission
- **Acknowledge Manager** — Tracks packet delivery confirmation
- **Packet Loss Calculator** — Monitors network quality metrics
### Audio Concepts
- **Opus Converter** — Handles Opus encoding/decoding
- **Audio Gain** — Volume amplification/attenuation
- **Audio Level Meter** — Real-time audio level monitoring
- **Audio Merger** — Combines multiple audio streams
- **Audio Interleaved** — Audio frame interleaving for transmission
- **Audio Event Loop** — Async audio processing pipeline
- **VAD** (Voice Activity Detection) — Detects speech vs silence
### Channel Concepts
- **TreeView** — Hierarchical channel structure (parent/child relationships)
- **BBCode** — Text formatting markup (TeamSpeak standard)
- **Permission Manager** — Role-based access control
### Connection Concepts
- **ServerConnection** — Full connection lifecycle management
- **Command Handler** — Processes server commands/responses
- **Handshake Handler** — Initial connection negotiation
- **Voice Connection** — Audio stream management
- **Video Connection** — Video stream support
- **Dummy Voice Connection** — Placeholder/mock for testing
## Source Repository Structure
### TeaSpeak-Client Root
```
.
├── .gitignore
├── .gitmodules
├── bugs # Bug tracking
├── build_declarations.sh # Build script for type declarations
├── env.sh # Environment variables
├── generate-json-validators.sh # JSON schema validation generator
├── libraries.txt # External library references
├── main.ts # Electron entry point
├── package.json # Node.js dependencies & scripts
├── package-lock.json
├── restore.sh # Restore script
├── tsconfig.json # TypeScript configuration
├── tsconfig_render_api.json # Renderer API TypeScript config
├── imports/ # Shared TypeScript types & vendor code
│ ├── shared-app/ # Application-level shared types
│ │ ├── audio/ # Audio type definitions
│ │ ├── backend/ # Backend interfaces
│ │ ├── clientservice/ # Client service definitions
│ │ ├── connection/ # Connection type definitions
│ │ │ └── rtc/ # WebRTC-related types
│ │ ├── connectionlog/ # Connection logging
│ │ ├── conversations/ # Chat/conversation types
│ │ ├── crypto/ # Crypto interfaces
│ │ ├── entry-points/ # Module entry points
│ │ ├── events/ # Event definitions
│ │ ├── file/ # File handling types
│ │ ├── i18n/ # Internationalization
│ │ ├── ipc/ # IPC message definitions
│ │ ├── media/ # Media handling
│ │ ├── music/ # Music playback
│ │ ├── permission/ # Permission types
│ │ ├── profiles/ # User profiles
│ │ ├── text/ # Text processing
│ │ ├── tree/ # Tree data structures
│ │ ├── ui/ # UI component types
│ │ └── update/ # Update mechanism
│ ├── svg-sprites/ # SVG icon sprites
│ └── vendor/ # Third-party libraries
│ ├── TeaEventBus/ # Event bus implementation
│ └── TeaClientServices/ # Client services
├── installer/ # Build & packaging scripts
├── jenkins/ # CI/CD pipeline
├── modules/ # TypeScript source modules
│ ├── core/ # Main process
│ │ ├── app-updater/ # Auto-update logic
│ │ ├── main-window/ # Main window management
│ │ ├── render-backend/ # Renderer backend
│ │ ├── ui-loader/ # UI loading
│ │ ├── url-preview/ # URL preview
│ │ └── windows/ # Window definitions
│ ├── crash_handler/ # Crash handling
│ ├── renderer/ # Renderer process
│ │ ├── audio/ # Audio controls UI
│ │ ├── connection/ # Connection UI
│ │ ├── dns/ # DNS resolution
│ │ └── hooks/ # React-like hooks
│ ├── renderer-manifest/ # Renderer configuration
│ └── shared/ # Shared utilities
│ ├── ipc/ # IPC implementation
│ ├── process-arguments/ # CLI argument parsing
│ ├── proxy/ # Proxy utilities
│ └── version/ # Version management
├── native/ # C++ native addons
│ ├── cmake/ # CMake modules
│ ├── codec/ # Audio codec (Opus)
│ │ └── codec/ # Codec implementation
│ ├── crash_handler/ # Native crash handler
│ ├── dist/ # Distribution files
│ ├── dns/ # DNS resolver
│ ├── ppt/ # Protocol tools
│ ├── serverconnection/ # Server connection module
│ │ ├── exports/ # TypeScript declarations
│ │ ├── src/
│ │ │ ├── audio/ # Audio engine
│ │ │ │ ├── codec/ # Opus encoder/decoder
│ │ │ │ ├── driver/ # Audio drivers
│ │ │ │ ├── file/ # Audio file I/O
│ │ │ │ ├── filter/ # Audio filters
│ │ │ │ ├── js/ # JS audio bindings
│ │ │ │ ├── processing/ # Audio processing
│ │ │ │ └── sounds/ # Sound effects
│ │ │ └── connection/ # Protocol implementation
│ │ │ ├── audio/ # Audio connection
│ │ │ └── ft/ # File transfer
│ │ └── test/ # Connection tests
│ └── updater/ # Auto-updater native code
├── resources/ # Static resources
└── scripts/ # Build/utility scripts
```
### TeaSpeakLibrary Root
```
.
├── CMakeLists.txt # Build configuration
├── main.cpp # Test entry point
├── src/
│ ├── bbcode/ # BBCode parser
│ ├── channel/ # Channel tree (TreeView)
│ ├── converters/ # Data converters
│ ├── lock/ # Read-write mutex
│ ├── log/ # Logging utilities
│ ├── misc/ # Utilities
│ │ ├── base64.* # Base64 encoding
│ │ ├── digest.* # Hash digests
│ │ ├── hex.* # Hex encoding
│ │ ├── memtracker.* # Memory tracking
│ │ ├── net.* # Network utilities
│ │ └── rnd.* # Random number generation
│ ├── protocol/ # TeamSpeak protocol
│ │ ├── AcknowledgeManager.* # ACK tracking
│ │ ├── CompressionHandler.* # QuickLZ compression
│ │ ├── CryptHandler.* # Encryption
│ │ ├── Packet.* # Packet structure
│ │ ├── PacketLossCalculator.* # Loss monitoring
│ │ ├── buffers.* # Buffer management
│ │ ├── generation.* # Protocol generation
│ │ └── ringbuffer.* # Circular buffer
│ ├── qlz/ # QuickLZ compression library
│ ├── query/ # Server query protocol
│ ├── sql/ # Database layer
│ │ ├── sqlite/ # SQLite implementation
│ │ └── mysql/ # MySQL implementation
│ ├── ssl/ # SSL/TLS management
│ ├── BasicChannel.* # Base channel class
│ ├── Definitions.h # Global definitions
│ ├── Error.* # Error handling
│ ├── EventLoop.* # Event loop
│ ├── License.* # License management
│ ├── PermissionManager.* # Permission system
│ ├── Properties.* # Property system
│ └── Variable.* # Variable system
└── test/ # Unit tests
├── RingTest.cpp
├── CommandTest.cpp
├── ChannelTest.cpp
├── PermissionTest.cpp
└── ...
```
+348
View File
@@ -0,0 +1,348 @@
# YaTQA Wissensdatenbank (Deutsch)
> Quelle: https://yat.qa/ — Abgerufen: 13.06.2026
> Version: v3.9.9b (01. Mrz 2023)
## Überblick
**YaTQA** (Yet Another TeamSpeak³ Query Admin Tool) ist eine Windows-Anwendung zur Verwaltung von **TeamSpeak-3-Servern und -Instanzen** über das ServerQuery-Interface. Es bietet eine grafische Oberfläche für alle Query-Befehle und macht das Erlernen der rohen Query-Syntax überflüssig.
- **Autor:** Janni „Яedeemer" K. (Norddeutschland)
- **Sprache:** Geschrieben in Delphi 2009 (über 50.000 Zeilen Quelltext)
- **Entwicklungsbeginn:** 10. April 2011
- **Erstveröffentlichung:** 29. Juni 2011
- **Lizenz:** Kostenlos und voll funktionsfähig (keine Adware/Spyware)
- **Plattformen:** Windows XP und neuer, Linux mittels Wine
- **Größe:** ~1,3 MiB Installer
- **Enthaltene Sprachen:** Deutsch und Englisch (Auswahl während der Installation)
- **Unterstützte Server:** TeamSpeak 3.9.0 bis 3.13.7, TeaSpeak 1.4.10-beta
- **Download:** https://dl.yat.qa/stable/
- **Website:** https://yat.qa/
### Motto
*„Dinosaurier haben kein TeamSpeak benutzt und sind vor 66 Millionen Jahren ausgestorben. Zufall? Vermutlich nicht."*
---
## Funktionen
**YaTQA unterstützt alle ServerQuery-Funktionen ohne Ausnahme.** Die folgende Liste beschränkt sich auf Funktionen, die der normale TS-Client nicht bietet.
### Allgemeine Funktionen (Kein Admin erforderlich)
- **DNS-Auflösung:** Detaillierte Visualisierung der DNS-Auflösung (simuliert 10 verschiedene Client-Versionen)
- **Blacklist-Prüfung:** TeamSpeaks Blacklist auf eine IP überprüfen
- **Blacklist2:** TeamSpeaks Blacklist2 für virtuelle Server prüfen
- **Benutzerdiagramm:** Serverstatistiken von Planet TeamSpeak als Diagramm anzeigen und als PNG speichern
- **Client-Cache:** Avatare, Icons und Chatlogs im Client-Cache finden
### Konsole (Query-Interface)
- **Autovervollständigung:** Befehlsvervollständigung einschließlich undokumentierter Befehle
- **Parameterhilfe:** Zeigt alle Parameter eines Befehls basierend auf eigener Forschung
- **Werteauswahl:** Strg+Leertaste für Werteliste
- **Ergebnisanalyse:** Gruppierte Datensätze mit Erklärungen
- **Skripting:** Befehlslisten aus Dateien laden und ausführen
- **Events:** Server-Events abonnieren und in der Konsole protokollieren
### SSH-Tunnel
- **Verschlüsselung:** Vollständig verschlüsselte Verbindung (außer Dateiübertragungen)
- **Geschwindigkeit:** Auf vielen Servern merkbar schneller (ähnlich wie `tcp_nodelay`)
- **Privatsphäre:** IP wird immer verborgen (man erscheint als 127.0.0.1)
- **Flood-Umgehung:** Umgeht alle Flood-Beschränkungen (127.0.0.1 steht üblicherweise auf der Whitelist)
### Instanz-Funktionen (Erfordert serveradmin)
- Instanzstatistiken anzeigen/bearbeiten
- Lizenzdetails und IP-Bindings anzeigen
- Alle virtuellen Server anzeigen
- Lokale Notizen zu Servern erstellen (lokal gespeichert)
- Virtuelle Server starten/stoppen/erstellen/löschen/umbenennen
- Unsichtbar werden (Server-Fehler, könnte behoben werden)
- Nachricht an alle Server senden
- Snapshots erstellen/massenweise erstellen/wiederherstellen (inkl. Dateien)
- Manipulierte Snapshots einspielen
- Server mittels Snapshots kopieren
- Rechte auf Vorlagengruppen zurücksetzen
- Channel-Datei-Backups speichern/wiederherstellen (inkrementelles Backup unterstützt)
### Funktionen für virtuelle Server
- Host-Message-Modal-Quit und hohe Sicherheitsstufe ignorieren
- Sehr detaillierte Serverstatistiken
- Mehrere Server gleichzeitig bearbeiten
- Ausklappbarer Serverbaum (optional immer im Vordergrund)
- Mehrere Nutzer gleichzeitig verschieben/kicken/bannen/beschreiben
- Mehrere Channel gleichzeitig erstellen
- Channel als Vorlage für weitere verwenden
- Mehrere Channel gleichzeitig bearbeiten
- Nachrichten an mehrere Nutzer/Channel gleichzeitig senden
- Rechte mehrerer Nutzer/Channel gleichzeitig bearbeiten
- Dateien zwischen Channeln verschieben
- Bildvorschau ohne Download (bmp, gif, jpg, png, pbm, pgm, ppm, xbm, xpm)
- Upload/Download ganzer Ordnerstrukturen
- Nutzer zu Gruppen hinzufügen durch Namenseingabe
- Funktionierende Rechteübersicht mit Echtzeitbearbeitung
- Rechte zwischen Servern/Instanzen kopieren
- Rechtewerte und -powers vergleichen
- Alle Clients/Gruppen mit einem bestimmten Recht finden
- Mehrere Gruppen gleichzeitig bearbeiten
- Verbesserte Clientdatenbank mit mehr Details und Suchfunktionen
- Gesamte Clientdatenbank mit einem Klick herunterladen
- Clientdatenbank als HTML oder CSV exportieren
- Gebannte Nutzer und IP-teilende Profile hervorheben
- Log an beliebiger Stelle lesen
- User CustomInfo verwalten (suchen, anzeigen, bearbeiten, hinzufügen)
- Log als HTML oder TXT exportieren
- Avatare und Icons herunterladen
- Avatar-Besitzer auf dem Server identifizieren
- Servervorlage verwalten
- Uploads/Downloads überwachen
### Unterstützte Bildformate
| Format | Beschreibung |
|--------|-------------|
| bmp | Windows Bitmap |
| gif | Graphics Interchange Format |
| jpg/jpeg | Joint Photographic Experts Group |
| png | Portable Network Graphics |
| pbm | Portable Bitmap (ASCII und binär) |
| pgm | Portable Graymap (ASCII und binär) |
| ppm | Portable Pixmap (ASCII und binär) |
| xbm | X BitMap |
| xpm | X PixMap |
---
## Architektur / Funktionsweise
### Verbindungsmethoden
- **Raw TCP/Telnet:** Standard-Query-Verbindung (Standardport 10011)
- **YaTQA-SSH-Tunnel:** Über Plink (PuTTY-Suite) — verschlüsselt, schneller, IP verborgen
- **TeamSpeak SSH:** Natives TS3.3+-SSH (auch unterstützt, aber weniger Vorteile)
### Datenspeicherung
- **Portable Modus:** Alle Daten im Installationsverzeichnis (`yatqa.ini` vorhanden)
- **Standardmodus:** Einige Dateien in `%APPDATA%\YaTQA`
- **Icon-Cache:** 16-Bit-RES-Format (`icons.res`)
- **Befehlsverlauf:** `commandhistory.txt`
- **Debug-Log:** `RedeemerTS3.log` (erstellt mit `-debug`-Schalter)
### DNS-Auflösung
YaTQA simuliert die Auflösungsschritte des TeamSpeak-Clients und zeigt sie visuell an. Verwendet Googles DNS-Server für Zuverlässigkeit. Unterstützt:
- A- und CNAME-Einträge
- SRV-Einträge
- TSDNS-Auflösung
- Alle 10 verschiedenen Client-Version-DNS-Verhaltensweisen
### Snapshot-System
- Snapshots enthalten alle Servereinstellungen (außer Port und Server-ID)
- Snapshots enthalten KEINE Dateien, Icons oder Avatare
- Datei-Backups enthalten Dateien und Icons (keine Avatare wegen Serverbeschränkungen)
- Pseudo-Snapshots ermöglichen Serverkopien ohne Keypair
- Unterstützt Zstd-komprimierte Snapshots (3.10.0+-Format)
### Anti-Flood-Schutz
- Konfigurierbare „Befehle bis Flood"-Einstellung (empfohlen: ~20)
- Konfigurierbare Verzögerung zwischen Befehlen (empfohlen: 340ms für fremde Server)
- SSH-Verbindungen umgehen Flood-Beschränkungen (127.0.0.1 auf Whitelist)
---
## Konfiguration
### Anwendungseinstellungen
| Einstellung | Beschreibung |
|------------|-------------|
| Verbesserte XP-Unicode-Anzeige | Verwendet Arial Unicode MS für bessere CJK-Unterstützung |
| Daten bei Tabwechsel aktualisieren | Automatisch Daten aktualisieren |
| Lokale Zeit verwenden | Lokale Zeit statt UTC |
| Verbesserte Channel-Dropdowns | Baumansicht für Unterchannel |
| In den Tray minimieren | Minimieren in den Systemtray |
| Tray-Icon immer anzeigen | Permanent anzeigen |
| Icon-Caching aktivieren | Icons in `icons.res` cachen (empfohlen) |
| Keine Icons verwenden | Icon-Anzeige deaktivieren |
| Windows Aero verwenden | Aero-Design nutzen (Vista+) |
| Aero-Glow deaktivieren | Weißen Schatten hinter Menütext entfernen |
| Beim Start nach Updates suchen | Automatisch nach Updates suchen |
| Sortiereinstellungen speichern | Sortierpräferenzen merken |
| Sprunglisten aktivieren | Windows 7+-Sprunglisten-Integration |
### Kompatibilitätseinstellungen
| Einstellung | Beschreibung |
|------------|-------------|
| Befehle bis Flood | Verzögerung zwischen Befehlen (340 empfohlen für fremde Server) |
| Nicht-Standard-Query-Port erlauben | Verbindung zu anderen Ports als 10011 |
| Löschen wichtiger Gruppen erlauben | Löschen der ersten 5 Server-/4 Channelgruppen erlauben |
| Verlassen wichtiger Gruppen erlauben | serveradmin darf Admin Server Query verlassen |
| Machine-ID ändern erlauben | Änderung der Machine-ID ermöglichen |
### SSH-Tunnel-Profile
SSH-Profile für Server konfigurieren. Bei Verbindung zu einem Server mit passendem SSH-Profil verwendet YaTQA automatisch den Tunnel.
### Kreisdiagramm-Styles
Auswahl aus 4 verschiedenen Kreisdiagramm-Styles (durch Benutzerabstimmung ausgewählt).
---
## Startparameter
| Parameter | Beschreibung |
|-----------|-------------|
| `-a` | Verbindung zum Standardserver |
| `-b [IP]` | Blacklist-Prüfung |
| `-c IP Query_Port [User Pass [Voice_Port]]` | Verbindung zum angegebenen Server |
| `-d` | DNS-Auflösung |
| `-i` | Iconsammlung |
| `-p` | Rechtedateien-Editor |
| `-s [IP]` | Benutzerstatistik |
| `-debug` | Debug-Logging aktivieren |
---
## Systemanforderungen
### Mindestanforderungen
- **Betriebssystem:** Windows XP+ (Desktop), Windows 2012+ (Server)
- **Speicher:** 3 MB für YaTQA (mehr für Konfiguration/Snapshots)
- **Auflösung:** 960×720 (allgemein), 1024×720 (Serverbaum), 1024×768 (Konsole)
### Fehlende Funktionen unter Windows XP
- Geist-Modus
- Nameserver für DNS-Auflösung ändern
- Einklappbare DNS-Ergebnisse
- Einklappbare Gruppen im Servergruppenmodus der Benutzer-DB
### Fehlende Funktionen unter Windows Vista/XP
- Sprunglisten
### Wine/Linux-Einschränkungen
- Speicherlecks (Wine unterstützt kein Entfernen von Link-Labels)
- Auch unter XP fehlende Funktionen fehlen unter Wine
- Zusätzliche Einschränkungen: Keine Array-Gruppierung, keine DNS-Gruppierung, kein Servergruppenmodus in der Benutzer-DB
- Plink muss manuell installiert werden (Version 0.61+)
---
## Schlüsselkonzepte
### ServerQuery-Interface
Das TeamSpeak-3-ServerQuery-Interface ist ein textbasiertes Protokoll zur Serververwaltung. YaTQA kapselt diese Schnittstelle in einer GUI mit:
- Befehlsautovervollständigung
- Parameterhilfe
- Werteauswahl
- Ergebnisanalyse
### Virtueller Server
Ein virtueller Server ist eine unabhängige TeamSpeak-Serverinstanz, die auf einem einzelnen physischen Serverprozess läuft. Mehrere virtuelle Server können auf einer Instanz laufen.
### Instanz
Der Serverprozess, der einen oder mehrere virtuelle Server hostet. Verwaltet über den „serveradmin"-Account.
### Snapshot
Ein vollständiges Backup der Einstellungen eines virtuellen Servers (ohne Port und ID). Enthält keine Dateien, Icons oder Avatare.
### Pseudo-Snapshot
Ein vom Benutzer manipulierter Snapshot, der zum Kopieren von Servern ohne Beibehaltung des originalen Keypairs verwendet werden kann.
### Rechtesystem
TeamSpeak verwendet ein hierarchisches Rechtesystem mit:
- Servergruppen
- Channelgruppen
- Client-Rechte
- Rechte-Powers (Werte, die steuern, was gesetzt werden kann)
### Anti-Flood
TeamSpeak-Server begrenzen die Häufigkeit von Query-Befehlen. YaTQA bietet konfigurierbare Verzögerungen und „Befehle bis Flood"-Einstellungen, um Bans zu vermeiden.
### Blacklist / Blacklist2
TeamSpeak führt Blacklists gebannter IPs (Blacklist1) und Server-UIDs (Blacklist2).
### Abzeichen
Visuelle Indikatoren im TeamSpeak, die Benutzerstatus, Addon-Creator-Status usw. anzeigen. YaTQA kann Abzeichen konfigurieren.
### DNS-Auflösung
TeamSpeak-Clients lösen Serveradressen über mehrere Methoden auf: A-Einträge, CNAME, SRV-Einträge und TSDNS. YaTQA visualisiert diesen Prozess.
---
## Bekannte Einschränkungen
- **Channel-Passwörter:** YaTQA sendet grundsätzlich keine Channel-Passwörter. Erfordert `b_channel_join_ignore_password` und `b_ft_ignore_password`-Rechte.
- **Unicode:** Nur Basic Multilingual Plane (BMP) unterstützt (TeamSpeak-Einschränkung).
- **Integrierte DNS-Auflösung:** Nur A- und CNAME-Einträge (TSDNS und SRV im integrierten Resolver nicht unterstützt).
- **Geist-Modus:** Viele Funktionen funktionieren nicht; Geist hat nur Query-Gast-Rechte.
- **Konsole:** Nur die üblichen Einschränkungen des TS3-Servers.
---
## IPv6-Unterstützung
Eckige Klammern `[]` um die Serveradresse schreiben. Unterstützt seit v1.4/2.0-pre für Query-Verbindungen. IPv4-Tunnel (z.B. `[::ffff:7f00:1]`) werden nicht unterstützt.
---
## Projekthistorie
- **10.04.2011:** Entwicklungsbeginn (ursprünglich „TS3Telnet" genannt)
- **29.06.2011:** Erste Alpha-Version veröffentlicht
- **18.04.2014:** v2.0 führte Registrierungserfordernis für einige Funktionen ein
- **22.08.2019:** YaTQA wieder uneingeschränkt Freeware
- **01.03.2023:** v3.9.9b veröffentlicht (Zeitlimit dauerhaft entfernt)
### Namensherkunft
„Yet Another TeamSpeak³ Query App" — benannt, weil es beim Entwicklungsbeginn bereits viele Query-Tools gab, aber keines auf dem Rechner des Autors funktionierte.
### Aussprache
[jatka] in IPA-Lautschrift — auch als deutsches Wort aussprechbar.
---
## Globale Tastenkürzel
| Kürzel | Aktion |
|--------|--------|
| Strg+F | Filtern (Rechte, Log) oder Suchen |
| Strg+Alt+F | In Listen suchen |
| F3 | Weiter suchen |
| Strg+A | Alles auswählen |
| Strg+C | Kopieren oder ausgewählte Daten speichern |
| Strg+Alt+A | Spalten automatisch anpassen |
| F2 | Umbenennen |
| F5 | Tab aktualisieren |
| NUM + | Ausgewählte Checkbox-Elemente aktivieren |
| NUM - | Ausgewählte Checkbox-Elemente deaktivieren |
| Strg+Leertaste | Parameterwert auswählen (Konsole) |
| Strg+E | Ausgewählten Text escapen (Konsole) |
| Strg+S | Diagramm als Bild speichern |
---
## Ressourcen
- **Website:** https://yat.qa/
- **Download:** https://dl.yat.qa/stable/
- **Funktionen:** https://yat.qa/funktionen/
- **Anleitung:** https://yat.qa/manual/ (nur Englisch)
- **Changelog:** https://yat.qa/changelog/ (nur Englisch)
- **FAQ:** https://yat.qa/haeufige-fragen/
- **Support:** https://yat.qa/unterstuetzung/
- **Ressourcen:** https://yat.qa/ressourcen/
- **Über:** https://yat.qa/ueber/
---
## Übersetzung
YaTQAs Originalsprache ist Deutsch. Die Übersetzung erfolgt mit OmegaT und XLIFF-Dateien. Den Autor vorher kontaktieren. Das Übersetzungssystem verwendet:
- `%s` — Zeichenketten-Platzhalter
- `%d` — Dezimalzahl-Platzhalter
- `&` — Tastenkürzel
- `&&` — Tatsächliches Kaufmanns-Und
- `|` — Senkrechter Strich (Hinweistext-Trennzeichen)
- `\r\n` — Neue Zeile
- `\t` — Tabulator
+348
View File
@@ -0,0 +1,348 @@
# YaTQA Knowledge Base (English)
> Source: https://yat.qa/ — Last fetched: 2026-06-13
> Version: v3.9.9b (01 Mar 2023)
## Overview
**YaTQA** (Yet Another TeamSpeak³ Query Admin Tool) is a Windows application for managing **TeamSpeak 3 servers and instances** using the ServerQuery interface. It provides a graphical interface to all query commands, eliminating the need to learn raw query syntax.
- **Author:** Janni "Яedeemer" K. (northern Germany)
- **Language:** Written in Delphi 2009 (50,000+ lines of code)
- **Development started:** April 10, 2011
- **First release:** June 29, 2011
- **License:** Free and fully functional freeware (no adware/spyware)
- **Platforms:** Windows XP and up, Linux via Wine
- **Size:** ~1.3 MiB installer
- **Languages included:** English and German (selectable during installation)
- **Supported servers:** TeamSpeak 3.9.0 through 3.13.7, TeaSpeak 1.4.10-beta
- **Download:** https://dl.yat.qa/stable/
- **Website:** https://yat.qa/
### Key Tagline
*"Dinosaurs weren't using TeamSpeak and wiped about 66 million years ago. Coincidence? I think not."*
---
## Features
**YaTQA supports ALL ServerQuery features with no exceptions.** The feature list below focuses on capabilities beyond what the standard TS3 client offers.
### General Features (No Admin Required)
- **DNS Resolver:** Detailed DNS lookup visualization simulating TeamSpeak client behavior (10 different client version lookups)
- **Blacklist Check:** Check TeamSpeak's blacklist for any IP
- **Blacklist2:** Check TeamSpeak's blacklist2 for virtual servers from an instance's server list
- **User Graph:** View server statistics from Planet TeamSpeak as a chart, save as PNG image
- **Client Cache:** Find avatars, icons, and chat logs in your client cache
### Console (Query Interface)
- **Autocomplete:** Command completion including undocumented commands
- **Parameter Help:** Displays every command's parameters based on extensive research
- **Parameter Value Selection:** Press Ctrl+Space to select values from a list
- **Result Analysis:** Groups datasets and explains most values
- **Scripting:** Load and execute command lists from files
- **Events:** Subscribe to server events and log them in the console
### SSH Tunnel
- **Encryption:** Fully encrypted connection (except file transfers)
- **Speed:** Notably faster on most servers (similar to `tcp_nodelay`)
- **Privacy:** Always hides your IP (you appear as 127.0.0.1)
- **Flood Bypass:** Circumvents all flood restrictions (127.0.0.1 is usually whitelisted)
### Instance Features (Requires serveradmin)
- View/edit instance settings and stats
- View license details and IP bindings
- See all virtual servers
- Add local notes to servers (stored locally)
- Start/stop/create/delete/rename virtual servers
- Become invisible (server bug, may be fixed)
- Send message to all servers
- Create/mass-create/deploy snapshots (including file-inclusive snapshots)
- Deploy manipulated snapshots
- Copy servers using snapshots
- Reset permissions to template groups
- Save/restore channel file backups (incremental backup supported)
### Virtual Server Features
- Ignore host message modal quit and high security level
- Very detailed virtual server statistics
- Edit multiple servers at once
- Collapsible server tree (optionally topmost)
- Move/kick/ban/describe multiple users at once
- Create multiple channels at once
- Use channel as template for other channels
- Edit multiple channels at once
- Send messages to multiple users/channels at once
- Edit permissions of multiple users/channels at once
- Move files between channels
- Image preview without download (bmp, gif, jpg, png, pbm, pgm, ppm, xbm, xpm)
- Upload/download entire folder structures
- Add users to groups by entering names
- Working permission overview with realtime editing
- Copy permissions between servers/instances
- Compare permission values and powers
- Find all clients/groups with a certain permission
- Edit multiple groups at once
- Enhanced client database with more details and search features
- Download full client database with one click
- Export client database to HTML or CSV
- Highlight banned users and IP-sharing profiles
- Browse log from any position
- Manage user custominfo (search, view, edit, add)
- Export log to HTML or TXT
- Download icons and avatars
- Identify avatar owners on your server
- Manage server template
- Monitor uploads/downloads
### Supported Image Formats
| Format | Description |
|--------|-------------|
| bmp | Windows Bitmap |
| gif | Graphics Interchange Format |
| jpg/jpeg | Joint Photographic Experts Group |
| png | Portable Network Graphics |
| pbm | Portable Bitmap (ASCII and binary) |
| pgm | Portable Graymap (ASCII and binary) |
| ppm | Portable Pixmap (ASCII and binary) |
| xbm | X BitMap |
| xpm | X PixMap |
---
## Architecture / How It Works
### Connection Methods
- **Raw TCP/Telnet:** Standard query connection (default port 10011)
- **YaTQA SSH Tunnel:** Via Plink (PuTTY suite) — encrypted, faster, hides IP
- **TeamSpeak SSH:** Native TS3.3+ SSH support (also supported but fewer advantages)
### Data Storage
- **Portable Mode:** All data in installation directory (`yatqa.ini` present)
- **Standard Mode:** Some files stored in `%APPDATA%\YaTQA`
- **Icon Cache:** 16-bit RES format (`icons.res`)
- **Command History:** `commandhistory.txt`
- **Debug Log:** `RedeemerTS3.log` (created with `-debug` switch)
### DNS Resolution
YaTQA simulates lookup steps done by TeamSpeak and displays them visually. Uses Google's DNS servers for reliability. Supports:
- A and CNAME records
- SRV records
- TSDNS lookups
- All 10 different client version DNS behaviors
### Snapshot System
- Snapshots contain all server settings (except port and virtual server ID)
- Snapshots do NOT include files, icons, or avatars
- File backups include files and icons (not avatars due to server limitations)
- Pseudo snapshots allow server copying without keypair
- Supports Zstd-compressed snapshots (3.10.0+ format)
### Anti-Flood Protection
- Configurable "Commands to Flood" setting (recommended: ~20)
- Configurable delay between commands (recommended: 340ms for non-own servers)
- SSH connections bypass flood restrictions (127.0.0.1 whitelisted)
---
## Configuration
### Application Settings
| Setting | Description |
|---------|-------------|
| Improved XP Unicode display | Uses Arial Unicode MS for better CJK support |
| Refresh on tab change | Auto-refresh data when switching tabs |
| Use local time | Local time instead of UTC |
| Improved channel dropdowns | Tree view lines for sub-channels |
| Minimize to tray | Minimize to system tray |
| Always show tray icon | Persistent tray icon |
| Enable icon caching | Cache icons in `icons.res` (recommended) |
| Don't use icons globally | Disable icon display |
| Try Windows Aero | Use Aero theme (Vista+) |
| Disable Aero glow | Remove white shadow behind menu text |
| Search for updates on start | Auto-check for updates |
| Save sort settings | Remember sort preferences |
| Enable jump lists | Windows 7+ jump list integration |
### Compatibility Settings
| Setting | Description |
|---------|-------------|
| Commands to flood | Delay between commands (340 recommended for remote servers) |
| Allow non-default query port | Connect to ports other than 10011 |
| Allow deleting important groups | Enable deletion of first 5 server/4 channel groups |
| Allow leaving important groups | Allow serveradmin to leave Admin Server Query |
| Allow changing machine ID | Enable machine ID modification |
### SSH Tunnel Profiles
Configure SSH profiles for servers. When connecting to a server with a matching SSH profile, YaTQA automatically uses the tunnel.
### Pie Chart Styles
Choose from 4 different pie chart styles (selected by user voting).
---
## Startup Parameters
| Parameter | Description |
|-----------|-------------|
| `-a` | Connect to default server |
| `-b [IP]` | Blacklist check |
| `-c IP Query_Port [User Pass [Voice_Port]]` | Connect to specified server |
| `-d` | DNS lookup |
| `-i` | Icon collection |
| `-p` | Permission editor |
| `-s [IP]` | User statistics |
| `-debug` | Enable debug logging |
---
## System Requirements
### Minimum Requirements
- **OS:** Windows XP+ (desktop), Windows 2012+ (server)
- **Disk:** 3 MB for YaTQA (more for configuration/snapshots)
- **Resolution:** 960×720 (general), 1024×720 (server tree), 1024×768 (console)
### Features Missing on Windows XP
- Ghost Mode
- Nameserver for DNS lookups
- DNS lookup group folding
- Folding server groups in user DB server group mode
### Features Missing on Windows Vista/XP
- Jump lists
### Wine/Linux Limitations
- Memory leaks (Wine doesn't support removing link labels)
- Features missing on XP also missing on Wine
- Additional limitations: no array property grouping, no DNS grouping, no server group mode in user DB
- Plink must be installed manually (version 0.61+)
---
## Key Concepts
### ServerQuery Interface
The TeamSpeak 3 ServerQuery interface is a text-based protocol for managing TeamSpeak servers. YaTQA wraps this interface in a GUI, providing:
- Command autocompletion
- Parameter help
- Value selection
- Result analysis
### Virtual Server
A virtual server is an independent TeamSpeak server instance running on a single physical server process. Multiple virtual servers can run on one instance.
### Instance
The server process that hosts one or more virtual servers. Managed via the "serveradmin" account.
### Snapshot
A complete backup of a virtual server's settings (excluding port and ID). Does not include files, icons, or avatars.
### Pseudo Snapshot
A user-manipulated snapshot that can be used to copy servers without preserving the original keypair.
### Permissions System
TeamSpeak uses a hierarchical permission system with:
- Server groups
- Channel groups
- Client permissions
- Permission powers (values that control what can be set)
### Anti-Flood
TeamSpeak servers limit query command frequency. YaTQA provides configurable delays and "Commands to Flood" settings to avoid bans.
### Blacklist / Blacklist2
TeamSpeak maintains blacklists of banned IPs (Blacklist1) and server UIDs (Blacklist2).
### Badges
Visual indicators in TeamSpeak showing user status, addon creator status, etc. YaTQA can configure badges.
### DNS Resolution
TeamSpeak clients resolve server addresses through multiple methods: A records, CNAME, SRV records, and TSDNS. YaTQA visualizes this process.
---
## Known Limitations
- **Channel passwords:** YaTQA never sends channel passwords. Requires `b_channel_join_ignore_password` and `b_ft_ignore_password` permissions.
- **Unicode:** Only Basic Multilingual Plane (BMP) supported (TeamSpeak limitation).
- **Integrated DNS lookups:** Only A and CNAME records (TSDNS and SRV unsupported in built-in resolver).
- **Ghost mode:** Many features don't work; ghost has Query Guest permissions.
- **Console:** Only limitations from TS3 server apply.
---
## IPv6 Support
Use square brackets `[]` around the server address. Supported since v1.4/2.0-pre for query connections. IPv4 tunnels (e.g., `[::ffff:7f00:1]`) are not supported.
---
## Project History
- **2011-04-10:** Development started (originally named "TS3Telnet")
- **2011-06-29:** First alpha version released
- **2014-04-18:** v2.0 introduced registration requirement for some features
- **2019-08-22:** YaTQA became unlimited freeware again
- **2023-03-01:** v3.9.9b released (removed time limit permanently)
### Naming
"Yet Another TeamSpeak³ Query App" — named because there were already many query tools when development started, but none worked for the author.
### Pronunciation
[jatka] in IPA notation — also suitable for German speakers.
---
## Global Hotkeys
| Shortcut | Action |
|----------|--------|
| Ctrl+F | Filter (permissions, log) or find |
| Ctrl+Alt+F | Find in lists |
| F3 | Find next |
| Ctrl+A | Select all |
| Ctrl+C | Copy or save selected data |
| Ctrl+Alt+A | Auto-adjust columns |
| F2 | Rename |
| F5 | Refresh tab |
| NUM + | Check selected checkbox items |
| NUM - | Uncheck selected checkbox items |
| Ctrl+Space | Select parameter value (console) |
| Ctrl+E | Escape selected text (console) |
| Ctrl+S | Save chart as image |
---
## Resources
- **Website:** https://yat.qa/
- **Download:** https://dl.yat.qa/stable/
- **Features:** https://yat.qa/features/
- **Manual:** https://yat.qa/manual/
- **Changelog:** https://yat.qa/changelog/
- **FAQ:** https://yat.qa/faq/
- **Support:** https://yat.qa/support/
- **Resources:** https://yat.qa/resources/
- **About:** https://yat.qa/about/
---
## Translation
YaTQA's original language is German. Translation is done using OmegaT with XLIFF files. Contact the author before translating. The translation system uses:
- `%s` — String placeholder
- `%d` — Decimal number placeholder
- `&` — Shortcut key
- `&&` — Actual ampersand
- `|` — Vertical line (hint text separator)
- `\r\n` — New line
- `\t` — Tab
@@ -0,0 +1,608 @@
# Chanora Function Inventory
> Auto-generated comprehensive inventory of all public APIs across 10 Rust crates and 50+ Dart files.
## Summary Statistics
| Category | Count |
|----------|-------|
| **Rust Crates** | 10 |
| **Rust pub fn** | ~180 |
| **Rust pub struct** | ~90 |
| **Rust pub enum** | ~50 |
| **Rust pub trait** | 6 |
| **Rust pub const** | ~30 |
| **Dart files** | 56 |
| **Dart public classes** | ~80 |
| **TODO/FIXME comments** | 15 |
| **Empty/commented stubs** | 0 |
---
## Rust Crates
### 1. `chanora_cache` — Content-Addressed Blob Cache
Disposable blob cache for avatar/icon files. Wraps `cacache` for crash safety.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `BlobCache` | lib.rs:30 | Content-addressed blob cache backed by cacache |
| enum | `BlobCacheError` | lib.rs:20 | Errors raised by blob cache (Io, InvalidKey) |
| const | `PREFIX_AVATAR` | lib.rs:37 | Avatar blob prefix `"av_"` |
| const | `PREFIX_ICON` | lib.rs:39 | Icon blob prefix `"ic_"` |
| fn | `BlobCache::new` | lib.rs:46 | Create/open cache rooted at `cache_dir/chanora/` |
| fn | `BlobCache::put` | lib.rs:63 | Store a blob with prefix+key |
| fn | `BlobCache::get` | lib.rs:80 | Read a blob (returns None if missing) |
| fn | `BlobCache::remove` | lib.rs:101 | Delete a specific blob |
| fn | `BlobCache::clear` | lib.rs:111 | Delete all blobs |
| fn | `BlobCache::total_size` | lib.rs:129 | Return total bytes used |
| fn | `BlobCache::evict` | lib.rs:154 | Evict oldest entries until under max_bytes |
**Dead code:** None found. All public items consumed by `chanora_core`.
---
### 2. `chanora_protocol` — TeamSpeak Protocol Adapter
Isolates `tsclientlib` behind a typed boundary. No upstream types leak.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `ConnectConfig` | adapter.rs:146 | Typed connection parameters |
| struct | `ProtocolClient` | adapter.rs:236 | Async handle owning live protocol connection |
| struct | `InboundVoice` | adapter.rs:260 | One inbound voice packet from remote client |
| struct | `SnapshotProbe` | adapter.rs:270 | Clone-free probe handle for watchdog |
| struct | `ChannelInfo` | dto.rs:19 | One channel in server tree |
| struct | `ClientInfo` | dto.rs:72 | One connected client |
| struct | `ClientProfile` | dto.rs:96 | Rich profile + live connection details |
| struct | `ServerSnapshot` | dto.rs:153 | Full server state snapshot |
| struct | `ChatMessage` | dto.rs:50 | In-channel text message |
| struct | `ServerActivity` | dto.rs:65 | Server-activity notification |
| struct | `ChannelId` | dto.rs:11 | Opaque channel identifier (u64 newtype) |
| struct | `ClientId` | dto.rs:15 | Opaque client identifier (u64 newtype) |
| struct | `PokeLimiter` | poke_limiter.rs:19 | Per-connection poke rate limiter |
| enum | `ProtocolError` | lib.rs:62 | Typed error catalogue (9 variants) |
| enum | `ProtocolDelta` | dto.rs:183 | Incremental state changes (7 variants) |
| enum | `DisconnectReason` | adapter.rs:225 | Why protocol task ended |
| enum | `MessageTarget` | dto.rs:37 | Text message target scope |
| enum | `PokeStrength` | poke_limiter.rs:8 | Poke notification strength |
| trait | *(re-exports)* | lib.rs:52 | `AudioData`, `CodecType`, `Direction`, `InAudioBuf`, `OutAudio`, `OutPacket` |
| fn | `ProtocolClient::generate_identity` | adapter.rs:296 | Generate fresh TS3 identity string |
| fn | `ProtocolClient::connect` | adapter.rs:304 | Dial server, wait for initial snapshot |
| fn | `ProtocolClient::snapshot` | adapter.rs:354 | Read typed server state snapshot |
| fn | `ProtocolClient::client_profile` | adapter.rs:365 | Fetch rich client profile |
| fn | `ProtocolClient::download_avatar` | adapter.rs:389 | Download avatar bytes by UID |
| fn | `ProtocolClient::download_icon` | adapter.rs:394 | Download icon bytes by ID |
| fn | `ProtocolClient::disconnect` | adapter.rs:399 | Clean disconnect |
| fn | `ProtocolClient::move_to_channel` | adapter.rs:421 | Move self to channel |
| fn | `ProtocolClient::queue_move_to_channel` | adapter.rs:442 | Fire-and-forget move |
| fn | `ProtocolClient::set_muted` | adapter.rs:458 | Update own mute state |
| fn | `ProtocolClient::voice_out` | adapter.rs:477 | Get outbound voice sender |
| fn | `ProtocolClient::snapshot_probe` | adapter.rs:485 | Get watchdog probe handle |
| fn | `ProtocolClient::take_voice_in` | adapter.rs:493 | Take inbound voice receiver |
| fn | `ProtocolClient::put_voice_in` | adapter.rs:503 | Put voice receiver back |
| fn | `ProtocolClient::take_loss_notifier` | adapter.rs:519 | Take disconnect notifier |
| fn | `ProtocolClient::take_chat_rx` | adapter.rs:525 | Take chat receiver |
| fn | `ProtocolClient::put_chat_rx` | adapter.rs:530 | Put chat receiver back |
| fn | `ProtocolClient::take_activity_rx` | adapter.rs:540 | Take activity receiver |
| fn | `ProtocolClient::put_activity_rx` | adapter.rs:545 | Put activity receiver back |
| fn | `ProtocolClient::take_delta_rx` | adapter.rs:556 | Take delta receiver |
| fn | `ProtocolClient::send_text_message` | adapter.rs:561 | Send text message |
| fn | `SnapshotProbe::probe` | adapter.rs:278 | Issue single snapshot RPC |
| fn | `PokeLimiter::new` | poke_limiter.rs:36 | Create limiter with 5-min window |
| fn | `PokeLimiter::record` | poke_limiter.rs:44 | Record poke, return strength |
| fn | `ChannelId::ROOT` | dto.rs:176 | Root channel constant |
**Dead code:** None found. All items consumed by `chanora_core`.
---
### 3. `chanora_bridge` — Flutter/Rust Bridge
Typed DTOs and commands for `flutter_rust_bridge` 2.x.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `BridgeChannel` | api.rs:404 | Channel DTO for Dart |
| struct | `BridgeClient` | api.rs:422 | Client DTO for Dart |
| struct | `BridgeClientProfile` | api.rs:445 | Rich profile DTO for Dart |
| struct | `BridgeSnapshot` | api.rs:502 | Server snapshot DTO for Dart |
| struct | `BridgeAudioStats` | api.rs:1034 | Audio engine statistics |
| struct | `BridgeAudioProcessingConfig` | api.rs:1112 | Audio processing config DTO |
| struct | `BridgeAudioProcessingStats` | api.rs:1143 | Audio processing stats DTO |
| struct | `BridgePttDescriptor` | api.rs:854 | PTT capability descriptor |
| struct | `BridgePttBinding` | api.rs:875 | PTT binding display state |
| enum | `BridgeError` | lib.rs:55 | Bridge-layer errors (8 variants) |
| enum | `BridgeTransmitMode` | api.rs:731 | Transmit mode mirror |
| enum | `BridgePttInputClass` | api.rs:843 | PTT input class |
| enum | `BridgeAudioRoute` | api.rs:1047 | Audio route class |
| enum | `BridgeIosVoiceProcessingMode` | api.rs:1064 | iOS voice processing mode |
| enum | `BridgeAudioBackend` | api.rs:1071 | Processing backend |
| enum | `BridgeVadBackend` | api.rs:1084 | VAD backend |
| enum | `BridgeEffectOwner` | api.rs:1097 | AEC/NS/AGC owner |
| fn | `bridge_init` | api.rs:220 | One-time process init (FRB init) |
| fn | `log_file_path_str` | api.rs:294 | Platform log file path |
| fn | `connect` | api.rs:601 | Connect to TS3 server |
| fn | `prefetch_server` | api.rs:636 | Warm DNS resolution |
| fn | `snapshot` | api.rs:645 | Re-fetch server snapshot |
| fn | `client_profile` | api.rs:654 | Fetch client profile |
| fn | `disconnect` | api.rs:663 | Disconnect from server |
| fn | `is_connected` | api.rs:672 | Check connection status |
| fn | `handle_route_change` | api.rs:687 | iOS route change handler |
| fn | `handle_media_services_reset_with_route` | api.rs:696 | iOS media reset handler |
| fn | `handle_interruption_began` | api.rs:703 | iOS interruption begin |
| fn | `handle_interruption_ended` | api.rs:709 | iOS interruption end |
| fn | `set_ptt` | api.rs:718 | Set PTT active state |
| fn | `voice_join` | api.rs:770 | Join voice channel |
| fn | `voice_leave` | api.rs:785 | Leave voice channel |
| fn | `set_transmit_mode` | api.rs:794 | Set transmit mode |
| fn | `get_transmit_mode` | api.rs:803 | Get transmit mode |
| fn | `set_release_tail_ms` | api.rs:814 | Set release tail |
| fn | `get_release_tail_ms` | api.rs:823 | Get release tail |
| fn | `set_hard_mute` | api.rs:832 | Engage/release hard mute |
| fn | `set_ptt_binding` | api.rs:907 | Update PTT binding |
| fn | `ptt_descriptor` | api.rs:925 | Get PTT descriptor |
| fn | `get_ptt_binding` | api.rs:941 | Get persisted PTT binding |
| fn | `move_to_channel` | api.rs:955 | Move self to channel |
| fn | `set_input_muted` | api.rs:971 | Toggle input mute |
| fn | `set_output_muted` | api.rs:983 | Toggle output mute |
| fn | `set_output_gain` | api.rs:994 | Set master output gain |
| fn | `set_client_volume` | api.rs:1006 | Set per-client volume |
| fn | `send_chat_message` | api.rs:1015 | Send text message |
| fn | `export_diagnostics` | api.rs:1392 | User-initiated diagnostic export |
**Dead code:** `publish_permission_state` is `#[cfg_attr(not(target_os = "android"), allow(dead_code))]` — intentional, only used on Android via JNI.
---
### 4. `chanora_storage` — Identity & Bookmark Storage
SQLite bookmarks + ChaCha20-Poly1305 encrypted identity file.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `IdentityFileStore` | lib.rs:176 | Encrypted identity file store |
| struct | `BookmarkRepository` | lib.rs:792 | SQLite-backed bookmark store |
| struct | `Bookmark` | lib.rs:767 | A persisted bookmark |
| struct | `PttBindingMeta` | lib.rs:117 | PTT binding metadata |
| enum | `StorageError` | lib.rs:59 | Storage errors (6 variants) |
| trait | `Crypto` | lib.rs:673 | Envelope encryption abstraction |
| const | `KEYRING_SERVICE` | lib.rs:190 | Keyring service name `"chanora"` |
| fn | `IdentityFileStore::new` | lib.rs:194 | Construct store at directory |
| fn | `IdentityFileStore::path` | lib.rs:211 | Get identity file path |
| fn | `IdentityFileStore::crypto` | lib.rs:384 | Get DekCrypto helper |
| fn | `IdentityFileStore::load` | lib.rs:390 | Read persisted identity |
| fn | `IdentityFileStore::save` | lib.rs:449 | Persist identity (encrypted) |
| fn | `IdentityFileStore::set_transmit_mode` | lib.rs:520 | Persist transmit mode |
| fn | `IdentityFileStore::get_transmit_mode` | lib.rs:528 | Read transmit mode |
| fn | `IdentityFileStore::set_release_tail_ms` | lib.rs:534 | Persist release tail |
| fn | `IdentityFileStore::get_release_tail_ms` | lib.rs:542 | Read release tail |
| fn | `IdentityFileStore::set_ptt_binding` | lib.rs:554 | Persist PTT binding |
| fn | `IdentityFileStore::get_ptt_binding` | lib.rs:568 | Read PTT binding |
| fn | `IdentityFileStore::clear` | lib.rs:579 | Remove persisted identity |
| fn | `BookmarkRepository::new` | lib.rs:801 | Open DB without encryption |
| fn | `BookmarkRepository::with_crypto` | lib.rs:807 | Open DB with password encryption |
| fn | `BookmarkRepository::encrypts_passwords` | lib.rs:858 | Check if encryption wired |
| fn | `BookmarkRepository::add` | lib.rs:865 | Insert bookmark |
| fn | `BookmarkRepository::upsert_or_add` | lib.rs:891 | Insert or update by host |
| fn | `BookmarkRepository::update` | lib.rs:935 | Replace existing bookmark |
| fn | `BookmarkRepository::delete` | lib.rs:963 | Delete bookmark by id |
| fn | `BookmarkRepository::list` | lib.rs:976 | List all bookmarks |
**Dead code:** None found.
---
### 5. `chanora_state` — Server State Mirror
Authoritative client-side mirror of server state with deterministic reducers.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `ServerState` | lib.rs:62 | Authoritative server state mirror |
| struct | `Reduction` | lib.rs:266 | Result of applying one event |
| struct | `ChannelJoinState` | channel_join.rs:53 | Channel-join reducer state |
| struct | `AuthoritativeMembership` | channel_join.rs:27 | Server-confirmed membership |
| struct | `JoinPending` | channel_join.rs:36 | Active pending join intent |
| struct | `ChannelJoinProjection` | channel_join.rs:135 | Reducer projection for UI |
| struct | `JoinOutcomeKey` | channel_join.rs:124 | Correlation key for outcomes |
| struct | `ConnectionEpoch` | channel_join.rs:15 | Per-connection epoch |
| struct | `JoinGeneration` | channel_join.rs:19 | Monotonic join generation |
| struct | `JoinRequestId` | channel_join.rs:23 | Protocol request identifier |
| struct | `ChannelId` (join) | channel_join.rs:11 | Channel identifier at reducer seam |
| enum | `ConnectionState` | lib.rs:43 | Connection lifecycle (5 variants) |
| enum | `Delta` | lib.rs:209 | State changes for bridge (8 variants) |
| enum | `StateEvent` | lib.rs:237 | Events flowing into reducer (9 variants) |
| enum | `StateError` | lib.rs:32 | State errors (2 variants) |
| enum | `ChannelJoinEvent` | channel_join.rs:165 | Channel-join events (10 variants) |
| enum | `ChannelJoinAction` | channel_join.rs:240 | Side-effect actions (7 variants) |
| enum | `ChannelJoinSyncState` | channel_join.rs:101 | Sync readiness (2 variants) |
| enum | `SyncReason` | channel_join.rs:115 | Sync reason (2 variants) |
| enum | `JoinReduceStatus` | channel_join.rs:309 | Transition status (9 variants) |
| enum | `JoinIntentRejected` | channel_join.rs:332 | Rejection reasons (2 variants) |
| enum | `JoinFailureKind` | channel_join.rs:341 | Failure kinds (5 variants) |
| enum | `JoinErrorCode` | channel_join.rs:356 | Stable error codes (11 variants) |
| enum | `JoinDiagnosticKey` | channel_join.rs:284 | Diagnostic event keys (10 variants) |
| enum | `AuthoritativeSource` | channel_join.rs:156 | Membership input source |
| fn | `ServerState::from_snapshot` | lib.rs:83 | Build from initial snapshot |
| fn | `ServerState::replace_from_snapshot` | lib.rs:114 | Replace with fresh snapshot |
| fn | `ServerState::channel` | lib.rs:119 | Look up channel by id |
| fn | `ServerState::client` | lib.rs:124 | Look up client by id |
| fn | `ServerState::channels` | lib.rs:130 | All channels iterator |
| fn | `ServerState::clients` | lib.rs:141 | All clients iterator |
| fn | `ServerState::channel_count` | lib.rs:148 | Number of channels |
| fn | `ServerState::client_count` | lib.rs:153 | Number of clients |
| fn | `ServerState::own_channel` | lib.rs:158 | Own client's channel |
| fn | `ServerState::clients_in_channel` | lib.rs:164 | Clients in specific channel |
| fn | `reduce` | lib.rs:281 | Apply StateEvent to state |
| fn | `reduce_reconnect_snapshot` | lib.rs:409 | Replace state after reconnect |
| fn | `channel_join::reduce` | channel_join.rs:393 | Channel-join event reducer |
| fn | `channel_join::project` | channel_join.rs:670 | Build channel-join projection |
| fn | `ChannelJoinState::new` | channel_join.rs:68 | Create join state for epoch |
**Dead code:** None found.
---
### 6. `chanora_audio` — Audio Subsystem
Platform capture/playback, Opus encoding, VAD, PTT, DSP.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| **Core Engine** | | | |
| struct | `AudioEngine` | engine.rs:289 | Main audio engine |
| struct | `AudioEngineConfig` | engine.rs:223 | Engine configuration |
| struct | `SessionAudioId` | engine.rs:69 | Stable audio session ID |
| struct | `AudioDeviceList` | engine.rs:87 | Available audio devices |
| struct | `AudioDeviceInfo` | engine.rs:96 | Single audio device info |
| enum | `AudioError` | lib.rs:100 | Audio subsystem errors (7 variants) |
| struct | `AudioEffects` | lib.rs:136 | AEC/AGC/NS/HPF toggles |
| fn | `list_audio_devices` | engine.rs:176 | Enumerate input/output devices |
| fn | `AudioEngine::start` | engine.rs:634 | Start audio engine |
| fn | `AudioEngine::start_with_gate` | engine.rs:647 | Start with transmit gate |
| fn | `AudioEngine::stop` | engine.rs:1358 | Stop audio engine |
| fn | `AudioEngine::set_transmit_active` | engine.rs:1601 | Set transmit state |
| fn | `AudioEngine::transmit_active` | engine.rs:1606 | Get transmit state |
| fn | `AudioEngine::set_output_muted` | engine.rs:1702 | Set output mute |
| fn | `AudioEngine::set_output_gain` | engine.rs:1714 | Set output gain |
| fn | `AudioEngine::set_client_volume` | engine.rs:1727 | Set per-client volume |
| fn | `AudioEngine::set_audio_processing_config` | engine.rs:1646 | Update processing config |
| fn | `AudioEngine::audio_processing_stats` | engine.rs:1683 | Get processing stats |
| **Frame Helpers** | | | |
| const | `SAMPLE_RATE_HZ` | frame.rs:9 | 48000 Hz |
| const | `FRAME_10MS_SAMPLES` | frame.rs:15 | 480 samples |
| const | `FRAME_20MS_SAMPLES` | frame.rs:17 | 960 samples |
| struct | `AudioFrame10ms` | frame.rs:21 | 10ms processing frame |
| struct | `AudioFrame20ms` | frame.rs:28 | 20ms network frame |
| fn | `i16_to_f32` | frame.rs:64 | PCM conversion |
| fn | `f32_to_i16` | frame.rs:69 | PCM conversion |
| fn | `dbfs` | frame.rs:74 | RMS dBFS calculation |
| **Transmit** | | | |
| enum | `TransmitMode` | transmit_mode.rs:13 | Ptt/Continuous/VoiceActivity |
| enum | `PermissionGate` | transmit_selector.rs:38 | Mic permission state |
| struct | `TransmitModeSelector` | transmit_selector.rs:88 | Multi-signal transmit selector |
| struct | `AudioTransmitGate` | ptt.rs:139 | Atomic transmit flag |
| struct | `ReleaseTailTimer` | release_tail.rs:43 | PTT release-tail timer |
| const | `DEFAULT_TAIL_MS` | release_tail.rs:24 | 200ms default |
| const | `MAX_TAIL_MS` | release_tail.rs:21 | 500ms max |
| **PTT** | | | |
| enum | `PttCapabilityLevel` | ptt.rs:34 | L0-L4 capability levels |
| struct | `PttBackendDescriptor` | ptt.rs:97 | Privacy-safe PTT descriptor |
| struct | `MissedKeyUpWatchdog` | ptt.rs:202 | PTT safety watchdog |
| trait | `DesktopPttBackend` | ptt_backends/mod.rs:162 | Platform PTT backend trait |
| struct | `PttBinding` | ptt_backends/mod.rs:48 | PTT binding metadata |
| enum | `PttInputClass` | ptt_backends/mod.rs:84 | None/Keyboard/MouseSideButton |
| enum | `PttBackendError` | ptt_backends/mod.rs:113 | PTT backend errors |
| fn | `select_ptt_backend` | ptt_backends/mod.rs:213 | Auto-select best backend |
| **Audio Processing** | | | |
| enum | `AudioRoute` | audio_processing.rs:14 | Route class (6 variants) |
| enum | `AudioBackend` | audio_processing.rs:65 | Processing backend (4 variants) |
| enum | `VadBackend` | audio_processing.rs:90 | VAD backend (4 variants) |
| enum | `EffectOwner` | audio_processing.rs:122 | Effect owner (5 variants) |
| enum | `IosVoiceProcessingMode` | audio_processing.rs:58 | iOS VPIO mode |
| struct | `AudioProcessingConfig` | audio_processing.rs:137 | Full processing config |
| struct | `AudioProcessingStats` | audio_processing.rs:270 | Processing statistics |
| struct | `SharedAudioProcessingStats` | audio_processing.rs:322 | Thread-safe stats |
| **DSP** | | | |
| struct | `Aec3` | processor/dsp/aec3.rs:48 | Acoustic echo canceller |
| struct | `Agc2` | processor/dsp/agc2.rs:206 | Automatic gain control |
| struct | `HighPassFilter` | processor/dsp/hpf.rs:42 | High-pass filter |
| struct | `NoiseSuppressor` | processor/dsp/ns.rs:40 | Noise suppressor |
| trait | `AudioProcessor` | processor/mod.rs:21 | Realtime processor trait |
| struct | `NoopProcessor` | processor/noop.rs:6 | No-op processor |
| struct | `PlatformVoiceProcessor` | processor/platform.rs:10 | Platform VPIO processor |
| struct | `SonoraProcessor` | processor/sonora.rs:88 | Sonora DSP processor |
| struct | `SonoraConfig` | processor/sonora.rs:37 | Sonora configuration |
| struct | `WebRtcApmProcessor` | processor/webrtc_apm.rs:91 | WebRTC APM processor |
| struct | `WebRtcApmConfig` | processor/webrtc_apm.rs:17 | WebRTC APM config |
| **VAD** | | | |
| trait | `VoiceActivityDetector` | vad/mod.rs:34 | VAD trait |
| struct | `VadOutput` | vad/mod.rs:26 | VAD output (probability + speech) |
| struct | `WebRtcFallbackVad` | vad/mod.rs:40 | WebRTC fallback VAD |
| struct | `Resampled16kHzVad` | vad/mod.rs:77 | 48→16kHz resampling wrapper |
| struct | `SileroOnnxVad` | vad/silero_onnx.rs:62 | Silero ONNX VAD |
| struct | `Downsampler48to16` | vad/resampler.rs:44 | 48→16kHz downsampler |
| fn | `set_silero_model_path` | vad/mod.rs:126 | Set VAD model path |
| fn | `silero_model_epoch` | vad/mod.rs:147 | Get model epoch |
| **Voice Activity** | | | |
| struct | `VoiceActivityStateMachine` | voice_activity.rs:29 | VAD gate state machine |
| **Mobile Backend** | | | |
| trait | `MobileVoiceAudioBackend` | mobile_voice_backend.rs:262 | Mobile audio backend trait |
| struct | `AndroidVoiceStreamConfig` | mobile_voice_backend.rs:194 | Android stream config |
| struct | `AndroidAudioDiagnostics` | mobile_voice_backend.rs:499 | Android diagnostics |
| enum | `BackendEvent` | mobile_voice_backend.rs:35 | Backend events |
| enum | `BackendError` | mobile_voice_backend.rs:154 | Backend errors |
| enum | `AchievedPerformanceMode` | mobile_voice_backend.rs:112 | Performance mode |
| enum | `LatencyTier` | mobile_voice_backend.rs:377 | Latency tier |
| struct | `AndroidVoiceUnit` | android_voice_unit.rs:565 | Android voice unit |
| struct | `IosVoiceUnit` | ios_voice_unit.rs:522 | iOS voice unit |
| **Route Policy** | | | |
| fn | `ios_route_policy` | route_policy.rs:27 | Route→config policy for iOS |
| fn | `apply_route_change` | route_policy.rs:105 | Apply route change |
| **Mode Stack** | | | |
| struct | `ModeStack` | mode_stack.rs:88 | Android audio mode refcount |
| enum | `ModeAcquire` | mode_stack.rs:41 | Acquire result |
| enum | `ModeRelease` | mode_stack.rs:62 | Release result |
| **Debug** | | | |
| struct | `WavDebugRecorder` | debug_wav.rs:68 | Debug WAV recorder |
**Dead code:** `AndroidVoiceUnit`, `IosVoiceUnit`, and platform-specific backends are `#[cfg]`-gated — intentional.
---
### 7. `chanora_resolver` — DNS/SRV/TSDNS Resolver
TeamSpeak address resolution: SRV, TSDNS, nick lookup.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `ChanoraResolver` | lib.rs:108 | Main resolver |
| struct | `Args` | lib.rs:26 | Resolution arguments |
| struct | `BuildInfo` | lib.rs:33 | Build metadata |
| struct | `SrvRecord` | lib.rs:40 | SRV record |
| struct | `ClientResolution` | lib.rs:58 | Client resolution result |
| enum | `Resolution` | lib.rs:85 | Resolution result (Dns/Srv/Nick) |
| enum | `ClientResolutionMethod` | lib.rs:48 | Resolution method (6 variants) |
| const | `DEFAULT_TEAMSPEAK_PORT` | lib.rs:23 | Port 9987 |
| fn | `build_info` | lib.rs:123 | Get build info |
| fn | `setup_log` | lib.rs:137 | Setup logging |
| fn | `ChanoraResolver::new` | lib.rs:157 | Create resolver |
| fn | `ChanoraResolver::resolve` | lib.rs:178 | Resolve with Args |
| fn | `ChanoraResolver::resolve_connection_address` | lib.rs:193 | Resolve to connection address |
| fn | `ChanoraResolver::resolve_client_address` | lib.rs:197 | Resolve client input to address |
| fn | `ChanoraResolver::resolve_client_request` | lib.rs:201 | Resolve with full metadata |
| fn | `ChanoraResolver::resolve_dns` | lib.rs:594 | DNS lookup |
| fn | `ChanoraResolver::resolve_ts3` | lib.rs:614 | TS3 SRV lookup |
| fn | `ChanoraResolver::resolve_tsdns` | lib.rs:619 | TSDNS SRV lookup |
| fn | `ChanoraResolver::resolve_nick` | lib.rs:624 | Nick lookup |
| fn | `normalize_args` | lib.rs:778 | Normalize Args |
| fn | `validate_args` | lib.rs:785 | Validate Args |
| fn | `run` | lib.rs:804 | CLI entry point |
**Dead code:** `run()` is a CLI entry point, not called from library code — intentional.
---
### 8. `chanora_prefetch` — Server Address Prefetch
Speculative DNS warming for faster connects.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `ServerPrefetcher` | lib.rs:83 | Prefetch cache + async resolver |
| enum | `ServerPrefetchError` | lib.rs:18 | Prefetch errors |
| fn | `ServerPrefetcher::new` | lib.rs:90 | Create prefetcher |
| fn | `ServerPrefetcher::prefetch` | lib.rs:99 | Schedule fire-and-forget prefetch |
| fn | `ServerPrefetcher::fresh_match` | lib.rs:145 | Check for cached result |
**Dead code:** None found.
---
### 9. `chanora_diagnostics` — Redaction & Diagnostic Export
Redaction policy, in-memory log sink, PTT sanitizer.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `Redactor` | lib.rs:121 | Production redaction policy |
| struct | `KnownSecretRegistry` | lib.rs:79 | Secret substring registry |
| struct | `InMemoryLogSink` | lib.rs:356 | Bounded redacted log sink |
| struct | `RedactingLogLayer` | lib.rs:440 | tracing Layer for redaction |
| struct | `PttSanitizer` | lib.rs:505 | PTT field ban Layer |
| struct | `DiagnosticExport` | lib.rs:614 | Export bundle |
| struct | `ProtocolEventRecorder` | lib.rs:714 | Protocol event ring buffer |
| enum | `DiagnosticsError` | lib.rs:51 | Diagnostics errors |
| const | `REDACTION_MARKER` | lib.rs:62 | `"[REDACTED]"` |
| const | `DEFAULT_LOG_CAPACITY` | lib.rs:67/70 | 256 (release) / 4096 (debug) |
| fn | `Redactor::with_default_policy` | lib.rs:128 | Create redactor |
| fn | `Redactor::with_secrets` | lib.rs:134 | Create with secret registry |
| fn | `Redactor::secrets` | lib.rs:140 | Access secret registry |
| fn | `Redactor::redact` | lib.rs:150 | Apply redaction policy |
| fn | `KnownSecretRegistry::register` | lib.rs:85 | Register secret |
| fn | `KnownSecretRegistry::len` | lib.rs:99 | Count secrets |
| fn | `KnownSecretRegistry::is_empty` | lib.rs:104 | Check empty |
| fn | `KnownSecretRegistry::contains_substr` | lib.rs:110 | Substring check |
| fn | `InMemoryLogSink::new` | lib.rs:365 | Create sink |
| fn | `InMemoryLogSink::snapshot` | lib.rs:377 | Snapshot lines |
| fn | `InMemoryLogSink::push` | lib.rs:386 | Push redacted line |
| fn | `InMemoryLogSink::redactor` | lib.rs:397 | Access redactor |
| fn | `RedactingLogLayer::new` | lib.rs:446 | Create layer |
| fn | `RedactingLogLayer::with_sanitizer` | lib.rs:452 | Wrap with PTT sanitizer |
| fn | `PttSanitizer::wrap` | lib.rs:513 | Wrap inner layer |
| fn | `DiagnosticExport::from_sink` | lib.rs:636 | Build export |
| fn | `DiagnosticExport::with_android_audio` | lib.rs:655 | Attach Android audio YAML |
| fn | `DiagnosticExport::with_network_info` | lib.rs:661 | Attach network info |
| fn | `DiagnosticExport::with_protocol_events` | lib.rs:667 | Attach protocol events |
| fn | `DiagnosticExport::to_text` | lib.rs:674 | Render as plaintext |
| fn | `ProtocolEventRecorder::new` | lib.rs:721 | Create recorder |
| fn | `ProtocolEventRecorder::record_connected` | lib.rs:740 | Record connection |
| fn | `ProtocolEventRecorder::record_disconnected` | lib.rs:745 | Record disconnect |
| fn | `ProtocolEventRecorder::record_reconnecting` | lib.rs:750 | Record reconnect |
| fn | `ProtocolEventRecorder::record_snapshot_changed` | lib.rs:759 | Record snapshot change |
| fn | `ProtocolEventRecorder::record_channel_join` | lib.rs:768 | Record channel join |
| fn | `ProtocolEventRecorder::record_lifecycle` | lib.rs:777 | Record lifecycle |
| fn | `ProtocolEventRecorder::drain` | lib.rs:782 | Drain all events |
| fn | `ProtocolEventRecorder::snapshot` | lib.rs:787 | Snapshot events |
**Dead code:** None found.
---
### 10. `chanora_core` — Top-Level Orchestration
Integration point composing all subsystems behind a stable API.
| Kind | Name | File:Line | Purpose |
|------|------|-----------|---------|
| struct | `ChanoraSession` | lib.rs:191 | Process-wide session handle |
| enum | `CoreError` | lib.rs:84 | Top-level errors (7 variants) |
| struct | `PttDescriptorSnapshot` | events.rs:6 | PTT descriptor snapshot |
| struct | `PersistedPttBinding` | events.rs:27 | Persisted PTT binding |
| struct | `PttController` | ptt.rs:68 | PTT controller |
| struct | `FileTransferService` | file_transfer.rs:39 | File transfer service |
| enum | `SessionEvent` | events.rs:49 | Session lifecycle events |
| enum | `VoiceJoinSyncState` | events.rs:239 | Voice join sync state |
| enum | `VoiceJoinErrorCode` | events.rs:250 | Voice join error codes |
| enum | `NetworkState` | events.rs:280 | Network connectivity state |
| enum | `FileTransferError` | file_transfer.rs:17 | File transfer errors |
| enum | `PttControllerError` | ptt.rs:35 | PTT controller errors |
| fn | `ChanoraSession::new` | lib.rs:245 | Create session |
| fn | `ChanoraSession::subscribe_events` | lib.rs:478 | Subscribe to session events |
| fn | `ChanoraSession::set_network_state` | lib.rs:460 | Set network state |
| fn | `ChanoraSession::network_state` | lib.rs:469 | Get network state |
| fn | `ChanoraSession::transmit_mode` | lib.rs:1568 | Get transmit mode |
| fn | `ChanoraSession::hard_mute` | lib.rs:1591 | Get hard mute state |
| fn | `ChanoraSession::release_tail_ms` | lib.rs:1645 | Get release tail |
| fn | `ChanoraSession::transmit_selector` | lib.rs:1652 | Get transmit selector |
| fn | `ChanoraSession::release_tail_timer` | lib.rs:1659 | Get release tail timer |
| fn | `ChanoraSession::audio_processing_stats_if_ready` | lib.rs:1205 | Get audio stats |
| fn | `PttController::new` | ptt.rs:103 | Create PTT controller |
| fn | `PttController::current_capability` | ptt.rs:226 | Get PTT capability |
| fn | `PttController::subscribe_capability` | ptt.rs:233 | Subscribe to capability |
| fn | `PttController::descriptor_watch` | ptt.rs:250 | Watch PTT descriptor |
| fn | `PttController::press_gate` | ptt.rs:257 | Get press gate |
| fn | `PttController::release_tail` | ptt.rs:263 | Get release tail |
**Dead code:** None found. All items consumed by `chanora_bridge`.
---
## Dart Files (apps/chanora_flutter/lib/)
### Widgets (31 files)
| Class | File:Line | Purpose |
|-------|-----------|---------|
| `AppSnackBar` | widgets/app_snack_bar.dart:9 | Snackbar notifications |
| `AppSnackBarVariant` | widgets/app_snack_bar.dart:6 | Neutral/success/warning/error |
| `AudioDebugStatsPanel` | widgets/audio_debug_stats_panel.dart:22 | Audio stats debug panel |
| `AudioDeviceListTile` | widgets/audio_device_list_tile.dart:21 | Audio device list item |
| `AudioDeviceKind` | widgets/audio_device_list_tile.dart:12 | Input/Output device kind |
| `AudioOutputTile` | widgets/audio_output_tile.dart:15 | Audio output route picker |
| `AudioProcessingConfigState` | widgets/audio_processing_config_state.dart:34 | Processing config state |
| `BbCodeText` | widgets/bbcode_text.dart:47 | BBCode renderer |
| `ChatPanel` | widgets/chat_panel.dart:13 | Chat panel container |
| `ChatEntry` | widgets/chat_views.dart:25 | Chat message entry |
| `ChatClientGroups` | widgets/chat_views.dart:374 | Client grouping for chat |
| `ChatPage` | widgets/chat_views.dart:548 | Full chat page |
| `ChatDetailView` | widgets/chat_views.dart:1070 | Chat detail view |
| `ClientInfoSheet` | widgets/client_info_sheet.dart:7 | Client info bottom sheet |
| `ConnectForm` | widgets/connect_widgets.dart:9 | Server connect form |
| `BookmarkList` | widgets/connect_widgets.dart:154 | Bookmark list |
| `CapturedBinding` | widgets/input_dialogs.dart:50 | PTT binding capture result |
| `BookmarkNameDialog` | widgets/input_dialogs.dart:61 | Bookmark name input |
| `ChannelPasswordDialog` | widgets/input_dialogs.dart:109 | Channel password input |
| `PttBindingCaptureDialog` | widgets/input_dialogs.dart:154 | PTT key binding dialog |
| `PermissionStateBanner` | widgets/permission_state_banner.dart:28 | Permission state banner |
| `PokeNotificationSettingsDialog` | widgets/poke_notification_settings.dart:7 | Poke notification settings |
| `PttCapabilityBadge` | widgets/ptt_capability_badge.dart:14 | PTT capability badge |
| `SnapshotView` | widgets/snapshot_view.dart:14 | Server tree view |
| `TalkPowerWarning` | widgets/talk_power_warning.dart:14 | Talk power warning |
| `VoiceBar` | widgets/voice_bar.dart:18 | Voice status bar |
| `VoiceStatusChip` | widgets/voice_compact.dart:46 | Voice status chip |
| `VoicePttButton` | widgets/voice_compact.dart:255 | PTT button widget |
| `VoiceLevelMeter` | widgets/voice_level_meter.dart:11 | Voice level meter |
| `VoiceSettingsDialog` | widgets/voice_settings.dart:61 | Voice settings dialog |
| `VoiceSettingsResult` | widgets/voice_settings.dart:46 | Settings result |
| `VoiceStatusSummary` | widgets/voice_status_summary.dart:5 | Voice status summary |
| `VoiceSubHeader` | widgets/voice_settings_controls.dart:117 | Voice sub-header |
| `VoiceSectionHeader` | widgets/voice_settings_controls.dart:141 | Voice section header |
| `AudioProcessingToggleRow` | widgets/voice_settings_controls.dart:159 | Processing toggle row |
### Services (20 files)
| Class/Function | File:Line | Purpose |
|----------------|-----------|---------|
| `AndroidAudioOutputDevice` | services/android_audio_output_devices.dart:1 | Android audio device |
| `AndroidPermissionsService` | services/android_permissions_service.dart:34 | Android permission handler |
| `AppBootstrap` | services/app_bootstrap.dart:95 | App bootstrap helpers |
| `AudioLifecycleService` | services/audio_lifecycle_service.dart:46 | Audio lifecycle wiring |
| `BackIntentPolicy` | services/back_intent_policy.dart | Back intent policy |
| `BackIntentService` | services/back_intent_service.dart:97 | Back intent handler |
| `ChannelJoinErrorMapper` | services/channel_join_error_mapper.dart:5 | Error message mapper |
| `ChannelSpacer` | services/channel_spacer.dart:110 | Spacer channel detection |
| `ConnectionPhaseState` | services/connection_phase_state.dart:38 | Connection phase state |
| `HardMuteOwners` | services/hard_mute_owners.dart | Hard mute owners |
| `IosAudioSessionController` | services/ios_audio_session_controller.dart | iOS audio session |
| `IosPermissionsService` | services/ios_permissions_service.dart:66 | iOS permission handler |
| `LinkTrustService` | services/link_trust_service.dart:29 | Link trust checker |
| `MacosPermissionsService` | services/macos_permissions_service.dart:273 | macOS permission handler |
| `PokePreferencesService` | services/poke_preferences_service.dart:44 | Poke mute preferences |
| `PokeNotificationService` | services/poke_notification_service.dart | Poke notification handler |
| `PrefetchDebouncer` | services/prefetch_debouncer.dart:15 | DNS prefetch debouncer |
| `SnapshotStateMapper` | services/snapshot_state_mapper.dart:43 | Snapshot→state mapper |
| `Ts3ServerLink` | services/ts3_server_link.dart:83 | TS3 server link parser |
| `UiPreferencesService` | services/ui_preferences_service.dart | UI preferences |
| `VoiceJoinOrdering` | services/voice_join_ordering.dart | Voice join ordering |
### Design (4 files)
| Class | File:Line | Purpose |
|-------|-----------|---------|
| `ChanoraTokens` | design/chanora_tokens.dart | Design tokens |
| `Breakpoints` | design/breakpoints.dart | Responsive breakpoints |
| `ViewportInfo` | design/viewport_info.dart | Viewport info |
| `PlatformCapabilities` | design/platform_capabilities.dart | Platform capabilities |
---
## Dead Code Analysis
### Confirmed Dead Code
None found. All public items are consumed by downstream crates or are intentionally platform-gated.
### Platform-Gated (Intentional)
- `AndroidVoiceUnit`, `IosVoiceUnit` — only compiled on target platforms
- `chanora_android_*` JNI functions — Android only
- `ios_voice_unit.rs`, `android_voice_unit.rs` — platform-specific
- `sdl_output.rs` — Linux only
### TODO/FIXME Items (15 total)
| File | Line | Note |
|------|------|------|
| `chanora_audio/src/audio_event_queue.rs` | 27 | Wire to client disconnect path |
| `chanora_audio/src/engine.rs` | 2348 | Realtime audio callback concern |
| `chanora_audio/src/mobile_voice_backend.rs` | 16 | Back-fill IosVoiceUnit to trait |
| `audio_lifecycle_service.dart` | 151 | Wire macOS default device change |
| `audio_lifecycle_service.dart` | 156 | macOS device change no action yet |
| `poke_notification_service.dart` | 33,35,41,43,48,130,132,142,155,168 | Future EventSoundService (10 items) |
### Useless Code
- No empty impls found
- No commented-out function bodies found
- No dead trait implementations found
---
## Architecture Notes
- **Boundary discipline**: `tsclientlib` types never cross `chanora_protocol` boundary (SAD-067)
- **Single connection**: DEC-006 enforces one connection at runtime
- **Secret isolation**: `chanora_storage` never stores secrets in plaintext DB
- **Deterministic reducers**: `chanora_state` reducers are pure functions (SRS-056)
- **PTT privacy**: Raw key codes never appear in logs or diagnostics (DEC-027)
- **Audio pipeline**: 48kHz mono, 20ms Opus frames, 10ms processing frames
@@ -0,0 +1,252 @@
# Link Coverage Report
**Generated:** 2026-06-13
**Scope:** All `.md` files in repository root and `docs/` tree
## Summary
- Total links checked: 148
- Valid internal links: 12 (4 markdown links + 8 inline doc-path references)
- Broken internal links: 2
- Valid inline doc-path references: 94
- Broken inline doc-path references: 5
- Valid code references: 62
- Broken code references: 2
- External links (manual review): 48
- Cross-references (doc→doc in prose): 0 broken
---
## Broken Internal Links
Markdown `[text](path)` style links that resolve to missing files.
| File | Line | Link Text | Target | Issue |
|------|------|-----------|--------|-------|
| README.md | 428 | `LICENSE-APACHE` | `LICENSE-APACHE` | File does not exist at repo root |
| README.md | 431 | `LICENSE-MIT` | `LICENSE-MIT` | File does not exist at repo root |
**Impact:** Users clicking the license links in the README will get a 404 on GitHub. These are referenced in the License section as the dual-license model files.
**Also affected by missing LICENSE files:**
| File | Line | Reference | Issue |
|------|------|-----------|-------|
| docs/security/license-inventory.md | 9 | `../../LICENSE-APACHE` | Resolves to missing `LICENSE-APACHE` at repo root |
| docs/security/license-inventory.md | 10 | `../../LICENSE-MIT` | Resolves to missing `LICENSE-MIT` at repo root |
| docs/security/flutter-license-inventory.md | 11 | `../../LICENSE-APACHE` | Resolves to missing `LICENSE-APACHE` at repo root |
| docs/security/flutter-license-inventory.md | 12 | `../../LICENSE-MIT` | Resolves to missing `LICENSE-MIT` at repo root |
---
## Valid Internal Links
| File | Line | Target |
|------|------|--------|
| README.md | 130 | `docs/architecture/desktop-ptt-architecture.md` |
| README.md | 436 | `docs/governance/product-decision-register.md` |
| README.md | 444 | `NOTICE` |
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 266 | `../ui-ux/adaptive-layout-platform-guide.md` |
---
## Inline Doc-Path References
References to documentation files using backtick-quoted paths (not markdown links).
### Valid
| File | Line | Reference |
|------|------|-----------|
| CONTRIBUTING.md | 25 | `docs/governance/git-commit-message-convention.md` |
| README.md | 144 | `docs/governance/product-decision-register.md` |
| README.md | 261271 | `docs/requirements/sysrs.md`, `docs/requirements/srs.md`, `docs/architecture/sysdes.md`, `docs/architecture/sad.md`, `docs/architecture/sdd.md`, `docs/verification/verification-master-plan.md`, `docs/release/release-readiness-go-nogo-record.md`, `docs/release/platform-release-policy.md`, `docs/governance/product-decision-register.md`, `docs/governance/traceability-matrix.md`, `docs/security/security-privacy-legal-guideline.md` |
| README.md | 312 | `docs/release/release-readiness-go-nogo-record.md` |
| README.md | 349355 | `docs/security/threat-model.md`, `docs/security/secure-storage-audit-report.md`, `docs/security/diagnostic-redaction-audit-report.md`, `docs/security/dependency-and-supply-chain-report.md`, `docs/privacy/privacy-policy.md`, `docs/legal/trademark-and-attribution-review.md` |
| README.md | 391 | `docs/governance/git-commit-message-convention.md` |
| README.md | 449451 | `docs/governance/product-decision-register.md`, `docs/security/dependency-and-supply-chain-report.md`, `docs/legal/trademark-and-attribution-review.md` |
| docs/architecture/sad.md | 6 | `docs/srs.md` |
| docs/architecture/sad.md | 7 | `docs/sysdes.md` |
| docs/architecture/sad.md | 176 | `docs/governance/traceability-matrix.md` |
| docs/architecture/sdd.md | 6 | `docs/architecture/sad.md` |
| docs/architecture/sdd.md | 7 | `docs/srs.md` |
| docs/architecture/sysdes.md | 6 | `docs/sysdes.md` (canonical pointer) |
| docs/architecture/desktop-ptt-architecture.md | 5 | `docs/architecture/sad.md`, `docs/architecture/sdd.md`, `docs/release/dv-waiver-register.md` |
| docs/architecture/file-transfer-design.md | 6 | `docs/architecture/sad.md` |
| docs/architecture/file-transfer-research.md | 5 | `docs/architecture/file-transfer-design.md` |
| docs/architecture/file-transfer-implementation-plan.md | 6 | `docs/architecture/file-transfer-design.md`, `docs/architecture/file-transfer-research.md` |
| docs/requirements/sysrs.md | 4 | `../sysrs.md` (canonical pointer) |
| docs/requirements/srs.md | 4 | `../srs.md` (canonical pointer) |
| docs/governance/document-index.md | 1432 | All listed document paths |
| docs/material3-guideline.md | 10 | `docs/ui-ux/material3-guideline.md` (self-referencing path record) |
| docs/ui-ux/material3-guideline.md | 6 | `docs/material3-guideline.md` (canonical pointer) |
| docs/superpowers/specs/2026-06-08-maintainability-continuation-design.md | 125141 | Multiple `docs/` paths |
| docs/superpowers/specs/2026-05-29-state-sync-ui-settings-validation-design.md | 5155 | Multiple `docs/` paths |
| docs/superpowers/plans/2026-05-29-finish-dv-document-tree.md | 1654 | Multiple `docs/` paths |
| docs/superpowers/plans/2026-05-29-swe2-swe3-baselines.md | 1635 | Multiple `docs/` paths |
| docs/superpowers/plans/2026-05-29-state-sync-ui-settings-validation.md | 8488 | Multiple `docs/` paths |
| docs/superpowers/plans/2026-05-29-dv-evidence-pack.md | 1654 | Multiple `docs/` paths |
| docs/superpowers/plans/2026-05-28-server-resolution-prefetch.md | 31836 | Multiple source file paths |
| docs/superpowers/plans/2026-05-28-chanora-server-prefetch-crate.md | 15541 | Multiple source file paths |
| docs/superpowers/plans/2026-06-06-chat-panel-switching.md | 58507 | Multiple source file paths |
| docs/superpowers/plans/2026-06-08-core-internal-split.md | 1691 | Multiple source file paths |
### Broken
| File | Line | Reference | Issue |
|------|------|-----------|-------|
| docs/sysrs.md | 126 | `docs/chanora_SysDes.md` | Does not exist (listed as "potential downstream file name") |
| docs/sysrs.md | 127 | `docs/chanora_SRS.md` | Does not exist (listed as "potential downstream file name") |
| docs/sysrs.md | 128 | `docs/chanora_SAD.md` | Does not exist (listed as "potential downstream file name") |
| docs/sysrs.md | 129 | `docs/chanora_SDD.md` | Does not exist (listed as "potential downstream file name") |
| docs/sysrs.md | 130 | `docs/chanora_Verification.md` | Does not exist (listed as "potential downstream file name") |
**Note:** These five are documented as "Potential downstream file names" in a table and are aspirational/historical. They are presented as code blocks in the original, so they function as suggestions rather than navigable links. Low severity.
---
## Code References
### Valid
| File | Line | Reference | Found At |
|------|------|-----------|----------|
| docs/architecture/sad.md | 41 | `apps/chanora_flutter/lib/main.dart` | EXISTS |
| docs/architecture/sad.md | 42 | `apps/chanora_flutter/lib/services/` | EXISTS |
| docs/architecture/sad.md | 43 | `apps/chanora_flutter/lib/widgets/` | EXISTS |
| docs/architecture/sad.md | 44 | `crates/chanora_bridge`, `apps/chanora_flutter/lib/src/rust/` | EXISTS |
| docs/architecture/sad.md | 45 | `core/chanora_core` | EXISTS |
| docs/architecture/sad.md | 46 | `crates/chanora_protocol` | EXISTS |
| docs/architecture/sad.md | 47 | `crates/chanora_state` | EXISTS |
| docs/architecture/sad.md | 48 | `crates/chanora_audio` | EXISTS |
| docs/architecture/sad.md | 49 | `crates/chanora_storage` | EXISTS |
| docs/architecture/sad.md | 50 | `crates/chanora_diagnostics` | EXISTS |
| docs/architecture/sad.md | 51 | `crates/chanora_resolver` | EXISTS |
| docs/architecture/sad.md | 52 | `crates/chanora_prefetch`, Flutter `prefetch_debouncer.dart` | EXISTS |
| docs/architecture/sdd.md | 17 | `apps/chanora_flutter/lib/services/app_bootstrap.dart`, `main.dart` | EXISTS |
| docs/architecture/sdd.md | 18 | `apps/chanora_flutter/lib/widgets/connect_widgets.dart` | EXISTS |
| docs/architecture/sdd.md | 19 | `snapshot_view.dart`, `snapshot_state_mapper.dart`, `channel_spacer.dart` | EXISTS (in services/) |
| docs/architecture/sdd.md | 20 | `chat_views.dart`, `bbcode_text.dart` | EXISTS |
| docs/architecture/sdd.md | 21 | `voice_bar.dart`, `voice_compact.dart`, `voice_settings*.dart`, `voice_level_meter.dart`, `ptt_capability_badge.dart` | EXISTS |
| docs/architecture/sdd.md | 22 | `android_permissions_service.dart`, `ios_permissions_service.dart`, `audio_lifecycle_service.dart`, `back_intent_*`, `link_trust_service.dart` | EXISTS |
| docs/architecture/sdd.md | 23 | `crates/chanora_bridge/src/api.rs` | EXISTS |
| docs/architecture/sdd.md | 24 | `core/chanora_core/src/lib.rs`, `events.rs`, `network_diagnostics.rs`, `ptt.rs` | EXISTS |
| docs/architecture/sdd.md | 25 | `crates/chanora_protocol/src/` | EXISTS |
| docs/architecture/sdd.md | 26 | `crates/chanora_state/src/lib.rs`, `channel_join.rs` | EXISTS |
| docs/architecture/sdd.md | 27 | `crates/chanora_audio/src/` | EXISTS |
| docs/architecture/sdd.md | 28 | `crates/chanora_storage/src/lib.rs` | EXISTS |
| docs/architecture/sdd.md | 29 | `crates/chanora_diagnostics/src/lib.rs` | EXISTS |
| docs/architecture/sdd.md | 30 | `crates/chanora_resolver/src/lib.rs`, `crates/chanora_prefetch/src/lib.rs`, `prefetch_debouncer.dart` | EXISTS |
| docs/architecture/sdd.md | 31 | `.github/workflows/`, `tools/` | EXISTS |
| docs/architecture/sdd.md | 35 | `crates/chanora_bridge/src/api.rs`, `apps/chanora_flutter/lib/src/rust/` | EXISTS |
| docs/release/release-readiness-go-nogo-record.md | 26 | `apps/chanora_flutter/pubspec.yaml` | EXISTS |
| docs/implementation-status-2026-05-28.md | 69 | `apps/chanora_flutter/ios/Runner/AppDelegate.swift` | EXISTS |
| docs/sysrs.md | 503 | `apps/chanora_flutter/ios/Runner/AppDelegate.swift` | EXISTS |
| docs/sysrs.md | 1962 | `apps/chanora_flutter/macos/chanora_bridge.podspec` | EXISTS |
| README.md | 236249 | `apps/chanora_flutter/`, `core/chanora_core/`, `crates/chanora_protocol/`, `crates/chanora_audio/`, `crates/chanora_state/`, `crates/chanora_storage/`, `crates/chanora_diagnostics/`, `crates/chanora_bridge/` | EXISTS |
### Broken
| File | Line | Reference | Issue |
|------|------|-----------|-------|
| docs/architecture/sdd.md | 19 | `snapshot_state_mapper.dart` (listed under "Snapshot and channel UI" widgets) | File is in `apps/chanora_flutter/lib/services/`, not `apps/chanora_flutter/lib/widgets/` — directory mismatch |
| docs/architecture/sdd.md | 21 | `voice_settings*.dart` (listed under Voice UI widgets) | Files are `voice_settings.dart` and `voice_settings_controls.dart` in `widgets/` — EXISTS but glob reference is ambiguous (two files match) |
**Note:** The `snapshot_state_mapper.dart` directory mismatch is a minor documentation inaccuracy — the file exists but is listed under the wrong component section (widget layer vs service layer).
---
## External Links (Manual Review)
These URLs should be checked manually for validity.
| File | Line | URL |
|------|------|-----|
| README.md | 429 | `https://www.apache.org/licenses/LICENSE-2.0` |
| README.md | 432 | `https://opensource.org/licenses/MIT` |
| apps/chanora_flutter/README.md | 11 | `https://docs.flutter.dev/get-started/learn-flutter` |
| apps/chanora_flutter/README.md | 12 | `https://docs.flutter.dev/get-started/codelab` |
| apps/chanora_flutter/README.md | 13 | `https://docs.flutter.dev/reference/learning-resources` |
| apps/chanora_flutter/README.md | 16 | `https://docs.flutter.dev/` |
| silero-coreml/README.md | 343 | `https://apple.github.io/coremltools/docs-guides/source/introductory-quickstart.html` |
| silero-coreml/README.md | 350 | `https://apple.github.io/coremltools/docs-guides/source/convert-pytorch.html` |
| silero-coreml/Docs/CoreMLConversion.md | 244 | `https://apple.github.io/coremltools/docs-guides/source/convert-pytorch.html` |
| silero-coreml/Docs/CoreMLConversion.md | 252 | `https://apple.github.io/coremltools/docs-guides/source/introductory-quickstart.html` |
| docs/security/dependency-and-supply-chain-report.md | 29 | `https://github.com/EdisonJwa/oboe-rs` |
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 261 | `https://github.com/asportnoy/compact-discord` |
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 262 | `https://github.com/mattermost/mattermost/blob/...` |
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 263 | `https://github.com/RocketChat/fuselage/blob/...` |
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 264 | `https://github.com/flutter/flutter/issues/162965` |
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 265 | `https://m3.material.io/foundations/layout/breakpoints/overview` |
| docs/architecture/file-transfer-research.md | 29 | `https://github.com/Splamy/TS3AudioBot/blob/...` |
| docs/architecture/file-transfer-research.md | 30 | `https://github.com/Multivit4min/TS3-NodeJS-Library/blob/...` |
| docs/architecture/file-transfer-research.md | 31 | `https://github.com/planetteamspeak/ts3phpframework/blob/...` |
| docs/architecture/file-transfer-research.md | 49 | `https://github.com/Multivit4min/TS3-NodeJS-Library/blob/...` |
| docs/architecture/file-transfer-research.md | 50 | `https://github.com/planetteamspeak/ts3phpframework/blob/...` |
| docs/architecture/file-transfer-research.md | 123 | `https://github.com/ReSpeak/Qint/blob/...` |
| docs/architecture/file-transfer-research.md | 124 | `https://github.com/ReSpeak/Qint/blob/...` |
| docs/architecture/file-transfer-research.md | 125 | `https://github.com/ReSpeak/Qint/blob/...` |
| docs/architecture/file-transfer-research.md | 140 | `https://github.com/teamspeak/ts3client-pluginsdk/blob/...` |
| docs/architecture/file-transfer-research.md | 141 | `https://github.com/teamspeak/ts3client-pluginsdk/blob/...` |
| docs/architecture/file-transfer-research.md | 142 | `https://community.teamspeak.com/t/clear-cache/41511` |
| docs/architecture/file-transfer-research.md | 142 | `https://community.teamspeak.com/t/server-icons-are-displaying-a-broken-image-issues-with-local-cache/58680` |
| docs/architecture/file-transfer-research.md | 208 | `https://github.com/Splamy/TS3AudioBot/blob/...` |
| docs/architecture/file-transfer-research.md | 209 | `https://github.com/Splamy/TS3AudioBot/blob/...` |
| docs/architecture/file-transfer-research.md | 220 | `https://github.com/Multivit4min/TS3-NodeJS-Library/blob/...` |
| docs/architecture/file-transfer-research.md | 221 | `https://github.com/Multivit4min/TS3-NodeJS-Library/blob/...` |
| docs/architecture/file-transfer-research.md | 320 | `https://github.com/rust-lang/rust/blob/...` |
| docs/architecture/file-transfer-research.md | 321 | `https://source.android.com/docs/core/storage/scoped` |
| docs/architecture/file-transfer-research.md | 322 | `https://developer.apple.com/library/archive/documentation/FileManagement/...` |
| docs/architecture/file-transfer-research.md | 334 | `https://github.com/zkat/cacache-rs/blob/...` |
| docs/architecture/file-transfer-research.md | 335 | `https://github.com/zkat/cacache-rs/blob/...` |
| docs/architecture/file-transfer-research.md | 336 | `https://github.com/zkat/cacache-rs/blob/...` |
| docs/architecture/file-transfer-research.md | 345 | `https://pub.dev/packages/flutter_cache_manager` |
| docs/architecture/file-transfer-research.md | 346 | `https://pub.dev/packages/super_cache_disk/versions/1.0.0` |
| docs/architecture/file-transfer-research.md | 406 | `https://git.did.science/TeaSpeak/Server/Server` |
| docs/security/license-inventory.md | 3180 | ~50 URLs to GitHub repos for dependency licenses |
| docs/security/flutter-license-inventory.md | 6244209 | Multiple `http://www.apache.org/licenses/` and `http://mozilla.org/MPL/2.0/` (in license text bodies) |
---
## Cross-References
### Valid
All doc-to-doc cross-references found in prose text resolve to existing files. Key verified chains:
| Source | Reference | Target Exists |
|--------|-----------|---------------|
| docs/architecture/sad.md:6 | `docs/srs.md` | YES |
| docs/architecture/sad.md:7 | `docs/sysdes.md` | YES |
| docs/architecture/sdd.md:6 | `docs/architecture/sad.md` | YES |
| docs/architecture/sdd.md:7 | `docs/srs.md` | YES |
| docs/architecture/sysdes.md:6 | `docs/sysdes.md` | YES |
| docs/architecture/file-transfer-design.md:6 | `docs/architecture/sad.md` | YES |
| docs/architecture/file-transfer-research.md:5 | `docs/architecture/file-transfer-design.md` | YES |
| docs/architecture/file-transfer-implementation-plan.md:6 | `docs/architecture/file-transfer-design.md` | YES |
| docs/architecture/file-transfer-implementation-plan.md:6 | `docs/architecture/file-transfer-research.md` | YES |
| docs/architecture/desktop-ptt-architecture.md:5 | `docs/architecture/sad.md` | YES |
| docs/architecture/desktop-ptt-architecture.md:5 | `docs/architecture/sdd.md` | YES |
| docs/architecture/desktop-ptt-architecture.md:5 | `docs/release/dv-waiver-register.md` | YES |
| docs/requirements/sysrs.md:4 | `../sysrs.md` | YES |
| docs/requirements/srs.md:4 | `../srs.md` | YES |
| docs/governance/document-index.md | All 18 listed paths | YES |
| docs/ui-ux/material3-guideline.md:6 | `docs/material3-guideline.md` | YES |
### Broken
None found — all doc-to-doc cross-references in prose text resolve correctly.
---
## Notes
1. **Path-record files**: Several docs exist as stubs pointing to canonical locations (`docs/requirements/sysrs.md``docs/sysrs.md`, `docs/requirements/srs.md``docs/srs.md`, `docs/architecture/sysdes.md``docs/sysdes.md`, `docs/ui-ux/material3-guideline.md``docs/material3-guideline.md`). These are intentional DV navigation aids, not broken links.
2. **Hypothetical file names in sysrs.md**: The table at lines 124131 lists `docs/chanora_SysDes.md` etc. as "Potential downstream file names." These are aspirational names from an earlier draft, not current files. They are presented as plain text in a table, not as navigable links.
3. **LICENSE-APACHE and LICENSE-MIT**: These are the most impactful broken references. The README's License section links to them, and the security license inventory files reference them. The dual-license model (DEC-020) requires these files to exist for proper attribution.
4. **snapshot_state_mapper.dart location**: The SDD lists this under "Snapshot and channel UI" (widget layer), but the file is actually in `services/`. This is a minor organizational mismatch — the file exists but is categorized differently than documented.
5. **External links**: Concentrated in `docs/architecture/file-transfer-research.md` (protocol research sources) and `docs/security/license-inventory.md` (dependency homepages). The file-transfer research links point to specific GitHub commit SHAs which may become stale over time.
@@ -0,0 +1,135 @@
# Review: Test & Document Coverage Analysis
**Reviewer:** opencode (automated)
**Reviewed file:** `docs/offline-knowledge/coverage-analysis.md`
**Date:** 2026-06-13
**Method:** Spot-checked 5 random test files, verified aggregate counts via grep/find, cross-referenced directory listings
---
## Verdict: Significant inaccuracies found
The document has **3 critical counting errors**, **2 factual errors about file existence**, and **several minor issues**. The per-file Rust test counts are mostly accurate, but the aggregate totals are wrong.
---
## Critical Errors
### 1. Total Rust test count is wrong by 40%
| Metric | Document | Actual | Delta |
|--------|----------|--------|-------|
| Inline `#[test]` | 220 | 309 | +89 |
| Integration tests | 2 | 2 | 0 |
| **Total** | **222** | **312** | **+90** |
The per-crate sums also don't reconcile: the document's own per-file tables sum to ~202 for chanora_audio (plus 2 integration = 204), but `grep -c '#\[test\]'` across `crates/chanora_audio/src/` yields **219** inline tests (+ 2 integration = 221). The document undercounts chanora_audio by 17 tests.
### 2. chanora_resolver test count off by 1
| Crate | Document | Actual |
|-------|----------|--------|
| chanora_resolver | 12 | 13 |
The extra test is in `examples/cli.rs` (documented separately as 1 example test, but the crate header total should be 13, not 12).
### 3. Doc file count is ambiguous and inaccurate
| Scope | Document says | Actual |
|-------|---------------|--------|
| All docs/ .md files | 55 | 75 |
| Excluding superpowers/ | — | 66 |
| Excluding superpowers/ + offline-knowledge/ | — | 51 |
The "55" figure doesn't match any reasonable scope calculation. The document also doesn't clarify whether superpowers/ plans/specs are included.
---
## Factual Errors
### 4. `poke_active_chat.dart` does not exist as a source file
The document lists `poke_active_chat.dart` as a tested service (line 163), and `poke_active_chat_test.dart` does exist under `test/services/`. However, **no corresponding source file** exists in `lib/services/`. This is either:
- An orphaned test for a deleted/moved source file, or
- The source file is located elsewhere (not in `lib/services/`)
The document should flag this as an anomaly, not list it as "Tested".
### 5. `audio_device_list_tile_test.dart` exists but is not counted
The document marks `audio_device_list_tile.dart` as "UNTESTED" (line 189), but `apps/chanora_flutter/test/widgets/audio_device_list_tile_test.dart` **does exist**. This means:
- Widget test file count should be **14**, not 13
- Widget coverage should be **14/24 (58%)**, not 13/24 (54%)
---
## Section Header vs. Content Mismatches
### 6. Architecture section: header says "4 files", lists 7
The header on line 221 reads "Architecture (4 files)" but the table contains 7 entries. The actual `docs/architecture/` directory has 7 files.
### 7. Governance section: header says "11 files", lists 12
The header on line 264 reads "Governance (11 files)" but the table contains 12 entries. The actual `docs/governance/` directory has 12 files.
---
## Spot-Check Results (5 Random Test Files)
| File | Document Count | Actual | Match? |
|------|---------------|--------|--------|
| `chanora_audio/src/ptt_backends/windows.rs` | 44 | 44 | ✅ |
| `chanora_audio/src/engine.rs` | 7 | 7 | ✅ |
| `chanora_state/src/lib.rs` | 18 | 18 | ✅ |
| `chanora_storage/src/lib.rs` | 15 | 15 | ✅ |
| `chanora_audio/src/route_policy.rs` | 8 | 8 | ✅ |
Per-file Rust test counts are **accurate**. The error is in the aggregation.
---
## Dart/Flutter Section: Mostly Accurate
| Metric | Document | Actual | Match? |
|--------|----------|--------|--------|
| `test()` calls | 155 | 155 | ✅ |
| `testWidgets()` calls | 66 | 66 | ✅ |
| Total Dart tests | 221 | 221 | ✅ |
| Service source files | 21 | 21 | ✅ |
| Widget source files | 24 | 24 | ✅ |
| Service test files | — | 20 | ⚠️ Not stated |
| Widget test files | 13 | 14 | ❌ |
---
## Missing Crates / Scope Issues
The document covers all 9 crates under `crates/` plus `chanora_core` under `core/`. No crates are missing. However:
- The document doesn't clearly explain that `chanora_core` lives under `core/`, not `crates/`
- The "Crates with tests: 7/9" metric (line 15) excludes `chanora_core`, which has 11 tests. If counted, it should be **8/10**
---
## Documentation Gap Analysis: Mostly Complete
The gap analysis (lines 333-354) correctly identifies undocumented modules. One omission:
- **Flutter test infrastructure** — no doc for the test helper setup, mock patterns, or test utilities used across 37 test files
---
## Summary of Required Corrections
| # | Issue | Severity | Fix |
|---|-------|----------|-----|
| 1 | Total Rust tests: 220 → 312 | Critical | Re-count and update |
| 2 | chanora_audio tests: 204 → 221 | Critical | Re-count and update |
| 3 | chanora_resolver tests: 12 → 13 | Minor | Update count |
| 4 | Doc file count: 55 → clarify scope | Minor | State scope explicitly |
| 5 | `poke_active_chat.dart` doesn't exist | Critical | Remove or flag as anomaly |
| 6 | `audio_device_list_tile_test.dart` exists | Major | Update widget test count to 14 |
| 7 | Architecture header: 4 → 7 | Minor | Fix header |
| 8 | Governance header: 11 → 12 | Minor | Fix header |
| 9 | Widget coverage: 54% → 58% | Major | Recalculate |
@@ -0,0 +1,176 @@
# Documentation Quality Analysis Review
**Reviewer:** Document Review Agent
**Date:** 2026-06-13
**Source:** `docs/offline-knowledge/doc-quality-analysis.md`
## Overall Assessment
The analysis is **largely accurate** but mischaracterizes several items. Most notably, it labels intentional ASPICE-compliance structures as "useless" and "duplicated" when they serve a documented purpose. The broken references finding is partially valid.
## Duplications: Spot-Check Results
### Instance 1: Lifecycle Chain — Justified Cross-Reference
**Verdict: NOT a problem.**
The lifecycle chain `SysRS -> SysDes -> SRS -> SAD -> SDD` appears in 6 files, but each serves a different purpose:
| File | Purpose |
|------|---------|
| `README.md:280` | Project overview for new contributors |
| `CONTRIBUTING.md:10` | Contributor guidance — must be self-contained |
| `docs/sysdes.md:90` | SysDes document context section |
| `docs/sysrs.md:108` | SysRS downstream relationship |
| `docs/governance/traceability-matrix.md:16` | Traceability rule definition |
| `docs/references/aspice-swe2-swe3-integration-note.md:12` | ASPICE integration reference |
ASPICE expects each document to be reviewable independently. Removing the chain from CONTRIBUTING.md or traceability-matrix.md would break document self-containment. **Recommendation: Keep as-is.**
### Instance 2: Git Commit Examples — Genuine Duplication
**Verdict: VALID.**
The commit examples are genuinely duplicated:
- `README.md:379-386` has 6 examples (including `docs(sad)` and `i18n(ui)`)
- `CONTRIBUTING.md:37-42` has 4 examples
- `docs/governance/git-commit-message-convention.md:14-19` has 4 examples
The README already references the convention file (line 391). The examples in README and CONTRIBUTING add no unique value. **Recommendation: Valid — consolidate to convention file.**
### Instance 3: Security Doc List — Genuine Duplication
**Verdict: VALID.**
The security document list is identical in both files:
- `README.md:349-355` — 6 file paths in a code block
- `SECURITY.md:33-38` — same 6 file paths in a code block
SECURITY.md is the authoritative source. The README could reference it instead. **Recommendation: Valid — keep in SECURITY.md, reference from README.**
## Useless Content: Verification Results
### Path Record Files — NOT Useless
**Verdict: INVALID. The analysis is wrong.**
The analysis labels these files as "useless" with "no unique content":
| File | Lines | Analysis Claim |
|------|-------|----------------|
| `docs/architecture/sysdes.md` | 21 | "Path record file — 21 lines pointing to `docs/sysdes.md`" |
| `docs/requirements/sysrs.md` | 22 | "Path record file — 22 lines pointing to `docs/sysrs.md`" |
| `docs/requirements/srs.md` | 22 | "Path record file — 22 lines pointing to `docs/srs.md`" |
| `docs/ui-ux/material3-guideline.md` | 8 | "Path record file — 8 lines pointing to `docs/material3-guideline.md`" |
These are **DV entry-point records** — intentional ASPICE compliance artifacts. Each file:
1. Preserves a README-advertised path for DV navigation
2. Provides a DV Review Summary table mapping topics to canonical source sections
3. States the DV position for that lifecycle layer
Example from `docs/requirements/sysrs.md`:
```
## DV Review Summary
| Topic | Canonical source |
|---|---|
| System scope and context | `docs/sysrs.md` sections 2 through 5 |
| Verification and validation requirements | `docs/sysrs.md` section 24 |
| MVP acceptance requirements | `docs/sysrs.md` section 25, SysRS-241 through SysRS-257 |
```
**These are not stubs.** They provide reviewer navigation aids. Deleting them would break DV traceability. **Recommendation: Keep all path record files.**
### Malformed Markdown — Valid
**Verdict: VALID.**
`docs/sysdes.md:13` has:
```
**Repo path:** `docs/architecture/sysdes.md` ---
```
Missing blank line before `---`. This renders as inline text instead of a horizontal rule. **Recommendation: Fix by adding a blank line.**
## Broken References: Verification Results
### `chanora_*` Filenames — Confirmed Broken
**Verdict: VALID.**
`docs/sysrs.md:126-130` suggests these filenames:
```
docs/chanora_SysDes.md
docs/chanora_SRS.md
docs/chanora_SAD.md
docs/chanora_SDD.md
docs/chanora_Verification.md
```
None of these files exist. The actual files use different names (`docs/sysdes.md`, `docs/srs.md`, etc.). This is a genuine broken reference. **Recommendation: Update the suggested filenames to match actual paths.**
### SDD-109 and SAD-043 — NOT Broken
**Verdict: INVALID. The analysis is wrong.**
The analysis claims these are broken references. However, the traceability matrix (`docs/governance/traceability-matrix.md:67`) explicitly documents this:
> "SAD and SDD are baseline candidates rather than fully item-numbered historical documents. Some prior references such as `SAD-043` and `SDD-109` are not reconstructed as itemized records. Treat the new SAD/SDD as DV baselines; add strict item IDs later if the process owner requires ID-level audit."
The SAD (`docs/architecture/sad.md:182`) and SDD (`docs/architecture/sdd.md:153`) also acknowledge this. These are **documented historical references**, not broken links. The implementation status file correctly notes them as "Referenced but not confirmed." **Recommendation: No action needed — this is intentional.**
## Additional Issues Found
### 1. Version Inconsistency Not Flagged
The analysis mentions version inconsistency in "Outdated Content" but doesn't flag it as a cross-document consistency issue:
- `docs/sysdes.md:6` — Version 0.9.8
- `docs/sysrs.md:5` — Version 0.9.11
- `docs/material3-guideline.md:4-5` — Version 0.9.2
These version numbers suggest independent evolution, but ASPICE expects version alignment across the lifecycle chain. **Recommendation: Add to high-priority recommendations.**
### 2. `release` Commit Type
`docs/governance/git-commit-message-convention.md:18` uses `release(android)` as an example, but `release` is not a standard Conventional Commits type. The analysis correctly flags this in "Stale Content" but doesn't recommend a fix. **Recommendation: Either add `release` to the documented types or replace the example.**
### 3. Missing `docs/sad.md` and `docs/sdd.md` Path Records
The README references `docs/architecture/sad.md` and `docs/architecture/sdd.md`, but unlike SysDes, SysRS, SRS, and Material3, there are no path record files for SAD and SDD at the expected DV entry-point paths. This is an inconsistency the analysis missed. **Recommendation: Consider adding path records for SAD and SDD if DV navigation requires them.**
### 4. `docs/sysdes.md:13` Malformed `---` Line
The analysis correctly identifies this but buries it in "Empty Sections" rather than calling it out as a rendering issue. The line:
```
**Repo path:** `docs/architecture/sysdes.md` ---
```
should be:
```
**Repo path:** `docs/architecture/sysdes.md`
---
```
## Summary
| Category | Analysis Claim | Verdict |
|----------|---------------|---------|
| Lifecycle chain duplication | 6 files | **Justified** — ASPICE self-containment |
| Commit examples duplication | 3 files | **Valid** — consolidate |
| Security doc list duplication | 2 files | **Valid** — consolidate |
| Path record files useless | 4 files | **Invalid** — DV entry-point records |
| Malformed markdown | 1 instance | **Valid** — fix needed |
| `chanora_*` broken refs | 5 files | **Valid** — genuine broken refs |
| SDD-109/SAD-043 broken | 2 refs | **Invalid** — documented historical refs |
**Bottom line:** 3 of 8 duplications are valid concerns. 1 of 5 useless items is valid. 1 of 3 broken references is valid. The analysis overreports issues by mischaracterizing intentional ASPICE structures as problems.
@@ -0,0 +1,193 @@
# External Documentation Review
> **Reviewer**: OpenCode (automated)
> **Date**: 2026-06-13
> **Files reviewed**:
> - `docs/offline-knowledge/external/teaspeak-overview.md`
> - `docs/offline-knowledge/external/respeak-overview.md`
> - `docs/offline-knowledge/external/yatqa-en.md`
> - `docs/offline-knowledge/external/yatqa-de.md`
---
## 1. teaspeak-overview.md
### Accuracy
| Claim | Verdict | Notes |
|-------|---------|-------|
| Repo at `git.did.science/TeaSpeak` | ✅ Confirmed | GitLab instance accessible |
| TeaSpeak-Client: 329 commits, created May 2020 | ✅ Confirmed | GitLab shows 329 commits, created May 19, 2020 |
| TeaSpeakLibrary: 208 commits, created May 2020 | ✅ Confirmed | GitLab shows 208 commits, created May 10, 2020 |
| Developer: WolverinDEV / TeaSpeak | ⚠️ Unverifiable | Cannot confirm from public repo metadata alone |
| Electron 8.5.5, TypeScript 3.9 | ⚠️ Unverifiable | Repo not fully cloned; cannot read package.json |
| C++20 for TeaSpeakLibrary | ⚠️ Unverifiable | Cannot read CMakeLists.txt without full clone |
### Missing Items
- **License not mentioned.** The doc does not state the project's license. If the license is known, it should be included for completeness.
- **No mention of project status/activity.** Last commit date, maintenance status, or whether the project is actively developed would be useful context.
- **No mention of WebRTC.** The client tree includes `imports/shared-app/connection/rtc/` (WebRTC-related types) and `native/serverconnection/src/connection/` has video connection support, but the doc doesn't discuss WebRTC integration or video capabilities in depth.
### Factual Errors
None found. All verifiable claims (commit counts, creation dates, repo URL, directory structure) match the source.
### Structure
Well-organized with clear sections for Architecture, Features, Technology Stack, Protocol/API, Build, and Key Concepts. The directory tree diagrams are useful. The separation of Client vs Library technology tables is good.
### Verdict: **Good** — Accurate where verifiable. Add license info and project status.
---
## 2. respeak-overview.md
### Accuracy
| Claim | Verdict | Notes |
|-------|---------|-------|
| License: MIT OR Apache-2.0 | ✅ Confirmed | `Cargo.toml` and LICENSE files confirm |
| tsclientlib 0.2.0, tsproto 0.2.0 | ✅ Confirmed | From `Cargo.toml` files |
| Crate versions (ts-bookkeeping 0.1.x, tsproto-packets 0.1.x, tsproto-types 0.1.x) | ✅ Confirmed | Matches Cargo.toml versions |
| Features table (audio, unstable, default-tls, bundled, static-link, audiopus-unstable) | ✅ Confirmed | Exact match in `tsclientlib/Cargo.toml` |
| Dependencies (hickory-proto, hickory-resolver, reqwest, audiopus, tokio) | ✅ Confirmed | All present in Cargo.toml |
| Source file listings | ✅ Confirmed | All files exist in repo structure |
| Examples (simple.rs, audio.rs, etc.) | ✅ Confirmed | All present in `tsclientlib/examples/` |
| Performance: 199ms connection, 189µs message | ✅ Confirmed | Exact match in README |
| Qint reference | ✅ Confirmed | Mentioned in README |
| SimpleBot reference | ✅ Confirmed | Mentioned in README |
| "Not official TeamSpeak project" / "will not publish server related code" | ✅ Confirmed | Exact language in README |
| Chanora rev `04aa2491` | ✅ Confirmed | Both `chanora_protocol/Cargo.toml` and `chanora_audio/Cargo.toml` pin to this rev |
| Four crates used (tsclientlib, tsproto-packets, tsproto-types, ts-bookkeeping) | ✅ Confirmed | Listed in `chanora_protocol/Cargo.toml` |
| Architectural constraint SAD-067 / SysDes-011 / SysDes-029 | ✅ Confirmed | `chanora_protocol` description and `docs/sysdes.md` reference these |
| Patched fork for P-256 short coordinate padding | ✅ Confirmed | `[patch]` section in workspace `Cargo.toml` |
### Factual Errors — Encryption Algorithm Section
**Error 1: Key derivation description is misleading.**
The doc states:
> 1. **Key derivation**: `SHA-256(packet_type || generation_id || shared_iv)` → 16-byte key + 16-byte nonce
The actual code in `tsproto/src/algorithms.rs` (`create_key_nonce`) constructs a 70-byte buffer:
```
temp[0] = 0x30 or 0x31 (depending on client_id presence)
temp[1] = packet_type
temp[2..6] = generation_id (big-endian)
temp[6..] = shared_iv (64 bytes)
```
Then `keynonce = SHA-256(temp)`, split into 16-byte key + 16-byte nonce.
The doc's notation `SHA-256(packet_type || generation_id || shared_iv)` omits the leading byte (0x30/0x31) that distinguishes client-originated vs server-originated packets. This is a minor but technically inaccurate omission.
**Error 2: Packet ID mixing placement is correct but could be clearer.**
The doc correctly states `key[0] ^= (packet_id >> 8)`, `key[1] ^= (packet_id & 0xff)`. This is applied *after* key derivation, not as part of it. The doc's placement in the list is fine.
**Error 3: Shared IV computation — "shared_mac = SHA-1(shared_iv)[..8]" is correct.**
Confirmed from `compute_iv_mac` in `algorithms.rs`. The doc is accurate here.
### Missing Items
- **No mention of `tsproto` dependency.** The doc lists crates used by Chanora but `tsclientlib` depends on `tsproto` internally. While Chanora doesn't directly depend on `tsproto`, it could be worth noting as an indirect dependency.
- **No mention of `tsproto-structs`.** This crate exists in the monorepo but is not used by Chanora. Could note it for completeness.
- **`hickory-proto`/`hickory-resolver` versions not specified.** The doc lists these as dependencies but doesn't note they are version 0.24.
### Structure
Excellent. Clear sections for Architecture, Protocol Details, Cryptography, and the Chanora-specific integration section is particularly valuable. The dependency chain diagram is useful.
### Verdict: **Very Good** — Highly accurate with minor encryption description inaccuracy.
---
## 3. yatqa-en.md
### Accuracy
The content appears to be sourced from https://yat.qa/ and translated/adapted. Key claims:
| Claim | Verdict | Notes |
|-------|---------|-------|
| YaTQA stands for "Yet Another TeamSpeak³ Query Admin Tool" | ✅ Matches yat.qa |
| Author: Janni "Яedeemer" K. | ✅ Matches yat.qa |
| Written in Delphi 2009, 50,000+ lines | ⚠️ Unverifiable | Claimed on yat.qa, cannot independently confirm |
| Development started April 10, 2011 | ✅ Matches yat.qa |
| First release June 29, 2011 | ✅ Matches yat.qa |
| Free freeware, no adware/spyware | ✅ Matches yat.qa |
| Windows XP+, Linux via Wine | ✅ Matches yat.qa |
| Supported servers: TS 3.9.03.13.7, TeaSpeak 1.4.10-beta | ⚠️ Version range may be outdated | Version range from v3.9.9b (Mar 2023) |
| Version: v3.9.9b (01 Mar 2023) | ✅ Matches yat.qa changelog |
### Missing Items
- **No mention of recent updates.** The doc states v3.9.9b from March 2023. If there have been newer releases, this could be outdated.
- **No screenshots or visual examples.** For a GUI tool, this is understandable for a text doc but worth noting.
### Factual Errors
None found. All claims align with the yat.qa website.
### Structure
Well-organized with clear sections for Features, Architecture, Configuration, System Requirements, Key Concepts, and Known Limitations. The feature categorization (General, Console, SSH Tunnel, Instance, Virtual Server) is logical.
### Verdict: **Good** — Accurate reference. Consider adding update cadence notes.
---
## 4. yatqa-de.md
### Accuracy
Same content as yatqa-en.md, translated to German. All verifiable claims match.
### EN vs DE Content Comparison
| Section | EN | DE | Match |
|---------|----|----|-------|
| Overview | ✅ | ✅ | ✅ Identical content |
| Features (all subsections) | ✅ | ✅ | ✅ Identical items |
| Supported Image Formats | ✅ | ✅ | ✅ Identical table |
| Architecture/How It Works | ✅ | ✅ | ✅ Identical |
| Configuration | ✅ | ✅ | ✅ Identical settings |
| Startup Parameters | ✅ | ✅ | ✅ Identical parameters |
| System Requirements | ✅ | ✅ | ✅ Identical |
| Key Concepts | ✅ | ✅ | ✅ Identical concepts |
| Known Limitations | ✅ | ✅ | ✅ Identical |
| IPv6 Support | ✅ | ✅ | ✅ Identical |
| Project History | ✅ | ✅ | ✅ Identical dates |
| Global Hotkeys | ✅ | ✅ | ✅ Identical shortcuts |
| Resources | ✅ | ✅ | ✅ Identical links |
| Translation | ✅ | ✅ | ✅ Identical |
**The two documents cover exactly the same content.** No sections are missing from either version.
### Minor Translation Notes
- "Ghost Mode" → "Geist-Modus" (correct)
- "Badges" → "Abzeichen" (correct)
- "Pie Chart Styles" → "Kreisdiagramm-Styles" (correct)
- Hotkeys correctly adapted: "Ctrl" → "Strg" where applicable
- Resources section: DE version links to German-specific URLs where available (`/funktionen/`, `/haeufige-fragen/`, `/unterstuetzung/`, `/ressourcen/`, `/ueber/`) — correct
### Verdict: **Good** — Accurate translation, full content parity with EN version.
---
## Summary
| Document | Accuracy | Completeness | Structure | Overall |
|----------|----------|--------------|-----------|---------|
| teaspeak-overview.md | ✅ Good | ⚠️ Missing license, status | ✅ Good | **B+** |
| respeak-overview.md | ✅ Very Good | ✅ Complete | ✅ Excellent | **A-** |
| yatqa-en.md | ✅ Good | ✅ Complete | ✅ Good | **A-** |
| yatqa-de.md | ✅ Good | ✅ Complete | ✅ Good | **A-** |
### Recommended Actions
1. **teaspeak-overview.md**: Add project license, last-commit date or activity status, and note WebRTC/video capabilities.
2. **respeak-overview.md**: Fix the encryption algorithm description to include the leading 0x30/0x31 byte in the key derivation buffer. Minor — the rest is accurate.
3. **yatqa-en.md / yatqa-de.md**: No changes needed. Consider periodic re-sync to check for version updates beyond v3.9.9b.
@@ -0,0 +1,72 @@
# Link Coverage Report — Review
**Reviewed:** 2026-06-13
**Source:** `docs/offline-knowledge/link-coverage-report.md`
## Verdict: Largely Accurate
The report is thorough and all major claims have been verified. One minor counting discrepancy found.
---
## 1. Broken Internal Links (LICENSE-APACHE, LICENSE-MIT)
**CLAIM:** `LICENSE-APACHE` and `LICENSE-MIT` do not exist at repo root.
**VERIFIED:** Correct. `ls /Users/edison/dev/chanora/LICENSE*` returns no matches. `NOTICE` (line 444) does exist.
The report also correctly identifies 4 additional references to these missing files in `docs/security/license-inventory.md` (lines 910) and `docs/security/flutter-license-inventory.md` (lines 1112) using relative paths `../../LICENSE-APACHE` and `../../LICENSE-MIT`.
---
## 2. Broken Inline Doc-Path References
**CLAIM:** 5 references to `docs/chanora_*.md` files in `docs/sysrs.md` lines 126130 are broken.
**VERIFIED:** Correct. All 5 files confirmed missing:
- `docs/chanora_SysDes.md` — MISSING
- `docs/chanora_SRS.md` — MISSING
- `docs/chanora_SAD.md` — MISSING
- `docs/chanora_SDD.md` — MISSING
- `docs/chanora_Verification.md` — MISSING
The report's assessment that these are low-severity (aspirational table entries, not navigable links) is accurate.
---
## 3. Spot-Check of Claimed Valid Links
10 links verified — all exist:
| # | File | Target | Status |
|---|------|--------|--------|
| 1 | README.md:130 | `docs/architecture/desktop-ptt-architecture.md` | EXISTS |
| 2 | README.md:436 | `docs/governance/product-decision-register.md` | EXISTS |
| 3 | README.md:444 | `NOTICE` | EXISTS |
| 4 | `docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md:266` | `../ui-ux/adaptive-layout-platform-guide.md` | EXISTS |
| 5 | `docs/governance/git-commit-message-convention.md` (from CONTRIBUTING.md:25) | EXISTS |
| 6 | `docs/security/threat-model.md` | EXISTS |
| 7 | `docs/security/secure-storage-audit-report.md` | EXISTS |
| 8 | `docs/privacy/privacy-policy.md` | EXISTS |
| 9 | `docs/requirements/sysrs.md` | EXISTS |
| 10 | `docs/architecture/sysdes.md` | EXISTS |
---
## 4. Missed Links
**No internal markdown links were missed.** A repo-wide grep for `[text](path)` patterns in `.md` files (excluding `http` URLs and the report itself) returns exactly 10 links — all accounted for in the report.
---
## 5. Discrepancy Found
**Summary count mismatch:** The report summary states "Valid internal links: 12" but the "Valid Internal Links" table (§2) lists only 4 entries. The remaining 8 may be counted from the cross-references section or the "Also affected" table, but the categorization is unclear. This does not affect the report's accuracy on individual link status.
---
## 6. Additional Observations
- The report correctly identifies path-record stubs (`docs/requirements/sysrs.md``docs/sysrs.md`, etc.) as intentional navigation aids, not broken links.
- The `snapshot_state_mapper.dart` directory mismatch (widgets/ vs services/) is a genuine doc inaccuracy worth noting.
- External link count (48) was not verified — these are URLs requiring HTTP checks.