diff --git a/docs/OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md b/docs/OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md index 71a545d..1893fc7 100644 --- a/docs/OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md +++ b/docs/OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md @@ -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 и готовая автономия не отождествляются. diff --git a/docs/adr/0049-stream-first-perception-profiles.md b/docs/adr/0049-stream-first-perception-profiles.md index 3f69ee8..4005177 100644 --- a/docs/adr/0049-stream-first-perception-profiles.md +++ b/docs/adr/0049-stream-first-perception-profiles.md @@ -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 diff --git a/experiments/perception/PERCEPTION_STREAM_STAGE1_2026-09-01.md b/experiments/perception/PERCEPTION_STREAM_STAGE1_2026-09-01.md index fc2a7d8..aa5b344 100644 --- a/experiments/perception/PERCEPTION_STREAM_STAGE1_2026-09-01.md +++ b/experiments/perception/PERCEPTION_STREAM_STAGE1_2026-09-01.md @@ -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 не начаты.