12-02. Сквозной тест свободного полёта на всех локациях

Цель: «меню → Лететь → разбег W+Shift → полёт → посадка → итог» проходит на altai, askarovo, aushkul, ongudai. Контекст: tests/game/test_game_flight.gd (образец: Game.tick, ErrorCatcher, защёлка), scripts/game/autopilot.gd, scenes/main.gd, scripts/ui/start_menu.gd, scripts/ui/result_screen.gd, configs/locations/*.json. Владения: новые tests/game/test_e2e.gd, tools/shots/e2e.sh, docs/screenshots/e2e/; scripts/game/autopilot.gd. Ошибки в чужих файлах не чинить — отчёт (файл, шаг, лог) в docs/screenshots/e2e/README.md для владельца. Шаги:

  1. Список локаций — из configs/locations/ (не хардкод). Для каждой: main.tscn, в FlightSetupScreen выбрать локацию и первый старт, «Лететь» (эмит кнопки), ждать загрузку.
  2. Autopilot держит W+Shift: на земле фаза разбега, отрыв, затем клавиши не дают тангажа до отпускания (защёлка).
  3. Полёт 60 с по курсу от склона, затем снижение до посадки на ровном (у выбранной точки посадки локации, если есть).
  4. Ждать ResultScreen.visible; проверить строки lines_for: время > 0, дистанция > 0, скорость касания.
  5. tools/shots/e2e.sh: на локацию 2 кадра — полёт (cockpit, взгляд вперёд) и экран итога. КРИТЕРИЙ ПРИЁМКИ: test_e2e.gd — 4 прогона, в каждом: отрыв ≤ 15 с игрового времени, посадка, экран итога с временем и дистанцией > 0, 0 ошибок/предупреждений в ErrorCatcher; все 4 ≤ 3 мин headless. 8 скриншотов с чек-листом в README (горизонт и земля видны, нет чёрного неба/дыр рельефа, итог читаем). tools/check.sh зелёный. Найденные чужие дефекты — списком с владельцем. Зависимости: нет (волна 1; после 12-01 — повторить прогон). Модель: sonnet. Размер: M.