docs: record owned fanout checkpoint

This commit is contained in:
2026-08-21 16:13:41 -04:00
parent 9e52acf9d3
commit 3d1f114fd8
2 changed files with 40 additions and 21 deletions
+26 -12
View File
@@ -9,9 +9,11 @@ sliced S1S5: S1 and S2 are
merged; **S3a is merged locally** in pixelpass (`15d1374`); and **S3b is built, validated, and
committed locally** (`5d3da8b`). **S4, S5, 0d, round 11's bridge changes, and Phase 6's first
pure channel-planning prerequisite are built, validated, and committed locally in pixelpass
(`781defc`).** The Phase 6 mutation and phases 79 are not built — nothing released to date
changes the feature's user-visible behaviour. **Phase 6 is now the current front**; its live
fan-out remains the first audio-exclusion graph mutation.
(`781defc`).** The first bounded Phase 6 mutation slice is now built, validated and committed
locally in PixelPass (`98cde2c`): the hidden production path creates, retains, revokes and
crash-cleans exact-channel non-lingering fan-out links. Phase 6's status events and
sink-replacement recovery, plus phases 79, are not built — nothing released to date changes
the feature's user-visible behaviour. **Phase 6 remains the current front.**
**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.*
@@ -669,15 +671,27 @@ retained for the life of the share, per-port link sets, "captured" only when **e
link is `ACTIVE`, same-epoch revalidation immediately before each creation, proxy drop on
ancestry becoming unsafe.
> **Status 2026-08-21 — Phase 6 started, mutation not yet enabled.** The first bounded slice
> found and closed a prerequisite the old model did not carry: Port snapshots now retain
> `audio.channel`, and a pure planner produces exact link specs by channel rather than global-id
> or enumeration order. Five matrix tests pin FL/FR mapping, MONO fan-out, unknown/surround
> refusal, excluded-candidate refusal, and capture-sink replacement. Full non-GUI PixelPass:
> 318 passed, 0 failed, 9 ignored; the serialized live observer boundary test and strict Clippy
> pass. The next slice is the same-observer-callback mutation edge that creates and retains the
> planned non-lingering proxies; no fan-out link is created by the current checkpoint, committed
> locally in pixelpass `781defc`.
> **Status 2026-08-21 — first Phase 6 mutation slice built, validated and committed locally.** The
> hidden `DesktopExcluding` production path now launches a same-observer-callback link manager.
> It revalidates every recyclable id against its `object.serial` immediately before mutation,
> creates exact FL/FR (or MONO fan-out) links through `link-factory`, retains the proxies, marks a
> stream captured only when every required link is `ACTIVE`, and drops owned links before the
> capture sink on normal teardown. The links explicitly set `object.linger=false`.
>
> Twelve deterministic controller tests cover channel planning, recycled ids, idempotence,
> partial activation, late arrivals, newly unsafe ancestry, AEC gating/revocation and mutation
> failure. The full non-GUI suite passes with 326 passed, 0 failed and 10 ignored, and strict
> all-target Clippy is clean. The real hidden host path was also tested with a late stereo
> stream: exactly two native links became `ACTIVE`, no Pulse `module-loopback` fed the capture
> sink, and both links were revoked when the stream ended. A separate subprocess gate sent
> PixelPass `SIGKILL`; the connection-owned capture sink and both link object serials disappeared
> without Rust destructors. The three serialized live observer tests and `pixelpass --doctor`
> pass.
>
> This does **not** complete Phase 6. Versioned causal status events and actual capture-sink
> replacement/relink recovery remain, along with the unclosed failure-matrix rows. The public
> mode selector remains Phase 7 and PeerSpeak integration remains Phase 8. The last committed
> PixelPass base is `781defc`; this mutation slice is local commit `98cde2c` and remains unpushed.
Failure ⇒ report the stream unsupported. **Never** fall back to the default monitor — and after
0d that fallback is unconstructible in this mode, by either path.