Schritt 9/9 setzte bisher nur eine Warnung ab und lief mit Exit-Code 0
weiter, obwohl die neue Version bereits live war. Jetzt zählt auch
tests/e2e/run.sh zum Gate (überspringt sich selbst mit Exit 0 ohne
Runner), ein Fehlschlag setzt UPDATE_FAILED=true und beendet das
Script mit Exit-Code 1. Kein automatischer Rollback – stattdessen ein
lauter Hinweis auf das Backup aus Schritt 3 und ./scripts/restore.sh.
--no-tests bleibt als Notausstieg bestehen.