docs(perception): record recoverable input policy and decoder continuity proof

This commit is contained in:
DCCONSTRUCTIONS
2026-09-02 15:33:53 +03:00
parent c31c46caa5
commit 03a7e730ae
3 changed files with 180 additions and 7 deletions
@@ -1936,3 +1936,99 @@ disabled. Optional primitive не засчитывается за готовый
125-ms PASS, auto-clock FAIL, 52 source gaps и quality limits не изменены.
Full-source transfer не возвращён, модели/пороги/TTL/CPU-GPU schedule прежние.
Этап 2 не закрыт, этапы 3–4 не начаты; registry/UI не переключены, actuation=false.
## 2026-09-02 15:30 МСК — этап 2, инкремент 8: resident runtime и восстановление входа
**Результат:** по уточнению владельца transient input/telemetry loss отделён от
аварии всего профиля. Новый явно включаемый common-runtime режим умеет ждать,
сохраняя local lease и процессы, затем принимать новую input epoch. При этом
полный DDRNet/RF-DETR/geometry/TGS pilot ещё не подключён к этому режиму;
нынешний результат — primitives + проверка настоящего CPU H.264 decoder.
Код `c31c46c`: `streaming_continuity.py`, lifecycle/readiness/ingress/scheduler,
decoder RPC reset, causal sensor-window reset и focused tests. Один resident
StreamStart/lease generation сохраняется; новая input epoch меняет только
входную идентичность и проверяется уже существующим wire v2. Исходный acquisition
session/generation не подменяется. Модели не получают новой startup-команды.
`recover_input=True` требует доверенный mapped source clock; с readiness нужен
`recoverable=True`. Эти параметры должны войти в effective configuration.
Исторические one-shot diagnostics сохраняют прежний default; включение флага
без настоящего reset/resume adapter не считается миграцией full profile.
### Пауза, свежесть и настоящая авария
- EOF без End, IPC deadline, обрыв соединения, source/sequence gap переводят
вход в waiting. Pending input удаляется; active borrowed buffers остаются
зарезервированы до возврата callback. Старые packets/results не пройдут gate.
Serial GPU stage умеет отбросить obsolete работу и продолжить ждать.
- Новая epoch ждёт завершения старого receiver и active/queued work. Decoder
сбрасывает codec/DTS references внутри прежнего PID; causal sensor window
очищает историю, сохраняя фиксированный memory budget. Возобновление требует
fresh decoded keyframe, pose/points не старее reconnect cutoff и успешного
temporal reset; evidence повторно проверяется после reset. Возникшая в это
время новая пауза не может быть затёрта окончанием старого reset.
- Временная потеря/неполнота GPU facts или strict performance envelope вызывает
ожидание, не освобождение ownership. Fresh telemetry сама не возобновляет
старую epoch. Worker-local lease renewals независимы от GCS/входной сети.
- Подтверждённый wrong owner/generation/image/config/worker, competing GPU client,
нарушенный trusted clock contract, настоящая утрата local lease, child/decoder
failure и cancel остаются terminal. Отсутствие данных от K1 само по себе ещё
не доказывает смерть сканера. Управление ровером и его onboard stop/hold,
stale-command rejection и resume policy здесь не реализованы.
### Worker CPU-only proof
Session `perception-stage2-continuity-worker-20260902T1518MSK`, фактический запуск
12:18:37 UTC / 15:18:37 МСК. Один временный `ndc-perception-continuity-cpu-probe`:
прежний pinned image, runc, network none, read-only code, 2 CPU / 768 MiB,
pids64, tmpfs256MiB, **без GPU devices и моделей**. Существующие PyAV18/NumPy
подключены read-only; model assets не монтируются, образ не пересобирается.
Прочитана одна ограниченная строка camera index, init и один существующий H.264
fragment. Он декодируется три раза, каждый раз с новым синтетическим current
timestamp и synthetic pose/одной точкой. Source counter тикает через каждые
50 ms независимо от входной связи. Это не полный replay реальной записи,
не DDRNet inference, не настоящий JointGraph temporal/TGS reset и не TCP тест.
| Проверка | Фактический результат |
| --- | --- |
| Input epochs | 3, lease generation 1 сохранена |
| Обрывы IPC | 150 ms и 2.2 s, оба waiting → resync |
| Source ticks во время обрыва | 3 и 44; никакой догоняющей очереди |
| Resident процессы | PID 10/11 неизменны: CPU sentinel и настоящий decoder |
| Decoded BGR | 3/3 одинаковы, SHA-256 `051a6087d897b91b63163975d92b78501cdd98b4c227f7683f05946cd434da37` |
| Local heartbeat | 54 renewals; пауза 2.2 s длиннее lease TTL 2 s не убила профиль |
| Peak input / final input | 5,275,461 / 0 bytes |
| Завершение | Explicit End; children=0, lease released, temporary container removed |
Тесты отдельно проверяют повторные EOF/idle/incomplete/gap циклы, ограничение
числа threads, stale input/result, pause during reset, reset failure, soft
telemetry recovery, hard conflict и настоящий lease expiry. 375 focused tests
PASS (4.15 s), Ruff/format 14 changed files PASS, mypy 7 modules PASS. Только
прежнее Starlette/httpx предупреждение. Нет моделей/load/full build на Mac;
canonical 8000=200, 8765 закрыт.
Worker before/after: service IDs/StartedAt/restart counts совпали, Triton ready
200, Ollama/Frigate exited/restart=no. GPU P8, 0%, 210/405 MHz, power limit450 W,
980→985 MiB. Это read-only preservation snapshots, не continuous collector и
не доказательство exclusive GPU readiness. У трёх legacy agents уже были
restart counts43/4/5; их известная проблема не исправлялась и не скрывается.
Настройки services/clocks/quotas не менялись, старые evidence/recordings/weights
сохранены. Удалены только временные CPU container и fixture lease directory.
Evidence `.runtime/perception-stage2-continuity-worker-20260902T1518MSK/manifest.json`:
85 artifacts, SHA-256
`fbd327d129c88caa13b7183b1ae2c4767e877a6f5472c0f430875cfd7401ed46`.
73 code hashes сверены между preregistered snapshot, Worker и текущим commit.
Сохранены исходный manifest, commands, report, before/after/cleanup, analysis,
dependency evidence hashes; sealed manifest/analysis скопированы на Worker.
**Далее в том же этапе 2:** перевести полный PilotController/BinaryGraphBridge
и output consumer на pause/resume, реализовать действительный reset tracking,
motion, rolling geometry/TGS/costmap и провести последовательный full-graph
fault probe с сохранением модельных PID. Затем настоящий trusted collector,
control/network boundary и самостоятельная упаковка. Старый terminal-readiness
TARGET предыдущего инкремента уточнён, но его историческое evidence не переписано.
GPU latency заново не измерялась: conditional PASS / auto-clock FAIL и source
gaps остаются прежними. Этап 2 не закрыт; этапы 3–4 не начаты, actuation=false.