Files
NODEDC_MISSION_CORE/docs/audits/2026-09-05-ai-inference-architecture.md

55 KiB
Raw Permalink Blame History

AI Inference — принципы работы и фактическая архитектура

Срез на 5 сентября 2026 года. Репозиторий MISSION CORE, ветка main, исходный код аудита e56eb42507d005cc372ac4a53785a080b116e227. Изменения этого среза: терминология интерфейса и фиксация архитектуры. Исполнитель, модели, очередь, Rerun и способы обмена данными не рефакторились.

01. Решение и границы закрытия

AI Inference — текущий лабораторный путь применения выбранной AI-конфигурации к сохранённой физической записи и просмотра сохранённых доказательств. Раздел находится в LAB приложения Mission Core. Название «Обсерватория» больше не используется в текущем пользовательском интерфейсе. Технические observatory в URL, схемах, именах Python/TypeScript, Docker labels и старых evidence сохраняются для совместимости.

По решению владельца этот этап временно зафиксирован. Завершены архитектурный срез и консолидация контекста; пользовательская приёмка ещё не завершена. Это не статус production-ready, не доказательство real-time и не разрешение на управление транспортом. Поля actuation_allowed, commands_enabled, navigation_or_safety_accepted, production_accepted у действующих portable definitions имеют значение false.

Новые эксперименты строятся через этот путь. Старые LAB V1/M4.x и их приложения не становятся основой новых пользовательских поверхностей. Их результаты, код квалификации и происхождение алгоритмов сохраняются как история. Использование действующего TGS executor, выросшего из M4.9, не требует возвращать старый интерфейс лаборатории.

Worker выключен. В этом аудите его не включали, Docker daemon на нём не опрашивали, ничего не устанавливали и не запускали. Факты разделены на код и текущую конфигурацию Core, локальный сохранённый каталог/журнал, исторические измерения и непроверенные возможности.

02. Что является источником правды

Для текущей реализации первичны config/observatory-ai-modules.json, config/observatory-portable-run-definitions.json, config/observatory-worker-runtime-candidates.json, config/observatory-domain-ontology.json и соответствующие исполнители в src/k1link/observatory/. Наличие записи executor.state=ready означает сохранённую регистрацию executor identity, а не работающую сейчас машину.

Машинный срез: 2026-09-05-ai-inference-evidence.json. В нём сохранены каталожные identities, ресурсные профили, текущая композиция и отобранные поля локальных jobs. Снимок не содержит ключей доступа, исходного видео, облаков, весов моделей и полных runtime-логов.

Связанные решения: ADR 0051, история маршрута, handoff 3 сентября, runbook Worker. Старые слова CURRENT/«следующий шаг» в исторических отчётах не являются новыми поручениями и не отменяют этот срез.

Ops MISSION CORE: #75 «AI Inference · Принципы работы и архитектура» (e5768b6c-0817-4e9e-a786-f9167586c7dc) с полным содержанием этого отчёта; #73 — история перехода к модульным профилям; #74 — подробный реестр кастомизации Rerun; #66 — канон Rerun; #9 — история AI Worker; #65 — историческая LAB V1. Новая карта не стирает свидетельства ошибок в старых картах. Статус Done у #75 означает завершение документирования среза; открытые пункты пользовательской/target-приёмки перечислены в checker и ниже.

03. Основные сущности и их владельцы

Сущность Значение и владелец
Физическая сессия Запись оборудования: видео, LiDAR, pose/trajectory, временные шкалы, калибровка и provenance. Каталог сессий Core; не результат AI.
Версия модуля Модель либо связанная алгоритмическая функция с точными image/code/model/contract identities, входами и выходами. Реестр модулей и sealed package.
CompositionSpec Неизменяемый проверенный набор версий, параметров, зависимостей и execution policy; не привязан к одной конкретной записи.
LAB / composition run Применение композиции к точному source snapshot; связывает состав, member jobs и опубликованные результаты.
Recorded job / attempt / lease Единица выдачи работы и её конкретное владение исполнителем. Durable очередь Core, claim token и generation fencing.
Portable result Неизменяемые артефакты и метаданные доказательства, identities, покрытие и authority. Публикуются на Core.
LAB display profile Изменяемое оформление просмотра, отдельно от расчётной конфигурации и raw evidence. Хранится на Core по result_id.
Viewer session Временное положение камеры, FOLLOW, включённые слои и пропорции окон. Не следует отождествлять с сохранением всего LAB profile.
Worker / installed executor Доверенный исполнитель, которому разрешены конкретные версии packages и ресурсы. Не произвольная удалённая shell-машина из UI.

Изменение цвета или размера точек не пересчитывает модель. Переименование отображаемой LAB не меняет immutable composition/result identity. Удаление из пользовательского каталога не следует трактовать как переписывание доказательства или автоматический Docker prune.

04. Пользовательский путь

Оператор выбирает сохранённую сессию. Core сообщает доступные каналы и применимость setup. Кнопка «Сконфигурировать AI-слой» открывает выбор по функциональным группам. UI получает каталог с сервера; он не извлекает возможности из свободного названия LAB.

Выбранные модули проходят проверку зависимостей и совместимости источника. Сохраняется точная композиция. Core создаёт либо использует уже существующие подходящие member jobs/results, показывает их совместный статус, а после публикации открывает связанный визуальный разбор. Повторный просмотр готовой LAB не должен запускать inference.

Название строки состоит из реальных конфигурационных значений. Название исходной сессии в строках списка не дублируется; в заголовке открытого результата сохраняется полный контекст. Дата и время расчёта, сортировка по времени, просмотр, переименование и удаление доступны в каталоге. Прогресс относится к активной обработке; готовая строка не должна навсегда оставаться шкалой 100%.

Глобальный смысл состояний: инициализация → передача на сервер → расчёт. Внутри расчёта могут быть подготовка камеры/LiDAR, загрузка модели, собственно inference и сборка результата. Эти подэтапы должны называться по фактической операции. Процент очереди/пакета нельзя интерпретировать как долю кадров модели или обещание точного ETA.

05. Каталог модулей и зависимости

Модуль Входы → выходы Текущее назначение
camera-source source.camera → camera.frames Служебная подготовка камеры, добавляется зависимостью. Не отдельный пользовательский эксперимент.
DDRNet-39 · GOOSE camera.frames → segmentation.mask Семантическая сегментация выбранной версией DDRNet.
EoMT Large · Cityscapes camera.frames → segmentation.mask Альтернативный провайдер сегментации.
RF-DETR Large camera.frames → detections.2d Детекция объектов; текущий package содержит TensorRT engine.
Дистанция до объектов detections.2d + source.calibration + source.lidar + source.pose → objects.ranged Сопоставление детекций с калиброванными LiDAR/pose; собственных обученных весов нет.
TRAVEL TGS source.calibration + source.lidar + source.pose → geometry.costmap + geometry.ground Геометрическая обработка, ground/costmap; без отдельной ML-модели.

В новой композиции допускается не более одного провайдера в группе. DDRNet и EoMT — альтернативы, не два одновременно выбранных segmentation provider. Зависимости включаются детерминированно; range требует RF-DETR. Циклы, неоднозначные провайдеры и пустой недопустимый граф отвергаются.

Группы motion и policy присутствуют в модели каталога, но в текущем реестре пусты. Это не доказательство установленных модулей движения или управления. Полный исторический perception prototype имел более широкий состав; его нельзя автоматически приписать текущему UI.

Разрешённые параметры расчёта ограничены версией модуля: у текущих stateless AI modules cadence допускает 1; у TGS causal history-seconds допускает 1 и действует reset-at-source-start. Это вычислительные контракты. Пользовательский slider накопления SLAM 0–500 секунд относится к отображению и не увеличивает расчётную историю TGS.

06. Граф: декларация и реальное исполнение

modular_composition.py проверяет capabilities, identities, параметры и топологический порядок. modular_composition_store.py сохраняет неизменяемую спецификацию. Execution policy текущих композиций: recorded-observation-only, max_parallel_nodes=1. composition_runs.py связывает source, composition и результаты запуска.

Важная граница реализации: web/modular_observatory_api.py переводит известный набор модулей в заранее поддержанные setup IDs. Это работающий ограниченный композитор, но ещё не универсальный runtime, который исполняет произвольный DAG из любого числа новых Docker-узлов под одной lease.

Текущие AI setup IDs: ai-segmentation-ddrnet-v1, ai-segmentation-eomt-v1, ai-detection-rf-detr-v1, ai-range-object-distance-v1; геометрия — m49-tgs-portable-v2. Когда выбран range, отдельный standalone RF-DETR job не создаётся: RF-DETR выполняется внутри range package. Поэтому полная выбранная конфигурация DDRNet + RF-DETR + range + TGS даёт три member jobs, а не четыре.

Подходящий ранее созданный non-failed job может быть использован снова; опубликованный member result связывается с новой композиционной проекцией. Точная повторная отправка композиции с существующей допустимой работой не должна размножать расчёты; конфликт сообщает API. Failed execution допускает повторную попытку по действующему маршруту.

Очередь отдельного job durable. Создание группы member jobs и запись composition-run projection не являются одной общей SQL-транзакцией универсального DAG. Нельзя обещать атомарность всей композиции на основании транзакционности очереди. Полноценное расширение scheduler и его аварийная приёмка остаются отдельной работой.

07. Схема коммуникации

flowchart LR
  UI[Web UI: AI Inference] -->|same-origin HTTP| Core[Mission Core API :8000]
  Core --> Catalog[Sessions / composition / ontology projection]
  Core --> Queue[Durable recorded queue]
  Worker[Installed Worker agent] -->|claim / renew / progress / terminal| Core
  Core -->|verified source package| Worker
  Worker -->|local Docker API| Steps[Sequential compute containers]
  Steps -->|sealed output| Worker
  Worker -->|manifest + verified member uploads| Core
  Core --> Publish[Publication / artifact store / result catalogue]
  Publish -->|base + overlay + profile| Viewer[Official Rerun in Web UI]

Браузер обращается к Core, не управляет Docker и не соединяется напрямую с Worker. Worker забирает работу у Core по HTTP pull-протоколу. Нынешний recorded-путь не отправляет каждый кадр через отдельный браузерный запрос или gRPC-поток: исходный пакет передаётся, вычислительные шаги работают с локальными входами, выход затем публикуется обратно.

Live telemetry оборудования — отдельный контур. Telegraf → MQTT → normalizer → Timescale → Core/System не заменяет HTTP job protocol. Свежая телеметрия не доказывает успешную публикацию LAB, а сохранённая LAB остаётся читаемой без работающего Worker.

08. Адресация, туннель и доверие

Файлы: worker_http_transport.py, worker_tunnel_launchd.py, worker_container_proxy.py, worker_agent.py. Текущий Core слушает локально 127.0.0.1:8000. На Mac управляется SSH reverse tunnel через alias mission-gpu: -R 127.0.0.1:18080:127.0.0.1:8000, с BatchMode, ExitOnForwardFailure и keepalive.

Внутри agent container клиент обращается к loopback proxy :18080. Proxy направляет запросы на host.docker.internal:18080; на Windows host это loopback endpoint SSH-туннеля к Core. Следовательно, loopback HTTP защищён транспортом SSH на межмашинном участке. Здесь нет утверждения о публичном HTTP-порту Worker без защиты.

Transport принимает HTTPS либо HTTP только для loopback, передаёт Bearer auth и contour identity. Текущее исполнение привязано к worker-006. Два HTTP connection slots оставляют возможность служебного обмена при передаче пакета. Ключи, значения credentials и файлы с ними намеренно не входят в карту.

Это конкретная топология Mac Core ↔ Windows/Docker Desktop Worker. Наличие протокола не означает, что имя другого компьютера можно просто подставить в UI. Linux host networking и host.docker.internal, доверие SSH, токен, contour binding и установленный release потребуют согласованной адаптации. Реализация регистрации нового Worker в этот этап не входит.

09. Lease, очередь и восстановление

Worker вызывает /api/v1/worker/observatory/recorded-jobs/claims с claim schema v3 и перечнем поддержанных executor identities. При отсутствии работы получает 204. Затем идут start, lease renew, progress и terminal; upload result package имеет отдельные plan/member/complete операции.

Core сверяет source/definition/executor/resource/result contracts. Claim token и generation защищают от публикации запоздалым исполнителем. UI не может передать произвольный image, shell command, mount или network target через job. Вычислитель получает выбранный установленный package.

Ресурсные профили текущего Worker закрепляют последовательную работу на NVIDIA RTX 4090 и concurrency=1. Это не доказательство параллельного исполнения всех модулей. Политика допускает преимущество live-работы над recorded; текущие тяжёлые recorded jobs non-checkpointable. После вытеснения/ошибки до sealed результата нельзя обещать продолжение ровно с последнего кадра.

Worker имеет ограниченное восстановление транспортных ошибок и heartbeat; Core хранит durable job/publication state. Если вычисление завершено и результат запечатан, повтор публикации не должен повторять inference. Если результат ещё не запечатан, повторный запуск может начать обработку заново. История failed attempts сохраняется, а не становится фиктивным успехом при появлении следующего успешного результата.

10. Docker: что действительно упаковано

Нужно различать agent image, compute module image, installed package и реально запущенный контейнер. Agent опрашивает Core и управляет этапами. Compute container выполняет ограниченный шаг. Package закрепляет последовательность, изображения, assets, команды и contracts. Контейнерный ID — конкретный экземпляр на машине; его текущего значения этот offline-аудит не устанавливает.

Dockerfiles находятся в experiments/perception/worker/observatory_portable/: Dockerfile.ai-module-camera-source, Dockerfile.ai-module-ddrnet, Dockerfile.ai-module-eomt, Dockerfile.ai-module-rf-detr, Dockerfile.ai-module-object-distance, файлы installed-lab worker agent и специализированного M4.9 executor. Builder: scripts/build_modular_ai_worker_release.py. Исполнение: installed_lab_packages.py, installed_lab_package_runner.py, modular_installed_package_steps.py, installed worker service/container main; для TGS — m49_worker_service.py и соответствующий main.

Модульность сейчас прежде всего логическая и контрактная. Camera-source использует private base ndc/mission-core-installed-lab-v1-eomt-step:ee0efdd9af72; DDRNet — ndc/mission-core-installed-lab-v1-ddrnet-step:439127908dba; RF-DETR и object-distance опираются на ndc-k1-perception-ddrnet39-rfdetr-tgs:stage1-joint-20260901. Поэтому нельзя описывать каждый модуль как уже минимальный полностью независимый образ без наследованных окружений.

Некоторые FROM закреплены tag, хотя установленный release и готовые images проверяются по SHA. Для воспроизводимой чистой пересборки нужны именно соответствующие private bases, внешние assets и версии инструментов; один текст Dockerfile без них недостаточен. Отдельные conda/Python/model environments внутри compute stages остаются частью переносимого комплекта.

ModuleSpec.docker_name и ownership labels задают идентичность/наименование, а не доказывают наличие отдельного постоянно работающего сервиса на каждый модуль. В частности, TRAVEL TGS в текущем пути использует квалифицированный специализированный executor. Старые контейнеры LAB V1/других исследований не удалялись этой фиксацией.

11. Зафиксированные образы, модели и releases

SHA ниже взяты из текущих versioned registries; это конфигурационный срез, не сегодняшняя команда docker inspect на выключенном Worker.

Модуль Compute image SHA-256
camera-source da926459aee0a841bbdfaf80a0eb5fbead354c56794d1f3384eeba66d0a49e00
DDRNet 489fc7d1157fd0f1cd1d82e06a15737b7b2aaaf72b2ddb2aca2992b91a97488e
EoMT 5b770178e4a5c8fbe8f8ddab3b83a598973dbe103b669851110b11a0918ab846
RF-DETR 2b8b44be8e9ee4060aa6997fc4c025ad7120f37ecd720a9e59b5e02ac6c90f66
object-distance 69d68f64981b41e5bcce1e642433e3d466b88c51942a5ba3aec9180d8ed04263
TRAVEL TGS f9278ab21aa65045be993dd19bffc25f49955e19598893ac78cc4761ca63ecf3

Веса DDRNet: b99c2838051bcd7b092fd3970aa62a77d5c0bbb809c9b9afb2ff4b0ebdaa4ee6. EoMT weights: c265da9a74f58f5c3f4826d23ca4ca78beac0b106cca5842beca61580de5b782. RF-DETR TensorRT engine: b8a40b3580edff001ec9680de68707242294ff590ab296000fae371f1083f695. TensorRT engine не следует считать универсальным переносимым checkpoint для любого GPU/runtime.

У четырёх новых AI setup текущий executor image SHA 7a1d425b4678dcade7d7d6ffd14733d639a4df29f45e1759ba4c512e930da8ab, release ID ai-modular-installed-package-v1, release SHA 97bfe743689766285b22627c4020d10df7949ef1f4546ef904dccb9ca4c6f721. Все привязаны к worker-006.

TGS definition v3 использует image f9278ab2…, release m49-tgs-portable-executor-v1, release SHA c5b0670d943fe0452ef4bbfbc144ab2439a1a674f9ef164798ad9f8b1ecc29fa. Старая совместная LAB V1 definition v2 с executor 5ad7d95b… и release 66785862… остаётся в совместимом реестре; она не заменяет новые modular setups.

Важно сохранять provenance каждого результата: успешно опубликованный DDRNet member произведён предыдущим release ecbb0edc1c4c3708329247a2210ef98dfa776bf948974e778ba6d131ad17a924, хотя image agent совпадает. Range member использует текущий 97bfe743…. Совпадение agent image не означает одинаковость sealed package. Каталоги .runtime/*v8/v9/v10 — локальные артефакты сборки; наибольший номер папки не является источником истины о фактически установленном release.

12. Ресурсы и изоляция compute

Installed agent — доверенный оркестратор с доступом к Docker API/socket. Его нельзя описывать как полностью непривилегированный компонент без влияния на host.

Дочерние вычислительные контейнеры запускаются с ограничениями package runner: network=none, read-only root filesystem, drop ALL capabilities, no-new-privileges, без privileged mode. Входы, модели и проверенные code assets монтируются read-only; writable output ограничен каталогом шага. Заданы RAM/MemorySwap, CPU NanoCpus, Pids, SHM/tmpfs и GPU DeviceRequests. Точное значение бюджета зависит от resource profile/package, а не от свободного UI ввода.

GPU device admission не является жёсткой квотой VRAM. На имеющейся конфигурации действует последовательный допуск. Обещание безопасной параллельной работы N разных GPU моделей требует отдельного замера памяти и admission policy.

Историческая инвентаризация 3 сентября сообщала 11 containers, 7 running/4 stopped, 80 images, 9 volumes. Эти числа сохранены в архиве, но не являются текущим состоянием выключенного Worker. Другие исследования/сервисы, включая Gaussian и retained LAB packages, не следует автоматически считать зависимостями AI Inference или удалять по этой карте.

13. Передача данных и фактический кэш

Source package строится из конкретной сессии и проверенных members. Проверяются digest, размер и допустимость путей. worker_source_cache.py содержит source CAS (.source-cas-v1), который позволяет повторно использовать совпадающие исходные bytes. Кэш не разрешает смешивать похожие записи или произвольные версии калибровки.

Холодная подготовка остаётся существенной: загрузка camera archive завершается до extraction; декодирование/согласование камеры и LiDAR может предшествовать модельному этапу. Model-neutral camera-source убирает логическую зависимость подготовки от выбора segmentation, но не доказывает, что каждый отдельный job уже использует один готовый общий prepared-frame cache.

portable_result_cache.py и composition member reuse работают на уровне совпадающих сохранённых результатов. Чтение уже опубликованного результата не должно требовать GPU Worker.

Особенно важная проверка: modular_node_cache.py и node_input_identity существуют и покрыты тестами, но поиск production call sites обнаруживает определения и тесты без подключения ModularNodeCache к основному исполнителю. Поэтому универсальный кэш каждого узла композиции пока не заявляется работающей функцией. Старое намерение «каждый модуль считается один раз для всех LAB» ещё не равно реализации.

14. Результат и публикация

Результат связывает source snapshot, exact definition, module/package/model identities, временное покрытие и артефакты. portable_artifact_transport.py принимает manifest и members, portable_result_publisher.py создаёт опубликованную проекцию, portable_publication_reconciler.py доводит durable publication/outbox до согласованного состояния.

Результат проверки/расчёта и построенный для Rerun cache — разные артефакты. Смена renderer identity может потребовать перестроить производный cache; она не должна переписать исходные sealed results. Недоступный или неподходящий source должен давать явное состояние, а не демонстрационные точки вместо реальных данных.

Готовность полной LAB означает доступность требуемых member results по composition projection. Она не делает timestamps всех member jobs одинаковыми и не доказывает, что весь состав был вычислен одним совместным запуском. Сохранённая точная конфигурация важнее свободного названия строки.

15. Что действительно есть в текущем каталоге

Проверено через локальный Core API 5 сентября, без подключения Worker. Источник: 20260828T130511Z_viewer_live, имя RAVNOVES004TREE, XGRIDS LixelKity K1, capture profile xgrids-k1.viewer-live.fw-3.0.2.v1, длительность 808.779 секунды (13:28.779).

В текущей проекции есть ready composition ai-composition-33389babab33b801e8892f7b991683487eef2deea507486e52569fe943082e4b, composition SHA 230396b858b09eea3d1d3a190c5e32d1d5e379da0058d32341026937fbb5cf24. Создана 4 сентября в 06:59:35 UTC. Состав: DDRNet, RF-DETR, object-distance, TGS. Связаны три опубликованных member result; в UI также доступны отдельные сохранённые DDRNet и TGS строки.

Member Job От создания job до публикации, UTC
DDRNet observatory-run-ef3c14a64fca4d5a8674df82a5a0fca2 04.09 03:57:16.996 → 04:26:44.704; 29 мин 27.708 с
TRAVEL TGS observatory-run-b230216709dc4c59bc56c98c7e329bf1 03.09 08:08:03.013 → 08:31:39.776; 23 мин 36.763 с
object-distance, включая RF-DETR observatory-run-185e25280d58472ab8b4a0245a35c888 04.09 06:29:36.181 → 07:00:02.263; 30 мин 26.082 с

Result IDs: ai-layer-ddrnet-7c6a79942683933390f5ff0ecf2c6da1867d40032e91303746a567198772ce5c; m49-tgs-portable-review-a09d2b4a07d103e4f3693ba746a51be2197214768774eabfded4f109ae80dce4; ai-layer-object-distance-05f3931621585c9ac32132bef8c7afa961cea317cc29def09a8312339f8421e4.

Это wall time конкретных успешных jobs, включая всё между enqueue и publication; это не model latency. Не надо складывать эти числа и называть суммой latency одного composition run: его members переиспользованы из разных дат.

История по этой сессии и setup при запросе до 100 jobs: DDRNet — 7, из них 1 succeeded/published и 6 failed; range — 7, из них 1 succeeded/published и 6 failed; TGS — 4, из них 1 succeeded/published, 1 succeeded с publication not-required и 2 failed. У новых standalone EoMT и RF-DETR setup — 0 jobs для этой сессии. Ноль здесь не означает отсутствия модели или старых экспериментов; успешный standalone recorded прогон ими в этом срезе не подтверждён. Действующие failures не стираются итоговой готовностью одной LAB.

16. Реальное покрытие и смысл измерений

Полная длительность источника и фактическое покрытие результатов должны быть отдельными полями. Исторический TGS handoff для этой записи указывает 6830 camera anchors, 6811 LiDAR matches и 19 unobserved; processing schedule примерно 39.215–757.160 секунды внутри источника 808.779 секунды. Надпись «полный маршрут» не должна скрывать начальные/конечные непокрытые интервалы и отсутствующие наблюдения.

В сохранённом TGS performance: candidate TGS p50=1.204 ms, p95=2.6075 ms, p99=3.2357 ms, max=4.651 ms. Более широкий stage wall: p50=17.676102 ms, p95=29.99172 ms, p99=36.24682261 ms, max=1269.499327 ms. Это разные границы измерения внутри алгоритма и обвязки; они не опровергают десятки минут enqueue→publish при подготовке записи.

Для честного сравнения нужно сохранять source rate, coverage, cold/warm режим, hardware/runtime identity, sample count и границы: queue wait; source transfer; decode/align; warmup; model/algorithm compute; serialize/seal; result upload/publication; replay preparation. Нельзя вычитать p95 одной фазы из p95 другой и получать корректный p95 остатка. FPS визуального воспроизведения Rerun тоже не является inference FPS.

Текущий recorded-first путь предназначен для воспроизводимых сравнений и сохранённых доказательств. Из имеющихся результатов не следует ни обещание полного real-time, ни утверждение, что модель сама считает один кадр две секунды. Долгие пользовательские ожидания из истории были реальными и должны оставаться частью performance backlog.

17. Предыдущий streaming experiment и его результат

Сохранены исследования experiments/perception/worker/streaming_profile_stage1/, stage 1, cross-host graph, control clock, TLS attribution, LAN route. Подробные receipts также перенесены из Desktop в архив.

Это отдельный resident perception prototype: DDRNet/RF-DETR, LiDAR/range, motion, TGS/costmap и policy stages, бинарный обмен gRPC/TLS и pacing источника 1×. Он не является текущим recorded HTTP worker protocol и не становится автоматически модулем motion/policy в сегодняшнем UI.

Исторический joint image: 986dbe7126992359c69da0ddda674925a5efe8e3429a6d5f60765f9c9ad34a4e, tag ndc-k1-perception-ddrnet39-rfdetr-tgs:stage1-joint-20260901. Использовались model/code mounts; это не полностью автономный образ. Конкретный приёмочный фрагмент: 32 released/accepted results с byte-exact доставкой; fresh scene outputs — 12. Эти числа нельзя заменять фразой «32 полностью свежих результатов сцены».

На Worker локально compute→local receiver p95/p99 = 74.243/76.322 ms. Межмашинная граница Mac source-due→consumer-ready p95/p99 = 205.864/213.751 ms при gate 125 ms: FAIL. Min 86.598 ms, median 121.85 ms не превращают хвосты в PASS. Историческая проверка выявила Wi-Fi с обеих сторон и TCP tails 67.92191.142 ms ниже приложения; это основание изучать сеть, а не основание объявить всё задержкой модели. Истощение VRAM в этом конкретном опыте не было доказано.

Опыты показывают полезный compute budget и нерешённый end-to-end gate на тогдашней сети. Перенос resident runtime на будущий борт, совместимость другого GPU и абсолютный real-time не квалифицированы этим отчётом. Повторный streaming benchmark сейчас не запускался.

18. Локальная онтология и связи с оборудованием

В Mission Core уже есть предметная проекция: config/observatory-domain-ontology.json и src/k1link/observatory/domain_ontology.py. Она связывает transport/equipment/mount, capture profile, source session, module version/image, worker, composition, run/job/result, LAB view profile и layers/panes.

Она обслуживает согласованные запросы планирования, dispatch, публикации и replay: точная подпись конфигурации, состав member results, доступные слои и готовность. Идентичности берутся из существующих реестров/хранилищ; это не конкурирующая база, самовольно переименовывающая raw evidence.

Онтология отдельного NDC Platform repository не изменялась, runtime dependency на неё для AI Inference не добавлялась. Архитектурный принцип связанной модели применён локально. Формальное присутствие transport/equipment сущностей не равно готовой регистрации любого оборудования, универсальному драйверу RealSense или автоматическому конструктору 50 камер.

19. Rerun: один runtime, локальные контролы и сохранение

Полная самостоятельная карта: Ops #74 и 2026-09-05-rerun-customization-inventory.md, с проверкой upstream. В ней перечислены все действующие и архивные надстройки, точные файлы, хеши и upgrade gates. Здесь только роль в AI Inference.

Используется официальный Rerun 0.36.3; установленные JS/WASM и Python SDK в предыдущем аудите побайтно сверены с upstream. Recorded viewer живёт в same-origin iframe, имеет один native renderer/store/clock. Камера и spatial — виды внутри общего viewer. Внешний SplitPane владеет разделением, контролы принадлежат своим секциям, native layout получает согласованную долю. Верхняя панель переносит не помещающиеся группы; refresh/fullscreen относятся к общему layout.

Слои строятся из capabilities результата: фон КАМЕРА независим от segmentation и РАМОК; кнопка рамок зависит от detections; TGS от geometry evidence. Отключённый фон камеры не должен выключать остальные 2D layers. Один тип источника допускает одно окно. Сегодня реализованы camera/spatial и single-pane варианты, а не произвольное дерево из 50 камер.

ИСХ. ТОЧКИ и ЛОК. SLAM сейчас используют одно sealed /world/points. Отличаются отображение/накопление и дополнительные trajectory controls; это не две независимые коллекции «математические» и «декоративные». Изменения размера/цвета не меняют raw/AI расчёт.

Надстройка FOLLOW и восстановления eye использует прикладной журнал native gestures и blueprint. Это не официальный универсальный get-camera-pose API. Не все gestures покрыты: WASD, double-click/picking-fit, inertia могут расходиться с журналом. Такие ограничения явно оставлены в #74; этот документ не объявляет все пользовательские сценарии зума принятыми.

Server-side LAB display profile сохраняет point_size, accumulation_seconds, color_mode, palette, show_grid, show_labels, show_camera_frustums отдельно от immutable result. Применение point size/накопления/цвета/grid подключено; show_labels и show_camera_frustums сохраняются, но визуально не подключены к текущему canonical LAB пути. Layer toggles, FOLLOW, eye и split ratio в этот durable profile не входят.

Slider накопления 0–500 s и точный ввод конечного неотрицательного значения без верхнего product cap; размер slider 0.1–10 px, точный ввод ≥0.1 без верхнего cap. Закрытие настроек отправляет PUT; ошибка не должна блокировать закрытие и показывается компактным сообщением. Только успешная серверная запись подтверждает сохранение после очистки локального кэша. Сохранение в памяти/localStorage само по себе этого не доказывает.

20. Переносимость — что возможно и чего ещё нет

Объект переноса Реальное условие
Просмотр готовых LAB на другом Core Перенести каталог, source/result artifacts, lineage и profiles с сохранением identities; обеспечить renderer/SDK и восстановление производных caches. Worker для просмотра не требуется.
Та же композиция на другой записи K1 Источник обязан пройти admission по требуемым каналам, калибровке, media epoch/codec, геометрии и timestamps. Один совпавший label недостаточен.
GPU-модули на другом AI Worker Нужны compatible CPU architecture/GPU/CUDA/TensorRT, exact images, private bases для rebuild, models/code assets, installed package, resource profiles и протокол связи. Не один docker load.
Worker с другим именем/contour Сейчас имеются worker-006 bindings и проверки. Общая динамическая регистрация/автовыбор любого Worker не заявляется готовой. В эту задачу не входит.
Linux вместо Windows Docker Desktop Нужна проверка network/host bridge, paths, mounts, GPU runtime и SSH topology; host.docker.internal нельзя молча считать одинаковым.
Новая модель Требуются ModuleSpec, versioned image/contract, adapter/installed steps, setup projection, input/result verification, capability→viewer mapping и evidence. Сейчас UI не универсальный marketplace Docker images.
Другое оборудование / 50 камер Нужны source adapters, calibration/time contracts, admission и расширение layout/ресурсной модели. Сущности онтологии дают место для этого, но не готовую реализацию.
Бортовой real-time Resident prototype, recorded LAB и бортовая qualification — разные границы. Нужен отдельный измеренный deployment на выбранном target.

Переносимость достигнута в identities, пакетах, протоколах и сохранённых результатах. Привязки к Worker-006, K1 и имеющимся окружениям остаются конкретными. Утверждение «полностью независимо от host» сегодня было бы неточным. Изменять эти границы ради красивого отчёта без работающего Worker не стали.

21. Архив Desktop без потери контекста

Два относящихся к AI Inference документа перенесены побайтно в docs/handoff/ai-inference-source-documents/ и снабжены manifest.json. Это полные исходные тексты, включая ошибки, планы, замеры, списки Docker и последовательные обновления; не только краткий пересказ.

Исходный файл Desktop Bytes SHA-256
_MISSING_CORE_MODULAR_AUDIT_AND_PLAN_2026-09-03.md 53637 d6c201d083fbec4b1db031379b515ff821a09ccfa0cea62443e211a9d76cb1c2
_MISSING_CORE_OBSERVATORY_DOCKER_LABS_FINAL_STATUS_2026-09-01.md 330260 45e870700baddab8f31a2f0f0bfe1f9e99e8e73a490195c1e6a3beb5265e49ee

Другие документы на Desktop не объявляются перенесёнными этой картой. Исходники не удалялись автоматически. После публикации commit пользователь может удалить именно эти два оригинала: versioned копии и хеши остаются в репозитории, а их актуальная интерпретация — здесь и в Ops.

Исторические указания из этих файлов не исполняются как команды. Раннее требование «весь профиль в одном монолитном образе» заменено ADR 0051. Историческое описание node cache как цели отделено от фактического отсутствия production wiring. Старые Docker inventories и streaming receipts датированы; не выдаются за результаты сегодняшнего запуска.

22. Проверки этого изменения и открытые границы

Для переименования выполнены архитектурные frontend tests (4 passed), полный frontend typecheck, полный unit suite (759 passed), production build и targeted Python tests test_modular_observatory_api.py/test_observatory_setups.py (22 passed). Изменения runtime поведения и новые вычислительные jobs в этом этапе не выполнялись.

В открытом in-app browser обновлена сборка и пройден путь LAB → AI Inference. Новые sidebar label, eyebrow, title и aria-подсказки удаления подтверждены реальным UI. Проверены обычный и развёрнутый shell, три сохранённых строки с датами/действиями; открыта полная сохранённая конфигурация с камерой, DDRNet, рамками и TGS. Fullscreen самого результата и возврат по Escape проверены. Escape на shell сам по себе не меняет его состояние; это не объявляется успешным закрытием shell. Текущая задача не меняет политику Escape/диалогов. Реальная сохранённая конфигурация оставляется для просмотра владельцем.

Срез временно закрыт по документации. Открыты: окончательная пользовательская приёмка навигации Rerun и настроек; два неподключённых display fields; полный native camera-state API вместо неполного gesture journal; универсальный multi-pane constructor; универсальное исполнение DAG/production node cache; новые Worker/оборудование и target CUDA qualification; end-to-end real-time gate и полноценные cold/warm phase metrics. Это границы текущего продукта, не скрыто выполненные пункты.

При возобновлении работы исходная точка — этот срез, actual registry и конкретные new measurements. Legacy LAB приложения автоматически не возвращаются; неизвестные состояния выключенного Worker сначала проверяются после его появления. Любое следующее обновление Rerun проходит отдельно по карте #74.

23. Изменённые файлы и эксплуатационная фиксация

Переименование: apps/control-station/src/productModel.ts, components/laboratory/LaboratoryPresentation.tsx, workspaces/observatory/ObservatoryWorkspace.tsx, core/observatory/{aiComposition,catalogMutations,useObservatoryCatalog}.ts внутри frontend; src/k1link/observatory/setups.py, src/k1link/web/{observatory_api,modular_observatory_api}.py. Обновлены ожидания существующих observatoryWorkspace.test.mjs и observatoryCatalogMutations.test.mjs. Дизайн, identifiers, параметры расчёта и бинарные модели не изменены.

Документация: этот отчёт, JSON evidence, README/manifest и две полные копии в docs/handoff/ai-inference-source-documents/; указатели текущего среза в ADR 0051 и историческом ExecPlan. Ops #75 создана как текущая архитектурная карта; #73 переименована в историческую карту с указателем #75 и сохранением всех прежних блоков.

Production frontend bundle пересобран. Канонический локальный LaunchAgent com.nodedc.mission-core.local перезапущен из того же checkout для применения Python-текстов. /api/health на :8000 подтверждает operational=true, plugin runtimes 1/1, готовность источников и artifact store. Новый сервер на другом порту не создавался; удалённый Worker не запускался. Код и архив публикуются в main обычным commit/push без переписывания истории. Точный итоговый commit указывается в финальном блоке Ops #75.