# Screenshare audio exclusion — ownership tagging wire contract. # # peerspeak PRODUCES these carriers on every audio node it owns; pixelpass # CONSUMES them as the primary taint root of the exclusion engine. Neither # repo depends on the other, so this file is the contract: it is committed # byte-identical in both, and each repo has a test that asserts its own named # constants (and, on the producer side, the environment a real child Command # would carry) match these values exactly. # # peerspeak/tests/fixtures/ownership-tag-contract.txt # pixelpass/tests/fixtures/ownership-tag-contract.txt # # Pinned by peerspeak docs/screenshare-audio-exclusion-impl-plan.md §3 and # docs/screenshare-audio-exclusion-plan.md §5.1 (v3.5). Changing a value here # is a cross-repo breaking change: both repos must land in the same session, # and the phase 5 matrix must be re-run. # # Two carriers, matched as a UNION — a node is peerspeak-owned if EITHER # matches. Round 8 added the second because a property is invisible to the # PipeWire registry `global` event and readable only via a node bind, so the # primary taint root must not rest on one observation mechanism alone. # Carrier 1 — a node property, matched EXACTLY: `prop_value` below is the # ONLY spelling the consumer reads as owned. A producer emitting "true", "yes" # or "" is NOT owned on this carrier, and only carrier 2 would still catch it. # # ⚠️ This wording is load-bearing and it CHANGED in round 10. The consumer # used to accept any value other than "false"/"0", on the theory that leniency # over-excludes and is therefore safe. It is not: leniency buys false-positive # exclusion, and it let any process suppress a rival application's audio from # the share with a property it did not even have to spell right. Fail-closed # on this feature is about ANCESTRY — an unresolvable graph is not eligible — # not about parsing. prop_key=peerspeak.owned prop_value=1 # Carrier 2 — a `node.name` prefix, announced by the registry without a bind. # `node.description` is deliberately NOT touched, so mixers still show "mpv". # Only the prefix is matched; the rest of the name is for diagnostics. node_name_prefix=peerspeak_owned_ node_name_format=peerspeak_owned__ node_name_example=peerspeak_owned_mpv_31284