# LAB E15 — source-paced live shadow inference qualification

Дата: 22 июля 2026 года
Финальный accepted run: 20:23–20:26 MSK / `2026-07-22T17:26:37Z` source completion
Статус: **accepted для recorded-source-paced shadow diagnostic**
Safety/navigation authority: **не выдана**

## 1. Что проверялось

LAB E15 впервые соединяет принятые ранее части Mission Core в один потоковый контур, близкий к будущему onboard perception loop:

1. bounded Mission Core shadow ingress;
2. инкрементальный decode сохранённого fMP4 без сборки видео целиком и без PNG на диске;
3. YOLOX-S object detection на каждом camera frame;
4. EoMT semantic segmentation на каждом пятом camera frame;
5. nearest-time camera → LiDAR → pose binding;
6. KB4 calibrated camera–LiDAR projection;
7. semantic/LiDAR association;
8. class-prior amodal 3D cuboids;
9. clearance и timestamped world-state;
10. bounded queues, telemetry и fail-closed acceptance.

Это не offline-просчёт «как можно качественнее». Источник отдавал 15 секунд реальной записи в темпе 1.0×, а worker обязан был удерживать camera cadence, bounded memory и ограничение на возраст результата.

## 2. Граница доказательства

Доказано:

- один RTX 4090 worker принимает camera/LiDAR/pose через live shadow wire contract;
- 151 fMP4 fragment декодируется инкрементально без потерь и без временных frame-файлов;
- detector работает практически на camera cadence 10 Hz;
- semantic contour работает примерно на 2 Hz и не блокирует detector;
- LiDAR/pose fusion и 3D cuboid/world-state укладываются в заданный p95 age budget;
- transport, model queues и media buffer остаются bounded;
- disconnect/replay transport не вмешивается в raw recorder;
- весь persistent worker contour и результаты размещены только на `D:`.

Не доказано:

- работа от физически подключённого K1 в этом конкретном E15 run;
- hardware-clock synchronization камеры и LiDAR;
- forest-domain accuracy, recall или safety quality;
- пригодность COCO/Cityscapes labels для автономной навигации;
- vehicle-body transform;
- управление беспилотником или safety authority;
- публикация текущего live world-state в операторский Rerun UI.

Итоговый scope результата: `live-shadow-diagnostic-only`.

## 3. Входные данные и provenance

### 3.1 Источник

- Session: `20260720T065719Z_viewer_live` (`RAVNOVES00`).
- Camera source: `sensor.camera.right`.
- Camera calibration slot: `camera_1`.
- Camera resolution: 800×600.
- Source interval: 14.989973 s.
- Replay pace: 1.0× recorded host arrival time.
- Camera frames: 151.
- LiDAR messages: 142.
- Pose messages: 150.
- Control messages: 2.
- Total wire events: 446.
- Camera index SHA-256: `e029815a60ad9fbfedb6169142c7449df2b119a51d1ce001f08806e04eb0be14`.
- MQTT raw SHA-256: `70da0edad5cbf0e89b6e2355c0aac294f8c36a67249cd33b8918353fd88c83af`.
- Accepted source report: `.runtime/compute-experiments/e12/20260722T172637Z-e12-source.json`.
- Accepted source report SHA-256: `8d36a9715b19fcd820e585629e0774d97ea21dfd5b763fd48e9672e098814e48`.

### 3.2 Калибровка

- Calibration SHA-256: `05f3ad9b38b3a4fc95388a8ec83da83c745e217709e51787b3d5aad0969f6fa9`.
- Projection model: KB4.
- Projection pack: `e15-live-projection-713fa7344805b7a592d12e949a6db38116e5370f768bde1cf9144fab5f93f0ae`.
- Projection arrays SHA-256: `d37bff4299b3fd6232926ba6e04d3cbd2a5aba0e66bf5ed02e0873340597566c`.
- Pack classification: `calibration-only-no-recorded-sensor-frames`.
- В projection pack нет записанных camera/LiDAR frames: только intrinsics, KB4 distortion и `T_camera_from_lidar`.

### 3.3 Valid-FOV

- Generation: `valid-fov-mask-b4dd8ddf2b87c1d520ee8a0868c4fea062d7c14d1bae73ccabd3abe1f3acbac2`.
- Mask SHA-256: `a40cee06b7c6f69b6a09a11563dcfd237f3de833b1ccd31459e66692e528ba63`.
- Valid pixels: 270,606 из 480,000.
- Маска вычислена заранее и переиспользуется; область за пределами полезного круга не подаётся моделям как содержательное изображение.

## 4. Software и model configuration

### 4.1 Runtime

- Host: `<worker-host>`.
- GPU: NVIDIA GeForce RTX 4090.
- Container image: `nvcr.io/nvidia/tritonserver:26.06-py3@sha256:58df7489c3f2276f9591d500a012dee03e23d35543ce3c390b4c001e6bf90794`.
- Python: 3.12.3.
- NumPy: 1.26.4.
- SciPy: 1.16.3.
- PyTorch: 2.13.0+cu130.
- Transformers: 4.57.6.
- PyAV: 18.0.0.
- lz4: 4.4.5.
- Media runtime payload SHA-256: `67487da59bba27676e5a5b4e43566e956fb350f1730589d93d55f22bcddc4c6b`.

### 4.2 Models

Detector:

- YOLOX-S, COCO-80, Triton inference;
- input 1×3×640×640;
- model SHA-256: `c5c2d13e59ae883e6af3b45daea64af4833a4951c92d116ec270d9ddbe998063`;
- config SHA-256: `5795c737a7935a655961b069e8404d336d891f9762fb6dffb93956a076479604`.

Semantic:

- `tue-mps/cityscapes_semantic_eomt_large_1024`;
- revision `8d6b6d1a3f7b50d441afd7d247c2ed10db186e8f`;
- FP16 autocast;
- model SHA-256: `c265da9a74f58f5c3f4826d23ca4ca78beac0b106cca5842beca61580de5b782`.

### 4.3 Immutable code/config identities

- Accepted live profile SHA-256: `8b7f267ee947932bdd52d1ef4b241adc8c9b4c4d5a8a3cd6c1e7f6e066983699`.
- E14 profile SHA-256: `a010e32070459b123423f3d4f57aa1d839f73ed05f3df8580d12693406a1b218`.
- Detector profile SHA-256: `819bdfb0da521d187ec9ce3d3039a0ff75daa0ab473fb3d8e5fa92db9c1ddca1`.
- Semantic profile SHA-256: `ea583966bc3409f5cf563cbf4fad05e366907e67187082eb692aff53d9f5d875`.
- Runner SHA-256: `8e487108404d912739b99d0043b8cbdd605ae148d8ad1d32ab30819ecfbb7dbc`.
- fMP4 runtime SHA-256: `6785763350f6e2c00796f3580ea6707e0c44339f18fa8eb56687178c6f0403fc`.
- PowerShell orchestrator SHA-256: `129bb6874730191cece10667b580fe5b8aa4e0878d442779679977079aa6069e`.
- Minimal worker package: `e15-worker-package-dd67306b6116dd6fa091557371eb80b27afb48dae4568fb0173f253a1fb4613a`.
- Minimal worker package identity SHA-256: `dd67306b6116dd6fa091557371eb80b27afb48dae4568fb0173f253a1fb4613a`.
- Package содержит 11 runtime modules и не тянет MQTT/BLE/web/device lifecycle в GPU-контейнер.

## 5. Scheduler и bounded-state contract

- Detector queue: latest-wins, capacity 2.
- Semantic queue: latest-wins, capacity 1.
- Semantic sample: каждый пятый camera frame.
- Semantic TTL: 750 ms.
- Sensor buffers: 32 LiDAR + 32 pose records максимум.
- Sensor retention: 3 s.
- Camera metadata queue: 16 максимум.
- Incremental media buffer: 8 MiB максимум.
- Camera → LiDAR maximum absolute delta: 100 ms.
- LiDAR → pose maximum absolute delta: 100 ms.
- Accepted sensor wait budget: 90 ms.
- Команды: disabled.
- Navigation/safety acceptance: false.

Камера не блокируется semantic model. Decoder публикует frame в две bounded очереди. Detector идёт на camera cadence; semantic worker независимо обновляет latest semantic mask. Detector result связывается с latest fresh semantic result и ближайшей допустимой LiDAR/pose парой.

## 6. Экспериментальные попытки

### 6.1 Attempt A — 20 ms sensor wait, rejected

Result ID: `e15-shadow-inference-396152240d878551ffe4913e03aee95be0b0ec572b69d76313edd73a7ee0cf7d`.

Все transport, decoder, FPS, semantic, latency, queue и authority checks прошли. Единственный failed check:

- fusion coverage 127/151 = 84.106%; требование ≥85%.

Причина:

- 19 camera frames получили `lidar-camera-delta-exceeded`;
- для девяти из этих frames следующий LiDAR находился всего в 49–88 ms после camera timestamp;
- wait budget 20 ms завершал binding раньше, чем этот LiDAR был декодирован и опубликован;
- расширять temporal gate более 100 ms не потребовалось.

### 6.2 Infrastructure interruption — не считается lab attempt

Один повтор был остановлен idle SSH timeout во время model preflight. Consumer к source не подключился, события не публиковались, immutable result не создавался. После проверки оставались только штатные `mission-core-triton`, `sentinel-frigate`, `sentinel-ollama`. Повтор выполнен с временными SSH `ServerAlive` options без изменения сетевой/VPN конфигурации.

### 6.3 Attempt B — 90 ms sensor wait, accepted

Result ID: `e15-shadow-inference-f3f06e7c6b338add445f7ee4e4a81f831cd763a899ac2fbe29ba3476c4bdf0c8`.

Изменён только `sensor_wait_ms`: 20 → 90. Temporal gate остался 100 ms, models и все acceptance thresholds не менялись.

Результат:

- fused frames: 136/151 = 90.066%;
- `lidar-camera-delta-exceeded`: 19 → 10;
- accepted cuboid states: 329 → 355;
- p95 world-state age: 79.28 → 149.43 ms;
- лимит p95 world-state age: 200 ms;
- итог: accepted.

Это осознанный обмен дополнительного bounded ожидания на более полное depth coverage без допуска LiDAR старше 100 ms.

## 7. Acceptance matrix финального run

| Gate | Требование | Результат | State |
|---|---:|---:|---|
| Camera frames | ≥140 | 151 | pass |
| Camera decode accounting | 1:1 | 151/151 | pass |
| Detector effective FPS | ≥9.5 | 9.881 | pass |
| Detector drops | ≤1% | 0/151 | pass |
| Semantic effective FPS | ≥1.8 | 2.029 | pass |
| Semantic drops | ≤5% | 0/31 | pass |
| Semantic completion age p95 | ≤400 ms | 162.162 ms | pass |
| Fresh semantic coverage | ≥90% | 96.689% | pass |
| Fused fraction | ≥85% | 90.066% | pass |
| Decode age p95 | ≤80 ms | 15.150 ms | pass |
| World-state age p95 | ≤200 ms | 149.427 ms | pass |
| Ingress sequence gaps | 0 | 0 | pass |
| Camera sequence gaps | 0 | 0 | pass |
| Failures | 0 | 0 | pass |
| Session-end | required | seen | pass |
| Commands/navigation authority | false | false | pass |

Все 18 acceptance checks прошли.

## 8. Производительность финального run

### 8.1 End-to-end

- Source span: 14.989973 s.
- Measured run wall: 15.281886 s.
- Detector: 151 frames, 9.881 FPS.
- Semantic: 31 frames, 2.029 FPS.
- Fused: 136 frames.
- Source-paced factor: около 1.019× wall/source, то есть контур удержал темп источника.
- Full orchestrator wall including isolated preflight, second model load, warm-up, run and publication: 113.669 s.

Большой orchestrator wall — cold-start overhead лабораторного запуска, а не latency активного perception loop. Для onboard-контура модели должны жить в постоянном worker process и не загружаться дважды перед каждой сессией.

### 8.2 Latency, ms

| Stage | mean | p50 | p95 | max |
|---|---:|---:|---:|---:|
| fMP4 decode age | 8.003 | 6.428 | 15.150 | 41.297 |
| Detector queue wait | 8.577 | 0.086 | 47.431 | 165.393 |
| Detector | 25.607 | 23.899 | 36.631 | 43.492 |
| Sensor wait | 10.075 | 0.033 | 90.136 | 110.995 |
| KB4 projection | 0.538 | 0.372 | 0.838 | 12.403 |
| Association/cuboid | 5.297 | 4.100 | 14.197 | 55.061 |
| Clearance | 0.204 | 0.177 | 0.413 | 0.877 |
| World-state projection | 0.154 | 0.131 | 0.358 | 0.748 |
| End-to-end world-state age | 58.154 | 43.815 | 149.427 | 282.994 |

World-state health:

- healthy: 136 frames;
- degraded: 13 frames;
- stale: 2 frames;
- unavailable: 0 frames.

Два max-latency spikes выше 200 ms не нарушили заданный p95 gate, но подтверждают, что результат пока не имеет safety authority.

### 8.3 Semantic timing, ms

| Stage | mean | p50 | p95 | max |
|---|---:|---:|---:|---:|
| Total processing | 135.524 | 126.185 | 147.835 | 396.316 |
| Forward | 107.197 | 99.099 | 109.701 | 369.566 |
| Completion age | 146.979 | 137.378 | 162.162 | 437.821 |

Semantic fresh status был доступен для 146/151 detector frames. Первые пять frames корректно помечены `semantic-unavailable`, а не замаскированы фиктивным результатом.

### 8.4 Sensor decode

- LiDAR decode mean/p95/max: 12.373 / 12.913 / 97.968 ms.
- Pose decode mean/p95/max: 0.077 / 0.103 / 0.186 ms.
- Synchronizer maximum stored depth: 32 point frames + 32 pose frames.
- Media buffer maximum actual depth: 178,687 bytes из 8,388,608 bytes.
- Camera metadata maximum depth: 2 из 16.

## 9. Functional output

- 1,188 detector/fusion object records рассмотрено за 151 frames.
- 355 accepted amodal cuboid states опубликовано.
- Frames с хотя бы одним accepted 3D object: 130/151.
- Maximum simultaneous accepted objects: 7.
- Accepted class states: 350 vehicle, 5 person.
- Cuboids являются temporal object states, а не 355 уникальными физическими объектами.
- Ground-truth quality в E15 не измерялась.

Основные rejection classes:

- fewer than 8 clustered points: 572;
- no semantic/LiDAR support: 173;
- amodal support coverage below threshold: 72;
- amodal required size exceeds class bound: 7;
- fewer than 4 clustered points: 6;
- distance innovation: 3.

Эти отказы fail-closed: сомнительная геометрия не превращается в принятый 3D cuboid.

## 10. Hardware и storage

Accepted run:

- process peak RSS: 2,023.5 MiB;
- process CUDA peak allocated: 2,107.9 MiB;
- process CUDA peak reserved: 2,840 MiB;
- total GPU memory used telemetry: около 13,298 MiB, включая соседний Triton contour;
- GPU utilization mean/p95/max: 27.4% / 45% / 58%;
- GPU memory-utilization mean/p95/max: 11.8% / 20% / 25%;
- GPU power mean/p95/max: 140.5 / 144.65 / 145.41 W;
- GPU temperature mean/p95/max: 44.6 / 47 / 48 °C.

Storage:

- hard free-space floor: 360 GiB;
- observed final free space: около 389.34 GiB;
- accepted result payload: около 1.56 MiB;
- no per-frame PNG/JPEG output;
- no recorded video copy in result;
- disk `C:` не проверялся и не использовался;
- persistent inputs, runtime и results находятся на `D:`.

## 11. Accepted artifacts

Local audit mirror:

`.runtime/compute-experiments/e15/results/e15-shadow-inference-f3f06e7c6b338add445f7ee4e4a81f831cd763a899ac2fbe29ba3476c4bdf0c8`

| Artifact | Bytes | SHA-256 |
|---|---:|---|
| `fusion-frames.jsonl` | 1,016,064 | `ae510afe881d7d6c5bc94520c5f87c385fdeb984bd30bd0cff70bd103f718963` |
| `world-state.jsonl` | 568,384 | `579266c99ae1e65b0240e8c5c224beba4073d05c531c5a725f096e9bbf9a3c05` |
| `semantic-frames.jsonl` | 13,955 | `21a8a659cc19e2acc9b971b93b746a4e26f8bb51829d1e1d13c4f42c1f79f1a5` |
| `gpu-telemetry.jsonl` | 3,591 | `51024d0774dd7e648ca4ae0cba69cca4de70baf8e47c425fa78c6805c2824712` |
| `run-report.json` | 13,230 | `f04fce80d9246d3c19f7368d6174787eb2fd73cdc7c51fa8d18555a0bfa0bf65` |
| `result.json` | 6,384 | `5b933109eedba02483ad35c65221d344da19f7e2584bd700d9be7c6b2ecef995` |

Rejected Attempt A также сохранён неизменяемо:

`.runtime/compute-experiments/e15/results/e15-shadow-inference-396152240d878551ffe4913e03aee95be0b0ec572b69d76313edd73a7ee0cf7d`

## 12. Вывод

На текущем RTX 4090 доказан не просто offline pipeline, а bounded source-paced perception loop на 15-секундном recorded replay:

- camera 10 Hz;
- detector около 10 Hz;
- semantic около 2 Hz;
- calibrated LiDAR/pose fusion;
- diagnostic 3D cuboids и world-state;
- p95 результата 149.4 ms;
- нулевые transport/model queue drops;
- 90.1% fused coverage;
- никакой command authority.

Следующий правильный gate — не дальнейшее улучшение recorded-video качества, а тот же профиль на физическом K1 shadow stream. Параллельно нужно убрать лабораторный cold start, превратив model-loaded contour в постоянный worker service. Только после повторяемого physical live gate имеет смысл подключать live world-state/3D cuboids к Rerun UI и отдельно начинать forest-domain evaluation и safety policy.

## 13. Следующие действия

1. Поднять persistent model-loaded E15 worker на `D:` без двойной загрузки моделей на каждую сессию.
2. Подключить физический K1 через уже существующий shadow ingress без command path.
3. Повторить ≥15 s physical shadow gate с теми же thresholds и отдельным LAB E16 report.
4. Добавить reconnect/worker-loss negative control: raw recorder обязан продолжить запись.
5. Передавать accepted `world-state` и cuboids в live Rerun entities с source/result timestamps и health.
6. После live transport qualification собирать forest-domain ground truth и считать 2D segmentation/object, distance и 3D cuboid quality отдельно от throughput.
