Разрывы между эталоном процесса и кодом (снимок)

Обновлено: 2026-08-12 проектирование разрывы сверка AD-1374

Разрывы между эталоном процесса и кодом

Это снимок, а не инвариант, и в этом причина отдельного документа.
Эталон процесса (skyforge-design-flow-reference.md) описывает то, что не
меняется от коммита к коммиту. Настоящий документ описывает состояние кода
на дату
и устаревает за сутки: за один цикл критики четыре его строки
протухли прямо по ходу работы. Держать снимок внутри эталона значило склеивать
вечное с сиюминутным и подрывать доверие к обоим (В-18).

Перед использованием как основания для работы — пересверить. Процедура
ниже.

Состояние на 2026-08-01

Раздел — снимок, а не текущая истина. Строки проверялись на разных
состояниях develop по ходу цикла: основная сверка — на baec79b2 (проход 3),
отдельные строки перепроверены позже (d6368524, проход 7 и далее) и несут
пометку об этом. За время работы часть строк успела устареть — AD-1342 и
AD-1372 влились прямо в ходе цикла. Перед использованием раздела как
основания для работы его нужно пересверить
: возраст строки по её тексту не
виден, и в этом легко ошибиться, приняв снимок за сегодняшнее положение дел.

Срок годности раздела — порядка суток. Это не фигура речи: за один цикл
критики две строки протухли прямо по ходу работы, потому что названные в них
задачи влились в develop.

Пересверка — обязательный шаг перед использованием раздела, а не рекомендация.
За два прохода механическая проверка вскрыла две строки, устаревшие или неверные
(комплект документации, тип оперения), — обе читались убедительно и обе не
вызывали желания проверить.

Как пересверять дёшево. Перечитывать раздел целиком не нужно — каждая строка
устроена так, что проверяется точечно:

Что в строке Как проверить
названы файл и символ (drag_budget.py, CLIMB_TW_REF, structureMass) поиск по имени: есть ли, изменилось ли значение
названо отсутствие («ни одного вхождения», «нет как параметра») тот же поиск: появление хотя бы одного вхождения отменяет строку
названа задача (AD-1342, AD-1372) проверить, влилась ли она в developв ветке слияния не считается

То есть пересверка — это прогон поисков по именам, названным в самих строках, а
не повторное исследование. Строка, не называющая ни файла, ни символа, ни
задачи, непроверяема и потому непригодна — это отдельное требование к
качеству раздела, а не пожелание.

Сверка ведётся по коду origin/develop, а не по статусам
тикетов
— многократно выяснялось, что тикет закрыт при несделанной работе и
наоборот (AD-1179, AD-1177, AD-1083).

1. Стадии

Словарь статусов. «ЕСТЬ ИНАЧЕ» сам по себе не означает дефект — он
означает, что реализовано другим способом, и требует отдельного решения:

Статус Значение
ЕСТЬ соответствует эталону
ЕСТЬ ИНАЧЕ ✓ реализовано по-другому, эталону не противоречит — принимается как есть
ЕСТЬ ИНАЧЕ ⚠ реализовано по-другому и расходится с эталоном — требует работы
НЕТ отсутствует

Без этого различения раздел читается как список из тридцати дефектов, хотя часть
строк — законные отличия реализации (§ 9, П19-2).

Стадия Статус Где / почему
S01 Миссия и ТЗ ЕСТЬ ИНАЧЕ ⚠ Строка переписана в AD-1412 (прежде: «из ТЗ существуют только purpose, designMass, cruiseSpeed; времени полёта, дальности, полезной нагрузки, габаритных и бюджетных ограничений нет как понятий» — устарело). ТЗ стало ОБЪЕКТОМ: DesignerV2Requirements (шесть обязательств) правится в секции «Design assumptions» (requirements_ui.js) и сверяется с расчётом (designer_v2_requirements.evaluate_requirements → блок requirements отчёта борта). Обязательство и результат разведены по именам, незаданное требование читается как «не проверяется». Что расходится со схемой: реально проверяются три обязательства из шести — скорость сваливания, взлётная масса, транспортный размах (последний на НАЗВАННОМ допущении «крыло неразъёмное»); время полёта и дальность ждут энергетики силовой установки (AD-1418), полезная нагрузка — категории нагрузки в справочнике компонентов; бюджета постройки и габарита стола принтера как обязательств по-прежнему нет (у первого нет ни результата, ни единицы, у второго состояние проверки — отдельная деталь блока VI)
S02 Аэросхема ЕСТЬ ИНАЧЕ ⚠ Строка переписана в AD-1411 (прежде: «исполняемого кода, читающего scheme, нет; геометрия всегда конвенциональная, сервер жёстко подаёт tail_type="conventional"» — устарело). Ветвление V1 читается ОДИН раз, из таблицы web/services/avl/scheme.py (зеркало клиента — designer_v2/scheme.js): она объявляет набор несущих поверхностей схемы, а из него ВЫВОДЯТСЯ тип оперения для решателя, ожидаемый знак плеча (AD-1359), состав рулей (presentControlTypes) и полоса запаса устойчивости. Летающее крыло проходит цепочку целиком: оперения нет ни в геометрии, ни в бюджете сопротивления, НТ и запас считаются от одного крыла, рули ГО/ВО исчезают вместе с носителем, отчёт называет схему и её допущения. params.scheme больше не расходится с envelope — сервер проецирует залоченное значение (DesignerV2Project). Что расходится со схемой: карточки визарда, кроме классики, остаются disabled (см. V1 ниже); общая компоновка планера (моно/биплан, верхне-/среднеплан) как часть S02 по-прежнему не заведена
S02 Тип оперения ЕСТЬ ЧАСТИЧНО Строка исправлена в проходе 22: прежде стояло «НЕТ», и это устарело — AD-1344 влился по ходу цикла. tailType — поле модели (designer_v2_project.py:289), селект #dv2-tail-type с показом зависимых полей (params.js:207), геометрия ветвится (geometry.js:298,592), значение доезжает до решателя как есть (designer_v2_analysis.py:498avl/types.py:147). Поддержаны три типа из пяти: обычное, V, T; креста и H нет
S03 Способ изготовления и материал ЕСТЬ ЧАСТИЧНО Строка переписана в AD-1414 — прежде стояло «НЕТ». Появились buildMethod (print/rib/foam — домен V4) и material с плотностями, допустимыми толщинами и контрольными массами (web/services/designer_v2_manufacturing.pymanufacturing.js, числа опубликованы в aircraft-design-process-rc.md § B.8.1). Материал уточняет массу конструкции ровно так, как обещал граф зависимостей: множитель домножает оценку AD-1407, второго правила расчёта массы нет. Габарит стола bedSize сохраняется в модель (метры, ползунок в мм) — прежнего чтения из DOM больше нет. Выбор делается в визарде создания и показывается read-only (Р4/N2 — как scheme). ЧТО ОСТАЁТСЯ: (1) серверного лока полей, какой есть у scheme в роуте, НЕТ — необратимость держится только интерфейсом, PUT их перезапишет; (2) ограничения геометрии не действуют: min_thickness_mm показывается и уезжает в инструкцию сборки, но блок II его не читает — свесов, минимальной толщины кромки и линейчатости пенной панели не проверяет никто; (3) требований к размещению оборудования (третья группа величин S03) нет вовсе; (4) выпуск данных существует только для печати — S22B и S22F отсутствуют, и интерфейс об этом честно говорит (#dv2-release-gap), а не отдаёт печатный комплект
S04 Точка проектирования ЕСТЬ ЧАСТИЧНО Строка переписана в AD-1413 (прежде: «НЕТ, и причинная цепочка развёрнута наоборот» — устарело). Стадия производит ТРИ проектные величины из требований и назначения (designer_v2_design_point.design_point): нагрузку на крыло (из требования по сваливанию и допущения о CL_max, с запасом 10 % внутрь области), проектную тяговооружённость (из требуемой скороподъёмности, допущения о качестве и крейсерской скорости) и целевое удлинение (targetAspectRatio — решение стадии, типовое по назначению). Геометрия СЛЕДУЕТ из них: размах и хорда нового проекта считаются на сервере (seeded_project, оба входа создания), пресет назначения полей крыла больше НЕ несёт, а размах спрашивается «какой МАКСИМУМ» (requirements.maxTransportSpanM). Отчёт борта несёт блок design_point — пары «требуется ↔ получилось» и отход от точки. Три величины со словом «тяга» разведены именами: propulsion.thrust_to_weight (потребная, = D/W), design_point.design_thrust_to_weight (проектная), performance.available_thrust_to_weight (располагаемая, S16). Что расходится со схемой: допустимой ОБЛАСТИ как множества нет — кривая ограничения одна (сваливание), а «пересечение кривых» и лестница из четырёх выходов при пустой области требуют ещё двух поставщиков (взлётная дистанция — шасси AD-1410; радиус разворота); степенная оценка m₀ = k·b^2.6 сознательно не заведена — взлётную массу даёт designMass, второго источника той же величины в отчёте быть не может; бюджеты cd0 и целевого L/D (§ 4, S04, «выход, который раньше не был назван») стадия пока не публикует; механизация (AD-1367) в допущение о CL_max НЕ входит СОЗНАТЕЛЬНО — по схеме закрылок это ВЫХОД из пустой области, который человек выбирает, а не автоматическая прибавка каждому борту (разбор — CL_MAX_DEFAULT в designer_v2_design_point)
S05 Крыло ЕСТЬ Полный план + мультисекционное крыло реализовано (wingSections, wing_sections_ui.js, AD-1271). AD-1369 влился: появилось ВЕРТИКАЛЬНОЕ ПОЛОЖЕНИЕ крыла (высоко-/средне-/низкоплан, wingPosition) — оно двигает крыло в рендере и экспорте и доезжает до расчёта ДВУМЯ путями: эмпирическая поправка интерференции крыло-фюзеляж в Cl_beta (avl/wing_position.py, DATCOM/Roskam — VLM фюзеляж как тело не строит и сам на положение не откликается) и высота тяговой линии в Cm_thrust (avl/thrust_line). ОСТАЁТСЯ: подкосного высокоплана (parasol) в редакторе нет — высоты стоек нет ни как параметра, ни как геометрии
S06 Профиль ЕСТЬ ИНАЧЕ ⚠ Строка переписана в AD-1435 — прежде «подбора профиля нет». Источник профиля стал ВЫБОРОМ (ветвление V6): airfoilSource = «выбрал человек» (дефолт, прежнее поведение бит-в-бит) или «подобрать под назначение». Во второй ветке v2 зовёт ТОТ ЖЕ скоринг, что и v1-дизайнер — aero_service.find_best_profiles через web/services/designer_v2_airfoil_pick.py, второй реализации ранжирования не заведено, — и подобранный профиль уезжает в решатель и в поляру ОБОИХ отчётов (крыла и борта), меняя cd_profile, Cl_max и скорость сваливания. То есть S01 → S06 стала настоящей зависимостью (решение основателя), а признак несвежести «Аэро крыла» по purpose, снятый в AD-1365 как ложный, вернулся вместе с влиянием. Предпосылка была закрыта AD-1431: скоринг сравнивает кривизну с порогами (>= 6/>= 4/<= 2/<= 1), и до объявления единицы в имени поля (camber_pct) доля вместо процентов молча отключала эти сравнения. Что расходится со схемой: подбор идёт по КРЫЛУ целиком — посекционного выбора (условие V6 применяется посекционно) нет; посадочный Cl скорингу не передаётся (посадочной скорости среди допущений v2 нет); критерии выхода стадии (Cl_max ≥ 1.2·Cl_посад, L/D ≥ целевого) как ВЕРДИКТ не показываются — они зашиты в веса скоринга; третьей ветки V6 (свои координаты) по-прежнему нет
S07 Фюзеляж ЕСТЬ ИНАЧЕ ⚠ Пять скаляров на весь корпус + пять форм сечения (fuselage.js). Нет пользовательских сечений по станциям, центроплана, зализов, обтекателей (AD-1343). Мотогондолы есть в v2-ядре, но нет в CAD-сервисе
S07 Шасси ЕСТЬ ИНАЧЕ ⚠ Строка закрыта в AD-1410: шасси стало ВЫБОРОМ ИЗ ВАРИАНТОВ в геометрии планера (landingGear: нет / трёхопорное с носовой / с хвостовой / убирающееся + обтекатели), и у каждого варианта СВОИ числа — вклад в сопротивление (designer_v2_landing_gear.gear_drag_inputsdrag_budget.landing_gear_parasite_drag), масса (доля взлётной, отдельная группа от массы конструкции) и положение опор в развесовке (payload.js::landingGearCgItems). Тождественного нуля больше нет. Вторая половина закрыта в AD-1438: стойки и колёса СТРОЯТСЯ в ядре (geometry.js::buildLandingGear, секция gear) и выпускаются в STEP/STL, Fusion-скрипт и печатный комплект — по ТЕМ ЖЕ размерам, из которых считается мидель; борт с шасси и без дают разное число тел, разный габарит и разный объём. Чего нет: ниш и механизма убирающегося шасси и формы обтекателей в выпуске (оба случая названы заметкой на экране, а не умолчаны); поплавков и лыж (V5 эталонной схемы) как вариантов; выбора размеров опор руками (они считаются по размаху и миделю фюзеляжа)
S08 Оперение ЕСТЬ ИНАЧЕ ⚠ ГО+ВО строятся всегда; Vh/Vv ПОКАЗЫВАЕТ клиент (geometry.js:818); с AD-1415 сервер тоже собирает Vh для v2 (designer_v2_analysis.horizontal_tail теми же хелперами avl/tail_area.py) — но только как вход эффективности руля, в отчёт коэффициент не выводится. Порядок в дереве зависимость больше НЕ нарушает — фюзеляж переставлен вперёд оперения (AD-1408, прежняя редакция ссылалась здесь на П3-А)
S09 Управляющие поверхности ЕСТЬ ИНАЧЕ ⚠ Строка переписана в AD-1367 (прежде: «каталог из трёх записей; элевонов, рудеватора, закрылков нет» — устарело, AD-1179/AD-1416/AD-1415/AD-1367 влились). Каталог geometry.js::CONTROL_SURFACE_CATALOG несёт пять записей: элерон, элевон, ЗАКРЫЛОК, РВ, РН; у записи есть род (role), и механизация отделена от рулей. Достаточность управления считается (control_authority.js, стадия S14b): потребные углы, шарнирный момент со СВОИМ расчётным случаем на РОД поверхности, привод, масса тракта, пиковый ток; микшер смешанной поверхности — с AD-1425: правило смешивания выводится из набора поверхностей борта, потребный угол каждой оси сверяется с ЕЁ ДОЛЕЙ хода, а сумма по осям — с полным ходом (отдельный расчётный случай); момент профиля Cm_ac — с AD-1436 ВХОД из поляры выбранного профиля (designer_v2_analysis.cm_ac_from_polar → поле отчёта cm_ac), а не типовое −0.05: у бесхвостки плеча нет, и потребный угол элевона пропорционален ему напрямую; поляры нет → ЯВНО названный фоллбэк, видимый пользователю; два оставшихся входа стадии — с AD-1443: профильное сопротивление СЕЧЕНИЯ крыла c_d (второе слагаемое демпфирования крена) приезжает из ТОЙ ЖЕ поляры (поле отчёта cd_profile, AD-1211) вместо константы CD0_ASSUMPTION = 0.02, а запас устойчивости разрешается тремя названными ступенями (resolveStaticMargin) — у обоих признак источника виден в разметке (data-section-cd-source, data-static-margin-source). ⚠ Вклад c_d честно МАЛ (весь домен профилей двигает угол элерона на 0.09°, ниже разрешения показа) — на экране его различает оговорка, а не колонка угла; бортовой паразитный бюджет S13 сюда НЕ подходит и подставлен не был — тела бюджета плеча по размаху не имеют и крен не демпфируют; угол РВ на балансировку считает ещё и сервер по остаточному моменту решателя (AD-1415, avl/elevator.py) — коэффициенты τ и наклон линии подъёмной силы у обоих ОДНИ (мост tests/test_designer_v2_elevator_mirror.py). Механизация меняет числа отчёта — Cl_max и скорость сваливания (avl/high_lift.py), строка бюджета cd0_flaps (avl/drag_budget.py). Что расходится со схемой: рудеватора V-схемы по-прежнему нет (щели и рули хвоста у неё не считаются — названное допущение); выпуск закрылка НЕ рисуется в 3D и НЕ даёт пикирующего момента (Cm) — вход балансировки, которого нет; щелевой и выдвижной закрылки не заведены
S10 Поляра профиля ЕСТЬ ИНАЧЕ ✓ Не локальный xfoil: готовые поляры с airfoiltools → NeuralFoil → расчёт по координатам (polar_cache.py:385). Re считается по САХ и заданной скорости (designer_v2_analysis.py:147)
S11 Аэродинамика планера ЕСТЬ ИНАЧЕ ⚠ (стадией стала по ходу работы; порядок с эталоном совпал в AD-1408) AD-1342 влился: узлы 2 и 7 в дереве есть, расчёты по решению основателя остались и в своих разделах тоже — одно состояние, два представления, общий кэш и job. Прогресс узлов 2 и 7 считается по свежести результата, а не по касанию параметров. ⚠ Подмножество параметров стадии включает оперение (htailSpan, htailChord, vtailHeight, vtailChord, tailArm, сужения): расчёт «аэродинамики крыла» строит планер целиком (§ 9, П5-1). AD-1408 привёл в соответствие с этим ПОРЯДОК (стадия переставлена за оперение и рули), но не ПОДПИСЬ узла — он по-прежнему назван по крылу
S12 Целевая центровка ЕСТЬ с AD-1408 Отдельная стадия дерева: целевой диапазон ЦТ в долях САХ от передней кромки САХ плюс полоса на модели. Диапазон выведен из нейтральной точки (payload.js::targetCgRange), а НТ и САХ берутся из ОДНОЙ замороженной рамки wing_reference.js — туда переехали прежние приватные cachedNpV2/cachedMac компоновки, чтобы у экрана не появилось второго ответа на вопрос «где НТ». Закрывает П7-1
S13 Бюджет сопротивления ЕСТЬ ИНАЧЕ ⚠ Строка переписана в AD-1404 (прежде: «неполон, не учитывает ни оперение, ни мотогондолы» — устарело, AD-1373/AD-1378 влились). drag_budget.py считает фюзеляж, оперение, мотогондолы, шасси, стык крыло-фюзеляж, щели навески рулей и выступающие элементы — построчно, каждое со своим коэффициентом. Перечень тел заведён в код (DRAG_BUDGET_INVENTORY) и сверяется с разложением в обе стороны, то есть критерий выхода S13 стал механическим. Что расходится со схемой: три позиции закрыты обоснованием, а не слагаемым (шероховатость по технологии — стадия S03 появилась в AD-1414, но её min_thickness_mm/материал в бюджет сопротивления не входят, это отдельная работа; торцевые щели рулей; профильное сопротивление крыла — считается вне бюджета). Шасси и зализы входа не имеют заполнителя (см. S07)
S14 Устойчивость ЕСТЬ ИНАЧЕ ⚠ AD-1415 влился по ходу работы: к продольной (Cm_alpha, SM) и путевой (Cn_beta) добавились ПОПЕРЕЧНАЯ (Cl_beta — считается теми же β-прогонами решателя, vlm_engine.py) и МОМЕНТНАЯ БАЛАНСИРОВКА (потребное отклонение руля высоты, avl/elevator.py; сам решатель руль по-прежнему не отклоняет — оценка линейная). Пороги на сервере ПОЯВИЛИСЬdesigner_v2_stability.py, числа из канона RC § B.6.1, вердикт несёт обязательство и репер рядом с результатом. Достаточность рулей на манёвре закрыл AD-1416 (S14b), и обязательство по углу отклонения руля у обеих стадий ОДНО (механический ход 30° и запас 80 % — канон § «Достаточность управления»). AD-1369 влился по ходу работы: вертикальное положение крыла стало входом Cl_beta, и допущение «среднеплан» СНЯТО вместе с оговоркой в карточке критерия — сегодня у поперечного канала допущений нет ни одного (сама механика оговорок сохранена под следующего жильца). ОСТАЁТСЯ: у Cl_beta нет вклада ВО (киль над ЦТ даёт свой момент крена при скольжении) — решатель его считает, но отдельной сверки на него нет
S15 ЛТХ ЕСТЬ ИНАЧЕ ⚠ Потребная тяга, тяговооружённость, мощность, V_stall — считаются. Скороподъёмность считается при зашитой тяговооружённости 1.0 (CLIMB_TW_REF), то есть не зависит от модели. Времени полёта, дальности, энергопотребления нет вовсе
S16 Силовая установка НЕТ Мотора, винта, ESC, аккумулятора в v2 не существует. propulsion_calc.py (подбор мотора/ESC/винта) в репозитории есть, но designer v2 его не импортирует. Есть только габаритно-массовые «мотогондолы» как геометрия
S17 Оборудование и его размещение ЕСТЬ Компоненты из справочника с массами и габаритами (/api/designer-v2/components), координаты вводятся вручную. Лючки доступа есть
S18 Развесовка и фактический ЦТ ЕСТЬ ИНАЧЕ ⚠ ЦТ и запас устойчивости считаются на клиенте (AD-1415 влился по ходу работы: живой гейдж запаса красится по ТОМУ ЖЕ обязательству, что и вердикт отчёта борта — полоса 5–15 % САХ приезжает на страницу числами из designer_v2_stability.STATIC_MARGIN_REQUIREMENT; до тикета гейдж судил по знаку, то есть у одной величины было два критерия). Дефолт массы конструкции БОЛЬШЕ НЕ ноль — AD-1407 влился по ходу работы: пустое поле даёт ОЦЕНКУ (доля STRUCTURE_MASS_FRACTION от m₀ ≈ k·b^2.6 по размаху и назначению — designer_v2_mass.pymass.js), ручной ввод её переопределяет, происхождение числа видно и в панели «Компоновка», и в отчёте борта, и сервер величину читает (mass.structure_mass_kg / structure_mass_source). Само поле осталось Field(0.0, ge=0, …): 0 теперь означает «не задано», а не «конструкции нет» (schema-compat, старый документ читается прежним значением с новой трактовкой). Стреловидность в положении ¼ САХ учтена — AD-1372 влился по ходу работы. Уточнение массы МАТЕРИАЛОМ приехало — AD-1414 влился: оценка домножается на коэффициент способа изготовления и материала (designer_v2_manufacturing.structure_mass_factor), происхождение числа видно и в панели, и в отчёте (mass.build_method/material/structure_mass_material_factor). ОСТАЁТСЯ: прочностного уточнения (S20) нет и не планируется — силовой схемы в v2 не существует; сам коэффициент остаётся названным допущением (отношение контрольных масс одного борта, не зависящее от размаха)
S19 Силовая схема НЕТ Ни лонжеронов, ни нервюр, ни шпангоутов: единственные вхождения этих слов в designer_v2/ — комментарии в payload.js:29,382 о том, что фюзеляж считается ПУСТЫМ, а лонжерон крыла «не моделируется вовсе». Проверяется поиском по лонжерон|нервюр|шпангоут в web/static/js/tools/designer_v2/
S20 Прочность и флаттер НЕТ (в v2) flutter_service.py существует, но это v1. Прочностного расчёта, прогиба, запаса прочности в v2 нет. Следствие: масса конструкции никогда не уточняется расчётом
S21 Технологическая проработка ЕСТЬ ИНАЧЕ ⚠, только для печати Есть только влезание по одной оси реза (print_package.js, план разбивки). Проверок минимальной толщины стенки, свесов и ориентации детали на столе нет: поиск по wallThickness|minWall|overhang|свес в web/static/js/tools/designer_v2/ даёт ноль расчётных вхождений
S22P 3D-печать ЕСТЬ (print_package.js + план разбивки в ядре) Разбивка по габариту стола, выбор оси реза по роли детали, замки трёх типов (штифт под клей / бобышки под саморез / защёлка) с зазором 0.3 мм, лючки с крышкой отдельной деталью, ZIP по деталям, блокирующие гейты при провале реза/замка/люка. Самая проработанная стадия всего процесса
S22B Наборная конструкция НЕТ вовсе Ни генерации нервюр и шпангоутов, ни DXF, ни ezdxf в зависимостях, ни раскладки на листы, ни планов 1:1, ни ложементов. Единственные вхождения слов «нервюра» и «шпангоут» — словарь разбора чужих моделей в model_import.py:1436, к генерации отношения не имеющий. Линия AD-411…AD-416 не начата
S22F Пена НЕТ вовсе Поиск по kerf|gcode|XYUV в web/ и cad/ не даёт ни одного вхождения в расчётном коде. Тикет линии — AD-415
S23 Комплект документации ЕСТЬ ИНАЧЕ ⚠ Строка исправлена в проходе 21: прежде здесь стояло «НЕТ», и это было неверно. print_package.js формирует спецификацию (buildBomRows, buildBomCsv — печатные детали, размещённые компоненты, крепёж стыков по выбранному замку) и самодостаточную инструкцию сборки (buildAssemblyHtml, стили инлайн, открывается с диска); оба файла кладутся в архив (packageCompanions, вызов в main.js:1265). Чего нет: расчётного паспорта модели — массы, ЦТ, запаса устойчивости, скорости сваливания в комплекте не приводится

Вне границы эталона (решение Р1), сохранено как состояние стыка. Постройка,
настройка полётного контроллера, наземные проверки, облёт и приёмка борта
описываются глобальной цепочкой. Для неё важно зафиксировать факт: между
моделью и бортом нет ни одного поля-ссылки
— в хранимой записи модели нет
идентификатора борта, в хранимой записи борта нет идентификатора модели, ручки «создать
борт из модели» не существует. Настройка полётного контроллера и разбор
телеметрии в ангаре работают, но привязаны к борту, а не к модели, поэтому
сверить фактические ЛТХ с расчётными сегодня нечем.

1a. Порядок стадий: эталон против дерева редактора

Сверка вторичная — «есть / нет / есть иначе», без предложений по починке.

Строки этого раздела ПЕРЕСВЕРЕНЫ 01.08.2026 (AD-1408). Три расхождения,
которые он фиксировал, закрыты: фюзеляж переехал вперёд оперения, продувка
планера — за оперение и рули, стадия целевой центровки заведена. Позиция в
колонке «Дерево редактора» теперь — МЕСТО В ПОРЯДКЕ, а не data-stage-node:
идентификаторы узлов сознательно оставлены прежними (к ним привязаны бейджи
свежести derived и рельса прогресса), поэтому сегодня они идут
0,1,5,3,4,2,9,6,7,8 и порядок по ним не читается.

Эталон Дерево редактора Совпадает
S05 Крыло 2-я позиция «Крыло» да
S06 Профиль внутри той же стадии иначе: не отдельная стадия
S07 Фюзеляж 3-я позиция да с AD-1408 (было: после оперения)
S08 Оперение 4-я позиция да с AD-1408 (было: до фюзеляжа)
S09 Управляющие поверхности 5-я позиция да
S11 Аэродинамика планера 6-я позиция да с AD-1408 (было: до оперения и фюзеляжа, хотя её вход включает параметры оперения)
S12 Целевая центровка 7-я позиция «Целевая центровка» есть с AD-1408: целевой диапазон ЦТ в долях САХ от ПК САХ + полоса на модели; выведен из НТ, а не константа
S17 Оборудование, S18 Развесовка 8-я позиция одна стадия вместо двух
S15 ЛТХ 9-я позиция «Полный борт» да, последняя расчётная
S21–S23 Технология и выпуск 10-я позиция да

Итог: порядок стадий редактора совпал с графом зависимостей эталона —
каждый вход либо произведён раньше, либо назван допущением (длина фюзеляжа
первым проходом берётся как типовая доля размаха, уточняется оборудованием на
S17). Прежние расхождения были одним узлом проблемы (П3-А и П11-1, увиденные со
стороны интерфейса) и закрыты одной перестановкой; порядок теперь сторожит тест
(tests/test_designer_v2_router.py::TestDesignerV2AnalysisStages), а не глаз.

Что стадия S12 НЕ закрыла (чтобы строку не прочитали шире, чем она есть):
на момент S12 критерий выхода петли L5 в продукте оставался прежним — гейдж
фактического запаса устойчивости судил по знаку, а не по канону 5…15 % (изъян
П3-В ниже). Закрыто AD-1415 (пересверено AD-1385): гейдж и отчёт борта
теперь сравнивают ФАКТИЧЕСКИЙ запас с той же полосой 5…15 % САХ, что и целевой
диапазон S12 — оба источника едины (web/services/designer_v2_stability.py).

2. Ветвления

Ветвление Статус
V1 Аэросхема ЕСТЬ ЧАСТИЧНО (было «НЕТ» — AD-1340; переписано в AD-1411). Ветвление ОДНО и живое: таблица web/services/avl/scheme.pydesigner_v2/scheme.js объявляет набор несущих поверхностей, из него выводятся ожидаемый знак плеча, состав рулей и полоса запаса устойчивости. Летающее крыло доведено до конца цепочки — геометрия без оперения, cd0 без его смоченной площади, НТ/запас от одного крыла, элевон вместо РВ/РН. Что остаётся: карточка визарда для летающего крыла РАЗБЛОКИРОВАНА (AD-1448 — последнее условие списка у avl/scheme.py::SchemeSpec.selectable закрыто: стадии, которых у схемы нет, на экране больше нет — узел «Оперение», его ползунки и группы рулей без носителя объявляют нужные слоты в разметке (data-scheme-slots), а видимость спрашивает ту же таблицу схем, scheme_ui.js); отдельно от него — консервативное допущение стадии достаточности управления ЗАКРЫЛА AD-1443: control_authority.js::resolveStaticMargin разрешает запас тремя ступенями (посчитанный запас борта S14 → верхняя граница полосы СВОЕЙ схемы из того же снимка #dv2-static-margin-requirementsASSUMED_STATIC_MARGIN_FRAC = 0.15, полоса классики, только когда полосы у схемы нет вовсе), и КАЖДАЯ ступень названа пользователю отдельной подписью под таблицей (data-static-margin-source); бесхвостке больше не подставляется 15 % САХ вместо её 8 % — на пограничном борте это меняло вердикт, а не только число; второе условие («целевая центровка S12 по полосе своей схемы») ЗАКРЫЛА AD-1442, сведя payload.js::TARGET_STATIC_MARGIN к единственному источнику порога; третье («показать допущение Cm_ac») ЗАКРЫЛА AD-1436, доведя момент профиля до расчёта из поляры, — вместе с ним у схем снято и поле «названные допущения», иначе оговорка описывала бы то, чего больше нет; утка объявлена, но переднего расположения ПГО геометрия не строит (tailArm неотрицателен), и полоса её запаса не выведена; тандема нет в таблице вовсе
V2 Тип оперения ЕСТЬ ЧАСТИЧНО — три типа из пяти, доезжают до решателя (AD-1344 влился по ходу цикла)
V3 Моторы ЕСТЬ ЧАСТИЧНО — единственное реальное ветвление геометрии в v2: нос/крыло, одна/две мотогондолы (geometry.js:1000-1039). Но на расчёт не влияет: мотогондол нет в бюджете сопротивления (AD-1373), отказ двигателя как расчётный случай отсутствует, планер (ноль моторов) как вариант отсутствует
V4 Способ постройки НЕТ — реализована ровно одна ветка (печать) и не как ветка, а как единственный путь
V5 Шасси НЕТ
V6 Источник профиля ЕСТЬ ЧАСТИЧНО — библиотека и NACA есть; «пропустить расчёт поляры, если она готова» реализовано кэшем поляр, но как оптимизация, а не как условие стадии

3. Петли

Петля Статус
L1 Сходимость размерности НЕТ — нет ни точки проектирования, ни оценки массы, ни критерия сходимости
L2 Профиль под Re ЕСТЬ ИНАЧЕ ⚠Re показывается, поляра считается, но выбор профиля пользователь делает сам, без критерия и без подбора
L3 План крыла ЕСТЬ — пороги срыва законцовки реализованы: зона законцовки от 70 % полуразмаха, уровни «внимание» 1.05 и «опасно» 1.12 (analysis_ui.js). Единственная петля продукта с настоящим численным критерием
L4 Оперение под устойчивость ЕСТЬ ИНАЧЕ ⚠ — подсказка по Vh/Vv есть, но с другими границами, чем канон (см. П3-Б), и показывается только после расчёта крыла
L5 Центровка ЕСТЬ в v2, закрыто AD-1415 — критерий выхода петли больше не по знаку: renderGauge/evaluateRequirement (payload_ui.js, verdicts.js) сравнивают фактический запас с полосой 5–15 % САХ, приходящей с сервера (designer_v2_stability.STATIC_MARGIN_REQUIREMENT), тем же критерием, что и отчёт борта. Модель с запасом 0.5 % получает caution, не зелёный индикатор. В v1 — ЗАКРЫТО AD-1440: три собственных литерала designer.html (один с полосой 5–20) и два в layout.html заменены той же серверной полосой — причём полосой АЭРОСХЕМЫ проекта (AD-1411), а не конвенциональной; экраны v1 берут её из разметки (partials/requirement_thresholds.html) и сравнивают общим skyforge/requirement_verdict.js — портом серверного evaluate
L6 Масса конструкции НЕТ источника — масса вводится руками и никогда не уточняется
L7 Прочность НЕТ
L8 Технологичность ЕСТЬ ЧАСТИЧНО — провал реза, замка или люка блокирует экспорт с явным кодом ошибки. Это правильное поведение петли. Но проверок толщин, свесов и линейчатости нет, а габарит стола не сохраняется
L9 Печатаемость профиля НЕТ
L10 Лётная доводка НЕТ — замкнуть некуда: проект и борт не связаны
L11 Пересмотр требований ЕСТЬ ЧАСТИЧНОстрока уточнена в AD-1412 (прежде: «требований как объекта не существует»). Объект появился, и расхождение «результат хуже обязательства» видно пользователю строкой отчёта; чего нет — самой ПЕТЛИ: продукт не предлагает, какое требование ослабить, и не помнит, что оно уже ослаблялось
L13 Привод под ЛТХ НЕТ
L14 Сопротивление против компоновки ЕСТЬ ИНАЧЕ ⚠ — разложение cd0 показывается, бюджета для сравнения нет

4. Точки необратимости

Точка Статус
N1 Схема ЕСТЬ — единственная реализованная точка необратимости, лок держится сервером и покрыт тестами. ⚠ Необратимость есть, а ветвления, ради которого она вводилась, нет
N2 Способ постройки НЕТ (нет самого понятия)
N3 Заморозка конфигурации НЕТ — свобода перехода полная, устаревание производных — подсказка, а не гейт
N4 Выпуск файлов ЕСТЬ ЧАСТИЧНО — экспорт блокируется при негодной геометрии
N4 Выпуск данных ЕСТЬ ЧАСТИЧНО — экспорт блокируется при негодной геометрии

5. Изъяны, найденные именно сверкой с кодом

Помечены П3-*, потому что это дефекты, которых черновик схемы не
предполагал
— они найдены только при проходе по коду.

# Находка Почему это дефект схемы, а не просто «не сделано»
П3-А ~~закрыт AD-1408~~ Порядок стадий противоречил графу зависимостей. В дереве оперение стояло раньше фюзеляжа, при том что плечо оперения задаётся долей длины фюзеляжа, а Vh/Vv без неё не считаются. Тот же порядок был и в исходном замысле AD-1110. Исправлено перестановкой узлов (порядок сторожит тест) Замысел обещал «порядок = вычислительная зависимость». Обещание нарушено в самой формулировке замысла, а не в реализации. Схема исправлена: S07 предшествует S08 либо плечо задаётся абсолютно
П3-Б ~~запас устойчивости закрыт AD-1415~~ Расходящиеся источники числовых критериев. Vh: канон 0.35–0.70, клиент v2 0.4–0.7 (TAIL_VOLUME_HINT_RANGES, geometry.js) — расходилось; Vv: канон 0.02–0.06, клиент v2 0.02–0.05 — расходилось. ЗАКРЫТО AD-1437: полосы уехали на сервер (designer_v2_stability.TAIL_VOLUME_*_BAND_BY_PURPOSE) и разбиты по назначению борта, своей копии чисел у клиента v2 не осталось. Запас устойчивости: канон 5–15 % для классики, единственное объявление — таблица схем avl/scheme.SchemeSpec.static_margin_band (AD-1411), СВЕДЕНО ВО ВСЁМ ДЕРЕВЕ AD-1440 (до него копий сверх источника было восемь, из них пять — литералами в шаблонах v1; у таблицы развёртки полоса разошлась, 5–20) Эталон без единого источника чисел не является эталоном: две проверки одной модели дадут разные вердикты. Введено сквозное правило в § 1. Остаток находки — Vh/Vv в v1-редакторе — ЗАКРЫТ AD-1444: зелёные зоны указателей (0.35–0.7 и 0.02–0.06 в designer.html, плюс своя копия в панели 3D-вида aero3d.js, где полоса Vv вдобавок разошлась с соседней — 0.02–0.05) не сведены к полосам по назначению, а СНЯТЫ вместе с вердиктом: свести механически было нельзя (параметра «назначение» у v1 нет), поэтому старый редактор показывает числа и НАЗЫВАЕТ причину молчания — то же состояние «эталона нет», которым v2 отвечает утке. Семейство Vh/Vv заведено строкой в реестре tests/threshold_single_source_guard.py, меры — tests/test_tail_volume_v1_no_verdict.py. ⚠ Прежняя формулировка «третьей копии не осталось» была выведена из запроса по зоне стража AD-1415 (verdicts.js, payload_ui.js) и designer.html не покрывала — отсюда правило: строка переводится в «закрыто» только вместе с ОБЛАСТЬЮ ПОИСКА, покрывающей весь продукт, и AD-1440 закрыл запас устойчивости именно так — машинным обходом web//src//cad//scripts/ (tests/threshold_single_source_guard.py)
П3-В ~~закрыт AD-1415~~ Критерий выхода из петли центровки в продукте был мягче канона. «Запас устойчивости > 0» вместо «5–15 %» Петля формально сходилась там, где инженерно не сошлась. AD-1415 перевёл критерий на серверную полосу 5–15 % (designer_v2_stability.evaluate), гейдж и отчёт судят по ней одинаково
П3-Г Скороподъёмность считается при зашитой тяговооружённости 1.0. Число показано, вход отсутствует Тот же класс, что AD-1365 (назначение не считает ничего) и AD-1373 (мотогондолы вне сопротивления). В схему добавлено требование прослеживаемости входа (S15). Оба соседних случая закрыты: AD-1373 — мотогондолы вошли в бюджет сопротивления; AD-1365 — назначение считает массу борта (k оценки m₀, AD-1407/AD-1410), а ложный признак несвежести «Аэро крыла» снят; AD-1435 — назначение вдобавок подбирает профиль крыла (S06), и признак несвежести вернулся уже честным
П3-Д Времени полёта и дальности не считает никто, хотя это обязательный пункт ТЗ и критерий выхода из петель L1 и L13. Средство расчёта (propulsion_calc.py) в репозитории есть и не подключено В схеме было требование, которое ни одна стадия не проверяет. Отмечено как разрыв
П3-Е Бюджет сопротивления неполон сильнее, чем считалось: в нём нет не только мотогондол (AD-1373), но и оперения; профильное сопротивление крыла передаётся аргументом и не используется Требование S13 «в разложении присутствуют все физически существующие тела» нарушено тремя способами. Заведён отдельный тикет
П3-Ж Масса конструкции — ручной ввод с дефолтом 0. При дефолте центровка считается вообще без массы планера Петли L6 и L7 не имеют источника данных, то есть неисполнимы в принципе, а не «не доделаны»
П3-З Результаты расчёта не переживают перезагрузку страницы. Поле для них в хранимой записи модели есть, но не пишется ни клиентом, ни сервером Зависимость A → B рвётся во времени: потребители (подсказка по оперению, гейдж центровки) остаются без входа. Черновик схемы этого класса не рассматривал вовсе → добавлено сквозное правило в § 1
П3-И ~~снята решением Р3~~ Вариантов проекта не существует (ни клона, ни ветки, ни сравнения). При этом схема необратима Канон требует выбирать схему сравнением вариантов. Необратимость без механизма вариантов делает выбор аэросхемы невозможным как процесс
П3-К Разрыв «проект → борт» полный: между моделью проекта и моделью борта нет ни одного поля-ссылки. При этом «борт → настройка полётного контроллера» работает Цепочка «от идеи до готового самолёта» рвётся ровно в одном месте, и это место — не расчёт и не производство, а передача борта в эксплуатацию
П3-Л Запас устойчивости на стадии крыла считается от аэродинамического фокуса, а не от центра тяжести, но подписан так же, как настоящий запас устойчивости на стадии компоновки Одна подпись у двух разных величин — ловушка для пользователя и для любого будущего критерия выхода из петли L5
П3-М Метод: два из четырёх отчётов автоматической разведки содержали неверные факты — «мультисекционного крыла нет» (оно есть, AD-1271) и «отказ решателя подменяется нулевым результатом» (это чинил AD-1212, сейчас отказ честный) Проверка на прочность обязана перепроверять и собственные источники, а не только тикеты. Оба факта опровергнуты прямым чтением кода

6. Что, наоборот, сделано хорошо

Чтобы эталон не читался как обвинительное заключение — элементы, которые
схема подтверждает как правильные:

  • Разбивка под печать (S22P) — самая полная стадия процесса: замки трёх
    типов с посадочным зазором, лючки, блокирующий гейт при негодной геометрии.
    Это образец того, как должна выглядеть законченная стадия.
  • Петля L3 (срыв законцовки) — единственная петля с настоящим численным
    критерием и градацией «внимание/опасно».
  • Честный отказ расчёта (AD-1212): падение, таймаут и потерянный результат
    различаются кодом причины, нулевой результат не выдаётся за расчёт и не
    попадает в кэш. Это ровно то поведение, которого требует эталон от любой
    стадии-поставщика.
  • Лок необратимого решения держится на сервере, а не в интерфейсе, и покрыт
    тестами.
  • Отсутствующие стадии не изображаются заглушками — узлы аэродинамический анализа не
    рисуются вовсе, и это честнее, чем нерабочая кнопка.


Внешняя критика: вердикты

Схему прогнал агент, её не строивший. Ниже — вердикт по каждой претензии.
Обозначение находок — В-n.

Принято и исправлено

# Претензия Что сделано
В-1 Корневая: схема умеет менять значения, но не применимость ограничения. «Размах ≤ багажника» относится к транспортному положению, а не к полёту; настоящий ход моделиста — разъёмное крыло. Схема вела флагманский случай основателя к парковому самолёту с удлинением 4 вместо тренера 1.8 м с разъёмным крылом У ограничения появилась область действия (в каком состоянии проверяется). Введён третий способ снятия — конструктивное решение, и он первый по предпочтению. Добавлено ветвление V7 «разъёмность и складывание» в блок I, где оно и решается. Разбор живого случая переписан: прежний ответ показан как уводящий от верного
В-2 Единственным законным выходом из пустой области объявлено «ослабить требование»; добавить механизацию классифицировалось как подгонка Выходов стало четыре, по возрастанию цены. Механизация названа конфигурационным решением: подгонка — переписать число, не меняя аппарата; конфигурационное решение меняет аппарат, и число ему соответствует
В-3 Нет входа для «повторить существующее»: сценарий проходит ноль стадий Введён второй вход — обратная задача (О1–О5): от геометрии к восстановлению точки проектирования, допущений и проверке непротиворечивости, затем вход в прямой процесс
В-4 Шестой мнимый цикл, не найденный за 22 прохода: силовая установка ↔ развесовка Добавлен в таблицу мнимых циклов; допущение названо — доля силовой установки во взлётной массе ⚠
В-5 «Бюджет сопротивления» и «целевое L/D» потребляются, но не производятся ничем — нарушение главного критерия Объявлены выходами точки проектирования: допущение, взятое обязательством
В-6 Критерий продувки сравнивал качество крыла с целевым качеством модели — проходился всегда Критерий заменён на коэффициент Освальда и характер срыва; проверка качества перенесена туда, где есть полное сопротивление
В-7 Карточка фюзеляжа объявляла входом плечо оперения, которое сама производит — след перестановки, не доехавший до карточки Исправлено: вход — типовая длина как доля размаха; плечо — выход
В-8 Вертикальное положение крыла и моно-/биплан производятся без потребителей Потребители названы: интерференционное сопротивление и линия тяги; ветвление V1
В-9 Параметризация аэросхемой заполнена только для классики: «ниже» и «своё» вместо чисел Помечено ⚠ с перечнем величин, которые обязаны быть определены до работы над летающим крылом
В-10 Числа бесхвостки введены документом, без источника, не помечены Помечены ⚠
В-11 Справочники вне графа зависимостей и вне правила свежести Добавлены в граф с указанием потребителей и правила обесценивания
В-14 Толщина стенки «два периметра» запрещает доминирующую технологию класса (печать в один периметр) Помечено ⚠, требование снято как ошибочное
В-15 Гранулярность стадий непоследовательна, критерия «что считать стадией» нет Сформулирован: свой критерий выхода и свои потребители; неоднородность объёма объяснена
В-16 Блокирующий экспорт против решения «гейт не блокирует» Разведено: гейт оценивает готовность и не блокирует; невозможность собрать файл из нережущейся геометрии — отказ инструмента, а не вердикт о зрелости
В-17 Развязка устойчивости и развесовки частично отменена «разведением ролей» — типичная мнимая правка Формулировка снята: разрешение через целевой ЦТ самодостаточно
В-18 Документ склеивает инвариант и снимок Раздел разрывов вынесен в этот отдельный документ
числа Масса «≈1 кг на метр размаха» не помечена, линейна там, где рост степенной; балласт 3 % без источника; элероны 20–30 % полуразмаха похожи на смешение доли хорды с долей размаха Первые два помечены ⚠ с разбором ошибки масштабирования; третье помечено как унаследованное из канона и подлежащее проверке

Отвергнуто

# Претензия Почему отвергнута
В-12 «Таблица „у каждого решения петля или замок“ доказывает не то, что обещает: восемь петель из тринадцати аварийные, добровольная смена не покрыта» Претензия верна по факту, но вывод неверен. Добровольное изменение не нуждается в петле: оно разрешено всегда, а его последствия обслуживает каскадное обесценивание — механизм, введённый в проходе 4. Правило уточнено в формулировке, но не в существе: аварийная петля отвечает на «когда пересмотр обязателен», а не «можно ли передумать»
В-13 «N1/N2 не проходят собственный тест схемы; после Р9 критерия не осталось, осталась воля основателя» Критерий существует и решение ему соответствует. Необратимо то, что меняет состав стадий: у летающего крыла стадия оперения исчезает целиком, способ изготовления меняет набор конечных стадий. Тип оперения, моторы, шасси меняют содержание стадий и коэффициенты, но ни одна стадия от них не появляется и не исчезает. Принято другое: критерий не был записан — теперь записан, с механической проверкой «назови стадию, которая исчезает»

Требует решения основателя

# Вопрос
Р10 Разъёмность и складывание — новое ветвление V7. Оно снимает потолок размаха и потому меняет ответ на флагманский запрос. Вопрос: входит ли в объём продукта сейчас, или схема фиксирует его как необходимый, но отложенный?
Р11 Обратная задача «повторить существующее» — второй вход в процесс. Входит ли в объём? Частичный вход в продукте есть (разбор чужих моделей), но служит каталогу, а не проектированию
Р8 (остаётся открытым с прохода 6) Граница «готовой модели»: до или после выпуска файлов
Р12 Эталон в границах Р1 нефальсифицируем: единственная петля, проверяющая числа реальностью (лётная доводка), вынесена за границу. Расчётные ЛТХ ни с чем не сравниваются. Вопрос: заводить ли обратный канал «факт → модель», не расширяя границы процесса моделирования