Журнал прогона и маркировка достоверности¶
Дополнение к 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_modeassumptions_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 мин — ограничения задокументированы там с отсылками к тестам.