Closes engineering deliverables 1–3 from the open-work table in `docs/governance/legal-review-readiness.md` so the DEC-012 legal review can actually run. With this commit, the only remaining engineering item blocking sign-off is signed Windows / macOS / iOS build artefacts, deferrable per the DEC-002 staged release plan. Tooling ------- * `about.toml` + `about.hbs` + `about-md.hbs` configure cargo-about with the DEC-020 license posture and the five-target matrix (Linux, Android, Windows, macOS, iOS). One per-crate clarification for `allo-isolate` (`flutter_rust_bridge` transitive that ships Apache-2.0 via `license-file` rather than an SPDX `license` field). `cargo about generate` runs with zero warnings. * `deny.toml` mirrors the cargo-about allow-list and adds minimal bans / sources / advisories config. `cargo deny check` reports `advisories ok, bans ok, licenses ok, sources ok` for the workspace; multiple-versions of `windows_x86_64_msvc` produce advisory `warn` (no fail) because three windows-targets versions reach the graph via `jni`, `cpal`, and `keyring` respectively. * `tools/dump_flutter_licenses.sh` + `tools/dump_flutter_licenses.dart` walk `apps/chanora_flutter/pubspec.lock`, resolve each dependency to its local pub-cache directory, read the LICENSE file, and emit `docs/security/flutter-license-inventory.md`. SDK-sourced packages (`flutter`, `flutter_localizations`, `flutter_test`, `flutter_web_plugins`, `sky_engine`) resolve to the Flutter framework BSD-3-Clause LICENSE under `$FLUTTER_ROOT` (or `$HOME/sdks/flutter`). Artefacts --------- * `docs/security/license-inventory.md` — 364 transitive Rust crates with full license texts. Apache-2.0 (276), MIT (55), Unicode-3.0 (19), BSD-3-Clause (7), ISC (7). Zero copyleft. * `docs/security/license-inventory.html` — same data rendered as styled HTML for reviewer convenience. * `docs/security/flutter-license-inventory.md` — 94 Dart / Flutter packages with their LICENSE texts. Zero packages without a resolvable LICENSE in this RC. CI -- * New `supply-chain` job runs `cargo deny check --workspace --all-features` via `EmbarkStudios/cargo-deny-action@v2`. Fails the build on any GPL / LGPL / AGPL / commercial-source license surfacing transitively. * New `license-inventory` job installs `cargo-about --features cli` and regenerates `docs/security/license-inventory.md`; diffs against the committed copy and fails on drift. Forces contributors who touch the Cargo.lock to refresh the inventory. * New `flutter-license-inventory` job runs `tools/dump_flutter_licenses.sh` against the just-resolved pub cache; same diff-on-drift semantics. Governance ---------- * `docs/governance/legal-review-readiness.md` §5 cross-links the three new artefacts in a "Reviewer artefacts" subsection. * The open-work table at the bottom of the doc is rewritten as a status grid: items 1–3 now read **Done**; item 4 (signed iOS / macOS builds) remains the only open engineering blocker, with a pointer back to `staged-release-plan.md`. Verification ------------ * `CHANORA_DISABLE_KEYRING=1 cargo test --workspace`: all 49 unit + integration tests green (unchanged from v1.0.0-rc.1). * `cargo deny check`: advisories ok, bans ok, licenses ok, sources ok. * `cargo about generate --output-file …`: zero warnings. * `tools/dump_flutter_licenses.sh`: 94 packages, 0 without LICENSE. * `flutter analyze`: clean. No code changes touch the runtime; this is governance-tooling only.
9.0 KiB
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 theappTitlelocalisation 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.1and 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 trademarksection.- The in-app About dialog (English:
aboutNonAffiliationARB key; Chinese Simplified:aboutNonAffiliationinapp_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-APACHEandLICENSE-MITat the repository root; the aggregatorLICENSEreferences both. Cargo-level package manifests carrylicense.workspace = truepointing toApache-2.0 OR MITin the workspaceCargo.toml. - Reviewer action:
- Confirm the dual-license declaration is consistent with all contributor agreements (none in place yet — see open items).
- Confirm
LICENSEfile contents satisfy each app store's source- code-availability and inbound-license requirements.
5. Third-party license posture — direct dependencies
NOTICEenumerates 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.mdanddocs/security/license-inventory.html— full transitive Rust inventory generated bycargo about generatefromabout.toml. Covers 364 crates across the workspace.docs/security/flutter-license-inventory.md— Flutter / Dart inventory generated bytools/dump_flutter_licenses.sh. Covers 94 packages including the Flutter SDK BSD-3-Clause text.deny.toml—cargo denyconfiguration enforcing the DEC-020 license posture as a CI guardrail. Thesupply-chainjob in.github/workflows/ci.ymlrunscargo deny checkon every push and PR.
- Reviewer action:
- Confirm the
NOTICEenumeration 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
tsclientliborcpal. The most likely failure mode is a crypto / DSP subdep with LGPL coverage;cargo denyconfig should refuse those.
- Confirm the
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
tsclientlibdoes not by itself create a derivative-work obligation under TeamSpeak's own licenses or EULAs. - Confirm using
tsclientlibto talk to third-party TeamSpeak-protocol servers does not create a trademark or contract-tort exposure.
- Confirm linking against
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;
tsclientlibcarries 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_diagnosticsbridge 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|bugsnagreturns zero hits as of v1.0.0-rc.1. - Engineering: diagnostics redaction is enforced at write-time by
the in-bridge
RedactingLogLayer; testschanora_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.