Журнал хода работ: модель воздуха (feature/air-model)
Каталог экспериментальных и эталонных данных:
docs/research/experimental_data.md.
Координатор К0. План — docs/plan/air_model.md. Коротко: задача → статус, исполнитель, коммиты, ключевые числа, решения.
| Задача | Статус | Исполнитель | Коммиты | Числа / решения |
|---|---|---|---|---|
| AM-00 База | принята | Sonnet | a287b0c | headless 609 тестов; GPU-прогон tools/gpu_tests.sh (TestCase.needs_gpu, флаг –gpu); air_velocity_at 14,3 мкс; FPS 89–117; подветр. СКО w 1,08–1,27 м/с, рывки 7–26/мин (3 старта); термики сила ≈2,4 м/с, потолок ≈1790 м, сосед ≈590 м; скрипт tools/research/air_model_baseline/probe.gd; docs/archive/plan/air-model-baseline.md |
| AM-01 3D-эталон CuPy | принята (+ AM-01а: Askervein) | Opus | a20d349, 8f04f5a, 936c7f9, fe27a5d, cf64b7b, 6cdc3a3, cd89fbf; AM-01а c3736f2 (слито) | маска MAC; 8 м/с сходится на 400/200/100/50 м (шлюз пройден); итераций 41–161, 400 м ≤ 1,1 с, 200 м ≤ 4,7 с, окна ≤ 0,8 с; ∇·u·Δx/U ≤ 4e-8; седловина ×1,9; Askervein: ошибки модели нет (ошибка была в сравнении — профиль к RS 10 м); разгон занижен дискретизацией: 50 м/1-й порядок против 25 м/2-й — 0,80–0,84 на 20–50 м над Каянчей, 0,92 на 100 м; 12,5 м/2-й порядок сходится к линейному эталону и измерениям; библиотека: ближайшее по направлению 50–75 %, смесь 8–15 %; погода 18 vs 26 °C — 28–44 % |
| AM-02 Блоки на GPU | принята | Opus | e4f4632, b455f1f, b11924c | все блоки ≤ 3,9e-6 отн. к float64; побитно; порции ≤ 25 мс; V-цикл 1,2–1,4 мс (96²×48), 3,5–7 мс (192²×48); lavapipe ок, RADV не проверен; узкое место — зебра z/y на 192² (20–30 % полосы); баг RD: буфер дважды в наборе теряет барьер; docs/guide/air-model-gpu.md |
| AM-03 Пикар на GPU | принята | Opus | 977a5a3, ae82c41, 78a3444, 4e958cd, 102b903, 7ab6d49, 2d3d3b6 | эталоны ref/: итерации совпадают, max |
| AM-04 Клипмапы | принята, слита (ветка удалена) | Opus | 5618a59, 85e27a7, aea38fa, 3d01896, efd5d58, 4e71747 | окна 100/50 м (64×64) от области 400 м, AirClipmap, AirWindowJob, C7 v1, C9 v2 (set_focus); против эталона: итерации 40–50 (эталон 41–51), поле ≤ 3e-4· |
| AM-05 WindField, атмосфера | принята | Opus | b3c50ab, ac43926, 3951641 | WindField/AirFieldSet (центры клеток, лог-профиль у земли, край smoothstep 5 клеток, подмена set_field(…, blend_s=60)); стык: горизонталь+w_mech, w_conv пилоту не отдаётся; air_velocity_at 20,4 мкс (×1,4 к базе); --air-field=; тесты 9+5 зелёные; открыто: двойной счёт опускания за гребнем (AM-08), from_arrays 0,18 с — строить в потоке |
| AM-06 Загрузка, часы старта | принята (А и Б), Б слита (ветка удалена) | Sonnet (А), Opus (Б) | А: 7557c04, 5157018, b7da8d7; Б: 551e79b, 84ab346, d09139b, d7bc196, 1c57fae | А: 4 часа старта. Б: AirRuntime (C9 v1) — этап «Рассчитываем ветер» 3,3–3,9 с на 4070 (вход места+подготовка 1,2 с в рабочем потоке, решатель 0,73 с GPU; пара с нагревом/без), кадр ≤ 94 мс; пересчёт в полёте каждые 15 игровых мин / смена ветра — 3,7–4,1 с стены, порции ≤ 22 мс; ×10 и ×60 успевает; подмена плавная (шаг w ≤ 4e-4 м/с за 0,1 с), C8 v2 (снимок смеси, Р7); Р2 (фикстура field/ — model: prototype), Р3 (WindField.FORMAT_VERSION = 1) закрыты; скриншоты build/screenshots/08–09. Открыто: Р12 — AirThermals.build на главном потоке 0,75 с стоп-кадр на каждое новое поле; Р13 — тёплый старт греет только решение без нагрева; Р14 — AirPlace берёт опорную дату погоды, не дату полёта; Р15 — публичные AirGpu.release_buffers(), AirPicardJob.mech_case/is_prepared (AirRuntime сейчас лезет в приватные поля) |
| AM-06б Библиотека полей | снята (решение пользователя, шлюз AM-01) | |||
| AM-07 Термики из поля | принята с доработкой AM-07б (плотность/радиус ядер) | Opus | a8ca103, da16964, b0330b5 | источники по Φ = F̄ + W̄⁺ на уровне области; сила ≈ k·w*; потолок по частице (инверсия 2000 м → 2061 м); поток массы 0,98 от поля; сеть — ведущий шлёт маску столбцов (ZoneState.thermal_sources, 1,5 КБ, 1 Гц), разошлось 0 из 8463 столбцов области при шуме 1e-3; поле: сосед 252 м, сила 4,1 м/с, ×8 термиков против аналитики (651 м, 2,35) — ядра 90–170 м несут весь поток; atmosphere.gd +1 строка (принята задним числом) |
| AM-08 Возмущения | принята, слита (ветка удалена) | Opus | 4534b76, 52a7401, 9db1b85, 4ab1bd5 | см. хронологию: C4 v3, σ по u*/w*/Ri, спектр фон Кармана (−1,6…−1,7), двойной счёт за гребнем снят; подветренная против базы: σ_w +18…+90 %, рывки −14…−70 % — на полёт пилота; air_velocity_at 53 мкс |
| AM-07б Термики: ядра и широкий подъём по Аллену | принята, слита (ветка удалена) | Opus | 585057a, 48451dd, 68a5faf | радиус r₂ Аллена от z_l (R вверху 150–190 м), плотность 0,6/(z_l·r₂) по Φ, w0 = 1,24 w* (deardorff_wstar AM-08); 12:00: сила 2,96 м/с, 2,3 живых/км², сосед 394 м, 3792 за 4 ч (AM-07: 4,1 / 252 м / 9056; аналитика 2,35 / 650 м / 1100); поток столба −10…−18 % от поля (в допуске); ядра несут 37–45 % Φ днём; вопрос к AM-09: плотность по Аллену (все ядра) против «шаг сильных 1–1,5 z_i» (ячейки) — разница ×5, определить наблюдаемую одинаково (порог «сильного» термика); 9:00 на уровне 400 м — ≤ 1 источник на столбец |
| AM-09 Калибровка | принята, слита | Opus | f584fb2, ed94333 | подогнан λ/h (lam_frac) 0,1 → 0,25 (−0,015), упёрся в верхнюю физичную границу (данные тянут выше); z0 Askervein 0,034 ± 0,011 (мешающий); c_s = 0,25 фиксирован (мезомасштаб, WRF; 0,17 Лилли — для LES; на Askervein влияние ≤ 0,01); H0, τ, пороги отрыва масштаба 3 — данными не определены, оставлены; систематика сетки — сравнение с 12,5 м + 2-й порядок (ошибка 50 м/1-й на вершине ~65 %, не 15–20 %); χ²/ndf = 233/57 (Askervein 86/38, ТКЭ 141/13 — наветренный склон, литература 5,4/6); повторный прогон: 33/39 точек в 2σ, HT 10 м 0,59 против 0,88; цена: окна 100/50 м +0–25 / до +40 % итераций; таблица «пилот → модель» и новые границы — docs/guide/air-model.md; итог — docs/research/air-model-tune.md |
| AM-10 Срезы, F3, трава | принята | Sonnet | 629be2c…bf5b8f4 (a360c86, bf5b8f4 — доделка) | трава+вода +0,10 мс GPU («Высокий», 1080p); F3 — стрелки 1 км / шаг 200 м / 20-100-300 м AGL, выключенный — ноль; срезы tools/wind_field/dump_slices.gd + annotate_slice.py; скриншоты build/screenshots/03–07; кадр воды 07 (Аушкуль) снят с высоты — различие ряби по полю на нём почти не видно (2 попытки, взят лучший — правило) |
| AM-09б Хвосты калибровки (К1, волна 1 п. 1.2) | принята, слита (ветка и копия удалены) | dp-researcher (Opus → доводка Sonnet) | 019a45c, bd408bb, a2e3f00, acffd0f; слияние 468de96 | (а) масштаб 3 и решатель — одно замыкание λ = max(40 м, AirCase.LAM_FRAC·h); (б) h нейтр. = 0,3 u*/f — одна константа AirCase.NEUTRAL_BL_K (ссылки в docs/research/air-model-tune.md); в нейтральном случае данные определяют только (λ/h)·k (h ещё входит в K_b решателя, h_s устойчивого слоя и затухание масштаба 3 — отдельно не проверялось). 0,1 → 0,25: термики ±3 % (сила Каянча 12:00 2,94 → 2,92 м/с); σ_w за гребнем Синюха/Бияда/Аушкуль 2,06/2,04/1,66 м/с, рывки не менялись; таблица σ ≤ 4 %, кроме Синюхи +400 м, 100 м: σ_u 2,06 → 3,13 (+52 %); спектр без изменений; ТКЭ Askervein χ² 141 → 33 (наветр. 119 → 20, вершина 19 → 10). Эталоны GPU не пересчитывались (params из JSON). Перепроверено К1: GPU test_air_ 56/0, contracts 24/0, atmo 5/0, thermals 7/0, lee_rotor 4/0, wind_field 9/0, determinism 3/0 |
| check.sh (К1, волна 1 п. 2.1а) | принята, слита (ветка удалена) | dp-engineer (Sonnet) | f11d573, слияние 215c653 | один временный XDG_DATA_HOME на запуск (trap — удалить и вернуть project.godot, если был чистым); [--no-build] [--filter=…] в любом порядке, с фильтром — без линтера и сборки; неизвестный аргумент — код 2. Проверено К1: --filter=test_world_key 4/0 код 0, --bad код 2, настоящий профиль не менялся, project.godot чистый |
| А1.1 План структурных правок (Pr_t, τ по диабатической θ′, h при closure=const) | принята, слита (копия и ветка удалены) | dp-researcher (Fable) | 83c740c, слияние 25844df | docs/archive/plan/air-model-a1.md; θ′_d вторым скаляром (схема A′); пробы: седловина Δ×(τ 1800↔21600) 0,284 → 0,004; const+cbl — AttributeError → ok; Pr_t 1 → 0,85: K_θ max 862 → 963, подъём окно 50 м 0,516 → 0,505 (штиль); Askervein χ² 68,06/44 (перепроверено К1); следствия: седловина ×2,05, подъём у старта в штиль −15 % (0,52 → 0,44), область в штиль 61 → 151 итераций |
| А1.2 Правки air.py + GPU-решатель по плану А1.1 | принята, слита b0a83e2 (копия и ветка удалены) | dp-engineer (Opus) | air/a1: 026cb71, 423481e, fb70494, 29392c5, 673b313, f7f4451, 5aceaa3 | по отчёту: седловина Δ 0,284 → 0; const+cbl ok (51 итер.); Pr_t 1 → 0,85 после правки 2: K_θ max 907 → 1004, подъём окно 50 м штиль 0,442 → 0,407; Askervein χ² 68,06/44 без изменений; GPU test_air_ 56/56, контракты 24/24; итерация +27 % (оценка); picard/ 200 м 3 м/с с нагревом — max 3000 итераций (было 131) |
| А1.3 Ревью и приёмка А1 | принята, слита fc1eaba (копия и ветка удалены); вердикт «принять» с 3 мелкими оговорками | dp-researcher (Fable) | air/a1-review: edbd83d, 0f165cf (tools/research/a1/review/) | (1)–(5) воспроизведены побитно; на свободном GPU: итерация 400 м 3,59 → 4,22 мс (+18 %), 200 м 11,26 → 14,20 (+26 %), тепло ×2 — весь прирост; 200 м 3 м/с с нагревом — max детерминированно: предельный цикл K(Ri)–θ′ у выходной границы (до А1 гасил сток −θ′/τ; k_relax 0,25 / heat_sweeps 8 / local_k off — сходятся) → А2; exit 139 bench — утечка release() в тесте, не игра |
| А1.2б Мелкие правки по ревью (release в bench, bench без 200 м с нагревом до А2, thd в контрактном тесте, рецепт (4), цена в air_model_gpu.md) | принята, слита d38e858 (копия и ветка удалены) | dp-engineer (Sonnet) | 28e4384 | контракты 25/25 (новый test_thd_in_state_keys — по тексту state/parent_data/window_state; ловит удаление thd — проверено исполнителем); bench QUICK код 0, без таймаута и 139; 200 м 3 м/с пропущен до А2 (все варианты: с нагревом, пара, загрузка); fixtures picard/ 200 м — честный status max |
| А2-разв. Разведка перед А2 (матрица сходимости old/new) | принята, слита вместе с А2 (1430d79; копия ~/deltaplan-wf-a2pre и ветка удалены) | dp-researcher (Opus) | air/a2-pre: eab5c47 | 36 сценариев/120 решений, 18 мин GPU; не сошлось old 2/24, new 6/24; причина — λ/h 0,031 (цикл K(Ri)–θ′ у верха слоя перемешивания); 200 м 3 м/с cbl на new — ok 181; docs/archive/plan/air-model-a2pre.md |
| А2 Сходимость в штиль (новые параметры) | принята К2, слита 1430d79 (копия и ветка удалены) | dp-engineer (Opus) | air/a2: e8ba248, 73853cb | k_relax 0,5 → 0,1 (air.py Params + AirCase.p одним коммитом) — все cbl-случаи old 16/16 и new 16/16 сходятся (перепроверено К2 по matrix_a2.jsonl); варианты (Σ итер. цепочки 400→100→50 old/new, cbl): до 892/3712 (не сошлось 1/1); k_relax 0,25 — new 1 не сошлось (окно 50 м штиль); heat_sweeps 8 — new 1, итерация +40 %; 0,25 + hs 8 — 0/0, но цена new 22,9 с против 12,0; потолок окна 3000 м — не помогает (гипотеза разведки отвергнута); 0,1 — 0/0, 892/922, цена 11,5/12,0 с; 0,15 — 0/0 (запас меньше). Физика та же: ключевые числа сошедшихся решений ≤ 0,009 м/с; подъём у старта old w50: 0,407 → 0,405 (штиль), 1,33 (3 м/с); new w50 штиль 0,507 (было max). Пропуск прохода θ′_d у решения без нагрева (air.py, AirPicardJob, AirWindowJob — точный, θ′d ≡ 0): итерация 79 % (400 м), 76 % (200 м). Игра (old): «Рассчитываем ветер» 3,73 → 3,55 с, GPU 1,37 → 1,17 с, итерации [150, 130] те же; с окнами 6,49 → 6,29 с (время шумное: GPU делил посторонний процесс — не окончательно). surface: old 8/8, new 2/8 не сошлись (области 400/200 м в штиль) — не приёмка, heat_mode = cbl (А3). Bench 200 м 3 м/с снова в прогоне: 170 итер. (эталон 171). Askervein check25 χ² 68,06/44 без изменений. Тесты (К2): контракты 26/26, GPU test_air 58/58 (в копии А2), headless wind_field 9, atmo 5, thermals 7, window_case 2, determinism 3 — после слияния. Минус: тёплый старт того же поля 10 → 20 итераций (K не в состоянии тёплого старта; порог test_warm_start 10 → 20); соседний срок 12:00→12:30 — 50 итераций, как было |
| А3 Переключатели схемы по физике (hb/const, local_k, heat_mode) | принята К2, слита 5ec1752 (копия и ветка удалены) | dp-researcher (Sonnet) | air/a3: 6636934, b569ec5 | docs/archive/plan/air-model-a3.md: closure hb (высокая; Troen–Mahrt 1986, HB93), local_k вкл (средняя–высокая; Blackadar 1962, YSU), heat_mode cbl (высокая для развитого слоя, средняя на крутых склонах; Deardorff 1966, HB93, EDMF) — всё = текущий AirCase.p, смена в игре не нужна; nu_const/const можно убрать. Неизвестны для волны Б: λ/h, lam, α, z0, tau_cool, k_smooth_m; фиксируются cs_h, k_fa, zi_min, Pr_t. Оговорки local_k: неустойчивая ветвь √(1−16Ri) > 1 внутри слоя — возможный двойной счёт с K_b (кандидат F ≤ 1 при Ri ≤ 0, не считано); длинный хвост устойчивой ветви (GABLS1). Вопрос пользователю — heat_mode на крутом склоне (§6: 1 — как сейчас, рекомендовано; 3 — гибрид, только если полёты покажут заниженный подъём) |
| А4 Случай Perdigão (обёртка C10) | принята К2, слита e462ea3 (копия и ветка удалены) | dp-researcher (Sonnet) | air/a4: b014475 | tools/research/cases/perdigao.py (C10: 38 наблюдаемых, check_c10 — 0 нарушений, перепроверено К2), docs/archive/plan/air-model-a4.md; область 6×6 км, dx 30 м, 200×200×88; рельеф Copernicus через fetch_dem.build_layer, сверка с 59 мачтами −0,6 ± 2,9 м (гребни −3…−10 м); лес: DSM здесь без полога → поверхность DSM + 12,6 м × доля леса WorldCover (d = 0,7·18 м), z0 = 0,645 м (лог-среднее 1,8/0,1); наблюдаемые: S/S_ref на мачтах ≥ 30 м (17 NE, 15 SW) + Menke L/D 0,50 ± 0,10, глубина/H 0,91 ± 0,21, обратная 0,22 ± 0,10; пробный прогон (номинал λ/h 0,031, α 0,235, adv2 = выкл): все 14 ok, dx 30 — 181 итер., ≈ 12,5 с (+2,5 с сборка); χ² NE 41/20, SW 115/18; зона занижена (NE L/D 0,31, глубина/H 0,36, обр. 0,07; SW почти нет), при λ/h 0,25 зоны нет; сетка: dx 20 — L/D 0,37, глубина 0,51 (sig_grid до 0,16); цена пачки ≈ 30 с на точку (оба подслучая) |
| Б1 Совместная калибровка Askervein + Perdigão | принята, слита be8aa7f (вместе с Б2; копия и ветка удалены) | dp-researcher (Opus) | air/b1: ebca59f, 8e31dee, 3b2c09a, b31ccf8, 60b0574 | λ общее 27,1 м (+3,9 −3,2), χ²/ndf 208,3/76; Askervein α 0,242 ± 0,004, z0 0,052 (+0,048 −0,029), χ² 165/47 (подветренная 94/8); Perdigão α_NE 0,33 (край), α_SW 0,287 ± 0,034, z0 1,0 (край), χ² 43/35; по отдельности λ_A 145 м (+151 −48), λ_P 10 м (край) — Δχ² общего λ 44 → структурное напряжение: за двумя грядами отрыв занижен (NE L/D 0,40 против 0,50, глубина 0,70 против 0,90, обратная 0,11 против 0,22), за одиночным холмом след слишком сильный; λ/h и lam не разделяются (h 1600–1800 м); лучшая точка: local_k выкл 280,6 (хуже — выбор А3 держится), 1-й порядок 282,4 (систематика схемы игры: вершина Askervein −0,13), dx·2/3 211,9 (поправка сетки годится); регрессия А2: (а) lam 27 — 7/8 cbl (окно 100 м штиль max), (б) lam 40, lam_frac 0,0158 — 8/8, цепочка игры штиль 6,4 с против 5,8 (+14 %), область 200 м штиль 1101 итер. против 261; 765 прогонов, 3,9 ч GPU, check_c10 0 нарушений (перепроверено К2) |
| Б2 α и λ в игре (профиль по устойчивости, C2 v5) | принята, слита be8aa7f (копия и ветка удалены) | dp-engineer (Opus) | air/b2: e674c49, ce3aa88, de3dcde, 02e9684 | WindProfile (игра) = wind_prof.py (эталон): α = 0,24·r(класс Тёрнера), r Irwin 1979 (A/B 0,112, C 0,16, D 0,24, E 0,56, F 0,88); z_sat = 0,3·h, h с устойчивым слоем (L Golder 1972: E 45,5 м, F 14,1 м); λ: lam 40, lam_frac 0,0158; Онгудай 12:00 ясно: штиль A, 3 м/с B (α 0,112), 6 м/с D; вечер 20:30, 3 м/с на 300 м: E 6,4 м/с, F 5,9 (при v4 было 16,4 и 43,3); полдень 3 м/с на 300 м 4,8 → 4,2 м/с, облачно (D) 4,8 → 6,2; эталон = игра до 1e-9; цена: «Рассчитываем ветер» с окнами 3 м/с 5,54 → 6,18 с (+12 %), итерации цепочки 470 → 600 (+28 %), bench 200 м штиль 250 → 1100 (в игре 200 м нет); ТКЭ Askervein (AM-09б): χ² с σ сетки 33 → 255 — завышение ТКЭ ×2,7–3,1 на наветренном склоне/вершине больше не прячется в σ сетки (только σ данных: 4297 → 3889) — в «Границы модели»; пороги test_lee_rotor (≥ 0,45u) и test_wave (≥ 0,45) — без источника, по факту, эвристики не подгонялись. Тесты (К2): контракты 26/26, GPU test_air_ 58/58 (с –disable-vsync), headless air_place, weather_day, lee_rotor, wave, wind_field, atmo, determinism — зелёные |
| AM-08в Рывки и ротор поверх поля по физике (C4 v4) | принята, слита 774bbb2 (копия и ветка удалены) | dp-engineer (Opus) | 041d8ed (контракт К2), 0d1ecf2, 451b21d, 220c740 | Онгудай 9 м/с: min w у земли за гребнем −13…−18 → −0,6…−1,9 м/с (поле −0,6…−1,4); доля возвратных 10 м: старт 15,9 → 3,2 % (поле 3,0), седловина 32,7 → 17,0 % (14,7); σ_w/ΔU 0,139, пик рывка 0,37·ΔU; цена air_velocity_at +1…7 %; аналитика побитно прежняя |
| AM-11 Производительность, сеть | не начата (лимит; следующая сессия) | |||
| AM-12 Пилот, слияние | не начата (после AM-11) |
Контракты систем (решение пользователя, 29.09.2026)
Интерфейсы на стыках задач — docs/contracts/air-model.md (C1 эталон→GPU, C2 вход места, C3 решатель→WindField, C4 WindField→атмосфера/термики/возмущения/трава-вода-F3, C5 термики→сеть, C6 библиотека полей, C7 клипмапы, C8 пересчёт/подмена) + контрактные тесты tests/contracts/. Правило: работать в рамках контракта; менять интерфейс — только через К0: правка контракта (версия +1, что изменилось), уведомление задач-потребителей, их правка в том же шаге или сразу после. Правило включается во все задания; текущим (AM-01, AM-03, AM-07, AM-10) разослано.
Рабочие копии (решение пользователя, 29.09.2026)
Со следующих задач — у каждого исполнителя своя копия: git -C ~/deltaplan-wf worktree add ~/deltaplan-wf-am<NN> -b air/am-<NN> feature/air-model (от актуальной ветки, после вливания принятого). Исполнитель коммитит и тестирует только там (первый прогон — godot --headless --path . --import); нужна работа соседей — git merge feature/air-model в свою ветку. Приёмка: К0 вливает air/am-<NN> в feature/air-model (конфликты — по контракту), гоняет затронутые тесты в ~/deltaplan-wf, затем git worktree remove и удаление ветки. Контракты — общие, правка только в feature/air-model через К0. Большие данные вне git — по абсолютному пути tools/research/air3d/fields/, не копировать. Текущие (AM-01, AM-03, AM-07, доделка AM-10, контракты) дорабатывают в общей ~/deltaplan-wf.
Хронология
- 29.09.2026 — старт: волна 1 (AM-00, AM-01) + AM-02 (общие блоки) параллельно.
- 29.09.2026 — AM-06 разбита: часть А (часы старта, не зависит от поля) запущена сразу, часть Б — после API решателя.
- 29.09.2026 — AM-06А принята. Попутно починен tools/shots/ui_shot.gd (ждал автозагрузку мира в меню, убранную в 0.8.0).
- 29.09.2026 — AM-01 решил: маска, не σ-сетка. Запущен AM-05 (волна 2).
- 29.09.2026 — AM-00 принята. Два новых падения из её прогона (test_menu_setup, test_cockpit) были от незакоммиченной тогда AM-06А — перепроверено: зелёные.
- 29.09.2026 — AM-02 принята (GPU-тест 5/5 перепроверен). Запущен AM-03 по спецификации AM-01 (8f04f5a) не дожидаясь конца AM-01.
- 29.09.2026 — AM-03 нашёл ошибку эталона: λ в kloc транспонирована (F-порядок lamc) → AM-01 исправляет и пересчитывает ref/. AM-01 схема итоговая — 936c7f9. project.godot: перезаписи редактора не коммитить; gpu_tests.sh теперь возвращает файл.
- 29.09.2026 — AM-05 принята (перепроверены test_wind_field, test_air_model_atmo, test_determinism).
- 29.09.2026 — запущены AM-07 и AM-10 раньше волны: зависят только от
WindField(AM-05), работают на полях из файлов до готовности GPU-решателя. - 29.09.2026 — дополнение пользователя к AM-10: рябь на воде (VR-16) — тоже по полю (та же текстура ветра нижнего слоя), приёмка как у травы. Передано исполнителю AM-10.
- 29.09.2026 — AM-01 cf64b7b: Δτ_u = 0,3 с/м·Δx по уровню (окна 100/50 м: 40–150 итераций вместо 500–3000 — причина медленных окон найдена). Передано AM-03.
- 29.09.2026 — решение пользователя: явные контракты систем; исполнитель пишет docs/contracts/air-model.md + tests/contracts/ по коду.
- 29.09.2026 — контракты зафиксированы: 16dd51d (docs/contracts/air-model.md C1–C8, tests/contracts/test_air_contracts.gd 19/19). Расхождения розданы: Р1, Р4 (meta() падает на PackedFloat32Array из f64), Р6 → AM-03; Р5, Р8 → AM-07; Р9 — поправлен комментарий К0. Решения К0: Р6 — поле для игры только с mech=true, field() при mech=false — ошибка; Р10 — источники термиков по уровню области (общий у клиентов), окна вокруг пилота для выбора источников не используются. Отложено: Р2 (перегенерировать фикстуру field/ из air.py или пометить prototype) и Р3 (FORMAT_VERSION/model_version) — в AM-06б; Р7 (set_field во время подмены — снимок текущей смеси) — в AM-06Б.
- 29.09.2026 — AM-10 принята (2 попытки на кадр воды — рябь с высоты не различима, проверено числами и кодом).
- 29.09.2026 — AM-08 запущена в своей рабочей копии (первая по новому правилу).
- 29.09.2026 — AM-03 закрыл Р1/Р4/Р6 (78a3444) + field_async() (WindField в WorkerThreadPool, 0,6 с на 400 м без стоп-кадра). AM-07: C4 v2 (da16964) — публичные геттеры WindField. Контрактный тест 19/0, lint чистый. AM-03 — привести свои файлы к lint.
- 29.09.2026 — AM-01 сдана. Условие остановки (8 м/с на 100 м) НЕ выполнено — сходится. Развилки AM-01: (1) перенос 1-го/2-го порядка; (2) седловина ×1,9; (3) Askervein ×2,8 ниже; (4) 9:00 штиль без неподвижной точки; плюс состав библиотеки против решения пользователя. Askervein подозрителен (расхождение и на 20–100 м, где внутренний слой не при чём; «потенциальное» 0,30 слишком мало) → проверка AM-01а в ~/deltaplan-wf-am01a до шлюза.
- 29.09.2026 — C4 v3 (AM-08, аддитивно) одобрен: WindField.turb_at (T_SHEAR, T_N2, T_USTAR, T_UOUT, T_AOUT, T_DESC, T_WSTAR, T_HMIX), AirFieldSet.sample_turb, стык в air_velocity_at без двойного счёта за гребнем, конфиг turbulence/lee.field_. Условия: свести с v2, w — одна функция для термиков и болтанки; сверка с базой AM-00 ±20 %.
- 29.09.2026 — C2 v2 (AM-03, переименование полей AirCase под lint: U10→u10, NX/NY/NZ→nx_h/ny_h/nz_h, U_a→u_a; meta без изменений) — принят, тест и контракт в том же коммите AM-03. Замечание: gdformat ломает многострочные лямбды в вызовах — заменять методами.
- 29.09.2026 — влит main (e726ed6): сайт site/, публичные тексты — только «пилот». Конфликт только в air3d/README.md (решён: раздел эталона + пути в репозитории). Правило: публичные документы — только «пилот», без локальных путей. Хвост для AM-12: docs/guide/air-model.md:130 — локальный путь ~/… к полям прикидки.
- 29.09.2026 — AM-07 принята (тесты термиков/зоны/контрактов/детерминизма зелёные, lint чистый). Решение К0 по находке ×8 термиков: не калибровка, а структура — ядра по Аллену 2006 (радиус и плотность от z_i), остаток потока — широким слабым подъёмом; задача AM-07б.
- 29.09.2026 — AM-01а принята и слита (air/am-01a удалена): Askervein — модель без ошибок, занижение разгона на высотах динамики (15–20 % на 20–50 м) — от клетки 50 м и 1-го порядка переноса.
- 29.09.2026 — ШЛЮЗ после AM-01: условие остановки не выполнено (8 м/с сходится), но две развилки вне плана → вопрос пользователю через главную сессию: (А) состав библиотеки/поток загрузки (план: 68 полей, мгновенно; замер: ближайшее поле ошибается на 50–75 %); (Б) разгон на бровке занижен на 15–20 % на 20–50 м — 2-й порядок переноса и/или окно 25 м. Решено К0 в рамках плана: 9:00 штиль — среднее последних итераций; седловина ×1,9 — в AM-09; 2-й порядок — рекомендация К0 (план разрешает «если 1-й заметно сглаживает»), но цена по времени ×2–3 — в вопросе (Б). Идут дальше (от развилок не зависят): AM-03, AM-08, AM-07б. Ждут ответа: AM-04, AM-06Б, AM-06б, AM-09.
- 29.09.2026 — решения пользователя по шлюзу AM-01: (А) вариант 3 — библиотеки нет: точное поле всегда при загрузке («Рассчитываем ветер»), пересчёт каждые 15 игровых мин фоном; AM-06б снята; Р2/Р3 — в AM-06Б или закрыть. (Б) вариант 3 — перенос 1-го порядка, без окна 25 м (клипмапы 400/100/50), плюс «затухающая поправка на разрешение сетки» к возмущению рельефа только в выборке пилота, c и L — из сравнения с сошедшимся решением на Каянче/Аушкуле/Askervein (или «непригодна»); не калибруется в AM-09 → задача AM-01б. План и контракт C6 (v1: библиотеки нет) обновлены.
- 29.09.2026 — уточнение пользователя по (Б): поправку на разрешение НЕ делать (AM-01б отменена); вариант 3 в чистом виде — занижение разгона у бровки 15–20 % на 20–100 м записано как граница модели (план, docs/guide/air-model.md); исправление при жалобах пилотов — 2-й порядок в окнах или окно 25 м; в AM-09 не подкручивать.
- 29.09.2026 — AM-03 принята (GPU-тест 4/4 перепроверен). Запущены AM-04 и AM-06Б в своих копиях; стык между ними — новый контракт C9 «AirRuntime» (оркестратор расчёта: AM-06Б делает с одним уровнем 400 м, AM-04 добавляет окна).
- 29.09.2026 — решение пользователя по калибровке AM-09: слова пилота — не в χ², только таблица сравнения после (расхождения → «Границы модели»); подгонка — Askervein, подобие КПС (w*, z_i, шаг 1–1,5 z_i), спектры Kaimal/Lenschow, calibration_data.md; систематика сетки 15–20 % у бровки или сравнение с 12,5 м + 2-й порядок; подгонять только неизвестные (доля нагрева, длина перемешивания у рельефа, порог источников), литературные (Смагоринский, подобие) — фиксировать. План (AM-09, «Решения пользователя») и ссылка в WF-16 обновлены.
- 29.09.2026 — влит main (переименование «в лоб старту» → «встречный на старте»); в файлах ветки (air3d reference/tables/ref_study/ref_tables, air_thermals/make_fields, docs/guide/air-model.md) заменено (9fe1ebf). В файлах main остались flight_settings.gd:17 («ветер в лоб выбранному старту»), docs/plan/weather_by_temperature.md, tests/stability/test_matrix.gd — это файлы main, не трогал; bot_pilots.gd «лоб в лоб» — другой смысл.
- 29.09.2026 — решение пользователя: общие отладочные оверлеи — в ветке feature/debug-overlay (F1 производительность, F5 ветер через Debug Draw 3D, F6 термики). F3 (WindFieldDebug, AM-10 — закончена) не расширять, держать минимальным; после слияния обеих веток в main свести F3 с F5 (одна клавиша ветра) — хвост для AM-12.
- 29.09.2026 — AM-07б принята и слита. Lint в ветке: 4 ошибки длины строки пришли из main (коммит 3145ffd «встречный на старте»: start_menu.gd:55, game.gd:264, world_key.gd:19, test_forecast_game.gd:3) — это файлы main, сообщено главной сессии.
- 29.09.2026 — AM-09 запущена раньше волны (калибровка на эталоне air.py и пробах масштабов 2–3; окна AM-04 не нужны). В задании — вопрос определения «шага термиков» (Аллен против 1–1,5 z_i).
- 29.09.2026 — AM-06Б принята и слита (контракты 23/23, GPU test_air_runtime зелёный — после слияния нужен
godot --headless --import, иначе class_name AirRuntime не виден). Р12–Р15 — в AM-11 (Р12 — главное: стоп-кадр 0,75 с). Решение пользователя по процессу: новые исполнители — типами dp-engineer/dp-researcher/dp-writer/dp-mechanic через start-to-do; после этой волны — полное состояние в журнал и передача новому координатору. - 29.09.2026 — AM-04 принята и слита (после слияния —
godot --headless --import; контракты 24/24, GPU test_air_* 56/56). Нарушение: исполнитель AM-04 один раз запустил tools/check.sh без временного профиля (~10 мин, убит) — в настоящем профиле ~/.local/share/Deltaplan записи 20:14–20:34 (last_flight.json, test_roll_mode_cfg/, test_ui_tmp/, logs) — сообщено пользователю, профиль не трогал. - 29.09.2026 — AM-09 принята и слита (параметр на границе диапазона — сигнал, что модель не дотягивает: разгон у гребня занижен и на 12,5 м; путь — 2-й порядок/окно 25 м, не λ/h). Решение пользователя (лимит 78 %): новую волну не начинаем; координатор К0 завершает работу, продолжит новый координатор по разделу ниже.
Состояние на 29.09.2026 и как продолжить (для нового координатора)
Ветка feature/air-model, рабочая копия ~/deltaplan-wf (последний коммит — см. git log; main влит дважды: сайт e726ed6 и «встречный на старте»). Копий задач нет (все удалены; ~/deltaplan-wf-am09 удаляется при закрытии К0). После каждого слияния веток с новыми class_name — XDG_DATA_HOME=$(mktemp -d) godot --headless --path . --import, иначе тесты не видят классы.
Принято (всё в feature/air-model): AM-00, AM-01 (+01а), AM-02, AM-03, AM-04, AM-05, AM-06 (А и Б), AM-07 (+07б), AM-08, AM-09, AM-10. Снято: AM-06б (библиотека), AM-01б (поправка разрешения). Что есть в игре: поле по умолчанию (air_model.enabled = auto), этап загрузки «Рассчитываем ветер» (≈5–5,5 с на 4070 SUPER с окнами), пересчёт каждые 15 игровых мин и при смене ветра, окна 100/50 м за пилотом, термики из поля (Аллен), болтанка из поля, трава/вода по полю, F3 — стрелки поля; без GPU — аналитика.
Осталось по плану:
- AM-11 Производительность, отказы, сеть, Windows (Opus/dp-engineer) — WF-11 + хвосты: Р12 (главное:
AirThermals.buildна главном потоке, стоп-кадр 0,4–0,77 с на каждое новое поле → рабочий поток), Р13 (тёплый старт греет только одно решение пары), Р14 (AirPlace— опорная дата погоды вместо даты полёта; аргумент даты), Р15 (публичныеAirGpu.release_buffers(),AirPicardJob.mech_case/is_prepared— AirRuntime лезет в приватные поля);air_velocity_at53 мкс с полем (было 17) — боты; сдвиг окон ждёт конца пересчёта (5–7 с) — при ускорении окно 50 м может отставать; загрузка на AMD — оценка до ~15 с, не мерено (RADV нет); сеть — прогон двух клиентов (поле у каждого своё, источники термиков от ведущего, маска C5) — по коду проверено, в сети не гонялось; Windows-сборка. - AM-12 Полёт пилота, документация, слияние (К0 + dp-writer): сборка для полёта пилота, вопросы простым языком (особенно: провалы за гребнем сильнее базы на +30…+90 % по σ_w — AM-08/AM-09; седловина ×1,9; полоса подъёма > 2 H; разгон у бровки занижен);
docs/guide/atmosphere.md— раздел «Модель воздуха: три масштаба» с границами; свести F3 (WindFieldDebug) с F5 из ветки feature/debug-overlay после слияния обеих в main; убрать локальный путь~/…изdocs/guide/air-model.md(~стр. 130/188); CHANGELOG — проверить пункты «В работе»; слияние в main — только после одобрения пользователя.
Мелкие хвосты / открытые вопросы (решения К0 не приняты — для нового координатора или пользователя):
- (а) масштаб 3 берёт длину перемешивания 40 м, решатель теперь max(40 м, 0,25·h) после AM-09 — согласовать
field_turbulence.gd(AM-09 не правил); - (б) толщина нейтрального слоя: решатель 0,3 u*/f, масштаб 3 — 0,25 u*/f — свести к одному;
- (в) λ/h упёрся в границу 0,25 — оставить (так записано в границах) или пересмотреть диапазон с литературой;
- (г) пробы термиков и таблица болтанки при λ/h = 0,25 не перепрогнаны (AM-09 оценил влияние ≤ 3 % у старта);
- (д) шаг сильных термиков 1–1,5 z_i не воспроизводится по построению (плотность — по Аллену) — в границах модели; если пилот скажет «термики слишком часто» — структурное решение (кластеры ячеек), не подгонка;
- (е) ТКЭ над вершиной и наветренным склоном завышена ×1,5–4 (σ по местной u*, нет быстрого искажения) — в границах;
- (ж) lint в ветке: 3 ошибки длины строки пришли из main (start_menu.gd:55, world_key.gd:19, test_forecast_game.gd:3) — править в main;
- (з)
tools/check.shв ветке не понимает--filterи запускает Godot без временного профиля — исполнители гоняютrun_tests.tscnнапрямую; поправить скрипт (из main, если там исправлено — влить main); - (к) генератор
tools/research/air3d/window_gpu_refs.pyне пишетparamsв JSON (фикстуры окон дополнены вручнуюlam_frac: 0.1К0; по образцуpicard_gpu_refs.py— писать params автоматически); при пересчёте эталонов с λ/h = 0,25 — убрать; - (и) нарушение: AM-04 однажды запустил check.sh с настоящим профилем пилота (~/.local/share/Deltaplan, записи 20:14–20:34 29.09) — пользователю сообщено, профиль не трогали.
Контракты (docs/contracts/air-model.md, тест tests/contracts/test_air_contracts.gd, 24 теста): C1 v1, C2 v2, C3 v1, C4 v3, C5 v1, C6 v1, C7 v1, C8 v2, C9 v2. Расхождения Р1–Р11 закрыты; открыты Р12–Р15 (→ AM-11).
Решения пользователя за сессию (все в плане): библиотеки нет — точное поле при загрузке; перенос 1-го порядка, окна 400/100/50 без 25 м, без поправок — занижение разгона у бровки в «Границах модели»; калибровка без слов пилота (только сравнение после); контракты систем; копия на задачу; скриншоты — build/screenshots/<задача>/; «встречный на старте»; общие оверлеи F1/F5/F6 — в feature/debug-overlay, F3 не расширять; долгие запуски — фоном / tools/job.sh; прогоны калибровки — одним пакетом.
Как проверить: в ~/deltaplan-wf: XDG_DATA_HOME=$(mktemp -d) godot --headless --path . --import; headless … res://tests/run_tests.tscn -- --filter=test_air_contracts (и test_wind_field, test_air_model_atmo, test_air_thermals, test_air_window_case, test_determinism); GPU flock /tmp/heat_ca_gpu.lock tools/gpu_tests.sh --filter=test_air_. Полёт с полем: обычный запуск (поле по умолчанию), F3 — стрелки поля.
- 29.09.2026 — после слияния AM-09 упал
test_air_window_gpu::test_window_vs_reference(эталон окон посчитан при λ/h = 0,1, по умолчанию стало 0,25) — исправлено К0 так же, как AM-09 для picard: params в JSON фикстуры, тест их применяет. Итог после слияний: headless контракты 24/24, determinism, atmo, window_case — зелёные; GPU test_air_* 56/56. - 30.09.2026 — К1 принял модуль (план дня — волна 1: слияние main, хвосты AM-09, check.sh). AM-09 уже принята и слита К0 (18888db, 0c867e8).
- 30.09.2026 — влит main (4c8251e): оверлеи F1/F2/F5/F6, «Встречный», AgX, тон дальнего леса, выход без падений рельефа, tools/job.sh, правила процесса. Конфликты (К1): CHANGELOG — оба набора «В работе»; game.gd — комментарий ветра из main. Слияние сделал К1 сам (два конфликта, механику нечего делать). После — импорт и затронутые тесты: contracts 24/24, terrain 61/61, overlays 2/2, wind_field 9/9, world_key 4/4, forecast 1/1; ui 77/78 — test_net_screen::test_client_backend_create_embedded_vs_remote
port_busy(занятый порт при параллельном прогоне — известное, не регрессия). - 30.09.2026 — решения К1 по хвостам AM-09: (а) масштаб 3 берёт λ = max(field_mixing_length_m, λ/h·h) с тем же h, что и в его формулах (T_HMIX или нейтральный k·u*/f), λ/h — из одного источника с решателем (AirCase), не копией числа; (б) k нейтрального слоя — одно значение со ссылкой; λ/h подогнан на Askervein (нейтрально) при k = 0,3 решателя, поэтому смена k в решателе = перекалибровка λ/h (ушла бы за границу) — такое только через шлюз пользователя, по умолчанию сводить масштаб 3 к решателю. Контракт C4 v3 не меняется (turb_at тот же; меняется внутреннее и конфиг turbulence.field_*).
- 30.09.2026 — check.sh принят и слит (215c653); хвост (з) закрыт.
- 30.09.2026 — К1 заменён (прежний К1 остановлен пользователем посреди волны 1, контекст потерян; новый К1 восстановил состояние по git, журналу и tools/job.sh). Найдено: main влит (4c8251e) до brotli; check.sh принят; AM-09б — исполнитель остановлен, в air/am-09b коммит 019a45c ((а) λ₃ = max(40 м, λ/h·h), (б) h нейтр. = 0,3 u*/f — константы AirCase, общие с решателем; window_gpu_refs.py пишет params), пачка
am09b-probes(tools/job.sh, копия ~/deltaplan-wf-am09b) идёт сама — поля, Askervein, масштаб 3 сделаны, идут пробы термиков (~1 ч); результаты не закоммичены. - 30.09.2026 — влит main повторно (e5bd781, без конфликтов): рельеф brotli (.f32.br), план OBF/PBF/PMTiles. Слил К1 сам (конфликтов нет, механику нечего делать). Импорт + затронутые тесты: test_terrain 15/15, test_air_place 1/1, test_air_contracts 24/24, test_debug_overlays 2/2, test_menu_setup 10/10, test_air_window_case 2/2, test_air_model_atmo 5/5, test_wind_field 9/9. Заметка: исследовательские venv (tune, heat_ca) без модуля
brotli— air3d/terrain.py теперь читает .f32.br; при пересчёте полей из ветки поставитьuv pip install brotli. - 30.09.2026 — check.sh (п. 2.1а, доделка К1): шаблоны экспорта подключаются в временный профиль симлинком
~/.local/share/godot/export_templates(только чтение), иначе сборка под временным XDG_DATA_HOME их не находит. Проверено: сборка Linux под временным профилем с симлинком — код 0, smoke OK;check.sh --filter=test_world_key4/0, код 0. - 30.09.2026 — AM-09б: доводку (ожидание пачки am09b-probes, итог, слияние feature/air-model, тесты GPU/headless, раздел AM-09б в docs/research/air-model-tune.md с вырожденностью (λ/h)·k в нейтральном случае) получил новый dp-researcher (Sonnet — лимит 81 %, работа — итог и документ, не подбор). Ему передано: в venv калибровки нет
brotli— ставить перед прогонами air3d после слияния. - 30.09.2026 — уточнение пользователя (через главную сессию): лимит используем до 90 % (не 85); «стоп» — около 88–90 %. Пачка am09b-probes закончилась (код 0).
- 30.09.2026 — вне волны 1 (по просьбе пользователя, запустила главная сессия): отбор по чувствительности Морриса по 15 параметрам/переключателям air3d — копия ~/deltaplan-wf-morris, ветка air/morris (от air/am-09b), в feature/air-model не пишет; GPU под flock /tmp/heat_ca_gpu.lock (пачка ~4–6 ч, GPU-тесты AM-09б чередуются с ней); итог — docs/research/air-model-sensitivity.md.
- 30.09.2026 — AM-09б принята и слита (468de96): см. таблицу. Копия ~/deltaplan-wf-am09b и ветка air/am-09b удалены (поля Askervein 331 МБ были в копии, вне git — воспроизводятся run_am09b.sh). Ветка air/morris (от air/am-09b) не затронута.
- 30.09.2026 — влит main третий раз (418f69f): фон меню 4K, заставка, «Атлас» по статье. Конфликт CHANGELOG («В работе») — оба набора. Тесты: wings 4/0, polar 6/0, mass 4/0, glider 2/0, menu_setup 10/0, wing_picker 4/0, pilot_pose 2/0.
Итог волны 1 (30.09.2026, К1) и как продолжить
Волна 1 закрыта: 1.1 main влит (e5bd781 brotli/OBF, 418f69f меню/«Атлас»; ранее 4c8251e); 1.2 AM-09б принята (468de96); 2.1а check.sh — временный профиль, --filter, шаблоны экспорта симлинком (215c653, c653d46; сборка Linux под временным профилем + smoke проверены). Копий задач нет, кроме ~/deltaplan-wf-morris (air/morris — отбор Морриса, запущен главной сессией, итог docs/research/air-model-sensitivity.md; в feature/air-model не пишет).
Готовность к релизной сборке ветки: волна 1 закрыта — по плану дня можно собирать tools/build.sh linux --release в build/air-model/ (dp-mechanic). Проверенная сборка под временным профилем (не release) — код 0, smoke OK.
Дальше по плану дня (не начато): релизная сборка для пользователя; волна 2 — AM-11 (Р12 — главное), F3 → F5, полный набор тестов; волна 3 — AM-12.
Вопросы к пользователю (фактами, решений К1 нет):
- λ/h = 0,25 на верхней границе физичного диапазона, данные тянут выше (без изменений после AM-09б);
- ТКЭ на Askervein после согласования масштаба 3 с решателем заметно ближе к данным (χ² 141 → 33), но вершина всё ещё завышена (χ² 10,3 на 4 мачты) — оставить в границах модели или отдельная задача;
- σ_u за гребнем Синюхи на 100 м выросла на 52 % (единственная заметно сдвинувшаяся точка таблицы σ) — на проверку полётом пилота (AM-12), не подгонять.
Решения по вопросам (30.09.2026, главная сессия по поручению пользователя: «прими решение сам»):
- λ/h = 0,25 оставить, диапазон не расширять. Это эффективный параметр, который упирается в структуру модели у гребня (подгонки по частям: наветренная сторона 0,19 ± 0,19, гребень и след тянут за границу). Расширять физичный диапазон ради χ² — значит прятать структурную ошибку в параметр. Пересмотреть только по итогу отбора Морриса (docs/research/air-model-sensitivity.md, air/morris) и после структурной правки у гребня (2-й порядок / окно 25 м).
- ТКЭ на вершине — в «Границы модели», отдельную задачу сейчас не заводить. После согласования χ² 141 → 33, остаток 10,3 на 4 мачты — отсутствие быстрого искажения (Britter, Hunt & Richards 1981), а не параметр. Кандидат на структурную задачу (затухание σ над разгоном среднего ветра в масштабе 3) — решать по итогу Морриса и полёта пилота (AM-12); если пилот не скажет «над вершиной слишком болтает», не делать.
- σ_u за гребнем Синюхи (400 м, 100 м AGL) +52 % — не подгонять, проверить в полёте пилота (AM-12), записано в «Границы модели». Точка в слое смешения за отрывом: рост σ при более длинном λ там физически ожидаем, остальные точки таблицы сдвинулись ≤ 4 %.
Итог отбора Морриса (01.10.2026, главная сессия) и что дальше
Документ — docs/research/air-model-sensitivity.md (слито 0134f2f из air/morris, копия ~/deltaplan-wf-morris; поля Askervein ≈ 180 МБ вне git). 16 факторов (15 параметров и переключателей + nu_const), 6 случаев (Askervein 25 м, хребет, седловина, косой ветер, Онгудай 12:00 штиль и 3 м/с), 1230 прогонов, 5,3 ч GPU; малый Моррис масштаба 3 (7 параметров, 160 точек).
Выводы:
- Модель не жёсткая: мягкая по переключателям схемы (замыкание, порядок переноса, local_k, heat_mode) и профилю притока α, умеренная по параметрам перемешивания. Жёсткость трёх видов: от данных (нейтральный Askervein определяет одну комбинацию: 94 % действия — одно направление SVD); вырождение (λ/h ≈ α ≈ порядок переноса ≈ local_k ≈ λ, косинусы 0,93–0,94); структурная — не двигает ничто: косой ветер w(45°)/w(0°) = 0,70–0,73, разгон на 2H/2,5H (только α), ТКЭ на вершине.
- Askervein, Δχ² по факторам: замыкание 218, α 188, nu_const 101, порядок переноса 83, local_k 43, z0 26, λ/h 12 (на шаге ≈ ×10).
- Вывод AM-09 «данные тянут λ/h вверх» — артефакт ручного α = 0,17. Профиль мачты RS в данных даёт α ≈ 0,22; лучшие точки плана — χ² ≈ 54 (номинал 86) при α 0,20–0,24 и λ/h ≈ 0,02. Поправка к решению 1 выше: λ/h = 0,25 остаётся временно, обоснование «прикрывает структуру у гребня» неверно.
- λ/h заметно действует только за гребнем (ротор, опускание) и на число итераций.
- Нагрев: подъём у старта задаёт в основном heat_mode (surface против cbl: +1,5 м/с в штиль, +0,95 при 3 м/с); Pr_t, τ, k_fa, k_smooth — по 0,1–0,2 м/с.
- Масштаб 3: ТКЭ Askervein — σ_w/u*; болтанку за гребнем (до 0,6 м/с) — пороги отрыва; длина перемешивания не действует.
- Найденные ошибки:
pr_tне реализован (K_θ = K_m в air.py и в GPU-решателе); τ-выхолаживание гасит и адиабатические θ′ (седловина ×1,8 ± 0,33 по τ без нагрева); closure=const падает с нагревом cbl (h не считается); штиль часто не сходится (12:00 окно 50 м — 139/205, 3 м/с — 40/205, косой ветер — 19/205).
Что делать дальше (порядок, решение пользователя «будем доделывать модель»):
- Перекалибровка Askervein по (λ/h, α, z0) с профилем мачты RS в наблюдаемых (Professor, ~100 прогонов × ~10 с, ≈ 20 мин GPU). α согласовать с
wind.shear_exponentигры (решатель и WindModel — одно α). Затем — пересчёт эталона GPU-теста и цены на сетках игры. - Структурные правки (dp-engineer, air.py + GPU-решатель, контракты не ломать): реализовать Pr_t (K_θ = K_m/Pr_t); выхолаживать только диабатическую часть θ′ (не гасить адиабатические возмущения); h для closure=const как в hb.
- Сходимость в штиль (окно 50 м, 12:00) — разбор причины (псевдошаг, релаксация K, критерий) и правка; это же — AM-11 (время этапа «Рассчитываем ветер»).
- Переключатели схемы выбрать по физике, не подгонкой: hb, local_k вкл, heat_mode — отдельный разбор cbl против surface по литературе (подъём у старта различается на 1–1,5 м/с). Ошибку схемы (1-й порядок в окнах игры) держать отдельно от физических параметров.
- Данные вне Askervein: λ/h, λ, local_k — по следу за гребнем (Perdigão, Bolund); параметры нагрева — по синтетике LES конвективного слоя (сначала исследование осуществимости LES, карточка в docs/plan).
- Повторить Моррис после 1–3 (тот же
run_all.sh, продолжение с места) — проверить, что вырождение разрешилось.
Технически: слияние feature/air-model в air/morris охранный хук не дал (код масштабов 1 и 3 тот же); CuPy в venv — cupy-cuda12x[ctk] (README morris).
Мелкое: исследовательские venv без brotli — при пересчёте полей air3d из ветки uv pip install brotli; в summary.md таблица ТКЭ выведена сырыми словарями (косметика). lint-хвосты из main (ж) — не проверял.
30.09.2026 вечер (главная сессия): перекалибровка, Perdigão, каталог данных
- Перекалибровка Askervein (слито 42162c7,
tools/research/recal/,docs/research/air-model-tune.md): λ/h = 0,031 (+0,018 −0,009), α = 0,235 ± 0,006, z0 = 0,09 м (край диапазона; при z0 = 0,03 по литературе χ² хуже на ≈ 6), χ²/ndf 68/44 против 206/45 у AM-09. Профиль мачты RS снял вырождение λ/h–α. Подветренная группа (χ² 25 на 8) не лечится ни одним из трёх параметров — структурное. - Открыто — решает координатор после правок модели (решение пользователя 30.09): α в игре. Исполнитель предлагал
wind.shear_exponent0,23 иmax_profile_factor2,0; довод против — 0,23 есть α Askervein (нейтраль, сильный ветер, пустошь), а одно α на всю игру завысит сдвиг над степью; вариант — α/профиль из местного z0 и устойчивости. От этого зависит пересчёт эталона GPU-теста и цены на сетках игры. - Perdigão (слито c0840db): данные открыты (THREDDS U. Porto), 2 случая (NE 27.04.2017, SW 11.05.2017), сырьё вне git в
tools/research/data/perdigao/raw/(821 МБ, включая PDF Menke 2019); статистика рециркуляции Menke 2019 и предложенные наблюдаемые —menke2019/summary.md. Рельеф — своим конвейером (Copernicus), лес на грядах учесть (эвкалипт 20–25 м, сосна до 15 м, карт полога нет; есть лидарное облако 2015). - Bolund не используем (решение пользователя: нерелевантно низкий уступ). Пункт 5 выше и
docs/research/air-model-sensitivity.mdещё называют Bolund — поправить. - Каталог всех данных:
docs/research/experimental_data.md— брать данные оттуда; в §6 список расхождений между файлами (поправить при случае).
Волна А, блок А1 (К1, с 30.09.2026 вечер)
- К1 (новая сессия) принял только блок А1 плана дня («Структурные правки»): А2–А4, волна Б, AM-11/12, релизная сборка — не запускаются. Решение пользователя: Fable проектирует (А1.1) и проверяет (А1.3), Opus пишет код (А1.2).
- Контракты: А1 меняет схему решателя (уравнение θ′, K_θ, h при
closure=const) — по C1 это новая версия C1 (дискретизация, reference.md, фикстурыref/,picard/, окна) и, возможно, C2 (поляAirCase.p). Точную правку контракта К1 фиксирует по плану А1.1 до запуска А1.2; А1.1 — только чтение и пробы, контракт не трогает. - А1.1 запущена: dp-researcher (Fable), копия ~/deltaplan-wf-a1plan, ветка air/a1-plan.
- А1.1 принята (К1 перепроверил χ² Askervein 68,06/44 по runs_check25 и дельты седловины из out/saddle.json), слита 25844df. Решения К1 — docs/archive/plan/air-model-a1.md §8: Pr_t = 0,85 временно, до решения пользователя (шлюз п. 1 — в отчёт главной сессии; А1.2 не ждёт: значение — константа, фикстуры несут pr_t в JSON); множитель 1/Pr_t общий для всех осей; τ = 7200 с (смысл — только θ′_d); следствия правки 2 — физика, не подгонять.
- Контракты до А1.2: C1 v2, C2 v3, C7 v2 (C3 — явно «theta = полное θ′», без смены версии); тест версий обновлён, контракты 24/24.
- А1.2 запущена: dp-engineer (Opus), копия ~/deltaplan-wf-a1, ветка air/a1.
- А1.2 сдана (отчёт исполнителя): все 7 шагов плана, отступлений нет. Замечания исполнителя: эталон
picard/200 м, 3 м/с с нагревом не сходится (max 3000, невязка θ′ качается 5,7e-7…1e-6 при пороге 5e-7) — записано, не лечено; bench 200 м падает по таймауту 60 с и затем segfault 139 при выходе (задача не освобождена после таймаута); шаг итерации +27 % (оценка — GPU был занят посторонним процессом вне замка); в рецепте (4) внешнийflockлишний —run_grid.pyсам берёт замок (взаимоблокировка). - А1.3 запущена: dp-researcher (Fable), копия ~/deltaplan-wf-a1rev, ветка air/a1-review от air/a1. Главный вопрос ревью, кроме приёмки: несходимость 200 м — дефект реализации/схемы А1 или вход в А2.
- Состояние на момент отчёта К1 главной сессии: А1.1 принята и слита; А1.2 сдана (air/a1, 7 коммитов, копия ~/deltaplan-wf-a1 — не удалять до приёмки); А1.3 (ревью, Fable) идёт в ~/deltaplan-wf-a1rev (air/a1-review), ждёт свой фоновый прогон. Как продолжить: дождаться вердикта А1.3 → при «принять» К1 перепроверяет (1)–(5) (контракты, GPU test_air_, седловина, check25), вливает air/a1 и air/a1-review в feature/air-model только по одобрению главной сессии, удаляет копии ~/deltaplan-wf-a1, ~/deltaplan-wf-a1rev и ветки; при «вернуть» — новый dp-engineer по перечню ревью. Шлюз пользователю: значение Pr_t (0,85 временно).
- А1.3: вердикт «принять», важных расхождений с планом и замечаний по физике нет. Главная сессия сообщила: посторонний llama-server остановлен — перемеры на свободном GPU сделаны (числа в таблице). Несходимость 200 м — в А2 (кандидаты: k_relax 0,25, heat_sweeps 8 — численные; физичнее — пересмотр θ′ = 0 на выходной грани). Пропуск второго прохода тепла у решения без нагрева (порог плана +15 % превышен) — туда же, в А2/AM-11. Мелкие оговорки — задача А1.2б перед слиянием.
- Решения пользователя (через главную сессию, 30.09.2026): (1) слияние air/a1 и air/a1-review в feature/air-model одобрено — влито b0a83e2, fc1eaba; копии ~/deltaplan-wf-a1, ~/deltaplan-wf-a1rev и ветки удалены. (2) Pr_t = 0,85 — окончательно (код, reference.md, контракт C2, docs/guide/air-model.md, план А1 §8 — «временно» снято). (3) мелкие замечания ревью — А1.2б (идёт). (4) А2 не запускать сейчас; несходимость 200 м, 3 м/с с нагревом — в А2; цель — максимально реалистичная физика ветра, но не уровня суперкомпьютера прогноза погоды: брать наименее затратный вариант — первый кандидат k_relax 0,5 → 0,25; heat_sweeps = 8 дороже; пересмотр θ′ = 0 на выходной грани — только если дёшево. Цена итерации +18 % на 400 м — известна и принята. Записано в docs/plan/air_model.md («Решения пользователя»). CHANGELOG «В работе» — пункт о правках тепла.
- Блок А1 закрыт (30.09.2026). Перепроверка К1 на feature/air-model после слияния (fc1eaba, до А1.2б): контракты 24/24; thermals 7/0, wind_field 9/0, atmo 5/0, window_case 2/0, determinism 3/0; GPU test_air_ 56/56; Askervein check25 χ² 68,06/44 (новый прогон, опорный файл возвращён); седловина Δ×(τ 1800↔21600) = 0,0 (20 и 50 м); const+cbl ok, 51 итерация. После А1.2б (d38e858): контракты 25/25, bench QUICK 2/0. Копий задач нет (остались ~/deltaplan-wf и ~/deltaplan-wf-morris). Дальше по плану дня: А2 (не запускать до команды; вариант — наименее затратный), А3, А4, волна Б.
Волна А2–А4 (К2, с 01.10.2026)
- К2 (новая сессия) принял модуль: HEAD feature/air-model 4828b63; air/a2-pre (eab5c47) не слит — А2 ветвится от feature/air-model с влитым air/a2-pre (слияние в feature/air-model — вместе с А2, по одобрению). Решение пользователя (через главную сессию): А2 ∥ А3 ∥ А4, затем волна Б; слияния в feature/air-model — только по одобрению главной сессии; релизная сборка и AM-11 — не запускать. Записано в план (
docs/plan/air_model.md, «Решения пользователя»). - Контракты до исполнителей: C1 — границы А2 (значения численных Params, пересчёт фикстур, пропуск второго прохода тепла без нагрева — без версии; условие θ′ на выходной грани / схема — C1 v3, потолок окна — C7 v3 — только через К2; λ/h, α, z0, max_profile игры А2 не меняет — волна Б п. 2). C2 v3 — инвариант
AirCase.p=Params()air.py и α/max_profile =wind.*игры, новый тестtest_c2_params_match_reference(мутация k_relax ловится). C10 v1 — модуль случая калибровки (NAME,SUBCASES,observations(),run_one) для совместной калибровки волны Б, тестtools/research/cases/check_c10.py. Контракты 26/26. - Замечание: на GPU посторонний процесс (ashoo2 face-recognition, 800 МБ) — не наш, не трогаем; замеры времени шумные, итерации детерминированы.
- Волна Б — заметка:
morris/model.pyFACTORS держит номинал pr_t = 1,0 (recal считался с Pr_t = 1); в нейтральных случаях без нагрева не влияет, но в совместной калибровке брать Pr_t = 0,85 явно. - А2 (dp-engineer, Opus; ~/deltaplan-wf-a2, air/a2), А3 (dp-researcher, Sonnet; ~/deltaplan-wf-a3, air/a3), А4 (dp-researcher, Sonnet; ~/deltaplan-wf-a4, air/a4) запущены параллельно. А2 — тип dp-engineer: при выборе дешёвой правки её же вносит в игру (Params + AirCase.p, фикстуры, bench, пропуск второго прохода тепла без нагрева); правка схемы/потолка окна — шлюз через К2.
- А3 принята К2 (проверено: один файл docs/archive/plan/air-model-a3.md, код не менялся; выбор = текущая схема игры). Замечания: коэффициенты HB93/YSU частью «по памяти» (помечены); записка упоминает Bolund (не используем — поправить при слиянии, dp-writer). Слияние air/a3 → feature/air-model — по одобрению главной сессии.
- А4 принята К2: check_c10 перепроверен (38 наблюдаемых, 14 строк, 0 нарушений), решатель/скрипты игры не менялись (diff пуст), числа строк jsonl совпадают с отчётом. Ответы К2 на вопросы А4: (1) карта z0/d в решателе — не сейчас: сначала совместная калибровка на скалярном z0 + d в рельефе; карта — только если невязка по зоне не уйдёт (тогда шлюз: правка решателя C1 v3); (2) C10 — уточнено без смены версии (
grp— группы χ² и зависимость; лишние поля строки допустимы; все случаи калибровки — одной схемой переноса); (3) SW: в долине каналирование (105–170° против 216°) — волна Б решает веса tse09/11/06/10 или компоненту вдоль ветра, с записью в журнал. - Находка К2 для волны Б: перекалибровка Askervein (recal) считалась с
adv2 = True(2-й порядок, номинал Морриса) и Pr_t = 1, пробный Perdigão — сadv2 = False(1-й порядок,Params()). Совместная калибровка — одной схемой; физические параметры — на 2-м порядке (ближе к сошедшемуся решению), ошибка 1-го порядка игры — отдельная систематика (решение пользователя 29.09: «занижение разгона у бровки — граница модели», А3 §4). Недобор рециркуляции Perdigão на 1-м порядке частично может быть численной диффузией (≈ |u|Δx/2). - Решение пользователя (через главную сессию, 01.10.2026): волну Б сегодня не начинаем; после приёмки А2 — шлюз и отчёт; слияния air/a2, air/a3, air/a4 — только по одобрению. Посторонний GPU-процесс (ashoo2 face-recognition) делит GPU с матрицей А2 — цену итерации из этих замеров не считать окончательной.
- Одобрение пользователя (через главную сессию, 01.10.2026): принятое сливать в feature/air-model. А3 → 5ec1752, А4 → e462ea3; ветки air/a3, air/a4 удалены. После слияния: контракты 26/26, check_c10 perdigao 0 нарушений. А2 — сольётся после приёмки К2 (перепроверка контрактов и GPU test_air_). Не пушить, в main не вливать; волну Б не начинать.
- А2 принята и слита (01.10.2026, К2): перепроверено — матрица (cbl kr10: old и new 0 несошедшихся), контракты 26/26, GPU test_air_ 58/58 в копии А2; после слияния — headless затронутые тесты зелёные, GPU test_air_ 58/58 на feature/air-model. Выбор k_relax 0,1 вместо первого кандидата 0,25 — в рамках решения пользователя «наименее затратный»: 0,25 не сводит окно 50 м в штиль на new, 0,1 — та же цена, что без правки. Правок C1 v3/C7 v3 не понадобилось; контракты не менялись. Карты невязки (17 МБ) — локально
~/deltaplan-wf/tools/research/a2pre/out/matrix_a2_maps.npz(не в git,.gitignore). - Предложения на потом (не делались, решение — у пользователя/AM-11): (1) K (
nu,nuh) в состояние тёплого старта (state()/warm) — тёплый старт того же поля вернётся к ~10 итерациям, пересчёт в полёте короче; меняет C9/C2 (формат состояния) — через координатора, логично в AM-11 (с Р13). (2) А3: неустойчивая ветвь local_k √(1−16Ri) > 1 — возможный двойной счёт с K_b (F ≤ 1 при Ri ≤ 0) — проверить в волне Б. (3) Волна Б: совместная калибровка одной схемой переноса (Askervein recal — adv2 вкл, Perdigão пробный — выкл). - Блок А закрыт (01.10.2026). Копий задач нет (кроме ~/deltaplan-wf-morris — air/morris, главной сессии). Волна Б — не начата (решение пользователя). Шлюз: отчёт главной сессии.
Волна Б (К2, с 01.10.2026)
- Решение пользователя (через главную сессию): запустить волну Б — п. 1 совместная калибровка Askervein + Perdigão, п. 2 решение по α в игре + пересчёт эталона и цены. Моррис (п. 3) — только по решению пользователя после итогов п. 1–2: после калибровки — шлюз, отчёт главной сессии. Главное требование — условия прогонов на разных данных сопоставимы с точки зрения модели: одна схема (перенос, замыкание, heat_mode, Pr_t 0,85, k_relax, критерий), сетка относительно H и λ, область и потолок, профиль притока одним способом (α, z0 — свои у случая), шероховатость/смещение под пологом, устойчивость; таблица «настройка → Askervein → Perdigão» в журнале до пачки; различия — устранить или обосновать данными; ошибку схемы (1-й порядок) оценить отдельно и не дать параметрам её впитать. λ/h, λ, local_k общие, α и z0 свои, Pr_t не в подгонку; одна пачка через job.sh, итог одним скриптом; после калибровки — регрессия матрицы А2; вес SW-подслучая — решить и записать. Слияния — по одобрению; не пушить; релизную сборку и AM-11 не запускать. Тёплый старт с K в состоянии — в TODO и плане AM-11 (решено главной сессией).
- Контракт C10 v2 (К2, до исполнителя): общая схема
tools/research/cases/scheme.py(SCHEME: adv2 2-й порядок, limiter 0, hb, local_k, cbl, Pr_t 0,85, k_relax 0,1, cs_h 0,25, k_fa 1; MAX_OUTER 4000; нейтраль),SETUPслучая (ключиscheme.SETUP_KEYS),scheme_ctlдля контроля схемы;check_c10.pyпроверяет. Пробный Perdigão А4 (1-й порядок, k_relax 0,5) по v2 не проходит — пересчитывается в Б1. Контракты 26/26. - Таблица сопоставимости — проект К2 (как было до волны Б; финал — после этапа 1 Б1, до пачки):
| Настройка | Askervein (recal, 30.09) | Perdigão (А4, пробный) | Волна Б |
|---|---|---|---|
| перенос | 2-й порядок (adv2, limiter 0) | 1-й порядок | 2-й порядок обоим (scheme.py); 1-й — контроль scheme_ctl |
| замыкание, local_k, heat_mode | hb, вкл, — | hb, вкл, cbl | hb, вкл, cbl (А3) |
| Pr_t | 1,0 (номинал Морриса) | 0,85 | 0,85 (в нейтрали без нагрева не действует — но одинаково) |
| k_relax | 0,5 | 0,5 | 0,1 (А2; неподвижная точка та же) |
| критерий, max_outer | air.py, 4000 | air.py, 4000 | то же |
| H (характерная высота) | ≈ 116 м (холм) | ≈ 174 м (гребень − дно, Menke табл. 2) | данные |
| dx, H/dx | 25 м, ≈ 4,6 | 30 м, ≈ 5,8 | одно правило H/dx (Б1 предлагает), + dx/2 для sig_grid обоим |
| λ_min/dx (lam 40 м) | 1,6 | 1,3 | следует из dx |
| область, область/H | 4 км, ≈ 34 | 6 км, ≈ 34 | одно правило |
| потолок, потолок/H | 1000 м, ≈ 8,6 | 1300 м, ≈ 7,5 | одно правило |
| губки: бок / верх | 1000 / 1000 м (Params) | 1000 / 700 м | одно правило |
| профиль притока | степенной α до z_sat, max_profile 2,0 (z_sat ≈ 191 м при α 0,235) | max_profile 2,5 (z_sat ≈ 494 м) | одно правило z_sat (Б1 предлагает по данным притока: мачта RS до 267 м, наветренная мачта до 100 м) |
| α, z0 | подгонка (0,235; 0,09) | номинал 0,235; z0 0,645 (лог-среднее лес/луг) | подгонка у каждого случая |
| опорная скорость | U10 = 8,9 на RS | U10 фона подобран под U100 наветренной мачты | наблюдаемые безразмерные — различие только в данных |
| лес | нет (d = 0) | поверхность + d·доля леса (d = 12,6 м) | один способ; у Askervein d = 0 — данные |
| f_cor | 1,22e-4 (57° с. ш.) | 9,3e-5 (39,7°) | широта — данные |
| устойчивость | нейтраль (данные — сильный ветер) | модель нейтраль; данные NE z/L −0,23…+0,05, SW Ri 0,075 | нейтраль обоим; отклонение данных — в σ/границах |
| сетка-систематика | sig_grid, grid_corr из AM-09 (12,5 м, λ/h 0,25) | sig_grid = | dx30 − dx20 |
- Б1 запущена (01.10.2026): dp-researcher (Opus), копия ~/deltaplan-wf-b1, ветка air/b1 (от 8de5ba8). Два этапа: (1) постановка и сопоставимость — адаптер askervein.py и perdigao.py по C10 v2, правила геометрии/профиля притока, контроль схемы (2-й порядок dx и dx/2, 1-й порядок — scheme_ctl), предложение по SW, план пачки → стоп и отчёт К2; (2) после одобрения К2 — пачка, совместная подгонка, регрессия матрицы А2.
- Б1, этап 1 сдан и принят К2 (air/b1: ebca59f, 8e31dee; ≈ 25 мин GPU). Перепроверено: check_c10 по случаю — askervein 47 наблюдаемых, 9 строк, 0 нарушений; perdigao 38, 20 строк, 0 нарушений; все контрольные прогоны ok, кроме dx/2 (OutOfMemory 12 ГБ, 32–37 млн клеток → мелкий уровень правила dx·2/3). Итоговая таблица сопоставимости:
| Настройка | Askervein | Perdigão | Решение |
|---|---|---|---|
| схема | scheme.py | scheme.py | одна (scheme.apply; контроль — scheme_ctl) |
| H | 119,9 м (HT − RS по данным) | 173,6 м (гребни − дно, Menke табл. 2) | одно определение: перепад в области наблюдений |
| dx, H/dx | 20 м, 6,0 | 30 м, 5,8 | dx = H/5,8 к шагу данных; dz = dx/2 |
| полуширина A/dx; H/A | 12; 0,48 | 12,5; 0,46–0,70 | совпадает |
| λ≈46 м / dx | 2,3 | 1,5 | следствие H/dx; ошибка сетки отдельно |
| область | 200 кл. = 4 км | 200 кл. = 6 км | 34,5 H |
| губка бок / верх | 35 кл. = 700 м / от вершины до потолка | 35 кл. = 1050 м / то же | одно правило (6 H) |
| потолок | вершина + 7,5 H | гребень + 7,5 H | одно правило |
| профиль притока | z_sat 450 м → max_profile 2,45 | z_sat 427–444 м → 2,42–2,44 | z_sat = 0,3·(0,3u*/f); проверено змеем RS (до 267 м насыщения нет) и RHI над гребнем (399/584 м) |
| опорная скорость | U10 8,8 → RS 10 м = 8,90 (данные 8,895) | U10 3,27 / 3,12 → гребень 100 м 8,80 / 8,85 (данные 8,79 / 8,82) | одно правило |
| нормировка | ΔS к RS на той же высоте | u_∥/S_ref к наветренному гребню 100 м | различие в данных: у Perdigão нет невозмущённой мачты |
| лес | d = 0 | DSM + 12,6 м × доля леса; z0 скаляр | один способ |
| нижняя граница наблюдений | 1·dz = 10 м | 1·dz = 15 м | одно правило |
| σ | σ_данных ⊕ 0,03 | σ_5мин ⊕ 0,10·S ⊕ 0,03 ⊕ σ_напр ⊕ σ_уст | общий пол 0,03; 10 % представительности только у Perdigão — данные (DSM против мачт σ 2,9 м, полог не измерен) |
| устойчивость | нейтраль | модель нейтраль; данные NE z/L −0,23…+0,05, SW Ri 0,075 → прогоны ±20 Вт/м²: мачты ≤ 0,05, зона до 0,14 — в σ | нейтраль обоим |
| f_cor | 1,23e-4 | 9,3e-5 | широта — данные |
| сетка-систематика | Δ(dx·2/3 − dx): среднее +0,042, max 0,158 | мачты ≤ 0,07; зона NE глубина −0,10 | одним способом; grid_corr = Δ, sig_grid = |
| область (контроль) | ×1,5 стороны: опора RS выходит из губки, разгоны −0,06…−0,15 (смена опоры, к притоку +0,008) | ≤ 0,06 | опора Askervein — в губке (= измеренный приток), ½ |
Контроль схемы у номинала (λ 46 м, α 0,235): 1-й порядок (игра) против 2-го — Askervein разгоны ниже на 0,03–0,14 (−1,0…−1,9σ по группам), χ² 154 → 231 на 47, вершина HT 0,74 → 0,61 (данные 0,88); Perdigão мачты ≤ 0,09, зона NE L/D 0,14 → 0,23, χ² NE 62 → 47, SW 60 → 63. В параметры не входит — отдельная систематика схемы игры. χ² номинала (2-й порядок): Askervein 154/47 (подветренная 98/8), Perdigão NE 62/20, SW 60/18 (зона Menke 22 и 40 из 3).
Главная находка этапа 1 (ответ на вопрос плана об отрыве): Perdigão тянет λ вниз (λ 15 м: χ² NE 19, SW 26; зона NE L/D 0,37), подветренная сторона Askervein — вверх (группа lee 140/98/69 при λ 15/46/150 м). Одним λ модель даёт слишком слабый отрыв за двумя грядами и слишком сильный дефицит за одиночным холмом — вероятно, структурное.
Решения К2 по этапу 1: (1) правила rules.py приняты → C10 v3 (контракт, тест C10 = 3); (2) H Perdigão = 174 м (гребни − дно; зона Menke нормирована так же); (3) SW (и NE): мачты — компонента вдоль ветра притока u_∥/S_ref, без исключения мачт и без понижения весов (SW 100 → 60; каналирование вдоль долины — вне нейтрального среднего поля, в «Границы»); (4) пачка по одному λ (в нейтрали h однородна): λ/h и lam по этим двум случаям не разделяются (h 1450–1860 м) — подгоняется λ, перевод в (λ/h, lam) игры — решение К2 в п. 2 с оговоркой; (5) z0 Perdigão общий для NE и SW (свойство места), α — свой у каждого подслучая (день/стратификация), общий α — проверкой; (6)
pd_menke— одно наблюдение на величину (среднее модели NE и SW против сводной статистики Menke), 3 члена вместо 6; (7) пол σ 0,03 у обоих; (8) пачка ≈ 3,4 ч GPU по сеткам Б1 — одобрена; (9) регрессия матрицы А2 — в двух переводах найденного λ: lam = λ, λ/h = 0 и lam = 40, λ/h = λ/h_нейтр — обе должны сходиться.Б1 принята К2 (этап 2): перепроверено — check_c10 по случаю (askervein 329 строк, perdigao 480 — 0 нарушений), таблица регрессии А2 (b1b: cbl 8/8). Не слита — слияния волны Б по одобрению главной сессии. Ответ на вопрос плана: малое λ отрыв за грядой не завышает, а занижает; одним λ нельзя одновременно усилить рециркуляцию в долине и ослабить след за холмом — в «Границы модели»; повтор Морриса имеет смысл только как поиск структурного фактора — решение пользователя.
Решение К2 по λ в игре: перевод (б) —
lam40 м (литература: HB93 30, Blackadar ≈ 27, порог устойчивости сходимости),lam_frac0,0158 (λ/h из общего λ = 27 м при h_нейтр 1713 м); в нейтрали калибровки работает пол 40 м (Δχ² +5,7 — внутри напряжения случаев); (а) lam 27 отвергнут — не сходится окно 100 м в штиль.Решение К2 по α в игре (К1-вопрос, «одно число или из z0 и устойчивости»): α по устойчивости, не одно число. Довод: 0,24 — показатель нейтрального сильного ветра (Askervein; Perdigão над лесом ещё больше), а в игре основное время — день с конвекцией, где сдвиг у земли много меньше (Irwin 1979: классы A–B 0,07 против D 0,15 — в 2 раза); одно α = 0,24 в полдень завысило бы ветер на высоте относительно 10 м. Устройство: α = α_N · r(класс Паскуилла–Тёрнера по u10, высоте солнца и облачности), r — отношения Irwin (1979, сельская) к D, α_N = 0,24 (Б1); max_profile — правило z_sat = 0,3·0,3u*/f (C10 v3, проверено данными притока). Одна функция для решателя (
AirPlace/окна) иWindModel— C2 v4. z0 игры 0,1 м не меняется (зависимость α от z0 по Counihan с калибровкой не согласуется: Askervein z0 0,05 → 0,14 против 0,24 — не вводим). Оговорка: α_N 0,24 выше лог-профиля (≈ 0,15–0,16) — это эффективный показатель степенного профиля до z_sat ≈ 450 м; устойчивые классы (E, F) дают α 0,56–0,88 — ограничены насыщением z_sat; вечер 20:00 — проверить числами в Б2.Контракт C2 v4 записан до Б2 (функция профиля, λ, конфиг
wind.shear_exponent_neutral,wind.z_sat_frac); тест версий C2 = 4; инвариантtest_c2_params_match_referenceпереписывает Б2 в том же коммите, что функцию.Б2 запущена (01.10.2026): dp-engineer (Opus), копия ~/deltaplan-wf-b2, ветка air/b2 (feature 00ae28a + air/b1) — функция профиля α по устойчивости + max_profile по z_sat (C2 v4) для решателя и WindModel, λ lam 40 / lam_frac 0,0158, пересчёт фикстур и эталонов, цена до/после.
Б2 сдана (этап 1): air/b2 e674c49, ce3aa88 —
WindProfile(GDScript) +air3d/wind_prof.py, класс по Тёрнеру, r по Irwin (A/B 0,112, C 0,16, D 0,24, E 0,56, F 0,88),AirCase.LAM_FRAC0,0158, конфигwind.shear_exponent_neutral/z_sat_frac; эталон = игра для Онгудая 12:00 до 1e-9; контракты 26/26, GPU test_air_ 58/58; цена: «Рассчитываем ветер» с окнами 3 м/с 5,54 → 6,18 с (+12 %), итерации цепочки 470 → 600 (+28 %; ветер — от профиля, штиль — от λ/h), bench 200 м штиль 250 → 1100 итер. (16,6 с GPU; игра 200 м не использует). Профиль WindModel полдень 3 м/с (класс B) на 300 м 4,8 → 4,2 м/с; облачно/вечер (D) 4,8 → 6,2.Решения К2 по вопросам Б2: (1) E/F: при v4 класс F давал 14·U10 на 300 м (43 м/с при 3 м/с) — недопустимо; выбран вариант (а) — z_sat по толщине устойчивого слоя h_s = 0,4√(u*L/f) (та же формула, что
air.py._bl_depth), L по классу Golder 1972 (коэффициенты A–E сверены по литературе К2: arXiv 1607.03518, табл. Myrup & Ranzieri; F 0,035/−0,036) → C2 v5 (max_profile(…, cls)); (2) λ масштаба 3 — общий источник с решателем остаётся (решение К1); ТКЭ Askervein с λ/h 0,0158 перепроверить, если ≤ 15 мин GPU, иначе — в границы; (3)test_lee_rotor(σ 0,47u при пороге 0,5u) иtest_wave(3,96 при 4,00): пороги качественные (слова пилота), коэффициенты эвристик не подгонять; если у порога нет источника — порог по фактическому запасу с комментарием «профиль откалиброван Б2», если есть — отчёт; (4) кромка облаков «ниже 7000 футов» и (5) ночь по солнцу < 8° — приняты, в «Границы модели»; (6) подпись в pilot_check.py — исправить.Б2 принята К2. Перепроверено: headless (8 файлов) зелёные; GPU test_air_ первый прогон
tools/gpu_tests.sh— 9 падений по таймауту 60 с: монитор погашен (DPMS), vsync X11/NVIDIA ~1 кадр/с (xset q: Monitor is Off); повтор той же командой с--disable-vsync --max-fps 60— 58/58. Предложение (главной сессии, не делал — общий инструмент): добавить--disable-vsyncвtools/gpu_tests.sh.Волна Б п. 1–2 выполнены; шлюз — отчёт главной сессии. Слияние air/b1 и air/b2 (air/b2 включает air/b1) в feature/air-model — ждёт одобрения; копии ~/deltaplan-wf-b1, ~/deltaplan-wf-b2 сохранены до слияния. Моррис (п. 3) — не запускался, по решению пользователя.
Решение пользователя (через главную сессию, 01.10.2026): результаты волны Б (п. 1–2) приняты. Слито air/b2 (с air/b1) → be8aa7f; копии ~/deltaplan-wf-b1, ~/deltaplan-wf-b2 и ветки удалены (поля Askervein Б2, 331 МБ вне git, воспроизводятся
tools/research/b2/tke_recheck.py, ≈ 1,3 мин GPU). После слияния (К2): импорт, контракты 26/26, GPU test_air_ 58/58 (--disable-vsync --max-fps 60, монитор погашен), headless wind_field 9, atmo 5, thermals 7, window_case 2, determinism 3, air_place 1, weather_day 3, lee_rotor 4, wave 5 — зелёные.- В игре: λ = max(40 м, 0,0158·h) (в нейтрали — 40 м), α по устойчивости (Тёрнер/Irwin, α_N 0,24), насыщение профиля по толщине слоя с устойчивым (C2 v5).
- Границы модели (приняты пользователем): расхождение «зона возвратного течения в долине Perdigão занижена ↔ след за одиночным холмом Askervein слишком сильный» — одним λ не лечится, структурное; ухудшение ТКЭ Askervein (χ² с σ сетки 33 → 255, завышение ×2,7–3,1 на наветренном склоне/вершине — нет быстрого искажения).
- Калибровка «только Perdigão» упирается в края сетки (λ 10 м, α 0,33, z0 1,0 м) — не используется.
- Моррис не повторяем — результаты признаны удовлетворительными (решение пользователя). Волна Б закрыта.
Копий задач нет (кроме ~/deltaplan-wf-morris — air/morris, главной сессии). Дальше по плану дня: релизная сборка, AM-11, AM-12 — по команде.
Разбор на шлюзе: опускание за гребнем и двойной ротор (01.10.2026, К2; код не менялся)
Источник чисел — выгрузки сравнения Онгудай 9 м/с (копия ~/deltaplan-cmp-air, ветка cmp/wind-ongudai, a59b272, tools/research/wind_compare/out/*strong*.json): в одной точке есть air (= air_velocity_at, с эвристикой) и mean (= mean_wind_at, поле без эвристики) — разность и есть вклад эвристики, новых прогонов не понадобилось.
- −13…−18 м/с — рывки эвристики, не решатель. Поле в этих точках: w −0,06…−0,6 (минимум поля по уровням 10–100 м — −0,8…−1,4 м/с). Рывок
atmosphere.gd:803–806: −burst_per_wind (1,0,configs/atmosphere.json:166) × ΔU × опасность × (g − ḡ), ΔU = (U_out − |U|)·lee_f (:785), U_out — наибольшая |U| столбца в 600 м над землёй (wind_field.gd:33, 293) ≈ 21–22 м/с при 9 м/с на 10 м. Замер: dw/(U600 − |U|) = −0,89…−0,91 (g = 1, ḡ ≈ 0,1). Растёт линейно с ветром на 600 м (не на гребне), опасность насыщается с 5 м/с; с высотой — только через |U| и lee_f (выше 200 м зоны нет). Рывки стоят до проверкиturbulence_enabled(:816) — в «осреднённых» выгрузках это мгновенный шум. Нулевое среднее даёт ложный подъём +0,6…+1,6 м/с (медиана) в 10–29 % точек следа. В main (аналитика,_lee_flow:871, 876): −0,7·u·lee (среднее) − 1,0·u·рывок → до −1,7·u (u на высоте пилота) = −10…−17 м/с; коэффициенты 0,7/1,0 — из 00f2959 («смертельно опасна», ощущение пилота), не из физики. - Физически разумно (нейтраль, гребень 150–400 м, U_H 10–14 м/с): среднее опускание в следе ~0,1–0,25·U_H (1–3 м/с; оценка по геометрии линий тока, Kaimal & Finnigan 1994 / Ishihara 1999 — по памяти исследователя, сверить); σ_w слоя смешения 0,14·ΔU при ΔU ≈ U_H (Bell & Mehta 1990, уже в конфиге) → 1,5–2 м/с, пик 3σ ≈ 0,4·U_H ≈ 4–6 м/с. 10–20 м/с — роторы горных волн (T-REX, хребты 1–3 км, сильная устойчивость), не наш случай.
- Двойной ротор — подтверждён.
atmosphere.gd:807–812добавляет a·0,25·U_out·lee_f·ядро (≈ −5 м/с у земли) независимо от того, что поле уже течёт назад; lee_f (field_turbulence.gd:69–79) максимален именно там, где поле медленное/возвратное. Допущениеdocs/guide/air-model.md:627–628(«возвратного течения в решателе нет») устарело после волн А/Б (окна 50 м, λ, калибровка на Perdigão). Замер: мин. продольная у старта (10 м) −0,52 → −4,66 м/с, у седловины −2,15 → −4,66 (20 м: −2,55 → −3,94); доля возвратных точек 10 м: старт 2,9 → 15,9 %, седловина 14,7 → 32,7 %; 20 м: 1,8 → 10,2 и 12,9 → 27,0 %. Против Menke 2019 (Perdigão: макс. обратная / U100 = 0,22 ± 0,08, 1,4–2,0 м/с): одно поле ≈ 0,2·U100, с эвристикой ≈ 0,4·U100. Числа «14 % → 58 %» в выгрузках и HTML (build/air-model/, по md5 те же) не нашлись — ближайшие выше. - Варианты (шлюз, ждёт решения): ротор — (В1) выключить
field_reverse_per_windс полем; (В2, рекоменд.) масштабно-зависимо: вес эвристики 1 − smoothstep(2, 4, превышение/dx уровня) — в окнах 50/100 м (пилот всегда в окне 50 м) пузырь от решателя, на области 400 м — эвристика 0,22·U_H (Menke) вместо 0,25·U_out; (В3) «дополнять до цели» — расширяет зону за решатель, против принятой границы модели. Рывки — (Р1, рекоменд.) ΔU по ветру на уровне гребня, амплитуда 3·σ_w = 0,42·ΔU вместо 1,0·ΔU, рывки послеturbulence_enabled; аналитика: danger_sink_per_wind 0,7 → ~0,2, burst_per_wind 1,0 → ~0,4. Меняет приёмку AM-08 (рывки против базы AM-00 ±20 %) и test_lee_rotor — решение пользователя. - Решение пользователя по шлюзу (через главную сессию, 01.10.2026): В2 + Р1 одной задачей AM-08в. Только поле решателя в feature/air-model; аналитику (main, запасной путь, полоса края) с danger_sink_per_wind/burst_per_wind не трогаем — решение К2: по умолчанию, как сказал пользователь. Ощущения пилота — ориентир, не подгонка; приёмка AM-08 «±20 % от базы AM-00» пересмотрена по физике (σ_w = 0,14·ΔU, Menke 2019), расхождение с пилотом — наблюдение. Приёмка AM-08в — повторная выгрузка Онгудая (6 вариантов), таблица «было/стало»; физически не проходящие числа — к исследователю с веб-поиском. В план: «Решения пользователя», «Масштаб 3», AM-08, AM-08в.
- Контракт C4 v4 (до исполнителя, первым коммитом в air/am-08v):
AirFieldSet.sample_dx, правило стыка в зоне отрыва (ΔU от U_H, рывки 0,42·ΔU только при болтанке, обратный поток 0,22·U_H × (1 − разрешённость)), ключиlee.field_*; тестtest_c4_sample_dx,test_c4_lee_keys. - AM-08в принята К2 и слита (774bbb2). Перепроверено: контрактные 28/28, test_lee_rotor 7/7, atmosphere/ 128 (0 упало) после слияния; числа выгрузок
tools/research/wind_compare/out/am08v/пересчитаны К2 своим скриптом — совпадают (старт 10 м: w min −0,88 / поле −0,79, возвратных 3,2 / 2,9 %; седловина 10 м: −0,64 / −0,56, 17,0 / 14,7 %; поле не изменилось — решатель не трогали). Таблица —tools/research/wind_compare/am08v/table.md, HTML —build/screenshots/AM-08в/.- Решения К2 при приёмке: (1) вклад рывков вычитается из гауссовой σ_w слоя смешения, полная σ_w = 0,14·ΔU (толкование «рывки — часть пульсаций» C4 v4, интерфейс тот же) — принято; (2) условие «в окне 50 м добавка эвристики = 0» выполнено по смыслу: за буграми с r ≲ 70 м (L/dx < 8) пузырь не разрешён и эвристика работает (до −1,7 м/с) — так и задумано весом разрешённости; n0/n1 = 4/8 подтверждены
am08v/resolved.md(доля возвратного поля: L/dx < 4 — 0–2 %, ≥ 8 — 30–32 %); (3) цель «среднее опускание 1–3 м/с» не достигнута (зона −0,2…−1,1 м/с) — это среднее поле решателя, вне скоупа; оценка 1–3 м/с была по памяти — отдана на проверку исследователю с веб-поиском. - Наблюдение (не дефект, решение пользователя): против базы AM-00 (ощущения пилота) σ_w за гребнем 0,86 / 0,77 / 0,44 м/с (база 1,14 / 1,08 / 1,27), рывков 5,0 / 2,3 / 1,0 в мин (база 18 / 7,3 / 26) — на 25–65 % слабее: ΔU теперь от ветра на уровне гребня.
- Падения вне задачи (на базе тоже / под нагрузкой): test_takeoff::test_headwind_launch (atlas), test_e2e под нагрузкой, test_surface (порог времени), test_net_screen (port_busy); stability/test_matrix не перепроверен (headless — аналитика, побитно та же).
- Решения К2 при приёмке: (1) вклад рывков вычитается из гауссовой σ_w слоя смешения, полная σ_w = 0,14·ΔU (толкование «рывки — часть пульсаций» C4 v4, интерфейс тот же) — принято; (2) условие «в окне 50 м добавка эвристики = 0» выполнено по смыслу: за буграми с r ≲ 70 м (L/dx < 8) пузырь не разрешён и эвристика работает (до −1,7 м/с) — так и задумано весом разрешённости; n0/n1 = 4/8 подтверждены
- Проверка чисел AM-08в по литературе (dp-researcher, веб-поиск, 01.10.2026) — источники: Liu, Wang, Wang, Ishihara 2020 JWEIA 201:104178; Liu, Ishihara et al. 2016 JWEIA 153:1; Menke 2019 ACP 19:2713; Finnigan et al. 2020 BLM 177:247; Coimbra 2025 AMT 18:287; Bell & Mehta 1990 (через Hadjadj 2010). Значения с рисунков считаны на глаз (±0,03).
- Среднее w за гребнем — в пределах. Аэротруба и LES (уклон 0,63–1,26): w в следе −0,06…−0,17·U_H, внутри пузыря у склона w мал или направлен вверх. Модель: самое сильное среднее −0,02…−0,13·U_H, у земли −0,015…−0,055·U_H. Оценка «1–3 м/с (0,1–0,25·U_H)» из разбора на шлюзе снята — она верна только для склонов круче 1.
- Пузырь — частично завышен. Отрыв начинается при уклоне ≈ 0,27 (2D) и ≈ 0,36 (3D) (Finnigan). Длина пузыря при уклоне 0,63: ≈ 1,6·H для 3D и ≈ 3,5·H для 2D, при уклоне 1,26 — больше 5·H. В Perdigão 2,5–3·H. Обратная скорость в аэротрубе — от −0,1 до −0,2·U_L. 0,22 у Menke — это максимум по пузырю, а не среднее. Модель: L = 2,8·H без порога по уклону и 0,22·U_H. Для 3D-бугров длина завышена примерно в 1,8 раза, на пологих склонах эвристика даёт пузырь, которого быть не должно.
- Механическая болтанка в слое сдвига над следом завышена в 3–4 раза. В модели σ_w/ΔU = 0,4–0,6 (l·|∂U/∂z|, AM-08), в литературе 0,13–0,15 (σ_w/U_H 0,15–0,2 при уклоне ≈ 0,6, до 0,3 при уклоне ≳ 1,2; Perdigão над гребнем σ ≈ 0,16·U). Пики 0,54–0,74·U_H — это 3–4σ, распределение w в следе скошено вверх (Sk_w > 0).
- Шлюз, ждёт решения пользователя: (а) механическая σ в слое сдвига над следом (ограничить σ_w слоем смешения 0,14·ΔU в зоне отрыва или пересмотреть длину перемешивания) — новая задача; (б) уточнить эвристику пузыря: порог по уклону, L/H по 2D/3D и уклону, обратная скорость 0,1–0,2·U_H.
- Решение пользователя (через главную сессию, 01.10.2026): AM-08в принята, модель воздуха считается готовой. Пики с болтанкой (−6…−9 м/с, до 0,6–0,7·U_H) и пункты шлюза (а) механическая σ_w над следом, (б) уточнение пузыря — не делаем: точнее на таком объёме данных не откалибровать; записаны как границы модели. Калибровка дальше — только при новых данных/отзывах. AM-11, AM-12 — в TODO без запуска. main влит в feature/air-model (8e0b508, конфликт ASSETS.md — обе строки); слияние в main — главная сессия.
Известные расхождения (копия раздела плана) (модель готова, решение пользователя 01.10.2026; в air-model не делаем — потом отдельной задачей вне ветки)
(а) Механическая болтанка в слое сдвига над следом за гребнем завышена в 3–4 раза. Модель: σ_w/ΔU = 0,4–0,6 (длина перемешивания × |∂U/∂z|, AM-08), пики (w − w_ср) до 0,54–0,74·U_H (−6…−9 м/с при 9 м/с). Литература: σ_w/ΔU ≈ 0,13–0,15, σ_w/U_H ≈ 0,15–0,2 при уклоне ≈ 0,6 и до ≈ 0,3 при уклоне ≳ 1,2 (Liu, Ishihara et al. 2016, JWEIA 153:1, рис. 12c, 14c; Liu, Wang, Wang, Ishihara 2020, JWEIA 201:104178, рис. 3e); слой смешения 0,14 (Bell & Mehta 1990); Perdigão над подветренным гребнем σ ≈ 0,16·U (Menke et al. 2019, ACP 19:2713, табл. 3); распределение w в следе скошено вверх (Liu 2020, рис. 7). Где в полёте: сильный ветер, подветренная сторона, 50–100 м над землёй. Трудоёмкость: 0,5–1 день (в зоне отрыва ограничить σ_w слоем смешения 0,14·ΔU или пересмотреть длину перемешивания в слое сдвига).
(б) Пузырь отрыва эвристики на пологих склонах и низких буграх. Модель: длина 2,8·H без порога по уклону (Menke 2019, лесистые 2D-гряды), обратная скорость 0,22·U_H. Литература: отрыв с уклона ≈ 0,27 (2D) / ≈ 0,36 (3D) (Finnigan et al. 2020, BLM 177:247, с. 13); длина при уклоне 0,63 — ≈ 1,6·H (3D) и ≈ 3,5·H (2D), при 1,26 — > 5·H (Liu 2016 §4.2.1, 4.3.1; Liu 2020 рис. 3a); обратная скорость в аэротрубе −0,1…−0,2·U_L, 0,22 у Menke — максимум по пузырю, не среднее (Menke 2019 рис. 10). Для 3D-бугров длина завышена ≈ в 1,8 раза, на пологих склонах эвристика даёт пузырь, которого быть не должно; обратная скорость как средняя — в 1,5–2 раза. Где в полёте: низкие бугры (превышение ≲ 70 м, где решатель пузырь не разрешает) и пологие склоны за ними, у земли, в сильный ветер; на области 400 м — везде за гребнями вне окон. Трудоёмкость: около 0,5 дня (порог по уклону, L/H по 2D/3D и крутизне, обратная скорость 0,1–0,2·U_H).
Закрытие модуля (01.10.2026, К2). main (5df933e) влит в feature/air-model (8e0b508, конфликт ASSETS.md — обе строки). Полный прогон после слияния:
- headless по каталогам: atmosphere 128, contracts 28, game 116, flight 80 (1 упало), terrain 63 (1), ui 78 (1), net 28, instruments 47, tasks 37, vegetation 21, world 11, world_objects 31, audio 12, core 5 — без новых падений;
- GPU (
tools/gpu_tests.sh --filter=test_air_): 60/60. - Падения, которых не вносили ни модуль, ни слияние: test_takeoff::test_headwind_launch (atlas, nose_high) и stability/test_matrix (aushkul × training × strong × в лоб) падают и на feature до слияния (90a6c9d), и на main 5df933e — на main ещё и laminar. Под нагрузкой падают test_surface (загрузка 1,28 с при пороге 0,5) и test_net_screen (port_busy).
- Копий задач нет. Модуль закрыт; слияние в main — за главной сессией.