Что делать дальше: порядок работ до первого работающего куска¶
План реализации симулятора «мир БВС» от текущего состояния (есть только документы) до сдаваемого
M1. Построен по методу проекта «валидатор пишется раньше продукта»
(docs/task5/70-plan/01-validator-first.md).
Единица оценки — не человеко-дни. Код пишут агенты, ревьюер один. Узкое место — пропускная способность ревью и число итераций до схождения метрик, а не набор кода. Поэтому каждый шаг оценивается тремя числами: агенто-заходов (один заход = одна задача агенту → один проверяемый артефакт), минут ревью и ожидаемых итераций до схождения. Календарь упоминается только там, где он внешний и настоящий: окно хакатона 15–29.09.2026.
0. Принцип, из которого выведен порядок¶
Метод проекта в одну строку: любое утверждение о качестве — число из независимого счётчика. Для планировщика этим счётчиком стал валидатор. Для симулятора его роль играют три вещи, и все три пишутся до движка:
- Таблица эталонов 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 мин). Пока их нет, «модель борта» — это мнение. - Тест детерминизма — 10 прогонов одного комплекта дают один sha256. Пока его нет, ни одно другое число ничего не доказывает.
- Набор мутантов — 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 без altitudeMode → ALT_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:
- 4d полностью (фронт и 3D) → демо идёт по записанному журналу и таблице чисел. Теряется критерий жюри «качество демонстрации», сохраняется всё остальное.
- 4c частично: остаются ветер, дерейтинг и потеря связи; уходят катапульта, парашют и лестница contingency сверх двух failsafe.
- 4b частично: остаются «сухой» режим и
coverage_fraction_actual; уходят карта GSD и смаз. - 4a частично: остаются клиренс и зоны; уходят LOS по рельефу и пригодность площадок.
Что не режется ни при каких условиях: шаги 0, 1, 2, 3 и поток 4e. Симулятор без валидатора и без негативного контроля — не «урезанный симулятор», а источник ложной уверенности, и сдавать его хуже, чем не сдавать вовсе.
И главное правило, действующее всё время: симулятор не блокирует сдачу планировщика. Планировщик — основной продукт задачи 5, он сдаётся целиком и самостоятельно. Если симулятор начинает оттягивать ревью-бюджет от планировщика, режется симулятор.
Составлено 15.09.2026 по методу docs/task5/70-plan/01-validator-first.md. Оценки — в
агенто-заходах и минутах ревью; человеко-дни в этом проекте не измеряют ничего, потому что код
пишут агенты, а узкое место — число итераций до схождения метрик.