docs: record Phase 6 refusal gates

This commit is contained in:
2026-08-21 19:45:33 -04:00
parent a1df62ce21
commit 46dc5902d6
2 changed files with 51 additions and 6 deletions
+30 -1
View File
@@ -16,7 +16,9 @@ are built, validated and committed locally in PixelPass (`5a65f50`). Capture-sin
and successful exact-channel relinking are built, validated and committed locally in PixelPass
(`d09ee9b`). **The Row 1 mutation-edge identity gate and the Row 8d/8e fail-closed
construction gates are built, validated and committed locally in PixelPass (`6be07ef`).**
The remaining Phase 6 refusal/matrix rows, plus phases 79, are not built — nothing
**The independent Row 6a/6b/6c refusal gates are built, validated and committed locally in
PixelPass (`956534f`).** The remaining Phase 6 matrix/qualification work, plus phases 79,
is 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
@@ -738,6 +740,33 @@ ancestry becoming unsafe.
> system Rust 1.97.1. The disposable 1.0 GiB release cache was removed afterward, leaving 12 GiB
> free. Next is the independent Row 6a/6b/6c refusal/reason slice; Phase 6 is not complete.
> **Row 6a/6b/6c slice — built, validated and committed locally as PixelPass `956534f` on
> 2026-08-21.**
> The bound Node observer now subscribes to the configured `SPA_PARAM_Format` only for
> `Stream/Output/Audio` nodes that advertise it as readable, and classifies the native libspa
> format as raw, encoded or IEC958. Missing/unparseable format evidence is a per-stream
> fail-closed `format-unknown`, not permission to link. `node.passthrough` stays a separate
> predicate, so it cannot be masked by the format classifier.
>
> Three independent controller fixtures prove Row 6a `port.exclusive`, Row 6b encoded and Row
> 6c IEC958 each make **zero** link-creation attempts and emit exactly their own
> `stream_unsupported` reason (`port-exclusive`, `encoded`, `iec958-passthrough`) once. A fourth
> gate independently exercises explicit `node.passthrough`; another proves the ordinary
> Node-info-before-Format ordering stays fail-closed without emitting a transient false warning,
> then captures once raw PCM arrives. Row 6a remains the accepted injected-graph gate: v1 still
> does not bind Ports, so a live exclusive port reaches the already-gated clean link-failure path.
>
> The first read-only live audit exposed and prevented two observer defects before completion:
> generic Pod deserialization rejected the real Format object, and enumerating Format on every
> driver Node produced expected ENOENT/EIO core errors. The corrected path uses libspa's native
> format parser and the Node's advertised readable-param list. A second live audit observed
> Strawberry, FFXIV and Chromium settle from `format-unknown` to eligible raw PCM within the
> initial callback burst, with no parse or core errors. Full PixelPass validation is 342 passed,
> 0 failed and 12 ignored; all three Row 6 gates pass in an optimized one-job release build;
> strict all-target Clippy, formatting, `git diff --check` and `pixelpass --doctor` pass. The
> 966 MiB disposable release cache was removed and disk space returned. Next is the revised Row
> 9 positive/negative partition; Phase 6 is not complete.
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.
+21 -5
View File
@@ -1401,13 +1401,29 @@ zero unsafe creates. Two optimized-release fault-injection gates prove capture-s
failure and readiness timeout both fail `DesktopExcluding` closed without resolving the legacy
default monitor or constructing legacy routing. Full validation reports 335 passed and 12
ignored; strict Clippy, all three serialized live Phase 6 gates, diagnostics and residue checks
pass. The next bounded slice is the three independent Row 6a/6b/6c refusal/reason fixtures.
pass.
1. **Continue Phase 6:** add independent refusal/reason fixtures for Row 6a `port.exclusive`,
Row 6b encoded streams and Row 6c IEC958 passthrough.
2. Carry the revised row-9 partition forward: music-only and a different-device microphone
PixelPass commit `956534f` closes the three independent Row 6a/6b/6c refusal/reason fixtures.
`Stream/Output/Audio` Nodes advertising a readable configured Format
param are subscribed and parsed through libspa into raw, encoded or IEC958; unknown format is
per-stream fail-closed, while the existing `node.passthrough` property remains an independent
predicate. Separate controller gates prove `port.exclusive`, encoded and IEC958 each make zero
link-create calls and emit only `port-exclusive`, `encoded` and `iec958-passthrough`
respectively. An additional gate proves an explicit passthrough property cannot be masked by a
raw Format, and the initial Node-info-before-Format ordering does not emit a false warning.
A read-only live audit initially caught generic Pod parsing failures and harmful Format queries
against Nodes that did not advertise the param. After switching to libspa's native parser and
gating queries on readable Format support, Strawberry, FFXIV and Chromium all settled to raw
eligible streams with no parse/core errors. Full validation is 342 passed and 12 ignored; the
three Row 6 cases also pass optimized release, strict Clippy and `pixelpass --doctor` are clean.
The `port.exclusive` case remains an injected-graph gate under v1's accepted no-Port-binding
limitation; a live exclusive port still degrades through the separately tested link-failure path.
1. **Continue Phase 6:** carry the revised Row 9 partition forward: music-only and a
different-device microphone
stay eligible; same-device capture and a tainted-monitor capture are excluded.
3. Preserve the new live mutation slice's ownership, serial-revalidation, fail-closed,
2. Preserve the new live mutation slice's ownership, serial-revalidation, fail-closed,
exact-channel, all-links-active and crash-cleanup gates while finishing the phase.
Still owed beyond that, unchanged: the §9.2 rig upgrade before any exclusion claim is