docs(perception): record host telemetry recovery and scoped inventory evidence

This commit is contained in:
DCCONSTRUCTIONS
2026-09-02 16:56:22 +03:00
parent 61cbdb30a0
commit 03e8e71bea
3 changed files with 172 additions and 8 deletions
@@ -2140,3 +2140,119 @@ adapter, внешний transport/recovery с отдельным availability bu
standalone packaging. Gap policy работает в enabled полном пилоте; это ещё не
product queue/registry/UI cutover. Этап 2 продолжается, этапы 3–4 не начаты;
physically-live scanner, управление ровером и actuation=false остаются за границей.
## Этап 2, инкремент 10 — реальные host observations и delayed-reply recovery
2026-09-02 16:52 МСК; код `61cbdb3`. Реализован общий `WorkerControlChannel` /
`WorkerControlPump`, подключённый к полному `PilotController`. Отдельный Windows
host adapter `collect_worker_host.ps1` читает GPU name/driver/clocks и Docker
image/configured limits/GPU-access inventory; он не управляет GPU, не останавливает
сервисы и не принимает команды из sensor payload. Временные setters/quiescence
остаются только в заранее разрешённом measurement harness с `finally` restore.
### Граница доверия и времени
Контейнер профиля не получает Docker socket или внешний listener. Requests и
responses смонтированы раздельно; responses read-only и недостижимы через writable
`/out`. Один pending request, nonce + activation digest + sequence, ответ ≤16 KiB.
Нет per-sample растущего журнала в common runtime. Host собирает новые факты после
challenge; timestamp наблюдения — начало запроса в Linux monotonic, не timestamp
Windows и не receipt time. Поздний ответ остаётся поздним. Source ingress не имеет
права обновлять readiness; local lease/config/warmup сообщает именно контроллер.
Host I/O не выполняется под lifecycle lock и не блокирует heartbeat thread.
Scope `docker-gpu-access` включён в sealed effective config. Это список Docker
контейнеров с GPU-access capability, а не доказательство фактической GPU-загрузки
или отсутствия native host/WSL процессов. Windows read-only probe снова показал
PID4/Insufficient Permissions. `host_process_inventory=unproved` сохраняется;
Docker scope не может удовлетворить `host-compute` envelope. Неполная inventory
или недоступная GPU telemetry не разрешаются режимом labelled-experiment.
Частично прочитанная inventory может доказать конфликт, но не его отсутствие.
Local lease приобретается до подключения monitor, monitor — до первого model
child. При telemetry lag на warmup дальнейший spawn ждёт, уже запущенные children
сохраняются; ещё не начавшаяся input epoch не отравляется. В RUNNING stale/unknown
означает WAIT/resync с сохранением resident graph и обязательным новым keyframe /
fresh sensors. Подтверждённый owner/image/container/competitor conflict остаётся
terminal. Сборщик не продлевает lease и не снимает sensor WAIT одним fresh reply.
У bounded pilot остаётся внешний wall-clock watchdog; production daemon не заявлен.
### Последовательные проверки Worker
Сначала read-only probe существующего Triton: реальные facts и другой GPU-capable
контейнер обнаружены, один response, ноль ошибок/мутаций. После исправления Windows
atomic update отдельный canary проверил три последовательных свежих ответа и
сохранил competitor evidence. Ни один такой canary не запускал AI/GPU-нагрузку.
| Full graph | Обработано / учтённые пропуски | p95 / p99 source-due → local receiver |
| --- | ---: | ---: |
| Normal, реальный host collector | 128 / 0 | 91.157 / 97.946 ms |
| Host reply delayed 2200 ms | 102 / 26 | 88.643 / 91.236 ms |
В обоих случаях прежний image, source pacing 1×, DDRNet/RF-DETR/geometry/TGS,
8 CPU / 8 GiB, временные штатные clocks SM2610/memory10251 MHz во время inference.
Full-source transfer/prepass, новый stride или ослабление freshness1s отсутствуют.
Это один bounded normal/gap pair, не overhead A/B или latency-regression acceptance.
Normal: 50 real observations / 0 collector errors, readiness без current/terminal
failures и без пауз. Exact raw parity 128/128 по BGR, segmentation, proposals,
observations, tracks, threats, range estimator, material, lineage/sensor binding
и raw costmap states. Исходные 52 sensor gaps не исчезли; all-modalities и
all-layers-fresh gates остаются false. Auto-clock FAIL не отменяется.
Gap: на запросе25 host после получения фактов задержал публикацию ответа на2200ms
(фактическое host ожидание2205.0704ms). Это fault injection только в измерительный
adapter, off by default. Два запроса истекли, control pump не продлевал старые
facts. Local heartbeat продолжил работу; runtime сделал одну pause/resume.
47 requests,44 accepted,2 expired и один pending при штатном shutdown; host
опубликовал46 ответов без ошибок. Один поздний ответ не принят за новый.
Последняя старая scene — seq23, новая — seq50:26 событий намеренно не догонялись.
Unaccounted=0, overload drops=0. Разрыв между receipt этих результатов2718.525ms;
от локального resume до первой полной fresh scene44.552ms. Это НЕ длительность
от Windows fault timestamp: разнородные monotonic domains не вычитались.
First scene имеет current DDRNet и fresh шесть слоёв, sensors available.
Четыре resident PID `[11,40,48,49]` и lease generation1 сохранены; stores
surface/history/components/rolling90/24/7/298 →0/0/0/0. Post-resume cells не старше
cutoff и не из будущего, track history не старше новой epoch, first motion unknown.
GPU/CPU phase непосредственно при telemetry expiry не записана — mid-CUDA
cancellation не объявляется измеренной. CUDA/child failures остаются terminal.
Peak input8,761,039bytes, VRAM≤2366MiB, container RAM≤3334MiB. После каждого
прогона input/children/threads освобождены и lease released. Модели/профили не
выполнялись параллельно; следующий запуск начинался после полного завершения.
### Сохранённые ошибки, cleanup и seal
Первая full-graph попытка закончилась на warmup после одного child, до DDRNet и
подачи кадров. В PowerShell5 вызов File.Replace с `$null` превращал backup path
в пустую строку; subsequent replies не публиковались. Изолированная проверка
подтвердила `NullString.Value` как рабочий true-null. Дополнительно startup adapter
ошибочно завершал run при StreamSuspended; исправлено ожидание без потери resident
children и без premature input pause. Original candidate/report/log сохранены,
последующие normal/gap измерены после исправления. Порог свежести не расширен.
Первый final-checker неверно спроецировал PowerShell JSON array как один service
object и сообщил «Manual-only service changed». Сохранённый raw snapshot уже
содержал правильные четыре running и две exited/restart=no записи. Исправлена
только enumeration проверки; никакого изменения сервиса для её прохождения нет.
Final read-only check: Triton ready200, четыре сервисa restored; прежние restart
loops не объявляются здоровыми. Ollama/Frigate exited/restart=no. Temporary model
containers, fixture lease volumes и host collector PIDs отсутствуют. Auto clocks
210/405MHz, P8,980MiB,0%, power limit450W; setters вернули auto. Mac8000=200,
8765 закрыт. Удалены только owned временные контейнеры/retired fixture volumes;
weights, recordings и всё evidence сохранены.
404 focused tests PASS (4.27s), одно прежнее Starlette/httpx предупреждение;
Ruff/format8 файлов PASS, mypy5 common modules PASS. Manifest475 artifacts:
`.runtime/perception-stage2-worker-control-20260902T1630MSK/manifest.json`, SHA-256
`aac125bd1b182d164c95d18089793fa54bf9797478bce1afe3de2a1d9093f6ef`.
363 Worker snapshot hashes и115 текущих source files сверены. Raw data вне Git;
manifest/analysis/проверки скопированы на Worker. На Mac нет model/load/full build.
**Следующий шаг этапа2:** внешний bounded data plane/auth и recovery через реальную
границу приложения–Worker (gRPC остаётся первым кандидатом), затем standalone
packaging. Host filesystem channel не выдаётся за внешний сетевой transport.
Native-host inventory, quality, physical-live и vehicle control остаются отдельными
непройденными границами; registry/UI не переключены, этапы3–4 не начаты.