Перейти к содержанию

Что делать дальше: порядок работ до первого работающего куска

План реализации симулятора «мир БВС» от текущего состояния (есть только документы) до сдаваемого M1. Построен по методу проекта «валидатор пишется раньше продукта» (docs/task5/70-plan/01-validator-first.md).

Единица оценки — не человеко-дни. Код пишут агенты, ревьюер один. Узкое место — пропускная способность ревью и число итераций до схождения метрик, а не набор кода. Поэтому каждый шаг оценивается тремя числами: агенто-заходов (один заход = одна задача агенту → один проверяемый артефакт), минут ревью и ожидаемых итераций до схождения. Календарь упоминается только там, где он внешний и настоящий: окно хакатона 15–29.09.2026.


0. Принцип, из которого выведен порядок

Метод проекта в одну строку: любое утверждение о качестве — число из независимого счётчика. Для планировщика этим счётчиком стал валидатор. Для симулятора его роль играют три вещи, и все три пишутся до движка:

  1. Таблица эталонов V-1…V-14 — 14 чисел из fleet.yaml, payloads.yaml и РЭ-201, которые модель обязана воспроизвести (40 мин Gemini, 180 мин / 210 км у 201, R = 136,4 м, снос 168 м, 7,3 и 22,0 км², GSD 1,96 см, −10 °C → 30,0 мин). Пока их нет, «модель борта» — это мнение.
  2. Тест детерминизма — 10 прогонов одного комплекта дают один sha256. Пока его нет, ни одно другое число ничего не доказывает.
  3. Набор мутантов — 12 заведомо дефектных планов, каждый из которых симулятор обязан поймать. Пока его нет, «нарушений не найдено» неотличимо от «ничего не проверяется».

Из этого следует жёсткая последовательность: предпосылки → контракты и фикстуры → валидатор → ядро M0 → M1. Внутри шагов многое параллелится, между шагами — нет.

Шаг 0: предпосылки (3 спайка, параллельно)
   └──► Шаг 1: контракты, реестры, фикстуры (параллельно внутри)
           └──► Шаг 2: ВАЛИДАТОР МОДЕЛИ на стабах (жёстко до движка)
                   └──► Шаг 3: ядро M0 — один борт, headless, бит-в-бит
                           ├──► Шаг 4a: мир и препятствия
                           ├──► Шаг 4b: камера и покрытие по кадрам
                           ├──► Шаг 4c: среда и failsafe
                           ├──► Шаг 4d: фронт и 3D
                           └──► Шаг 4e: негативный контроль (мутанты)
                                   └──► Шаг 5: демо и документация

Шаг 0. Предпосылки: три спайка, которые могут отменить план

Все три документа молча считали эти вопросы решёнными. Ревью 3 показало, что ни один из них не проверен. Каждый проверяется спайком за один заход; если хоть один проваливается, план меняется до написания кода, а не после.

# Спайк Что проверяем Критерий готовности Что делать при провале
0.1 Доступность геоданных из контура (SIM-FIN-07, R-03) aws s3 --no-sign-request к copernicus-dem-30m и esa-worldcover; регистрация cdsapi для ERA5; выгрузка OSM-экстракта демо-района; ETH canopy Зеркало демо-района выгружено, объём и sha256 записаны, сборка мира из зеркала при отключённом DNS проходит; для каждого источника зафиксирован результат проверки ERA5 → SHOULD/M2, режим ветра manual остаётся MUST; при недоступности бакетов — резерв AWS Terrain Tiles с пометкой «источник неоднородный»
0.2 Ресурсы узла n2 (R-05, Q-PLT-05) kubectl --context n2 describe node — фактические CPU/RAM сверх уже развёрнутого Числа записаны в 60-platform/01 §5.5; параллелизм прогонов и requests/limits выведены из них При < 8 ядрах: ночной батч урезается до s01–s10, SIM-PLT-22 остаётся M2
0.3 Рантайм движка с управляемой FP-семантикой (SIM-FIN-15, Д-07, R-07) На кандидате-рантайме прогнать минимальный интегратор 10 раз и сравнить sha256; проверить отсутствие -ffast-math, контроль FMA, фиксированный порядок редукций Выбран язык/рантайм, хранилище и CPU-растеризатор кадра; альтернативы и причина отказа зафиксированы; тест детерминизма на пустом интеграторе зелёный Если ни один кандидат не даёт бит-в-бит — детерминизм переформулируется в «совпадение метрик до 1e-9», и это записывается в ограничения до сдачи, а не после

Оценка шага 0: 3 агенто-захода, все параллельно. Ревью — 40 мин (три коротких отчёта с числами). Итераций — 1, потому что результат спайка либо есть, либо нет.

Почему это шаг 0, а не «сделаем по ходу». 0.1 и 0.3 — единственные два риска в реестре, которые не лечатся ничем после 22.09: без данных нечего собирать, без детерминированного рантайма падает главное продающее свойство.


Шаг 1. Контракты, реестры и фикстуры

Ничего исполняемого; всё, без чего валидатор нечем питать и что после начала кодирования будет стоить втрое.

# Задача Требование Критерий готовности
1.1 Единый реестр кодов ошибок и событий SIM-FIN-09 Один машиночитаемый файл: код, класс, домен, текст, ссылка на источник; ALT_FRAME_MISSING — единственный код фрейма высот; дубликатов по смыслу нет
1.2 Сквозной реестр допущений SIM-FIN-10 Четыре нумерации (A-xx, A-MIS-xx, ДОП-W-xx, ДОП-ENV-xx) сведены в сквозные ID с алиасами; каждая запись несёт value, unit, rationale, question_id, affects[]
1.3 Заморозка schema_version: 1 с планировщиком + планы-фикстуры SIM-FIN-08, R-02 Соглашение зафиксировано; в репозитории лежат рукописные планы s01, s04, s07, проходящие импорт без import_fixups[]
1.4 Генератор синтетических тестовых миров SIM-FIN-12 Детерминированные фикстуры: плоскость, хребет 300 м, гряда 80 м, вышка 120 м, NFZ со срезаемым углом; каждая < 5 МБ, воспроизводится по seed
1.5 Контракт журнала прогона с log_schema_version SIM-FIN-11, SIM-MIS-22/23 Три части журнала описаны как схема; манифест содержит версию; правило «минорные читаются вперёд» зафиксировано
1.6 Первый батч вопросов заказчику §10 головного документа Топ-12 отправлен; Q-NEW-01…04, Q-ENV-12, Q-MIS-11 включены

Оценка: 6 агенто-заходов; 1.1–1.5 параллельны, 1.6 не зависит ни от чего. Ревью — 90 мин (реестры читаются целиком, это не тот случай, где хватает таблицы метрик). Итераций — 2: первая версия реестра кодов почти наверняка разъедется с доменными документами.


Шаг 2. Валидатор модели — раньше движка

Ключевой шаг метода. Пишется исполняемая таблица эталонов, которая на этом этапе красная целиком — движка ещё нет, все кейсы FAIL. Это правильное состояние: дальше каждая задача агенту измеряется тем, сколько строк позеленело.

# Задача Требование Критерий готовности
2.1 Таблица эталонов V-1…V-14 как одна команда SIM-UAV-38 sim validate --reference печатает «эталон / факт / отклонение / допуск / PASS-FAIL» и возвращает ненулевой код при любом FAIL; V-11 = 30,0 мин (не 28), V-9 считается при V_a = 15 м/с = airspeed_max
2.2 Тождества V1 (9 штук) SIM-BIZ-10 Ветровой треугольник ≤ 0,5 %, GSD ≤ 0,1 %, площадь в проекции ≤ 0,1 %, round-trip WGS84↔ENU ≤ 0,01 м, R = 136,4 ± 0,5 м
2.3 Инварианты V2 (7 штук), включая тест детерминизма SIM-BIZ-11, SIM-MIS-19 10 прогонов → один sha256; дрейф ≤ 1 м на 100 кругов; энергобаланс ≤ 0,1 %; T > L/V_g строго; dt → dt/2 меняет makespan ≤ 0,5 %
2.4 Набор из 12 мутантов SIM-BIZ-14 Каждый мутант — файл плана + ожидаемый код нарушения; команда sim mutate --set base печатает матрицу «мутант × детектирован»
2.5 Скелет отчёта план/факт с именами метрик валидатора SIM-MIS-28 Diff имён полей отчёта симулятора и отчёта валидатора планировщика пуст (проверяется автоматически)

Оценка: 5 агенто-заходов, 2.1–2.4 параллельны после 2.5. Ревью — 60 мин, но это самое дорогое ревью проекта: ошибка в эталоне отравит все последующие числа. Итераций — 2–3: эталоны придётся пересчитывать вручную и сверять с fleet.yaml построчно.

Критерий выхода шага 2: таблица эталонов исполняется, все 14 строк FAIL по причине «движка нет», ни одна — по причине «эталон не посчитан».


Шаг 3. Ядро M0 — один борт, headless, бит-в-бит

Первый работающий кусок. Цель — позеленить строки V-1…V-4, V-7, V-8, V-12, V-13, V-14.

# Задача Требования Критерий готовности
3.1 Геопривязка: ENU через ECEF, датумы, round-trip SIM-WORLD-02/03/04/07 Round-trip ≤ 0,01 м в радиусе 200 км; точка в 100 км даёт z = −785 ± 5 м; V-13 зелёный
3.2 Загрузчик рельефа GLO-30 из зеркала, билинейная интерполяция float64, маска качества SIM-GEO-01/24, SIM-WORLD-12/16 Узловая точность бит-в-бит; стык тайлов ≤ 1e-6 м; доля заполненных ячеек в отчёте мира
3.3 Импорт комплекта прогона и валидация в строгом режиме SIM-MIS-01/03/04/05/06 Фикстуры s01/s04/s07 импортируются без import_fixups[]; KML без altitudeModeALT_FRAME_MISSING
3.4 Интегратор L1 с фазами, ветровой треугольник, энергомодель по двум якорям SIM-UAV-01/02/03/12/15/21/22/26 V-1…V-4, V-7, V-8 зелёные; сумма фаз = длительности вылета ± 1 с
3.5 Журнал прогона (манифест + события + телеметрия 10 Гц) SIM-MIS-22/23/24/25 108 000 ± 20 записей на 180-мин вылет; ≤ 20 МБ; clearance_m и xtrack_error_m не null
3.6 Отчёт план/факт одной таблицей, детерминизм, run_manifest SIM-BIZ-03/32, SIM-MIS-28/30 V-14 зелёный; сумма компонент дельты = дельте ± 1 с

Критерий выхода M0 (из головного документа §5): s01 прогоняется одной командой; два прогона с одним seed дают бит-в-бит одинаковый журнал; площадь в проекции ≤ 0,1 %; round-trip ≤ 0,01 м; ветровой треугольник ≤ 0,5 %; 9 из 14 эталонов зелёные.

Оценка: 6 агенто-заходов; 3.1–3.3 параллельны, 3.4 зависит от 3.1, 3.5–3.6 — от 3.4. Ревью — 90 мин, но по таблице метрик, а не по коду: зелёная строка эталона — достаточное основание не читать диff. Итераций — 3–4, и почти все уйдут на детерминизм (порядок редукций, обход коллекций, seed-подпотоки) — это ожидаемо и заложено.

Красная граница шага 3: если после 4 итераций два прогона не дают один sha256, работа останавливается и пересматривается решение 0.3. Дальше строить смысла нет.


Шаг 4. M1 — пять параллельных потоков

После M0 потоки почти не зависят друг от друга: каждый добавляет слой поверх готового ядра и измеряется своими строками приёмки.

4a. Мир: препятствия, зоны, клиренс, LOS

Задача Требования Критерий готовности
Слой препятствий из OSM + MS Footprints, связные пролёты ЛЭП SIM-GEO-12, SIM-WORLD-28 На фикстуре «две опоры» траектория между ними ниже вершин даёт столкновение; публикуется obstacle_layer_completeness
Клиренс интервалом, нарушение по центральному значению, warning на узкий запас SIM-WORLD-06, SIM-UAV-11 Клиренс 98 м → violation; 102 м при LE90 = 4 м → warning CLEARANCE_MARGIN_BELOW_GEOREF; на эталонном корректном плане ложных срабатываний 0
Зоны: 6 типов, дефолт фрейма с предупреждением, аналитическая длина внутри SIM-WORLD-18/19/21/22/23 Фикстура «срез угла 3 м» даёт violations.nfz ≠ 0; сценарий планировщика без altitude_frame импортируется с warning
LOS по рельефу с зоной Френеля, шаг ≤ 15 м SIM-WORLD-31, SIM-ENV-23 На фикстуре «гряда 80 м» связь рвётся на 12 км вместо 40
Пригодность площадок, включая резервные SIM-WORLD-32, SIM-FIN-01/02 reserve_reachable_frac в отчёте; непригодная резервная площадка даёт RESERVE_SITE_UNSUITABLE

4b. Камера: покрытие по кадрам

Задача Требования Критерий готовности
Геометрия кадра из payloads.yaml, фактический AGL по DEM шагом ≤ 10 м SIM-CAM-01/02/03/07/08 V-12 зелёный; перепад 50 м даёт разброс GSD не менее Δh·k
«Сухой» геометрический режим как дефолт headless + подвыборка растров SIM-CAM-11/24/25, SIM-PLT-12/23 Headless на 153 000 кадров: 100 % метаданных, 0 растров; GUI — потолок 5000 растров с равномерным прореживанием
coverage_fraction_actual, карта GSD, список пропусков SIM-CAM-29/30/31 Сумма площадей пропусков + coverage_actual × area = площади полигона ± 0,1 %
Смаз и паспорт кадра SIM-CAM-18/26, SIM-MIS-26 smear_m в каждом сайдкаре; photos_total факта = числу паспортов

4c. Среда и бортовые деградации

Задача Требования Критерий готовности
Поле ветра W(x,y,z,t) в ENU, профиль по высоте, допуск по ветру на высоте SIM-ENV-01/02/09/10 Ветер 8 м/с на 10 м → 11,1 м/с на 100 м → Gemini не допущен; V-9 зелёный при V_a = 15 м/с
Единая кривая дерейтинга в env_profile.yaml SIM-ENV-15, SIM-UAV-07 V-11 = 30,0 ± 0,5 мин; в модуле борта собственной модели дерейтинга нет
Потеря связи: не прерывает задание, возврат по таймеру, t_out_of_link_max_s SIM-ENV-24/25, SIM-UAV-32 Запуск без таймера → AUTONOMOUS_TIME_REQUIRED; борт проходит 170 км вне связи и выполняет задание
Лестница contingency, предикат P1–P6, коды РЭ дословно SIM-ENV-28/30/37/38, SIM-UAV-30/31 При непригодных кадрах полёт не прерван, площадь → resurvey_required; после НАРУШЕНИЕ ЗОНЫ снято 0 кадров
Failsafe мультироторов явной таблицей допущений SIM-FIN-14 Каждая строка несёт пометку ДОПУЩЕНИЕ и ссылку на Q-NEW-02
Катапультный старт и парашютная посадка со сносом SIM-UAV-13/14/16/17 V-10 зелёный (168 ± 2 м); старт по ветру → NO-GO

4d. Фронт и 3D

Задача Требования Критерий готовности
Загрузка и воспроизведение headless-журнала SIM-UX-33/03 Журнал CLI-прогона открывается без модификации формата; позиции борта ≤ 0,1 м от live-прогона
Экран прогона: 3D + карта + телеметрия + таймлайн SIM-UX-08/12/13/14 Всё видно одновременно на 1366×768; покадровый шаг ровно 0,1 с
Четыре вида камеры, FOV из payloads.yaml SIM-UX-09/10 Диагональный FOV Pollux 43,0° ± 0,5°
Зоны объёмом, план/факт двумя линиями, полоса по рельефу, связь по LOS SIM-UX-17/19/20/22 Граница зоны связи на фикстуре «гряда 80 м» проходит на 12 км
Экран покрытия SIM-UX-32 Доля площади вне ±10 % от заданного GSD показана числом
Офлайн-ассеты SIM-UX-29 При отключённой сети экран прогона загружается без ошибок на внешние домены

4e. Негативный контроль и трассировка

Задача Требования Критерий готовности
Прогон 12 мутантов SIM-BIZ-14 12 из 12 детектированы, 0 ложных срабатываний на эталонном корректном плане
Трассировка V4: пункт РЭ → тест SIM-BIZ-13 100 % документированных порогов покрыты; каждый тест ссылается на пункт
Сверка V3 с валидатором планировщика SIM-BIZ-12 Длина маршрута ≤ 1 %; нарушения симулятора ⊇ нарушений валидатора на s01–s10
Сверка рельефа с ArcticDEM/ALOS SIM-FIN-18 Медиана и p95 расхождения опубликованы; при медиане ≤ 4 м клиренс поднимается до V3
Трёхзначный вердикт и признак полноты слоя SIM-FIN-16/17 Строка «GO» в выходе отсутствует; вердикт называет layer_completeness числом

Оценка шага 4: 4a — 5 заходов, 4b — 4, 4c — 6, 4d — 6, 4e — 5; итого 26 агенто-заходов. Потоки 4a–4d параллельны между собой; 4e зависит от 4a и 4b. Ревью — 4–5 часов суммарно, но распределено: каждый заход проверяется одной таблицей (эталоны, матрица мутантов, отчёт покрытия). Итераций — 2–3 на поток, кроме 4d (3–4: визуальные критерии сходятся медленнее числовых).

Красные границы: 4e не запускается, пока 4a и 4b не дали зелёные строки покрытия и клиренса — иначе матрица мутантов красная по причине отсутствия функции, а не по причине дефекта, и перестаёт что-либо измерять.


Шаг 5. Демо и документация

Последний шаг, и его нельзя начинать раньше: демо на неготовом M1 съедает ревью-бюджет впустую.

# Задача Требование Критерий готовности
5.1 Подбор демо-полигона по чеклисту SIM-FIN-06 Район даёт ≥ 5 опор ЛЭП в OSM, перепад рельефа ≥ 50 м, гряду ≥ 80 м между НСУ и полигоном; зеркало данных выгружено
5.2 Поминутный сценарий защиты и прекомпьютнутые прогоны SIM-FIN-06, SIM-BIZ-25 5-минутный прогон воспроизводится по паспорту бит-в-бит; фолбэк-видео записано
5.3 Инструкция по запуску SIM-FIN-03 Проверена на чистой машине без сети; воспроизводит демо-прогон с нуля за ≤ 15 мин
5.4 Руководство пользователя по 7 экранам SIM-FIN-04 Для каждого экрана: что делает, какие решения принимает оператор, как читается каждый визуальный элемент
5.5 Описание API SIM-FIN-05 OpenAPI генерируется из кода; расхождение схемы и реализации падает в CI
5.6 Перечень известных ограничений SIM-BIZ-33, §11 головного документа Все величины fidelity_class: assumed из сквозного реестра допущений присутствуют; ручная сборка допустима в M1

Оценка: 6 агенто-заходов, 5.3–5.6 параллельны. Ревью — 90 мин, из них половина на 5.6: перечень ограничений — раздел, по которому жюри отличает инженерную работу от демонстрации, и его нельзя принимать по диагонали. Итераций — 1–2.


Сводка объёма

Шаг Агенто-заходов Ревью, мин Итераций Параллелизм
0. Предпосылки 3 40 1 всё параллельно
1. Контракты и фикстуры 6 90 2 1.1–1.5 параллельно
2. Валидатор модели 5 60 2–3 2.1–2.4 параллельно после 2.5
3. Ядро M0 6 90 3–4 частично
4. M1, пять потоков 26 260 2–3 на поток 4a–4d параллельно, 4e после
5. Демо и документация 6 90 1–2 5.3–5.6 параллельно
Итого 52 ≈ 10,5 ч

С учётом итераций фактическое число заходов — примерно ×2,5 от базового, то есть порядка 130 агенто-заходов и 20–25 часов ревью. Это и есть реальный бюджет проекта; число написанных строк кода на него не влияет.


Правила ревью (наследуются от метода проекта)

Что видит ревьюер Что делает
В матрице эталонов есть FAIL Отклонить не читая
Два прогона дали разный sha256 Отклонить не читая; это блокирующий дефект, а не «мелочь»
В отчёте есть величина без fidelity_class Отклонить не читая
Мутант не детектирован Разбираться предметно: либо дефект симулятора, либо мутант неверен
Метрики не изменились Рефакторинг безопасен, можно не вчитываться
Метрики улучшились Проверить, что улучшение не за счёт нарушения (например, покрытие выросло, потому что перестали засчитывать пропуски)
Метрики ухудшились Единственный случай, где нужно читать код

Что режется первым, если не успеваем

Порядок отсечения зафиксирован заранее, чтобы решение принималось не в панике 28.09:

  1. 4d полностью (фронт и 3D) → демо идёт по записанному журналу и таблице чисел. Теряется критерий жюри «качество демонстрации», сохраняется всё остальное.
  2. 4c частично: остаются ветер, дерейтинг и потеря связи; уходят катапульта, парашют и лестница contingency сверх двух failsafe.
  3. 4b частично: остаются «сухой» режим и coverage_fraction_actual; уходят карта GSD и смаз.
  4. 4a частично: остаются клиренс и зоны; уходят LOS по рельефу и пригодность площадок.

Что не режется ни при каких условиях: шаги 0, 1, 2, 3 и поток 4e. Симулятор без валидатора и без негативного контроля — не «урезанный симулятор», а источник ложной уверенности, и сдавать его хуже, чем не сдавать вовсе.

И главное правило, действующее всё время: симулятор не блокирует сдачу планировщика. Планировщик — основной продукт задачи 5, он сдаётся целиком и самостоятельно. Если симулятор начинает оттягивать ревью-бюджет от планировщика, режется симулятор.


Составлено 15.09.2026 по методу docs/task5/70-plan/01-validator-first.md. Оценки — в агенто-заходах и минутах ревью; человеко-дни в этом проекте не измеряют ничего, потому что код пишут агенты, а узкое место — число итераций до схождения метрик.