The pre-rename migration added in 8fb8656d looks for the old webapp
entry with `old=$(grep -rl … | head -1)`. Finding nothing is the normal
case on a first install, but a bare assignment carries the pipeline's
status, so under `set -euo pipefail` a no-match grep (1) or a missing
applications dir (2) ended the whole script.
It ended it silently, after `==> App menu` had already printed and
before any handler ran, taking the plugin, the menu rows, the hooks,
the theme and the closing status with it. `punktfunk-omarchy setup`
exited non-zero, so the guided installer reported a failed step with
nothing to act on.
Two more assignments of the same shape get the same guard; one of them
already had an empty-case handler that could never be reached.
The self-check now runs `setup_webapp` on a clean box in a child bash,
because `set -e` is suppressed inside an `if` condition and an
in-process call passes while the real script dies. installer-smoke
runs that self-check — it existed, but nothing called it.