Lab034. Ограничение возраста видеоданных и отбрасывание устаревших кадров

1. Исходное состояние
- Commit Lab033: 21751f41dd0af022fc1f935c67e795e3ae4257c5.
- Перед Lab034 рабочее дерево было чистым; main опережала origin/main на один commit.
- Lab028-Lab033 и их результаты не изменяются.

2. Формирование FEC-блоков
layout | source | parity | blocks | partial | cross-frame | frames/block mean/max | before/after Lab033 kbps
Непрерывные | 862 | 216 | 72 | 1 | 58 | 1.806/2 | 226.951/240.240
По кадрам | 862 | 251 | 125 | 62 | 0 | 1.000/1 | 232.926/246.647
- Дополнительная избыточность выравнивания: 5.975 кбит/с (2.633%).
- Средняя эквивалентная группа кадра: непрерывные 17.111 пакета / 263.968 мс; выровненные 17.667 пакета / 271.007 мс при 300 кбит/с.

3. Пятнадцать сочетаний
speed | policy | offered/capacity | published/drop/partial | update fps | age P95 ms | control P95 ms | emergency ms | queue max/end | drain s | wasted bytes
300 | Непрерывные, без отбрасывания | 0.8607 | 63/0/0 | 2.986 | 593.333 | 17.466 | 1.707 | 22/15 | 0.231867 | 0
300 | По кадрам, без отбрасывания | 0.8821 | 63/0/0 | 2.986 | 590.000 | 17.466 | 1.707 | 21/13 | 0.199440 | 0
300 | По кадрам, 1500 мс | 0.8821 | 63/0/0 | 2.986 | 590.000 | 17.466 | 1.707 | 21/13 | 0.199440 | 0
300 | По кадрам, 1000 мс | 0.8821 | 63/0/0 | 2.986 | 590.000 | 17.466 | 1.707 | 21/13 | 0.199440 | 0
300 | По кадрам, 500 мс | 0.8821 | 63/0/0 | 2.986 | 590.000 | 17.466 | 1.707 | 21/13 | 0.199440 | 0
260 | Непрерывные, без отбрасывания | 0.9931 | 63/0/0 | 2.937 | 690.000 | 18.754 | 1.969 | 28/23 | 0.399200 | 0
260 | По кадрам, без отбрасывания | 1.0178 | 63/0/0 | 2.937 | 773.833 | 18.908 | 1.969 | 37/30 | 0.539293 | 0
260 | По кадрам, 1500 мс | 1.0178 | 63/0/0 | 2.937 | 773.833 | 18.908 | 1.969 | 37/30 | 0.539293 | 0
260 | По кадрам, 1000 мс | 1.0178 | 63/0/0 | 2.937 | 773.833 | 18.908 | 1.969 | 37/30 | 0.539293 | 0
260 | По кадрам, 500 мс | 1.0178 | 56/7/7 | 2.648 | 1053.833 | 18.908 | 1.969 | 31/24 | 0.403939 | 69597
230 | Непрерывные, без отбрасывания | 1.1227 | 63/0/0 | 2.697 | 2443.833 | 21.848 | 11.548 | 132/127 | 2.547420 | 0
230 | По кадрам, без отбрасывания | 1.1505 | 63/0/0 | 2.600 | 2913.333 | 22.500 | 22.330 | 160/155 | 3.125855 | 0
230 | По кадрам, 1500 мс | 1.1505 | 27/36/36 | 1.300 | 11064.833 | 22.461 | 22.330 | 87/81 | 1.418064 | 321929
230 | По кадрам, 1000 мс | 1.1505 | 14/49/49 | 0.674 | 11731.500 | 22.578 | 11.652 | 63/53 | 0.904881 | 434885
230 | По кадрам, 500 мс | 1.1505 | 3/60/60 | 0.144 | 11731.500 | 22.230 | 3.687 | 32/27 | 0.419072 | 532167

4. Практический смысл ограничений возраста
- При 300 кбит/с очередь обслуживается достаточно быстро: ограничения 500, 1000 и 1500 мс не срабатывают и не дают выигрыша.
- При 260 кбит/с пределы 1000 и 1500 мс также не срабатывают; предел 500 мс публикует 56 из 63 кадров и отбрасывает 7, поэтому он уже чрезмерно жёсткий для части кадров.
- При 230 кбит/с предел 1500 мс сохраняет 27 кадров, 1000 мс — 14, 500 мс — только 3; более строгий предел лучше ограничивает очередь, но резко уменьшает частоту обновления.
- В исследованной перегрузке 1500 мс является наиболее мягким из конечных ограничений; 1000 мс сильнее улучшает свежесть ценой обновлений, а 500 мс чрезмерно жёсток.

5. Интерпретация
- Произвольное удаление символа из непрерывного FEC-блока опасно: блок может содержать соседние кадры, и нехватка символов затрагивает их совместное декодирование.
- Выравнивание изолирует кадр в собственных блоках, поэтому все ожидающие символы устаревшего кадра можно удалить без повреждения соседей.
- Цена изоляции — 5.975 кбит/с дополнительного внешнего потока из-за большего числа неполных блоков.
- Полная доставка после освобождения очереди не является целью операторского видео: поздний полный кадр уже не описывает текущее состояние ровера.
- При перегрузке отбрасывание старого кадра освобождает ресурс для более свежего изображения и не затрагивает команды.
- При 230 кбит/с выравнивание меняет фазу активного видеопакета около 10,0 с; фактическая задержка аварийной команды может отличаться от Lab033, но отбрасывание её не увеличивает, а непереключаемая верхняя граница остаётся прежней, поскольку максимальный размер пакета не изменён.
- Слишком малый возраст может отменять кадры быстрее их полной передачи и снижать фактическую частоту обновления.
- Поэтому возраст изображения оценивается вместе с частотой обновления: хорошее значение одного показателя не гарантирует полезный видеопоток.
- Замена команд допустима только для текущего состояния (скорость, поворот, торможение, телеметрия). Дискретные события заменять нельзя; в Lab034 они не моделируются.

6. Допущения
- Один общий абстрактный ресурс, одна скорость для обоих направлений, без времени переключения и без выбора физического duplex/TDD/FDD.
- Ошибки и помехи отсутствуют; начатый пакет не прерывается; форматы Lab028, Lab030 и Lab033 неизменны.
- Возраст считается от формирования составного кадра по generation_time_us; служебные frame_id и состояние отмены не сериализуются.
- Видеокадр с удалёнными пакетами очищается в приёмнике и никогда не публикуется.
- Допустимые возраста 500, 1000 и 1500 мс заданы явно и автоматически не выбираются.

7. Функциональные проверки
- PASS 01_continuous_matches_lab033: PASS
- PASS 02_aligned_blocks_one_frame: PASS
- PASS 03_aligned_no_drop_recovers_all: PASS
- PASS 04_whole_frame_drop_isolated: PASS
- PASS 05_only_waiting_video_removed: PASS
- PASS 06_active_packet_not_preempted: PASS
- PASS 07_partial_cancel_not_published: PASS
- PASS 08_age_uses_frame_generation: PASS
- PASS 09_receiver_cleans_stale_state: PASS
- PASS 10_emergency_never_deleted: PASS
- PASS 11_high_priority_before_video: PASS
- PASS 12_230kbps_finite_age_bounds_queue: PASS
- PASS 13_packet_accounting: PASS
- PASS 14_byte_accounting: PASS
- PASS 15_all_crc_layers_pass: PASS
- PASS 16_incomplete_frame_never_published: PASS
- PASS 17_reproducible: PASS
- PASS 18_drop_does_not_worsen_emergency: PASS

8. Созданные файлы
- protocol/video_age_policy.py
- tests/lab034_stale_video_drop.py
- data/processed/lab034/lab034_summary.csv
- data/processed/lab034/lab034_video_metrics.csv
- data/processed/lab034/lab034_control_metrics.csv
- data/processed/lab034/lab034_report.txt
- data/processed/lab034/lab034_image_age.png
- data/processed/lab034/lab034_frame_outcomes.png
- data/processed/lab034/lab034_queue_size.png
- data/processed/lab034/lab034_control_delay.png
- data/processed/lab034/lab034_update_rate.png
- data/processed/lab034/lab034_fec_alignment_overhead.png
- data/processed/lab034/lab034_policy_comparison.png

9. Итоговый Git status
- Lab034 не добавлена в индекс и не закоммичена.

## main...origin/main [ahead 1]
?? data/processed/lab034/
?? protocol/video_age_policy.py
?? tests/lab034_stale_video_drop.py
