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

Журнал прогона и маркировка достоверности

Дополнение к README.md: поля артефактов, связи между файлами и правила fidelity_class.

Файлы в каталоге прогона

После sim run или HTTP-запуска в одном output_dir / runs/<id>/ появляется набор, который пишет run_plan_headless (mission/runner.py:217-339) и RunJournalWriter (journal/writer.py:276-426).

Файл Назначение Кто пишет
world_manifest.json Снимок мира: CRS, слои, layer_completeness, sha256 фикстуры WorldRuntime + build_world_manifest до интеграции (runner.py:217-219)
run_manifest.json Идентификаторы воспроизводимости, dt_s, telemetry_hz, хеши плана и телеметрии RunJournalWriter.write (writer.py:368-411)
telemetry.jsonl Пошаговое состояние борта, 10 Гц при dt_s=0.1 writer.py:306-320, 415
events.jsonl События миссии (в headless-прогоне — из интегратора, events_mode="sim") writer.py:391-404, runner.py:292-297
fact_report.json План vs факт, среда, блок determinism build_fact_report (mission/fact_report.py:361+)
frames.jsonl, frames_summary.json Сухие кадры (геометрия GSD/футпринт, без TIFF по умолчанию) materialize_dry_frames_headless (camera/frames.py)
.journal_run_id Защита от повторной записи в тот же каталог writer.py:259-266, 420

Повторный прогон в тот же каталог с тем же run_id отклоняется на записи журнала: RunJournalWriter поднимает RunIdCollisionError с code == "RUN_ID_COLLISION" (writer.py:32-35, 259-266). Оператор CLI видит не этот код, а JSON с "code": "INTERNAL_ERROR" и текстом run_id already exists: … (cli/__init__.py:143-151). Клиент HTTP получает 409 и RUN_ID_COLLISION (api/routes/runs.py:72).

Поля строки telemetry.jsonl

Формирование — _telemetry_row (journal/writer.py:126-158). В headless-прогоне включены дополнительные поля среды (enrich_env_fields=True в runner.py:293).

Поле Смысл
t_sim_s Модельное время, с
uav_id Идентификатор борта из плана
lon, lat, alt_amsl_m WGS84 из ENU-начала плана
east_m, north_m Локальная ENU
heading_deg Курс по ветровому треугольнику
v_air_ms, v_ground_ms Воздушная и путевая скорость
energy_remaining_wh Остаток энергии
mode Фаза полёта (phase интегратора)
link_up, wind_speed_ms Только при enrich_env_fields
fidelity_class, depends_on, validation_level Маркировка достоверности на каждой записи

Числовые поля внутри строки наследуют fidelity_class: derived и depends_on из INTEGRATOR_DEPENDS (fidelity/quantity.py:26-31, writer.py:153-157).

Блок reproducible в манифесте

Канонический поднабор для хеша reproducible_sha256 (writer.py:335-359, reproducible_manifest_sha256 writer.py:50-52):

  • log_schema_version, run_id, world_snapshot_id, версии модели БВС и погодный снимок
  • plan_sha256, scenario_sha256, run_config_sha256, seed, dt_s, telemetry_hz, clock_mode
  • assumptions_used, telemetry_sha256, phase_durations_s
  • sha256 каталогов fleet.yaml / payloads.yaml

clock_mode для CLI-прогона — headless (journal/context.py через JournalWriteContext; в событиях — run_start с clock_mode: headless, runner.py:87).

Три класса достоверности

Реестр в коде — ALLOWED_FIDELITY_CLASSES (fidelity/quantity.py:7):

Класс Когда ставится (факт кода)
measured Зарезервирован в контракте; в headless-выходах почти не встречается
derived Телеметрия, манифест прогона, метрики интегратора, plan_vs_fact по симуляции
assumed Погода из плана/сценария, часть плановых метрик без пересчёта в симе (fact_report.py:412-417)

Уровни валидации: по умолчанию V2 для derived, V1 для assumed (quantity.py:18-20). Уровень V3 в комментарии помечен как «ещё не закрыт» (quantity.py:18).

Связь с допущениями: depends_on разрешается через contracts/assumptions.yaml (fidelity/assumptions.py:32-42). Неизвестный id вызывает ValueError при проверке (assumptions.py:45-49).

Аудит «0 % без класса»

Скрипт simulate/tools/audit_fidelity_coverage.py обходит артефакты прогона (fidelity/audit.py:11-18, 70-80). Тест tests/test_fidelity_class.py::test_s01_zero_numeric_leaves_without_fidelity_class требует without == 0 на полном s01.

Валидатор структуры — fidelity/validate.py + journal/schema_validate.py при записи.

Что не является «измерением» в симе

См. также LIMITATIONS.md: реальные радары/снимки, полный каталог W-xx, бит-идентичность на всех ОС, потоковая запись с бюджетом ≤20 МБ на 180 мин — ограничения задокументированы там с отсылками к тестам.