copy-dist.mjs rm -rf'd internal/webui/dist before copying the SPA in, so every npm run build deleted the committed .gitkeep and a fresh checkout went back to failing go:embed. Restore the placeholder after the copy, and also on a failed copy (an empty dist/ still compiles; a missing dir does not), so the wipe only ever clears build output.