Разрывы между эталоном процесса и кодом
⚠ Это снимок, а не инвариант, и в этом причина отдельного документа.
Эталон процесса (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:498 → avl/types.py:147). Поддержаны три типа из пяти: обычное, V, T; креста и H нет |
| S03 Способ изготовления и материал | ЕСТЬ ЧАСТИЧНО | Строка переписана в AD-1414 — прежде стояло «НЕТ». Появились buildMethod (print/rib/foam — домен V4) и material с плотностями, допустимыми толщинами и контрольными массами (web/services/designer_v2_manufacturing.py ↔ manufacturing.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_inputs → drag_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.py ↔ mass.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.py ↔ designer_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-requirements → ASSUMED_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 нефальсифицируем: единственная петля, проверяющая числа реальностью (лётная доводка), вынесена за границу. Расчётные ЛТХ ни с чем не сравниваются. Вопрос: заводить ли обратный канал «факт → модель», не расширяя границы процесса моделирования |