Files
chanora/docs/release/release-readiness-go-nogo-record.md
T
EdisonJwa 5199e3d005 feat(ptt): full desktop backend ladder + missed-key-up watchdog (gen2 v0.9.3 follow-up)
Lands SDD-081..088 + SDD-092 implementations on top of v1.0.0-rc.3.
The cross-platform pieces — `AudioTransmitGate`, the per-platform
backend ladder, and the missed-key-up watchdog — are wired into the
audio engine lifecycle. Per-platform live verification on Windows
/ macOS / GNOME-Wayland reference hosts is the remaining work
(RR-PTT-001..006/008 in `release-readiness-go-nogo-record.md`).

`chanora_audio::ptt`
--------------------

  * `AudioTransmitGate` now owns an `Arc<AtomicBool>` plus a
    `tokio::sync::watch::Sender<bool>` (SAD-075 / SDD-089). The
    encoder feed reads the atomic on the hot path; the watchdog
    subscribes to the watch channel.
  * `MissedKeyUpWatchdog::spawn(gate, timeout)` watches the gate
    transitions and self-clears `transmit_active` if the
    `false -> true` lifetime exceeds the configured ceiling
    (DEC-028, default 30s). Two unit tests cover the timeout-fires
    and the no-fire-on-normal-release paths.

`chanora_audio::ptt_backends`
-----------------------------

  * `DesktopPttBackend` trait + `PttBinding` value type + `PttInputClass`
    enum + `PttBackendError` (SDD-081). `PttBinding` deliberately
    carries only `input_class` and an opaque `platform_key`
    string; raw key codes never appear in the type surface.
  * `select()` factory (SAD-071): runtime ladder evaluation per
    OS. Windows → Raw Input → low-level hook → Focused; macOS →
    Event Tap → Focused; Linux → GNOME-Wayland portal probe →
    Focused.
  * `FocusedPttBackend` (SDD-087): universal terminal fallback;
    integrates with the existing Flutter Listener-driven PTT.
  * `WindowsRawInputBackend` + `WindowsHookBackend` (SDD-083 /
    SDD-084): three-rung ladder evaluated once at engine start.
    Each backend runs a dedicated worker thread that holds the
    OS-level handle; `start`/`stop` lifecycle is honest. Live
    `RegisterRawInputDevices` / `SetWindowsHookEx` wiring is
    platform-verification work — the scaffolding lets the
    descriptor + watchdog + capability event be exercised
    end-to-end now.
  * `MacOSEventTapBackend` (SDD-085): two-rung ladder with
    explicit `PermissionState` (Granted / Denied / Undetermined).
    `Undetermined` resolves to `L0Focused` so capability
    advertising matches actual runtime behaviour even before
    Input Monitoring is granted. Live `CGEventTap` + `IOHIDCheckAccess`
    wiring is platform-verification work.
  * `LinuxGnomeWaylandBackend` (SDD-086): probes GNOME-on-Wayland
    via `XDG_SESSION_TYPE` + `XDG_CURRENT_DESKTOP`, then verifies
    the `org.freedesktop.portal.GlobalShortcuts` D-Bus interface
    is reachable by reading the `version` property over a
    blocking zbus session. Reports `gnome-wayland-portal` /
    `L2GlobalHoldToTalk`. Other Linux environments fall through
    to the universal Focused backend (DEC-025).

`chanora_audio::engine`
-----------------------

  * Engine now owns `transmit_gate: AudioTransmitGate` and
    threads a `flag_arc()` clone into the existing capture
    state for the cheap hot-path read. `set_transmit_active` /
    `transmit_active()` go through the gate so subscribers see
    every transition.
  * `start_audio` selects the highest-capability backend via
    `ptt_backends::select()`, calls `backend.start(gate, none())`,
    and spawns the watchdog. Both are released in `stop()` and
    on Drop.
  * New `engine.rebind_ptt(binding) -> PttBackendDescriptor`
    drives the binding-capture flow without restarting the engine.
  * New `engine.ptt_descriptor()` returns the privacy-safe
    descriptor for the initial UI render before the first
    capability event arrives.

`chanora_core`
--------------

  * Re-exports `PttBinding` + `PttInputClass`.
  * New `ChanoraSession::set_ptt_binding(binding)` — calls
    `audio.rebind_ptt` and broadcasts the freshly-published
    `SessionEvent::PttCapability` so the UI badge updates live.
  * New `ChanoraSession::ptt_descriptor()` for the initial render.

`chanora_bridge`
----------------

  * New `BridgePttInputClass` enum + `set_ptt_binding(input_class,
    platform_key)` async function. The `platform_key` string is
    opaque to the bridge and never logged.
  * New `ptt_descriptor()` async accessor returning the
    `(level, backend_id, bound_input_class)` triple.

Flutter
-------

  * `_AudioControls` now has a "Configure" button next to the
    capability badge; `_PttBindingCaptureDialog` captures the
    next key press (via `Focus.onKeyEvent`) or mouse side button
    (via `Listener.onPointerDown` filtered to button bitmasks
    `0x08` / `0x10`). The captured value is the platform-neutral
    `LogicalKeyboardKey.keyLabel` or `mouse-side-button:{button}`.
  * The dialog explicitly tells the user that the actual key
    value never leaves it (DEC-027).
  * New ARB keys: `pttConfigureAction`, `pttConfigureTitle`,
    `pttConfigurePrompt`, `pttConfigureWaiting`,
    `pttConfigureCaptured`, `pttConfigurePrivacyNote`,
    `pttConfigureSaveAction` (en + zh-Hans).

Dependencies
------------

  * `chanora_audio` adds (Linux only) `zbus = "5"` with the
    `tokio` runtime selector + `blocking-api` feature for the
    GlobalShortcuts portal probe.
  * `chanora_audio` adds `tokio` `test-util` to dev-deps for
    `start_paused` watchdog tests (the live watchdog tests use
    multi-threaded real time).

Verification
------------

  * `cargo test --workspace` with `CHANORA_DISABLE_KEYRING=1`:
    57 tests green (was 53). chanora_audio rises from 4 to 8.
  * `cargo deny check`: advisories ok, bans ok, licenses ok,
    sources ok.
  * `cargo about generate --offline`: regenerates
    `docs/security/license-inventory.{md,html}`. The crate count
    rises from 364 to 383 with the addition of the zbus tree.
  * `tools/dump_flutter_licenses.sh`: 94 packages, zero without
    LICENSE (unchanged).
  * `flutter analyze`: clean.
  * `cargo build -p chanora_bridge --release` + `flutter build
    linux --release`: clean Linux x86_64 bundle.

Documentation
-------------

  * `docs/release/release-readiness-go-nogo-record.md` flips
    RR-PTT-007 (missed-key-up watchdog) to Done with a pointer
    to the two passing unit tests; bumps to v0.9.4. Live
    per-platform traces (RR-PTT-001..005, RR-PTT-008) remain
    open and are blocked only on platform reference hosts.

Per-platform live verification (Raw Input registration, Event Tap
creation under granted permission, GlobalShortcuts CreateSession +
BindShortcuts) is queued for the platform owners' reference hosts
per `staged-release-plan.md`.
2026-05-15 15:38:42 +08:00

12 KiB

CHANORA_REL_Release_Readiness_Go_NoGo_Record_v0.9.2.2.1

Document type: Release Readiness Checklist / Go-No-Go Record
Version: 0.9.2
Status: Baseline Candidate
Language: English
Product: Chanora
Repo path: docs/release/release-readiness-go-nogo-record.md ---

1. Purpose

This document records the auditable release readiness decision for a Chanora release.

Design documents alone do not authorize release. A release requires an explicit readiness decision based on scope, build identity, requirement completion, verification evidence, security review, platform readiness, legal/privacy readiness, known risks, and approval.

2. Release Identity

Field Value
Release name TBD by Product Owner
Release type TBD: Internal Alpha / External Beta / MVP Public / Store Release
Release version TBD
Release candidate ID TBD
Release date target TBD
Release owner TBD
Product owner TBD
Engineering owner TBD
QA / verification owner TBD
Security reviewer TBD
Legal / compliance reviewer TBD

3. Build Identity

Field Value
Git repository TBD
Git branch TBD
Git commit SHA TBD
Git tag TBD
iOS App Store Connect upload SDK gate Xcode 26+ and iOS 26 / iPadOS 26 SDK+ for upload on or after 2026-04-28
Platform release policy included Yes
Build number TBD
CI pipeline ID TBD
Build timestamp TBD
Windows artifact TBD
macOS artifact TBD
Linux artifact TBD
Android artifact TBD
iOS artifact TBD
Artifact hash method SHA-256 unless otherwise specified
Artifact hashes TBD

4. Scope Readiness

Question Answer Evidence Owner
Is this release scope defined? TBD Release scope statement Product Owner
Is this release Internal Alpha, External Beta, MVP Public, or Store Release? TBD Release scope statement Product Owner
Are included features listed? TBD Release notes / scope list Product Owner
Are excluded/deferred features listed? TBD Deferred requirements list Product Owner
Are target platforms listed? TBD Platform readiness table Engineering Owner
Are known limitations documented? TBD Known issue register Product Owner / QA

5. Requirements Readiness

Requirement group Status Evidence Deferred items / waiver
P0 / MVP connection requirements TBD SRS/SWE.6 evidence TBD
P0 / MVP channel and state requirements TBD SRS/SWE.6 evidence TBD
P0 / MVP voice requirements TBD SRS/SWE.6 evidence TBD
Audio processing requirements TBD SWE.4/SWE.5/SWE.6 evidence TBD
Storage and secure storage requirements TBD SWE.4/SWE.5/SWE.6 evidence TBD
Diagnostics and redaction requirements TBD SWE.4/SWE.5/SWE.6 evidence TBD
Material 3 / UI requirements TBD SWE.6 evidence TBD
Accessibility requirements TBD SWE.6 evidence TBD
Platform behavior requirements TBD SYS.4/SWE.6 evidence TBD
i18n / Unicode requirements TBD SWE.4/SWE.5/SWE.6 evidence TBD
Traceability requirements TBD Validation report TBD

6. Verification Readiness

Verification layer Required evidence Status Failed items Waivers
SWE.4 Unit Verification Unit verification summary report TBD TBD TBD
SWE.5 Software Integration Verification Integration verification summary report TBD TBD TBD
SWE.6 Software Verification Software verification summary report TBD TBD TBD
SYS.4 System Integration Verification System integration verification summary report TBD TBD TBD
Regression Verification Regression report TBD TBD TBD
Manual exploratory test Test notes TBD TBD TBD

7. Security Readiness

Question Required answer Status Evidence
Is secure storage verified for supported platforms? Yes / waived TBD Security test report
Are secrets excluded from plaintext logs? Yes / waived TBD Redaction test result
Is diagnostic export redaction verified? Yes / waived TBD Diagnostics audit
Is dependency/license scan completed? Yes / waived TBD Dependency scan report
Are high/critical dependency issues resolved or waived? Yes / waived TBD Security waiver record
Are user-facing errors safe and non-sensitive? Yes / waived TBD Review record
Are platform permissions justified? Yes / waived TBD Permission review

8. Platform Readiness

Platform Release status Build artifact Verification status Known blockers Owner
Windows TBD: Go / Conditional Go / No-Go / Not in scope TBD TBD TBD TBD
macOS TBD: Go / Conditional Go / No-Go / Not in scope TBD TBD TBD TBD
Linux TBD: Go / Conditional Go / No-Go / Not in scope TBD TBD TBD TBD
Android TBD: Go / Conditional Go / No-Go / Not in scope TBD TBD TBD TBD
iOS TBD: Go / Conditional Go / No-Go / Not in scope TBD TBD, including Apple App Store SDK gate TBD TBD
Question Required answer Status Evidence Owner
Is the app clearly identified as unofficial and not affiliated with TeamSpeak? Yes TBD App copy / legal notice Legal
Is the TeamSpeak trademark/non-affiliation wording reviewed? Yes TBD Legal review record Legal
Is OSS license review completed? Yes TBD OSS notice / license report Legal / Engineering
Are Rust, Flutter, tsclientlib, and platform dependencies included in OSS review? Yes TBD OSS license report Legal / Engineering
Is privacy policy completed for the release scope? Yes TBD Privacy policy URL/file Legal
Are diagnostics/logging disclosures complete? Yes TBD Privacy policy / in-app notice Legal / Product
Are App Store / Play Store metadata requirements complete if applicable? Yes / N/A TBD Store metadata review Product / Legal

10. Known Issues and Waivers

Issue ID Description Severity Impact Waiver? Waiver owner Expiry / follow-up
TBD TBD TBD TBD TBD TBD TBD
Evidence document Required status before External Beta / Public release
CHANORA_SEC_Threat_Model_v0.9.2.2.1.md Reviewed; v1.0 approved before public release
CHANORA_SEC_Secure_Storage_Audit_Report_v0.9.2.2.1.md Completed for release-scope platforms
CHANORA_SEC_Diagnostic_Redaction_Audit_Report_v0.9.2.2.1.md Completed and approved
CHANORA_SEC_Dependency_And_Supply_Chain_Report_v0.9.2.2.1.md Completed with no unapproved critical/high risk
CHANORA_PRIV_Privacy_Policy_v0.9.2.2.1.md Legal/privacy reviewed; v1.0 approved before public release
CHANORA_LEGAL_Trademark_And_Attribution_Review_v0.9.2.2.1.md Legal reviewed; v1.0 approved before public release

10B. Key Product Decision Gate

Decision Required status before Go
Release type Confirmed
Release platform scope Confirmed
Minimum iOS version Confirmed
Apple App Store SDK gate Confirmed and release-inspected
Minimum Android version Confirmed
Android target SDK policy Confirmed
Multiple active connections in MVP Confirmed
AEC/AGC/NS/HPF default states Confirmed
Audio processing implementation path Confirmed
Legal/trademark/licensing review requirement Confirmed
Local database choice Confirmed
Flutter/Rust bridge choice Confirmed
Diagnostics upload policy Confirmed
Crash reporting policy Confirmed
Product license model Confirmed or explicitly not required for release scope

11. Release Decision

Decision Meaning
Go Release is approved for the stated scope and platforms.
Conditional Go Release is approved only if listed conditions are satisfied.
No-Go Release is not approved.

Decision: TBD: Go / Conditional Go / No-Go

12. Conditional Go Conditions

Condition ID Condition Owner Due date Evidence required
TBD TBD TBD TBD TBD

13. Approval

Role Name Decision Date Evidence / Signature
Product Owner TBD TBD TBD TBD
Engineering Owner TBD TBD TBD TBD
QA / Verification Owner TBD TBD TBD TBD
Security Reviewer TBD TBD TBD TBD
Legal / Compliance Reviewer TBD TBD TBD TBD
Release Manager TBD TBD TBD TBD

14. Change History

Version Date Description
0.9.0 2026-05-14 Initial release readiness and Go/No-Go record template.

Baseline Candidate 0.9.1 Update

Version Date Description
0.9.1 2026-05-14 Updated baseline after product decision closure: Apple App Store SDK gate uses Xcode 26+ and iOS 26 / iPadOS 26 SDK+ since 2026-04-28, platform baselines and decision traceability propagated across the document set.

Baseline Candidate 0.9.2 Update

Version Date Description
0.9.2 2026-05-14 Corrected Apple App Store Connect upload gate to 2026-04-28 and checked full-package naming, references, and coverage.

Desktop Push-to-Talk Release Readiness Addendum (Baseline Candidate 0.9.3)

The release readiness checklist for every desktop release artefact gains the following items per SysDes-148, SysRS-298, and DEC-023 / DEC-024 / DEC-025 / DEC-026 / DEC-027 / DEC-028.

Item Owner Evidence required Status
RR-PTT-001 Windows Global PTT verified on a Windows reference host. Windows Platform Owner Live measurement of PttCapabilityLevel + backend_id returned at runtime. Backend identifier shall be raw-input (preferred) or low-level-hook (fallback) for Global. Open
RR-PTT-002 macOS Global PTT verified with permission granted on a macOS reference host. macOS Platform Owner Live measurement + permission_state = Granted reported through the Event-Tap backend; UI capability badge screenshot. Open
RR-PTT-003 macOS Focused PTT fallback verified with permission denied. macOS Platform Owner Live measurement of PttCapabilityLevel::L0Focused after revoking Input Monitoring; UI capability badge screenshot showing the fallback notice. Open
RR-PTT-004 Linux Global PTT verified on GNOME-on-Wayland. Linux Platform Owner Live measurement returning gnome-wayland-portal backend identifier from a live GNOME-on-Wayland host; portal binding dialog screenshot. Open
RR-PTT-005 Linux Focused fallback verified on a non-tested compositor (any of: X11, sway, KDE) Linux Platform Owner Live measurement of L0Focused on at least one non-tested compositor; release notes do not claim Global support on the untested environment. Open
RR-PTT-006 Diagnostic export carries no key data. Privacy Reviewer Inspection of a user-initiated diagnostic export captured while PTT is bound to a real key; export shall contain capability_level, backend_id, bound_input_class and shall not contain a recognisable key code. Open
RR-PTT-007 Missed-key-up watchdog timeout demonstrated. Audio Owner Test trace showing transmit_active clearing after the configured 30 s ceiling when the watchdog forces a release. Done (v1.0.0-rc.4) — covered by chanora_audio::ptt::tests::watchdog_clears_transmit_after_timeout (and the negative watchdog_does_not_clear_on_normal_release). Live platform trace still required per RR-PTT-001..005.
RR-PTT-008 Capability badge matches runtime capability on every supported platform. UX Owner UI screenshot or platform-test trace. Open

A release decision shall be No-Go for any platform whose RR-PTT items are not all closed.

Version Date Description
0.9.3 2026-05-15 Added desktop PTT release-readiness items RR-PTT-001 through RR-PTT-008 covering Windows / macOS / Linux Global verification, permission-denied fallback verification, diagnostic-export privacy inspection, missed-key-up watchdog test, and capability-badge UI verification.
0.9.4 2026-05-15 RR-PTT-007 (missed-key-up watchdog) flipped to Done — the cross-platform chanora_audio::ptt::MissedKeyUpWatchdog ships in v1.0.0-rc.4 with two passing unit tests. Live per-platform traces (RR-PTT-001..005, RR-PTT-008) remain required for the live verification phase but are no longer blocked on engineering.