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
@@ -1,8 +1,8 @@
# Observatory: четыре этапа создания полного real-time Perception-профиля
Дата: 2026-09-01; обновлено 2026-09-02 15:56 МСК. **Этап 1 закрыт; этап 2 в работе. Девятый инкремент: pause/resume подключён к полному GPU-пилоту.** Реальные surface/tracking/motion/rolling stores и DDRNet cache сбрасываются без перезапуска моделей. Два normal/gap сравнения: обычный проход exact raw128/128, после обрывов150ms/2.2s восстановление на seq30/110 с теми же четырьмя PID. Первая свежая сцена через ~1.48/3.86s от начала обрыва: требуется keyframe и согласованные сенсоры. Это Worker-local recording/IPC proof, не внешний network/physical-live. Далее trusted collector/control plane, transport/recovery qualification и standalone packaging; этапы34 не начаты.
Дата: 2026-09-01; обновлено 2026-09-02 16:52 МСК. **Этап 1 закрыт; этап 2 в работе. Десятый инкремент: реальные host GPU/Docker observations подключены к полному профилю.** Одноразовые запросы, separate read-only reply mount, локальное время запроса вместо времени прибытия ответа. Docker inventory scope задан явно; native host/WSL process coverage не доказан. Задержка ответа на2.2s вызвала WAIT/resync без перезапуска четырёх resident-процессов. Далее внешний data-plane/auth/recovery и standalone packaging; этапы34 не начаты.
Последний код `70927ea`; 383 focused tests PASS, Ruff/format/mypy PASS. Final normal p95/p99 85.775/89.385ms; gap accepted-frame p95/p99 83.163/89.729ms — только при временных штатных clocks2610/10251MHz. В gap-run76 обработанных +52 намеренно не воспроизведённых кадра, unaccounted=0; доступность потока не объявляется полной. После resume нет старых costmap timestamps/track history, первые scenes fresh. CPU normal BGR/sensors exact128/128. Auto clocks и четыре Worker services восстановлены, temporary containers/leases удалены. Прежние52 исходных sensor gaps обычного прохода и auto-clock FAIL сохраняются. Product batch/registry/UI, continuous GPU collector и standalone image ещё не готовы.
Последний код `61cbdb3`; 404 focused tests PASS, Ruff/format/mypy PASS. Normal exact raw128/128, 50 real observations, p95/p99 91.157/97.946ms. При задержке host reply:102 обработанных +26 учтённых пропусков, resume seq50, прежние PID/lease сохранены; p95/p99 принятых кадров88.643/91.236ms. Между последней старой и первой свежей scene2.719s — отдельная метрика доступности. Оба измерения условны для временных штатных clocks2610/10251MHz, не доказывают overhead regression или общий real-time. Auto clocks/services восстановлены, временные collector/container/lease отсутствуют. Исходные sensor gaps, auto-clock FAIL, непроверенные native-host inventory, network и standalone остаются.
Текущий evidence: [отчёт этапа 1](../experiments/perception/PERCEPTION_STREAM_STAGE1_2026-09-01.md), [ADR 0049](adr/0049-stream-first-perception-profiles.md), [candidate manifest](../config/perception/k1-perception-ddrnet39-rfdetr-tgs-prototype-v1.json). Запрет full-source preload закреплён в новом контракте; старый batch materializer пока не удалён и продуктовый путь не переключён.
@@ -143,7 +143,7 @@ IPC/сети, копирований и оркестрации. Вычислит
## Этап 2 — Самостоятельный Docker с полным потоковым вычислением
**Текущий статус, 15:56 МСК:** в работе. `--recover-input` подключён к полному PilotController/BinaryGraphBridge/collector. Source clock продолжает1×; новый keyframe и causal sensors открывают новую epoch, реальные temporal stores очищаются, старые callbacks/results отбрасываются. Дважды проверены full normal/faulted graph. Обрывы инъецированы между GPU-вызовами; mid-compute discard проверен focused tests, не новой real-GPU cancellation пробой. До первой свежей сцены1.48/3.86s; это отдельная метрика от accepted-frame latency. Далее trusted collector/control plane, внешний transport/recovery и standalone packaging. GO на этап3 пока нет.
**Текущий статус, 16:52 МСК:** в работе. Полный pilot получает реальные GPU clocks/driver, Docker image/limits и bounded inventory через отдельный host controller. В контейнере нет Docker socket; response mount read-only и вне writable outputs. Effective config связывает mode/envelope/inventory scope. Пропавшие/задержавшиеся факты не возобновляют local lease и не выгружают модели; подтверждённый конфликт остаётся terminal. Normal и delayed-reply full graph проверены, raw parity сохранена; далее внешний transport/auth/recovery с отдельным availability budget и standalone packaging. GO на этап3 пока нет.
**Цель:** один самостоятельный контейнер принимает поток и реально рассчитывает DDRNet, детекции, расстояния, motion, TGS/costmap и policy-shadow; ничего не дорисовывается из старых LAB.
@@ -300,6 +300,8 @@ EoMT — семейство ViT-моделей сегментации изобр
## Decision log
- 2026-09-02 16:52 МСК: `61cbdb3`, real Worker host-control increment. 404 tests; normal128/128 exact raw, 50 observations без ошибок; delayed reply2200ms → два expired requests, WAIT, resume seq50 с прежними PID/lease и очищенными stores.102 completed+26 intentional skips; no backlog/unaccounted. Scope `docker-gpu-access` не равен `host-compute`: Windows PID4/Insufficient Permissions не скрывается как доказанная host-wide эксклюзивность. Read-only canary проверил3 последовательных обновления и существующего GPU-capable конкурента. Первый warmup abort из-за PowerShell `$null`/File.Replace и неправильной startup WAIT трактовки сохранён; обе причины исправлены, freshness1s не расширена. Manifest475 artifacts,363 Worker source hashes/115 current files, SHA-256 `aac125bd1b182d164c95d18089793fa54bf9797478bce1afe3de2a1d9093f6ef`, `.runtime/perception-stage2-worker-control-20260902T1630MSK/manifest.json`. Host collector не меняет clocks/limits/services; временные setters применяет только разрешённый measurement harness с восстановлением.
- 2026-09-02, уточнение владельца: временная потеря входной сети/потока не завершает resident AI-профиль. Отдельно сохраняем local Worker lease, ждём свежий поток без backlog и заново синхронизируем temporal state. Unknown/stale GPU telemetry — не доказательство чужого владельца; подтверждённый конфликт/авария остаются terminal. Автоматическое восстановление inference не означает разрешение возобновить физическое движение.
- 2026-09-01, решение владельца: EoMT и DDRNet не считаются вместе на Worker 006. Первоначальная трактовка «никаких двух моделей внутри профиля» отменена последующим уточнением: RF-DETR и DDRNet нужны внутри одного полного профиля; запрет сохраняется для альтернативных профилей и EoMT+DDRNet.
- 2026-09-01, решение владельца: один дрон — один Worker; текущий baseline RTX 4090. Следствие: worker-scoped exclusivity, без GPU-multiplexing и без зависимости от покупки hardware.
@@ -326,6 +328,6 @@ EoMT — семейство ViT-моделей сегментации изобр
## Outcomes / retrospective
Этап 1 завершён; этап 2 продолжается. Full GPU pause/resume проверен: четыре resident-процесса сохранены, CPU temporal stores сброшены, post-resume history/cells только из новой epoch. No-gap raw parity exact128/128, четыре последовательных GPU-прогона, 383 focused tests. Recovery availability и intentional losses отделены от accepted-frame latency; fixed-clock PASS не отменяет auto-clock FAIL. Следом trusted collector/control plane, внешний transport/recovery и standalone packaging. Batch/registry/UI не переключены, этапы3–4 не начаты, actuation=false. Mac8000=200,8765 закрыт; auto clocks и четыре Worker services восстановлены, Ollama/Frigate exited/restart=no.
Этап 1 завершён; этап 2 продолжается. Реальный scoped host collector/control adapter подключён к полному профилю. Normal exact raw128/128, задержка reply2.2s → WAIT/resync с теми же четырьмя PID,26 пропусков без backlog/старой истории,404 focused tests. Сохранены исправленный warmup abort и независимые показатели доступности/accepted-frame latency. Следом внешний data-plane/auth/recovery, затем standalone packaging. Native-host GPU inventory не квалифицирован; Docker scope не выдаётся за полный host audit. Batch/registry/UI и этапы3–4 не начаты, actuation=false. Mac8000=200,8765 закрыт; auto clocks и четыре Worker services восстановлены, Ollama/Frigate exited/restart=no, временных collectors/container/lease нет.
После этапа 4 здесь будут перечислены digest самостоятельного полного образа, измеренные статусы и ошибки по recordings, реально проверенные source/hardware/config комбинации, состояние сохранённого EoMT-варианта и оставшиеся physical-live/quality/vehicle-integration ограничения. Готовый Docker и готовая автономия не отождествляются.
@@ -1,9 +1,9 @@
# ADR 0049 — Stream-first full perception profiles
Date: 2026-09-01; updated 2026-09-02 15:56 MSK. Status: stage-1 engineering
baseline complete; stage-2 full binary GPU pilot now supports input recovery.
Production collector, external transport, standalone image and product cutover
remain open; local recording/IPC proof is not physical-live acceptance.
Date: 2026-09-01; updated 2026-09-02 16:52 MSK. Status: stage-1 engineering
baseline complete; stage-2 full binary GPU pilot consumes real scoped host facts.
External transport/authentication, native-host GPU inventory, standalone image
and product cutover remain open; local proof is not physical-live acceptance.
Execution order remains the four stages in
[the ExecPlan](../OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md).
@@ -54,6 +54,52 @@ local server are made by this ADR or the stage-1 validators.
## Versioned handshake and observations
### Current host observation adapter (2026-09-02 16:52, `61cbdb3`)
`WorkerControlChannel` / `WorkerControlPump` supply the common readiness monitor
with actual GPU name/driver/clocks and Docker image/configured resource limits /
GPU-access inventory from `collect_worker_host.ps1` on the trusted Windows host.
Only the host collector executes fixed read-only Docker/NVIDIA queries. The AI
container has no Docker socket, host setters or network access. Request and reply
directories are separate; the reply mount must be read-only and cannot also be
reachable through the writable output mount. This local filesystem authority is
NOT authentication for external sensor/GCS traffic.
One pending random nonce, activation digest, sequence and a16KiB reply bound
prevent history/queue growth. The collector reads facts AFTER receiving that
challenge. Observation time is the local Linux request-start monotonic value,
not the reply receipt or Windows timestamp. Delayed replies stay old; missing,
malformed or different-nonce replies cannot refresh readiness. A known matching
reply with changed container/image/owner or competitors fences execution.
Owner, effective config and warmup remain local-controller facts, never accepted
from the sensor stream or inferred from utilization. The pump does not renew the
lease; its I/O runs outside lifecycle locks and the heartbeat thread.
Scope is part of the sealed effective configuration: `docker-gpu-access` means
observed Docker GPU-capable containers, NOT all native host/WSL GPU processes.
It cannot satisfy an envelope requiring `host-compute`. Windows reports PID4 /
Insufficient Permissions; native host coverage stays explicitly unproved.
Incomplete inventory or unavailable GPU telemetry cannot be waived even by
`labelled-experiment`; measured low clocks can be logged as overload conditions.
Bootstrap acquires the local lease and attaches readiness before spawning any
model. Warmup telemetry lag blocks further startup without destroying already
loaded children or invalidating an input epoch that has not started. Active
stream lag pauses input, keeps models and local lease, then requires the existing
fresh-keyframe/sensor resynchronization and temporal reset. The bounded pilot's
outer watchdog remains; this is not yet a durable production controller.
Measured normal graph:128/128 exact raw outputs,50 real observations, p95/p99
91.157/97.946ms. Delaying a host reply2200ms:102 completed,26 intentional omissions,
two expired requests, same four resident PIDs/lease; resume seq50, old temporal
stores/cells absent, first scene fresh. Result receipt gap2.719s is NOT latency
from the Windows fault start (clock domains are not subtracted). Both trials
use the temporary authorized stock-clock envelope, not general qualification.
404 focused tests; evidence SHA-256
`aac125bd1b182d164c95d18089793fa54bf9797478bce1afe3de2a1d9093f6ef`.
The first warmup abort and Windows atomic-replacement correction are retained
in the experiment journal. Historical readiness notes below retain their dates.
`missioncore.perception-stream-start/v1` is represented by `StreamStart` in
`src/k1link/perception/realtime_contract.py`. It contains run/source/worker/epoch,
lease generation, profile/image/effective-config/calibration identities, clock
@@ -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 не начаты.