58fab73699
brush-core's alias expander resolves aliases via `value.split_ascii_whitespace()` (`crates/brush-core-vendored/src/interp.rs:1500`, upstream brush issue reubeno/brush#57): each whitespace piece is dropped into argv as-is, completely bypassing the shell parser. Any alias body containing `(`, `)`, `|`, `&`, `;`, `<`, `>`, or `\`` therefore turns the first piece into the command name, so Fedora's default `alias which='(alias; declare -f) | /usr/bin/which …'` produces `error: command not found: (alias;` for every `which` invocation. The user's shell snapshot is generated by sourcing their real rc-file under `/bin/bash` or `/bin/zsh` (so we can capture functions, options, PATH) and then sourced by brush per-session. `sanitizeSnapshotForBrush` now scans the emitted `alias -- NAME='VALUE'` lines after generation, drops any whose decoded body contains those metacharacters, and rewrites the file in place before caching. Compatible aliases (`ll='ls -l'`, `gc='git --color=auto commit'`, embedded-quote `say='echo '\\''hi'\\'''`) are preserved untouched; dropped names are logged at debug. brush then falls through to whatever lives on `PATH`, which is what the user expected when they ran `which` in the first place. Covered by unit tests for the sanitizer (Fedora-which case, every incompatible-metachar shape, every preserve case) and an integration test that loads a poisoned snapshot and verifies `which sh` now exits `0` with a real path. Fixes #3234