# Legal review readiness — DEC-012 sign-off checklist | Version | Date | Status | |---|---|---| | 0.1.0 | 2026-05-15 | Initial draft alongside v1.0.0-rc.1 | ## Purpose DEC-012 in `product-decision-register.md` records the legal / trademark / licensing review as the **only** outstanding gate before the MVP public release per DEC-001 sequencing. That decision was accepted as a *release gate* on 2026-05-14; the actual review work has not been performed. This document is the engineering-side handoff package for that review. It enumerates exactly what the reviewer needs to confirm, points to the artefacts in this repository that answer each item, and lists the work the reviewer must perform that the engineering side cannot. Engineering does **not** make legal decisions. Items marked "engineering: done" mean the underlying technical artefact is in place; the corresponding legal confirmation is still required. ## Scope Reviewer is expected to confirm or correct each of the following before `v1.0.0-rc.1` is promoted to `v1.0.0` and any release artefact is published publicly or to a store. ### 1. Trademark — "Chanora" * **DEC-018** accepted "Chanora" as the public product name. * Engineering: name appears in `Cargo.toml`, `pubspec.yaml`, the About dialog, the AppBar title via the `appTitle` localisation key, and every commit message. * **Reviewer action**: - Trademark registrability check in target jurisdictions (CN, US, EU at minimum, per DEC-002 target platforms' user base). - Confirm no conflicting registration in voice-communication software / mobile-app categories. - Issue go / no-go ruling. A no-go ruling triggers a rename which invalidates `v1.0.0-rc.1` and forces a new RC. ### 2. Non-affiliation statement — TeamSpeak * **DEC-019** accepted the working wording: > Chanora is independent and is not affiliated with, endorsed by, > sponsored by, or officially associated with TeamSpeak. * Engineering: that exact sentence ships in: - `NOTICE` (top of file). - `README.md` `## License and trademark` section. - The in-app About dialog (English: `aboutNonAffiliation` ARB key; Chinese Simplified: `aboutNonAffiliation` in `app_zh.arb`, translated by an engineer — translation should be reviewed for legal precision). * **Reviewer action**: - Confirm the English wording is sufficient under target-market consumer-protection and unfair-competition statutes. - Confirm the Chinese-Simplified translation does not weaken the statement. - Confirm there is no remaining text anywhere in the product that could imply affiliation (search hints: "TeamSpeak", "official", "endorsed"). ### 3. Trademark usage — "TeamSpeak" The product documentation and UI strings reference "TeamSpeak" in several places where we describe interoperability (e.g. "TeamSpeak-compatible servers"). This is nominative use. * **Reviewer action**: - Confirm each occurrence of "TeamSpeak" in user-facing strings, documentation, and store metadata is permissible nominative use under target-jurisdiction trademark law. - Recommend a `™` or `®` symbol convention if required. ### 4. License posture — Chanora's own code * **DEC-020** accepted dual-license **Apache-2.0 OR MIT**. * Engineering: the texts ship as `LICENSE-APACHE` and `LICENSE-MIT` at the repository root; the aggregator `LICENSE` references both. Cargo-level package manifests carry `license.workspace = true` pointing to `Apache-2.0 OR MIT` in the workspace `Cargo.toml`. * **Reviewer action**: - Confirm the dual-license declaration is consistent with all contributor agreements (none in place yet — see open items). - Confirm `LICENSE` file contents satisfy each app store's source- code-availability and inbound-license requirements. ### 5. Third-party license posture — direct dependencies * `NOTICE` enumerates the direct dependency list as of v1.0.0-rc.1. * Each direct dependency is permissively licensed (`MIT`, `Apache-2.0`, `MIT OR Apache-2.0`, `BSD-3-Clause`). No GPL / LGPL / AGPL surfaces in the direct set. * **Reviewer artefacts** checked into the repository: - `docs/security/license-inventory.md` and `docs/security/license-inventory.html` — full transitive Rust inventory generated by `cargo about generate` from `about.toml`. Covers 364 crates across the workspace. - `docs/security/flutter-license-inventory.md` — Flutter / Dart inventory generated by `tools/dump_flutter_licenses.sh`. Covers 94 packages including the Flutter SDK BSD-3-Clause text. - `deny.toml` — `cargo deny` configuration enforcing the DEC-020 license posture as a CI guardrail. The `supply-chain` job in `.github/workflows/ci.yml` runs `cargo deny check` on every push and PR. * **Reviewer action**: - Confirm the `NOTICE` enumeration matches what the build tooling actually links by spot-checking against the inventories above. - Confirm each direct dependency's attribution obligations are satisfied (Apache-2.0 requires a copy of the license text, the NOTICE entry, and a list of changes in any modified copies). - Confirm no copyleft transitive dependency creeps in via `tsclientlib` or `cpal`. The most likely failure mode is a crypto / DSP subdep with LGPL coverage; `cargo deny` config should refuse those. ### 6. `tsclientlib` posture specifically The project pins `tsclientlib` to a specific commit (`04aa249` on `https://github.com/ReSpeak/tsclientlib`). The crate is upstream-licensed `MIT OR Apache-2.0`. It implements the TeamSpeak 3 protocol from publicly observed behaviour, not from TeamSpeak proprietary sources. * **Reviewer action**: - Confirm linking against `tsclientlib` does not by itself create a derivative-work obligation under TeamSpeak's own licenses or EULAs. - Confirm using `tsclientlib` to talk to third-party TeamSpeak-protocol servers does not create a trademark or contract-tort exposure. ### 7. Crypto + secure-storage compliance * `chacha20poly1305` (Apache-2.0 OR MIT) provides envelope encryption for the identity at rest and bookmark passwords. * `keyring` (Apache-2.0 OR MIT) hits the platform Secret Service / Keychain / Credential Manager for the DEK. * No symmetric or asymmetric primitive other than the above is introduced by Chanora's own code; `tsclientlib` carries its own protocol-level crypto. * **Reviewer action**: - Confirm export-control posture for the resulting binary (cryptography category determination, ECCN, any EAR self- classification needed for store distribution). - Confirm any privacy-statement updates required by jurisdictions that treat persistent device identifiers as personal data. ### 8. Data handling — DEC-016 / DEC-017 * **DEC-016** No automatic diagnostic upload. The `export_diagnostics` bridge function is invoked only on user action and the redacted output is local-only (Clipboard or share-sheet). * **DEC-017** Crash reporting disabled. Repository grep for `sentry|crashlytics|bugsnag` returns zero hits as of v1.0.0-rc.1. * Engineering: diagnostics redaction is enforced at write-time by the in-bridge `RedactingLogLayer`; tests `chanora_diagnostics::tests::*` cover the policy. * **Reviewer action**: - Confirm privacy policy text aligns: no telemetry, no automatic upload, no crash reporting in MVP. - Confirm app-store privacy-label entries are consistent. ### 9. Store-listing copy Out of scope for engineering; reviewer drafts and validates per DEC-002 staged platform list: - Google Play Store (Android arm64-v8a) - Apple App Store (iOS, MVP gate) - Microsoft Store / direct (Windows) - Mac App Store / direct (macOS) - Linux (direct distribution; no store) ## Open engineering work blocking sign-off These are concrete items that engineering must close before the reviewer's work can complete. They do **not** require legal input themselves — they are listed here so the reviewer's scope is clear. | # | Item | Status | |---|------|--------| | 1 | `cargo about generate --workspace` output checked into `docs/security/license-inventory.{md,html}` | **Done** (v1.0.0-rc.2 candidate) — generated from `about.toml`. 364 transitive crates enumerated; CI fails on staleness. | | 2 | Flutter `LicenseRegistry` dump checked into `docs/security/flutter-license-inventory.md` | **Done** (v1.0.0-rc.2 candidate) — generated by `tools/dump_flutter_licenses.sh`; 94 packages enumerated; CI fails on staleness. | | 3 | `cargo deny check licenses` (with allow-list mirroring DEC-020) | **Done** (v1.0.0-rc.2 candidate) — config at `deny.toml`, CI job `supply-chain` runs `cargo deny check` on every push. | | 4 | Live iOS and macOS build artefacts | **Open** — DEC-002 staged release allows deferring; today neither has a live build. See `staged-release-plan.md`. | ## Out-of-scope The following are *not* part of DEC-012 and have their own owners and decisions: * Cryptographic primitive selection (`chacha20poly1305`, key sizes, KDF choice) — Security Architect; closed by DEC-013.2. * Codec choice (Opus) — Software Architect. * TLS / connection security — falls inside `tsclientlib`.