<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Архив планов on Deltaplan</title><link>https://thegriglat.github.io/deltaplan/plans/archive/</link><description>Recent content in Архив планов on Deltaplan</description><generator>Hugo</generator><language>ru-RU</language><atom:link href="https://thegriglat.github.io/deltaplan/plans/archive/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a1/</guid><description>&lt;h1 id="а1--структурные-правки-решателя-воздуха-план-а11"&gt;А1 — структурные правки решателя воздуха: план (А1.1)&lt;a class="anchor" href="#%d0%b01--%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d1%83%d1%80%d0%bd%d1%8b%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%ba%d0%b8-%d1%80%d0%b5%d1%88%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-%d0%b2%d0%be%d0%b7%d0%b4%d1%83%d1%85%d0%b0-%d0%bf%d0%bb%d0%b0%d0%bd-%d0%b011" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Задание для исполнителя кода (А1.2, dp-engineer) и основа ревью (А1.3). Источник задач — отбор Морриса&#10;(&lt;code&gt;docs/research/air-model-sensitivity.md&lt;/code&gt;; журнал &lt;code&gt;docs/archive/plan/air-model-progress.md&lt;/code&gt; → «Итог отбора Морриса»).&#10;Пробы «сейчас / после» без правок решателя — &lt;code&gt;tools/research/a1/&lt;/code&gt; (подклассы &lt;code&gt;PrtAir&lt;/code&gt;, &lt;code&gt;SplitAir&lt;/code&gt;,&#10;&lt;code&gt;HAir&lt;/code&gt; в &lt;code&gt;probe.py&lt;/code&gt;; числа в &lt;code&gt;out/*.json&lt;/code&gt;; воспроизведение — &lt;code&gt;README.md&lt;/code&gt; там же). Строки кода — по&#10;&lt;code&gt;feature/air-model&lt;/code&gt; на 30.09.2026 (28ab3de).&lt;/p&gt;&#10;&lt;h2 id="коротко"&gt;Коротко&lt;a class="anchor" href="#%d0%ba%d0%be%d1%80%d0%be%d1%82%d0%ba%d0%be" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Правка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Что не так сейчас&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Что делаем&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Где&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1. Pr_t&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;Params.pr_t&lt;/code&gt; объявлен, но &lt;code&gt;khf = nuf&lt;/code&gt; (air.py:701) — K_θ ≡ K_m; в GPU параметра нет&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;K_θ = K_m/Pr_t, K_θ,h = K_h/Pr_t; Pr_t — параметр обоих решателей (&lt;code&gt;Params.pr_t&lt;/code&gt;, &lt;code&gt;AirCase.p.pr_t&lt;/code&gt;, слот &lt;code&gt;P_IPRT&lt;/code&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air.py ядро &lt;code&gt;build_heat&lt;/code&gt;; &lt;code&gt;air_picard.glsl:heat&lt;/code&gt;; &lt;code&gt;air_case.gd&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2. τ только для диабатического θ′&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;−θ′/τ&lt;/code&gt; гасит и адиабатические θ′ = −γ·δz (устойчивое обтекание): седловина без нагрева зависит от τ (×1,71 / 1,90 / 1,99 при τ 1800 / 7200 / 21600 с — проба)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;второй переносимый скаляр θ′_d (диабатическая часть): L θ′_d = Q − θ′_d/τ; полное θ′: L θ′ = Q − w γ − θ′_d/τ (схема A′). Проба: ×2,051 / 2,051 / 2,055 — от τ не зависит (Δ = 0,004 &amp;lt; 0,05)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;оба решателя: ядро тепла (два прохода), новые буферы &lt;code&gt;thd&lt;/code&gt;, &lt;code&gt;thbd&lt;/code&gt;, ореол окна от родителя, тёплый старт, невязка, баланс тепла&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3. &lt;code&gt;closure = const&lt;/code&gt; + &lt;code&gt;heat_mode = cbl&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;_closure&lt;/code&gt; при const не считает h → &lt;code&gt;AttributeError: 'Air' object has no attribute 'h_bl'&lt;/code&gt; (проба)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;толщина слоя h, w*, L — всегда (Троен–Март), при const постоянна только вязкость&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;только air.py (&lt;code&gt;_closure&lt;/code&gt;); в GPU &lt;code&gt;closure&lt;/code&gt; нет и не нужен&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Решения на шлюз пользователя (раздел 6): значение Pr_t (рекомендация 0,85; варианты 1,0 / 0,74 / 0,95);&#10;смысл и значение τ (оставить 7200 с, смысл сужается до диабатической части); следствия правки 2 —&#10;седловина уходит от ×1,9 к ×2,05 при цели пилота 1,5 ± 0,2 (физика модели при Fr ≈ 2, не подгонять) и&#10;подъём у старта в штиль Онгудай 12:00 ниже на 15 % (0,52 → 0,44 м/с в окне 50 м; при ветре без изменений):&#10;крышка слоя перемешивания перестаёт «протекать» через τ.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a2/</guid><description>&lt;h1 id="а2-сходимость-в-штиль"&gt;А2: сходимость в штиль&lt;a class="anchor" href="#%d0%b02-%d1%81%d1%85%d0%be%d0%b4%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c-%d0%b2-%d1%88%d1%82%d0%b8%d0%bb%d1%8c" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;01.10.2026. Ветка &lt;code&gt;air/a2&lt;/code&gt;: &lt;code&gt;feature/air-model&lt;/code&gt; 0788cf7 плюс влитая разведка &lt;code&gt;air/a2-pre&lt;/code&gt;. Разведка, наборы old/new&#10;и матрица описаны в &lt;code&gt;docs/archive/plan/air-model-a2pre.md&lt;/code&gt;. Код и данные лежат в &lt;code&gt;tools/research/a2pre/&lt;/code&gt;, команды — в&#10;README, раздел «А2». Все таблицы строит один скрипт: &lt;code&gt;analyze_a2.py&lt;/code&gt; → &lt;code&gt;out/a2_tables.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="итог"&gt;Итог&lt;a class="anchor" href="#%d0%b8%d1%82%d0%be%d0%b3" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;k_relax&lt;/code&gt; 0,5 → 0,1.&lt;/strong&gt; Это нижняя релаксация обновления местного K(Ri). Значение сменено в&#10;&lt;code&gt;air.py → Params&lt;/code&gt; и &lt;code&gt;AirCase.p&lt;/code&gt;.&#10;&lt;ul&gt;&#10;&lt;li&gt;Сходятся все cbl-случаи обоих наборов: old 16/16, new 16/16.&lt;/li&gt;&#10;&lt;li&gt;Цепочка игры стоит столько же итераций: old 892 → 892, new 3712 (с предельным циклом) → 922.&lt;/li&gt;&#10;&lt;li&gt;Физика та же: сошедшиеся cbl-решения отличаются от прежних не больше чем на 0,01 м/с по ключевым числам.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Пропуск прохода θ′_d у решения без нагрева&lt;/strong&gt; (air.py и GPU). Без нагрева и без θ′_d у родителя уравнение θ′_d&#10;однородно, его решение θ′_d ≡ 0 точно. Итерации те же, итерация стоит 79 % от полной на 400 м (3,18 против&#10;4,02 мс) и 76 % на 200 м. Так в игре дешевле каждое решение пары «без нагрева», то есть w_mech.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Параметры модели игры не менялись:&lt;/strong&gt; λ/h, α, z0, max_profile, &lt;code&gt;wind.*&lt;/code&gt;. Схема, условие на выходной грани и&#10;потолок окна (C1 v3, C7 v3) тоже не трогались.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="что-гоняли"&gt;Что гоняли&lt;a class="anchor" href="#%d1%87%d1%82%d0%be-%d0%b3%d0%be%d0%bd%d1%8f%d0%bb%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Условия&lt;/strong&gt; — как в разведке. Онгудай, 12:00, ветер 150°. Цепочка «область 400 → окно 100 → окно 50 м» и&#10;отдельно область 200 м. Случаи: штиль и 3 м/с, с нагревом и без; heat_mode cbl и surface. Критерий: mom 2e-5,&#10;θ′ 5e-7, div 1e-6, не больше 3000 итераций. Эталон — &lt;code&gt;air.py&lt;/code&gt;, float32, CuPy, RTX 4070 SUPER. GPU делили с&#10;тестами и чужим процессом, поэтому время шумное, а итерации детерминированы.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a2pre/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a2pre/</guid><description>&lt;h1 id="разведка-перед-а2-сходимость-и-цена-решателя-при-параметрах-перекалибровки"&gt;Разведка перед А2: сходимость и цена решателя при параметрах перекалибровки&lt;a class="anchor" href="#%d1%80%d0%b0%d0%b7%d0%b2%d0%b5%d0%b4%d0%ba%d0%b0-%d0%bf%d0%b5%d1%80%d0%b5%d0%b4-%d0%b02-%d1%81%d1%85%d0%be%d0%b4%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c-%d0%b8-%d1%86%d0%b5%d0%bd%d0%b0-%d1%80%d0%b5%d1%88%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-%d0%bf%d1%80%d0%b8-%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80%d0%b0%d1%85-%d0%bf%d0%b5%d1%80%d0%b5%d0%ba%d0%b0%d0%bb%d0%b8%d0%b1%d1%80%d0%be%d0%b2%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;30.09.2026. Ветка &lt;code&gt;air/a2-pre&lt;/code&gt; от &lt;code&gt;feature/air-model&lt;/code&gt; (4828b63: А1 влит — Pr_t = 0,85, θ′_d, h при const).&#10;Код и данные — &lt;code&gt;tools/research/a2pre/&lt;/code&gt; (README — команды воспроизведения). Решатель &lt;code&gt;air.py&lt;/code&gt; не правился:&#10;меняются только &lt;code&gt;A.Params&lt;/code&gt;. Все таблицы делает один скрипт (&lt;code&gt;analyze.py&lt;/code&gt; → &lt;code&gt;out/tables.md&lt;/code&gt;).&#10;По решению пользователя сделана только матрица. Повторный анализ несошедшихся точек Морриса (139 из 205)&#10;перенесён в волну Б: его делаем после совместной калибровки Askervein + Perdigão, если её итог окажется&#10;неудовлетворительным.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a3/</guid><description>&lt;h1 id="а3-переключатели-схемы-среднего-поля--выбор-по-физике"&gt;А3: переключатели схемы среднего поля — выбор по физике&lt;a class="anchor" href="#%d0%b03-%d0%bf%d0%b5%d1%80%d0%b5%d0%ba%d0%bb%d1%8e%d1%87%d0%b0%d1%82%d0%b5%d0%bb%d0%b8-%d1%81%d1%85%d0%b5%d0%bc%d1%8b-%d1%81%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b3%d0%be-%d0%bf%d0%be%d0%bb%d1%8f--%d0%b2%d1%8b%d0%b1%d0%be%d1%80-%d0%bf%d0%be-%d1%84%d0%b8%d0%b7%d0%b8%d0%ba%d0%b5" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;01.10.2026. Ветка &lt;code&gt;air/a3&lt;/code&gt; от &lt;code&gt;feature/air-model&lt;/code&gt; (0788cf7). Литература и чтение кода; &lt;strong&gt;код не менялся, прогонов не было&lt;/strong&gt;. Все числа — из файлов проекта (путь рядом) или из статей (ссылка). Где число — моя арифметика по формулам кода, это помечено «оценка».&lt;/p&gt;&#10;&lt;p&gt;Оговорка по источникам: полные тексты большинства статей закрыты, я проверял выходные данные и DOI, а суть — по аннотациям и описаниям схем. Коэффициенты из статей, которые я привожу по памяти и не сверял с текстом, помечены «(по памяти)».&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a4/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-a4/</guid><description>&lt;h1 id="а4-случай-perdigão--постановка-для-совместной-калибровки-c10-v1"&gt;А4 «Случай Perdigão» — постановка для совместной калибровки (C10 v1)&lt;a class="anchor" href="#%d0%b04-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9-perdig%c3%a3o--%d0%bf%d0%be%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%ba%d0%b0-%d0%b4%d0%bb%d1%8f-%d1%81%d0%be%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%bd%d0%be%d0%b9-%d0%ba%d0%b0%d0%bb%d0%b8%d0%b1%d1%80%d0%be%d0%b2%d0%ba%d0%b8-c10-v1" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Исполнитель А4, ветка &lt;code&gt;air/a4&lt;/code&gt;. Код — &lt;code&gt;tools/research/cases/perdigao.py&lt;/code&gt;, скрипты и данные —&#10;&lt;code&gt;tools/research/cases/perdigao/&lt;/code&gt; (README с командами воспроизведения). Решатель не менялся&#10;(&lt;code&gt;git diff feature/air-model -- tools/research/air3d scripts&lt;/code&gt; пуст).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Статус: случай собран, оба подслучая считаются (&lt;code&gt;ok&lt;/code&gt;, 141–231 итераций, 10–26 с на решателе при dx 30 м), контрактный&#10;тест C10 — 0 нарушений. Пробный прогон — только проверка постановки, не калибровка.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="1-постановка"&gt;1. Постановка&lt;a class="anchor" href="#1-%d0%bf%d0%be%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%ba%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Что&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Значение&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Почему&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Область&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6 × 6 км, центр долины (PT-TM06 E 33900, N 4800 → 39,7108° с. ш., 7,7378° з. д.), оси: x — восток, y — север&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;гряды ~1,4 км между гребнями и ~6 км длиной вдоль оси СЗ–ЮВ; области ≫ зоны (≈ 0,7 км); от гребней до границ притока ≥ 2 км; мачты в пределах ±1,3 км&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Шаг&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dx = 30 м (номинал), dz = dx/2 = 15 м; потолок 1300 м над нулём сетки (BASE = 100 м над морем, минимум DSM 105 м)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;30 м — разрешение Copernicus GLO-30; половина ширины гряды на половине высоты A ≈ 400–600 м → 13–20 клеток; 200 × 200 × 88 клеток (Askervein: 160 × 160 × ≈80)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Губки&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;боковая 1000 м (как Askervein), верхняя 700 м (начало на 600 м над нулём = ≥ 200 м выше гребней: у Askervein верхняя губка 1000 м при потолке 1000 м, здесь потолок 1300 м и гряды 400 м)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;air.Params.sponge_*&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Вход&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;нейтраль γ = 0, без нагрева, &lt;code&gt;f_cor&lt;/code&gt; = 9,32·10⁻⁵ 1/с (39,7°), &lt;code&gt;max_profile&lt;/code&gt; 2,5 (степенной профиль U/U10 до 494 м над поверхностью при α = 0,235; у Askervein 2,0 при холме 126 м)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;физика случаев: Ri = −0,10…+0,08, z/L = −0,14…+0,05 (README данных); остальное &lt;code&gt;Params()&lt;/code&gt; (Pr_t 0,85, &lt;code&gt;local_k&lt;/code&gt;, &lt;code&gt;closure = hb&lt;/code&gt;, &lt;code&gt;adv2 = False&lt;/code&gt;) + перекалибровка Askervein (λ/h 0,031, α 0,235)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;NE&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;27.04.2017 17–19 UTC, ветер с 60,7° (tse13 100 м, среднее окна), U100 = 8,79 м/с; наветренная мачта tse13 (гребень NE-гряды, 453 м)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cases/ne_20170427_windowmean.csv&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SW&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11.05.2017 10–11 UTC, ветер с 216,5° (tse04 100 м), U100 = 8,82 м/с; наветренная мачта tse04 (гребень SW-гряды, 473 м)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cases/sw_20170511_windowmean.csv&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Опорная скорость&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;U10 фона (&lt;code&gt;U10_IN&lt;/code&gt;: NE 3,15, SW 3,03 м/с) подобран один раз, чтобы S_ref модели на наветренной мачте на номинале = U100 данных (8,78 против 8,79 / 8,82 м/с); затем &lt;strong&gt;фиксирован&lt;/strong&gt; — разгон на гребне ≈ 2,8 от U10 (3D-гряда), S/S_ref от подгонки скорости не зависит&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;фон задан степенным профилем от поверхности, а не на гребне&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="рельеф-и-сверка-с-мачтами"&gt;Рельеф и сверка с мачтами&lt;a class="anchor" href="#%d1%80%d0%b5%d0%bb%d1%8c%d0%b5%d1%84-%d0%b8-%d1%81%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d1%81-%d0%bc%d0%b0%d1%87%d1%82%d0%b0%d0%bc%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Конвейер игры: &lt;code&gt;tools/terrain/fetch_dem.py::build_layer&lt;/code&gt; (→ &lt;code&gt;sample_copernicus&lt;/code&gt;, кеш &lt;code&gt;~/.cache/deltaplan_terrain&lt;/code&gt;) с шагом&#10;10 м и гауссовым сглаживанием 20 м (σ 2 клетки; у игры — 0,8 клетки 25 м, убирает ступеньки леса в DSM), дальше блочное среднее&#10;до dx (как &lt;code&gt;askervein.terrain&lt;/code&gt;). Локация игры не заводилась, &lt;code&gt;tools/terrain/&lt;/code&gt; не правился. Мачты — E/N PT-TM06 из&#10;&lt;code&gt;towers_layout.csv&lt;/code&gt; → WGS84 (pyproj; проверено по широте/долготе NetCDF до 3-го знака) → кадр игры.&#10;&lt;strong&gt;Таблица по 59 мачтам — &lt;code&gt;cases/perdigao/out/terrain_check.md&lt;/code&gt;&lt;/strong&gt; (DSM − высота мачты): среднее −0,6 м, медиана +0,1 м, σ 2,9 м,&#10;10–90 %: −4,5…+1,9 м. Гребни занижены на 3–10 м (rsw07/08 −7/−10 м: 30 м разрешение + сглаживание, срезает вершину), дно&#10;долины и склоны — в пределах ±2 м. Следствие для калибровки: высота гряды в модели на 2–5 % ниже реальной (H модели 150–170 м&#10;по разрезам против 174 м у Menke, табл. 2).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-b1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-b1/</guid><description>&lt;h1 id="б1-совместная-калибровка-askervein--perdigão--записка"&gt;Б1 «Совместная калибровка Askervein + Perdigão» — записка&lt;a class="anchor" href="#%d0%b11-%d1%81%d0%be%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%bd%d0%b0%d1%8f-%d0%ba%d0%b0%d0%bb%d0%b8%d0%b1%d1%80%d0%be%d0%b2%d0%ba%d0%b0-askervein--perdig%c3%a3o--%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%ba%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Волна Б модели воздуха, исполнитель Б1, ветка &lt;code&gt;air/b1&lt;/code&gt;. Контракт — C10 v3 (&lt;code&gt;docs/contracts/air-model.md&lt;/code&gt;): общая схема&#10;&lt;code&gt;tools/research/cases/scheme.py&lt;/code&gt;, общие правила постановки &lt;code&gt;tools/research/cases/rules.py&lt;/code&gt;. Код, данные, команды —&#10;&lt;code&gt;tools/research/cases/b1/README.md&lt;/code&gt;. Решатель (&lt;code&gt;air.py&lt;/code&gt;, &lt;code&gt;solver.py&lt;/code&gt;), код игры и конфиги не менялись.&lt;/p&gt;&#10;&lt;h2 id="коротко"&gt;Коротко&lt;a class="anchor" href="#%d0%ba%d0%be%d1%80%d0%be%d1%82%d0%ba%d0%be" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Общая длина перемешивания λ = 27 м (+4 −3)&lt;/strong&gt; по обоим случаям вместе. χ²/ndf = 208/76: Askervein 165 на 47 наблюдаемых,&#10;Perdigão 43 на 35. Свои параметры случаев: α_A = 0,242 ± 0,004, z0_A = 0,05 м (+0,05 −0,03); α_NE = 0,33 (край сетки),&#10;α_SW = 0,29 ± 0,03, z0_P = 1,0 м (край сетки).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Случаи тянут λ в разные стороны.&lt;/strong&gt; Askervein сам по себе даёт λ = 145 м (+150 −50), χ² 136/44. Perdigão сам по себе&#10;упирается в нижний край λ = 10 м, χ² 29/31. Плата за общий параметр — Δχ² = 44. Так получается и на 2-м порядке, и&#10;после поправки сетки. Это &lt;strong&gt;структурное расхождение модели&lt;/strong&gt;, параметр λ его не снимает (подробнее — §4).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;λ/h и lam по этим случаям не разделяются.&lt;/strong&gt; В нейтрали без нагрева λ = max(lam, λ/h·h), а h у обоих случаев&#10;≈ 1600–1800 м. Перевод «λ = λ/h·h_случая» даёт λ/h = 0,018 ± 0,0035 и χ² на 7,5 меньше. Но это выигрыш за счёт z0&#10;(z0 через u* меняет h случая), а не данные о λ/h. Для разделения нужны случаи с другим h: слабый ветер, конвекция.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Систематика схемы игры&lt;/strong&gt; (1-й порядок против 2-го в лучшей точке, в параметры не входит): χ² 209 → 282.&#10;Askervein: разгоны ниже на 0,05–0,13 (−1…−2σ по группам). Perdigão: ≤ 0,09 (≤ 0,65σ).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Регрессия матрицы А2.&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Перевод (а) lam = 27 м, lam_frac = 0: в штиль с нагревом окно 100 м &lt;strong&gt;не сходится&lt;/strong&gt; (3001 итерация, max), cbl 7/8.&lt;/li&gt;&#10;&lt;li&gt;Перевод (б) lam = 40, lam_frac = 0,0158: все cbl 8/8. Цена в цепочке игры (400 → 100 → 50 м, штиль с нагревом)&#10;+14 % итераций против new (493 против 433). На области 200 м в штиль с нагревом — 1101 итерация против 261.&lt;/li&gt;&#10;&lt;li&gt;Оговорка к (б): в нейтральных случаях калибровки он даёт λ = 40 м, потому что пол lam выигрывает (0,0158·1700 = 27).&#10;Это Δχ² = +5,7 от совместного минимума: Askervein лучше, Perdigão хуже.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="1-сопоставимость-этап-1-принято-к2--c10-v3"&gt;1. Сопоставимость (этап 1, принято К2 → C10 v3)&lt;a class="anchor" href="#1-%d1%81%d0%be%d0%bf%d0%be%d1%81%d1%82%d0%b0%d0%b2%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c-%d1%8d%d1%82%d0%b0%d0%bf-1-%d0%bf%d1%80%d0%b8%d0%bd%d1%8f%d1%82%d0%be-%d0%ba2--c10-v3" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Настройка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Askervein&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Perdigão&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Правило&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Схема&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;scheme.py&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;scheme.py&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;одна&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;H (перепад рельефа в области наблюдений)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;119,9 м (HT над RS)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;173,6 м (гребень − дно, Menke 2019 табл. 2)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;одно определение&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dx, H/dx&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;20 м, 6,0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;30 м, 5,8&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dx = H/5,8 к шагу данных; dz = dx/2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Область, губка боковая&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;200 клеток (4 км), 35 клеток (700 м)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;200 клеток (6 км), 35 клеток (1050 м)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;N_DOM 200, 35 клеток&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Потолок, губка верхняя&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;высшая точка + 7,5 H; губка от высшей точки&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;то же&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;одно правило&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Профиль притока&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;z_sat = 0,3·h = 450 м&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;427–444 м&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;z_sat = 0,3·(0,3u*/f), max_profile = (z_sat/10)^α&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Опорная скорость&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;U10 8,8: модель на RS 10 м = данные 8,895&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;U10 3,27 / 3,12: модель на гребне 100 м = U100&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;модель на опорной точке = данные у номинала&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Лес&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;d = 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;DSM + 12,6 м · доля леса; z0 скаляр&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;один способ&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Наблюдаемые&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ΔS к RS на той же высоте; профиль RS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;u_∥/S_ref на мачтах; зона Menke&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;нижняя граница 1·dz; σ ⊕ 0,03&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Устойчивость&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;нейтраль&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;модель нейтральна, Δ_уст → σ&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;Данные притока для z_sat&lt;/strong&gt; (&lt;code&gt;b1/out/fig_inflow.png&lt;/code&gt;). Askervein: змей до 267 м насыщения не показывает (местный показатель&#10;0,21). Perdigão: по RHI-лидарам рост ветра прекращается на ≈ 400 м (NE) и ≈ 580 м (SW) над равниной притока.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-b2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-b2/</guid><description>&lt;h1 id="б2-α-и-λ-в-игре-профиль-притока-по-устойчивости-пересчёт-эталонов-и-цена--записка"&gt;Б2 «α и λ в игре: профиль притока по устойчивости, пересчёт эталонов и цена» — записка&lt;a class="anchor" href="#%d0%b12-%ce%b1-%d0%b8-%ce%bb-%d0%b2-%d0%b8%d0%b3%d1%80%d0%b5-%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d1%8c-%d0%bf%d1%80%d0%b8%d1%82%d0%be%d0%ba%d0%b0-%d0%bf%d0%be-%d1%83%d1%81%d1%82%d0%be%d0%b9%d1%87%d0%b8%d0%b2%d0%be%d1%81%d1%82%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d1%81%d1%87%d1%91%d1%82-%d1%8d%d1%82%d0%b0%d0%bb%d0%be%d0%bd%d0%be%d0%b2-%d0%b8-%d1%86%d0%b5%d0%bd%d0%b0--%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%ba%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Волна Б модели воздуха, исполнитель Б2, ветка &lt;code&gt;air/b2&lt;/code&gt; (feature/air-model 00ae28a + air/b1). Контракт — C2 v4&#10;(&lt;code&gt;docs/contracts/air-model.md&lt;/code&gt;). Код, данные, команды — &lt;code&gt;tools/research/b2/README.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="коротко"&gt;Коротко&lt;a class="anchor" href="#%d0%ba%d0%be%d1%80%d0%be%d1%82%d0%ba%d0%be" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Одна функция профиля&lt;/strong&gt; &lt;code&gt;WindProfile&lt;/code&gt; (&lt;code&gt;scripts/atmosphere/wind_profile.gd&lt;/code&gt;, static) для решателя (&lt;code&gt;AirPlace.domain_case&lt;/code&gt;,&#10;&lt;code&gt;AirWindowCase&lt;/code&gt; → &lt;code&gt;AirCase.p.alpha&lt;/code&gt;, &lt;code&gt;p.max_profile&lt;/code&gt;) и аналитического ветра (&lt;code&gt;WindModel&lt;/code&gt; через &lt;code&gt;Atmosphere&lt;/code&gt;).&#10;Эталон — &lt;code&gt;tools/research/air3d/wind_prof.py&lt;/code&gt; (те же таблицы), его вызывает &lt;code&gt;real.case&lt;/code&gt; → &lt;code&gt;real.make&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;α по устойчивости:&lt;/strong&gt; α = 0,24 · r(класс Паскуилла–Тёрнера), r — Irwin 1979 к D. &lt;strong&gt;max_profile = (z_sat/10)^α&lt;/strong&gt;,&#10;z_sat = 0,3 · 0,3 u*/f (правило &lt;code&gt;rules.py&lt;/code&gt;, C10 v3). &lt;strong&gt;λ:&lt;/strong&gt; &lt;code&gt;lam&lt;/code&gt; 40 м, &lt;code&gt;lam_frac&lt;/code&gt; 0,0158.&lt;/li&gt;&#10;&lt;li&gt;Конфиг: &lt;code&gt;wind.shear_exponent_neutral&lt;/code&gt; 0,24 и &lt;code&gt;wind.z_sat_frac&lt;/code&gt; 0,3; &lt;code&gt;shear_exponent&lt;/code&gt; и &lt;code&gt;max_profile_factor&lt;/code&gt; удалены.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Эталон и игра для Онгудая 12:00 дают одно α/max_profile&lt;/strong&gt; (&lt;code&gt;test_air_place&lt;/code&gt;): 0 м/с — A, 0,112 / 1,149112; 3 м/с —&#10;B, 0,112 / 1,404479; 6 м/с — D, 0,240 / 2,445407 (игра и эталон совпадают до 1e-9).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Днём профиль мягче прежнего, в нейтраль — круче.&lt;/strong&gt; Полдень, ясно, 3 м/с: на 300 м 4,2 м/с вместо 4,8; облачно или&#10;20:00 — 6,2; 6 м/с в любой час — 13,6 вместо 9,7.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Устойчивые классы E/F&lt;/strong&gt; (вечер после ≈ 20:25) с нейтральным z_sat давали на 300 м до 14 × U10 (C2 v4). По решению&#10;К2 (C2 v5, § 4) z_sat для E, F — по толщине устойчивого слоя 0,4 √(u*L/f), L по Golder 1972: при 3 м/с на 300 м&#10;2,14 × (E) и 1,97 × (F) U10.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Цена:&lt;/strong&gt; штиль с нагревом на 200 м — 1101 итерация эталона вместо 251 (×4,4, как ждали по Б1); прочее — § 5.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="1-функция-профиля"&gt;1. Функция профиля&lt;a class="anchor" href="#1-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d1%8f-%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;WindProfile.alpha(u10, sun_elev_deg, cover) -&amp;gt; float&#10;WindProfile.max_profile(alpha, u10, z0, f_cor) -&amp;gt; float # (z_sat/10)^α&#10;WindProfile.z_sat(u10, z0, f_cor) -&amp;gt; float # z_sat_frac · 0,3 · κ·max(u10, 0,5)/ln(10/z0) / f&#10;WindProfile.stability_class(u10, sun_elev_deg, cover) -&amp;gt; int # 0..5 = A..F&#10;WindProfile.net_radiation_index(sun_elev_deg, cover) -&amp;gt; int # −2..4&#10;WindProfile.sun_elevation(ctx, hour) -&amp;gt; float # SunClock.solar_position, без запаздывания прогрева&#10;WindProfile.apply_to_case(c: AirCase, ctx, hour, cover) # c.p.alpha, c.p.max_profile по ветру случая&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Класс устойчивости — таблица Тёрнера&lt;/strong&gt; (Turner 1964; таблица и правила индекса радиации — EPA-454/R-99-005,&#10;табл. 6-4, 6-5; Pasquill 1961). Строки — ветер на 10 м в узлах, столбцы — индекс радиации NRI; 1 = A … 7 = G (G → F):&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-baseline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-baseline/</guid><description>&lt;h1 id="am-00-база-для-сравнения-масштабов-13-модель-воздуха"&gt;AM-00: база для сравнения масштабов 1–3 (модель воздуха)&lt;a class="anchor" href="#am-00-%d0%b1%d0%b0%d0%b7%d0%b0-%d0%b4%d0%bb%d1%8f-%d1%81%d1%80%d0%b0%d0%b2%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b0%d1%81%d1%88%d1%82%d0%b0%d0%b1%d0%be%d0%b2-13-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d1%8c-%d0%b2%d0%be%d0%b7%d0%b4%d1%83%d1%85%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Задача AM-00 (&lt;code&gt;docs/plan/air_model.md&lt;/code&gt; → «Задачи → M0»), снято 29.09.2026 в worktree&#10;&lt;code&gt;~/deltaplan-wf&lt;/code&gt;, ветка &lt;code&gt;feature/air-model&lt;/code&gt;, коммит на момент снятия — см. «Коммиты» в отчёте&#10;координатору. Числа ниже — точка отсчёта для сравнения масштабов 2 и 3 в AM-07/AM-08 (±10–20 % из&#10;плана) и для смежных задач (AM-01…AM-06). Инструмент, которым сняты числа §2–3 (переиспользуется):&#10;&lt;code&gt;tools/research/air_model_baseline/probe.gd&lt;/code&gt; + &lt;code&gt;.tscn&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="1-headless-прогон-toolschecksh--restestsrun_teststscn"&gt;1. Headless-прогон (&lt;code&gt;tools/check.sh&lt;/code&gt; / &lt;code&gt;res://tests/run_tests.tscn&lt;/code&gt;)&lt;a class="anchor" href="#1-headless-%d0%bf%d1%80%d0%be%d0%b3%d0%be%d0%bd-toolschecksh--restestsrun_teststscn" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Команда:&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-model-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-model-progress/</guid><description>&lt;h1 id="журнал-хода-работ-модель-воздуха-featureair-model"&gt;Журнал хода работ: модель воздуха (feature/air-model)&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d1%85%d0%be%d0%b4%d0%b0-%d1%80%d0%b0%d0%b1%d0%be%d1%82-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d1%8c-%d0%b2%d0%be%d0%b7%d0%b4%d1%83%d1%85%d0%b0-featureair-model" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;Каталог экспериментальных и эталонных данных: &lt;code&gt;docs/research/experimental_data.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;Координатор К0. План — &lt;code&gt;docs/plan/air_model.md&lt;/code&gt;. Коротко: задача → статус, исполнитель, коммиты, ключевые числа, решения.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Задача&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Статус&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Исполнитель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Коммиты&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Числа / решения&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-00 База&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;a287b0c&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;headless 609 тестов; GPU-прогон &lt;code&gt;tools/gpu_tests.sh&lt;/code&gt; (TestCase.needs_gpu, флаг &amp;ndash;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&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-01 3D-эталон CuPy&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (+ AM-01а: Askervein)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;a20d349, 8f04f5a, 936c7f9, fe27a5d, cf64b7b, 6cdc3a3, cd89fbf; AM-01а c3736f2 (слито)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;маска 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 %&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-02 Блоки на GPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;e4f4632, b455f1f, b11924c&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;все блоки ≤ 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&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-03 Пикар на GPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;977a5a3, ae82c41, 78a3444, 4e958cd, 102b903, 7ab6d49, 2d3d3b6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;эталоны ref/: итерации совпадают, max&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-04 Клипмапы&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита (ветка удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5618a59, 85e27a7, aea38fa, 3d01896, efd5d58, 4e71747&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;окна 100/50 м (64×64) от области 400 м, &lt;code&gt;AirClipmap&lt;/code&gt;, &lt;code&gt;AirWindowJob&lt;/code&gt;, C7 v1, C9 v2 (set_focus); против эталона: итерации 40–50 (эталон 41–51), поле ≤ 3e-4·&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-05 WindField, атмосфера&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;b3c50ab, ac43926, 3951641&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;WindField&lt;/code&gt;/&lt;code&gt;AirFieldSet&lt;/code&gt; (центры клеток, лог-профиль у земли, край smoothstep 5 клеток, подмена &lt;code&gt;set_field(…, blend_s=60)&lt;/code&gt;); стык: горизонталь+w_mech, w_conv пилоту не отдаётся; air_velocity_at 20,4 мкс (×1,4 к базе); &lt;code&gt;--air-field=&lt;/code&gt;; тесты 9+5 зелёные; открыто: двойной счёт опускания за гребнем (AM-08), from_arrays 0,18 с — строить в потоке&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-06 Загрузка, часы старта&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (А и Б), Б слита (ветка удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Sonnet (А), Opus (Б)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А: 7557c04, 5157018, b7da8d7; Б: 551e79b, 84ab346, d09139b, d7bc196, 1c57fae&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А: 4 часа старта. Б: &lt;code&gt;AirRuntime&lt;/code&gt; (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/ — &lt;code&gt;model: prototype&lt;/code&gt;), Р3 (&lt;code&gt;WindField.FORMAT_VERSION = 1&lt;/code&gt;) закрыты; скриншоты build/screenshots/08–09. &lt;strong&gt;Открыто: Р12&lt;/strong&gt; — AirThermals.build на главном потоке 0,75 с стоп-кадр на каждое новое поле; &lt;strong&gt;Р13&lt;/strong&gt; — тёплый старт греет только решение без нагрева; &lt;strong&gt;Р14&lt;/strong&gt; — AirPlace берёт опорную дату погоды, не дату полёта; &lt;strong&gt;Р15&lt;/strong&gt; — публичные AirGpu.release_buffers(), AirPicardJob.mech_case/is_prepared (AirRuntime сейчас лезет в приватные поля)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-06б Библиотека полей&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;снята&lt;/strong&gt; (решение пользователя, шлюз AM-01)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-07 Термики из поля&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята с доработкой AM-07б (плотность/радиус ядер)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;a8ca103, da16964, b0330b5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;источники по Φ = F̄ + W̄⁺ на уровне области; сила ≈ k·w*; потолок по частице (инверсия 2000 м → 2061 м); поток массы 0,98 от поля; сеть — ведущий шлёт маску столбцов (ZoneState.thermal_sources, 1,5 КБ, 1 Гц), разошлось 0 из 8463 столбцов области при шуме 1e-3; &lt;strong&gt;поле: сосед 252 м, сила 4,1 м/с, ×8 термиков против аналитики (651 м, 2,35)&lt;/strong&gt; — ядра 90–170 м несут весь поток; atmosphere.gd +1 строка (принята задним числом)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-08 Возмущения&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита (ветка удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4534b76, 52a7401, 9db1b85, 4ab1bd5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;см. хронологию: C4 v3, σ по u*/w*/Ri, спектр фон Кармана (−1,6…−1,7), двойной счёт за гребнем снят; подветренная против базы: σ_w +18…+90 %, рывки −14…−70 % — на полёт пилота; air_velocity_at 53 мкс&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-07б Термики: ядра и широкий подъём по Аллену&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита (ветка удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;585057a, 48451dd, 68a5faf&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;радиус 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 % Φ днём; &lt;strong&gt;вопрос к AM-09: плотность по Аллену (все ядра) против «шаг сильных 1–1,5 z_i» (ячейки) — разница ×5, определить наблюдаемую одинаково (порог «сильного» термика)&lt;/strong&gt;; 9:00 на уровне 400 м — ≤ 1 источник на столбец&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-09 Калибровка&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;f584fb2, ed94333&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;подогнан λ/h (&lt;code&gt;lam_frac&lt;/code&gt;) 0,1 → &lt;strong&gt;0,25 (−0,015), упёрся в верхнюю физичную границу&lt;/strong&gt; (данные тянут выше); 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&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-10 Срезы, F3, трава&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;629be2c…bf5b8f4 (a360c86, bf5b8f4 — доделка)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;трава+вода +0,10 мс GPU («Высокий», 1080p); F3 — стрелки 1 км / шаг 200 м / 20-100-300 м AGL, выключенный — ноль; срезы &lt;code&gt;tools/wind_field/dump_slices.gd&lt;/code&gt; + &lt;code&gt;annotate_slice.py&lt;/code&gt;; скриншоты build/screenshots/03–07; кадр воды 07 (Аушкуль) снят с высоты — различие ряби по полю на нём почти не видно (2 попытки, взят лучший — правило)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-09б Хвосты калибровки (К1, волна 1 п. 1.2)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита (ветка и копия удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher (Opus → доводка Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;019a45c, bd408bb, a2e3f00, acffd0f; слияние 468de96&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;(а) масштаб 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&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;check.sh (К1, волна 1 п. 2.1а)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита (ветка удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;f11d573, слияние 215c653&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;один временный XDG_DATA_HOME на запуск (trap — удалить и вернуть project.godot, если был чистым); &lt;code&gt;[--no-build] [--filter=…]&lt;/code&gt; в любом порядке, с фильтром — без линтера и сборки; неизвестный аргумент — код 2. Проверено К1: &lt;code&gt;--filter=test_world_key&lt;/code&gt; 4/0 код 0, &lt;code&gt;--bad&lt;/code&gt; код 2, настоящий профиль не менялся, project.godot чистый&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А1.1 План структурных правок (Pr_t, τ по диабатической θ′, h при closure=const)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита (копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher (Fable)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;83c740c, слияние 25844df&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;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 итераций&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А1.2 Правки air.py + GPU-решатель по плану А1.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита b0a83e2 (копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air/a1: 026cb71, 423481e, fb70494, 29392c5, 673b313, f7f4451, 5aceaa3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;по отчёту: седловина Δ 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 % (оценка); &lt;strong&gt;picard/ 200 м 3 м/с с нагревом — max 3000 итераций (было 131)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А1.3 Ревью и приёмка А1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита fc1eaba (копия и ветка удалены); вердикт «принять» с 3 мелкими оговорками&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher (Fable)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air/a1-review: edbd83d, 0f165cf (tools/research/a1/review/)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;(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 — сходятся) → &lt;strong&gt;А2&lt;/strong&gt;; exit 139 bench — утечка release() в тесте, не игра&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А1.2б Мелкие правки по ревью (release в bench, bench без 200 м с нагревом до А2, thd в контрактном тесте, рецепт (4), цена в air_model_gpu.md)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита d38e858 (копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;28e4384&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;контракты 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&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А2-разв. Разведка перед А2 (матрица сходимости old/new)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, слита вместе с А2 (1430d79; копия ~/deltaplan-wf-a2pre и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air/a2-pre: eab5c47&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;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&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А2 Сходимость в штиль (новые параметры)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята К2, &lt;strong&gt;слита 1430d79&lt;/strong&gt; (копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air/a2: e8ba248, 73853cb&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;k_relax 0,5 → 0,1&lt;/strong&gt; (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 м — не помогает (гипотеза разведки отвергнута); &lt;strong&gt;0,1 — 0/0, 892/922, цена 11,5/12,0 с&lt;/strong&gt;; 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 — точный, θ′&lt;em&gt;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&lt;/em&gt; 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 итераций, как было&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А3 Переключатели схемы по физике (hb/const, local_k, heat_mode)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята К2, &lt;strong&gt;слита 5ec1752&lt;/strong&gt; (копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air/a3: 6636934, b569ec5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;docs/archive/plan/air-model-a3.md: closure &lt;strong&gt;hb&lt;/strong&gt; (высокая; Troen–Mahrt 1986, HB93), local_k &lt;strong&gt;вкл&lt;/strong&gt; (средняя–высокая; Blackadar 1962, YSU), heat_mode &lt;strong&gt;cbl&lt;/strong&gt; (высокая для развитого слоя, средняя на крутых склонах; 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) &amp;gt; 1 внутри слоя — возможный двойной счёт с K_b (кандидат F ≤ 1 при Ri ≤ 0, не считано); длинный хвост устойчивой ветви (GABLS1). Вопрос пользователю — heat_mode на крутом склоне (§6: 1 — как сейчас, рекомендовано; 3 — гибрид, только если полёты покажут заниженный подъём)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;А4 Случай Perdigão (обёртка C10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята К2, &lt;strong&gt;слита e462ea3&lt;/strong&gt; (копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air/a4: b014475&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;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, &lt;strong&gt;adv2 = выкл&lt;/strong&gt;): все 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 с на точку (оба подслучая)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Б1 Совместная калибровка Askervein + Perdigão&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, &lt;strong&gt;слита be8aa7f&lt;/strong&gt; (вместе с Б2; копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air/b1: ebca59f, 8e31dee, 3b2c09a, b31ccf8, 60b0574&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;λ общее &lt;strong&gt;27,1 м (+3,9 −3,2)&lt;/strong&gt;, χ²/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 → &lt;strong&gt;структурное напряжение&lt;/strong&gt;: за двумя грядами отрыв занижен (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), &lt;strong&gt;(б) lam 40, lam_frac 0,0158 — 8/8&lt;/strong&gt;, цепочка игры штиль 6,4 с против 5,8 (+14 %), область 200 м штиль 1101 итер. против 261; 765 прогонов, 3,9 ч GPU, check_c10 0 нарушений (перепроверено К2)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Б2 α и λ в игре (профиль по устойчивости, C2 v5)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, &lt;strong&gt;слита be8aa7f&lt;/strong&gt; (копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;air/b2: e674c49, ce3aa88, de3dcde, 02e9684&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;WindProfile&lt;/code&gt; (игра) = &lt;code&gt;wind_prof.py&lt;/code&gt; (эталон): α = 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 (с &amp;ndash;disable-vsync), headless air_place, weather_day, lee_rotor, wave, wind_field, atmo, determinism — зелёные&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-08в Рывки и ротор поверх поля по физике (C4 v4)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята, &lt;strong&gt;слита 774bbb2&lt;/strong&gt; (копия и ветка удалены)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;041d8ed (контракт К2), 0d1ecf2, 451b21d, 220c740&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Онгудай 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 %; аналитика побитно прежняя&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-11 Производительность, сеть&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;не начата&lt;/strong&gt; (лимит; следующая сессия)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AM-12 Пилот, слияние&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;не начата&lt;/strong&gt; (после AM-11)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="контракты-систем-решение-пользователя-29092026"&gt;Контракты систем (решение пользователя, 29.09.2026)&lt;a class="anchor" href="#%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%b0%d0%ba%d1%82%d1%8b-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc-%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-29092026" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Интерфейсы на стыках задач — &lt;code&gt;docs/contracts/air-model.md&lt;/code&gt; (C1 эталон→GPU, C2 вход места, C3 решатель→WindField, C4 WindField→атмосфера/термики/возмущения/трава-вода-F3, C5 термики→сеть, C6 библиотека полей, C7 клипмапы, C8 пересчёт/подмена) + контрактные тесты &lt;code&gt;tests/contracts/&lt;/code&gt;. Правило: работать в рамках контракта; менять интерфейс — только через К0: правка контракта (версия +1, что изменилось), уведомление задач-потребителей, их правка в том же шаге или сразу после. Правило включается во все задания; текущим (AM-01, AM-03, AM-07, AM-10) разослано.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-nn-p3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-nn-p3/</guid><description>&lt;h1 id="пилот-п-3-физическая-кодировка-входа-и-выхода--план-для-координатора-air-nn"&gt;Пилот П-3: физическая кодировка входа и выхода — план для координатора air-nn&lt;a class="anchor" href="#%d0%bf%d0%b8%d0%bb%d0%be%d1%82-%d0%bf-3-%d1%84%d0%b8%d0%b7%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b0%d1%8f-%d0%ba%d0%be%d0%b4%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d0%b2%d1%85%d0%be%d0%b4%d0%b0-%d0%b8-%d0%b2%d1%8b%d1%85%d0%be%d0%b4%d0%b0--%d0%bf%d0%bb%d0%b0%d0%bd-%d0%b4%d0%bb%d1%8f-%d0%ba%d0%be%d0%be%d1%80%d0%b4%d0%b8%d0%bd%d0%b0%d1%82%d0%be%d1%80%d0%b0-air-nn" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Составлен главной сессией 03.10.2026 по итогам П-2 и обсуждения с пользователем. Общий план модуля — &lt;code&gt;docs/plan/air_nn.md&lt;/code&gt;&#10;(раздел 8.2, решения пользователя), контракты — &lt;code&gt;docs/contracts/air-nn.md&lt;/code&gt;. Код — &lt;code&gt;tools/research/air_nn_pilot/&lt;/code&gt;,&#10;данные — &lt;code&gt;$AIR_NN_DATA/pilot/&lt;/code&gt; (&lt;code&gt;~/air_nn_data/pilot&lt;/code&gt;).&lt;/p&gt;&#10;&lt;h2 id="0-итог-p3-04102026-решение-пользователя"&gt;0. Итог P3 (04.10.2026, решение пользователя)&lt;a class="anchor" href="#0-%d0%b8%d1%82%d0%be%d0%b3-p3-04102026-%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;P3 закрыт: ни кодировка, ни архитектура, ни стратификация, ни чистка целей не дали больше нескольких процентов; заменимость не достигнута ни одним вариантом. Отложенные горные системы, 60 м, сошедшиеся (584), ветер медиана / p90 м/с, ρ медиана / p90 (порог 0,5 / 1):&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-nn-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-nn-progress/</guid><description>&lt;h1 id="air-nn--журнал-хода-работ"&gt;air-nn — журнал хода работ&lt;a class="anchor" href="#air-nn--%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d1%85%d0%be%d0%b4%d0%b0-%d1%80%d0%b0%d0%b1%d0%be%d1%82" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;&lt;strong&gt;Журнал продолжается в &lt;code&gt;tools/dp&lt;/code&gt;: &lt;code&gt;docs/plan/air-nn/&lt;/code&gt; (&lt;code&gt;tools/dp status air-nn&lt;/code&gt;, &lt;code&gt;tools/dp log air-nn&lt;/code&gt;). Ниже — история до 02.10 23:00.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;План — &lt;code&gt;docs/plan/air_nn.md&lt;/code&gt;; контракты — &lt;code&gt;docs/contracts/air-nn.md&lt;/code&gt;. Ветка &lt;code&gt;feature/air-nn&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 9360397),&#10;копия &lt;code&gt;~/deltaplan-air-nn&lt;/code&gt;. Координатор — &lt;code&gt;dp-coordinator&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="текущая-цель-02102026-от-главной-сессии"&gt;Текущая цель (02.10.2026, от главной сессии)&lt;a class="anchor" href="#%d1%82%d0%b5%d0%ba%d1%83%d1%89%d0%b0%d1%8f-%d1%86%d0%b5%d0%bb%d1%8c-02102026-%d0%be%d1%82-%d0%b3%d0%bb%d0%b0%d0%b2%d0%bd%d0%be%d0%b9-%d1%81%d0%b5%d1%81%d1%81%d0%b8%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Подготовить этап П к запуску: окружение, данные, один скрипт &lt;code&gt;run_pilot.sh&lt;/code&gt; (досчёт → обучение → оценка → отчёт,&#10;с продолжением после прерывания), проверка мини-прогоном и прерываниями. Сам пилот запускает пользователь.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-onnx/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-onnx/</guid><description>&lt;h1 id="нейросеть-вместо-решателя-в-игре-air-onnx--план"&gt;Нейросеть вместо решателя в игре (air-onnx) — план&lt;a class="anchor" href="#%d0%bd%d0%b5%d0%b9%d1%80%d0%be%d1%81%d0%b5%d1%82%d1%8c-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%be-%d1%80%d0%b5%d1%88%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-%d0%b2-%d0%b8%d0%b3%d1%80%d0%b5-air-onnx--%d0%bf%d0%bb%d0%b0%d0%bd" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Ветка &lt;code&gt;feature/air-onnx&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-air-onnx&lt;/code&gt;, код задач &lt;code&gt;ON&lt;/code&gt;, журнал &lt;code&gt;docs/plan/air-onnx/&lt;/code&gt;.&#10;Контракты — &lt;code&gt;docs/contracts/air-onnx.md&lt;/code&gt; (O1–O6). Основа — план air-nn §3.2–3.4, §6 и задача NN-4.&lt;/p&gt;&#10;&lt;h2 id="решения-пользователя-не-обсуждаются"&gt;Решения пользователя (не обсуждаются)&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-%d0%bd%d0%b5-%d0%be%d0%b1%d1%81%d1%83%d0%b6%d0%b4%d0%b0%d1%8e%d1%82%d1%81%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Стратегически решатель в игре заменяется ONNX-сетью; решатель остаётся офлайн как источник данных. Скорость важнее&#10;точности: ошибка порядка 10–15 % ветра допустима. Вместо эмпирического запасного кода — страж области применимости&#10;входа (журнал air-nn, решение 03.10).&lt;/li&gt;&#10;&lt;li&gt;В настройках «Ветер над рельефом: расчёт / упрощённый» добавить третий вариант «нейросеть». Автоотключения нет.&lt;/li&gt;&#10;&lt;li&gt;Цель модуля — работающий сквозной путь, а не качество: после П-2 пользователь кладёт &lt;code&gt;.onnx&lt;/code&gt; в ветку, собирает игру и&#10;летает. Не шлифовать (мелкие визуальные детали — ≤ 2 попыток); совместимость со старыми форматами не нужна.&lt;/li&gt;&#10;&lt;li&gt;Готовность: игра в этой ветке грузит &lt;code&gt;.onnx&lt;/code&gt; из файла и строит поле сетью вместо решателя; переключение в настройках;&#10;Linux и Windows (macOS — по возможности, не блокер).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="решения-координатора"&gt;Решения координатора&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%be%d0%be%d1%80%d0%b4%d0%b8%d0%bd%d0%b0%d1%82%d0%be%d1%80%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Сеть первого пилота (&lt;code&gt;~/air_nn_data/pilot/runs/2026-10-02_pilot/main/model.onnx&lt;/code&gt;, П2 v2: maps [1, 4, 96, 96]) —&#10;совместима: её 4 карты — первые 4 карты П2 v4 с теми же формулами, числа FiLM, выход и &lt;code&gt;to_physical&lt;/code&gt; не менялись&#10;(сверено по коду bb63480). Игра принимает C = 4 и C = 9 → сквозная проверка на обученной сети до конца П-2.&lt;/li&gt;&#10;&lt;li&gt;Экспорт ONNX у пилота есть (&lt;code&gt;evaluate.py:export_onnx&lt;/code&gt;, имена &lt;code&gt;maps&lt;/code&gt;/&lt;code&gt;nums&lt;/code&gt;/&lt;code&gt;out&lt;/code&gt;, opset 17) — П-2 сам выдаст&#10;&lt;code&gt;main/model.onnx&lt;/code&gt;; скрипт экспорта этой ветки нужен для метаданных, малой тестовой сети и экспорта из чекпойнта.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;engine&lt;/code&gt; — отдельный ключ конфига (&lt;code&gt;solver&lt;/code&gt; по умолчанию); окна 100/50 м у сети нет — один уровень 400 м.&lt;/li&gt;&#10;&lt;li&gt;Сеть в git не кладём до П-2 (13 МБ на версию); тесты — малая случайная сеть (≤ 200 КБ), первый пилот — локально.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="границы-что-модуль-не-делает"&gt;Границы (что модуль не делает)&lt;a class="anchor" href="#%d0%b3%d1%80%d0%b0%d0%bd%d0%b8%d1%86%d1%8b-%d1%87%d1%82%d0%be-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8c-%d0%bd%d0%b5-%d0%b4%d0%b5%d0%bb%d0%b0%d0%b5%d1%82" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Качество сети, переобучение, окна 100/50 м, проекция на бездивергентное поле, удаление решателя — не здесь.&lt;/li&gt;&#10;&lt;li&gt;macOS-сборка, CI, подпись — по возможности. Запуск на Windows здесь проверить нечем (wine нет) — проверяет пользователь.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="задачи"&gt;Задачи&lt;a class="anchor" href="#%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Python — venv пилота только на чтение: &lt;code&gt;CUDA_VISIBLE_DEVICES= ~/deltaplan-air-nn/tools/research/air_nn_pilot/.venv/bin/python&lt;/code&gt;&#10;(ничего не ставить; GPU не трогать). Тяжёлые CPU-прогоны (сборка ORT/godot-cpp, пачки тестов) — &lt;code&gt;dp lock cpu&lt;/code&gt;.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-start-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-start-progress/</guid><description>&lt;h1 id="журнал-модуля-воздух-у-старта-air-start"&gt;Журнал модуля «воздух у старта» (air-start)&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8f-%d0%b2%d0%be%d0%b7%d0%b4%d1%83%d1%85-%d1%83-%d1%81%d1%82%d0%b0%d1%80%d1%82%d0%b0-air-start" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;План — &lt;code&gt;docs/archive/plan/air-start.md&lt;/code&gt;; контракты — &lt;code&gt;docs/contracts/air-model.md&lt;/code&gt; (C2 v6, C7 v3, C9 v3). Ветка&#10;&lt;code&gt;feature/air-start&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-air-start&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 938d1ea).&lt;/p&gt;&#10;&lt;h2 id="решения"&gt;Решения&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — модуль заведён по жалобе пилота на 1.0.0 (6 м/с: сдувает, нос гуляет, крыло само отрывается). Решение&#10;пользователя: проблема 1 — подстроить поле под старт (два прохода, класс и z_sat по меню, калибровку не трогать).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — поправка главной сессии: Taylor &amp;amp; Lee (сплющивание аналитики над гребнем) не делаем; аналитику, Б1/AM-09,&#10;&lt;code&gt;test_ridge_starts&lt;/code&gt; не трогаем; заметное расхождение аналитики и поля после AS-1 — шлюз с числами.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — контракты до исполнителей: C2 v6 (&lt;code&gt;inflow_k&lt;/code&gt;), C7 v3, C9 v3 (два прохода при загрузке); контрактный тест&#10;дополнен (&lt;code&gt;test_c2_inflow_scale&lt;/code&gt;, C7/C9) — до AS-1 падает намеренно (3 теста).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — проблема 2: бисект ведёт CF-1 (&lt;code&gt;~/deltaplan-control-fix-cf1&lt;/code&gt;, временные копии &lt;code&gt;~/deltaplan-cf1-bisect-*&lt;/code&gt;);&#10;не дублируем, AS-2 — после передачи результата и после AS-1 (масштаб притока сам уменьшит u* у старта).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — итог бисекта CF-1 (через главную сессию; control-fix/cf1 d3f01bb, &lt;code&gt;docs/archive/plan/cf1_start/README.md&lt;/code&gt; → «Бисект поля&#10;GPU»): скачок болтанки на 4e71747 (AM-04, окна 100/50 м у старта), усиление при 6 м/с — e674c49 (Б2). 6 м/с, 1,5 м:&#10;551e79b σw 0,04, ±32°; 4e71747 σw 0,73, w̄ 0,44, ±79°; 1.0.0 σw 1,05, w̄ 0,81, ±86°, ΔU/0,5 с 3,98. Проблема 2 —&#10;полностью наша. AS-2 запущена параллельно AS-1 (файлы не пересекаются: AS-2 — болтанка/выборка поля, AS-1 — приток);&#10;итоговые числа AS-2 — после вливания AS-1. Приёмка AS-2: σ на 1,5 м ±30 % от подобия приземного слоя для u* в точке&#10;(Panofsky et al. 1977, Kaimal &amp;amp; Finnigan 1994), w̄ объяснён, без эвристики отрыва на наветренном старте.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — шлюз AS-1, решение пользователя: вариант (в) — два прохода, k₁ = k₀·(U_меню/U₁)^(1/p), p по ветру&#10;0,57/0,75/0,90 при 3/6/10 м/с (замер отклика поля, passes.csv); упор прохода 1 в предел итераций — без второго&#10;прохода. Граница «на 100 м поле на 5–40 % слабее аналитики» — оставить, в документы. Несходимость на слабом ветре —&#10;вне модуля (TODO). Выпуск 1.0.1: AS-2 + AS-1 + main 01427ed, итог 430a638; наборы тестов не гонялись (указание&#10;пользователя, проверка после выпуска). C9 v3 дополнен (степенной k, слабый ветер, откат к проходу 1, timeout на проход).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — проверка 95412c3 (AS-2 + main dcf039e, до AS-1): GPU air_ 61/61, start_ 16/16 (с test_start_regression_gpu,&#10;start_air_gpu); headless contracts/flight/start_/game ok; atmosphere — test_performance (нагрузка) и&#10;test_xc_bot_synthetic_10km (падает и на feature/control-fix 6797a05 — пришло из main, не воздух).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — AS-1 вариант (в), 6 м/с: U10 над стартом ÷ меню 0,95–1,06 (10/10 в ±10 %, остаток −5,0…+6,1 %), k 0,37–0,96;&#10;100 м — 1,17–1,69 × меню (до 1,6–2,5); wall_s 4,2–5,5 → 8,0–13,3 с (машина под нагрузкой).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — замер AS-1 (в) по всем ветрам (b9055a6): U10 над стартом ÷ меню 3 м/с 0,90–1,01, 6 м/с 0,95–1,06, 10 м/с&#10;0,95–1,06 — 30/30 в ±10 %, проход 1 сошёлся везде; wall_s 8,0–14,8 с, altai 3 м/с 26,7–38,5 с (вероятно, упор прохода 2&#10;в итерации); поле/аналитика на 100 м при 6 м/с 0,64–0,92 (медиана 0,81). GPU test_air_start 2/2, test_air_contracts 29/29.&#10;После выпуска: полный прогон наборов (air_, start_, contracts, flight, game) на 87a7982.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/air-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/air-start/</guid><description>&lt;h1 id="модуль-воздух-у-старта-air-start"&gt;Модуль «воздух у старта» (air-start)&lt;a class="anchor" href="#%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8c-%d0%b2%d0%be%d0%b7%d0%b4%d1%83%d1%85-%d1%83-%d1%81%d1%82%d0%b0%d1%80%d1%82%d0%b0-air-start" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Ветка &lt;code&gt;feature/air-start&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-air-start&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 938d1ea). Журнал — &lt;code&gt;docs/archive/plan/air-start-progress.md&lt;/code&gt;.&#10;Фон: &lt;code&gt;docs/plan/air_model.md&lt;/code&gt;, &lt;code&gt;docs/contracts/air-model.md&lt;/code&gt;, &lt;code&gt;docs/archive/plan/air-model-progress.md&lt;/code&gt; (AM-11/AM-12 — не здесь).&lt;/p&gt;&#10;&lt;h2 id="цель"&gt;Цель&lt;a class="anchor" href="#%d1%86%d0%b5%d0%bb%d1%8c" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Жалоба пилота на 1.0.0: при 6 м/с на старте «сдувает», нос гуляет, крыло само отрывается и падает. Две находки&#10;других модулей — обе в поле воздуха GPU (&lt;code&gt;AirRuntime&lt;/code&gt;/&lt;code&gt;AirCase&lt;/code&gt;):&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Ветер меню задан не у старта&lt;/strong&gt; (WPC-2, &lt;code&gt;feature/wing-physics-check&lt;/code&gt; 576550e): &lt;code&gt;AirRuntime.conditions_of&lt;/code&gt; отдаёт&#10;ветер меню как u10 «на 10 м у старта», а &lt;code&gt;AirCase.prepare&lt;/code&gt; (&lt;code&gt;air_case.gd:236–238&lt;/code&gt;, u_a = u10·max_profile) ставит&#10;его притоком на краю области 38,4 км. Над стартом на 10 м при 6 м/с — 6,2…12,6 м/с (медиана 1,40 × меню), на 100 м —&#10;1,6–2,5 × меню; аналитика у старта на 10 м = меню (1,01–1,05).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Турбулентность и разворот ветра у земли&lt;/strong&gt; (CF-1, &lt;code&gt;control-fix/cf1&lt;/code&gt;): на 1,5 м над стартом в 1.0.0 σw 0,4–1,05 м/с,&#10;направление ±90–180°, |ΔU| до 4 м/с за 0,5 с; в 551e79b σw 0,02, ±30°. Регрессия между 551e79b и 041d8ed&#10;(AM-04/AM-09/А1.2/Б2), 0d1ecf2 ни при чём. Бисект ведёт CF-1, результат передадут сюда.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="решения-пользователя-не-обсуждаются"&gt;Решения пользователя (не обсуждаются)&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-%d0%bd%d0%b5-%d0%be%d0%b1%d1%81%d1%83%d0%b6%d0%b4%d0%b0%d1%8e%d1%82%d1%81%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;01.10 — проблема 1: &lt;strong&gt;подстроить поле под старт&lt;/strong&gt;: после первого расчёта поля умножить u10 притока на&#10;U_меню / U_поле(10 м над стартом) и посчитать второй раз (≈ +5 с к загрузке — приемлемо); класс устойчивости и&#10;z_sat — по ветру меню; калибровку решателя (Askervein, Б1/AM-09) не трогать.&lt;/li&gt;&#10;&lt;li&gt;01.10 (поправка главной сессии) — сплющивание профиля аналитики над гребнем по Taylor &amp;amp; Lee 1984 пользователь&#10;&lt;strong&gt;не выбирал&lt;/strong&gt;: аналитику (&lt;code&gt;wind_model.gd&lt;/code&gt;, &lt;code&gt;atmosphere.gd&lt;/code&gt;), Б1/AM-09 и &lt;code&gt;test_ridge_starts&lt;/code&gt; не трогать. Если после&#10;исправления поля расхождение аналитики и поля у старта останется заметным — шлюз с числами.&lt;/li&gt;&#10;&lt;li&gt;Проблема 2 — исправить у причины; турбулентность у земли — физичная (масштабы и σ по теории приземного слоя для&#10;данного ветра и устойчивости, без разворотов на 180° за доли секунды при 6 м/с).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="границы-и-чего-не-трогаем"&gt;Границы и чего не трогаем&lt;a class="anchor" href="#%d0%b3%d1%80%d0%b0%d0%bd%d0%b8%d1%86%d1%8b-%d0%b8-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d0%b5-%d1%82%d1%80%d0%be%d0%b3%d0%b0%d0%b5%d0%bc" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Только модель воздуха: &lt;code&gt;AirRuntime&lt;/code&gt;, &lt;code&gt;AirCase&lt;/code&gt;, &lt;code&gt;AirPlace&lt;/code&gt;, &lt;code&gt;AirWindowCase&lt;/code&gt;, &lt;code&gt;AirClipmap&lt;/code&gt;, поле/болтанка&#10;(&lt;code&gt;wind_field.gd&lt;/code&gt;, &lt;code&gt;field_turbulence.gd&lt;/code&gt;, &lt;code&gt;gust_spectrum.gd&lt;/code&gt;, ветка поля в &lt;code&gt;atmosphere.gd&lt;/code&gt;) и их тесты.&lt;/li&gt;&#10;&lt;li&gt;Не трогаем: &lt;code&gt;scripts/flight/*&lt;/code&gt; (&lt;code&gt;ground_run.gd&lt;/code&gt;, &lt;code&gt;input_controller.gd&lt;/code&gt; — feature/control-fix), &lt;code&gt;configs/wings/&lt;/code&gt;&#10;(feature/wing-physics-check), раскладку клавиш (feature/ui-controls), аналитический профиль &lt;code&gt;WindModel&lt;/code&gt; и склоновый&#10;подъём аналитики, решатель (&lt;code&gt;air_picard.glsl&lt;/code&gt;, &lt;code&gt;Params&lt;/code&gt;, калибровка), AM-11/AM-12.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="контракты"&gt;Контракты&lt;a class="anchor" href="#%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%b0%d0%ba%d1%82%d1%8b" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Стыки — в &lt;code&gt;docs/contracts/air-model.md&lt;/code&gt; (единый источник, контрактный тест &lt;code&gt;tests/contracts/test_air_contracts.gd&lt;/code&gt;):&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/01-xc-bot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/01-xc-bot/</guid><description>&lt;h1 id="01-бот-маршрутник-ищет-термики-по-вариометру-и-летит-маршрут-fr-34a"&gt;01. Бот-маршрутник: ищет термики по вариометру и летит маршрут (FR-34a)&lt;a class="anchor" href="#01-%d0%b1%d0%be%d1%82-%d0%bc%d0%b0%d1%80%d1%88%d1%80%d1%83%d1%82%d0%bd%d0%b8%d0%ba-%d0%b8%d1%89%d0%b5%d1%82-%d1%82%d0%b5%d1%80%d0%bc%d0%b8%d0%ba%d0%b8-%d0%bf%d0%be-%d0%b2%d0%b0%d1%80%d0%b8%d0%be%d0%bc%d0%b5%d1%82%d1%80%d1%83-%d0%b8-%d0%bb%d0%b5%d1%82%d0%b8%d1%82-%d0%bc%d0%b0%d1%80%d1%88%d1%80%d1%83%d1%82-fr-34a" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; headless-бот, который летит маршрут N км на реальном рельефе локации, находя термики только по&#10;вариометру (как пилот), и пишет статистику полёта в JSON — основа измерения проходимости.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; &lt;code&gt;scripts/atmosphere/atmosphere.gd&lt;/code&gt; (API), &lt;code&gt;scripts/flight/flight_model.gd&lt;/code&gt; (&lt;code&gt;step(dt, input, air_fn, ground_fn)&lt;/code&gt;),&#10;&lt;code&gt;scripts/flight/flight_telemetry.gd&lt;/code&gt;, &lt;code&gt;tests/flight/flight_sim.gd&lt;/code&gt; (образец обвязки), &lt;code&gt;tests/terrain/test_locations.gd&lt;/code&gt;&#10;(как грузить &lt;code&gt;Terrain.new()&lt;/code&gt; headless), docs/research/thermals.md §1–2.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;tests/atmosphere/xc/&lt;/code&gt; (новые: &lt;code&gt;xc_pilot.gd&lt;/code&gt;, &lt;code&gt;xc_run.gd&lt;/code&gt;, &lt;code&gt;xc_run.tscn&lt;/code&gt;), &lt;code&gt;tools/atmosphere/xc_run.sh&lt;/code&gt;.&#10;Чужой код (FlightModel, Terrain, &lt;code&gt;scripts/game/autopilot.gd&lt;/code&gt;) — только через API, не править.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/02-etalony-zamer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/02-etalony-zamer/</guid><description>&lt;h1 id="02-эталоны-реальных-xc-полётов-и-замер-проходимости-на-всех-локациях"&gt;02. Эталоны реальных XC-полётов и замер проходимости на всех локациях&lt;a class="anchor" href="#02-%d1%8d%d1%82%d0%b0%d0%bb%d0%be%d0%bd%d1%8b-%d1%80%d0%b5%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-xc-%d0%bf%d0%be%d0%bb%d1%91%d1%82%d0%be%d0%b2-%d0%b8-%d0%b7%d0%b0%d0%bc%d0%b5%d1%80-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d0%bc%d0%be%d1%81%d1%82%d0%b8-%d0%bd%d0%b0-%d0%b2%d1%81%d0%b5%d1%85-%d0%bb%d0%be%d0%ba%d0%b0%d1%86%d0%b8%d1%8f%d1%85" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; прогнать бота (01) по матрице «локация × пресет × ветер × сид», сравнить со значениями реальных&#10;маршрутных полётов на дельтаплане и записать исходную картину (без правки конфигов).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; &lt;code&gt;tests/atmosphere/xc/&lt;/code&gt; (бот из 01), &lt;code&gt;configs/locations/*.json&lt;/code&gt;, &lt;code&gt;configs/weather/{weak,medium,strong}.json&lt;/code&gt;,&#10;docs/research/thermals.md, docs/guide/atmosphere.md.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;tools/atmosphere/xc_matrix.sh&lt;/code&gt;, &lt;code&gt;tools/atmosphere/xc_report.py&lt;/code&gt;, docs/research/xc_reference.md (новый),&#10;раздел «Проходимость маршрута» в docs/guide/atmosphere.md.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Шаги:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;docs/research/xc_reference.md — эталоны с источниками (Reichmann «Cross-Country Soaring», статьи по анализу IGC&#10;дельтапланов/парапланов, XContest/Leonardo; треки не скачивать массово). Ориентиры для дельтаплана&#10;(проверить и уточнить):&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Метрика&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Средний день&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Сильный день&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;средний набор в термике&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1–2 м/с&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2–3,5 м/с&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;доля времени в кружении&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;40–55 %&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;30–45 %&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;средняя маршрутная скорость&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;20–30 км/ч&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;30–45 км/ч&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;термиков на 10 км&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2–4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1,5–3&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;вариометр ≥ +7 м/с&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;почти никогда&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;редко (≤ 2 % времени в термиках)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;xc_matrix.sh&lt;/code&gt;: 4 локации × {weak, medium, strong} × ветер {0, 15 км/ч с преобладающего направления локации}&#10;× 5 сидов × 40 км (маршрут: от старта по ветру/долине — точки задать в скрипте, внутри детального рельефа).&#10;С &lt;code&gt;--clouds&lt;/code&gt; и без.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;xc_report.py&lt;/code&gt;: сводная таблица (медиана и квартили по сидам), доля успешных (≥ 40 км без посадки), отклонения&#10;от эталонов (в «коридоре» / выше / ниже). Плюс плотность термиков по полю: число живых термиков на 100 км²&#10;(через &lt;code&gt;thermals_near&lt;/code&gt; — тут можно, это замер, а не бот) и их сила — сравнить с Lenschow (20–40 % площади в&#10;середине слоя — см. thermals.md §1).&lt;/li&gt;&#10;&lt;li&gt;Итог — таблица в docs/guide/atmosphere.md + список «что выбивается» (вход для 03).&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;Критерий приёмки:&lt;/strong&gt; матрица целиком прогоняется одной командой ≤ 30 мин; в отчёте для каждой пары&#10;«локация × пресет» — доля успешных, 6 метрик с квартилями и пометкой коридора; эталоны с ≥ 3 источниками.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/03-kalibrovka/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/03-kalibrovka/</guid><description>&lt;h1 id="03-калибровка-пресетов-по-проходимости-маршрута--регрессионный-тест"&gt;03. Калибровка пресетов по проходимости маршрута + регрессионный тест&lt;a class="anchor" href="#03-%d0%ba%d0%b0%d0%bb%d0%b8%d0%b1%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d0%bf%d1%80%d0%b5%d1%81%d0%b5%d1%82%d0%be%d0%b2-%d0%bf%d0%be-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d0%bc%d0%be%d1%81%d1%82%d0%b8-%d0%bc%d0%b0%d1%80%d1%88%d1%80%d1%83%d1%82%d0%b0--%d1%80%d0%b5%d0%b3%d1%80%d0%b5%d1%81%d1%81%d0%b8%d0%be%d0%bd%d0%bd%d1%8b%d0%b9-%d1%82%d0%b5%d1%81%d1%82" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; подогнать &lt;code&gt;configs/weather/*&lt;/code&gt; и &lt;code&gt;configs/atmosphere.json&lt;/code&gt; так, чтобы в средний и сильный день маршрут&#10;проходился на всех 4 локациях, а статистика попадала в коридоры реальных XC (02); закрепить тестом.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; отчёт 02 (docs/guide/atmosphere.md, docs/research/xc_reference.md), &lt;code&gt;configs/weather/{weak,medium,strong}.json&lt;/code&gt;,&#10;&lt;code&gt;configs/atmosphere.json&lt;/code&gt;, &lt;code&gt;scripts/atmosphere/thermal_field.gd&lt;/code&gt;, &lt;code&gt;tools/atmosphere/xc_matrix.sh&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;configs/weather/{weak,medium,strong}.json&lt;/code&gt;, &lt;code&gt;configs/atmosphere.json&lt;/code&gt; (секции thermal/turbulence),&#10;&lt;code&gt;scripts/atmosphere/thermal_field.gd&lt;/code&gt; (только если параметром не решить), &lt;code&gt;tests/atmosphere/test_xc_regression.gd&lt;/code&gt;.&#10;Веса поверхности &lt;code&gt;world.json → surface.thermal&lt;/code&gt; — группа 4: если нужны правки — карточка там, не править.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/04-slova-pilota-testy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/04-slova-pilota-testy/</guid><description>&lt;h1 id="04-слова-пилота-в-числах-подсос-затянет-и-выкинет-8-термики-без-облаков"&gt;04. Слова пилота в числах: подсос, «затянет и выкинет», +8, термики без облаков&lt;a class="anchor" href="#04-%d1%81%d0%bb%d0%be%d0%b2%d0%b0-%d0%bf%d0%b8%d0%bb%d0%be%d1%82%d0%b0-%d0%b2-%d1%87%d0%b8%d1%81%d0%bb%d0%b0%d1%85-%d0%bf%d0%be%d0%b4%d1%81%d0%be%d1%81-%d0%b7%d0%b0%d1%82%d1%8f%d0%bd%d0%b5%d1%82-%d0%b8-%d0%b2%d1%8b%d0%ba%d0%b8%d0%bd%d0%b5%d1%82-8-%d1%82%d0%b5%d1%80%d0%bc%d0%b8%d0%ba%d0%b8-%d0%b1%d0%b5%d0%b7-%d0%be%d0%b1%d0%bb%d0%b0%d0%ba%d0%be%d0%b2" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; набор численных тестов, что модель ведёт себя так, как описал пилот (questions.md «Облака»),&#10;и исправить физику там, где тест не проходит.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; questions.md (раздел «Облака», п. 1), REQUIREMENTS.md FR-11, FR-14b, FR-15, &lt;code&gt;scripts/atmosphere/cloud_physics.gd&lt;/code&gt;,&#10;&lt;code&gt;scripts/atmosphere/thermal_field.gd&lt;/code&gt;, &lt;code&gt;tests/atmosphere/test_cloud_suck.gd&lt;/code&gt; (не дублировать).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;tests/atmosphere/test_pilot_words.gd&lt;/code&gt; (новый), &lt;code&gt;scripts/atmosphere/cloud_physics.gd&lt;/code&gt;,&#10;&lt;code&gt;scripts/atmosphere/thermal_field.gd&lt;/code&gt;, &lt;code&gt;configs/atmosphere.json&lt;/code&gt; (секции thermal.suck_&lt;em&gt;, turbulence.in_cloud_&lt;/em&gt;).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Шаги и тесты&lt;/strong&gt; (сиды фиксированы; полёт — FlightModel + простой держатель виража / бот 01, если готов):&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/05-sklon-na-startah/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/05-sklon-na-startah/</guid><description>&lt;h1 id="05-набор-у-склона-на-каждом-старте-первый-шаг-маршрута-fr-34a-fr-12-fr-13"&gt;05. Набор у склона на каждом старте (первый шаг маршрута FR-34a, FR-12, FR-13)&lt;a class="anchor" href="#05-%d0%bd%d0%b0%d0%b1%d0%be%d1%80-%d1%83-%d1%81%d0%ba%d0%bb%d0%be%d0%bd%d0%b0-%d0%bd%d0%b0-%d0%ba%d0%b0%d0%b6%d0%b4%d0%be%d0%bc-%d1%81%d1%82%d0%b0%d1%80%d1%82%d0%b5-%d0%bf%d0%b5%d1%80%d0%b2%d1%8b%d0%b9-%d1%88%d0%b0%d0%b3-%d0%bc%d0%b0%d1%80%d1%88%d1%80%d1%83%d1%82%d0%b0-fr-34a-fr-12-fr-13" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; проверить, что на каждом старте всех локаций при ветре в склон можно набрать высоту на динамике,&#10;а за гребнем — опускание и ротор; поправить склоновую модель при провале.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; &lt;code&gt;configs/locations/*.json&lt;/code&gt; (&lt;code&gt;start_sites&lt;/code&gt;, &lt;code&gt;heading_deg&lt;/code&gt;), &lt;code&gt;scripts/atmosphere/atmosphere.gd&lt;/code&gt; (склон, подветренная&#10;зона), &lt;code&gt;scripts/atmosphere/ground_field.gd&lt;/code&gt;, &lt;code&gt;configs/atmosphere.json&lt;/code&gt; (slope/lee), бот 01 (&lt;code&gt;tests/atmosphere/xc/xc_pilot.gd&lt;/code&gt;).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;tests/atmosphere/test_ridge_starts.gd&lt;/code&gt; (новый), режим «восьмёрки у склона» в &lt;code&gt;tests/atmosphere/xc/xc_pilot.gd&lt;/code&gt;,&#10;&lt;code&gt;scripts/atmosphere/ground_field.gd&lt;/code&gt;, секции slope/lee в &lt;code&gt;configs/atmosphere.json&lt;/code&gt;.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/06-volna-proverka/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/06-volna-proverka/</guid><description>&lt;h1 id="06-волна-подъём-и-роторы-согласованы-с-лентикулярами-остаток-vr-27"&gt;06. Волна: подъём и роторы согласованы с лентикулярами (остаток VR-27)&lt;a class="anchor" href="#06-%d0%b2%d0%be%d0%bb%d0%bd%d0%b0-%d0%bf%d0%be%d0%b4%d1%8a%d1%91%d0%bc-%d0%b8-%d1%80%d0%be%d1%82%d0%be%d1%80%d1%8b-%d1%81%d0%be%d0%b3%d0%bb%d0%b0%d1%81%d0%be%d0%b2%d0%b0%d0%bd%d1%8b-%d1%81-%d0%bb%d0%b5%d0%bd%d1%82%d0%b8%d0%ba%d1%83%d0%bb%d1%8f%d1%80%d0%b0%d0%bc%d0%b8-%d0%be%d1%81%d1%82%d0%b0%d1%82%d0%be%d0%ba-vr-27" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; проверить численно, что физика волны (&lt;code&gt;wave_field.gd&lt;/code&gt;) и облака-лентикуляры/роторные клочья стоят в&#10;одних и тех же местах, и что в волне реально набрать выше базы кучевых.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; &lt;code&gt;scripts/atmosphere/wave_field.gd&lt;/code&gt;, &lt;code&gt;configs/weather/wave.json&lt;/code&gt;, &lt;code&gt;configs/atmosphere.json&lt;/code&gt; (wave.*),&#10;&lt;code&gt;tests/atmosphere/test_hazards.gd&lt;/code&gt; (&lt;code&gt;test_lee_wave_crest_lift&lt;/code&gt;), docs/guide/atmosphere.md «Опасная и особая погода».&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;scripts/atmosphere/wave_field.gd&lt;/code&gt;, &lt;code&gt;configs/weather/wave.json&lt;/code&gt;, секция wave в &lt;code&gt;configs/atmosphere.json&lt;/code&gt;,&#10;&lt;code&gt;tests/atmosphere/test_wave.gd&lt;/code&gt; (новый). Шейдеры и рендер линз — группа 3, не трогать (только данные гребней из WaveField).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/07-centrovka-bota/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/07-centrovka-bota/</guid><description>&lt;h1 id="a07-центровка-термика-в-болтанке-бот-и-проверка-что-термик-вообще-берётся"&gt;A07. Центровка термика в болтанке (бот) и проверка, что термик вообще «берётся»&lt;a class="anchor" href="#a07-%d1%86%d0%b5%d0%bd%d1%82%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d1%82%d0%b5%d1%80%d0%bc%d0%b8%d0%ba%d0%b0-%d0%b2-%d0%b1%d0%be%d0%bb%d1%82%d0%b0%d0%bd%d0%ba%d0%b5-%d0%b1%d0%be%d1%82-%d0%b8-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d1%87%d1%82%d0%be-%d1%82%d0%b5%d1%80%d0%bc%d0%b8%d0%ba-%d0%b2%d0%be%d0%be%d0%b1%d1%89%d0%b5-%d0%b1%d0%b5%d1%80%d1%91%d1%82%d1%81%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; бот, как средний пилот, центрирует термики в болтанке и набирает высоту; если при правильной технике набрать нельзя — найти причину в атмосфере.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; итог 02 (docs/guide/atmosphere.md → «Проходимость маршрута», tmp_xc_matrix): 0/240 маршрутов, набор в кружении −1,2…−1,8 м/с (эталон +1…+3,5), кружение 10–25 % (эталон 30–55 %), из 437 заходов в кружение чистый набор — 1. tests/atmosphere/xc/xc_pilot.gd (XcPilot), docs/research/xc_reference.md, docs/guide/atmosphere.md (профиль термика, болтанка, радиусы), scripts/atmosphere/thermal_field.gd (только чтение).&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; tests/atmosphere/xc/xc_pilot.gd (логика центровки), tests/atmosphere/test_xc_bot.gd, tools/atmosphere/ (диагностика). Атмосферу НЕ правит — если виновата атмосфера, записывает конкретные числа для карточки 03.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/README/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/README/</guid><description>&lt;h1 id="группа-2-физика-атмосферы--карточки"&gt;Группа 2 «Физика атмосферы» — карточки&lt;a class="anchor" href="#%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d0%b0-2-%d1%84%d0%b8%d0%b7%d0%b8%d0%ba%d0%b0-%d0%b0%d1%82%d0%bc%d0%be%d1%81%d1%84%d0%b5%d1%80%d1%8b--%d0%ba%d0%b0%d1%80%d1%82%d0%be%d1%87%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Объём — основа: FR-34a (проходимость маршрута), проверка FR-11/FR-14b/FR-15 по словам пилота, склон FR-12/13,&#10;остаток VR-27 (волна). &lt;strong&gt;Не планируем:&lt;/strong&gt; время суток/суточный цикл (VR-5), дождь под тучами (FR-14d), смог,&#10;птицы VR-22, этап 6, «Идеи»/«Позже». Ответы пилотов (болтанка, источники) — правка конфигов позже, не блокируют.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;#&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Карточка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Модель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Размер&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Зависит от&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;01&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/01-xc-bot/"&gt;Бот-маршрутник по вариометру&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;агент atmosphere закончил&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;02&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/02-etalony-zamer/"&gt;Эталоны XC и замер на всех локациях&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;01&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;03&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/03-kalibrovka/"&gt;Калибровка пресетов + регрессия&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;02, 04&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;04&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/04-slova-pilota-testy/"&gt;Слова пилота в числах&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;агент atmosphere закончил&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;05&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/05-sklon-na-startah/"&gt;Набор у склона на каждом старте&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;01&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;06&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/atmosphere/06-volna-proverka/"&gt;Волна: подъём ↔ лентикуляры&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;агент atmosphere закончил&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="порядок-и-параллельность"&gt;Порядок и параллельность&lt;a class="anchor" href="#%d0%bf%d0%be%d1%80%d1%8f%d0%b4%d0%be%d0%ba-%d0%b8-%d0%bf%d0%b0%d1%80%d0%b0%d0%bb%d0%bb%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d1%8c" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Волна 1 (параллельно):&lt;/strong&gt; 01, 04, 06 — разные файлы (01 — &lt;code&gt;tests/atmosphere/xc/&lt;/code&gt;; 04 — &lt;code&gt;cloud_physics.gd&lt;/code&gt;,&#10;&lt;code&gt;thermal_field.gd&lt;/code&gt;; 06 — &lt;code&gt;wave_field.gd&lt;/code&gt;). 04 и 06 обе правят &lt;code&gt;configs/atmosphere.json&lt;/code&gt; — разные секции.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Волна 2 (параллельно):&lt;/strong&gt; 02 и 05 после 01 (05 добавляет режим в &lt;code&gt;xc_pilot.gd&lt;/code&gt; — 02 этот файл не правит).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Волна 3:&lt;/strong&gt; 03 — последней: крутит числа пресетов по отчёту 02, когда физика 04 уже устоялась.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Стык с группой 3 (облака): все общие файлы &lt;code&gt;scripts/atmosphere/&lt;/code&gt; — по списку владений в docs/plan/README.md;&#10;при конфликте группа 2 идёт раньше. Веса источников термиков по поверхности — группа 4 (отдельной карточкой там).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/build/01-sborka-linux-proverka/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/build/01-sborka-linux-proverka/</guid><description>&lt;h1 id="01-сборка-linux-и-smoke-зелёные"&gt;01. Сборка Linux и smoke зелёные&lt;a class="anchor" href="#01-%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b0-linux-%d0%b8-smoke-%d0%b7%d0%b5%d0%bb%d1%91%d0%bd%d1%8b%d0%b5" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; &lt;code&gt;tools/check.sh&lt;/code&gt; (линтер + тесты + сборка Linux + smoke) проходит без ошибок «с нуля», в чистом чекауте.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; tools/check.sh, tools/build.sh, tools/lint.sh, project.godot, export_presets.cfg, TODO.md (строка 48).&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; tools/check.sh, tools/build.sh, tools/lint.sh, export_presets.cfg (пресет Linux), project.godot (только настройки окна/экспорта). Ошибки в чужом коде — точечный фикс с пометкой в отчёте, либо карточка владельцу, если правка &amp;gt; 20 строк.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;git status&lt;/code&gt; чист; прогнать &lt;code&gt;tools/check.sh&lt;/code&gt; как есть, зафиксировать все падения (линт/тест/сборка/smoke).&lt;/li&gt;&#10;&lt;li&gt;Починить найденные мелкие ошибки (пути, забытые ресурсы, устаревшие ключи конфигов) в границах своих файлов.&lt;/li&gt;&#10;&lt;li&gt;Убедиться, что &lt;code&gt;godot --headless --path . --import&lt;/code&gt; и &lt;code&gt;tools/build.sh linux --release&lt;/code&gt; отрабатывают на чистой машине (без кэша &lt;code&gt;.godot/&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;Прогнать &lt;code&gt;tools/lint.sh --format&lt;/code&gt; — форматирование без расхождений (или зафиксировать список нарушителей другим группам).&lt;/li&gt;&#10;&lt;li&gt;TODO.md: снять «Windows — позже» пометку у строки 48, отметить «Сборка Linux: полная проверка» как &lt;code&gt;[x]&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;rm -rf .godot build &amp;amp;&amp;amp; tools/check.sh&lt;/code&gt; завершается кодом 0 и печатает «ПРОВЕРКА ПРОЙДЕНА».&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;build/linux/deltaplan.x86_64 --headless -- --smoke&lt;/code&gt; печатает &lt;code&gt;smoke&lt;/code&gt; без ERROR/SCRIPT ERROR в выводе.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tools/lint.sh --format&lt;/code&gt; — 0 расхождений в границах владения этой группы.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; желательно после integration/terrain2/atmosphere/vegetation/sounds (иначе будут их незакрытые ошибки в логе — фиксируем только точечно). &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; S.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/build/02-stabilnost-matrica/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/build/02-stabilnost-matrica/</guid><description>&lt;h1 id="02-стабильность-матрица-крылья--локации--погода"&gt;02. Стабильность: матрица крылья × локации × погода&lt;a class="anchor" href="#02-%d1%81%d1%82%d0%b0%d0%b1%d0%b8%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%bc%d0%b0%d1%82%d1%80%d0%b8%d1%86%d0%b0-%d0%ba%d1%80%d1%8b%d0%bb%d1%8c%d1%8f--%d0%bb%d0%be%d0%ba%d0%b0%d1%86%d0%b8%d0%b8--%d0%bf%d0%be%d0%b3%d0%be%d0%b4%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; автопилот-полёт N минут по всем крыльям, всем локациям и всем погодам проходит без ошибок в логе.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; scripts/game/autopilot.gd, tests/game/test_game_flight.gd, docs/guide/game.md («Тесты», «Командная строка»), configs/tasks/ongudai_demo.json, configs/game.json, tools/check.sh.&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; &lt;code&gt;tests/stability/&lt;/code&gt; (новая), &lt;code&gt;tools/soak.sh&lt;/code&gt; (новый). Правки чужого кода — только точечные фиксы найденных падений, каждый отдельной строкой в отчёте (иначе — карточка владельцу).&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;tests/stability/test_matrix.gd&lt;/code&gt;: перебор всех &lt;code&gt;configs/locations/*&lt;/code&gt; × 3 крыла × 3 погоды (weak/medium/strong) × ветер (into_site) — старт, автопилот, 5 мин симуляции через &lt;code&gt;game.tick()&lt;/code&gt; в headless-цикле (без реального времени); ErrorCatcher — 0 ошибок/предупреждений.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tools/soak.sh&lt;/code&gt;: запуск собранной Linux-сборки &lt;code&gt;--autostart --autopilot --time=300&lt;/code&gt; под xvfb на каждое сочетание, код выхода + grep &lt;code&gt;ERROR&lt;/code&gt;/&lt;code&gt;SCRIPT ERROR&lt;/code&gt; в логе.&lt;/li&gt;&#10;&lt;li&gt;Точечно чинить найденные падения в границах допустимого; иначе фиксировать как список для владельца группы.&lt;/li&gt;&#10;&lt;li&gt;Отчёт-таблица «сочетание → результат (ok/ошибка)».&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;godot --headless --path . res://tests/run_tests.tscn -- --filter=stability&lt;/code&gt; — 0 упало.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tools/soak.sh&lt;/code&gt; по всем сочетаниям — код выхода 0, 0 строк &lt;code&gt;ERROR&lt;/code&gt; в логах.&lt;/li&gt;&#10;&lt;li&gt;Таблица результатов приложена к отчёту карточки.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; после сборки Linux (карточка 01) и окончания integration/terrain2/atmosphere/vegetation/sounds. &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; M.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/build/03-zamery-fps-zagruzka/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/build/03-zamery-fps-zagruzka/</guid><description>&lt;h1 id="03-замеры-fps-и-времени-загрузки-nfr-1-nfr-2"&gt;03. Замеры FPS и времени загрузки (NFR-1, NFR-2)&lt;a class="anchor" href="#03-%d0%b7%d0%b0%d0%bc%d0%b5%d1%80%d1%8b-fps-%d0%b8-%d0%b2%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%b8-%d0%b7%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d0%ba%d0%b8-nfr-1-nfr-2" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; скрипт замеряет FPS на пресете medium и время загрузки локации на дискретной видеокарте, печатает отчёт с числами.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/game.md («Графика»), scripts/game/graphics_presets.gd, configs/game.json (&lt;code&gt;graphics_presets&lt;/code&gt;), REQUIREMENTS.md (NFR-1: 60 FPS на дискретной; NFR-2: загрузка ≤ 10 с).&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; &lt;code&gt;tools/bench/&lt;/code&gt; (новая). Код модулей не правит — узкие места и цифры описывает в отчёте; правки чужих файлов графики — карточка владельцу.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;tools/bench/frame_bench.sh&lt;/code&gt;: 3–4 ракурса через &lt;code&gt;--autostart --camera=… --time=20&lt;/code&gt; на каждой локации (старт у склона, высота над лесом, вид на облака) — средний и 1%-low FPS на пресете medium.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tools/bench/load_bench.sh&lt;/code&gt;: время от &lt;code&gt;--autostart&lt;/code&gt; до первого кадра полёта на каждой локации (тёплый кеш &lt;code&gt;.godot/&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;Прогнать оба на этой машине с дискретной видеокартой; результаты — в таблицу docs/guide/game.md («Графика»).&lt;/li&gt;&#10;&lt;li&gt;Если medium &amp;lt; 60 FPS среднее — зафиксировать конкретные узкие места (по &lt;code&gt;RenderingServer&lt;/code&gt; таймингам) в отчёте без правки чужого кода.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;tools/bench/frame_bench.sh&lt;/code&gt; печатает таблицу «ракурс → средний FPS, 1%-low» для всех локаций на medium.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tools/bench/load_bench.sh&lt;/code&gt; печатает время загрузки каждой локации; все ≤ 10 с (тёплый кеш) — если нет, отчёт содержит цифры и просадки.&lt;/li&gt;&#10;&lt;li&gt;Таблица добавлена в docs/guide/game.md.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; после того как трава/лес/облака (vegetation, terrain2, atmosphere) закончены — иначе цифры неактуальны. Можно параллельно с карточкой 02. &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; M.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/build/04-konfigi-doc-edinicy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/build/04-konfigi-doc-edinicy/</guid><description>&lt;h1 id="04-проверка-конфигов-_doc-и-единицы-измерения-nfr-7"&gt;04. Проверка конфигов: &lt;code&gt;_doc&lt;/code&gt; и единицы измерения (NFR-7)&lt;a class="anchor" href="#04-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d0%ba%d0%be%d0%bd%d1%84%d0%b8%d0%b3%d0%be%d0%b2-_doc-%d0%b8-%d0%b5%d0%b4%d0%b8%d0%bd%d0%b8%d1%86%d1%8b-%d0%b8%d0%b7%d0%bc%d0%b5%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-nfr-7" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; каждое числовое значение во всех &lt;code&gt;configs/*.json&lt;/code&gt; документировано (&lt;code&gt;_doc&lt;/code&gt;-поле или комментарий-ключ рядом) с единицей измерения.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; REQUIREMENTS.md (NFR-7), configs/*.json (13 файлов), docs/guide/architecture.md.&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; только чтение и точечная правка &lt;code&gt;_doc&lt;/code&gt;-ключей внутри &lt;code&gt;configs/*.json&lt;/code&gt; (без смены самих значений/структуры — это владение других групп). Найденные пропуски по числам без &lt;code&gt;_doc&lt;/code&gt; — либо сама правка (если тривиально: добавить строку), либо список владельцам групп.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Скрипт (&lt;code&gt;tools/bench/&lt;/code&gt; или временный, в отчёте) проходит по всем &lt;code&gt;configs/*.json&lt;/code&gt;, ищет числовые листья без соседнего &lt;code&gt;_doc&lt;/code&gt;/units-поля.&lt;/li&gt;&#10;&lt;li&gt;Составить список пропусков по файлам с указанием группы-владельца (см. таблицу README «Владения»).&lt;/li&gt;&#10;&lt;li&gt;Добавить &lt;code&gt;_doc&lt;/code&gt; с единицей измерения там, где это не требует знания физики (переименования, очевидные единицы — м, с, м/с, °); неочевидные — список владельцу.&lt;/li&gt;&#10;&lt;li&gt;Свериться, что описание в docs/ соответствующего модуля упоминает единицы для ключевых параметров.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Скрипт проверки печатает 0 числовых значений без &lt;code&gt;_doc&lt;/code&gt;/единиц в файлах, тронутых этой карточкой, или список с владельцами передан (приложен к отчёту).&lt;/li&gt;&#10;&lt;li&gt;Ни одно значение параметров не изменено — только добавлены документирующие поля.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tools/check.sh --no-build&lt;/code&gt; зелёный после правок (валидный JSON).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; независима, можно вести сейчас. &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; S.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/build/05-assets-md-sverka/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/build/05-assets-md-sverka/</guid><description>&lt;h1 id="05-assetsmd-против-файлов-в-assets-и-data"&gt;05. ASSETS.md против файлов в assets/ и data/&lt;a class="anchor" href="#05-assetsmd-%d0%bf%d1%80%d0%be%d1%82%d0%b8%d0%b2-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2-%d0%b2-assets-%d0%b8-data" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; ASSETS.md перечисляет ровно то, что реально лежит в &lt;code&gt;assets/&lt;/code&gt; и &lt;code&gt;data/&lt;/code&gt; — без пропусков и без «висячих» строк на несуществующие файлы.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; ASSETS.md, assets/ (модели, шрифты, звуки, шейдеры), data/ (terrain, osm), assets/sounds/LICENSES.md.&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; ASSETS.md (правка), assets/sounds/LICENSES.md (сверка, без правки атрибуций — это владение группы 9). Сами файлы ассетов не трогает.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Скрипт: список файлов в &lt;code&gt;assets/**&lt;/code&gt; и &lt;code&gt;data/**&lt;/code&gt; (модели .glb/.tres, шрифты, звуки, текстуры) vs строки таблиц ASSETS.md.&lt;/li&gt;&#10;&lt;li&gt;Найти файлы без строки в ASSETS.md — добавить (источник/лицензия неизвестны → пометить &lt;code&gt;⚠ уточнить&lt;/code&gt; и передать владельцу группы).&lt;/li&gt;&#10;&lt;li&gt;Найти строки ASSETS.md на несуществующие файлы — удалить или пометить владельцу как «переименовано».&lt;/li&gt;&#10;&lt;li&gt;Проверить, что все &lt;code&gt;⚠ NC&lt;/code&gt; пометки на месте (сверка с assets/sounds/LICENSES.md — не расходятся).&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Скрипт-сверка печатает 0 файлов в assets/, data/ без строки в ASSETS.md (или список передан владельцам с пометкой &lt;code&gt;⚠ уточнить&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;0 строк ASSETS.md, указывающих на несуществующий файл.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tools/check.sh --no-build&lt;/code&gt; зелёный (ASSETS.md — не код, но правки не ломают импорт ресурсов).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; независима, можно вести сейчас; лучше после того как sounds закончит (иначе список звуков неполный — повторить сверку). &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; S.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/build/06-todo-sync/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/build/06-todo-sync/</guid><description>&lt;h1 id="06-синхронизация-todomd-с-кодом"&gt;06. Синхронизация TODO.md с кодом&lt;a class="anchor" href="#06-%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-todomd-%d1%81-%d0%ba%d0%be%d0%b4%d0%be%d0%bc" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; TODO.md отражает реальное состояние: ничего «в работе»/не отмеченного, что уже сделано в коде, и наоборот.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; TODO.md, docs/plan/README.md (столбец «Сейчас в работе»), docs/guide/architecture.md, REQUIREMENTS.md.&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; TODO.md, docs/guide/architecture.md (таблица модулей). Код не трогает — только сверяет и правит пометки.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Пройти TODO.md построчно; для каждой строки без &lt;code&gt;[x]&lt;/code&gt; проверить в коде/тестах, не сделана ли она фактически (особенно пункты instruments.md «в работе» без агента — см. README группа 8).&lt;/li&gt;&#10;&lt;li&gt;Снять «— &lt;em&gt;в работе&lt;/em&gt;» с пунктов, чьи агенты (integration, terrain2, atmosphere, vegetation, sounds) уже закончили — сверить с README «Сейчас в работе».&lt;/li&gt;&#10;&lt;li&gt;Отметить &lt;code&gt;[x]&lt;/code&gt; реально готовое; для частично готового — уточнить формулировку (что осталось).&lt;/li&gt;&#10;&lt;li&gt;docs/guide/architecture.md: добавить в таблицу модулей отсутствующие папки (&lt;code&gt;scripts/world_objects/&lt;/code&gt;, &lt;code&gt;scripts/tasks/&lt;/code&gt;, &lt;code&gt;scripts/ui/&lt;/code&gt;, &lt;code&gt;scripts/vegetation/&lt;/code&gt;, &lt;code&gt;assets/shaders/sail/&lt;/code&gt; и др., если их там нет).&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ревью координатора: 0 строк TODO.md вида «сделано в коде, но не отмечено &lt;code&gt;[x]&lt;/code&gt;» (выборочная проверка 10 случайных строк).&lt;/li&gt;&#10;&lt;li&gt;0 пометок «в работе» на агентов, которые по README уже закончили.&lt;/li&gt;&#10;&lt;li&gt;Таблица модулей docs/guide/architecture.md содержит все папки верхнего уровня &lt;code&gt;scripts/*&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; делать последней в группе — после карточек 01–05 (даёт актуальную картину «что сделано»). &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; S.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/build/README/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/build/README/</guid><description>&lt;h1 id="группа-13-сборка-проверка-и-выпуск-linux"&gt;Группа 13. Сборка, проверка и выпуск (Linux)&lt;a class="anchor" href="#%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d0%b0-13-%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b0-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d0%b8-%d0%b2%d1%8b%d0%bf%d1%83%d1%81%d0%ba-linux" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Объём: только Linux, без CI, без Windows, без оптимизации под слабое железо (NFR-1 сейчас — 60 FPS на&#10;дискретной видеокарте). Веха «показа пилоту» снята с плана — карточки 01/02 старых черновиков удалены/переписаны.&lt;/p&gt;&#10;&lt;h2 id="порядок"&gt;Порядок&lt;a class="anchor" href="#%d0%bf%d0%be%d1%80%d1%8f%d0%b4%d0%be%d0%ba" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;01-sborka-linux-proverka&lt;/strong&gt; — &lt;code&gt;tools/check.sh&lt;/code&gt; зелёный (линт, тесты, сборка Linux, smoke). Базовая проверка,&#10;с неё начинать.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;02-stabilnost-matrica&lt;/strong&gt; — матрица крылья × локации × погода, автопилот без ошибок в логе. После 01.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;03-zamery-fps-zagruzka&lt;/strong&gt; — FPS (NFR-1) и время загрузки (NFR-2) на пресете medium. Можно параллельно с 02.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;04-konfigi-doc-edinicy&lt;/strong&gt; — все числа в &lt;code&gt;configs/*.json&lt;/code&gt; с &lt;code&gt;_doc&lt;/code&gt; и единицами (NFR-7). Независима, вести сейчас.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;05-assets-md-sverka&lt;/strong&gt; — ASSETS.md соответствует файлам в &lt;code&gt;assets/&lt;/code&gt; и &lt;code&gt;data/&lt;/code&gt;. Независима, вести сейчас&#10;(лучше — после того как sounds закончит).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;06-todo-sync&lt;/strong&gt; — TODO.md и docs/guide/architecture.md синхронизированы с кодом. Последняя — даёт актуальную&#10;картину после 01–05.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Карточки 04 и 05 можно делать параллельно с 01–03 в любой момент. 02 и 03 требуют, чтобы integration, terrain2,&#10;atmosphere, vegetation, sounds закончили (иначе цифры/ошибки неактуальны).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/cf1_start/README/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/cf1_start/README/</guid><description>&lt;h1 id="cf-1-замеры-старта-данные-исследования"&gt;CF-1: замеры старта (данные исследования)&lt;a class="anchor" href="#cf-1-%d0%b7%d0%b0%d0%bc%d0%b5%d1%80%d1%8b-%d1%81%d1%82%d0%b0%d1%80%d1%82%d0%b0-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d0%b5-%d0%b8%d1%81%d1%81%d0%bb%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;probe_test_cf1probe.gd.txt&lt;/code&gt; — зонд: копировать в &lt;code&gt;tests/game/test_cf1probe.gd&lt;/code&gt; нужной версии и запускать&#10;&lt;code&gt;CF1_OUT=&amp;lt;каталог&amp;gt; CF1_TAG=&amp;lt;метка&amp;gt; [CF1_CASES=крыло:км/ч,...] [CF1_SCENS=idle,run_neutral,...] [CF1_SEEDS=0,1500] [CF1_POST=с] XDG_DATA_HOME=$(mktemp -d) godot --headless --path . res://tests/run_tests.tscn -- --filter=cf1probe&lt;/code&gt;&#10;(поле воздуха GPU — то же через окно: &lt;code&gt;tools/gpu_tests.sh --filter=cf1probe&lt;/code&gt;). Сцена игры (&lt;code&gt;main.tscn&lt;/code&gt; → &lt;code&gt;_fly&lt;/code&gt;), без ввода / разбег через InputMap, CSV по 0,1 с.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;bisect.sh&lt;/code&gt;, &lt;code&gt;sweep.sh&lt;/code&gt;, &lt;code&gt;gpubisect.sh&lt;/code&gt; — пачки по версиям (временные копии &lt;code&gt;~/deltaplan-cf1-bisect-&amp;lt;коммит&amp;gt;&lt;/code&gt;), &lt;code&gt;summary.py&lt;/code&gt; — сводка.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;data_bisect1.tar.gz&lt;/code&gt; — CSV первой серии (по умолчанию; крылья training/sport/combat × 3/5/7 м/с × сиды 0/1500/3000; headless и GPU).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="бисект-поля-gpu-серия-3-gpubisect2sh-коммиты-окно---gpu"&gt;Бисект поля GPU (серия 3, &lt;code&gt;gpubisect2.sh &amp;lt;коммиты…&amp;gt;&lt;/code&gt;, окно, &lt;code&gt;--gpu&lt;/code&gt;)&lt;a class="anchor" href="#%d0%b1%d0%b8%d1%81%d0%b5%d0%ba%d1%82-%d0%bf%d0%be%d0%bb%d1%8f-gpu-%d1%81%d0%b5%d1%80%d0%b8%d1%8f-3-gpubisect2sh-%d0%ba%d0%be%d0%bc%d0%bc%d0%b8%d1%82%d1%8b-%d0%be%d0%ba%d0%bd%d0%be---gpu" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Сравнение &lt;strong&gt;по ветру меню&lt;/strong&gt; (встречный, 10,8 и 21,6 км/ч, сид часов атмосферы 0), ветер у старта на&#10;1,5 м над ступнями — в таблице (Ū разный: ветер меню задаётся на краю области, см. air-start).&#10;Крыло стоит без ввода 20 с; σ — по 200 точкам (0,1 с).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/control-fix-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/control-fix-progress/</guid><description>&lt;h1 id="журнал-модуля-control-fix"&gt;Журнал модуля «control-fix»&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8f-control-fix" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;План — &lt;code&gt;docs/archive/plan/control-fix.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/control-fix.md&lt;/code&gt;. Ветка &lt;code&gt;feature/control-fix&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-control-fix&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 3820bda = v1.0.0).&lt;/p&gt;&#10;&lt;h2 id="решения"&gt;Решения&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — модуль заведён по жалобе пилота на 1.0.0 (сам начинает полёт, крен валится, мышь не управляет). Контракты С1 (ControlInput v1), С2 (InputController v1), С3 — ссылка на start-fixes К3 v2/К4 v1; контрактный тест &lt;code&gt;tests/game/test_control_fix_contracts.gd&lt;/code&gt; (2/2 ок, весь &lt;code&gt;--filter=contracts&lt;/code&gt; 34/34).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — две задачи параллельно: CF-1 (земля/старт, &lt;code&gt;scripts/flight/*&lt;/code&gt;) и CF-2 (мышь, &lt;code&gt;input_controller.gd&lt;/code&gt;/UI). Стык — &lt;code&gt;ControlInput&lt;/code&gt; (С1). Противоречие с решениями пользователя start-fixes — шлюз.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — headless поле воздуха аналитическое (нет RenderingDevice), в игре — GPU-поле: воспроизведение CF-1 должно это учитывать (окно &lt;code&gt;tools/gpu_tests.sh&lt;/code&gt;/&lt;code&gt;--air-field&lt;/code&gt;).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — уточнение пилота (через главную сессию): главная проблема — на старте нельзя управлять крылом; «Славутич», 6 м/с встречный: нос высоко, ни мышью, ни S не опустить, взлёта нет; раньше работало. Передано CF-1 (приоритет — найти коммит). Ориентиры разбега (0 м/с — долго, но советские/учебные взлетают; 3 — почти так же, спортивные легко; 6 — просто и быстро; 10 — почти вертикально) — сценарии тестов CF-1, числа из физики; упор в поляру/ветер — модулю feature/wing-physics-check.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — новое требование пользователя: управление крылом на земле по тангажу и крену (стоя и на разбеге). Это смена С1/С2 (v2) и start-fixes К3 (v3) и частично решения start-fixes п. 3 («стоит — только поворот») — раскладка клавиш = шлюз (варианты главной сессии), задача CF-3 после CF-1 (те же файлы &lt;code&gt;ground_run.gd&lt;/code&gt;).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — сбой сети: CF-1 возобновлён тем же исполнителем в той же копии (коммитов до сбоя не было).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — &lt;strong&gt;решения пользователя&lt;/strong&gt; (шлюз «управление крылом на земле»): (1) вариант В «гибрид» — стоя/шагом W/S шаг, A/D поворот, крыло — стрелки/мышь/стик; с Shift (разбег) W/S, A/D, стрелки, мышь — нос и крен как в воздухе, курс на бегу — от крена крыла; защёлку при отрыве убрать; (2) мышь по умолчанию — «трапеция», осмотреться — правая кнопка. Вписано в план; контракты С1 v2, С2 v2, К3 v3 (&lt;code&gt;docs/contracts/control-fix.md&lt;/code&gt;); контрактный тест v2 — вместе с CF-3. CF-3 — после CF-1.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — решение пользователя (через главную сессию): по умолчанию в полёте W — трапеция от себя (нос вверх), S — на себя, как у дельтапланериста; на разбеге с Shift — так же. Раскладку и её описания меняет модуль feature/ui-controls (&lt;code&gt;~/deltaplan-ui-controls&lt;/code&gt;, читает наш журнал и контракты, &lt;code&gt;ground_run.gd&lt;/code&gt; не трогает). CF-3 знак клавиш в наземную логику не закладывает: те же действия ввода «трапеция», что в полёте (С2 v2 уточнён). Порядок слияния в main: сначала control-fix, потом ui-controls.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — CF-1 промежуточно (4a7d7ea, ea37cfa): кода-регрессии на земле нет (headless v0.8.0 = 5f8990e = 1.0.0; «Славутич» 6 м/с — отрыв 2,3–2,6 с; ↓ даёт α 13,9° против 18,7°). Причина — GPU-поле воздуха у старта: на 1,5 м σw 0,4–1,05 м/с, направление ±90–180°, |ΔU| до 4 м/с за 0,5 с (в 551e79b σw 0,02, ±30°); появилось между 551e79b и 041d8ed (0d1ecf2 ни при чём). Следствие: отрыв порывом на 1,8 м, затем жёсткое касание; нос стоя качается −48…+40°. Передано главной сессии (зона модели воздуха — вероятный шлюз).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — от wing-physics-check (через главную сессию), передано CF-1: (1) &lt;code&gt;ground_run.gd:239–242&lt;/code&gt; предел бега v_cap = 6,5·(1+0,3·разгрузка), склон его не поднимает — в штиль на 1869 м не взлетают atlas (Vmin 34,9 км/ч) и часть спортивных (пилот: в штиль взлететь можно, разбег длиннее) — наша зона, проверить физику; (2) atlas: α срыва 12,6° &amp;lt; &lt;code&gt;launch.alpha_neutral_deg&lt;/code&gt; 16° — конфиг крыла правит wing-physics-check по нашему числу; (3) в поле воздуха две причины: турбулентность у старта (бисект CF-1) и ветер меню на краю области 38,4 км (над стартом 1,0–2,1 × меню) — отдельный шлюз пользователя.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — &lt;strong&gt;решение пользователя&lt;/strong&gt;: обе проблемы поля воздуха (порывы/разворот у земли и завышенный ветер над стартом) чинит модуль feature/air-start (&lt;code&gt;~/deltaplan-air-start&lt;/code&gt;). Мы поле не правим; CF-1 доводит бисект до коммита (файл:строка, числа) → главной сессии для air-start. Наше: CF-3 (вариант В), курс без инерции рыскания, тангаж стоя по мгновенному потоку, предел бега без склона, число для atlas &lt;code&gt;alpha_neutral&lt;/code&gt; (конфиг — через wing-physics-check).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — CF-3 запущен параллельно CF-1 (не ждём: главный приоритет — управление на земле); разделение по функциям &lt;code&gt;ground_run.gd&lt;/code&gt;, после приёмки CF-1 — &lt;code&gt;git merge feature/control-fix&lt;/code&gt; в cf3.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — пересечение с ui-controls: они меняют знак стика в &lt;code&gt;input_controller.gd::_apply_gamepad&lt;/code&gt; (&lt;code&gt;gy * inv&lt;/code&gt; → &lt;code&gt;-gy * inv&lt;/code&gt;), конфликт при слиянии — их координатор. CF-3 предупреждён: знак стика не трогать.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — CF-1, бисект поля GPU (d3f01bb, &lt;code&gt;docs/archive/plan/cf1_start/README.md&lt;/code&gt; → «Бисект поля GPU»): виновный &lt;strong&gt;4e71747&lt;/strong&gt; (AM-04, окна клипмапа 100/50 м у старта, &lt;code&gt;air_runtime.gd&lt;/code&gt;), усиление при 6 м/с — e674c49 (Б2). Механизм (по коду): старт внутри мелкого поля → &lt;code&gt;Atmosphere._air_velocity_field&lt;/code&gt; (atmosphere.gd:767–) с &lt;code&gt;FieldTurbulence.sigma&lt;/code&gt; (field_turbulence.gd:117–170) без гашения вертикали у земли (в аналитике × agl/60 м, atmosphere.gd:742–749). Меню 6 м/с: 551e79b σw 0,04, ±32° → 1.0.0 σw 1,05, w̄ 0,81, ±86°, max|ΔU|/0,5 с 3,98 (по подобию на 1,5 м ожидается σw ≈ 0,45). Регрессионный тест старта d2ca48c. Итог отправлен главной сессии для air-start.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — ui-controls готов (006edc5; W/↑ — от себя, S/↓ — на себя, стик вперёд — от себя, 7e65293). Их замечание передано CF-3: автопилот и тесты защёлки изображают W на земле как «шаг + на себя» — в CF-3 защёлку убрать, автопилот — через действия ввода, тесты не зависят от раскладки. Порядок слияния: control-fix → main, потом ui-controls.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — CF-1 принята и влита (1996fb7). CF-3 отчитался (3eca042, dd29607, 400a82a, 5c55f3f: базовый нос = &lt;code&gt;launch.alpha_neutral_deg&lt;/code&gt; (pitch 0; прежние +0,3 = +6° клали «Славутича» за срыв 21,4° — &lt;code&gt;weak_run&lt;/code&gt;/&lt;code&gt;nose_high&lt;/code&gt;), φ_max = &lt;code&gt;ground_bank.command_max_deg&lt;/code&gt; 15°, дуга на бегу a = a_кр + clamp(a_зад − a_кр, ±N/W·a_max)); ему отдано слияние &lt;code&gt;feature/control-fix&lt;/code&gt; и перевод тестов CF-1 на новое управление.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — координатор: &lt;code&gt;test_takeoff::test_crosswind_light_all_wings&lt;/code&gt; — принята поправка «пилот выравнивает креном руки» (решение пользователя — крен на земле в руках пилота); проверка без ввода остаётся в &lt;code&gt;test_ground_bank::test_light_crosswind_holds&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — CF-3 влил CF-1 (68272a0): тесты старта переведены на новое управление; таблица: «спорт» в штиль без ввода — взлёт 2,53 с / 12,9 м (было weak_run); прогон r3 — contracts 35/0, game 129/0, flight 120/1, start_ 14/0, bot 18/0, ui 84/1 (известные).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — отзыв пилота: отрыв по набору скорости (0 м в сильный ветер, ~10 м в штиль), «в программе на взлёт дано 2 с — это не так». Длина по модели с пилотом сходится; найдено в коде: срывы &lt;code&gt;weak_run&lt;/code&gt; по времени (&lt;code&gt;ground_run.gd:301&lt;/code&gt; — отпустил Shift после 0,5 с бега; &lt;code&gt;:303&lt;/code&gt; — 10 с бега). Решение координатора: убрать срывы по времени (К3 v3 уточнён, &lt;code&gt;weak_run&lt;/code&gt; убран), остановка бега — снова «стоит»; тест «штиль без бега 10 с — нет отрыва; с бегом — отрыв при V ≈ V_отр, время зависит от склона; отпустил Shift — срыва нет». Поручено CF-3 в той же ветке.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — координатор перепроверил CF-3 на 68272a0: contracts 35/0, game/ 129/0 (1 GPU пропущен), flight/ 83/1 (известное test_headwind_launch), start_ 14/0, bot 18/0, ui/ 78/1 (порт 8080); &lt;code&gt;cf3_ground_control&lt;/code&gt;: «Славутич» стоя α −4…+36° (нейтр. 16°), крен ±15,2° в штиль, ±7,5° при 6 м/с (N/W 0,32), поворот стоя 135° без крена — совпадает с отчётом. Вливание — после доп. задачи о срывах по времени.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — &lt;strong&gt;решение пользователя&lt;/strong&gt; (в план, п. 4): убрать все фиксированные времена старта и взлёта (grace_s, fail_time_s, таймеры фаз, защита после отрыва, таймеры автопилота/ботов на земле, подготовка/таймауты), заменить физическими условиями; антидребезг — только с обоснованием. Передано CF-3 вместе с проверкой правдоподобия разгона в штиль (пиковое ускорение, скорость отрыва, вклад ног/склона/крыла).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — CF-3: 5813996 — старт и взлёт без порогов по времени (срыв только &lt;code&gt;wingtip&lt;/code&gt; — консоль на земле; grace_s → «крыло несёт весь вес»; FlightStats — по высоте/удалению; автопилот без stand_s; тест &lt;code&gt;test_liftoff_physics&lt;/code&gt;). Ждём отчёт.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — wing-physics-check закрыт (6e6fa91): atlas &lt;code&gt;alpha_neutral_deg&lt;/code&gt; 16 → 8°, у 27 крыльев новые CL_max/α срыва, Vmin выше; порядок в main (предложение главной сессии): wing-physics-check → control-fix → ui-controls. CF-3 поручено влить &lt;code&gt;feature/wing-physics-check&lt;/code&gt; в cf3 (конфиги крыльев — в их пользу) и перегнать таблицу (+ crex3, she1, piuma, atlas, штиль на высоком старте) и тесты.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — CF-3: db91ccc (после отрыва пилот на ногах до &lt;code&gt;upright_clear_m&lt;/code&gt; 1,0 м — касание снова разбег, вместо grace_s; первая замена «L ≥ W» ломала посадку ударом), 0491ea7 (слияние wing-physics-check). Сбой сети — CF-3 возобновлён; wing-physics-check влит в main (ab89805) — CF-3 вливает main в cf3, перегоняет таблицу (7 крыльев + штиль на высоком старте) и тесты.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — CF-3 итог: 36bde4a (таблица, разгон), 8e66235 (слияние main с wing-physics-check). Порогов времени нет (таблица замен — в отчёте CF-3; оставлены только постоянные времени динамики, сваливание в воздухе, классификация итога, темп ботов). &lt;code&gt;upright_clear_m&lt;/code&gt; 1,0 м. &lt;code&gt;test_liftoff_physics&lt;/code&gt; 5/5: штиль без бега 10 с — 12/12 без отрыва; бег — отрыв при V = V_отр (учебное 7,58/7,62 м/с), время от склона: «спорт» 8° 6,76 с / 45 м, 17° 2,85 с / 15,8 м. Разгон в пределах физики (пик 6,4–7,1 м/с²: ноги 3,4–4,0 + склон 2,87; сопротивление −1…−2), не менялся. Таблица 7 крыльев × 0/3/6/10 + 1869 м — все взлетают (штиль 17°: 8,9–30 м, 1869 м: 12–39 м). Влито в feature/control-fix (bb4a665). Известное новое: &lt;code&gt;test_xc_bot::test_xc_bot_synthetic_10km&lt;/code&gt; падает и на чистом main ab89805 (по отчёту CF-3) — не наше.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — контракт К3 v3: &lt;code&gt;GroundRun.failure ∈ {wingtip, &amp;quot;&amp;quot;}&lt;/code&gt;, ключи времени убраны; start_fixes К3 помечен заменённым.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — координатор перепроверил после слияния bb4a665: contracts 40/0, flight/ 92/0, game/ 129/0 (1 GPU пропущен), start_ 14/0, liftoff_physics 5/0, bot 18/1 (&lt;code&gt;test_xc_bot_synthetic_10km&lt;/code&gt; — по CF-3 падает и на main ab89805), ui/ 78/1 (порт 8080). &lt;code&gt;cf3_ground_control&lt;/code&gt;: «Славутич» 6 м/с — отрыв 0,41 с, Δpitch/Δroll на отрыве 0; 1869 м штиль — все взлетают (12,2–32,4 м). Замечено: стоя при 6 м/с поворот на 52° бортом к ветру на склоне 17° → &lt;code&gt;wingtip&lt;/code&gt; (нижняя консоль поперёк крутого склона) — физика, вопрос для шлюза.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/control-fix/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/control-fix/</guid><description>&lt;h1 id="план-модуля-control-fix--регрессия-управления-на-старте-100"&gt;План модуля «control-fix» — регрессия управления на старте (1.0.0)&lt;a class="anchor" href="#%d0%bf%d0%bb%d0%b0%d0%bd-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8f-control-fix--%d1%80%d0%b5%d0%b3%d1%80%d0%b5%d1%81%d1%81%d0%b8%d1%8f-%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bd%d0%b0-%d1%81%d1%82%d0%b0%d1%80%d1%82%d0%b5-100" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Внутренний документ. Контракты — &lt;code&gt;docs/contracts/control-fix.md&lt;/code&gt;, журнал — &lt;code&gt;docs/archive/plan/control-fix-progress.md&lt;/code&gt;. Ветка &lt;code&gt;feature/control-fix&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-control-fix&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 3820bda = v1.0.0).&lt;/p&gt;&#10;&lt;h2 id="цель"&gt;Цель&lt;a class="anchor" href="#%d1%86%d0%b5%d0%bb%d1%8c" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Жалоба пилота на 1.0.0 (по смыслу): «что-то с управлением изменилось. Когда включаю игру, он сам начинает полёт — разбежаться не получается, ручку подтянуть, исправить крен на старте не получается… заваливается в крыло, падает. Мышью не корректирует положение носа и крена».&lt;/p&gt;&#10;&lt;p&gt;Симптомы:&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/flight/01-vzlet-v-silnyj-veter/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/flight/01-vzlet-v-silnyj-veter/</guid><description>&lt;h1 id="f01-срывы-взлёта-в-сильный-день"&gt;F01. Срывы взлёта в сильный день&lt;a class="anchor" href="#f01-%d1%81%d1%80%d1%8b%d0%b2%d1%8b-%d0%b2%d0%b7%d0%bb%d1%91%d1%82%d0%b0-%d0%b2-%d1%81%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d0%b4%d0%b5%d0%bd%d1%8c" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; понять и устранить срывы взлёта в сильный день при встречном ветре на старте: реальная ошибка физики/автопилота или ожидаемое поведение (тогда — понятная причина игроку и корректный тест).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; отчёт матрицы стабильности (tests/stability/): altai × kingpost × strong × into_site — takeoff_failed стабильно; aushkul × sport × strong и ongudai × sport × strong — нестабильно (флейки). docs/guide/flight.md (разбег, срывы: nose_high/nose_low/tailwind/crosswind/weak_run, «сильный ветер ≥ 8 м/с отрывает стоящего пилота — нужно опускать нос»), scripts/flight/flight_model.gd:390–394, scripts/flight/ground_run.gd, scripts/game/autopilot.gd, configs/weather/strong.json, configs/pilot.json → run.&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; scripts/flight/ (ground_run.gd, flight_model.gd — только разбег), scripts/game/autopilot.gd, configs/pilot.json → run, configs/flight.json → takeoff, tests/flight/.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/groups-top-level/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/groups-top-level/</guid><description>&lt;h1 id="план-группы-задач"&gt;План: группы задач&lt;a class="anchor" href="#%d0%bf%d0%bb%d0%b0%d0%bd-%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d1%8b-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Верхний уровень плана. Работа делится на &lt;strong&gt;группы&lt;/strong&gt; (области кода). Для каждой группы отдельный&#10;планировщик пишет карточки задач в &lt;code&gt;docs/plan/&amp;lt;папка группы&amp;gt;/NN-кратко.md&lt;/code&gt; (цель, контекст, владения,&#10;шаги, критерий приёмки, модель, размер S/M/L, закрываемые требования).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Объём плана — доделать основу:&lt;/strong&gt; все открытые пункты TODO.md и требования REQUIREMENTS.md, &lt;strong&gt;кроме&lt;/strong&gt;&#10;разделов TODO «Идеи», «Позже», «Места» (новые места), требований «Позже»/«на будущее»/«далёкое будущее»&#10;(VR-23…VR-30, FR-14c, сменные вариометры FR-25a, английский NFR-4) и явно отложенного пользователем&#10;(слабое железо/Compatibility, CI, поломка крыла, настоящая аэродинамика, аэробуксировка). Вех «показа» нет:&#10;после выполнения пользователь сам всё посмотрит и попробует (только Linux; Windows-сборка — позже).&#10;Разделы «Вопросы пилотам» — открытые вопросы из questions.md: ответы поправят конфиги, но работу не блокируют.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/heat-ca-prototype/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/heat-ca-prototype/</guid><description>&lt;h1 id="прототип-клеточный-автомат-тепла-и-массы-2d-разрез-хребта"&gt;Прототип: клеточный автомат тепла и массы (2D-разрез хребта)&lt;a class="anchor" href="#%d0%bf%d1%80%d0%be%d1%82%d0%be%d1%82%d0%b8%d0%bf-%d0%ba%d0%bb%d0%b5%d1%82%d0%be%d1%87%d0%bd%d1%8b%d0%b9-%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82-%d1%82%d0%b5%d0%bf%d0%bb%d0%b0-%d0%b8-%d0%bc%d0%b0%d1%81%d1%81%d1%8b-2d-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d0%b7-%d1%85%d1%80%d0%b5%d0%b1%d1%82%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Статус: задача на прототип (29.09.2026), игру не трогает. Цель — проверить идею пользователя: вместо поля ветра «сразу» — клетки, которые обмениваются теплом и массой с соседями (как «Жизнь», как газы в Oxygen Not Included), и посмотреть, что куда течёт над прогретым склоном. Связь с планом поля ветра — docs/plan/wind_field.md, исследование — docs/research/slope_wind.md.&lt;/p&gt;&#10;&lt;h2 id="идея-слова-пользователя"&gt;Идея (слова пользователя)&lt;a class="anchor" href="#%d0%b8%d0%b4%d0%b5%d1%8f-%d1%81%d0%bb%d0%be%d0%b2%d0%b0-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Горячая клетка отдаёт немного тепла соседям вбок и вверх, вверх — больше (тепло поднимается). Тепло уносит массу: у клетки массы становится меньше, и она по тому же правилу подсасывает массу из соседних холодных клеток. Итог — втекание холодного воздуха в прогретую зону снизу и течение массы вверх.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/models/01-poza-stoya-i-variometr/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/models/01-poza-stoya-i-variometr/</guid><description>&lt;h1 id="m01-поза-стоя-на-старте-и-вариометр-90-х-в-поле-зрения"&gt;M01. Поза «стоя» на старте и вариометр 90-х в поле зрения&lt;a class="anchor" href="#m01-%d0%bf%d0%be%d0%b7%d0%b0-%d1%81%d1%82%d0%be%d1%8f-%d0%bd%d0%b0-%d1%81%d1%82%d0%b0%d1%80%d1%82%d0%b5-%d0%b8-%d0%b2%d0%b0%d1%80%d0%b8%d0%be%d0%bc%d0%b5%d1%82%d1%80-90-%d1%85-%d0%b2-%d0%bf%d0%be%d0%bb%d0%b5-%d0%b7%d1%80%d0%b5%d0%bd%d0%b8%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; на старте пилот стоит вертикально (вид вниз — ноги, ботинки, руки на стойках), вариометр 90-х виден при взгляде вниз-влево.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/screenshots/cockpit/README.md (кадры DS, DF — дефекты), docs/guide/models.md («Пилот», маркеры), scripts/flight/glider_visual.gd (&lt;code&gt;_ground_pose&lt;/code&gt;), scripts/game/pilot_animator.gd (как включается анимация stand), tools/blender/build_gliders.py, tools/shots/cockpit.sh.&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; scripts/flight/glider_visual.gd, tools/blender/ (build_gliders.py и параметры), assets/models/glider_&lt;em&gt;.glb, assets/source/glider_&lt;/em&gt;, docs/guide/models.md, tests/flight/ (новый тест позы).&lt;/p&gt;&#10;&lt;h2 id="дефекты-из-приёмки-кабины"&gt;Дефекты (из приёмки кабины)&lt;a class="anchor" href="#%d0%b4%d0%b5%d1%84%d0%b5%d0%ba%d1%82%d1%8b-%d0%b8%d0%b7-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8-%d0%ba%d0%b0%d0%b1%d0%b8%d0%bd%d1%8b" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;DS:&lt;/strong&gt; стоя пилот лежит почти горизонтально — &lt;code&gt;glider_visual._ground_pose&lt;/code&gt; поворачивает модель на 90° поверх анимации &lt;code&gt;stand&lt;/code&gt; (двойной поворот). Анимация stand уже ставит тело вертикально — поворот в &lt;code&gt;_ground_pose&lt;/code&gt; нужно убрать (оставить только смещение по крену и положение ног на земле).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;DF:&lt;/strong&gt; вариометр 90-х не виден при взгляде вниз (0°, −60°): маркер &lt;code&gt;VarioMount&lt;/code&gt; на уровне глаз в ~75° влево, циферблат смотрит вбок. Перенести маркер к нижнему углу левой стойки (у базовой штанги, ~20–30 см выше неё), −Z экрана — на глаза пилота в полёте лёжа. Перегенерировать 3 крыла (имена нод не менять).&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;tools/shots/cockpit.sh&lt;/code&gt; (под timeout): кадр DS у всех 3 крыльев — видны ноги/ботинки и руки на стойках, тело вертикально; кадр DF (0°, −60°) — видны и планшет, и вариометр 90-х, цифры обоих читаются.&lt;/li&gt;&#10;&lt;li&gt;Тест: на земле в фазе standing ось тела пилота отклонена от вертикали &amp;lt; 20°; в полёте — горизонтально (prone).&lt;/li&gt;&#10;&lt;li&gt;Тесты flight и game зелёные, lint чисто, check_models (scenes/models_preview/check_models.gd) — OK.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Модель:&lt;/strong&gt; opus. &lt;strong&gt;Размер:&lt;/strong&gt; S.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/sf4_wing_clearance/after_sf3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/sf4_wing_clearance/after_sf3/</guid><description>&lt;h1 id="зазор-крыла-над-рельефом-после-sf-3--sf-4"&gt;Зазор крыла над рельефом после SF-3 + SF-4&lt;a class="anchor" href="#%d0%b7%d0%b0%d0%b7%d0%be%d1%80-%d0%ba%d1%80%d1%8b%d0%bb%d0%b0-%d0%bd%d0%b0%d0%b4-%d1%80%d0%b5%d0%bb%d1%8c%d0%b5%d1%84%d0%be%d0%bc-%d0%bf%d0%be%d1%81%d0%bb%d0%b5-sf-3--sf-4" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Прогон: &lt;code&gt;XDG_DATA_HOME=$(mktemp -d) godot --headless --path . res://tools/flight/wing_clearance_run.tscn -- --csv=res://docs/plan/sf4_wing_clearance/after_sf3.csv --loc-wings=sport,magic&lt;/code&gt; (синтетика — все крылья, старты локаций — sport и magic). Штиль. Худшее крыло по (старт, фаза). «По рисуемой сетке» — против рельефа, как его рисуют треугольники (только локации).&lt;/p&gt;&#10;&lt;p&gt;Все старты локаций, крен 0, стоит/шагом/разбег с нейтральной трапецией: наименьший зазор по рисуемой сетке 0,58 м (altai/sinyukha_west, разбег) — ≥ 0, рельеф не трогаем.&#10;Отрицательный зазор — только (а) косой склон / разворот поперёк склона (разбег с зажатой A по дуге уходит поперёк склона — верхняя консоль в склоне, правда жизни), (б) после отрыва с зажатой A — крен от ввода в воздухе 39°.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/sf4_wing_clearance/table/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/sf4_wing_clearance/table/</guid><description>&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;старт&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;фаза&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;уклон по курсу/поперёк, °&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;до: крен&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;тангаж&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;зазор, м (часть, крыло)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;без крена&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;вокруг HangPoint&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;по рисуемой сетке&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;после: крен&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;тангаж&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;зазор&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ровно&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.72&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ровно&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, трапеция от себя (нос вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;37.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.55 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.55&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.84&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;37.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.55 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ровно&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, трапеция на себя (нос вниз)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.35 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.35&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.35&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.35 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ровно&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, A (крен от A/D)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-17.9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.20 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.02&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-17.9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.20 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ровно&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;шагом&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.72&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ровно&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;разбег&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.72&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;склон 20° по курсу&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.58 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.58&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.88&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;склон 20° по курсу&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, трапеция от себя (нос вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;37.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.56 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.56&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.28&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.58 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;склон 20° по курсу&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, трапеция на себя (нос вниз)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.63&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-24.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.37 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;склон 20° по курсу&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, A (крен от A/D)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-3 / -20&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-17.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-2.20 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.56&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-1.79&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-17.4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11.9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-2.02 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;склон 20° по курсу&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;шагом&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.58 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.58&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.63&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;склон 20° по курсу&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;разбег&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;15.5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.66 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.66&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;склон 20° по курсу&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;после отрыва ≤1,5 с&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.63&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;косой 15° (правая вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;косой 15° (правая вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, трапеция от себя (нос вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;37.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.83 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.83&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.43&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;37.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.83 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;косой 15° (правая вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, трапеция на себя (нос вниз)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.12 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.12 frame target&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;косой 15° (правая вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, A (крен от A/D)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-11 / -11&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-17.9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-1.55 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.04&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-1.15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-17.9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4.4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-1.19 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;косой 15° (правая вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;шагом&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;косой 15° (правая вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;разбег&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 / 15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.03 tips combat&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;altai/sinyukha_west&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-15 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.93 frame sport&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.93&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.22&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.83&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;altai/sinyukha_west&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, трапеция от себя (нос вверх)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-15 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;37.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.46 tips magic&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.46&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.05&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;altai/sinyukha_west&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, трапеция на себя (нос вниз)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-15 / 0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-3.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.71 frame sport&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.71&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.61&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;altai/sinyukha_west&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;стоит, A (крен от A/D)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-3 / -15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-17.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;17.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-1.08 tips sport&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.53&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-0.76&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-1.08&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;altai/sinyukha_west&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;шагом&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / -1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.72 frame training&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.72&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.68&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.64&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;altai/sinyukha_west&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;разбег&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / -5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.57 frame training&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.57&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.44&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.57&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;altai/sinyukha_west&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;после отрыва ≤1,5 с&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-20 / -5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-4.3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.57 frame training&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.57&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.52&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.56&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/site-update-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/site-update-progress/</guid><description>&lt;h1 id="журнал-обновление-сайта-октябрь-2026"&gt;Журнал: обновление сайта (октябрь 2026)&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%81%d0%b0%d0%b9%d1%82%d0%b0-%d0%be%d0%ba%d1%82%d1%8f%d0%b1%d1%80%d1%8c-2026" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Координатор: dp-coordinator (сессия 01K4ZH58…). Рабочая копия &lt;code&gt;~/deltaplan-site&lt;/code&gt;, ветка &lt;code&gt;site/update-oct&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 3cc039e). В &lt;code&gt;main&lt;/code&gt; не вливается — отчёт главной сессии. План и контракты — &lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/site-update/"&gt;site_update.md&lt;/a&gt;.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Задача&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Статус&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Исполнитель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Копия / ветка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Коммиты, числа, заметки&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Контракты C1–C3 v1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;готово&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;координатор&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;docs/archive/plan/site-update.md&lt;/code&gt;, тест &lt;code&gt;tools/site/check_contracts.py&lt;/code&gt; (до работ: C1, C3 красные — файлов ещё нет)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SU-1 скриншоты&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-mechanic (Haiku) + координатор&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;e43260d, e552ba1 (исполнитель), e466e36 выбор кадров (координатор), слияние a879c24. &lt;code&gt;docs/screenshots/gameplay/*&lt;/code&gt; пересняты; &lt;code&gt;docs/screenshots/site/01–08&lt;/code&gt; (термик ×2, разбег, у облаков, 4 крыла сзади), 66–305 КБ; C3 зелёный. &lt;strong&gt;e2e не переснят&lt;/strong&gt;: &lt;code&gt;tools/shots/e2e.sh&lt;/code&gt; на всех 4 местах — «e2e_shot: FAIL (мир за меню не загрузился)», повтор Онгудая — то же; старые &lt;code&gt;docs/screenshots/e2e/*.jpg&lt;/code&gt; оставлены (открытый вопрос главной сессии — поломка инструмента вне сайта)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SU-2 модель воздуха&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-writer (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4c50982, слияние 7ae3106. &lt;code&gt;mechanics/air-model.md&lt;/code&gt; переписана как сделанное (что умеет / на чём основано: физика, Askervein, Perdigão, калибровка / границы / известные расхождения (а), (б) / подробнее), 6 картинок из &lt;code&gt;tools/research/*/out&lt;/code&gt;; минимальные правки «план → сделано» в &lt;code&gt;slope-wind&lt;/code&gt;, &lt;code&gt;thermals&lt;/code&gt;, &lt;code&gt;weather&lt;/code&gt;, строка на главной. Числа — с источником на каждое (отчёт исполнителя), выборочно сверены с &lt;code&gt;docs/guide/air-model.md&lt;/code&gt; (0,61/0,82, 0,59/0,88, −13,0…→−0,9…, 1,001). Hugo без WARN/ERROR&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SU-3 рендеры крыльев&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-mechanic (Haiku)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;277f932, слияние f2e13a1. &lt;code&gt;tools/blender/render_wings_site.sh&lt;/code&gt; + &lt;code&gt;wings_site_jpg.py&lt;/code&gt; (обрезка по содержимому, поле 3,5 %), лист-контакт &lt;code&gt;tools/site/create_contact_sheet.py&lt;/code&gt;. 48 jpg, 41–59 КБ, всего 2,37 МБ; ~12 мин в 4 потока. C1 зелёный (перепроверено)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SU-4 генератор страниц&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;46a8415, cf234b3 (без столбца «Мачта» в группах), слияние e050c2f. &lt;code&gt;tools/site/gen_wings.py&lt;/code&gt;: раздел + 4 группы + 48 страниц (53 файла); отметки: паспорт 285, аналог 5 (laminar), оценка 467 (из них 336 — числа модели игры). Перепроверено: &lt;code&gt;--check&lt;/code&gt; rc 0, &lt;code&gt;check_contracts.py&lt;/code&gt; C1–C3 зелёные, hugo 248 страниц без WARN/ERROR. Скриншоты &lt;code&gt;build/screenshots/site/SU-4/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SU-5 тексты раздела и картинки&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-writer (Sonnet) + координатор&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;232ffb2 (исполнитель), 7af96eb (координатор: тексты групп по диапазонам всех крыльев группы из &lt;code&gt;configs/wings&lt;/code&gt;, а не по старым девяти; вводная «Линейки крыльев»), слияние 179ce3c. Главная: пункт и раздел «Модели аппаратов», 6 новых кадров; &lt;code&gt;flight.md&lt;/code&gt;: 48 крыльев, 2 кадра вместо рендера Laminar. C1–C3 зелёные, &lt;code&gt;--check&lt;/code&gt; rc 0, hugo без WARN/ERROR. Скриншоты &lt;code&gt;build/screenshots/site/SU-5/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="развилки-развилка--решение--почему"&gt;Развилки (развилка → решение → почему)&lt;a class="anchor" href="#%d1%80%d0%b0%d0%b7%d0%b2%d0%b8%d0%bb%d0%ba%d0%b8-%d1%80%d0%b0%d0%b7%d0%b2%d0%b8%d0%bb%d0%ba%d0%b0--%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d0%b5--%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Рендер «из .blend» → рендерим &lt;code&gt;.glb&lt;/code&gt;, экспортированный из того же &lt;code&gt;.blend&lt;/code&gt;, готовым &lt;code&gt;tools/blender/render_views.py&lt;/code&gt; (вид iso45) → та же геометрия, что в игре, единые камера/свет/фон уже есть; свой скрипт рендера &lt;code&gt;.blend&lt;/code&gt; не нужен.&lt;/li&gt;&#10;&lt;li&gt;Ракурс → iso45 (сверху-сбоку 3/4), крыло вписано в кадр → видны план крыла, рисунок паруса и трапеция; under34 пробовали (снизу) — хуже читается форма. Размеры — в таблице, не масштабом картинки.&lt;/li&gt;&#10;&lt;li&gt;Где лежат рендеры → &lt;code&gt;docs/models/screenshots/glider_&amp;lt;id&amp;gt;/iso45.jpg&lt;/code&gt; рядом с прочими рендерами моделей → один каталог рендеров на репозиторий, на сайт публикуется по ссылке (assets/repo).&lt;/li&gt;&#10;&lt;li&gt;Где лежат новые кадры сайта → старые кадры &lt;code&gt;docs/screenshots/{gameplay,e2e}&lt;/code&gt; обновить на месте, новые — &lt;code&gt;docs/screenshots/site/&lt;/code&gt;; скриншоты версий (&lt;code&gt;site/content/releases/*&lt;/code&gt;) не трогать → это история версий.&lt;/li&gt;&#10;&lt;li&gt;Контракты → раздел плана (а не &lt;code&gt;docs/site_update_contracts.md&lt;/code&gt;) → &lt;code&gt;docs/*.md&lt;/code&gt; публикуется в «Документации модулей», служебному там не место.&lt;/li&gt;&#10;&lt;li&gt;Нижняя граница 40 КБ в C1 заставила исполнителя SU-3 уменьшить поле с 5 до 3,5 % → принять как есть → граница была лишней, разница косметическая (не шлифовать).&lt;/li&gt;&#10;&lt;li&gt;SU-1: исполнитель (Haiku) сдал без кадров 06–10 и не отвечал на доработку; кадры itch &lt;code&gt;chase&lt;/code&gt; не показывают крыло игрока (камера не на нём), &lt;code&gt;launch&lt;/code&gt; — крыльев на склоне не видно → кадры крыльев сзади добрал координатор командой gameplay.sh (main.tscn &lt;code&gt;--camera=chase --wing=&amp;lt;id&amp;gt;&lt;/code&gt;), из itch взяты gaggle_1, gaggle_3, high_0, run_0 → быстрее, чем новый исполнитель на 4 запуска.&lt;/li&gt;&#10;&lt;li&gt;SU-4: ссылки на отдельные карточки DHV → только номер + ссылка на поиск портала DHV → адресов карточек в данных нет, не выдумываем; открытый вопрос: сохранять URL карточки в &lt;code&gt;consolidate.py&lt;/code&gt; (C2 v2).&lt;/li&gt;&#10;&lt;li&gt;SU-4: ссылка на благодарность DHV на главной → сырой HTML с относительным путём &lt;code&gt;../../../#благодарности&lt;/code&gt; → обработчик ссылок сайта не умеет «/#якорь»; доработка &lt;code&gt;resolve.html&lt;/code&gt; — открытый вопрос.&lt;/li&gt;&#10;&lt;li&gt;SU-4: «масса пилота» из DHV «Startgewicht» минус масса крыла → отметка «оценка» → смысл не совпадает с hook-in производителя.&lt;/li&gt;&#10;&lt;li&gt;SU-4: сводные таблицы шире колонки → в группах убран столбец «Мачта» (внутри группы одинаков), в сводной раздела — оставлен с прокруткой → 2 попытки исполнителя + одна правка, дальше не шлифуем.&lt;/li&gt;&#10;&lt;li&gt;SU-5 запущен до приёма SU-2 → SU-5 не трогает страницы SU-2 (&lt;code&gt;air-model&lt;/code&gt;, &lt;code&gt;slope-wind&lt;/code&gt;, &lt;code&gt;thermals&lt;/code&gt;, &lt;code&gt;weather&lt;/code&gt;, &lt;code&gt;visual-cues&lt;/code&gt;, строка «Модель воздуха» на главной) → не ждать, конфликтов нет.&lt;/li&gt;&#10;&lt;li&gt;Тексты и генерация в одном &lt;code&gt;_index.md&lt;/code&gt; → генератор пишет только между маркерами &lt;code&gt;gen:begin/gen:end&lt;/code&gt; → писатель и генератор не мешают друг другу.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="итог-0110"&gt;Итог (01.10)&lt;a class="anchor" href="#%d0%b8%d1%82%d0%be%d0%b3-0110" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Все задачи приняты и влиты в &lt;code&gt;site/update-oct&lt;/code&gt; (7ae3106 + журнал). &lt;code&gt;check_contracts.py&lt;/code&gt; — C1, C2, C3 зелёные; &lt;code&gt;hugo --minify&lt;/code&gt; — 248 страниц без WARN/ERROR. Скриншоты собранного сайта (сборка с &lt;code&gt;baseURL file://&lt;/code&gt; в &lt;code&gt;build/site_preview/&lt;/code&gt;) — &lt;code&gt;build/screenshots/site/итог/&lt;/code&gt;. В &lt;code&gt;main&lt;/code&gt; не вливалось — ждёт решения главной сессии / пользователя.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/site-update/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/site-update/</guid><description>&lt;h1 id="план-обновление-сайта-октябрь-2026"&gt;План: обновление сайта (октябрь 2026)&lt;a class="anchor" href="#%d0%bf%d0%bb%d0%b0%d0%bd-%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%81%d0%b0%d0%b9%d1%82%d0%b0-%d0%be%d0%ba%d1%82%d1%8f%d0%b1%d1%80%d1%8c-2026" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Координатор: dp-coordinator. Рабочая копия &lt;code&gt;~/deltaplan-site&lt;/code&gt;, ветка &lt;code&gt;site/update-oct&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 3cc039e). В &lt;code&gt;main&lt;/code&gt; не вливается — отчёт главной сессии. Журнал — &lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/site-update-progress/"&gt;site_update_progress.md&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="цель-задачи-пользователя"&gt;Цель (задачи пользователя)&lt;a class="anchor" href="#%d1%86%d0%b5%d0%bb%d1%8c-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%b8-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Новые скриншоты сайта&lt;/strong&gt; — графика поменялась (48 крыльев, новые модели), пересняты готовыми инструментами &lt;code&gt;tools/shots&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Модель воздуха на сайте&lt;/strong&gt; — из «плана» в «сделано»: что умеет, на чём основано (Perdigão, Askervein и др.), границы модели и известные расхождения. Язык — для пилотов, числа — только из репозитория.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Новый раздел «Модели аппаратов»&lt;/strong&gt; — подстраницы по группам (советские, учебные, мачтовые, безмачтовые), на каждое крыло — рендер модели из Blender (единый ракурс и фон), известные данные с источником и отметкой «паспорт / оценка». Таблицы и страницы — генерирует скрипт из данных репозитория. Ссылка на благодарность DHV.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Правила — &lt;code&gt;.claude/workflow.md&lt;/code&gt;, «Общие правила». Hugo собирается без ошибок и предупреждений. Картинки — jpg разумного размера (рендер крыла 40–250 КБ).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/start-fixes-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/start-fixes-progress/</guid><description>&lt;h1 id="журнал-модуля-start-fixes"&gt;Журнал модуля «start-fixes»&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8f-start-fixes" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;План — &lt;code&gt;docs/archive/plan/start-fixes.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/start-fixes.md&lt;/code&gt;. Ветка &lt;code&gt;feature/start-fixes&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-start&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="решения"&gt;Решения&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;30.09 — план и контракты К1–К4 v1, контрактный тест &lt;code&gt;tests/game/test_start_fixes_contracts.gd&lt;/code&gt; (4/4 ок).&lt;/li&gt;&#10;&lt;li&gt;30.09 — решение пользователя (через главную сессию): радиус пустыря ≥ 2× длины разбега; тест проверяет отсутствие деревьев и кустов в этом радиусе. Вписано в план (решения, SF-1).&lt;/li&gt;&#10;&lt;li&gt;30.09 — координатор: L_run — разбег в штиль на склоне &lt;code&gt;min_slope_deg&lt;/code&gt; для самого «длинного» крыла линейки; встроенные старты — &lt;code&gt;max(start_clearing_radius_m, R)&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;30.09 — координатор: задача «пилот на земле» разделена на SF-3 (рука пилота, крен, дуга, переход) и SF-4 (причина касания крылом), параллельно; стык в &lt;code&gt;ground_run.gd&lt;/code&gt; — по разным функциям.&lt;/li&gt;&#10;&lt;li&gt;30.09 — решение пользователя: SF-4 передаётся исполнителю SF-3 (один исполнитель на связанные задачи); SF-4 коммитит находки в &lt;code&gt;start/sf4&lt;/code&gt; и останавливается, SF-3 вливает &lt;code&gt;start/sf4&lt;/code&gt; и сдаёт обе по общим условиям приёмки; копия sf4 — удалить после слияния. Вписано в план (решение 4).&lt;/li&gt;&#10;&lt;li&gt;30.09 — решение пользователя: пустырь = только убрать деревья; траву, кусты и прочее не убирать. Новая поляна — FOREST → GRASS, SHRUB не трогается; приёмка — нет деревьев в R, трава на месте, проверка координатором по скриншоту. Отправлено исполнителю SF-1. В плане — решение 5.&lt;/li&gt;&#10;&lt;li&gt;30.09 — координатор по находкам SF-4: (д) рельеф не трогаем, не шлюз, если на всех стартах локаций при крене 0 (стоит/шагом/разбег, трапеция нейтрально) зазор по видимой земле ≥ 0; иначе — шлюз. Тело пилота стоя вертикально — визуально в &lt;code&gt;GliderVisual._ground_pose&lt;/code&gt;, К4 остаётся v1. &lt;code&gt;reset_on_ground&lt;/code&gt; — начальный тангаж = установившийся стоя. Всё передано SF-3.&lt;/li&gt;&#10;&lt;li&gt;30.09 — &lt;code&gt;test_takeoff::test_headwind_launch&lt;/code&gt; (atlas, nose_high) падает уже на базе 6f34786 (= main 113878d + документы) — не регрессия модуля; сообщить главной сессии.&lt;/li&gt;&#10;&lt;li&gt;30.09 — SF-3 промежуточно: порог бокового ветра стоя (sport, встречный 4, нос нейтрально) 1,90 м/с; при встречном 6 м/с — 0,6–1,0 м/с (нос на 10° ниже — ≈2 м/с): ноги разгружены, рука слабеет. Физика, не шлюз — находка для пользователя.&lt;/li&gt;&#10;&lt;li&gt;30.09 — К4: тангаж стоя теперь от склона, тело пилота вертикально визуально; смысл theta/basis/ось поворота не изменились — К4 остаётся v1 (уточнение в контракте).&lt;/li&gt;&#10;&lt;li&gt;30.09 — ответы пользователя: (1) коридор разбега для старта с карты — нет, кусты остаются (направление разбега заранее неизвестно — при боковом ветре бегут вдоль склона), К1 не меняется; (2) отдельной задачи по &lt;code&gt;test_headwind_launch&lt;/code&gt; (atlas) — нет. В плане — решения 6, 7.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="задачи"&gt;Задачи&lt;a class="anchor" href="#%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Задача&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Статус&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Исполнитель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Копия / ветка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Коммиты&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Числа / решения&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SF-1 Пустырь&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;принята&lt;/strong&gt; (30.09)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6db17c5, dbdbf59; слияние a85f78d&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;К1 v2: &lt;code&gt;Terrain.add_start_clearing(x, z, r)&lt;/code&gt; синхронный, &lt;code&gt;surface_revision&lt;/code&gt;, &lt;code&gt;get_start_clearings()&lt;/code&gt;, &lt;code&gt;TerrainRenderer.refresh_surface&lt;/code&gt;; только FOREST → GRASS (кусты/трава/камни остаются). L_run (штиль, 12°): sport 71,9 м / combat 69,9 м (weak_run за 10 с), остальные 13–18 м, atlas — nose_high 1,2 с → R = 160 м (2×71,9 = 144, запас 10 %); встроенные старты: 70 м лес+кусты как было, до 160 м — только лес. Поляна 0,3–0,4 мс (карта), 5–10 мс (Онгудай с маской). Перепроверено: start_ 13/13, vegetation 21/21, game 116/116, terrain 62/63 (&lt;code&gt;test_forest_mask_loaded&lt;/code&gt; 0,61 с &amp;gt; 0,5 — порог времени, падает и без задачи). Скриншоты: трава на поляне есть, деревьев нет; кусты стоят на пути разбега — вопрос пользователю&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SF-2 Трава в лесу&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;принята&lt;/strong&gt; (30.09)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8e97c1a, c7910e9; слияние 0f7b4b7&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;К2 v2: &lt;code&gt;forest_density&lt;/code&gt;=0,4, &lt;code&gt;forest_height_m&lt;/code&gt;=[0,12; 0,35], &lt;code&gt;forest_shade&lt;/code&gt;=0,8 (тень полога); GPU кадра в лесу 5,46→5,63 мс (+3,0 %, p10 +4,6 %); тесты grass 8/8, vegetation 21/21, контракты 4/4 (перепроверено); &lt;code&gt;test_surface::test_forest_mask_loaded&lt;/code&gt; падает по порогу времени и до правок — не регрессия&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SF-3 Рука пилота (+SF-4)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;принята&lt;/strong&gt; (30.09)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;копия удалена, ветки &lt;code&gt;start/sf3&lt;/code&gt;, &lt;code&gt;start/sf4&lt;/code&gt; удалены&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;800b84e, 3384aa8, 5f8990e (+ SF-4 143c4b7, 3707069); слияние f6db4cc&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;К3 v2 (новые ключи ground_bank, run.turn_accel_max_ms2); перепроверено: стоя с A/D крен 0,000°; боковой 2,5+встречный 4 — крен при N/W&amp;gt;0,5 ≤ 0,94°, на отрыве 6,5–10° (физика); порог порыва стоя (sport, встречный 4) 1,90 м/с: ×1,2 → crosswind 10,15 с, ×2 → 3,55 с, ×0,8 держит (1,56°); дуга R/R_min 1,000 (29,6 м на 7,7 м/с); отрыв Δкрен 0,002°, Δp 0,25°/с; I = 396 кг·м², предел 200/100/0 Н·м; косой 15° — 0,0000°; зазор крыла ≥ 0,35 м (синтетика), по 10 стартам локаций ≥ 0,58 м — шлюза нет; flight 112/113 (test_headwind_launch — известное, решение 7), game 116/116, start_ 13/13. К4 — уточнение без смены версии&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SF-4 Касание крылом&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;принята в составе SF-3&lt;/strong&gt; (30.09)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;143c4b7 (замер, тест), 3707069 (тангаж стоя)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Причины: (а) крен от A/D — главная на ровном (−17,9° → консоль −0,20 м; склон 20° с A −2,2 м) → уберёт SF-3; (б) тангаж стоя от горизонта — склон 20°, трапеция от себя −0,56 м → исправлено (после +0,58 м); (в) ось поворота, (г) подвеска/сглаживание — не причины; (д) рельеф треугольниками 25 м против билинейной высоты — видимая земля до 0,32 м выше (1 старт). Без крена на ровном зазор ≥ 0,35 м. Тест &lt;code&gt;test_wing_clearance&lt;/code&gt; (9 крыльев, ≥ 0,3 м)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="состояние-3009-все-задачи-приняты-ниже--исторический-план-продолжения"&gt;Состояние (30.09): все задачи приняты; ниже — исторический план продолжения&lt;a class="anchor" href="#%d1%81%d0%be%d1%81%d1%82%d0%be%d1%8f%d0%bd%d0%b8%d0%b5-3009-%d0%b2%d1%81%d0%b5-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%b8-%d0%bf%d1%80%d0%b8%d0%bd%d1%8f%d1%82%d1%8b-%d0%bd%d0%b8%d0%b6%d0%b5--%d0%b8%d1%81%d1%82%d0%be%d1%80%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b9-%d0%bf%d0%bb%d0%b0%d0%bd-%d0%bf%d1%80%d0%be%d0%b4%d0%be%d0%bb%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SF-1, SF-2 — приняты и влиты. SF-4 — остановлена, передана SF-3 (ветка &lt;code&gt;start/sf4&lt;/code&gt; ещё не влита — её вливает исполнитель SF-3 в &lt;code&gt;start/sf3&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;SF-3 (+SF-4) — исполнитель работает в &lt;code&gt;~/deltaplan-start-sf3&lt;/code&gt; / &lt;code&gt;start/sf3&lt;/code&gt; (промежуточный коммит 800b84e). Задание дополнено: влить &lt;code&gt;start/sf4&lt;/code&gt; и &lt;code&gt;feature/start-fixes&lt;/code&gt;; прогнать &lt;code&gt;wing_clearance_run&lt;/code&gt; по стартам локаций (зазор по видимой земле ≥ 0 при крене 0, иначе шлюз); тело пилота стоя вертикально визуально (К4 v1); &lt;code&gt;reset_on_ground&lt;/code&gt; — тангаж стоя; раздел «Поза крыла на земле» в &lt;code&gt;docs/guide/flight.md&lt;/code&gt;; кадры в &lt;code&gt;build/screenshots/sf3_ruka_pilota/&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Приёмка SF-3+SF-4: условия SF-3 (1–7) и SF-4 (1–4) плана; перепроверить &lt;code&gt;--filter=flight&lt;/code&gt;, &lt;code&gt;game&lt;/code&gt;, &lt;code&gt;start_&lt;/code&gt;, &lt;code&gt;test_wing_clearance&lt;/code&gt;; влить &lt;code&gt;start/sf3&lt;/code&gt; (и через неё &lt;code&gt;start/sf4&lt;/code&gt;), удалить копию sf3 и ветки &lt;code&gt;start/sf3&lt;/code&gt;, &lt;code&gt;start/sf4&lt;/code&gt;; отметить в TODO пункт «Пилот на земле…» и подпункты, CHANGELOG «В работе».&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/start-fixes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/start-fixes/</guid><description>&lt;h1 id="модуль-start-fixes--фиксы-старта-с-земли"&gt;Модуль «start-fixes» — фиксы старта с земли&lt;a class="anchor" href="#%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8c-start-fixes--%d1%84%d0%b8%d0%ba%d1%81%d1%8b-%d1%81%d1%82%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%b7%d0%b5%d0%bc%d0%bb%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Ветка &lt;code&gt;feature/start-fixes&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; @ 113878d), копия &lt;code&gt;~/deltaplan-start&lt;/code&gt;. Журнал — &lt;code&gt;docs/archive/plan/start-fixes-progress.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/start-fixes.md&lt;/code&gt; (+ &lt;code&gt;tests/game/test_start_fixes_contracts.gd&lt;/code&gt;).&#10;Источник — TODO.md, строки 22–28 (отзыв пользователя 30.09.2026).&lt;/p&gt;&#10;&lt;h2 id="цель"&gt;Цель&lt;a class="anchor" href="#%d1%86%d0%b5%d0%bb%d1%8c" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Старт с земли в любой точке карты должен быть возможен и выглядеть правдой: вокруг старта нет леса и кустов; под деревьями растёт трава; пилот с крылом на земле стоит ровно по горизонту, крен держит «рука пилота» с физически ограниченной силой, переход в полёт без рывка; крыло не проходит сквозь землю на ровном старте.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/tasks/README/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/tasks/README/</guid><description>&lt;h1 id="группа-10--задания-тренировки-рекорды-tasks"&gt;Группа 10 — Задания, тренировки, рекорды (&lt;code&gt;tasks/&lt;/code&gt;)&lt;a class="anchor" href="#%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d0%b0-10--%d0%b7%d0%b0%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-%d1%82%d1%80%d0%b5%d0%bd%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b8-%d1%80%d0%b5%d0%ba%d0%be%d1%80%d0%b4%d1%8b-tasks" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;ОТЛОЖЕНО (решение пользователя):&lt;/strong&gt; сначала проверить геймплей свободного полёта (game/, ui/).&#10;Карточки не составлялись. Логика FR-35…FR-37 готова без нод (docs/guide/tasks.md), в игру не подключена.&lt;/p&gt;&#10;&lt;p&gt;Когда вернёмся (план-набросок, не в работу):&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;game: &lt;code&gt;TaskSession&lt;/code&gt; (RefCounted) — Task/TaskTracker/TrainingMode/FlightRecords по API docs/guide/tasks.md; режим в FlightSettings.&lt;/li&gt;&#10;&lt;li&gt;game: подключение в &lt;code&gt;Game.tick&lt;/code&gt;, &lt;code&gt;set_task&lt;/code&gt;/&lt;code&gt;set_task_state&lt;/code&gt; на планшет, info итога с &lt;code&gt;task&lt;/code&gt;/&lt;code&gt;training&lt;/code&gt;/&lt;code&gt;new_records&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;ui: выбор режима в «Полёт…», итог со временем задания и «Новый рекорд!».&lt;/li&gt;&#10;&lt;li&gt;tasks: цели тренировок и демо-задания для askarovo и aushkul (сейчас только ongudai, altai).&lt;/li&gt;&#10;&lt;li&gt;сквозной тест в режимах задание/тренировка (дополнение к game/02).&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/terrain/01-stend-kadry-zamery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/terrain/01-stend-kadry-zamery/</guid><description>&lt;h1 id="t01-стенд-фиксированные-кадры-эталонные-фото-замер-gpu"&gt;T01. Стенд: фиксированные кадры, эталонные фото, замер GPU&lt;a class="anchor" href="#t01-%d1%81%d1%82%d0%b5%d0%bd%d0%b4-%d1%84%d0%b8%d0%ba%d1%81%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%b5-%d0%ba%d0%b0%d0%b4%d1%80%d1%8b-%d1%8d%d1%82%d0%b0%d0%bb%d0%be%d0%bd%d0%bd%d1%8b%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d0%b7%d0%b0%d0%bc%d0%b5%d1%80-gpu" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; один скрипт снимает одни и те же кадры рельефа и меряет GPU, чтобы все следующие карточки сравнивались с базой и с 3 реальными фото.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/terrain.md («Превью и замеры»), scripts/terrain/terrain_preview.gd, configs/locations/ongudai.json,&#10;docs/guide/world-objects.md («Просеки»), docs/research/visual_cues.md.&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;tools/terrain/shots.json&lt;/code&gt;, &lt;code&gt;tools/terrain/shots.sh&lt;/code&gt;, &lt;code&gt;tools/terrain/compare_ref.py&lt;/code&gt; (новые),&#10;&lt;code&gt;scripts/terrain/terrain_preview.gd&lt;/code&gt;, &lt;code&gt;data/terrain/reference/&lt;/code&gt; (новая, с &lt;code&gt;.gdignore&lt;/code&gt;).&#10;&lt;strong&gt;Не трогать:&lt;/strong&gt; terrain.gd, configs/world.json, docs/guide/terrain.md (описание стенда — в шапке &lt;code&gt;shots.sh&lt;/code&gt;; абзац для docs — в отчёт).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/terrain/02-les-kromka-10m/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/terrain/02-les-kromka-10m/</guid><description>&lt;h1 id="t02-лес-резкая-кромка-по-маске-10-м-без-тёмного-ореола-живой-тон-с-высоты"&gt;T02. Лес: резкая кромка по маске 10 м, без тёмного ореола, живой тон с высоты&lt;a class="anchor" href="#t02-%d0%bb%d0%b5%d1%81-%d1%80%d0%b5%d0%b7%d0%ba%d0%b0%d1%8f-%d0%ba%d1%80%d0%be%d0%bc%d0%ba%d0%b0-%d0%bf%d0%be-%d0%bc%d0%b0%d1%81%d0%ba%d0%b5-10-%d0%bc-%d0%b1%d0%b5%d0%b7-%d1%82%d1%91%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%be%d1%80%d0%b5%d0%be%d0%bb%d0%b0-%d0%b6%d0%b8%d0%b2%d0%be%d0%b9-%d1%82%d0%be%d0%bd-%d1%81-%d0%b2%d1%8b%d1%81%d0%be%d1%82%d1%8b" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; края лесных массивов — чёткие (как на аэрофото), без «клякс» и тёмного ореола; с 2 км лес — не тёмный ковёр.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/terrain.md («Карта поверхности», «Раскраска», «Лес с высоты»), scripts/terrain/terrain.gdshader,&#10;terrain_common.gdshaderinc, surface_layer.gd, tools/terrain/fetch_landcover.py, итоги T01 (&lt;code&gt;metrics.json&lt;/code&gt;).&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;scripts/terrain/{terrain.gdshader, terrain_common.gdshaderinc, terrain_renderer.gd, surface_layer.gd, terrain.gd}&lt;/code&gt;,&#10;&lt;code&gt;tools/terrain/fetch_landcover.py&lt;/code&gt;, &lt;code&gt;data/terrain/*/&lt;/code&gt; (новые маски), &lt;code&gt;configs/world.json&lt;/code&gt; (terrain_look, surface),&#10;&lt;code&gt;tests/terrain/test_surface.gd&lt;/code&gt;, &lt;code&gt;docs/guide/terrain.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Причина: класс «лес» берётся с сетки 25 м и билинейно размазан + &lt;code&gt;canopy_edge_dark&lt;/code&gt;/DSM-ступенька красят луг у опушки.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;fetch_landcover.py&lt;/code&gt;: для детального слоя — маска «деталь 10 м» RG8 (R — доля леса из WorldCover 10 м без моды 3×3,&#10;G — зарезервировано под воду T03), &lt;code&gt;&amp;lt;слой&amp;gt;_detail10.png&lt;/code&gt;; бюджет ≤ 15 МБ на локацию сохранить. Перегенерировать 4 локации.&lt;/li&gt;&#10;&lt;li&gt;Шейдер: лес из R маски 10 м с порогом 0,5 и узким шумом (переход ≤ 1,5 клетки); затемнение опушки — только внутри леса;&#10;DSM-ступенька не даёт тень/скалы на лугу (уклон на опушке брать по маске, а не по высоте).&lt;/li&gt;&#10;&lt;li&gt;Дальний тон: средний тон полога (когда крона &amp;lt; пикселя) — по фото (a): отношение лес/луг и RMS-контраст внутри леса.&lt;/li&gt;&#10;&lt;li&gt;API для группы 5: &lt;code&gt;Terrain.forest_at(x, z) -&amp;gt; float&lt;/code&gt; и &lt;code&gt;get_forest_mask() -&amp;gt; [Image, origin, cell_m]&lt;/code&gt;;&#10;&lt;code&gt;surface_at&lt;/code&gt; на опушке — по маске 10 м (VR-4, VR-21 как триггер). Рантайм-точка (FR-17) — прежний путь 25 м.&#10;В terrain.gd после создания деревьев: &lt;code&gt;if trees.has_method(&amp;quot;set_forest_mask&amp;quot;)&lt;/code&gt; (и у &lt;code&gt;impostors&lt;/code&gt;) — передать маску (метод делает V02).&lt;/li&gt;&#10;&lt;li&gt;VR-21 «препятствие»: проверить, что &lt;code&gt;height_at&lt;/code&gt; над лесом включает кроны (DSM) → посадка в лес = удар; тест.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки-стенд-t01"&gt;Критерий приёмки (стенд T01)&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8-%d1%81%d1%82%d0%b5%d0%bd%d0%b4-t01" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;S3: профиль через опушку — переход 10→90 % яркости ≤ 15 м по земле; луг в 0–30 м от кромки темнее луга в 100 м ≤ 8 %.&lt;/li&gt;&#10;&lt;li&gt;S5: отношение яркости лес/луг и RMS-контраст внутри леса — в ±20 % от фото (a); монтаж S5|a в отчёте.&lt;/li&gt;&#10;&lt;li&gt;Тест: &lt;code&gt;forest_at&lt;/code&gt; меняется 0,1→0,9 на ≤ 20 м на 20 точках кромки; &lt;code&gt;surface_at&lt;/code&gt; = лес ≥ 95 % там, где R ≥ 0,5.&lt;/li&gt;&#10;&lt;li&gt;GPU «рельеф» в S1–S5 — не выше базы T01 + 0,1 мс; тесты &lt;code&gt;tests/terrain&lt;/code&gt; зелёные; загрузка Онгудая ≤ 0,5 с.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; T01. &lt;strong&gt;Модель:&lt;/strong&gt; opus. &lt;strong&gt;Размер:&lt;/strong&gt; M.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/terrain/03-reki-ozyora-osm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/terrain/03-reki-ozyora-osm/</guid><description>&lt;h1 id="t03-реки-и-озёра-из-osm-на-рельефе-vr-9"&gt;T03. Реки и озёра из OSM на рельефе (VR-9)&lt;a class="anchor" href="#t03-%d1%80%d0%b5%d0%ba%d0%b8-%d0%b8-%d0%be%d0%b7%d1%91%d1%80%d0%b0-%d0%b8%d0%b7-osm-%d0%bd%d0%b0-%d1%80%d0%b5%d0%bb%d1%8c%d0%b5%d1%84%d0%b5-vr-9" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; реки, ручьи и озёра из &lt;code&gt;data/osm/&amp;lt;id&amp;gt;.json&lt;/code&gt; видны на земле непрерывными линиями нужной ширины — ориентиры для навигации.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/world-objects.md («Формат data/osm», «Что не рисуется»), tools/terrain/rivers.py, tools/osm/ (pack_water — только читать),&#10;scripts/terrain/terrain.gdshader (вода), маска «деталь 10 м» из T02, docs/guide/terrain.md.&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;tools/terrain/osm_water.py&lt;/code&gt; (новый), &lt;code&gt;data/terrain/*/*_detail10.png&lt;/code&gt; (канал G), &lt;code&gt;scripts/terrain/{terrain.gdshader, terrain_common.gdshaderinc, terrain_renderer.gd, surface_layer.gd, terrain.gd}&lt;/code&gt;, &lt;code&gt;tests/terrain/test_surface.gd&lt;/code&gt;, &lt;code&gt;docs/guide/terrain.md&lt;/code&gt;.&#10;&lt;strong&gt;Не трогать:&lt;/strong&gt; configs/world.json (владелец волны — T04), data/osm/ (группа 6; нет воды в файле — запрос группе 6).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/terrain/04-dymka-kontrast/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/terrain/04-dymka-kontrast/</guid><description>&lt;h1 id="t04-дымка-и-дальний-контраст-по-реальным-фото"&gt;T04. Дымка и дальний контраст по реальным фото&lt;a class="anchor" href="#t04-%d0%b4%d1%8b%d0%bc%d0%ba%d0%b0-%d0%b8-%d0%b4%d0%b0%d0%bb%d1%8c%d0%bd%d0%b8%d0%b9-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%b0%d1%81%d1%82-%d0%bf%d0%be-%d1%80%d0%b5%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%bc-%d1%84%d0%be%d1%82%d0%be" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; дымка синит и смягчает даль как на фото, но не «съедает» контраст на 2–10 км; верх дымки на инверсии остаётся резким (VR-3, FR-20).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/terrain.md («Мир», «Дымка и инверсия»), scripts/world/haze.gdshader, scripts/world/sky_environment.gd,&#10;configs/world.json (fog, haze, sky, effects), фото (c) и &lt;code&gt;metrics.json&lt;/code&gt; T01.&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;scripts/world/&lt;/code&gt;, &lt;code&gt;configs/world.json&lt;/code&gt; (разделы fog, haze, sky, effects), &lt;code&gt;tests/terrain/test_haze.gd&lt;/code&gt; (новый).&#10;&lt;strong&gt;Не трогать:&lt;/strong&gt; docs/guide/terrain.md (в этой волне правит T03) — абзац об изменениях дымки приложить к отчёту.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/terrain/05-veter-volny-poryvov/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/terrain/05-veter-volny-poryvov/</guid><description>&lt;h1 id="t05-волны-порывов-по-траве-и-ниве-без-скачков-vr-17"&gt;T05. Волны порывов по траве и ниве без скачков (VR-17)&lt;a class="anchor" href="#t05-%d0%b2%d0%be%d0%bb%d0%bd%d1%8b-%d0%bf%d0%be%d1%80%d1%8b%d0%b2%d0%be%d0%b2-%d0%bf%d0%be-%d1%82%d1%80%d0%b0%d0%b2%d0%b5-%d0%b8-%d0%bd%d0%b8%d0%b2%d0%b5-%d0%b1%d0%b5%d0%b7-%d1%81%d0%ba%d0%b0%d1%87%d0%ba%d0%be%d0%b2-vr-17" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; пятна порывов плавно «бегут» по ветру и не прыгают при смене ветра; сила рисунка — от реальной порывистости атмосферы.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/terrain.md («Ветер на земле»), scripts/terrain/terrain_wind.gd, terrain_wind.gdshaderinc,&#10;docs/plan/README.md (группа 5, рекомендация 2), docs/guide/atmosphere.md (&lt;code&gt;air_velocity_at&lt;/code&gt;, &lt;code&gt;mean_wind_at&lt;/code&gt;).&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;scripts/terrain/{terrain_wind.gd, terrain_wind.gdshaderinc, terrain.gd}&lt;/code&gt;, &lt;code&gt;configs/world.json&lt;/code&gt; (wind_visual),&#10;&lt;code&gt;tests/terrain/test_wind.gd&lt;/code&gt; (новый), &lt;code&gt;docs/guide/terrain.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Смещение рисунка копить на CPU: &lt;code&gt;offset += dir · speed · dt&lt;/code&gt; → uniform (вместо &lt;code&gt;TIME · wind&lt;/code&gt; в шейдере).&lt;/li&gt;&#10;&lt;li&gt;Порывистость = |air_velocity_at − mean_wind_at| у земли под камерой, сглаженная экспонентой (τ из конфига) → амплитуда пятен.&lt;/li&gt;&#10;&lt;li&gt;API: &lt;code&gt;Terrain.set_wind_sources(mean_fn, thermals_fn, air_fn := Callable())&lt;/code&gt; — без &lt;code&gt;air_fn&lt;/code&gt; как раньше&#10;(подключение в игре — группа «Сцена игры»); травинки и деревья получают те же uniform через include.&lt;/li&gt;&#10;&lt;li&gt;Превью: &lt;code&gt;--gusts&lt;/code&gt; (подать &lt;code&gt;air_fn&lt;/code&gt; из фейковой порывистости) для проверки.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Тест: ветер повернули на 90° за 1 с — смещение рисунка за кадр ≤ 1,5·speed·dt (нет скачка); амплитуда ↑ при порывистости ↑.&lt;/li&gt;&#10;&lt;li&gt;Тест: без &lt;code&gt;air_fn&lt;/code&gt; поведение и uniform как до карточки.&lt;/li&gt;&#10;&lt;li&gt;Ролик 5 с (кадры каждые 0,2 с) с 50 и 300 м в Онгудае для пользователя/пилота (VR-17 «видно подход термика?»).&lt;/li&gt;&#10;&lt;li&gt;GPU «рельеф» — не выше предыдущего замера + 0,05 мс; тесты &lt;code&gt;tests/terrain&lt;/code&gt; зелёные.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; T02–T04 закрыты (общие terrain.gd, world.json, docs). &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; S.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/terrain/06-byudzhet-gpu-relefa/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/terrain/06-byudzhet-gpu-relefa/</guid><description>&lt;blockquote class=''&gt;&#10;&lt;p&gt;&lt;strong&gt;ОТЛОЖЕНО (решение пользователя): оптимизации — на потом.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;h1 id="t06-бюджет-gpu-рельефа-с-28-до--16-мс-без-потери-картинки"&gt;T06. Бюджет GPU рельефа: с ~2,8 до ≤ 1,6 мс без потери картинки&lt;a class="anchor" href="#t06-%d0%b1%d1%8e%d0%b4%d0%b6%d0%b5%d1%82-gpu-%d1%80%d0%b5%d0%bb%d1%8c%d0%b5%d1%84%d0%b0-%d1%81-28-%d0%b4%d0%be--16-%d0%bc%d1%81-%d0%b1%d0%b5%d0%b7-%d0%bf%d0%be%d1%82%d0%b5%d1%80%d0%b8-%d0%ba%d0%b0%d1%80%d1%82%d0%b8%d0%bd%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; проход рельефа снова дешёвый (NFR-1, VR-13) — вернуть бюджет, который съели полог, скалы, осыпи, ветер.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/terrain.md («Превью и замеры»), scripts/terrain/terrain.gdshader, terrain_common.gdshaderinc,&#10;terrain_renderer.gd, &lt;code&gt;bench.json&lt;/code&gt; T01 и последний замер T05.&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;scripts/terrain/{terrain.gdshader, terrain_common.gdshaderinc, terrain_renderer.gd, terrain.gd, height_layer.gd}&lt;/code&gt;,&#10;&lt;code&gt;configs/world.json&lt;/code&gt; (terrain_look, rendering), &lt;code&gt;configs/locations/*.json&lt;/code&gt; (render), &lt;code&gt;docs/guide/terrain.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Профиль: выключать по одному блоку (полог Вороного, осыпи &lt;code&gt;scree_probe&lt;/code&gt;, снег в кулуарах, трипланар скал, ветер, детальные текстуры)&#10;и записать цену каждого в S1–S5.&lt;/li&gt;&#10;&lt;li&gt;Дорогие «на пиксель» признаки, не зависящие от камеры (вогнутость, поиск обрыва выше по склону, уклон/экспозиция), —&#10;запечь в текстуры при загрузке (в рабочем потоке, NFR-2 не хуже + 0,3 с).&lt;/li&gt;&#10;&lt;li&gt;Ранний выход по дальности/&lt;code&gt;fwidth&lt;/code&gt;: полог, травяные и скальные текстуры, ветер — не считать, где их не видно.&lt;/li&gt;&#10;&lt;li&gt;Проверить LOD и overdraw юбок; число выборок текстур на пиксель — записать до/после.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки-стенд-t01-rtx-4070-super-1080p-forward"&gt;Критерий приёмки (стенд T01, RTX 4070 SUPER, 1080p, Forward+)&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8-%d1%81%d1%82%d0%b5%d0%bd%d0%b4-t01-rtx-4070-super-1080p-forward" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;GPU «рельеф» ≤ 1,6 мс в каждом из S1–S5; полный кадр у земли (S1) и на 800 м ≤ 3,5 мс.&lt;/li&gt;&#10;&lt;li&gt;Картинка: все 7 кадров против снимков до карточки — PSNR ≥ 35 дБ, метрики &lt;code&gt;compare_ref.py&lt;/code&gt; ≤ 3 %.&lt;/li&gt;&#10;&lt;li&gt;Загрузка Онгудая ≤ 0,8 с; тесты &lt;code&gt;tests/terrain&lt;/code&gt; зелёные.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Зависимости:&lt;/strong&gt; T05 (последняя в группе; меряет итоговый шейдер). &lt;strong&gt;Модель:&lt;/strong&gt; opus. &lt;strong&gt;Размер:&lt;/strong&gt; M.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/terrain/README/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/terrain/README/</guid><description>&lt;h1 id="группа-4-рельеф-и-земля--карточки"&gt;Группа 4 «Рельеф и земля» — карточки&lt;a class="anchor" href="#%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d0%b0-4-%d1%80%d0%b5%d0%bb%d1%8c%d0%b5%d1%84-%d0%b8-%d0%b7%d0%b5%d0%bc%d0%bb%d1%8f--%d0%ba%d0%b0%d1%80%d1%82%d0%be%d1%87%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Объём: основа (этапы 0–5 TODO) + известные проблемы приёмки. Не входят: вода-рябь VR-16, дым VR-15, время суток VR-5,&#10;смог, векторная карта martin, «Идеи/Позже/Места». Все замеры — стендом T01 (7 кадров, 3 реальных фото, &lt;code&gt;bench.json&lt;/code&gt;).&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;#&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Карточка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Модель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Размер&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Волна&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;T01&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/terrain/01-stend-kadry-zamery/"&gt;Стенд: кадры, фото, GPU&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;T02&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/terrain/02-les-kromka-10m/"&gt;Лес: кромка 10 м, без ореола, тон с высоты&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;T03&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/terrain/03-reki-ozyora-osm/"&gt;Реки и озёра из OSM (VR-9)&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;T04&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/terrain/04-dymka-kontrast/"&gt;Дымка и дальний контраст&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;T05&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/terrain/05-veter-volny-poryvov/"&gt;Волны порывов без скачков (VR-17)&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;T06&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/terrain/06-byudzhet-gpu-relefa/"&gt;Бюджет GPU рельефа ≤ 1,6 мс&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="порядок-и-параллельность-вместе-с-vegetation"&gt;Порядок и параллельность (вместе с &lt;code&gt;../vegetation/&lt;/code&gt;)&lt;a class="anchor" href="#%d0%bf%d0%be%d1%80%d1%8f%d0%b4%d0%be%d0%ba-%d0%b8-%d0%bf%d0%b0%d1%80%d0%b0%d0%bb%d0%bb%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%b5-%d1%81-vegetation" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Волна 0:&lt;/strong&gt; T01 ‖ V01 (V01 выносит &lt;code&gt;grass&lt;/code&gt;/&lt;code&gt;trees&lt;/code&gt; из &lt;code&gt;configs/world.json&lt;/code&gt; — дальше растительность его не трогает).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Волна 1:&lt;/strong&gt; T02 (один: &lt;code&gt;terrain.gdshader&lt;/code&gt;, &lt;code&gt;terrain.gd&lt;/code&gt;, &lt;code&gt;world.json&lt;/code&gt;, docs/guide/terrain.md).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Волна 2:&lt;/strong&gt; T03 ‖ T04 ‖ V02. Общих файлов нет: &lt;code&gt;world.json&lt;/code&gt; — только T04, docs/guide/terrain.md — только T03 (T04 даёт абзац в отчёте).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Волна 3:&lt;/strong&gt; T05. &lt;strong&gt;Волна 4:&lt;/strong&gt; T06 (последней — меряет итоговый шейдер).&lt;/li&gt;&#10;&lt;li&gt;Каждая карточка перед сдачей гоняет &lt;code&gt;tools/terrain/shots.sh&lt;/code&gt; и прикладывает &lt;code&gt;metrics.json&lt;/code&gt;/&lt;code&gt;bench.json&lt;/code&gt; и монтажи.&lt;/li&gt;&#10;&lt;li&gt;Ограничение GPU для T02–T05: «рельеф» не растёт больше чем на 0,1 мс за карточку; снижение — в T06.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="внешние-зависимости-не-карточки-группы"&gt;Внешние зависимости (не карточки группы)&lt;a class="anchor" href="#%d0%b2%d0%bd%d0%b5%d1%88%d0%bd%d0%b8%d0%b5-%d0%b7%d0%b0%d0%b2%d0%b8%d1%81%d0%b8%d0%bc%d0%be%d1%81%d1%82%d0%b8-%d0%bd%d0%b5-%d0%ba%d0%b0%d1%80%d1%82%d0%be%d1%87%d0%ba%d0%b8-%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d1%8b" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Группа «Сцена игры»: &lt;code&gt;set_clearings&lt;/code&gt;, &lt;code&gt;set_wind_sources&lt;/code&gt; (+ &lt;code&gt;air_fn&lt;/code&gt; после T05), &lt;code&gt;set_pilot&lt;/code&gt;, &lt;code&gt;sun_fn&lt;/code&gt;, инверсия&#10;(&lt;code&gt;set_inversion_height_msl&lt;/code&gt;), &lt;code&gt;default_location = ongudai&lt;/code&gt;, &lt;code&gt;GrassField.set_landing_sites&lt;/code&gt; (после V01).&lt;/li&gt;&#10;&lt;li&gt;Группа 6: вода в &lt;code&gt;data/osm/&amp;lt;id&amp;gt;.json&lt;/code&gt; (T03 только читает).&lt;/li&gt;&#10;&lt;li&gt;Вопросы пилотам (старты Онгудая/Биягоды/Аушкуля, VR-17 «видно термик по траве?») — не блокируют.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Решение пользователя:&lt;/strong&gt; T06 (бюджет GPU рельефа) — оптимизация, откладывается на потом, в текущий объём не входит.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/ui-controls-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/ui-controls-progress/</guid><description>&lt;h1 id="журнал-модуля-ui-controls"&gt;Журнал модуля «ui-controls»&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8f-ui-controls" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;План — &lt;code&gt;docs/archive/plan/ui-controls.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/ui-controls.md&lt;/code&gt;. Ветка &lt;code&gt;feature/ui-controls&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-ui-controls&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 938d1ea).&lt;/p&gt;&#10;&lt;h2 id="решения"&gt;Решения&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — решение пользователя: по умолчанию в полёте W/↑ = трапеция от себя, S/↓ = на себя; мышь/стик «вперёд = от себя»; инверсия остаётся, по умолчанию выключена.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — разбор v1.0.0: клавиши «как в самолёте» (W = &lt;code&gt;pitch_pull_in&lt;/code&gt;), стик вперёд = на себя, мышь &lt;code&gt;bar&lt;/code&gt; уже дельтапланерная. Экран «Управление» показывает клавиши шага через действия тангажа — привязать к &lt;code&gt;walk_*&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — контракт У1 v2 (&lt;code&gt;docs/contracts/ui-controls.md&lt;/code&gt;), тест &lt;code&gt;tests/game/test_ui_controls_contracts.gd&lt;/code&gt;: форма 1/1 ок; &lt;code&gt;test_u1_default_keys_hang_glider&lt;/code&gt; — цель v2, красный до UC-1.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — согласование с control-fix (журнал &lt;code&gt;~/deltaplan-control-fix/docs/plan/control-fix_progress.md&lt;/code&gt;, контракты С1/С2 v2): CF-1 в работе, CF-3 (земля, вариант В) ещё не начат и затронет те же &lt;code&gt;controls.json&lt;/code&gt;, экран «Управление», локали, &lt;code&gt;autopilot.gd&lt;/code&gt;, доки. Владелец знака клавиш — этот модуль (перестановка списков в &lt;code&gt;controls.json&lt;/code&gt;); CF-3 знак не переставляет; тест У1 ловит двойную перестановку. &lt;code&gt;ground_run.gd&lt;/code&gt; и логику земли в &lt;code&gt;input_controller.gd&lt;/code&gt; не трогаем; правка знака стика в &lt;code&gt;_apply_gamepad&lt;/code&gt; (файл control-fix) — отдельным коммитом, вливается после согласования с главной сессией.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — control-fix уточнил С2 v2 (addb5e5): клавиши крыла на земле — те же действия &lt;code&gt;pitch_*&lt;/code&gt;/&lt;code&gt;roll_*&lt;/code&gt;, что в полёте; знак — только карта ввода (наш У1). Двойной перестановки не будет.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — главная сессия: стик по варианту А — правка &lt;code&gt;_apply_gamepad&lt;/code&gt; (&lt;code&gt;-gy * inv&lt;/code&gt;) отдельным коммитом ui-controls (7e65293), конфликт с CF-3 разрешаю при подтягивании &lt;code&gt;feature/control-fix&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — CHANGELOG «В работе» (6d554c2). Открытый вопрос для CF-3: автопилот и &lt;code&gt;test_takeoff_latch&lt;/code&gt; изображают «W» на земле как &lt;code&gt;walk_forward&lt;/code&gt;+&lt;code&gt;pitch_pull_in&lt;/code&gt;, реальная W теперь &lt;code&gt;pitch_push_out&lt;/code&gt;; защёлку CF-3 всё равно убирает — там и привести.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;01.10 — финальный шлюз: control-fix не готов (CF-1, CF-3 в работе), подтягивание &lt;code&gt;feature/control-fix&lt;/code&gt; — после его готовности, перед слиянием в main.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — пользователь одобрил слияние в main (выпуск 1.0.1). Подтянут main dcf039e (control-fix CF-1/CF-3, wing-physics-check) — слияние acf1752. Конфликты: &lt;code&gt;controls.json&lt;/code&gt; (клавиши — У1 v2, описания — объединены, &lt;code&gt;run_doc&lt;/code&gt; — control-fix), &lt;code&gt;_apply_gamepad&lt;/code&gt; (код control-fix без ветвления по земле + &lt;code&gt;-gy * inv&lt;/code&gt;), &lt;code&gt;autopilot.gd&lt;/code&gt; и &lt;code&gt;test_gameplay.gd&lt;/code&gt; — версия control-fix (жмут действия по имени, знак верный), &lt;code&gt;docs/guide/game.md&lt;/code&gt; (текст control-fix + знак У1, таблица клавиш объединена), CHANGELOG (одна секция «Управление»). &lt;code&gt;ui.json&lt;/code&gt;, &lt;code&gt;locale/ui.csv&lt;/code&gt; слились сами (раздел «На земле» — control-fix, строки полёта и инверсия — наши). Тесты: ui_controls_contracts 5/5, contracts 45/45, game 134/0 (1 пропуск GPU), start_ 14/0 (1 пропуск GPU), liftoff_physics 5/5, flight 129/129. Стоя ↑ → pitch +1,00 (нос вверх), на бегу S → −0,75.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — этап 2 (запрос пользователя: при тангаже мышью WASD — камера от 1-го лица). Разбор кода: «двигать камеру» = поворот головы в кабине (смещения глаз с клавиш в коде нет, свободное перемещение уже есть — камера «свободная»). Базовая линия: ui_controls 5/5 (в тесте осталась строка &lt;code&gt;ic._was_on_ground&lt;/code&gt; — свойство убрано CF-3, SCRIPT ERROR без падения; уберу при правке теста). Шлюз до кода: разбег (WASD — обзор или трапеция) и камера сзади (WASD — ничего или трапеция); мелочи с дефолтом — в плане, «Этап 2».&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — решение пользователя (через главную сессию): WASD при тангаже мышью — поворот головы (обзор камеры кабины), не смещение точки обзора. Вписано в план («Этап 2 → Решения пользователя»); развилку не поднимаю.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — остальное решил сам по принципу CF-3 «на разбеге — как в полёте» (план, «Решения координатора»): условие — bar &lt;strong&gt;и&lt;/strong&gt; мышь захвачена; разбег — WASD тоже обзор (на отрыве скачка трапеции нет); стоя/шагом — без изменений; камера сзади — WASD ничего; свободная — как было; голова с клавиш 90°/с, отпустил — остаётся, V — вперёд; стрелки — трапеция всегда. Шлюз не нужен — всё дёшево поменять.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — контракт У2 v1 (&lt;code&gt;docs/contracts/ui-controls.md&lt;/code&gt;): действия &lt;code&gt;look_*&lt;/code&gt; = W/S/A/D, &lt;code&gt;InputController.keys_look()&lt;/code&gt;, &lt;code&gt;CameraRig.keys_look_fn&lt;/code&gt;/&lt;code&gt;head_look_deg()&lt;/code&gt;, &lt;code&gt;camera.json → cockpit.head.key_rate_deg_s&lt;/code&gt;. Тест &lt;code&gt;test_u2_*&lt;/code&gt; (4 шт.) — красные до UC-3; У1 5/5. Из теста убрана мёртвая строка &lt;code&gt;ic._was_on_ground&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — решение пользователя: «UI не переделывай, только камеру» — фильтр клавиш на экране «Управление» не делаем; вопрос закрыт. Базовые прогоны ветки модуля до UC-3: contracts 50/4, game 138/4 (1 пропуск), ui 93/5, flight 129/0; все падения — &lt;code&gt;test_u2_*&lt;/code&gt; (ждут UC-3) и &lt;code&gt;test_net_screen::…embedded_vs_remote&lt;/code&gt; (порт).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — этап 2 закрыт: UC-3 и UC-4 приняты и влиты в &lt;code&gt;feature/ui-controls&lt;/code&gt; (e16b34c). В main не вливаю — ждёт одобрения пользователя.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — этап 3, решения пользователя (через главную сессию, тремя сообщениями): (1) «WASD камера нужна только в полёте, на земле не нужна» — отменяет моё решение п.2 этапа 2 (разбег — обзор); (2) поправка: на земле (стоя, шагом, разбег) W/S/A/D — движение пилота, крыло — мышь; (3) «крыло через WASD в полёте не нужно вообще, настройку убрать»: мышь всегда крыло, режим мыши &lt;code&gt;look&lt;/code&gt; и пункт «Мышь: Обзор / Трапеция» — убрать; в полёте W/S/A/D — только голова; стрелки и геймпад — как были. Вписано в план («Этап 3»).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — решения координатора этапа 3: клавиши трапеции — только стрелки (W/S/A/D сняты с &lt;code&gt;pitch_*&lt;/code&gt;/&lt;code&gt;roll_*&lt;/code&gt;, фильтры занятых клавиш не нужны); разбег — как в CF-3 (Shift бежит сам, курс — от крена крыла), W/S/A/D на бегу ничего не делают; &lt;strong&gt;захват мыши (M): без захвата мышь крыло не двигает (курсор свободен), трапеция держит положение — как было в &lt;code&gt;bar&lt;/code&gt;&lt;/strong&gt;; &lt;code&gt;keys_look()&lt;/code&gt; = в полёте, ввод включён, не свободная камера — от мыши не зависит; на отрыве/касании скачка трапеции нет (W/S/A/D в неё не идут нигде), защёлок нет.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — контракты: У1 v3 (стрелки, мышь всегда крыло, &lt;code&gt;mouse.mode&lt;/code&gt;/&lt;code&gt;mouse_mode()&lt;/code&gt; убраны), У2 v2 (W/S/A/D — пилот на земле, голова в полёте); С2 control-fix → v3 (правка потребителя в том же шаге: &lt;code&gt;docs/contracts/control-fix.md&lt;/code&gt;, &lt;code&gt;test_control_fix_contracts.gd&lt;/code&gt; — &lt;code&gt;mouse_mode()&lt;/code&gt;/&lt;code&gt;mouse.mode&lt;/code&gt; убраны). Тесты переписаны: &lt;code&gt;test_ui_controls_contracts.gd&lt;/code&gt; (У1 v3, У2 v2, отрыв с зажатой W), &lt;code&gt;test_gameplay.gd::test_ground_bar_keys&lt;/code&gt; (стоя/бег, с захватом и без). До UC-5: ui_controls 5 ok / 4 FAIL (ждут UC-5).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;02.10 — этап 3 закрыт: UC-5 и UC-6 приняты и влиты в &lt;code&gt;feature/ui-controls&lt;/code&gt;. В main не вливаю — ждёт одобрения пользователя. Открыто (не трогал): Q назначена и на &lt;code&gt;look_instrument&lt;/code&gt;, и на &lt;code&gt;free_down&lt;/code&gt; (было и раньше); у пилота в &lt;code&gt;user://configs/controls.json&lt;/code&gt; может остаться &lt;code&gt;mouse.mode&lt;/code&gt; — код его не читает.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/ui-controls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/ui-controls/</guid><description>&lt;h1 id="план-модуля-ui-controls--раскладка-тангажа-как-у-дельтапланериста"&gt;План модуля «ui-controls» — раскладка тангажа «как у дельтапланериста»&lt;a class="anchor" href="#%d0%bf%d0%bb%d0%b0%d0%bd-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8f-ui-controls--%d1%80%d0%b0%d1%81%d0%ba%d0%bb%d0%b0%d0%b4%d0%ba%d0%b0-%d1%82%d0%b0%d0%bd%d0%b3%d0%b0%d0%b6%d0%b0-%d0%ba%d0%b0%d0%ba-%d1%83-%d0%b4%d0%b5%d0%bb%d1%8c%d1%82%d0%b0%d0%bf%d0%bb%d0%b0%d0%bd%d0%b5%d1%80%d0%b8%d1%81%d1%82%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Внутренний документ. Журнал — &lt;code&gt;docs/archive/plan/ui-controls-progress.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/ui-controls.md&lt;/code&gt;. Ветка &lt;code&gt;feature/ui-controls&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-ui-controls&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 938d1ea).&lt;/p&gt;&#10;&lt;h2 id="цель"&gt;Цель&lt;a class="anchor" href="#%d1%86%d0%b5%d0%bb%d1%8c" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;По умолчанию в полёте вперёд/вверх = трапеция &lt;strong&gt;от себя&lt;/strong&gt; (нос вверх, торможение): W, ↑, мышь от себя (в режиме &lt;code&gt;bar&lt;/code&gt;), стик вперёд. Назад/вниз = &lt;strong&gt;на себя&lt;/strong&gt; (нос вниз, разгон). Это раскладка дельтапланериста, не самолёта.&lt;/p&gt;&#10;&lt;h2 id="решения-пользователя-не-обсуждаются"&gt;Решения пользователя (не обсуждаются)&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-%d0%bd%d0%b5-%d0%be%d0%b1%d1%81%d1%83%d0%b6%d0%b4%d0%b0%d1%8e%d1%82%d1%81%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;01.10 — по умолчанию в полёте &lt;strong&gt;W = трапеция от себя&lt;/strong&gt;, &lt;strong&gt;S = на себя&lt;/strong&gt;; то же для ↑/↓ и для стика/мыши по умолчанию («вперёд/вверх = от себя», мышь вперёд = от себя), без инверсии «как в самолёте» по умолчанию. Настройка инверсии остаётся, но по умолчанию — дельтапланерная.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="что-было-на-v100-938d1ea"&gt;Что было на v1.0.0 (938d1ea)&lt;a class="anchor" href="#%d1%87%d1%82%d0%be-%d0%b1%d1%8b%d0%bb%d0%be-%d0%bd%d0%b0-v100-938d1ea" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;configs/controls.json → keys&lt;/code&gt;: &lt;code&gt;pitch_pull_in&lt;/code&gt; = [W, Up] (на себя), &lt;code&gt;pitch_push_out&lt;/code&gt; = [S, Down] (от себя). &lt;code&gt;InputController._update_air&lt;/code&gt;: &lt;code&gt;pitch_dir = −(pull_in − push_out)·inv&lt;/code&gt; → W даёт &lt;code&gt;ControlInput.pitch&lt;/code&gt; −1.&lt;/li&gt;&#10;&lt;li&gt;Мышь (&lt;code&gt;bar&lt;/code&gt;): &lt;code&gt;pitch = −offset.y&lt;/code&gt; — мышь от себя (курсор вверх) = от себя. &lt;strong&gt;Уже дельтапланерно.&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Стик (&lt;code&gt;_apply_gamepad&lt;/code&gt;): &lt;code&gt;pitch = gy·inv&lt;/code&gt;, ось 1 вперёд &amp;lt; 0 → стик вперёд = на себя. &lt;strong&gt;Как в самолёте — менять.&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;На земле: W/S — шаг (&lt;code&gt;walk_forward&lt;/code&gt;/&lt;code&gt;walk_back&lt;/code&gt;), ↑/↓ — нос вверх/вниз (&lt;code&gt;nose_up&lt;/code&gt;/&lt;code&gt;nose_down&lt;/code&gt;). Не меняется.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;configs/ui.json → controls_help&lt;/code&gt;: раздел «На земле» показывает клавиши шага через действия &lt;code&gt;pitch_pull_in&lt;/code&gt;/&lt;code&gt;pitch_push_out&lt;/code&gt; — после перестановки показал бы S/↓ для «идти». Привязать к &lt;code&gt;walk_forward&lt;/code&gt;/&lt;code&gt;walk_back&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Подсказка инверсии &lt;code&gt;settings_invert_pitch_hint&lt;/code&gt; («W — от себя, S — на себя») описывала инверсию; теперь инверсия = «как в самолёте».&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="задачи"&gt;Задачи&lt;a class="anchor" href="#%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;h3 id="uc-1-раскладка-и-проверки-dp-engineer"&gt;UC-1. Раскладка и проверки (dp-engineer)&lt;a class="anchor" href="#uc-1-%d1%80%d0%b0%d1%81%d0%ba%d0%bb%d0%b0%d0%b4%d0%ba%d0%b0-%d0%b8-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b8-dp-engineer" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Скоуп&lt;/strong&gt;: перестановка клавиш тангажа в &lt;code&gt;configs/controls.json&lt;/code&gt; (одно место знака для клавиатуры); стик вперёд = от себя; инверсия по-прежнему меняет всё (клавиши, мышь, стик); экран «Управление» (&lt;code&gt;configs/ui.json → controls_help&lt;/code&gt;), подсказки и локали (&lt;code&gt;locale/ui.csv&lt;/code&gt;); &lt;code&gt;*_doc&lt;/code&gt; в &lt;code&gt;controls.json&lt;/code&gt;; комментарии &lt;code&gt;autopilot.gd&lt;/code&gt;/тестов, где написано «W = pitch_pull_in» (автопилот и тесты жмут действия по имени — знак по имени не меняется); регрессионный тест У1.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Не трогать&lt;/strong&gt;: &lt;code&gt;scripts/flight/ground_run.gd&lt;/code&gt;, логику земли в &lt;code&gt;input_controller.gd&lt;/code&gt; (работа &lt;code&gt;feature/control-fix&lt;/code&gt;, CF-3). Правка &lt;code&gt;_apply_gamepad&lt;/code&gt; (одна строка знака) — отдельным последним коммитом, вливается только после согласования с главной сессией (файл control-fix).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Приёмка&lt;/strong&gt; (headless): тест &lt;code&gt;tests/game/test_ui_controls_contracts.gd&lt;/code&gt; — У1: в полёте по умолчанию W и ↑ дают &lt;code&gt;ControlInput.pitch&lt;/code&gt; &amp;gt; 0, S и ↓ — &amp;lt; 0; мышь от себя (&lt;code&gt;bar&lt;/code&gt;) — &amp;gt; 0; стик вперёд — &amp;gt; 0 (после коммита стика); &lt;code&gt;invert_pitch = true&lt;/code&gt; меняет знак всех; в полёте W увеличивает угол атаки крыла относительно трима (сцена игры или FlightModel), S уменьшает. &lt;code&gt;--filter=contracts&lt;/code&gt;, &lt;code&gt;--filter=game&lt;/code&gt;, &lt;code&gt;--filter=ui&lt;/code&gt;, &lt;code&gt;--filter=flight&lt;/code&gt; без новых падений.&lt;/li&gt;&#10;&lt;li&gt;Оценка: 1–2 ч.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="uc-2-тексты-dp-writer"&gt;UC-2. Тексты (dp-writer)&lt;a class="anchor" href="#uc-2-%d1%82%d0%b5%d0%ba%d1%81%d1%82%d1%8b-dp-writer" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Скоуп&lt;/strong&gt;: описания раскладки в &lt;code&gt;docs/guide/game.md&lt;/code&gt;, &lt;code&gt;docs/guide/flight.md&lt;/code&gt; (если есть), &lt;code&gt;README.md&lt;/code&gt;, страницы сайта (&lt;code&gt;site/content/…&lt;/code&gt;, где описано управление), без страниц версий и дневника прошлых дней.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Приёмка&lt;/strong&gt;: все упоминания «W/↑ — на себя/разгон» заменены на дельтапланерную раскладку; список изменённых мест в отчёте; &lt;code&gt;hugo&lt;/code&gt; собирает сайт (если есть в системе).&lt;/li&gt;&#10;&lt;li&gt;Оценка: 30–60 мин.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="пересечения-с-featurecontrol-fix"&gt;Пересечения с feature/control-fix&lt;a class="anchor" href="#%d0%bf%d0%b5%d1%80%d0%b5%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d1%8f-%d1%81-featurecontrol-fix" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CF-3 переделывает землю (Shift на разбеге — W/S, стрелки, мышь «как в воздухе») и правит &lt;code&gt;input_controller.gd&lt;/code&gt;, &lt;code&gt;controls.json&lt;/code&gt;, &lt;code&gt;autopilot.gd&lt;/code&gt;, экран «Управление», локали, &lt;code&gt;docs/guide/game.md&lt;/code&gt;/&lt;code&gt;flight.md&lt;/code&gt;, тесты.&lt;/li&gt;&#10;&lt;li&gt;Владелец знака клавиатуры — этот модуль: перестановка списков клавиш в &lt;code&gt;controls.json → keys.pitch_*&lt;/code&gt;. CF-3 знак повторно не переставляет; «как в воздухе» = через действия &lt;code&gt;pitch_push_out&lt;/code&gt;/&lt;code&gt;pitch_pull_in&lt;/code&gt;. Двойную перестановку ловит тест У1.&lt;/li&gt;&#10;&lt;li&gt;Слияние в &lt;code&gt;main&lt;/code&gt;: сначала control-fix, затем ui-controls (подтянуть &lt;code&gt;feature/control-fix&lt;/code&gt; перед финалом, конфликты в &lt;code&gt;controls.json&lt;/code&gt;, &lt;code&gt;ui.json&lt;/code&gt;, &lt;code&gt;locale/ui.csv&lt;/code&gt;, доках — разрешает координатор, тест У1 — арбитр).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="шлюзы"&gt;Шлюзы&lt;a class="anchor" href="#%d1%88%d0%bb%d1%8e%d0%b7%d1%8b" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Правка файла control-fix (&lt;code&gt;input_controller.gd → _apply_gamepad&lt;/code&gt;) — согласование с главной сессией.&lt;/li&gt;&#10;&lt;li&gt;Финал — список изменённых мест, тесты, как проверить пилоту, пересечения с control-fix; в &lt;code&gt;main&lt;/code&gt; не вливаю.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h1 id="этап-2--камера-с-клавиш-при-тангаже-мышью"&gt;Этап 2 — камера с клавиш при тангаже мышью&lt;a class="anchor" href="#%d1%8d%d1%82%d0%b0%d0%bf-2--%d0%ba%d0%b0%d0%bc%d0%b5%d1%80%d0%b0-%d1%81-%d0%ba%d0%bb%d0%b0%d0%b2%d0%b8%d1%88-%d0%bf%d1%80%d0%b8-%d1%82%d0%b0%d0%bd%d0%b3%d0%b0%d0%b6%d0%b5-%d0%bc%d1%8b%d1%88%d1%8c%d1%8e" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="запрос-пользователя-0210-дословно"&gt;Запрос пользователя (02.10, дословно)&lt;a class="anchor" href="#%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-0210-%d0%b4%d0%be%d1%81%d0%bb%d0%be%d0%b2%d0%bd%d0%be" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;«если управление тангажем через мышь то WASD должны от 1го лица двигать камеру».&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/ui/01-menyu-i-polyot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/ui/01-menyu-i-polyot/</guid><description>&lt;h1 id="11-01-меню-фото--кнопки-полёт-с-выбором-старта-на-карте-управление"&gt;11-01. Меню «фото + кнопки», «Полёт…» с выбором старта на карте, «Управление»&lt;a class="anchor" href="#11-01-%d0%bc%d0%b5%d0%bd%d1%8e-%d1%84%d0%be%d1%82%d0%be--%d0%ba%d0%bd%d0%be%d0%bf%d0%ba%d0%b8-%d0%bf%d0%be%d0%bb%d1%91%d1%82-%d1%81-%d0%b2%d1%8b%d0%b1%d0%be%d1%80%d0%be%d0%bc-%d1%81%d1%82%d0%b0%d1%80%d1%82%d0%b0-%d0%bd%d0%b0-%d0%ba%d0%b0%d1%80%d1%82%d0%b5-%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; закрыть «в работе» TODO: простое меню (FR-27), выбор старта на карте (FR-17), «Полёт…» (FR-34), «Управление».&#10;&lt;strong&gt;Контекст:&lt;/strong&gt; REQUIREMENTS.md (FR-17, FR-27, FR-34), docs/guide/game.md («Как добавить экран»), scripts/ui/start_menu.gd,&#10;scripts/ui/flight_setup_screen.gd, scripts/ui/controls_screen.gd, scripts/ui/ui_kit.gd.&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;scripts/ui/start_menu.gd&lt;/code&gt;, &lt;code&gt;scripts/ui/flight_setup_screen.gd&lt;/code&gt;, &lt;code&gt;scripts/ui/controls_screen.gd&lt;/code&gt;,&#10;&lt;code&gt;scripts/ui/ui_kit.gd&lt;/code&gt;, соответствующие &lt;code&gt;scenes/ui/*.tscn&lt;/code&gt;, &lt;code&gt;configs/ui.json&lt;/code&gt; (ключи menu*/setup*/map*), новый&#10;&lt;code&gt;tests/ui/test_menu_setup.gd&lt;/code&gt;, &lt;code&gt;docs/screenshots/ui/&lt;/code&gt;. Не трогать &lt;code&gt;scripts/game/*&lt;/code&gt; (FlightSettings — только читать).&#10;&lt;strong&gt;Шаги:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Главное меню: фоновое фото (из &lt;code&gt;configs/ui.json&lt;/code&gt;), кнопки по центру вертикально: «Лететь», «Полёт…»,&#10;«Управление», «Настройки», «Об игре», «Выход». «Лететь» — последний выбор (UserSettings).&lt;/li&gt;&#10;&lt;li&gt;«Полёт…»: крыло, масса, погода, ветер, место, старт списком и на карте; выбранная точка карты → ближайший склон&#10;(StartPlacement), подпись «старт: …»; все 4 локации из &lt;code&gt;configs/locations/&lt;/code&gt;. Режима «задание/тренировка» НЕТ.&lt;/li&gt;&#10;&lt;li&gt;«Управление»: таблица клавиш из &lt;code&gt;configs/controls.json&lt;/code&gt; (W+Shift разбег, мышь, 1–5, C, Esc, геймпад).&lt;/li&gt;&#10;&lt;li&gt;Все строки через tr(), ключи в &lt;code&gt;locale/ui.csv&lt;/code&gt; (только ru; en — вне объёма).&lt;/li&gt;&#10;&lt;li&gt;Скриншоты 1920×1080 и 1280×720: меню, «Полёт…», карта, «Управление».&#10;&lt;strong&gt;КРИТЕРИЙ ПРИЁМКИ:&lt;/strong&gt; &lt;code&gt;test_menu_setup.gd&lt;/code&gt; ≥ 6 проверок (6 кнопок в порядке FR-27; &lt;code&gt;fly_requested&lt;/code&gt; с выбранными&#10;крылом/массой/местом; выбор на карте даёт site или latlon; 4 локации в списке; «Управление» содержит все действия&#10;InputMap; нет строк без tr()). 8 скриншотов с чек-листом в &lt;code&gt;docs/screenshots/ui/README.md&lt;/code&gt; (ничего не обрезано,&#10;текст читаем, кнопки по центру). tests/game/test_ui.gd зелёный; &lt;code&gt;tools/check.sh&lt;/code&gt; зелёный.&#10;&lt;strong&gt;Зависимости:&lt;/strong&gt; нет (волна 1). &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; M.&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/ui/02-pauza-nastrojki-itog/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/ui/02-pauza-nastrojki-itog/</guid><description>&lt;h1 id="11-02-пауза-настройки-с-вариометром-90-х-об-игре-итог-свободного-полёта"&gt;11-02. Пауза, настройки (с вариометром 90-х), «Об игре», итог свободного полёта&lt;a class="anchor" href="#11-02-%d0%bf%d0%b0%d1%83%d0%b7%d0%b0-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d1%81-%d0%b2%d0%b0%d1%80%d0%b8%d0%be%d0%bc%d0%b5%d1%82%d1%80%d0%be%d0%bc-90-%d1%85-%d0%be%d0%b1-%d0%b8%d0%b3%d1%80%d0%b5-%d0%b8%d1%82%d0%be%d0%b3-%d1%81%d0%b2%d0%be%d0%b1%d0%be%d0%b4%d0%bd%d0%be%d0%b3%d0%be-%d0%bf%d0%be%d0%bb%d1%91%d1%82%d0%b0" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; закрыть «в работе» TODO этапа 4 по экранам: пауза/настройки (FR-27, FR-33, NFR-6), FR-25a (выбор звука&#10;вариометра 90-х), «Об игре» (FR-27a), итог полёта без рекордов.&#10;&lt;strong&gt;Контекст:&lt;/strong&gt; REQUIREMENTS.md (FR-25a, FR-27, FR-27a, FR-33, NFR-6), scripts/ui/pause_menu.gd, scripts/ui/settings_panel.gd,&#10;scripts/ui/about_screen.gd, scripts/ui/result_screen.gd, docs/guide/instruments.md (&lt;code&gt;set_sound_settings&lt;/code&gt;).&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;scripts/ui/pause_menu.gd&lt;/code&gt;, &lt;code&gt;scripts/ui/settings_panel.gd&lt;/code&gt;, &lt;code&gt;scripts/ui/about_screen.gd&lt;/code&gt;,&#10;&lt;code&gt;scripts/ui/assets_credits.gd&lt;/code&gt;, &lt;code&gt;scripts/ui/result_screen.gd&lt;/code&gt;, их &lt;code&gt;scenes/ui/*.tscn&lt;/code&gt;, &lt;code&gt;locale/ui.csv&lt;/code&gt;, новый&#10;&lt;code&gt;tests/ui/test_screens.gd&lt;/code&gt;. Не трогать &lt;code&gt;scripts/game/*&lt;/code&gt;.&#10;&lt;strong&gt;Шаги:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Пауза: «Продолжить», «Заново», «Настройки», «Управление», «В меню».&lt;/li&gt;&#10;&lt;li&gt;Настройки: громкости по шинам, чувствительность/инверсия/режим мыши, пресет графики, звук вариометра&#10;(XC Tracer / classic_90s) и показ вариометра 90-х на стойке — сохранение в &lt;code&gt;user://configs&lt;/code&gt; через&#10;&lt;code&gt;UserSettings.save_patch&lt;/code&gt;, применение без перезапуска (сигнал наружу, применяет Game).&lt;/li&gt;&#10;&lt;li&gt;«Об игре»: все записи ASSETS.md (CC-BY авторы, Copernicus/Terrarium, OFL), прокрутка.&lt;/li&gt;&#10;&lt;li&gt;Итог: заголовок по оценке посадки; время, дистанция, след, набор, макс. высота (если есть в info — см. docs/guide/game.md,&#10;карточка 12-03; нет поля — строку не показывать); кнопки «Заново», «Продолжить», «В меню».&lt;/li&gt;&#10;&lt;li&gt;Скриншоты: пауза, настройки, «Об игре», итог (мягкая посадка и авария).&#10;&lt;strong&gt;КРИТЕРИЙ ПРИЁМКИ:&lt;/strong&gt; &lt;code&gt;test_screens.gd&lt;/code&gt; ≥ 6 проверок (сохранение настроек и чтение после перезагрузки панели; выбор&#10;classic_90s пишет ключ; «Об игре» содержит каждого автора из ASSETS.md; &lt;code&gt;lines_for&lt;/code&gt; без поля не падает; кнопки итога&#10;эмитят 3 сигнала; нет строк без tr()). 5 скриншотов с чек-листом в &lt;code&gt;docs/screenshots/ui/README.md&lt;/code&gt;. &lt;code&gt;tools/check.sh&lt;/code&gt; зелёный.&#10;&lt;strong&gt;Зависимости:&lt;/strong&gt; нет (волна 1); строка макс. высоты — после 12-03. &lt;strong&gt;Модель:&lt;/strong&gt; sonnet. &lt;strong&gt;Размер:&lt;/strong&gt; M.&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/ui/README/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/ui/README/</guid><description>&lt;h1 id="группа-11--интерфейс-ui"&gt;Группа 11 — Интерфейс (&lt;code&gt;ui/&lt;/code&gt;)&lt;a class="anchor" href="#%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d0%b0-11--%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81-ui" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Владения: &lt;code&gt;scripts/ui/&lt;/code&gt;, &lt;code&gt;scenes/ui/&lt;/code&gt;, &lt;code&gt;locale/&lt;/code&gt;, &lt;code&gt;configs/ui.json&lt;/code&gt;, &lt;code&gt;tests/ui/&lt;/code&gt; (новая). Экраны наружу — только сигналы.&#10;&lt;strong&gt;Фокус:&lt;/strong&gt; UI сценария свободного полёта. Выбор режима задание/тренировка и рекорды на итоге — ОТЛОЖЕНО.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Волна&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Карточка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Модель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Размер&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Владения&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/ui/01-menyu-i-polyot/"&gt;01 Меню, «Полёт…», карта, «Управление»&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;start_menu, flight_setup_screen, controls_screen, ui_kit, ui.json&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/ui/02-pauza-nastrojki-itog/"&gt;02 Пауза, настройки, «Об игре», итог&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;pause_menu, settings_panel, about_screen, assets_credits, result_screen, locale/ui.csv&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Обе карточки идут параллельно с game/01–02. &lt;code&gt;locale/ui.csv&lt;/code&gt; — у 11-02; 11-01 присылает новые ключи списком&#10;(или дописывает после 11-02). Вне объёма: выбор времени старта (VR-5), английский (NFR-4), «Как летать».&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/vegetation/01-nastrojki-travinki/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/vegetation/01-nastrojki-travinki/</guid><description>&lt;h1 id="v01-свой-конфиг-растительности-и-травинки-вблизи-рекомендации-1-3-4"&gt;V01. Свой конфиг растительности и травинки вблизи (рекомендации 1, 3, 4)&lt;a class="anchor" href="#v01-%d1%81%d0%b2%d0%be%d0%b9-%d0%ba%d0%be%d0%bd%d1%84%d0%b8%d0%b3-%d1%80%d0%b0%d1%81%d1%82%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b8-%d1%82%d1%80%d0%b0%d0%b2%d0%b8%d0%bd%d0%ba%d0%b8-%d0%b2%d0%b1%d0%bb%d0%b8%d0%b7%d0%b8-%d1%80%d0%b5%d0%ba%d0%be%d0%bc%d0%b5%d0%bd%d0%b4%d0%b0%d1%86%d0%b8%d0%b8-1-3-4" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; трава у земли дешевле вдали, приминается только ногами, посадки скошены прямоугольником, сухость по локации;&#10;настройки растительности — в своём файле, чтобы группа не делила &lt;code&gt;configs/world.json&lt;/code&gt; с рельефом.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/plan/README.md (группа 5, «Рекомендации для GrassField»), docs/guide/terrain.md («Ветер на земле», травинки),&#10;scripts/terrain/grass_field.gd, grass.gdshader, terrain.gd (&lt;code&gt;_make_grass&lt;/code&gt;, &lt;code&gt;trees_cfg&lt;/code&gt;), docs/guide/world-objects.md (&lt;code&gt;get_landing_sites&lt;/code&gt;).&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;configs/vegetation.json&lt;/code&gt; (новый), &lt;code&gt;configs/world.json&lt;/code&gt; (только удалить разделы &lt;code&gt;grass&lt;/code&gt;, &lt;code&gt;trees&lt;/code&gt;),&#10;&lt;code&gt;scripts/terrain/{grass_field.gd, grass.gdshader, terrain.gd}&lt;/code&gt; (в terrain.gd — только чтение конфига и вызовы травы),&#10;&lt;code&gt;tests/vegetation/&lt;/code&gt; (новая), &lt;code&gt;docs/guide/vegetation.md&lt;/code&gt; (новый), &lt;code&gt;docs/guide/terrain.md&lt;/code&gt; (таблица файлов → ссылка на vegetation.md).&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/vegetation/02-derevya-po-maske-dalnij-ton/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/vegetation/02-derevya-po-maske-dalnij-ton/</guid><description>&lt;h1 id="v02-деревья-и-импостеры-по-кромке-10-м-ровный-тон-с-высоты-vr-21-vr-6"&gt;V02. Деревья и импостеры по кромке 10 м, ровный тон с высоты (VR-21, VR-6)&lt;a class="anchor" href="#v02-%d0%b4%d0%b5%d1%80%d0%b5%d0%b2%d1%8c%d1%8f-%d0%b8-%d0%b8%d0%bc%d0%bf%d0%be%d1%81%d1%82%d0%b5%d1%80%d1%8b-%d0%bf%d0%be-%d0%ba%d1%80%d0%be%d0%bc%d0%ba%d0%b5-10-%d0%bc-%d1%80%d0%be%d0%b2%d0%bd%d1%8b%d0%b9-%d1%82%d0%be%d0%bd-%d1%81-%d0%b2%d1%8b%d1%81%d0%be%d1%82%d1%8b-vr-21-vr-6" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; модели и импостеры стоят ровно по кромке леса из маски 10 м, опушка читается стеной деревьев; на 2 км импостеры&#10;не темнее полога и без ступеньки яркости на границе 3,5 км.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/terrain.md («Лес с высоты — три плана»), docs/guide/vegetation.md (V01), scripts/terrain/tree_placer.gd,&#10;forest_impostors.gd/.gdshader, terrain_tree_models.gd, API &lt;code&gt;Terrain.get_forest_mask()&lt;/code&gt; из T02.&#10;&lt;strong&gt;Владения:&lt;/strong&gt; &lt;code&gt;scripts/terrain/{tree_placer.gd, terrain_tree_models.gd, tree_model.gdshader, forest_impostors.gd, forest_impostors.gdshader, terrain_trees.gd, trees.gdshader}&lt;/code&gt;, &lt;code&gt;configs/vegetation.json&lt;/code&gt; (trees), &lt;code&gt;tests/vegetation/&lt;/code&gt;, &lt;code&gt;docs/guide/vegetation.md&lt;/code&gt;.&#10;&lt;strong&gt;Не трогать:&lt;/strong&gt; terrain.gd (вызов &lt;code&gt;set_forest_mask&lt;/code&gt; уже добавлен T02), terrain.gdshader.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/vegetation/README/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/vegetation/README/</guid><description>&lt;h1 id="группа-5-растительность--карточки"&gt;Группа 5 «Растительность» — карточки&lt;a class="anchor" href="#%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d0%b0-5-%d1%80%d0%b0%d1%81%d1%82%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d1%8c--%d0%ba%d0%b0%d1%80%d1%82%d0%be%d1%87%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Файлы растительности пока остаются в &lt;code&gt;scripts/terrain/&lt;/code&gt; (перенос в &lt;code&gt;scripts/vegetation/&lt;/code&gt; не нужен для основы — владение по списку файлов).&#10;Настройки — &lt;code&gt;configs/vegetation.json&lt;/code&gt; (создаёт V01), документ — &lt;code&gt;docs/guide/vegetation.md&lt;/code&gt; (создаёт V01). Замеры — стенд T01 группы рельефа.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;#&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Карточка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Модель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Размер&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Волна&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;V01&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/vegetation/01-nastrojki-travinki/"&gt;Свой конфиг и травинки вблизи&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sonnet&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 (‖ T01)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;V02&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="https://thegriglat.github.io/deltaplan/plans/archive/vegetation/02-derevya-po-maske-dalnij-ton/"&gt;Деревья по кромке 10 м, тон с высоты&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;opus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2 (‖ T03, T04), после T02&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Волны порывов по траве (рекомендация 2) — в &lt;code&gt;terrain/05&lt;/code&gt; (это &lt;code&gt;TerrainWind&lt;/code&gt;, владелец — группа 4); трава получает их через include.&lt;/li&gt;&#10;&lt;li&gt;Не вошло (при необходимости — следующей карточкой после V02): вариации деревьев (2–3 сида, импостеры 8 ракурсов, &lt;code&gt;tools/blender/build_trees.py&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;Подключение в игре (&lt;code&gt;set_landing_sites&lt;/code&gt; из &lt;code&gt;WorldObjects.get_landing_sites&lt;/code&gt;, &lt;code&gt;set_pilot&lt;/code&gt;) — группа «Сцена игры».&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/weather-by-temperature/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/weather-by-temperature/</guid><description>&lt;h1 id="план-погода-из-прогноза--температура-и-ветер-вместо-пресетов"&gt;План: погода из прогноза — температура и ветер вместо пресетов&lt;a class="anchor" href="#%d0%bf%d0%bb%d0%b0%d0%bd-%d0%bf%d0%be%d0%b3%d0%be%d0%b4%d0%b0-%d0%b8%d0%b7-%d0%bf%d1%80%d0%be%d0%b3%d0%bd%d0%be%d0%b7%d0%b0--%d1%82%d0%b5%d0%bc%d0%bf%d0%b5%d1%80%d0%b0%d1%82%d1%83%d1%80%d0%b0-%d0%b8-%d0%b2%d0%b5%d1%82%d0%b5%d1%80-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%be-%d0%bf%d1%80%d0%b5%d1%81%d0%b5%d1%82%d0%be%d0%b2" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Запрос пилота&lt;/strong&gt; (пилот-консультант, опытный дельтапланерист): выбор «Слабый / Средний / Сильный день /&#10;Гроза / Волна» для пилота странный. Пилот знает из прогноза &lt;strong&gt;температуру воздуха, направление и силу ветра&lt;/strong&gt; —&#10;это и задаём. Всё остальное (сила и частота термиков, кромка, облачность, сухие термики, пылевые вихри, грозы,&#10;болтанка…) выводится из этих трёх чисел плюс уже известных даты, места и рельефа — правдоподобно физически.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/wind-field/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/wind-field/</guid><description>&lt;h1 id="план-поле-ветра-на-сетке-согласованное-по-массе-в-compute-шейдерах"&gt;План: поле ветра на сетке, согласованное по массе, в compute-шейдерах&lt;a class="anchor" href="#%d0%bf%d0%bb%d0%b0%d0%bd-%d0%bf%d0%be%d0%bb%d0%b5-%d0%b2%d0%b5%d1%82%d1%80%d0%b0-%d0%bd%d0%b0-%d1%81%d0%b5%d1%82%d0%ba%d0%b5-%d1%81%d0%be%d0%b3%d0%bb%d0%b0%d1%81%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d0%be%d0%b5-%d0%bf%d0%be-%d0%bc%d0%b0%d1%81%d1%81%d0%b5-%d0%b2-compute-%d1%88%d0%b5%d0%b9%d0%b4%d0%b5%d1%80%d0%b0%d1%85" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Статус: &lt;strong&gt;заменён планом &lt;code&gt;docs/plan/air_model.md&lt;/code&gt;&lt;/strong&gt; (три масштаба, среднее поле — Пикар); разделы этого документа переиспользуются по ссылкам оттуда. Было: план (29.09.2026), в работу не взят; кодинг — в отдельной ветке. Документ — для координатора агентов: модули, задачи со скоупом, ключевыми файлами, условиями приёмки и оценкой. Основа — исследование &lt;code&gt;docs/research/slope_wind.md&lt;/code&gt; (§8 — слова пилота, §9 — математика, §10 — согласование с термиками и сетью). Пути к файлам проверены по коду на 29.09; новые файлы — предложение, исполнитель может уточнить.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/wing-physics-check-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/wing-physics-check-progress/</guid><description>&lt;h1 id="журнал-проверка-физики-и-параметров-крыльев-wing-physics-check"&gt;Журнал: проверка физики и параметров крыльев (wing-physics-check)&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d1%84%d0%b8%d0%b7%d0%b8%d0%ba%d0%b8-%d0%b8-%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80%d0%be%d0%b2-%d0%ba%d1%80%d1%8b%d0%bb%d1%8c%d0%b5%d0%b2-wing-physics-check" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;План — &lt;code&gt;docs/archive/plan/wing-physics-check.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/wing-physics-check.md&lt;/code&gt; (К1–К6 v1, тест &lt;code&gt;tests/contracts/test_wing_physics_contracts.gd&lt;/code&gt;, 5/5 ok). Ветка &lt;code&gt;feature/wing-physics-check&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-wing-physics-check&lt;/code&gt; (от main 3820bda).&lt;/p&gt;&#10;&lt;h2 id="задачи"&gt;Задачи&lt;a class="anchor" href="#%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Задача&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Статус&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Исполнитель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Копия / ветка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Коммиты&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Ключевые числа&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WPC-1 паспорта против модели&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;(удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4b3b577, слияние 7a51574&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;модель = конфиг (трим ±0,73 %, «на себя» ±1,59 %), плотность √(ρ0/ρ) ±0,19 %; против 6 м/с на триме +2,3…+4,2 м/с, «на себя» +9…+21; 38 расхождений &amp;gt; 10 % с паспортом (сваливание у новых −11…−30 %, Vmax учебных −11…−27 %, спортивных +10…+36 % к DHV VG 0) — от подобия К4; atlas: срыв 12,6° &amp;lt; нейтраль разбега 16°&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WPC-2 ветер у склона&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-researcher&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;(удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;576550e, слияние 27f4b15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6 м/с, над стартом U/меню: аналитика 10 м 1,02, 100 м 1,85; поле 10 м 1,40 (1,03–2,10), 100 м 2,12 (1,60–2,51) = 9,6–15 м/с &amp;gt; трим 8,6–10,8; динамик 3 м/с поле w мед. 0,77 (0,21–1,36) — пограничный&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WPC-4 конфиги по паспортам&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;(удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;638c0fb, e9126b0, слияние a47bbc4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;38 конфигов; макс. отклонение модель/паспорт: сваливание 1,0 %, трим 0,4 %, «на себя» 3,0 %, мин. снижение 9,9 %, его скорость 8,1 %, качество 8,4 %; путевая против 6 м/с на триме &amp;gt; 0 у всех 48 (мин. 1,6 м/с, 85 кг); atlas нейтраль 16→8° (запас 4,45°); тесты: wing_passports 4/4, contracts 33/33, flight 84/84, wing_models_contract 4/4&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WPC-3 пачка полётов&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (01.10)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;(удалена)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;f4cbfd3, eaa2a59, слияние aa9dfa6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4160 запусков, 31 мин; 6 м/с трим: аналитика путевая ср. +0,5/+1,2/−0,7 м/с на 30/100/200 м (ветер в точке 9,6/9,0/10,5), поле (4 крыла) −0,2/−1,5/−3,3 (ветер 10,0/11,3/13,2) — сносит; «на себя» мин. +3,2 везде; 3 м/с — вперёд везде. Поле — «до air-start»&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="решения-и-события"&gt;Решения и события&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b8-%d1%81%d0%be%d0%b1%d1%8b%d1%82%d0%b8%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;01.10 — модуль заведён по отзыву пилота (1.0.0: «6 м/с — сдувает, 3 м/с — не набрать»). Контракты К1–К3 зафиксированы по коду main, К4–К6 — форматы данных волны 1. Первичный осмотр: параметры крыльев по порядку величины реальны (трим 28,5–38,8 км/ч, «на себя» 55–101 км/ч); подозрение — профиль ветра над гребнем (U10 меню + степенной профиль α 0,24 над местной землёй + множитель высоты) и/или поле воздуха на GPU. Параллельно работает &lt;code&gt;feature/control-fix&lt;/code&gt; (ввод/старт) — его зону не трогаем.&lt;/li&gt;&#10;&lt;li&gt;01.10 — дополнение пилота о старте при 0/3/6/10 м/с (через главную сессию): WPC-1 — Vmin/CL_max и скорость отрыва против бега пилота (К4 v2: новые значения quantity, колонки те же); WPC-2 — ветер 10 м/с и высоты 1–5 м над стартом/полосой разбега. Исполнителям отправлено сообщением. Логика разбега — зона feature/control-fix, не правим.&lt;/li&gt;&#10;&lt;li&gt;01.10 — сужение (пилот: главная проблема — управление на старте, зона feature/control-fix): доделать WPC-1..3, WPC-3 — поле только по 1 крылу на группу (slavutich_ut, training, laminar, combat), ≤ ~1 ч; волну 2 (правки параметров) не начинать без решения на шлюзе. WPC-3 уведомлён.&lt;/li&gt;&#10;&lt;li&gt;01.10 — пилот: паспорта крыльев считать верными — эталон, не пересматривать; WPC-1 проверяет только соответствие модели паспорту (Vmin/трим/Vmax/снижение/качество). Работу не расширять, довершить текущие замеры и отчёт. WPC-1 уведомлён.&lt;/li&gt;&#10;&lt;li&gt;01.10 — сбой сети: WPC-1..3 оборвались (WPC-1 — незакоммиченные файлы в tools/research/wing_physics_check/, WPC-2/3 — без файлов), возобновлены сообщением с прежними урезанными рамками; WPC-2 — поле только на 2 стартах (kayancha_south, aushtau_east) ≤ ~1 ч.&lt;/li&gt;&#10;&lt;li&gt;01.10 — WPC-2 принята (перепроверено по csv: 6 м/с, поле на 10 м над стартом 6,2–12,6 м/с, на 100 м 9,6–15,0; аналитика 6,1–6,3 / 11,1). Главная находка: в режиме поля (GPU, как у пилота) ветер меню задаёт приток на краю области 38 км (&lt;code&gt;AirRuntime.conditions_of&lt;/code&gt; air_runtime.gd:161–167 → &lt;code&gt;AirCase&lt;/code&gt; u_a = u10·max_profile air_case.gd:236–238), а не U10 на старте, хотя комментарий conditions_of говорит «на 10 м у старта»; над стартом поле даёт 1,0–2,1 × меню на 10 м. Аналитика: U10 на старте = меню, выше профиль на 10–47 % круче Taylor &amp;amp; Lee (отсчёт от местной земли + множитель высоты). Динамик при 3 м/с в поле — пограничный (физика). Применение к аппарату — в норме. Рекомендация исполнителя: пересчёт притока под U10 на старте (правка в AirRuntime — зона air-model, через шлюз). К3 v2 — после решения.&lt;/li&gt;&#10;&lt;li&gt;01.10 — WPC-1 принята (перепроверено: atlas CL_max 1,46, α срыва 12,6° при launch.alpha_neutral_deg 16°; ground_run.gd:239–242 — предел скорости бега v_cap = 6,5·(1 + 0,3·разгрузка) без учёта склона). По характеристикам крыльев любое мягкое крыло идёт против 6 м/с — «сдувает» не от поляр. Расхождения с паспортами (сваливание/Vmax новых крыльев от подобия К4) не правим — сужение объёма; вынесено в открытые вопросы шлюза. Конфликт README WPC-1/WPC-2 решён объединением разделов.&lt;/li&gt;&#10;&lt;li&gt;01.10 — находка control-fix (CF-1): в режиме поля у крыла на 1,5 м над стартом σw 0,4–1,05 м/с, направление ±90–180° — турбулентность поля (появилась между 551e79b и 041d8ed); бисект ведёт CF-1. Наши замеры: WPC-1 — штиль без поля (не затронут), WPC-2 — поле с выключенной турбулентностью (средние, не затронуты болтанкой), WPC-3 — турбулентность как в игре, исполнителю велено указать и оценить разброс.&lt;/li&gt;&#10;&lt;li&gt;01.10 — шлюз 1 (отчёт главной сессии) и решения пользователя: (1) ветер в поле — подстроить под старт, делает feature/air-start (вместе с турбулентностью CF-1), профиль аналитики не сплющиваем, модель воздуха здесь не правим; (2) конфиги крыльев — к паспортам, Vmax спортивных — DHV VG 0; (3) atlas alpha_neutral — по физике в той же задаче, control-fix — через главную сессию; (4) WPC-3 доводим, числа поля — «до air-start», повтор поля (WPC-9) — после готовности air-start. К1 → v2 (инвариант угла разбега). Запущена WPC-4.&lt;/li&gt;&#10;&lt;li&gt;01.10 — WPC-3 принята (перепроверено по csv: 6 м/с, трим, поле — на 100 и 200 м сносит 16/16 полётов, аналитика — 18/192 на 100 м, 122/192 на 200 м; на «на себя» путевая ≥ +3,2 м/с во всех 4160 запусках). Вывод: при 6 м/с из меню у старта и выше ветер 9–13 м/с — выше трима; аппарат «сдувает» на триме и он идёт вперёд только с подтянутой трапецией. В поле причина — завышение ветра (air-start); в аналитике — рост α с ветром (класс устойчивости) + отсчёт профиля от местной земли (вариант 2 пользователь не выбрал). Турбулентность включена во всех сериях: СКО путевой за окно 1–3,3 м/с, ошибка среднего ≈ ±1 м/с (аналитика) / ±0,5 (поле). Серия ridge искажена касаниями земли (поиск рабочей линии на триме) — только ориентир. Числа поля — «до исправления air-start»; повтор поля (WPC-9) — после готовности air-start: &lt;code&gt;tools/flight/wind_penetration_batch.sh field&lt;/code&gt;. К3 — уточнена формулировка α (зависит от класса устойчивости), версия прежняя. Конфликт README решён объединением.&lt;/li&gt;&#10;&lt;li&gt;01.10 — просьба control-fix (через главную сессию): atlas launch.alpha_neutral_deg ≈ 8° (срыв 12,5°, CL нейтрали ≈ 0,76·CL_max как у других, запас ≈ 4,5°) — передано в WPC-4 (с тем же правилом для крыльев, у которых CL_max меняется по паспорту). Для сведения: control-fix (CF-1) снял предел скорости бега на склоне (ground_run.gd, их ветка): разбег в штиль спорт 67 → 13 м, atlas 64 → 18 м — вывод WPC-1 «штилевой отрыв ограничен v_cap 30,4 км/ч» после их слияния неактуален; серия WPC-3 в воздухе этим не затронута.&lt;/li&gt;&#10;&lt;li&gt;01.10 — WPC-4 принята (перепроверено в копии задачи: test_wing_passports 4/4, tests/contracts 33/33, tests/flight 84/84, test_wing_models_contract 4/4; после слияния в ветке модуля: contracts 33/33, flight 84/84, game 120/120; CHANGELOG — строка в «В работе»). Генератор &lt;code&gt;tools/research/data/wing_passports/fit_passports.py --from-rev 2df5c2f&lt;/code&gt; (поляра целиком: подобие s + срез на паспортном сваливании; нейтраль разбега — прежняя доля CL_max, только вниз; alpha_range уменьшен на столько же, упор «нос вниз» прежний — иначе падал test_wing_clearance). Открытые вопросы на шлюз: CL_max по паспортам 1,13 (condor_crex3, DHV Vmin 34,5) … 2,91 (bautek_kite, «ca.» производителя); мин. снижение 0,69–0,74 у ww_t2c, ww_sport3, bautek_astir/kite (следствие паспортной Vms при прежнем качестве, своего мин. снижения в паспорте нет — вероятно, оптимистично); aeros_discus трим 1,06·Vs; ход трапеции на разбеге 8,5–10,5° у crex3, dp_she1, alto, piuma (control-fix). Для control-fix — таблица запаса «α срыва − нейтраль» по 27 крыльям — в отчёте шлюза.&lt;/li&gt;&#10;&lt;li&gt;01.10 — шлюз 2 (итог модуля) — отчёт главной сессии. Ждут решения: открытые вопросы WPC-4 (CL_max/мин. снижение по паспортам «ca.»), слияние в main. Ждёт air-start: WPC-9 — повтор поля &lt;code&gt;tools/flight/wind_penetration_batch.sh field&lt;/code&gt; после исправления ветра в поле.&lt;/li&gt;&#10;&lt;li&gt;01.10 — решения пользователя по шлюзу 2: «ca.»-скорости оставить (паспорт — эталон); aeros_discus трим — середина диапазона 33–35 (fit_passports.py → PASSPORT_RANGE_MID, конфиг 33,4 → 34,4 км/ч при 129 кг, фикстура обновлена, генерация воспроизводится бит в бит, К1 v2 и допуски — без нарушений); слияние в main одобрено (вливает главная сессия). Свежий main подтянут в ветку модуля. WPC-9 открыт (после air-start).&lt;/li&gt;&#10;&lt;li&gt;01.10 — после правки Discus и слияния main (c4f9b9b): test_wing_passports 4/4, tests/contracts 33/33, tests/flight 84/84, tests/game 120/120 (в первом прогоне test_e2e_all_locations упал один раз под нагрузкой; отдельно 1/1 и повтор tests/game 120/120 — не регрессия). Готово к слиянию в main (вливает главная сессия).&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/wing-physics-check/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/wing-physics-check/</guid><description>&lt;h1 id="проверка-физики-и-параметров-крыльев-модуль-wing-physics-check"&gt;Проверка физики и параметров крыльев (модуль wing-physics-check)&lt;a class="anchor" href="#%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d1%84%d0%b8%d0%b7%d0%b8%d0%ba%d0%b8-%d0%b8-%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80%d0%be%d0%b2-%d0%ba%d1%80%d1%8b%d0%bb%d1%8c%d0%b5%d0%b2-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8c-wing-physics-check" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Ветка &lt;code&gt;feature/wing-physics-check&lt;/code&gt;, копия &lt;code&gt;~/deltaplan-wing-physics-check&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 3820bda). Журнал — &lt;code&gt;docs/archive/plan/wing-physics-check-progress.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/wing-physics-check.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="повод"&gt;Повод&lt;a class="anchor" href="#%d0%bf%d0%be%d0%b2%d0%be%d0%b4" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Отзыв пилота (версия 1.0.0): «6 м/с — сдувает, при 3 м/с не набрать высоту. Пробовала на всех, кроме жесткокрылов». То есть на мягких крыльях при ветре 6 м/с аппарат сносит назад (не держится против ветра), при 3 м/с не удаётся набрать высоту (динамик/термики).&lt;/p&gt;&#10;&lt;p&gt;Ожидание из реальности: триммер ~31–39 км/ч (учебные ~30, спортивные ~37), Vmax 55–100 км/ч; против ветра 6 м/с (21,6 км/ч) аппарат идёт уверенно, на отданной ручке — с запасом; парение в динамике при 3 м/с на хорошем склоне — пограничное, но реальное, при 5–6 м/с — обычное.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/wings-lineup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/wings-lineup/</guid><description>&lt;h1 id="план-линейка-крыльев--классы-модели-выбор-в-полёт-3d"&gt;План: линейка крыльев — классы, модели, выбор в «Полёт…», 3D&lt;a class="anchor" href="#%d0%bf%d0%bb%d0%b0%d0%bd-%d0%bb%d0%b8%d0%bd%d0%b5%d0%b9%d0%ba%d0%b0-%d0%ba%d1%80%d1%8b%d0%bb%d1%8c%d0%b5%d0%b2--%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d1%8b-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d0%b8-%d0%b2%d1%8b%d0%b1%d0%be%d1%80-%d0%b2-%d0%bf%d0%be%d0%bb%d1%91%d1%82-3d" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Запрос&lt;/strong&gt; (пользователь и два пилота-консультанта, оба опытные дельтапланеристы): широкая линейка реальных&#10;крыльев, сгруппированных по классам; группы упорядочены по качеству и по ветру, в котором на крыле&#10;комфортно летать. В «Полёт…» сначала выбирается &lt;strong&gt;группа&lt;/strong&gt;, потом &lt;strong&gt;модель&lt;/strong&gt; в ней. Своя поляра,&#10;управляемость и масса у каждого крыла; своя 3D-модель. Один пилот летал на &lt;strong&gt;Icaro Laminar&lt;/strong&gt; (мачтовом) —&#10;оно обязательно. Другой летал на советском &lt;strong&gt;«Апогее»&lt;/strong&gt; В. Мысенко — тоже.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/wings-models3d-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/wings-models3d-progress/</guid><description>&lt;h1 id="журнал-3d-модели-и-конфиги-крыльев-по-тз"&gt;Журнал: 3D-модели и конфиги крыльев по ТЗ&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-3d-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d0%b8-%d0%b8-%d0%ba%d0%be%d0%bd%d1%84%d0%b8%d0%b3%d0%b8-%d0%ba%d1%80%d1%8b%d0%bb%d1%8c%d0%b5%d0%b2-%d0%bf%d0%be-%d1%82%d0%b7" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Координатор: dp-coordinator. Рабочая копия &lt;code&gt;~/deltaplan-wings3d&lt;/code&gt;, ветка &lt;code&gt;wings/models3d&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 5df933e). В &lt;code&gt;main&lt;/code&gt; не вливается — отчёт главной сессии. План — &lt;code&gt;docs/archive/plan/wings-models3d.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/wings-models3d.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Задача&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Статус&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Исполнитель&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Копия / ветка&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Коммиты, числа, решения&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Контракты К1–К4 + контрактный тест&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;сделано (2026-10-01)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;координатор&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;~/deltaplan-wings3d&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;tests/game/test_wing_models_contract.gd&lt;/code&gt;: на main 2 падения, ожидаемые (training площадь 15,32 против 15,80 м², −3 %; sport &lt;code&gt;lower_cover&lt;/code&gt; 0,70 при 92 % двойной) — чинит W3-01&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;W3-01 существующие крылья по E1–E9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (2026-10-01), влита 50794f3, копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wings3d/w3-01&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;bd54c0a, 811b8dd. training tip 0,90→1,00 (площадь 15,32→15,81 м²); sport латы 14→11, нос 132→128°, nose_forward 1,35, lower_cover 0,70→0,88; combat латы 16→12; laminar 13→9. Все 9 — площадь ±0,6 %. Треугольники: training 13 112, sport 13 268, combat 13 844, laminar 12 560 (≤ 14 000). check_models — крылья из configs/wings, добавлен бюджет на крыло. Тесты крыльев и контрактный — 0 падений (перепроверено). Кадры — build/screenshots/w3-01/&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;W3-02 шаблон новой модели (К3, К4), проба N1/N24&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (2026-10-01), влита b62b500, копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wings3d/w3-02&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;b9bef60, 2ad95ea, 82259ed, c96096e; после слияния координатор перегенерировал ТЗ/спецификацию на новых базах W3-01 и пересобрал N1 — 3cef695. &lt;code&gt;make_3d_tz.py&lt;/code&gt; → &lt;code&gt;out/wings3d_spec.json&lt;/code&gt; (39 крыльев, сверка с «Что задать» OK, &lt;code&gt;--check&lt;/code&gt;); &lt;code&gt;make_new_wings.py &amp;lt;id…&amp;gt;/--existing/--all&lt;/code&gt; — запись формы, конфиг (К4), &lt;code&gt;ui.csv&lt;/code&gt;, идемпотентно; правки вида — &lt;code&gt;wings3d_overrides/&amp;lt;id&amp;gt;.json&lt;/code&gt;. N1 icaro_piuma: f 0,996, сваливание 23,9, трим 30,9, L/D 9 (= training), площадь 16,00/16,04, 12 728 треуг.; N24 ww_t2c: f 1,034, сваливание 27,9, трим 37,2, L/D 15 (= sport), 13,39/13,40, 13 268 треуг. DHV Vmin выше сваливания поляры у всех 22 крыльев с данными на 5–30 % (N1 −24 %, N24 −13 %) — на шлюз. Меню: самая длинная группа kingpost — 18 крыльев, 1280×720 прокручивается штатно, правок не нужно. Тесты test_wing_picker/test_wing_catalog — без жёстких списков. Перепроверено: check_models OK, 11 наборов тестов крыльев и test_ui — 0 падений. Кадры — build/screenshots/w3-02/&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;W3-DHV благодарность DHV на «Об игре» (игра, сайт) — просьба пользователя&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (2026-10-01), влита fe06857, копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-writer (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wings3d/w3-dhv&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;b82b3a9: ключ &lt;code&gt;about_thanks_dhv&lt;/code&gt; (ru/en) под &lt;code&gt;about_intro&lt;/code&gt; в &lt;code&gt;about_screen.gd&lt;/code&gt;; на сайте страницы «Об игре» нет — раздел «Благодарности» на главной &lt;code&gt;site/content/_index.md&lt;/code&gt; со ссылкой dhv.de; &lt;code&gt;ui_shot --only=about&lt;/code&gt; (общий ui_shot в копии падал «фон за меню не загрузился» — не разбиралось). test_ui 6/0 (перепроверено). Кадры — build/screenshots/w3-dhv/&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;W3-03 новые P1, пачка А: N2, N3, N4, N10–N15 (+ строки docs/guide/models.md N1, N24)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (2026-10-01), влита f59bed7, копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Opus)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wings3d/w3-03&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8f919e4, 53d7379. 9 крыльев, площадь ±0,3 %, 12 128–13 472 треуг.; новое необязательное поле К1 &lt;code&gt;top_wires&lt;/code&gt; (MastR); test_polar: класс качества MastR — topless. Конфликты glider_params/ui.csv сняты &lt;code&gt;make_new_wings.py --existing&lt;/code&gt; (записи совпали с обеими ветками), docs/guide/models.md объединён. После слияния: 27 крыльев, check_models OK, 11 наборов тестов — 0 падений (перепроверено). Кадры — build/screenshots/w3-03/&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;W3-04 новые P1, пачка Б: N20, N25, N26, N28, N29, N31, N32&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (2026-10-01), влита (слияние после 0a test_polar), копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wings3d/w3-04&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;cb8a056. 7 крыльев, площадь ±0,2 %, 11 696–13 844 треуг.; overrides: Z9 &lt;code&gt;short_battens&lt;/code&gt;, Fizz без luff-линий; reference.min_sink_speed_kmh Combat C/Z9 — замер sweep. Перепроверено: check_models OK, 11 наборов — 0 падений. Кадры — build/screenshots/w3-04/&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;W3-05 новые P2, пачка В: N5–N9, N16–N19&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (2026-10-01), влита 3591c05, копия удалена&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wings3d/w3-05&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;b3b22e0. 9 крыльев, площадь ±0,2 %, 11 840–13 844 треуг.; правок вида нет (заметки не выражаются полями К1). Конфликты сняты &lt;code&gt;--existing&lt;/code&gt; (записи совпали с обеими ветками). После слияния: 36 крыльев, check_models OK, 11 наборов — 0 падений (перепроверено). Кадры — build/screenshots/w3-05/ (в склейке у подписей срезана первая буква — косметика, не переделывалось)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;W3-06 новые P2, пачка Г: N21–N23, N27, N30, N33–N39&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;принята (2026-10-01), влита ca1ab89&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dp-engineer (Sonnet)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wings3d/w3-06&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;506ad01, 669b9c9, 2b783d8. 12 крыльев, площадь ±0,3 %, 11 840–13 844 треуг.; override: REV &lt;code&gt;faired_uprights&lt;/code&gt;, reference.min_sink_speed_kmh REV — замер. После слияния: 48 крыльев, check_models OK, контрактный и 16 наборов тестов, перебирающих крылья, — 0 новых падений (test_takeoff atlas падает и на чистом main 5df933e — не регрессия; test_wing_clearance — см. развилку). Кадры — build/screenshots/w3-06/&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Решения координатора:&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/wings-models3d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/wings-models3d/</guid><description>&lt;h1 id="план-3d-модели-и-конфиги-крыльев-по-тз-docsresearchglider_3d_tzmd"&gt;План: 3D-модели и конфиги крыльев по ТЗ (&lt;code&gt;docs/research/glider_3d_tz.md&lt;/code&gt;)&lt;a class="anchor" href="#%d0%bf%d0%bb%d0%b0%d0%bd-3d-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d0%b8-%d0%b8-%d0%ba%d0%be%d0%bd%d1%84%d0%b8%d0%b3%d0%b8-%d0%ba%d1%80%d1%8b%d0%bb%d1%8c%d0%b5%d0%b2-%d0%bf%d0%be-%d1%82%d0%b7-docsresearchglider_3d_tzmd" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Ветка &lt;code&gt;wings/models3d&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt; 5df933e), рабочая копия &lt;code&gt;~/deltaplan-wings3d&lt;/code&gt;, координатор — dp-coordinator. Задачи — в своих копиях &lt;code&gt;~/deltaplan-wings3d-&amp;lt;задача&amp;gt;&lt;/code&gt;, ветки &lt;code&gt;wings3d/&amp;lt;задача&amp;gt;&lt;/code&gt;. Журнал — &lt;code&gt;docs/archive/plan/wings-models3d-progress.md&lt;/code&gt;, контракты — &lt;code&gt;docs/contracts/wings-models3d.md&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="цель"&gt;Цель&lt;a class="anchor" href="#%d1%86%d0%b5%d0%bb%d1%8c" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Обновить 3D-модели 9 существующих крыльев по разделам E1–E9 ТЗ.&lt;/li&gt;&#10;&lt;li&gt;Конфиги существующих — сверены и поправлены прошлой работой (&lt;code&gt;docs/research/wings_config_sources.md&lt;/code&gt;); здесь — только то, что вытекает из правок 3D (согласованность К1/К2).&lt;/li&gt;&#10;&lt;li&gt;Добавить 39 новых крыльев N1–N39: запись &lt;code&gt;glider_params.json&lt;/code&gt;, модель &lt;code&gt;glider_&amp;lt;id&amp;gt;.glb&lt;/code&gt;, конфиг, перевод названия.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="решения-пользователя-не-обсуждаются"&gt;Решения пользователя (не обсуждаются)&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-%d0%bd%d0%b5-%d0%be%d0%b1%d1%81%d1%83%d0%b6%d0%b4%d0%b0%d1%8e%d1%82%d1%81%d1%8f" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Точность: достаточно, чтобы с 3 м было похоже; не шлифовать; мелкие визуальные детали — не больше 2 попыток, берётся лучшая.&lt;/li&gt;&#10;&lt;li&gt;Поляры: приоритет DHV; поляры без данных DHV не менять; абсолютным L/D заявок не верить; &lt;code&gt;combat.best_glide&lt;/code&gt; не калибровать.&lt;/li&gt;&#10;&lt;li&gt;Тип конструкции без цитаты — по году и классу, по умолчанию мачтовое.&lt;/li&gt;&#10;&lt;li&gt;Совместимость не нужна: форматы конфигов и моделей можно менять.&lt;/li&gt;&#10;&lt;li&gt;Внешние 3D-ассеты — только с подходящей лицензией (учёт в ASSETS.md). Здесь не нужны: модели строятся параметрическим скриптом.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="решения-пользователя-на-шлюзе-1-2026-10-01"&gt;Решения пользователя на шлюзе 1 (2026-10-01)&lt;a class="anchor" href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f-%d0%bd%d0%b0-%d1%88%d0%bb%d1%8e%d0%b7%d0%b5-1-2026-10-01" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Поляры новых крыльев — вариант А: пересчёт по нагрузке от базы; расхождение с DHV Vmin — в &lt;code&gt;_doc&lt;/code&gt;, относительно базы, без порога 10 % (К4 v2). Варианты Б (тянуть к DHV Vmin) и В (исследование определения Vmin) не делаем.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Приняты решения координатора: N19 Spyder — безмачтовое (&lt;code&gt;topless&lt;/code&gt;), N28 Litesport — мачтовое (&lt;code&gt;kingpost&lt;/code&gt;), N15 MastR — мачтовое с оценкой высоты мачты; К3 v2.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Дальше без шлюзов между волнами (если нет развилок): волна 2 (W3-03, W3-04), затем волна 3 (W3-05, W3-06), отчёт после волны 3 — что сделано, коммиты, по скриншоту на крыло (можно склейкой), открытые вопросы. Строки &lt;code&gt;docs/guide/models.md&lt;/code&gt; для N1, N24 — в волне 2. В main не вливать.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Уточнение (2026-10-01): задача волн 2–3 — добавить много крыльев, корректность — по отзывам игроков; развилки решает координатор сам (журнал: «развилка → решение → почему»), возврат раньше — только при блокировке.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/wings-passports-progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/wings-passports-progress/</guid><description>&lt;h1 id="журнал-паспорта-крыльев--конфиги-и-тз-на-3d-модели"&gt;Журнал: паспорта крыльев → конфиги и ТЗ на 3D-модели&lt;a class="anchor" href="#%d0%b6%d1%83%d1%80%d0%bd%d0%b0%d0%bb-%d0%bf%d0%b0%d1%81%d0%bf%d0%be%d1%80%d1%82%d0%b0-%d0%ba%d1%80%d1%8b%d0%bb%d1%8c%d0%b5%d0%b2--%d0%ba%d0%be%d0%bd%d1%84%d0%b8%d0%b3%d0%b8-%d0%b8-%d1%82%d0%b7-%d0%bd%d0%b0-3d-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Координатор: dp-coordinator (сессия 01K4ZH58…). Рабочая копия &lt;code&gt;~/deltaplan-wings&lt;/code&gt;, ветка &lt;code&gt;wings/passports&lt;/code&gt; (от &lt;code&gt;main&lt;/code&gt;, 1d8be1a). В &lt;code&gt;main&lt;/code&gt; не вливается — отчёт главной сессии.&lt;/p&gt;&#10;&lt;p&gt;Задача: (1) поправить &lt;code&gt;configs/wings/*.json&lt;/code&gt; существующих крыльев по паспортам (источник каждого числа — &lt;code&gt;docs/research/wings_config_sources.md&lt;/code&gt;); (2) ТЗ на 3D-модели &lt;code&gt;docs/research/glider_3d_tz.md&lt;/code&gt;: по разделу на каждую существующую и каждую новую модель.&lt;/p&gt;&#10;&lt;p&gt;Границы: модуль воздуха не трогаем; полярами, закруткой, формой паруса без данных не занимаемся; абсолютным L/D из заявок не верим.&lt;/p&gt;</description></item><item><title/><link>https://thegriglat.github.io/deltaplan/plans/archive/world_objects/01-provoda-zabory-batching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thegriglat.github.io/deltaplan/plans/archive/world_objects/01-provoda-zabory-batching/</guid><description>&lt;h1 id="w01-провода-опоры-и-заборы-osm--без-просадки-fps"&gt;W01. Провода, опоры и заборы OSM — без просадки FPS&lt;a class="anchor" href="#w01-%d0%bf%d1%80%d0%be%d0%b2%d0%be%d0%b4%d0%b0-%d0%be%d0%bf%d0%be%d1%80%d1%8b-%d0%b8-%d0%b7%d0%b0%d0%b1%d0%be%d1%80%d1%8b-osm--%d0%b1%d0%b5%d0%b7-%d0%bf%d1%80%d0%be%d1%81%d0%b0%d0%b4%d0%ba%d0%b8-fps" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Цель:&lt;/strong&gt; в Онгудае у земли 1%-low ≥ 60 FPS на целевом железе (RTX-класс), как на остальных локациях.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Контекст:&lt;/strong&gt; docs/guide/game.md → «Замеры» (Онгудай: среднее 69–88, 1%-low 31–43; wires 11 012, supports 3 767, wire_tiles 775, osm_fence_spans 2 230), docs/guide/world-objects.md, scripts/world_objects/ (провода, опоры, заборы), configs/world_objects.json, tools/bench/frame_bench.sh.&#10;&lt;strong&gt;Папки-владения:&lt;/strong&gt; scripts/world_objects/, scenes/world_objects/, configs/world_objects.json, tests/world_objects/.&lt;/p&gt;&#10;&lt;h2 id="шаги"&gt;Шаги&lt;a class="anchor" href="#%d1%88%d0%b0%d0%b3%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Профилировать Онгудай у земли (draw calls, объекты): tools/bench/probe (medium).&lt;/li&gt;&#10;&lt;li&gt;Опоры и столбы заборов — MultiMesh по тайлам; провода — один меш на тайл (цепные линии запечь в ArrayMesh), visibility_range с запасом; заборы дальше N м — не рисовать.&lt;/li&gt;&#10;&lt;li&gt;Проверить, что визуально ничего не пропало (скриншоты «wires»/«village» до и после).&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="критерий-приёмки"&gt;Критерий приёмки&lt;a class="anchor" href="#%d0%ba%d1%80%d0%b8%d1%82%d0%b5%d1%80%d0%b8%d0%b9-%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%ba%d0%b8" aria-label="Ссылка"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;tools/bench/frame_bench.sh (medium, fullscreen 1920×1080, под timeout): Онгудай — среднее ≥ 120, 1%-low ≥ 60 во всех отметках; остальные локации не хуже, чем до.&lt;/li&gt;&#10;&lt;li&gt;Скриншоты до/после с провода и забора вблизи — идентичны по составу объектов.&lt;/li&gt;&#10;&lt;li&gt;Тесты world_objects зелёные, lint чисто.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Модель:&lt;/strong&gt; opus. &lt;strong&gt;Размер:&lt;/strong&gt; S–M.&lt;/p&gt;</description></item></channel></rss>