diff --git a/docs/screenshare-audio-exclusion-impl-plan.md b/docs/screenshare-audio-exclusion-impl-plan.md index 4926d5f..a0fc99b 100644 --- a/docs/screenshare-audio-exclusion-impl-plan.md +++ b/docs/screenshare-audio-exclusion-impl-plan.md @@ -22,8 +22,10 @@ validated and committed locally in PixelPass (`7b11827`).** The deterministic Ph link-manager matrix is complete. **The production-path three-arm AEC leak qualification is built, validated and committed locally in PixelPass (`e027bc6`), completing Phase 6.** **Phase 7's public selector, AEC wiring and versioned capability response are built, validated -and committed locally in PixelPass (`792f2bd`).** Phases 8–9 are not built — nothing released to -date changes the feature's user-visible behaviour. **Phase 8 is now the current front.** +and committed locally in PixelPass (`792f2bd`).** **Phase 8's PeerSpeak capability negotiation, +picker/argv integration and causal status surface are built, validated and committed locally +(`2c2b861`).** Phase 9 remains unbuilt; nothing has been released. **Phase 9 is now the current +front and remains the ship gate.** **Date:** 2026-07-21 (v4); status line refreshed 2026-08-21 **Design of record:** [`screenshare-audio-exclusion-plan.md`](screenshare-audio-exclusion-plan.md) v3.8, round 11. **Scope:** *ordering, gates and acceptance criteria only.* @@ -968,6 +970,35 @@ variant names (0d) do not block on it. - Capability-gated picker entry; wording per v3.4 §11. - Regression: existing `--app` / `--strict-audio` argv byte-identical to today. +> **Phase 8 — built, validated and committed locally as PeerSpeak `2c2b861` on 2026-08-21.** +> The picker/core boundary now uses one typed selection for legacy desktop, desktop-excluding, +> and strict per-app audio. `System audio except PeerSpeak` appears only when the exact resolved +> PixelPass advertises `desktop_audio_exclusion`; the existing `All system audio` choice remains +> alongside it with its echo warning. The machine-readable schema is primary, `--help` is only +> the old-PixelPass strict-app fallback, and the two capability bits stay independent. +> +> Capability results carry the resolved executable path. A capability-gated share reuses the +> picker probe only for that same path; a changed override or `$PATH` resolution is re-probed at +> start and fails closed when the selected feature is absent. The new mode emits exactly +> `--audio-mode=desktop-excluding` plus `--aec=off|pulse-module:`. The session-owned +> `EchoCancelGuard` exposes its verified numeric module index without moving the guard out of the +> load-bearing teardown object. Legacy desktop and per-app argv still delegate to the old builder +> and are byte-identical. +> +> All four version-1 exclusion events parse into one shared status type that crosses the actual +> host-notice channel into `UiEvent`; there is no duplicate matching enum. The UI retains an +> explanatory warning even when a status races the share-start acknowledgement, displays it with +> the live sharing badge, clears it on stop, and ignores late events for another mode. Exact +> parser and causal tests cover `stream_unsupported`, `aec_failed`, `aec_revoked`, and +> `foreign_aec_warning`. +> +> Final serialized validation (used after the parallel all-target link exhausted disk) passes: +> 649 unit tests with 7 live-only ignored, 20 integration tests with 4 live-only screen-share +> gates ignored, strict all-target Clippy, formatting, and `git diff --check`. The host-fault +> integration target compiles with the typed command. PixelPass's completed 9.1 GiB target tree +> was cleaned to recover disk; no source or Git state was removed. Phase 9 remains the explicit +> rig-upgrade and two-machine field-test ship gate. + --- ## 7. Phase 9 — rig upgrade and field tests 🚦 SHIP GATE diff --git a/docs/screenshare-audio-exclusion-plan.md b/docs/screenshare-audio-exclusion-plan.md index 046834e..fcb1b3c 100644 --- a/docs/screenshare-audio-exclusion-plan.md +++ b/docs/screenshare-audio-exclusion-plan.md @@ -14,8 +14,9 @@ and committed locally in PixelPass `d09ee9b`. The Row 1 mutation-edge identity g (`7b11827`) complete the deterministic link-manager matrix. The production-path three-arm AEC leak qualification is built, validated and committed locally in PixelPass `e027bc6`; **Phase 6 is complete.** The public selector, AEC wiring and versioned capability response are built, -validated and committed locally in PixelPass `792f2bd`; **Phase 7 is complete and Phase 8 is the -current implementation front.** +validated and committed locally in PixelPass `792f2bd`; **Phase 7 is complete.** PeerSpeak +`2c2b861` completes the capability-bound picker/argv and causal UI status integration; +**Phase 8 is complete and Phase 9 is now the ship gate.** **Date:** 2026-08-21 (v1: 07-19 · v2: 07-20 · Option C 07-20 · v3.1 r4 · v3.2 r5 · v3.3 r6 · v3.4 r7 · v3.5 r8 · v3.6 r9 · v3.7 r10 · v3.8 r11 2026-08-21) **Origin:** Joe's suggestion — "whitelist all audio except audio coming from peerspeak." @@ -1460,11 +1461,18 @@ frequencies outside the Hann main lobe; the 3 dB guarded tolerance and 18 dB nai unchanged. Final validation is 354 passed and 13 ignored; strict Clippy, all four serialized live gates, exact capability/help probes, `pixelpass --doctor` and residue checks pass. -1. **Continue with Phase 8:** bind capability results to the resolved PixelPass path and add the - capability-gated picker plus exact mode/AEC argv. -2. Carry Phase-6 status events causally through the core/UI message boundary, preserving existing - per-app argv byte-for-byte and proving old-PixelPass fallback emits no new flags. +PeerSpeak commit `2c2b861` completes Phase 8. A typed picker/core selection keeps legacy desktop, +desktop-excluding and per-app capture distinct. The versioned capability result is bound to its +resolved PixelPass path and re-probed on path changes before capability-gated argv is built. The +new picker row emits both `--audio-mode=desktop-excluding` and explicit +`--aec=off|pulse-module:`; old PixelPass keeps the row absent and receives no new flags. +Legacy desktop and per-app argv remain byte-identical. -Still owed beyond that, unchanged: the §9.2 rig upgrade before any exclusion claim is -published, and **field-test §12** — nothing in this design has been tested over the real +The four Phase-6 status values now cross the real host-notice channel into the UI as the same +parsed type and drive a persistent, mode-scoped explanation beside the live sharing badge. Final +serialized validation passes 649 unit tests (7 live-only ignored), 20 integration tests (4 +live-only screen-share gates ignored), strict all-target Clippy, formatting and diff checks. + +**Phase 9 is current.** Still owed, unchanged: the §9.2 rig upgrade before any exclusion claim +is published, and **field-test §12** — nothing in this design has been tested over the real GStreamer/AAC/network path or on two machines.