docs(ptt): land Baseline Candidate v0.9.3 — capability-based desktop PTT
Applies the gen2 desktop-PTT review summary
(`gen2/chanora-desktop-ptt-review-summary-v0.9.2.md`) to our doc set
with the owner rulings PTT-OPEN-001 through PTT-OPEN-006 resolved as
accepted decisions DEC-023 through DEC-028:
* DEC-023 Windows Global PTT P0 / MVP
* DEC-024 macOS Global PTT P0 / MVP with permission UX
* DEC-025 Linux officially-tested env: GNOME on Wayland only
* DEC-026 Mouse side buttons supported (Win + macOS; Linux portal)
* DEC-027 PTT diagnostics: capability + availability only, no
raw key codes ever
* DEC-028 Missed-key-up watchdog: P0
Requirements (SysRS / SRS) and architecture (SysDes / SAD / SDD)
gain the desktop-PTT ID set the gen2 summary describes:
SysRS-296..302 -> SysDes-142..148
-> SRS-195..203
-> SAD-071..079
-> SDD-081..092
ID totals advance from 295 / 141 / 194 / 70 / 80 to 302 / 148 / 203
/ 79 / 92. The strict layered sourcing rule (`SRS -> SysDes` only,
`SAD -> SRS` only, `SDD -> SAD` only) is preserved; the
`tools/validate_docs.py` validator reports zero undefined refs and
zero direct-layer-rule violations.
New document:
* `docs/architecture/desktop-ptt-architecture.md` — capability
ladder (L0Focused, L1GlobalShortcut, L2GlobalHoldToTalk,
L3GlobalWithMouseButtons, L4DeviceAware reserved), Windows /
macOS / Linux strategies, privacy rule, audio-gate rule,
missed-key-up watchdog, release-readiness evidence requirement,
traceability summary.
Doc addenda (Baseline Candidate 0.9.3):
* `privacy/privacy-policy.md` — no raw key history, capability-
dependent Global PTT, UI reflects actual runtime capability
* `security/threat-model.md` — THREAT-PTT-001..006
* `security/diagnostic-redaction-audit-report.md` —
REDACT-PTT-001..006 banned field list enforced by `PttSanitizer`
* `release/platform-release-policy.md` — per-platform evidence
fields, no over-claim on untested Linux compositors
* `release/release-readiness-go-nogo-record.md` — RR-PTT-001..008
release-readiness items
* `verification/swe4-unit-verification-plan.md` —
SWE4-UV-035..039
* `verification/swe5-software-integration-verification-plan.md` —
SWE5-IV-015
* `verification/swe6-software-verification-plan.md` — SWE6-SV-017
* `verification/sys4-system-integration-verification-plan.md` —
SYS4-SIV-016
* `governance/traceability-matrix.md` — full PTT trace rows +
verification map
* `governance/decision-impact-assessment.md` — DEC-023..028
impact matrix
* `governance/product-decision-register.md` v0.9.9 entry
recording DEC-023..028 in the decision table and the status
table at §7
* `governance/document-index.md` — adds
`desktop-ptt-architecture.md` to the controlled set
* `architecture/proof-of-concept-plan.md` —
PoC-PTT-001..005 platform items
* `references/external-references.md` — Windows Raw Input,
macOS event-tap, Linux GlobalShortcuts portal references
* Both validation reports
(`baseline-candidate-validation-report.md`,
`repo-format-validation-report.md`) bumped to v0.9.3 with the
new ID totals (302 / 148 / 203 / 79 / 92).
README §"Desktop Push-to-Talk" added between Architecture Overview
and Repository Layout: capability levels, per-platform strategy,
privacy posture, missed-key-up watchdog.
Tooling:
* `tools/validate_docs.py` copied from the gen2 zip into the
repo tree (was previously available only inside the zip).
Reports zero undefined refs, zero direct-layer-rule violations,
English-only CJK check passes. The 35 "old package-style
filename" hits are pre-existing and identical to the gen2
baseline (they live in `path-migration-map.md` and config-ID
headers of governance docs and are intentional per the path
migration policy).
* `.gitignore` adds `/gen2/` so the externally-provided review
package does not enter the repo.
No code changes in this commit; B (the implementation split into
`transmit_active` / `capture_active`, `PttCapabilityLevel`
reporting, `PttSanitizer` diagnostics rule, and the UI capability
badge) follows in a separate commit.
This commit is contained in:
@@ -1005,12 +1005,121 @@ The registry supports consistency between architecture, detailed design, impleme
|
||||
- Source SAD: SAD-069, SAD-070
|
||||
- Verification method: Privacy Review, Security Audit
|
||||
|
||||
**SDD-081**: `DesktopPttBackend` shall be a Rust trait in `chanora_audio::ptt` exposing `fn capability(&self) -> PttCapabilityLevel`, `fn backend_id(&self) -> &'static str`, `fn start(&mut self, gate: Arc<AudioTransmitGate>, binding: PttBinding) -> Result<(), PttError>`, `fn stop(&mut self)`, and `fn rebind(&mut self, binding: PttBinding) -> Result<(), PttError>`. Implementations shall be Send and stop on Drop.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `DesktopPttBackend`
|
||||
- Source SAD: SAD-071
|
||||
- Verification method: Unit Test, Inspection
|
||||
|
||||
**SDD-082**: `PttCapabilityLevel` shall be a plain Rust enum (`L0Focused`, `L1GlobalShortcut`, `L2GlobalHoldToTalk`, `L3GlobalWithMouseButtons`, `L4DeviceAware`) with a public `as_str(&self) -> &'static str` mapping for diagnostics. `L4DeviceAware` is reserved and shall not be produced by any MVP implementation.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `PttCapabilityLevel`
|
||||
- Source SAD: SAD-071
|
||||
- Verification method: Unit Test
|
||||
|
||||
**SDD-083**: `WindowsRawInputBackend` shall use the `RegisterRawInputDevices` Win32 API targeting `HID_USAGE_PAGE_GENERIC` keyboard and mouse usages, run a dedicated message-only window on its own OS thread, and forward only sanitised binding-match results to the `AudioTransmitGate`. Raw `RAWINPUT` payloads shall never cross the backend boundary.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `WindowsRawInputBackend`
|
||||
- Source SAD: SAD-072
|
||||
- Verification method: Platform Test (Windows), Unit Test
|
||||
|
||||
**SDD-084**: `WindowsHookBackend` shall be used only when Raw Input registration fails. It installs `WH_KEYBOARD_LL` and `WH_MOUSE_LL` hooks on its dedicated thread; the hook callbacks compare against the active binding and call `AudioTransmitGate::set` only, never logging key data. The hook is uninstalled on Drop.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `WindowsHookBackend`
|
||||
- Source SAD: SAD-072
|
||||
- Verification method: Platform Test (Windows), Unit Test
|
||||
|
||||
**SDD-085**: `MacOSEventTapBackend` shall create a `CGEventTap` filtered to keyboard and mouse-button events, attached to the main run loop with an explicit retain. The tap callback shall consult the active binding and call `AudioTransmitGate::set` only. The backend shall expose `permission_state() -> Granted | Denied | Undetermined` via `IOHIDCheckAccess` (or the macOS-version-appropriate equivalent) and shall return `PttCapabilityLevel::L0Focused` when permission is not Granted.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `MacOSEventTapBackend`
|
||||
- Source SAD: SAD-073
|
||||
- Verification method: Platform Test (macOS), User Acceptance Test
|
||||
|
||||
**SDD-086**: `LinuxGnomeWaylandBackend` shall call `CreateSession`, `BindShortcuts`, and listen for `Activated` / `Deactivated` signals on the freedesktop `org.freedesktop.portal.GlobalShortcuts` D-Bus interface. Binding capture shall use the portal's own configuration dialog; Chanora itself does not read raw key events. Missing D-Bus or missing portal interface resolves to `PttCapabilityLevel::L0Focused`.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `LinuxGnomeWaylandBackend`
|
||||
- Source SAD: SAD-074
|
||||
- Verification method: Platform Test (Linux, GNOME Wayland), Unit Test
|
||||
|
||||
**SDD-087**: `FocusedPttBackend` shall integrate with Flutter's keyboard / pointer event stream via the existing `Listener` widget path and the bridge `set_ptt` command. Reports `PttCapabilityLevel::L0Focused` and `backend_id = "focused"`.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `FocusedPttBackend`
|
||||
- Source SAD: SAD-071, SAD-072, SAD-073, SAD-074
|
||||
- Verification method: Unit Test, UI Review
|
||||
|
||||
**SDD-088**: `PttController` shall sit in `chanora_core::ptt` and own a `Box<dyn DesktopPttBackend>`, a clone of `AudioTransmitGate`, a `watch::Sender<PttCapabilityLevel>` for live publication to the bridge, and a `tokio::sync::Mutex` over the active `PttBinding`. Public surface: `set_binding`, `current_capability`, `subscribe_capability`.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `PttController`
|
||||
- Source SAD: SAD-071, SAD-076
|
||||
- Verification method: Unit Test, Integration Test
|
||||
|
||||
**SDD-089**: `AudioTransmitGate` shall be `Arc<AudioTransmitGate>` wrapping a `tokio::sync::watch::Sender<bool>` and an internal `AtomicBool`. `set(v)` updates both atomically; `load()` reads the atomic; `subscribe()` hands out a `watch::Receiver` for the missed-key-up watchdog task.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `AudioTransmitGate`
|
||||
- Source SAD: SAD-075
|
||||
- Verification method: Unit Test
|
||||
|
||||
**SDD-090**: `PttSanitizer` shall implement `tracing_subscriber::Layer` and decorate the existing `RedactingLogLayer`. Records whose field names match the SDD-077 banned list shall be dropped before `on_event` reaches the wrapped sink. The implementation shall be allocation-free on the success path (the typical "no banned field" case).
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `PttSanitizer`
|
||||
- Source SAD: SAD-077
|
||||
- Verification method: Unit Test, Privacy Review
|
||||
|
||||
**SDD-091**: `PttCapabilityBadge` shall be a Flutter widget rendered inside the Voice Bar, subscribed to the FRB stream of `BridgeEvent::PttCapability`. The widget shall map each enum value to a short user-facing label and shall render an info icon that opens a per-platform explanation sheet when the resolved capability is `L0Focused`.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `PttCapabilityBadge`
|
||||
- Source SAD: SAD-078
|
||||
- Verification method: UI Review, User Acceptance Test
|
||||
|
||||
**SDD-092**: `MissedKeyUpWatchdog` shall be a tokio task spawned by the audio engine that holds the `watch::Receiver<bool>` from `AudioTransmitGate::subscribe()`. On each transition from `false` to `true` the task records the timestamp; on each `true -> false` transition the task clears the timestamp. If the transition timeline shows `true` for longer than the configured timeout the task calls `AudioTransmitGate::set(false)` and emits a sanitised diagnostic record.
|
||||
|
||||
- Status: Draft
|
||||
- Type: Software Detailed Design Item
|
||||
- Stage: P0 / MVP
|
||||
- Software unit: `MissedKeyUpWatchdog`
|
||||
- Source SAD: SAD-079
|
||||
- Verification method: Unit Test, Integration Test
|
||||
|
||||
## 11. Updated SAD-to-SDD Coverage Matrix
|
||||
|
||||
| SAD Range | SDD Coverage |
|
||||
|---|---|
|
||||
| SAD-001 through SAD-060 | Covered by inherited SDD baseline `SDD-001` through `SDD-070` |
|
||||
| SAD-061 through SAD-070 | Covered by `SDD-071` through `SDD-080` |
|
||||
| SAD-071 through SAD-079 | Covered by `SDD-081` through `SDD-092` |
|
||||
|
||||
|
||||
## Baseline Candidate 0.9.1 Update
|
||||
@@ -1025,3 +1134,10 @@ The registry supports consistency between architecture, detailed design, impleme
|
||||
| Version | Date | Description |
|
||||
|---|---|---|
|
||||
| 0.9.2 | 2026-05-14 | Corrected Apple App Store Connect upload gate effective date and preserved layer-specific traceability. |
|
||||
|
||||
|
||||
## Baseline Candidate 0.9.3 Update
|
||||
|
||||
| Version | Date | Description |
|
||||
|---|---|---|
|
||||
| 0.9.3 | 2026-05-15 | Added desktop PTT detailed design SDD-081 through SDD-092: `DesktopPttBackend` trait, `PttCapabilityLevel` enum, Windows Raw-Input + low-level-hook + Focused implementations, macOS event-tap + Focused implementations, Linux GNOME-Wayland portal + Focused implementations, `PttController`, `AudioTransmitGate`, `PttSanitizer` layer, `PttCapabilityBadge` widget, `MissedKeyUpWatchdog` task. Strict sourcing (`SDD -> SAD` only) preserved. |
|
||||
|
||||
Reference in New Issue
Block a user