Журнал модуля «control-fix»

План — docs/archive/plan/control-fix.md, контракты — docs/contracts/control-fix.md. Ветка feature/control-fix, копия ~/deltaplan-control-fix (от main 3820bda = v1.0.0).

Решения

  • 01.10 — модуль заведён по жалобе пилота на 1.0.0 (сам начинает полёт, крен валится, мышь не управляет). Контракты С1 (ControlInput v1), С2 (InputController v1), С3 — ссылка на start-fixes К3 v2/К4 v1; контрактный тест tests/game/test_control_fix_contracts.gd (2/2 ок, весь --filter=contracts 34/34).

  • 01.10 — две задачи параллельно: CF-1 (земля/старт, scripts/flight/*) и CF-2 (мышь, input_controller.gd/UI). Стык — ControlInput (С1). Противоречие с решениями пользователя start-fixes — шлюз.

  • 01.10 — headless поле воздуха аналитическое (нет RenderingDevice), в игре — GPU-поле: воспроизведение CF-1 должно это учитывать (окно tools/gpu_tests.sh/--air-field).

  • 01.10 — уточнение пилота (через главную сессию): главная проблема — на старте нельзя управлять крылом; «Славутич», 6 м/с встречный: нос высоко, ни мышью, ни S не опустить, взлёта нет; раньше работало. Передано CF-1 (приоритет — найти коммит). Ориентиры разбега (0 м/с — долго, но советские/учебные взлетают; 3 — почти так же, спортивные легко; 6 — просто и быстро; 10 — почти вертикально) — сценарии тестов CF-1, числа из физики; упор в поляру/ветер — модулю feature/wing-physics-check.

  • 01.10 — новое требование пользователя: управление крылом на земле по тангажу и крену (стоя и на разбеге). Это смена С1/С2 (v2) и start-fixes К3 (v3) и частично решения start-fixes п. 3 («стоит — только поворот») — раскладка клавиш = шлюз (варианты главной сессии), задача CF-3 после CF-1 (те же файлы ground_run.gd).

  • 01.10 — сбой сети: CF-1 возобновлён тем же исполнителем в той же копии (коммитов до сбоя не было).

  • 01.10 — решения пользователя (шлюз «управление крылом на земле»): (1) вариант В «гибрид» — стоя/шагом W/S шаг, A/D поворот, крыло — стрелки/мышь/стик; с Shift (разбег) W/S, A/D, стрелки, мышь — нос и крен как в воздухе, курс на бегу — от крена крыла; защёлку при отрыве убрать; (2) мышь по умолчанию — «трапеция», осмотреться — правая кнопка. Вписано в план; контракты С1 v2, С2 v2, К3 v3 (docs/contracts/control-fix.md); контрактный тест v2 — вместе с CF-3. CF-3 — после CF-1.

  • 01.10 — решение пользователя (через главную сессию): по умолчанию в полёте W — трапеция от себя (нос вверх), S — на себя, как у дельтапланериста; на разбеге с Shift — так же. Раскладку и её описания меняет модуль feature/ui-controls (~/deltaplan-ui-controls, читает наш журнал и контракты, ground_run.gd не трогает). CF-3 знак клавиш в наземную логику не закладывает: те же действия ввода «трапеция», что в полёте (С2 v2 уточнён). Порядок слияния в main: сначала control-fix, потом ui-controls.

  • 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°. Передано главной сессии (зона модели воздуха — вероятный шлюз).

  • 01.10 — от wing-physics-check (через главную сессию), передано CF-1: (1) ground_run.gd:239–242 предел бега v_cap = 6,5·(1+0,3·разгрузка), склон его не поднимает — в штиль на 1869 м не взлетают atlas (Vmin 34,9 км/ч) и часть спортивных (пилот: в штиль взлететь можно, разбег длиннее) — наша зона, проверить физику; (2) atlas: α срыва 12,6° < launch.alpha_neutral_deg 16° — конфиг крыла правит wing-physics-check по нашему числу; (3) в поле воздуха две причины: турбулентность у старта (бисект CF-1) и ветер меню на краю области 38,4 км (над стартом 1,0–2,1 × меню) — отдельный шлюз пользователя.

  • 01.10 — решение пользователя: обе проблемы поля воздуха (порывы/разворот у земли и завышенный ветер над стартом) чинит модуль feature/air-start (~/deltaplan-air-start). Мы поле не правим; CF-1 доводит бисект до коммита (файл:строка, числа) → главной сессии для air-start. Наше: CF-3 (вариант В), курс без инерции рыскания, тангаж стоя по мгновенному потоку, предел бега без склона, число для atlas alpha_neutral (конфиг — через wing-physics-check).

  • 01.10 — CF-3 запущен параллельно CF-1 (не ждём: главный приоритет — управление на земле); разделение по функциям ground_run.gd, после приёмки CF-1 — git merge feature/control-fix в cf3.

  • 01.10 — пересечение с ui-controls: они меняют знак стика в input_controller.gd::_apply_gamepad (gy * inv → -gy * inv), конфликт при слиянии — их координатор. CF-3 предупреждён: знак стика не трогать.

  • 01.10 — CF-1, бисект поля GPU (d3f01bb, docs/archive/plan/cf1_start/README.md → «Бисект поля GPU»): виновный 4e71747 (AM-04, окна клипмапа 100/50 м у старта, air_runtime.gd), усиление при 6 м/с — e674c49 (Б2). Механизм (по коду): старт внутри мелкого поля → Atmosphere._air_velocity_field (atmosphere.gd:767–) с FieldTurbulence.sigma (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.

  • 01.10 — ui-controls готов (006edc5; W/↑ — от себя, S/↓ — на себя, стик вперёд — от себя, 7e65293). Их замечание передано CF-3: автопилот и тесты защёлки изображают W на земле как «шаг + на себя» — в CF-3 защёлку убрать, автопилот — через действия ввода, тесты не зависят от раскладки. Порядок слияния: control-fix → main, потом ui-controls.

  • 01.10 — CF-1 принята и влита (1996fb7). CF-3 отчитался (3eca042, dd29607, 400a82a, 5c55f3f: базовый нос = launch.alpha_neutral_deg (pitch 0; прежние +0,3 = +6° клали «Славутича» за срыв 21,4° — weak_run/nose_high), φ_max = ground_bank.command_max_deg 15°, дуга на бегу a = a_кр + clamp(a_зад − a_кр, ±N/W·a_max)); ему отдано слияние feature/control-fix и перевод тестов CF-1 на новое управление.

  • 01.10 — координатор: test_takeoff::test_crosswind_light_all_wings — принята поправка «пилот выравнивает креном руки» (решение пользователя — крен на земле в руках пилота); проверка без ввода остаётся в test_ground_bank::test_light_crosswind_holds.

  • 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 (известные).

  • 01.10 — отзыв пилота: отрыв по набору скорости (0 м в сильный ветер, ~10 м в штиль), «в программе на взлёт дано 2 с — это не так». Длина по модели с пилотом сходится; найдено в коде: срывы weak_run по времени (ground_run.gd:301 — отпустил Shift после 0,5 с бега; :303 — 10 с бега). Решение координатора: убрать срывы по времени (К3 v3 уточнён, weak_run убран), остановка бега — снова «стоит»; тест «штиль без бега 10 с — нет отрыва; с бегом — отрыв при V ≈ V_отр, время зависит от склона; отпустил Shift — срыва нет». Поручено CF-3 в той же ветке.

  • 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); cf3_ground_control: «Славутич» стоя α −4…+36° (нейтр. 16°), крен ±15,2° в штиль, ±7,5° при 6 м/с (N/W 0,32), поворот стоя 135° без крена — совпадает с отчётом. Вливание — после доп. задачи о срывах по времени.

  • 01.10 — решение пользователя (в план, п. 4): убрать все фиксированные времена старта и взлёта (grace_s, fail_time_s, таймеры фаз, защита после отрыва, таймеры автопилота/ботов на земле, подготовка/таймауты), заменить физическими условиями; антидребезг — только с обоснованием. Передано CF-3 вместе с проверкой правдоподобия разгона в штиль (пиковое ускорение, скорость отрыва, вклад ног/склона/крыла).

  • 01.10 — CF-3: 5813996 — старт и взлёт без порогов по времени (срыв только wingtip — консоль на земле; grace_s → «крыло несёт весь вес»; FlightStats — по высоте/удалению; автопилот без stand_s; тест test_liftoff_physics). Ждём отчёт.

  • 01.10 — wing-physics-check закрыт (6e6fa91): atlas alpha_neutral_deg 16 → 8°, у 27 крыльев новые CL_max/α срыва, Vmin выше; порядок в main (предложение главной сессии): wing-physics-check → control-fix → ui-controls. CF-3 поручено влить feature/wing-physics-check в cf3 (конфиги крыльев — в их пользу) и перегнать таблицу (+ crex3, she1, piuma, atlas, штиль на высоком старте) и тесты.

  • 01.10 — CF-3: db91ccc (после отрыва пилот на ногах до upright_clear_m 1,0 м — касание снова разбег, вместо grace_s; первая замена «L ≥ W» ломала посадку ударом), 0491ea7 (слияние wing-physics-check). Сбой сети — CF-3 возобновлён; wing-physics-check влит в main (ab89805) — CF-3 вливает main в cf3, перегоняет таблицу (7 крыльев + штиль на высоком старте) и тесты.

  • 02.10 — CF-3 итог: 36bde4a (таблица, разгон), 8e66235 (слияние main с wing-physics-check). Порогов времени нет (таблица замен — в отчёте CF-3; оставлены только постоянные времени динамики, сваливание в воздухе, классификация итога, темп ботов). upright_clear_m 1,0 м. test_liftoff_physics 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). Известное новое: test_xc_bot::test_xc_bot_synthetic_10km падает и на чистом main ab89805 (по отчёту CF-3) — не наше.

  • 02.10 — контракт К3 v3: GroundRun.failure ∈ {wingtip, ""}, ключи времени убраны; start_fixes К3 помечен заменённым.

  • 02.10 — координатор перепроверил после слияния bb4a665: contracts 40/0, flight/ 92/0, game/ 129/0 (1 GPU пропущен), start_ 14/0, liftoff_physics 5/0, bot 18/1 (test_xc_bot_synthetic_10km — по CF-3 падает и на main ab89805), ui/ 78/1 (порт 8080). cf3_ground_control: «Славутич» 6 м/с — отрыв 0,41 с, Δpitch/Δroll на отрыве 0; 1869 м штиль — все взлетают (12,2–32,4 м). Замечено: стоя при 6 м/с поворот на 52° бортом к ветру на склоне 17° → wingtip (нижняя консоль поперёк крутого склона) — физика, вопрос для шлюза.

Задачи

ЗадачаСтатусИсполнительКопия / веткаКоммитыЧисла / решения
CF-1 Старт с землипринята (01.10)dp-engineerкопия и ветка удалены4a7d7ea, ea37cfa, d3f01bb, d2ca48c, 17b402f, 545a3f9, 0bdf620; слияние 1996fb7Кода-регрессии на земле нет (headless v0.8.0 = промежуточные = 1.0.0). Причина — поле GPU у старта: 4e71747 (AM-04), усиление e674c49 (Б2) → air-start. Исправлено в зоне: предел бега — предел ног (v_cap не режет разгон склоном/крылом): «спорт» штиль weak_run 67 м → 13 м, atlas 64 → 18 м, combat 66 → 14 м. Тесты test_start_regression(_gpu), test_run_speed. Перепроверено после слияния: contracts 34/0, flight/ 82/1 (известное test_headwind_launch atlas), game/ 127/0, start_ 14/0, run_speed 2/0. Развилки (не делались): курс в воздухе без инерции рыскания (flight_model.gd:326–328), тангаж стоя по мгновенному потоку (ground_run.gd:126–129) — после air-start; atlas launch.alpha_neutral_deg 16° > срыва 12,5° → нужно ≈ 8° (wing-physics-check).
CF-2 Мышьпринята (01.10)dp-engineerкопия и ветка удалены6ae229a, 01eeda7; слияние a5bf8c1Регрессии мыши в коде с v0.8.0 нет (input_controller.gd, camera_rig.gd, settings_panel.gd не менялись; режим по умолчанию look с v0.5.0; все Control слоёв F1/F5/F6, Debug Draw 3D, Debug Menu — mouse_filter = IGNORE). Найден старый изъян (с v0.5.0): в bar смещение мыши копилось на земле и после отрыва разом отклоняло трапецию (до ±1,0) — исправлено в рамках С2 v1. Тест test_mouse_bar_flight.gd (4/4): 30 % хода мыши → крен +8,8°/−15,1°, тангаж +10,4°/−7,0° за 1,5 с (v0.8.0 — то же). Перепроверено: test_mouse_bar 4/4, camera_bar 2/2, contracts 34/34, game 126/0. ui: 1 известное (порт 8080).
CF-3 Управление крылом на земле (вариант В) + старт без порогов временипринята (02.10)dp-engineerкопия и ветка удалены118efac, 3eca042, dd29607, 400a82a, 5c55f3f, 68272a0, 5813996, db91ccc, 0491ea7, 36bde4a, 8e66235; слияние bb4a665С1 v2 (turn), С2 v2 (мышь bar, раскладка В, без защёлки, базовый нос = alpha_neutral_deg), К3 v3 (φ_зад ±15°, дуга от крена ≤ 2 м/с², срыв только wingtip, upright_clear_m 1 м). Числа — в «Решениях» 02.10.

Состояние (02.10): все задачи приняты; шлюз главной сессии — слияние в main

  • CF-1, CF-2, CF-3 приняты и влиты в feature/control-fix; копии и ветки задач удалены. Ветка содержит main с wing-physics-check (ab89805); в main после этого — только 692e33f (документ плана NN), конфликтов не ожидается.
  • Порядок слияния в main: control-fix → ui-controls (ui-controls подтягивает нас и разрешает конфликты в input_controller.gd::_apply_gamepad, controls.json _doc, docs/guide/game.md).
  • Отложено (решение пользователя через главную сессию): курс в воздухе без инерции рыскания, тангаж стоя по мгновенному потоку — после air-start; строгие проверки разбега в test_start_regression_gpu (strict_run()) вернуть после air-start.