221a91cba4
libcanberra: plasma-workspace calls find_package(Canberra) TYPE REQUIRED and includes <canberra.h> from four translation units with no HAVE_CANBERRA guard, one of them libnotificationmanager (the core notification library). It cannot be made optional, so it is ported for real. Built shared: it dlopens its backend through libltdl, the libtool recipe stages libltdl.so only (no .a), so a static build left every consumer with an undefined lt_dlopenext. Audio is SILENT. Upstream 0.30 offers alsa/oss/pulse/gstreamer/null and none speak Redox; the pulse driver needs PulseAudio's client library, which PipeWire does not provide. The null driver is real upstream code, so the API/ABI is genuine and all consumers work -- but nothing reaches the speakers until a native /scheme/audio driver exists. KX11Extras et al: gate the five X11-only KWindowSystem headers behind the HAVE_X11 that plasma-workspace already defines. X11 is compiled OUT, not added. gate-kx11extras.py brace-matches each block and keeps any trailing else outside the guard, since wrapping a whole if/else-if chain yields invalid C++. check-recipe-escapes.py: a single backslash in a TOML multi-line string is a TOML escape, so a sed written as \bFoo\b parses to <BS>Foo<BS> and silently matches nothing -- no TOML error, no sed error. This class bit the tree three times. Now gated in preflight; it also found openssh, which used an invalid \$ and could not be parsed by any compliant parser. cook_build.rs: build git-tracked vendored sources OUT OF TREE. Recipe scripts rewrite their source, so builds were mutating version-controlled files: a no-op sed became indistinguishable from a working one, and the integrity gate fired so often that clearing it stopped being protective. Uses cp -a --reflink=auto, not cp -al: sed -i is link-safe but `cp -f` and `>` truncate in place and would write through a hard link into the tracked original. Content hashing still runs against the pristine tree, so hashes now describe committed state. Escape hatch: REDBEAR_IN_TREE_BUILD=1.