06. Волна: подъём и роторы согласованы с лентикулярами (остаток VR-27)

Цель: проверить численно, что физика волны (wave_field.gd) и облака-лентикуляры/роторные клочья стоят в одних и тех же местах, и что в волне реально набрать выше базы кучевых.

Контекст: scripts/atmosphere/wave_field.gd, configs/weather/wave.json, configs/atmosphere.json (wave.*), tests/atmosphere/test_hazards.gd (test_lee_wave_crest_lift), docs/guide/atmosphere.md «Опасная и особая погода».

Владения: scripts/atmosphere/wave_field.gd, configs/weather/wave.json, секция wave в configs/atmosphere.json, tests/atmosphere/test_wave.gd (новый). Шейдеры и рендер линз — группа 3, не трогать (только данные гребней из WaveField).

Шаги:

  1. На синтетическом гребне и на одной реальной локации (Онгудай) взять центры линз из WaveField (то, что отдаётся рендеру).
  2. Проверить: в центре линзы w ≥ 0,5·wave.max_ms; на полволны дальше — w < 0; ротор-болтанка у земли под гребнем ≥ 2 × фоновой; λ совпадает с 2πU/N ± 10 %.
  3. Полёт: крыло держит курс против ветра в гребне первой волны → набор выше базы кучевых пресета ≥ 500 м за 15 мин.
  4. Без пресета волны — ни линз, ни подъёма (уже есть, не дублировать).

Критерий приёмки: все проверки шагов 2–3 зелёные на синтетике и Онгудае; при расхождении линз и подъёма — исправлена фаза в wave_field.gd (один источник для физики и облаков); --filter=atmosphere зелёный.

Зависимости: после агента atmosphere; параллельно со всеми. Модель: sonnet. Размер: S.