docs(perception): record host telemetry recovery and scoped inventory evidence
This commit is contained in:
@@ -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; этапы3–4 не начаты.
|
||||
Дата: 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; этапы3–4 не начаты.
|
||||
|
||||
Последний код `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 не начаты.
|
||||
|
||||
Reference in New Issue
Block a user