195 KiB
AI Inference: история модульных Docker-композиций → записанные LAB → CUDA-борт
Срез 2026-09-05: этап временно зафиксирован владельцем. Текущая фактическая архитектура, ограничения и состояние приёмки описаны в AI Inference и отдельной карте Ops / MISSION CORE. Ниже сохранена история маршрута; старые «следующие шаги» не означают поручение автоматически продолжать запуск или мигрировать legacy LAB.
ЕДИНСТВЕННЫЙ ТЕКУЩИЙ МАРШРУТ — 2026-09-03, модульное решение
Этот раздел заменяет прежний маршрут ниже. Исторические CURRENT, «следующий
шаг», номера этапов и требования «один профиль = один полный Docker» в архивной
части не являются актуальными заданиями. Замеры и выполненная работа сохранены.
Решение владельца: ADR 0051.
Фактическая сверка и очистка:
handoff report.
Цель и термины
Запись K1 → настройка AI-слоя по функциональным группам → расчёт выбранной композиции → неизменяемая LAB и кэш на Core → повторный просмотр без Worker. Один модуль используется разными композициями, одна композиция — разными совместимыми записями. Удачная композиция позднее переносится на CUDA-борт.
- Модуль: отдельный версионированный Docker-образ модели или связанной функции, например DDRNet, EoMT, RF-DETR, LiDAR/TGS geometry. Не отдельный микросервис для каждого арифметического шага.
- Профиль: проверенная immutable композиция модулей, параметров, связей и политики исполнения. Новая комбинация не требует сборки монолитного образа.
- LAB: применение точной композиции к точному снимку записи, с доказательствами, границами покрытия и измерениями. Сохранённый результат не меняется задним числом.
- Борт: будущий совместимый CUDA-компьютер, не Mac Mini. Конкретные CPU/GPU, драйверы и архитектура контейнеров квалифицируются после выбора оборудования.
Работа recorded-first. Расчёт медленнее записи допустим; достижение remote realtime через Wi-Fi/LTE не блокирует лаборатории. Runtime всё равно сохраняет потоковые контракты и оптимизированную подготовку данных. FPS проигрывания кэша и скорость сборки из кэшированных узлов не выдаются за вычислительный FPS борта.
CURRENT: установленное и доказанное
- Ветка
codex/m5-1-observatory, HEADeff60e4, поверх него есть незакоммиченные изменения предыдущих инкрементов. Не сбрасывать и не считать всё новым diff этой архитектурной правки. Полный список даётgit status. - Core на8000: admission, очередь/claim v3, exact-cache/idempotency, publication outbox/recovery, metadata pagination, отделение portable LAB от Legacy, общий сохранённый viewer. На Worker установлен source CAS двух агентов и bounded heartbeat retry. Это основа миграции, не повод написать всё заново.
- M4.9T5: CPU TGS, отдельный специализированный агент. Job
observatory-run-b230216709dc4c59bc56c98c7e329bf1×004TREE опубликована: 6830 camera anchors,6811 LiDAR,19 UNOBSERVED; цикл1416.763s. Расписание 39.215–757.160s внутри808.779s записи: не заявлять полное покрытие всей записи или полный AI-граф. Сохранённую публикацию и рабочий release сохранить. - LAB V1: установлен фиксированный стек prepare → EoMT → DDRNet → assemble.
Это старый сравнительный состав, не новый выбор одного segmenter. Последняя
job
observatory-run-67a6bf3e4d644e4a8ee3c03b915f8f01завершена failed после lease loss на EoMT; нового опубликованного LAB V1 нет. Исправления heartbeat установлены, но успешный полный повтор ещё не доказан. - Есть прототип DDRNet/RF-DETR/geometry/distance/motion/TGS/costmap/policy-shadow. Переиспользовать алгоритмы, не называть прототип принятым автономным профилем.
- Реестр пользовательских композиций, per-node result-cache, групповые настройки и независимо упакованные модули нового формата ещё не реализованы.
- Реальная полная visual/memory-lifecycle приёмка saved replay открыта. Прежние 749 frontend/166 backend checks — проверки предыдущего инкремента, не новой модульной архитектуры. Исторические тесты не заменяют новые приёмочные сценарии.
- Audit:24 контейнера →11 после удаления13 проверенных остановленных предшественников/debug.80 образов и9 volumes оставлены. Сохранены два текущих агента, последняя rollback-пара, рабочие результаты и зависимости. Активные Gaussian/Triton/perception требуют отдельной проверки потребителей.
- EoMT floor250GiB + working set изменён в source и узких тестах; установленный образ пока350GiB. Нужен новый sealed release, не правка digest существующего.
Продуктовые правила нового AI-конфигуратора
В существующей Обсерватории у выбранной записи — «Настройка AI-слоя» и компактное
окно с функциональными группами. Использовать существующие Window, FieldFrame,
Select, WindowFooterActions и канонические кнопки; не создавать новый workspace
или локальную дизайн-систему. Обычная checkbox-матрица Docker не подходит.
Группа сегментации: один выбор DDRNet / EoMT / «Не использовать», если частичный состав допустим. Два segmenter в одной новой LAB запрещены сервером, не только UI. Другие кандидаты групп: детекция, LiDAR/TGS/costmap, связь объектов с расстоянием, motion, policy-shadow. Их окончательные границы определяются кодом/контрактами. Один модуль с несколькими capabilities не запускается несколько раз.
Сервер проверяет зависимости: object-distance требует детекцию, облако и калибровку; геометрические препятствия могут вычисляться без семантического детектора. Не требовать необязательный модуль для независимого результата. Для недоступного сочетания — понятная причина, не молчаливое включение другой ML.
Точная конфигурация уже опубликована → открыть существующую LAB, «Рассчитать» нет. Нет результата → «Рассчитать», при активной job — существующий реальный progress без дубликата. Нет кнопки/плашки «Расчёт завершён». Поставщики остаются в dropdown: рассчитанность относится ко всей композиции, а не к отдельной модели. Это заменяет старое правило удаления готового полного профиля из единственной выпадашки.
Четыре этапа — действуют только эти
1. Контракты композиции и безопасная граница миграции
- Сверка Desktop/кода/installed runtime, retention inventory и первая очистка остановленных экземпляров выполнены в этом handoff. Спецификация ADR принята.
- Следующее: реализовать версионированные Module/Composition contracts поверх installed-package boundary; определить producer/consumer схемы и capability группы по фактическим алгоритмам. Не считать описательный ADR готовым API.
- Зафиксировать content identity: source, image/code/weights, параметры, preprocessing/calibration, cadence/precision, temporal state и graph edges. Порядок щелчков в UI не меняет identity; любые значимые входы — меняют.
- Retention manifest должен охватить pinned packages, текущий M49, старый V1, прототип полного графа, модельные assets и один rollback. Затем отдельно согласованно вывести активные устаревшие сервисы; только после проверки зависимостей удалять недостижимые images/build caches/temp directories.
Приёмка: контрактные тесты несовместимости и exact identity; доказанный список сохраняемых артефактов; никакой утраты записей/Legacy/публикаций. Этап целиком открыт.
2. Переиспользуемые Docker-модули и общий Worker runtime
- Упаковать DDRNet и EoMT отдельно с закреплёнными зависимостями/весами; LiDAR/TGS и остальные функции выделять по согласованным границам. Сохранить общие базовые слои/проверенные assets без копирования всего набора в каждый image. Веса входят в переносимый дистрибутив как image layers либо явные immutable model assets с проверкой digest; случайный host checkout/conda environment не является допустимой скрытой зависимостью модуля.
- Расширить generic launcher, не создавать агент под каждую модель. Одна аренда на композицию Worker006, тяжёлые GPU шаги последовательно. Несколько активных CPU/служебных контейнеров не означают разрешённый параллельный ML inference.
- Один source/preparation path, локальные межмодульные данные на Worker; не отправлять промежуточные кадры/облака через Core туда-обратно. Сохранить bounded потоковый I/O; целиковый cold input barrier не превращать в вечную архитектуру.
- Добавить exact per-node cache и зависимое invalidation, stateful history binding, прогресс computed/reused/failed. Worker source CAS сам по себе это не реализует.
- Результат публикуется и просматривается с Core. Повтор publication не запускает inference заново. Окончание/cancel освобождают временные процессы/RAM/VRAM, не удаляют постоянные результаты. Ресурсную политику250GiB активировать новым release.
Приёмка: standalone cold start без developer checkout и необъявленных mount; последовательные реальные прогоны двух допустимых композиций; exact cache hit, частичный reuse, смена зависимости и безопасный failure/recovery.
3. Конфигуратор, сохранённый просмотр и продуктовая приёмка
- Реализовать групповые Select и server admission в существующей Обсерватории. Legacy не переносить назад; старый dual-segmentation V1 только совместимость/история.
- Доказать source × composition: новая совместимая запись без LAB, расчёт, открытие сохранённой LAB, новая конфигурация, отсутствие дубликата точного повтора. Минимум две совместимые записи и две допустимые композиции, последовательно.
- Проверить общую временную/пространственную привязку camera/segmentation/objects/ range/TGS по фактически выбранным outputs, full configured coverage и явные gaps.
- Завершить реальную normal/expanded/Escape/close/reopen приёмку и освобождение viewer RAM/GPU после закрытия; не ограничиваться контрактными тестами.
- Проверить большие каталоги, рестарты Core/Worker, publication retry, отмену, полную наблюдаемость результата без работающих моделей.
Приёмка: оператор выполняет весь цикл без инженерных команд; просмотр берётся с Core, рабочий Worker не нужен. Этапы2–3 могут иметь согласованные инкременты, но непройденный сквозной сценарий не считается закрытым.
4. Перенос принятой композиции на CUDA-борт — позже
Те же логические модули и версии; аппаратно-совместимая упаковка, локальный транспорт, долгоживущие процессы/модели вместо старта Docker на каждый кадр. Квалифицировать полный граф и совместное потребление памяти, не сумму независимых FPS и не cached replay. Горячие узлы можно позднее объединять по измерениям без потери логической модульности. Mac Mini не является целевым бортом. Моторы, автономное движение, ArduRover и safety acceptance — отдельная будущая работа, сейчас observation-only/policy-shadow.
Инструкция следующему чату
Прочитать актуальную верхушку Desktop _MISSING_CORE_…FINAL_STATUS…md, ADR0051,
этот раздел и handoff report. Проверить git status, Core8000 и точные installed
identities read-only; начать с незакрытых контрактов этапа1. Старые installer
scripts с зашитыми predecessor IDs не запускать повторно. Не начинать с новой
полной сборки старого dual-segment LAB V1 или глобального Docker prune.
Не менять Synology/деплой21, Little Snitch, чужие сервисы, Docker Desktop limits.
Не коммитить существующий общий dirty diff как собственную новую работу.
АРХИВ ПРЕЖНЕГО МАРШРУТА — до модульного решения 2026-09-03
Весь следующий текст — история. Слова «актуальный», CURRENT и следующие шаги внутри него описывают состояние своего инкремента, не текущий план.
Observatory: четыре этапа — записанные лаборатории → переносимые профили → борт
Актуальный маршрут — 2026-09-03
Сверено с кодом bee8552, установкой 54c8d82, исправлением reindex bd947b4
и последними решениями владельца. Проверки и сборка текущего инкремента поверх
eff60e4 завершены; возврат к основному маршруту зафиксирован ниже. M4.9T5 ×004TREE рассчитан через UI, опубликован
и повторно открыт из кэша после перезапуска. Общий camera/TGS replay реализован;
подробная визуальная и memory-lifecycle приёмка ещё открыта. Разделы до журнала инкрементов — текущий
маршрут; исторические «следующий шаг» и «этап открыт/закрыт» ниже не команды.
Цель и результат
Оператор записывает маршруты K1, один раз рассчитывает совместимую запись выбранным профилем и затем изучает сохранённый результат без повторного inference. Один профиль применяется к разным записям, разные профили сравниваются на одной. Удачный полный профиль впоследствии переносится на фактический бортовой компьютер.
Лаборатория допускает расчёт медленнее записи. Требуются полнота предусмотренного профилем анализа, качество, воспроизводимость и честные измерения. Remote realtime PASS через Wi-Fi/LTE не является условием готовности лабораторий. Потоковые контракты, bounded очереди, scheduler, ownership/recovery и телеметрия сохраняются.
CURRENT: что есть и чего ещё нет
- Реализовано и локально проверено: source/profile admission, durable queue, защита от дубликатов, восстановленный claim/v3, точный опубликованный кэш, выбор только совместимых нерассчитанных portable profiles и общие viewer contracts.
- UI: готовность видна только по результату внизу. Все текущие профили рассчитаны → выбор пуст, «Рассчитать» нет, «Обновить» остаётся. Плашек завершения нет; во время работы общий индикатор показывает настоящую фазу и доступные счётчики. Внутри первичного decode/передачи архива детальные счётчики ещё отсутствуют. Обсерватория теперь показывает только identity-bound portable результаты; исторические LAB остаются в Legacy. Каталог дочитывает cursor pages по100 metadata entries (до256 страниц на scope с явным partial flag), поиск видит все загруженные источники. Fixture500 sources и real20-page proof PASS.
- Предыдущая функциональная приёмка: 726 frontend tests, 128 focused progress/queue/API/ transport tests, отдельно40 runtime/wiring и3 installer tests, typecheck/build, Ruff/mypy и browser QA. Для найденного при рестарте cache-дефекта — ещё89 session/publication и72 admission/cache/queue/API tests. Эти проходы пересекаются, их суммы не являются числом уникальных тестов. В очереди12 jobs: прежние10 failed,1 succeeded/not-required и1 новый published. Все11 прежних jobs сохранены. Новый exact cache/document повторно открыт после исправления no-op reindex и перезапуска; видео/TGS-view ещё не принят.
- Реальный M49-результат: 6830 camera-fragment anchors, 6811 доступных LiDAR и19 UNOBSERVED; учёт149733073 rolling-point contributions сходится,0 unaccounted. Расписание39.215–757.160s не покрывает все808.779s исходной сессии. Полный цикл 23:36.763; TGS p95 2.6075ms и runner-stage p95 29.99172ms — только эти стадии, не full-profile/onboard FPS и не качество сегментации.
- Текущие составы: M4.9T5 — CPU TGS; LAB V1 — последовательные EoMT и DDRNet. Ни один не равен полному будущему AI-профилю рига. Архивные overlays в одном viewer не доказывают, что один Docker вычислил все слои.
- Последний viewer-инкремент: primitive-only owner v2 и передача Escape/pointer из iframe для существующих внешних controls. 740 frontend/64 focused backend tests, полный typecheck/build PASS, новая сборка обслуживается на8000. Разделитель native viewer снова передаёт координаты внешним панелям; проверено контрактным тестом, реальная visual acceptance этой версии ещё не выполнена.
- Входы Worker, новый инкремент2A: общий source CAS двух агентов установлен; другая job/generation/конфигурация переиспользует exact cached bytes, частичная camera-cache требует только отсутствующие members. M49 проверяет готовый LiDAR pack до raw decode; прежний producer/identity сохранён.111 focused tests, Ruff/mypy и реальный cross-agent synthetic proof PASS, моделей не запускали. Это не кэш viewer (он остаётся на Core) и не устранение cold whole-input barrier.
- Последний продуктовый инкремент2D: Legacy separation и pagination активны
на8000 (
app-9nK8VtbK.js).747 frontend/41 backend tests, typecheck/build, Ruff/mypy PASS. Browser catalog/search/normal/expanded/Refresh/dropdown Escape принят; тяжёлый replay не открывался. Legacy API до/после побайтно неизменён. - Освобождение памяти: найден остаток записанного viewer после закрытия. Добавлены disposable upstream realm, размыкающий ссылки facade и backend release/TTL. Предыдущий browser proof подтвердил освобождение GPU, но прежний facade оставил829 MB renderer после закрытия (112 MB до). Для v2 реальный open/close ещё не проверен: browser auto-review отклонил тяжёлое открытие при pressure2; запрошено отдельное разрешение. Это не блокирует код/контракты оставшихся частей этапа2 и не считается доказанным исправлением memory issue. Активные данные/качество не урезаются, дисковый cache не удаляется.
- Крупный проход saved review/recovery: общий viewer подключён к сохранённым
EoMT/DDRNet masks LAB V1 через новый строгий adapter; M49 cache identity сохранена.
Outbox больше не застревает за префиксом exhausted/backoff rows. Краткие
heartbeat transport failures повторяются в пределах аренды с тем же sequence;
новый control layer установлен в оба агента.749 frontend/166 backend tests,
typecheck/build/Ruff/mypy PASS; Core
app-w6onjKPq.jshealthy на8000. - Реальный LAB V1 ×004TREE пока FAIL: новая job
observatory-run-67a6bf3e4d644e4a8ee3c03b915f8f01потеряла lease на шаге EoMT. После независимой проверки освобождения ресурсов штатно reconciled→failed; история сохранена, очередь11 failed/2 succeeded,0 live leases. Новый LAB не опубликован. Отдельно подтверждён устаревший EoMT disk floor350GiB сверх рабочего набора: при текущих397.47GB free admission не пройдёт. Перед повтором нужна новая sealed resource policy, не очистка данных/не покупка памяти. Полный отчёт и точные границы доказательств. - Есть инженерный прототип полного графа: DDRNet/RF-DETR/geometry/distance/ motion/TGS/costmap/policy-shadow и короткие потоковые proofs. Не пишем заново. Самостоятельный продуктовый образ и полный recorded-run этого состава не приняты.
- Не закрыто: полный recorded-analysis текущими профилями, синхронный сохранённый visual replay, матрица двух профилей/записей, оставшиеся recovery cases, standalone и фактический перенос на борт.
Источники: ADR 0050, cache/UI evidence, claim/v3. Desktop final-status — операторская сводка и история; подробный маршрут ведётся только здесь. Из CODEX_V5 взяты разделение CURRENT/TARGET, критерии готовности и сохранение выполненной работы, не неподтверждённые сведения о runtime. Текущее исполнение и точные declarations: progress / первый запуск. Последняя сверка и проверки: возврат к основному сценарию.
Границы исполнения
- Один Worker 006/RTX 4090 — один активный профиль; альтернативы и тяжёлые проверки последовательны. DDRNet и RF-DETR допустимы внутри одного полного профиля с последовательным GPU inference. EoMT сохраняется отдельно; существующий сравнительный LAB V1 не превращается в параллельный запуск двух segmenters.
- Только Mission Core 8000 и Worker 006, без Synology/deploy-canon21, новых LAB-микроприложений и изменений чужих сервисов. На Mac 18GB — resource gate, последовательные проверки, без нагрузочных тестов и остановки чужих приложений.
- Записи, история, артефакты и отрицательные замеры сохраняются. Не выдумывать capture attestation RAVNOVES01; новая конфигурация/семантика получает новую версию, старые результаты сохраняют свою идентичность.
- Полнота recorded-analysis не ослабляет live freshness/ownership. Временные сетевые/телеметрические сбои восстанавливаются по существующему контракту, без бесконтрольных рестартов моделей и второго владельца Worker.
- Пока observation-only/policy-shadow. Моторы, автономная навигация и controller/ safety acceptance не включаются скрыто. Борт и более мощная GPU не блокируют этапы 1–3.
Этап 1 — Основа, идентичность и выбор профиля
Состояние: основа реализована и локально проверена. Это не утверждение, что весь пользовательский цикл уже принят: сквозная приёмка явно в этапе 2. Повторно строить queue/cache/selector не требуется.
Результат: exact source snapshot + immutable profile + проверенный пакет определяют reuse. Повторный клик не создаёт конкурирующий расчёт, новая версия не скрывается старым названием LAB, завершение не дублируется кнопкой/плашкой.
Доказательства: queue/cache/decoder tests, first-render selection fences,
normal/expanded UI; последний код e436fb5 и отчёты выше. Остаток — исправлять
только дефекты, обнаруженные сквозным циклом 2, а не повторять выполненный ремонт.
Этап 2 — Полный цикл записанной лаборатории — следующий активный этап
Цель: полный расчёт записи, фактический прогресс, пригодный для просмотра опубликованный результат и повторное открытие после перезапуска без inference.
2A. Полный анализ и прогресс. Сверить текущие executor inputs/outputs с
наработанным runtime. Явно оформить версионированный recorded-analysis отдельно
от realtime-rehearsal; сначала малые контрактные fixtures, не долгий GPU-run.
Частично выполнено: bounded attempt-scoped progress реализован и активирован. Новый M49-run использовал прежний профиль и полностью выполнил его расписание. Это не закрывает2A: целиковый input barrier ещё сохранён. Новый preparation adapter проверяет exact LiDAR-cache до вызова прежнего producer, общий source CAS уже установлен в оба агента. На warm input не повторяются raw decode и передача готовых members, но cold materialization по-прежнему ждёт весь вход. Progress observation и warm reuse не являются новым режимом исполнения. Evidence: source reuse.
- Сохранить source timestamps и causal ordering. Медленный Worker притормаживает подачу, а не выбрасывает обязательные кадры ради 1×. Учитывается каждый вход/ выход по расписанию профиля; stride, sensor gaps и overload drops различаются.
- Ограничить чтение, decode, буферы, транспорт и запись outputs. Полное предварительное накопление/пересылка исходной сессии не становится постоянным условием старта. Sealing выходного пакета после EOF — не input barrier.
- Передать реальные счётчики Worker через backend в общий UI: обработанные единицы, доступный знаменатель, текущая фаза. Не выдумывать проценты/ETA; различать попытки. Хранить ограниченный актуальный снимок, не бесконечный journal на каждый кадр. После публикации прогресс исчезает, остаётся результат.
- Различать preparation, warmup, compute, transport и publication. При исправимой ошибке публикации повторять публикацию сохранённого пакета, не inference.
2B. Первый вертикальный proof: M4.9T5 × RAVNOVES004TREE. Пройти полный путь через обычный UI и Worker: вход → расчёт → реальный прогресс → sealed package → публикация → маркер конфигурации внизу → общий viewer → повторное открытие. Из выбора исчезает именно рассчитанная версия. Проверить полноту TGS-выходов и timeline. Это приёмка CPU TGS, не полного detector/segmentation профиля. Историческая M4.9 projection без review binding не заменяет этот proof.
Доказано на новом run: compute → seal → publication с первой попытки,
точный cache hit, исчезновение M49 из выбора и открытие документа после рестарта.
Найден и исправлен no-op reindex: служебная переиндексация больше не меняет
source identity; реальное изменение по-прежнему требует нового расчёта.
Общий CanonicalRecordedLabReplay уже получает сохранённый camera/source/TGS
RRD с Core; JSON не является единственным review. Осталось в2B: сохранение
ручного ракурса при blueprint activation, подробная визуальная оценка и
подтверждённое освобождение памяти закрытого viewer. Использовать уже sealed
пакет, не считать заново и не подмешивать архивные E47/M49 semantics. Название
«полный маршрут» не доказывает покрытия всех исходных timestamps.
2C. LAB V1 и другая запись. Выполнить LAB V1 × 004TREE, затем оба профиля × RAVNOVES00, строго последовательно. Медленная EoMT не возвращает нас к гонке за сетевым FPS. Не менять незаметно состав, cadence или разрешение ради PASS. RAVNOVES01 — отрицательный случай до подтверждённой аттестации.
Попытка2026-09-03: LAB V1 ×004TREE запущен штатно, но после transfer и prepare не завершил EoMT: lease expired, результата нет. Heartbeat retry исправлен и установлен, exact-job resources освобождены, failed receipt сохранён. Перед следующим расчётом изменить350GiB disk floor через новую sealed версию с проверяемым бюджетом рабочего набора; предусмотреть дешёвый preflight до долгих asset checks и bounded diagnostics до cleanup. Не считать этот canary успешным.
2D. Повторное использование, сбои и большой каталог.
- Refresh, повторный вход и перезапуск открывают тот же результат без новой job. Все текущие профили рассчитаны → выбор пуст, «Рассчитать» нет; новая версия → новый расчёт, старая остаётся ниже. Проверить transient disconnect, compute failure, publication retry, missing/corrupt artifacts и отсутствие дубликатов.
- Реализовано: Обсерватория не показывает Legacy/canonical архивные LAB; они остаются в существующем архиве без миграции/удаления. Portable результаты прошлых версий сохраняются при точном binding, независимо от имён и даты.
- Реализовано и проверено: постраничный каталог и поиск по загруженным источникам. Нельзя спрятать профиль из-за cache hit, соответствующий результат которого нельзя найти/открыть из-за окна каталога. Сотни metadata entries проверяются функциональными fixtures, не нагрузкой на Mac и не загрузкой всех видео в RAM. Evidence и границы traversal.
- Новый recovery proof: keyset outbox проходит мимо exhausted/backoff rows; interruption до publish/после publish до ACK восстанавливает тот же результат без compute. Transient heartbeat/lost ACK повторяет тот же sequence, истёкшая аренда/чужая identity/HTTP401/403/409 не принимаются. Это contract tests и установленный control layer, не реальная long-outage qualification.
Приёмка: матрица 2 профиля × 2 совместимые записи, полные обязательные выходы, честный прогресс, published package, сохранённый просмотр без compute после перезапуска, проверенные recovery/negative cases и сохранность истории. Первый M4.9 run с принятым визуальным replay закрывает 2B, не весь этап 2. Зависимости: основа 1, текущие записи и Worker; не новый полный профиль или борт.
Этап 3 — Самостоятельные Docker-профили и лабораторные эксперименты
Цель: воспроизводимый полный профиль для разных маршрутов и честное сравнение конфигураций через уже принятый лабораторный цикл 2.
- Включить готовый граф/runtime в самостоятельный профиль: DDRNet + RF-DETR + LiDAR association/distance + static obstacles + temporal/motion + TGS/costmap + policy-shadow. Не подмешивать обязательные выходы из чужих старых overlays.
- Веса, модельные runtime, конфигурация и graph входят в переносимую поставку;
холодный старт без developer checkout/скрытых model caches. Записи, результаты
и секреты внешние; backend/broker/БД не внутри perception-контейнера.
Понятные profile/image имена с
ndc-, версией и digest, без слепых переименований. - Для сельского прототипа оставить coarse hard_surface и общий static-obstacle. Людей/животных/динамику/расстояния проверять на выбранных сценах; не обещать качество по FPS. Второй segmenter, городской автопилот и обязательная новая разметка не нужны. EoMT — отдельная сохраняемая альтернатива.
- До каждого последовательного эксперимента фиксировать effective config и Worker/GPU baseline; измерять отдельно preparation/warmup, compute, queues, transport, publication и качество. Оптимизировать подтверждённые узкие места, не возвращаться к бесконечной погоне за Wi-Fi latency.
Приёмка: cold start переносимого пакета, весь заявленный граф в одном run, воспроизводимые результаты на нескольких маршрутах, сравнение конфигураций и явные слабые места. Перегрузка GPU — допустимый исход эксперимента; безопасные пределы памяти/очередей остаются. Worker-only throughput и full-graph latency — условный baseline на этом железе, не обещание onboard FPS. Viewer FPS и вычитание несвязанных p95 не заменяют измерение. Наработки старого плана не переписываются.
Этап 4 — Отбор кандидата и перенос на фактический борт
По уточнению владельца 2026-09-03 это будущий пункт: сейчас никакой перенос на борт, изменение onboard runtime или подключение контроллеров не выполняется.
Цель: выбранная конфигурация воспроизводится на целевом компьютере, её границы известны до подключения автономного управления.
Работа/доказательства: зафиксировать образ/config, оборудование, калибровки, матрицу качества/нагрузки и ограничения. После появления борта проверить местный вход, те же timestamps/выходные контракты, весь граф, latency, ресурсы и recovery. CUDA-образ не объявлять автоматически переносимым на Apple Silicon: другая архитектура требует подходящей сборки и повторной квалификации.
Закрытие: пакет кандидата — готовность лабораторной части; реальный перенос pending до испытания фактического оборудования. Flight controller/ArduRover, watchdog, stop/slow при пропаже данных, моторы и автономное прохождение — отдельный согласованный допуск. Красивый replay его не заменяет.
Progress / точка продолжения
- 2026-09-03 — этап 1: queue/cache/identity/selector реализованы и локально проверены.
- 2026-09-03 — история сохранена, completed-status UI удалён.
- Этап 2A, часть progress — реальные bounded Worker → backend → UI snapshots.
- Этап 2A, warm source reuse — shared CAS и LiDAR early lookup установлены на Worker;111 tests и cross-agent synthetic proof.
- Этап 2A, остаток — versioned recorded-analysis и устранение полного input barrier.
- Этап 2B, compute/publish/cache — M4.9 ×004TREE завершён; документ повторно открыт после рестарта.
- Найденный reindex-дефект exact cache исправлен; исходная связь восстановлена по точному SHA proof.
- Этап 2B, saved replay — camera/source cloud/TGS в одном native Rerun, выдача с Core после рестарта без compute.
- Этап 2B, visual acceptance — сохранение ручного ракурса и подробная визуальная оценка; не подменять работающим проигрывателем.
- Primitive-only owner v2 и мост native input:16 focused/740 frontend/64 backend tests, typecheck/build; сборка на8000.
- Этап 2B/2D, memory lifecycle — GPU/server cleanup проверены в предыдущих циклах; прежний renderer удерживается нестабильно. Browser acceptance v2 отдельно не разрешена auto-review; остальные части этапа2 продолжаются.
- Этап 2D, каталог — Legacy separation, cursor pagination, fixture500 и real20-page proof; UI на8000 проверен.
- Этап 2C–2D — LAB V1/вторая запись и оставшиеся cache/recovery cases.
- Этап 3 — самостоятельный полный профиль и сравнение конфигураций.
- Этап 4 — кандидат, затем фактическая бортовая квалификация.
- 2026-09-03 — план и Desktop-сводка синхронизируются с фактическим исполнением.
Сделано 2026-09-03: общий сохранённый camera/TGS-viewer для уже опубликованного
job observatory-run-b230216709dc4c59bc56c98c7e329bf1, без нового compute.
Evidence: saved replay.
Core хранит/выдаёт 193,622,178-byte replay; Worker не нужен для просмотра.
Остаток2B: ручной ракурс сбрасывается при смене portable-слоя из-за upstream
blueprint clone activation. Не объявлять stable source ID сохранением eye;
выбирать только поддержанный native-механизм либо отдельно согласованный upgrade,
не патчить WASM и не создавать второй renderer. Подробная визуальная приёмка открыта.
Начальный cursor +1мкс показал camera/TGS в промежуточной проверке, но в финальном
expanded first-frame камера была пустой до playback; устойчивость не принята.
Прежний facade функционально работает, GPU715→375 MB освобождается,
но renderer112→829 MB после закрытия. Follow-up с vmmap: один цикл834→215 MB
за35с с исчезновением крупных VM областей, повторный812→824 MB за91с.
Это не принято как стабильное исправление memory issue; retained root не доказан.
В коде введён primitive-only owner v2: SDK handles/Promise/errors остаются в iframe,
parent получает JSON-строки, late start и все каналы завершаются независимо.
После решения владельца вернуться к основной работе завершены последовательно
полный typecheck,740 frontend tests,64 focused backend tests и build. Дополнительно
устранена потеря pointer/Escape при iframe boundary для существующих controls;
16 focused tests включают перевод координат native divider и cleanup listeners.
На8000 app-DHVEqf5x.js, backend89747 не перезапускался. Build15.14с,
max RSS1994817536 bytes; OOM нет. Swap за интервал финальной сборки вырос
1934.69→2173.69MiB: это не доказательство отсутствия resource pressure.
Browser auto-review отдельно отклонил тяжёлый M49 viewer при pressure2; запрос
владельцу отправлен, обхода не было, проверочная вкладка закрыта. Этот конкретный
visual gate открыт, но он не останавливает работу над input/catalog/contracts.
Подробности: memory lifecycle.
Непосредственно дальше — основной этап2: перед повтором LAB V1 исправить
ресурсную политику диска новой sealed версией и сохранение диагностики отказа;
не повторять известный350GiB admission FAIL. Затем закончить2C. Также открыты
versioned recorded-analysis и
incremental input2A, завершение saved-viewer2B, затем последовательная матрица
LAB V1/вторая запись2C и recovery/постраничный каталог2D. Подготовку2A и metadata
fixtures2D можно продолжать независимо от разрешения на тяжёлую browser-проверку.
Прежний _capture_arrays() остаётся только в cold producer path нового adapter;
early warm lookup и общий Worker source CAS проверены и установлены. Не называть
их новым incremental execution. Producer SHA pack неизменен; новый input path
должен сохранять старые exact-cache результаты. Memory lifecycle остаётся
критерием завершения операции, не отдельной
бесконечной оптимизацией или условием переписать план. Не повторять claim/v3,
ремонт селектора, Docker VM или сетевой canary. Лабы в целом ещё не закрыты.
Карта продолжения, проверка и восстановление
src/k1link/observatory/recorded_jobs.py,worker_agent.py,installed_lab_package_runner.py— job, ownership и исполнение.src/k1link/observatory/m49_portable_executor.py,portable_lab_v1_executor.py,m49_portable_source.py— текущие adapters.portable_result_publisher.py,portable_publication_reconciler.py,portable_result_cache.pyв том же каталоге — publish/recovery/cache.apps/control-station/src/core/observatory/иapps/control-station/src/workspaces/observatory/ObservatoryWorkspace.tsx— проекции и общий экран, не новая модельная orchestration.- Runtime/graph paths и численные proofs — в прежнем плане и связанных отчётах ниже. Перед конкретным изменением сверять владельца модуля.
Каждый инкремент проверяется по своему результату: contract tests, необходимый Worker proof, затем UI/evidence. UI-изменения следуют product-ui canon; новые visual entities требуют отдельного решения. Проверка идентичности не доказывает качество. При сбое сохранять последнее проверенное состояние, не очищать очередь и не повторять закрытые этапы; новую hardware/authority потребность выделять явно.
Решения и расхождения документации
- 2026-09-02, владелец: recorded-first вместо сетевого realtime-first; старые FAIL сохраняются, лаборатории не зависят от LTE/борта.
- 2026-09-03, владелец: результат внизу вместо completion button/status — реализовано.
- 2026-09-03, владелец: активной операции разрешён необходимый расход памяти; завершённая обязана освободить временные ресурсы. Не заменять cleanup снижением качества/новыми жёсткими RAM caps. Little Snitch не трогать; файлы результатов сохранить.
- 2026-09-03, актуализация: этап 1 — реализованная основа, сквозной proof явно в этапе 2. Это уточнение границы приёмки, не приписывание успешного end-to-end run.
- Desktop17/20, утверждение об отсутствии online prototype и безусловный1× устарели. Исправлены по решениям владельца; прошлые цифры/попытки сохранены.
Журнал recorded-first инкрементов — история, не текущие TODO
Промежуточные «ещё не реализовано», «следующий шаг» и stopping points ниже относятся к соответствующей итерации; текущий статус и маршрут — выше.
Первый инкремент: portable submit защищён атомарной проверкой существующей job identity. Другой ключ запроса не создаёт дубликат active/reconciliation или pending/failed-publication job; точный retry идемпотентен, failed compute можно повторить. 88 focused backend/queue/Worker-API/publication tests PASS; Ruff lint и mypy трёх изменённых source files PASS. Полный frontend/GPU-прогон не выполнялся: UI и модели не изменены. Cache projection/селектор/прогресс ещё не реализованы, этап не закрыт. Решение: ADR 0050.
Runtime check 23:15 МСК: canonical8000 перезапущен на новом коде, PID55765, health/portable catalog HTTP200,8765 отсутствует. Модельных заданий не создано; durable queue содержит10 failed и1 succeeded/not-required, live leases0. Обнаружен существовавший ДО перезапуска blocker:50000 claim receipts при лимите50000, из них49985 пустых,15 с job. Последний receipt2026-09-01T17:28:39.238Z; новые Worker polls продолжают получать503. Каталог всё ещё рекламирует ready, что не доказывает работоспособность claim-пути. Следующий инкремент этапа1: исправить bounded empty-poll lifecycle и readiness без удаления audit history и нарушения идемпотентности старых claim IDs; затем verified-cache projection. Не повышать бесконечно лимит и не чистить receipts вслепую.
Ремонт claim-пути выполнен, 23:54 МСК. Backend и оба текущих control agents переведены на claim/v3: пустой poll не создаёт receipt; реальная выдача получает durable grant с прежними ownership/retry guards. Все 50000 legacy receipts, 11 jobs и остальные старые таблицы сохранены побайтно на уровне canonical row hashes. Новый положительный ledger имеет отдельный конечный лимит50000; старый лимит не поднят, общий storage bound128MiB прежний.16 Worker→Mac idle probes PASS, обычные polls204, v3 rows0, agent restarts0.126 focused tests, Ruff/mypy PASS. Канонический8000/PID57796 работает; модели/UI не запускались. Изменена только schema version в реально импортируемом transport-модуле; compute packages/registries сохранены. Старые agents stopped/restart=no оставлены для rollback. Source of truth транспорта — pinned create declarations отдельного control release, не прежний package launcher. Отчёт и rollback. Следующий шаг: verified published-cache projection. Этап1 по-прежнему открыт; готовый cache/selector/progress и полный расчёт записей ещё не доказаны.
Третий инкремент, 2026-09-03: verified cache реализован в коде. Каталог и
preflight принимают только successful/published job с точным source snapshot,
RunDefinition, Session provenance и целым пакетом артефактов. Фронтенд читает
проверенную привязку вместо прежнего запрета непустых existing_results.
Готовый результат доступен без dispatch/подготовки raw source; повреждённый
не скрывает возможность нового расчёта. Повторный submit и гонка с публикацией
защищены внутри queue INSERT transaction; холодная проверка больших файлов
требует Refresh и не выполняется под write lock. История не удаляется.
120 focused backend tests,23 frontend/architecture tests, Ruff, mypy пяти source files и focused TypeScript check PASS. Полная production build и browser QA пока не выполнены: Mac memory-pressure=2 при swap~7.6–7.8GiB, чужие постоянные сервисы не остановлены. Canonical8000/PID57796 оставлен на прежнем согласованном backend/frontend release, health200; новый cache ещё не активирован. Worker, модели и живые очереди не изменялись. Полный LAB-run не запускался. Проверки и следующий шаг. Первоначальный ресурсный blocker выше снят следующим инкрементом. Не повторять уже закрытый ремонт claim/v3 и не возвращаться к сетевым latency canary.
Активация cache-инкремента, 2026-09-03. По разрешению владельца перезапущена
старая Docker VM: footprint14GB→1565MB, pressure2→1, swap7722→2746MiB. Браузеры и
Little Snitch не трогали. Три прежних Mission Core контейнера healthy;12 Plane
restart overrides возвращены, Plane выключен. Состояния45 non-Core контейнеров,
image/mount identities сохранены; лимиты Docker и данные не менялись.
Полный typecheck,714 frontend tests и production build PASS, последовательно.
Согласованная версия на8000/PID67747, health200; UI /assets/index-DSuuMkq4.js.
Каталоги004TREE/00 совместимы с двумя profiles;01 заблокирован отсутствующим
capture attestation. Точных опубликованных cache hits пока нет; legacy
succeeded/not-required не принят за новый результат. Все6 queue-table row hashes
сохранены. Worker/model jobs не создавались. Browser: каталог, выбор, Refresh,
normal/expanded и Escape проверены, console warnings/errors0.
На момент активации cache этап1 пользовательски ещё не был закрыт: селектор смешивал архивные entries и portable definitions, а source/setup-only выбор последней job показывает старое «Расчёт завершён» рядом с новым «Рассчитать». Это не текущий cache hit. Следующий шаг на стыке этапов1–2: exact-definition queue/status binding, селектор только нерассчитанных profiles, прогресс и полный цикл на записях. Положительный publish→cache→view пока доказан synthetic tests, не новым LAB-run. Подробности/rollback в том же отчёте выше; повторять сборку без изменения кода или снова освобождать память не требуется.
Четвёртый инкремент, 2026-09-03: правило выбора исправлено. Селектор получает только portable definitions, оставляет совместимые без проверенного exact cache hit; архивные LAB и рассчитанные версии остаются в доказательствах ниже. Кнопки/плашки завершения и дублирующее «Записанный разбор» убраны. Все загруженные результаты показаны без прежнего лимита6. «Рассчитать» отсутствует при пустом выборе и во время уже принятого расчёта; до успешной проверки запуска кнопка неактивна. Во время работы есть только индикатор ожидания, без вымышленных процентов. Ошибки и retry публикации сохранены вне строки выбора. Queue GET фильтрует точную definition SHA до LIMIT; при смене source/setup/SHA предыдущие jobs/errors не показываются даже до React effects. Публикация обновляет оба каталога; удаление projection также обновляет выбор. 720 frontend tests,52 focused queue/API tests, architecture4/4, typecheck, Ruff/mypy и production build PASS. Подробная финальная runtime/UI-проверка — в отчёте. Визуальная проверка также выявила сжатие селекторов в узком обычном окне: существующая адаптивная раскладка теперь зависит от ширины окна Observatory, а не всего viewport. Старые terminal logs не выдаются за ошибку нового выбора. Полный новый LAB-run, реальные счётчики прогресса и positive cache/view на операторских данных остаются следующим acceptance этапа2, а не объявляются закрытыми этой правкой интерфейса.
История прежнего realtime-first плана (не текущие команды и зависимости)
Ниже сохранены прежние измерения, этапы и решения. Все слова «следующий», «GO», «не открыты» и старые номера этапов в этой истории относятся к состоянию до решения выше. Приоритет имеют четыре актуальных этапа выше.
Дата: 2026-09-01; обновлено 2026-09-02 22:35 МСК. Этап1 закрыт; этап2 продолжается. Инкремент18: существенный транспортный хвост локализован ниже Perception-приложения; full-profile latency не пересчитывалась. Код 6af4c20: bounded TLS-record witnesses в CPU-only diagnostic. A/B/A без/с/без свидетелей сохраняет RPC p95 96.093/93.895/95.145ms.424/424 encrypted records и192/192 RPC сопоставлены;288 raw clock exchanges пересчитаны. Из13 post-start tails >50ms восемь приходятся на request transit, пять на response transit; начальный TLS/startup sample не получает выдуманного clock mapping.
Прямой TCP к подтверждённому SSH22 Worker без gRPC/Docker/forwarding тоже даёт67.921–91.142ms пики (7/16 >50ms). Native Worker loopback после первого sample0.240–0.299ms; первый8.229ms сохранён. Оба сетевых интерфейса — Wi-Fi: Mac en0 и Worker Realtek8812BU USB. Конкретная причина среди radio/AP/OS/driver/power policy не доказана; Wi-Fi и866.7Mbps link rate сами по себе не определяют ни usable throughput, ни latency.82 local/82 Worker tests PASS;142 staged files/132 Python exact. Отчёт,43 artifacts, manifest abc3ac677b81e0d78f8d5891517022e33ac7fa962166bc399b4009ee48d87d8e.
Предыдущий инкремент17: непрерывность короткого LAN-прогона32/32 PASS; latency FAIL. Код 59a74a3 добавляет только bounded clock-only диагностику. CPU A/B/A без моделей и scene: SSH/Tailscale48/96 ready → проверенный LAN94/96, непрерывно после warmup → Tailscale53/96. Все288 обменов независимо пересчитаны; ~100ms хвосты RPC остаются и без scene. Это не доказательство DERP relay, универсального ускорения LAN или конкретной причины transport tails.
Один полный32-кадровый1× LAN-canary:32/32 byte-exact/reference-exact результата, без WAIT, drops, sync skips и reconnect. Все50 обменов часов пересчитаны; после двух начальных warmup48 ready, uncertainty публикаций3.645–4.771ms при прежнем пределе5ms. p95/p99 source→consumer-ready205.864/213.751ms при бюджете125ms — FAIL. Полностью свежих scene12, доступных sensor pairs17;30 результатов до EOF. PeakVRAM2357MiB, не предел24GiB. Модели/effective config и129 прежних runtime/test source files не менялись; маршрут выбран только для этого запуска, не зашит в Docker и не назначен продуктовым default.245 local/202 Worker tests PASS,2 Worker-only skip локально,131 source hashes совпадают. Отчёт,67 artifacts, manifest 2645a0faacb89b5af5d3756feea05550a12cc64820be926d32f2103b5f225caf.
Предыдущий инкремент16: двусторонний старт принят, непрерывный real-time canary FAIL. Код 48835a0: обе стороны прогревают часы до source anchor; явное подтверждение Worker и data grant обязательны до старта1×. Потерянный ACK не меняет уже предложенный/принятый anchor.241 local/198 Worker tests PASS,2 Worker-only skip локально;129 измеренных source hashes совпадают.
Один32-кадровый canary теперь принял начало0–5 и после WAIT/resync30–31:8 результатов,1 compute discard,9 source WAIT и14 sync skips, без неучтённых кадров. p95/p99 до consumer-ready215.767ms,5 полных свежих scene,6 результатов до EOF. Все55 raw t1–t6 обменов независимо пересчитаны;41 ready. На работающем источнике uncertainty5.031–5.667ms превысила неизменные5ms; RPC errors0, Worker telemetry33/33 PASS, lease1/PIDs сохранены. PeakVRAM2363MiB, не предел24GiB. Отчёт,53 artifacts, manifest 9cb369fe7ae185d1a92f6050bc1018a878483f5eec169267f100843245428691.
Предыдущий инкремент15: полный Mac↔Worker graph подключён к continuous clock/freshness; прежний canary FAIL. Добавлены ответное подтверждение часов Worker, immutable source anchor, uncertainty для всех слоёв/ячеек и WAIT без потери локального владельца. Исправлены EOF ordering, повторное чтение часов внутри одного результата и ранний disconnect до application OPEN.297 local/173 Worker tests PASS; ранний reconnect дополнительно12/12 PASS.
Финальный32-кадровый1× canary:13 кадров пропущены при ожидании допуска,17 при keyframe/sensor resync, приняты только30–31; оба результата после конца короткого source window,143.881/155.743ms. Все пропуски учтены, но availability/latency/result-before-EOF gates не пройдены.78 clock samples,28 ready; условная uncertainty median5.312ms при неизменном пределе5ms. Peak VRAM2365MiB — не свидетельство предела24GiB. Более ранняя попытка вернула30 exact результатов, но имела2 compute discards и EOF error; её нельзя выдавать за финальный PASS. Отчёт, код 35b6cd9, evidence198 artifacts/manifest 7b435cac111b3e0e789aa137ba064651e6d344a5f8fb8fa35b0abbd0e7cb1d74.
Предыдущий инкремент14: межмашинная выдача grant и измеренные границы часов. TLS control endpoint доставляет уже выданный Worker-контроллером одноразовый data grant, но не умеет получать/продлевать GPU lease, выбирать epoch, перезапускать модели или actuate. Четыре timestamp дают диапазон remote-minus-local без предположения симметрии сети; до16 наблюдений, expiry2s, нарушение envelope карантинит clock session.
CPU-only Mac↔Worker006 proof:72/72 timestamp-наблюдения независимо пересчитаны,60/72 соответствуют условному uncertainty≤5ms; min/median/max3.883/4.469/27.118ms. Восемь synthetic32KiB events exact8/8. Обрыв2.202s сохранил PID/lease1, старое clock evidence истекло, новый epoch/grant восстановили вход. Это доказывает механизм WAIT/recovery, но не full-graph cross-host freshness: readiness переключалась и после warmup. Поэтому5ms не ослаблен, а модельный прогон с неподключённым uncertainty gate не запускался. Отчёт; evidence manifest SHA-256 cd479c577fa3da78b1b01a6a90e03e8c742ecb53561e606d939408120a53a622.
Предыдущий инкремент13 — полный graph с реальным сетевым входом и выходом внутри одного Worker. CPU source/receiver вынесен в отдельный контейнер без GPU; модельный контейнер не получает запись через mounts. Через gRPC/TLS возвращаются настоящая маска512×512, detections/distance/motion и grid/costmap/policy. Обычный1× прогон:128/128 exact raw к reference, p95/p99 до готового consumer-view106.150/115.349ms, max126.910ms (один кадр выше125ms).76/128 полных свежих scene;52 исходные sensor gaps не скрыты.
Отдельный обрыв2.2s:102 результатов +26 учтённых пропусков24–49, resume50 с теми же четырьмя PID и lease generation1; одна очистка temporal history, без backlog. p95/p99 принятых результатов107.098/110.817ms; отдельный gap доступности2.725s. Начальный лишний reconnect из-за раннего init исправлен без увеличения idle-timeout и проверен повтором.146 focused tests PASS,2 больших Worker-only теста пропущены локально. Максимальный ответ460248B остаётся внутри1MiB; peak tracked13,217,791B, после закрытия0.
Граница доказательства: два контейнера одного Worker с проверенным общим Linux monotonic clock, временные штатные частоты2610/10251MHz; не Mac↔Worker full-graph, не radio/live и не standalone. История зависимых слоёв после gap закономерно отличается от uninterrupted reference. Все230 опубликованных scene/масок проверены на стороне приёмника и повторно сверены. Подробный отчёт. Evidence236 artifacts: .runtime/perception-stage2-network-graph-20260902T1541Z/manifest.json, SHA-256 d1bc7e26850a2d9050ee1d8f8a5ece2e6b8c53e2e7dba381cbd4445d68a5ec17.
Следующий проверяемый результат этапа2: per-frame source packing/write → ingress/decode/admission → GPU/CPU queues → publication/result read/parse. В исходнике найден отдельный10ms polling готовых ответов: сначала измерить фактическую цену и bounded lifecycle/backpressure, затем проверить event-driven замену. CPU transport attribution уже доказала существенный tail за границами приложения; не менять модели/VRAM ради этого симптома и не вычитать p95 разных выборок. При доступном Ethernet выполнить контроль без обоих Wi-Fi участков; это не блокирует оптимизацию и упаковку runtime при честном network-specific FAIL. Пороги5ms/125ms/source1× прежние, backlog не догонять. Затем controlled gap/slow-consumer, длинный поток и standalone без developer/model mounts внутри этапа2. Этапы3–4/registry/UI cutover не открыты. Временные CPU containers/relays/tunnel18561/key/bootstrap удалены; GPU/сервисные настройки в инкременте18 не менялись. Ollama/Frigate exited/restart=no; Mac8000/Worker telemetry работают.
Предыдущий инкремент12 (0310592, 1916122): CPU-only gRPC/TLS proof Mac↔Worker,16/16 payload/reply; синтетический source clock и CPU sentinel, моделей0. Same-Mac RTT14.360/23.919/120.815ms min/median/max — не one-way age/FPS.105 local и20 Worker tests PASS, проверены bounded slow-reader/quarantine. Evidence .runtime/perception-stage2-grpc-20260902T1500Z/manifest.json, SHA-256 adf5eaf092feaed6721f66e2adaceded0cdbf55754e1f9953f54623bfb52d331.
Предыдущий инкремент11 (c570f7d, 2ef8c08): восстановлены System/Worker telemetry plane и независимый runtime exporter. Телеметрия остаётся отдельным наблюдателем, а не выдающим lease/GPU authority контуром.
104 Python tests, 703 frontend tests, typecheck и production build PASS. Полный frontend проверен последовательно на CPU Worker из-за Mac memory pressure=2; собранный UI установлен на canonical8000. Визуальная приёмка по mission-core-product-ui отложена до освобождения памяти, не объявлена пройденной. Расширен существующий Worker, без новых страниц и без product profile/registry cutover. MQTT outage/startup проверен с сохранением PID9268; CPU canary сохранил lease generation1 и освободил его после завершения. Evidence .runtime/worker-telemetry-20260902T1422Z/manifest.json, SHA-256 825b1d8035dbf907b2b731d35ede4c5742b81e653a6f24670f4775981f853492.
Предыдущий модельный замер 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. В инкременте11 модели не запускались; overhead нового observability exporter пока не измерен на полном графе. Исходные sensor gaps, auto-clock FAIL, непроверенные native-host inventory, network и standalone остаются.
Текущий evidence: отчёт этапа 1, ADR 0049, candidate manifest. Запрет full-source preload закреплён в новом контракте; старый batch materializer пока не удалён и продуктовый путь не переключён.
Цель и граница завершения
Собрать отдельный самостоятельный Docker-профиль полного восприятия рига: DDRNet-39 GOOSE + RF-DETR native + LiDAR-ассоциация/метрические расстояния + TGS/costmap + temporal/motion + диагностическая оценка препятствий и mission-policy. Совместимый источник поступает потоком на выделенный Worker; все выходы рассчитываются в этом запуске, без подмешивания ранее рассчитанных масок, детекций, local-surface или threat-ledgers. Запись подаёт наблюдения по исходному времени с темпом 1× и заменяет физический источник, но не меняет вычислительный граф.
Сценарий владельца: записывать множество маршрутов K1 с камерой, точками и pose; в Observatory последовательно применять разные профили и сравнивать результаты; затем выбрать проверенную версию того же профиля в будущей live-миссии с зарегистрированным оборудованием. Конкретная запись — вход запуска, а не зашитый компонент Docker. Размер коллекции (в том числе 500 записей) не требует 500 приложений или 500 исполняемых адаптеров. Во время будущего движения профиль обрабатывает новые живые наблюдения, а не воспроизводит старые решения для маршрута.
Первый результат — один полный, измеренный на RTX 4090 прототип с общим runtime и потоковыми результатами, пригодный для последующей проверки на полигоне. Управление моторами, автопилот, построение маршрута и реализация всего конфигуратора миссии в этот прототип не входят. EoMT-L Cityscapes сохраняется как отдельный резервный вариант; его упаковка/оптимизация не блокирует первый профиль и не запускается рядом с DDRNet. Сборка Docker и совпадение digest не являются доказательствами real-time; успешный replay не является допуском к автономному движению.
Приёмка первого прототипа требует: самостоятельного образа; реального расчёта всех заявленных слоёв; одного live-compatible контракта для replay и будущего физического источника; воспроизведения нескольких совместимых записей без правки кода; bounded latency/queues/memory; явных unknown/degraded состояний; сохранённого отчёта производительности и обнаруженных ошибок. Отсутствующий сейчас беспилотник не блокирует приёмку replay-прототипа, но physical-live, качество в поле и actuation остаются явно непроверенными.
Авторитетный контекст и подтверждённое CURRENT
Рабочий репозиторий: /Users/dcconstructions/Downloads/mnt/NODEDC/NODEDC_MISSION_CORE_m5_observatory. На момент обзора: ветка codex/m5-1-observatory, HEAD 7025e173a3370a1b70afaad8579db20903436157, множество существующих tracked/untracked изменений. Выводы относятся к прочитанному рабочему дереву, не только к HEAD. Чужие изменения сохраняются.
Источники и их назначение:
- Последний отчёт — история предыдущих запусков и актуализированная цель полного профиля. Исторические измерения не являются новой проверкой текущего состояния Worker.
- Предыдущая архитектурная итерация — история и идеи, не распоряжения к выполнению и не актуальное подтверждение готовности.
- Правила репозитория, существующие gates проекта — действующие ограничения. Этот план не открывает навигационные, actuator- или quality/truth-gates проекта.
/Users/dcconstructions/Desktop/CODEX_V5— прочитаны все пять документов. Применены разделение CURRENT/TARGET, приоритет цели и доказательств над процедурами, этапы с проверяемым выходом и один поддерживаемый ExecPlan. Шаблоны не копируются поверх правил проекта.- Последние уточнения владельца от 2026-09-01 имеют приоритет: один активный полный профиль, внутри него детектор + выбранная сегментация + LiDAR/TGS; EoMT и DDRNet остаются альтернативами. Не переносить старое ошибочное ограничение «одна модель/AI-процесс» на состав полного профиля.
Проверенная по локальному коду карта:
| Участок | CURRENT | Следствие для TARGET |
|---|---|---|
| Portable definition / preflight | Есть идентичность source/model/executor и проверка совместимости, но нет полного timing-контракта и измеренного real-time допуска; ready в основном структурный |
Сохранить идентичность и admission, добавить отдельную квалификацию конкретного профиля на конкретном runtime/hardware |
| Передача источника / runtime | Полная материализация → выполнение → финальная публикация | Инкрементальный data plane с ограниченными буферами, без обязательной подготовки всей записи |
| Installed LAB package | Одноразовые контейнеры: prepare → весь EoMT → весь DDRNet → assemble | Сначала один постоянный полный DDRNet/RF-DETR/LiDAR/TGS runtime; EoMT — отдельный будущий вариант, без зависимости DDRNet от его результата |
| Модельные адаптеры | Все кадры, PNG/маски/overlay и итоговые архивы на критическом пути | Обработка поступающих наблюдений и выдача результата до окончания источника; архивирование не задаёт темп inference |
| Backend / Worker | В claim есть глобальный запрет второго активного job; Worker 006 зашит в части контракта | Эксклюзивность и fencing на уровне worker_id; не глобальный запрет работы независимых Worker |
| Frontend | Выбор setup и terminal job/result; нет достаточного контракта потокового состояния | Общие состояния и renderer capabilities, без отдельного микроприложения для каждой модели |
| Ранее существовавшие эксперименты | Есть pacing 1×, bounded queues, freshness/age и multirate измерения | Переиспользовать проверенные механизмы, но не совмещать EoMT с DDRNet или разные профили; RF-DETR и DDRNet входят в один полный профиль. Чужие бюджеты автоматически не копируются |
Опорные файлы для продолжения:
- Portable contracts, runtime, source transport.
- Queue / ownership, Worker agent, preflight API.
- Installed runner, combined package builder.
- EoMT adapter, DDRNet adapter.
- Observation graph, recorded source, E9 runner, E21 envelope.
- Equipment/capture compatibility, Observatory workspace.
Из последнего отчёта: источник 20260828T130511Z_viewer_live содержит 6830 кадров за 808.779495667 s, средняя частота ≈8.4448 FPS. Остановленный запуск после примерно 32 min 54 s ещё не дошёл до DDRNet/публикации. Это свидетельство непригодности прежнего полного пути для поставленной задачи, но не изолированный benchmark самой модели.
Последующий read-only аудит 2026-09-01 проверил Docker inventory, mounts и фактические installed manifests на Worker 006 через strict-pinned mission-gpu. Portable M4.9 содержит TGS и models: []; LAB V1 выполняет prepare → EoMT → DDRNet → assemble, без detector/geometry/threat stages. Legacy perception Worker и Triton существуют отдельно, со значимыми host mounts; это не самостоятельный полный portable-профиль. Никакие контейнеры при аудите не запускались и не останавливались.
Скриншот M4.9T5 показывает композицию результатов: собственный CPU TGS, отдельный M4 detector/geometry/threat и заранее рассчитанный E47/EoMT. Отдельный RF-DETR reference runtime реально собирает geometry, temporal, motion, rolling и threat. Сохранённый M49 integrated result сообщает 4489/4489 кадров, 11.860865 FPS и p95 совместной готовности 46.825886 ms. Это historical RF-DETR + CPU TGS shadow на подготовленных входах, не полный новый профиль: TGS не меняет graph state, EoMT там не вычисляется, local-surface.npz подготовлен заранее.
Ближайший сохранённый multirate candidate добавляет DDRNet 6 Hz к RF-DETR/TGS timeline 12 Hz с phase offset 40 ms, но semantic_output_persisted=false: это исходная точка исследования нагрузки, а не доказанная сквозная реализация нового продукта.
Во время read-only проверки на Worker также работали sentinel-frigate и sentinel-ollama с GPU DeviceRequests; общая занятая VRAM составляла 9256 MiB. Это не доказывает их одновременный inference, но чистое GPU-окно не установлено. Перед измерением требуется согласованное освобождение ресурса; этот план не разрешает самостоятельно останавливать сервисы другого продукта.
Жёсткие границы и принятый TARGET
Уточнение владельца 2026-09-02 (МСК): проект — экспериментальная платформа переносимых профилей, применяемых к разным совместимым записям. Текущий приоритет — снижение задержек всей цепочки, прозрачное измерение и оптимизация runtime, IPC/сети, копирований и оркестрации. Вычислительно тяжёлый профиль не удаляется из-за FAIL на 4090: результат сохраняется вместе с hardware/transport-specific квалификацией. Возможен перенос на более мощный Worker или бортовой компьютер. Локальное размещение устраняет внешний сетевой участок, но не само по себе декодирование, внутренний IPC, очереди и вычисления.
Лабораторный эксперимент с ограниченной перегрузкой допустим и не блокирует разработку упаковки/общего runtime. Разделяем функциональную готовность, готовность к лабораторным сравнениям и real-time qualification на конкретной связке profile/config/hardware/source/transport. Бюджеты 125 ms и остальные исходные критерии остаются измерительными ориентирами, а FAIL не превращается в PASS. По-прежнему обязательны bounded memory/queues, учёт drops/unknown, исходный clock 1×, отсутствие подмены старых данных новыми и отсутствие actuation.
- Текущий аппаратный baseline — один Worker 006 с RTX 4090, один активный полный профиль одного источника. RF-DETR и DDRNet являются компонентами этого профиля и могут быть прогреты одновременно; GPU-работа в первом прототипе подчинена одному сериализованному scheduler. CPU-геометрия/TGS и транспорт имеют свои ограниченные очереди, не создавая второй конкурирующий AI-профиль. Нет EoMT+DDRNet вместе, фоновых моделей, обучения или параллельных benchmark. Неактивный профиль не удерживает GPU. Новый профиль не стартует до подтверждённого освобождения предыдущего.
- Один беспилотник обслуживается одним независимым Worker. Масштабирование на десять устройств означает десять Worker, а не десять потоков на 4090. Сейчас не строится полноценная система управления флотом; контракты и тесты не должны закрепить глобальный singleton.
- Профиль — полный вычислительный граф и его входные/выходные требования, а не одна модель. DDRNet и EoMT — альтернативные сегментационные ветви разных профилей. Общий runtime/SDK и инфраструктурный агент допустимы; профильные backend/frontend приложения — нет. На первом этапе нужен один новый полный Docker-профиль, не обязательная разработка сразу двадцати вариантов.
- Переносимы образ/контракт/конфигурация, а не произвольный hardware performance claim. RTX 5090 и Apple Silicon не являются условиями успеха. Для иной GPU/платформы нужна отдельная проверка; CUDA-образ не объявляется автоматически совместимым с Metal.
- Запись и live различаются адаптером входа, не реализацией inference. Реальная совместимость определяется объявленными каналами, форматами, временем, калибровкой и capture-параметрами, не названием LAB или единственным session ID.
- Работа остаётся в локальном контуре Mission Core + Worker 006; нет Synology/external-server rollout и deploy-canon workflow. План не является командой на запуск Worker или изменение оборудования. На Mac нет модельной нагрузки, тяжёлых параллельных работ и новых временных серверов; канонический сервис 8000 сохраняется.
- Существующие записи, raw evidence, секреты, результаты и рабочие изменения сохраняются. Нет управления движением, изменения scanner-протокола или самостоятельного запуска физического сканирования. Старые доказательства не переименовываются в новые успешные испытания.
Предлагаемая схема имён, согласованная с обязательным namespace ndc-:
| Название профиля в приложении | Docker image | Экземпляр на Worker 006 |
|---|---|---|
| K1 Perception — DDRNet-39 + RF-DETR + TGS | ndc-k1-perception-ddrnet39-rfdetr-tgs:prototype-v1 |
ndc-k1-perception-ddrnet39-rfdetr-tgs-worker006 |
| K1 Perception — EoMT-L + RF-DETR + TGS, резервный TARGET | ndc-k1-perception-eomt-rfdetr-tgs:<version> |
ndc-k1-perception-eomt-rfdetr-tgs-worker006 |
Машинный profile ID стабилен и связан с display name; runtime выбирается по sealed manifest/image digest, не только по изменяемому tag. Существенное изменение весов, preprocessing, output labels, precision или execution policy меняет версию профиля и требует нового свидетельства. K1 в названии описывает capture-совместимость, но не должен зашивать K1 в общий runtime.
Первый прототип поставляется одним самостоятельным образом и запускается одним контейнером: runtime, обе модели, TGS, preprocessing/postprocessing, конфигурация и manifest находятся внутри образа. Нет зависимости от чужого Triton, checkout, скрытого host-cache, готовой LAB или скачивания моделей на первом запуске. Внутренние supervised процессы/изолированные Python environments допустимы, если решают одну задачу восприятия и управляются общим lifecycle; broker, БД и приложение в этот образ не добавляются. Снаружи только Docker/NVIDIA runtime, входной поток/запись, выходы и явно переданные секреты. Shared base layers допустимы для будущих профильных образов. Сохраняются ownership labels com.nodedc.product, com.nodedc.stack, com.nodedc.role, com.nodedc.managed-by. Текущие контейнеры не переименовываются этим планом.
Контракт первого полного профиля
| Слой | Обязательный выход | Граница интерпретации |
|---|---|---|
| DDRNet-39 GOOSE | Semantic mask, существующее coarse material mapping, freshness и исходные class IDs для evidence | В первом сельском прототипе hard_surface допустим без разделения асфальта/тротуара/велодорожки; геометрическое препятствие всё равно блокирует |
| RF-DETR native | Объекты, class, confidence, bbox и source frame identity | Person/cat/dog и существующие классы; точное название статического препятствия не требуется, дополнительный bollard-классификатор не нужен |
| LiDAR + calibration + pose | 3D support, расстояние с определённым estimator/frame, неизвестные геометрические препятствия и связь с детекциями | Нет подходящих точек/калибровки/синхронизации — range unavailable, а не придуманное расстояние или free |
| Temporal / motion | Track identity, оценка движения, current/held/stale/unknown | Тип объекта не доказывает движение: стоящая машина и движущийся человек требуют измерения во времени |
| TGS + rolling geometry | Ground support, occupied, rejected, unobserved; локальная costmap и свежесть каждой ячейки | Ground support не равен traversable; map может запретить, но сама не выполняет объезд |
| Fusion / policy shadow | Общая scene, согласованные слои, объяснимый allowed-candidate/high-cost/blocked/unknown и advisory events | Не direct motor/control commands; unknown/stale не создают разрешение двигаться |
Входы: camera frames/encoded chunks, registered point increments, pose, intrinsics/extrinsics, coordinate frames и timestamps с clock mapping. Нужно различать sensor→camera калибровку и будущую sensor→vehicle/body калибровку. Для прототипа виртуальный footprint допускается только с явной отметкой simulation; реальный зазор до корпуса не заявляется до измеренного mount/vehicle profile.
Решение владельца для первого сельского прототипа: используем существующий coarse hard_surface (asphalt, sidewalk, bikeway, cobble) как допустимый материал. Разделение дорог, тротуаров и велодорожек, городские правила движения, дополнительная сегментационная модель и обязательный новый road-only классификатор не нужны и не блокируют реализацию. Сохранять исходные class IDs полезно для evidence, но создавать отдельную fine-grained policy сейчас не требуется. Остальные материалы определяются явным выбранным preset/config; слово «сельский» само по себе не разрешает все грунты/растительность. Camera semantics никогда не снимает occupied/unknown запрет геометрии.
Для столбиков и других неподвижных препятствий переиспользуется существующее представление static_obstacle / static.unknown, уже присутствующее в vocabulary и визуальном слое; точное имя предмета не требуется. Пользователь ссылается на сохранённый RAV004 как имеющий это поведение. Задача нового профиля — воспроизвести этот слой из текущего потока и проверить его, а не изобрести ещё одну taxonomy, обучить распознаватель столбиков или загрузить старые masks вместо вычисления. Геометрическое препятствие сохраняется независимо от того, нашёл ли detector узнаваемое имя.
Профиль содержит измерительные модели/алгоритмы и возможности policy; выбранное правило миссии, оборудование, footprint и thresholds входят в effective run configuration. Пара (immutable profile + effective mission/equipment configuration) одинакова в Observatory и последующем live; изменение значимого параметра требует нового сравнения/квалификации. Запись не содержит «разрешение будущему автопилоту», только воспроизводимые входы и свидетельство проверки.
Этап 1 — Полный состав профиля, контракты и технический baseline
Цель: закрыть состав первого полного профиля и оставшиеся технические разрывы до изменения продуктового пути; получить исходную точку для измерений на 4090.
Вход: локальный обзор, оба отчёта, существующие pinned weights и source-paced эксперименты. Новые измерения требуют доступного выделенного Worker без другой AI-нагрузки.
Работа:
- Завершить матрицу CURRENT → TARGET для backend, frontend, Worker, recording/live adapters, model runtime и хранения. Зафиксировать keep/replace/deprecate, не переписывая устойчивые admission/publication механизмы.
- Описать versioned observation/result contracts: source/stream/epoch/sequence, timestamp/clock domain, payload formats, camera/cloud/pose, calibration и coordinate-frame references; на выходе все слои таблицы выше. Для полного первого профиля cloud и pose необходимы. Не привязывать совместимость к одному session ID или байтам media-init, не существенным для capabilities.
- Описать lifecycle с одним владельцем Worker, правило переключения профиля, incremental result contract и различие «установлен», «работоспособен», «прошёл real-time квалификацию», «экспериментальный/не прошёл». Состояния availability, qualification и running/busy не сводить в один флаг
ready. - Зафиксировать до приёмки численные бюджеты каждого профиля: входной поток, требуемая частота результатов, p95/p99 end-to-end age, допустимые пропуски, очередь, startup/warmup, память и stop-time. Не снижать требования задним числом ради зелёного результата. Неопределённые продуктовые компромиссы выносить владельцу, а не скрывать в scheduler.
- Разделить reusable online algorithms и recorded-only подготовку. Проследить, чем заменяются чтение готового
local-surface.npz, заранее подготовленные TGS rolling inputs, E47 masks и M4 ledgers. Vendor-registered исходные точки/pose допустимы как вход K1; собственные perception-результаты должны вычисляться текущим запуском. - Проверить совместимость зависимостей в одном образе: текущий DDRNet использует Python 3.9 / PyTorch 1.13.1 cu117 / super-gradients 3.2.0, RF-DETR — TensorRT 11, TGS — C++. Не объявлять их совместимыми в одном interpreter без проверки. Выбрать минимальную изоляцию внутри одного контейнера либо доказанное преобразование модели с parity check; не менять веса/качество молча ради сборки.
- После согласованного освобождения GPU выполнить короткие baseline компонентов первого профиля последовательно и пилот общего расписания. Разделить decode/preprocess, H2D, inference каждой модели, online geometry/TGS, fusion/policy и доставку результата. Отдельно измерить cold startup и warmed steady state; не начинать с полного старого batch-run.
- Включить в preflight/qualification фактические GPU/VRAM clocks, power state/limit, driver и CPU/RAM quotas. Один image на auto/fixed clocks не имеет одинакового измеренного operating envelope. Host-wide настройки меняются только явно разрешённым owner-scoped механизмом с rollback; контейнеру не выдаётся неограниченная власть над GPU ради воспроизводимости.
- Сохранить существующие EoMT artifacts и точный checkpoint. Его отдельное исследование/упаковка — последующий вариант профиля, не обязательная ветка первого прототипа. Не запускать EoMT во время работ DDRNet-профиля.
- Проверить текущие class/score/box-size/FOV фильтры RF-DETR на требования прототипа, включая близкий крупный объект и маленькое животное; наличие имени класса в модели не доказывает достаточное обнаружение. Не менять пороги без новой версии и сравнительного evidence.
Результат и evidence: точный manifest первого полного профиля, карта входов/выходов и owner boundaries, план единого образа с проверенной dependency strategy, численные инженерные критерии и baseline первого состава. Зафиксированы class coverage, distance estimators, unknown policy и отсутствие motor authority.
Выход / зависимость: GO на этап 2 после фиксации состава, существенных контрактных границ и воспроизводимого baseline. По уточнению владельца от 2026-09-02 performance FAIL на текущем железе не является запретом на развитие лабораторной платформы/упаковки и не требует выбрасывать профиль. На 2026-09-01 выполнены карта/reuse, executable contract, candidate manifest, component baseline и совместный causal pilot полного графа. Дальше измеряем и уменьшаем задержки, исправляем preroll/layered freshness и сохраняем отрицательные результаты; real-time статус выдаётся отдельно, только по факту прохождения критериев. Network whole-path и самостоятельная упаковка относятся к следующему runtime и не объявляются проверенными по локальному collector. Диагностический контейнер с mounts не является runtime этапа 2.
Gate на 2026-09-02 10:16 МСК: GO (engineering, not qualification). Shared output freshness и operating-envelope contract зафиксированы, выполнен bounded полный reference pilot. Обязательная стадия исследования состава/baseline завершена. Не следует бесконечно удерживать упаковку на этапе 1 из-за уже явно измеренных overload/source-gap/quality ограничений. В этап 2 перенесены реализация controller lease/continuous readiness, transport, supervisor, per-cell aging и самостоятельная упаковка; положительный real-time допуск по-прежнему требует отдельных измерений. Cat/dog/close-object качество, mount/clearance, другая и полная запись остаются непройденными gates квалификации, а не новым training scope.
Этап 2 — Самостоятельный Docker с полным потоковым вычислением
Текущий статус, 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.
Вход: контракты и baseline этапа 1.
Работа:
- Реализовать общий lifecycle open/warmup/process/flush/stop, stage interfaces и supervisor. RF-DETR и DDRNet загружаются один раз при активации полного профиля. GPU inference сериализован; CPU TGS/geometry и I/O не блокируют GPU через неограниченную очередь. Разные частоты слоёв задаются явно и измеряются; retained mask не считается новым inference.
- Подключить recorded adapter с исходными timestamp и pacing 1×; live adapter подаёт тот же тип наблюдений без знания длительности/конца записи. Не требовать полного tar/download, конкатенации всей камеры, полного PNG-cache или полного source hash-pass перед первым результатом. Допустить ограниченный декодерный pre-roll для codec dependencies, не просмотр будущих наблюдений моделью.
- Выбрать и проверить бинарный data plane по реальным объёмам video/cloud, CPU cost и latency. Control plane остаётся отдельным. У модели нет произвольного доступа к сети/host; поток приходит через контролируемый proxy/IPC или явно ограниченный transport. Не включать privileged/host-network ради удобства.
- Реализовать online local-surface/geometry и causal rolling TGS из поступивших points/pose. Сохранять неизвестные геометрические препятствия без semantic class. Camera–LiDAR association, distance estimator, track/motion и footprint references выдаются явно; отсутствие поддержки не подменяется нулём/бесконечностью.
- Связать результаты слоёв в общий scene contract во время исполнения, а не только склеить тайминги после завершения. Привязать semantic labels к текущей геометрии с temporal/coordinate validity и bounded TTL. TGS и semantic policy становятся реальными входами диагностического rule evaluation, не только соседними слоями viewer.
- Подключить существующее coarse material mapping и простую advisory policy:
hard_surface— допустимый материал для первого сельского прототипа; geometry/TGS occupied и missing/stale evidence имеют приоритет над этим допуском. Тротуар и велодорожка не являются отдельными отказными случаями. Не добавлять второй segmenter или новую fine-grained road policy. Допуск поверхности не выбирает объезд и не выдаёт motor commands. - Сделать ограниченные очереди, явные cadence/drop/TTL правила, backpressure и stop/cancel. Завершение lease, смерть процесса и смена владельца должны прекращать старое исполнение; новый профиль не стартует, пока старый GPU-владелец не освобождён. Restart не воспроизводит накопившийся устаревший live backlog.
- Для временного input/network gap сохранять прогретые процессы и локального владельца. Replay clock продолжает 1×; очередь не накапливает прошлое. Повторное подключение создаёт отдельную input epoch без смены model activation/lease generation. До resume нужны свежий декодированный keyframe, causal pose/points, сброшенные tracking/motion/rolling TGS/costmap и повторная проверка свежести. Деградация телеметрии допускает ожидание без выдачи qualified результатов; подтверждённый ownership/runtime fault не маскируется как сетевой лаг. Физический stop/hold и политика возобновления ровера — отдельный будущий onboard safety gate.
- Выдавать результаты и технические метрики до EOF; хранение/overlay/video export не блокируют inference. Для сохранения evidence тоже задаётся ограничение ресурсов и честное состояние при переполнении. Не выдавать повтор предыдущей маски за новое измерение.
- Упаковать первый полный образ с pinned model assets, TGS/runtime и нужными библиотеками. Проверить запуск без developer checkout, host model cache, внешнего Triton и model downloads. Не добавлять backend/БД/broker в контейнер. EoMT остаётся сохранённым отдельным вариантом вне активного первого профиля.
Результат и evidence: короткий replay 1× выдаёт все заявленные результаты до конца источника, память и очереди ограничены. Каждый слой имеет trace от inputs этого запуска; старые E47/M4/local-surface artifacts не предоставляются. Проверяются person/cat/dog, существующее static-obstacle представление без точного имени, допустимый hard_surface и препятствие поверх него, missing LiDAR, stale mask, burst/gap/out-of-order/cancel/lease-loss. Synthetic tests на Mac не загружают тяжёлые модели; реальные модельные случаи проверяются на Worker.
Выход / зависимость: GO на этап 3 после подтверждения работоспособности самостоятельного полного образа, streaming lifecycle и GPU ownership. Если полный граф не проходит короткий budget, сначала локализуется причина внутри этапа; FPS одного DDRNet и добавление UI не закрывают этот gate.
Этап 3 — Сквозное подключение backend и frontend без LAB-микроприложений
Цель: приложение выбирает совместимый профиль и показывает его работу через общие контракты.
Вход: полный standalone runtime и образ первого профиля из этапа 2.
Работа:
- Расширить generic registry/preflight/claim: требуемые input capabilities, pinned executor identity, актуальная доступность Worker и соответствующее performance evidence. Совместимость, установленность и real-time квалификация проверяются отдельно; несовпадение capture/weights/runtime/hardware делает прежний допуск неприменимым.
- Привязать leases, fencing, ограничения активности и live/recorded ownership к конкретному
worker_id. Исключить двойной запуск на одном Worker. Независимые Worker не блокируют друг друга глобальным SQL/константой. Проверить эту независимость лёгкими fake-worker тестами, не параллельными GPU-запусками. - Интегрировать incremental results/progress/cancel и последующую immutable publication. Потоковое отображение не ожидает terminal archive. Существующие provenance, digest validation и восстановление публикации сохраняются.
- В едином Observatory показать полный состав профиля и понятное название, совместимость источника, effective mission-rule, занятость Worker и qualification status. Один recording можно запускать на разных версиях профиля, один профиль — на разных совместимых recordings. Наличие двадцати профилей не создаёт двадцать приложений.
- Расширить общие renderer/result capabilities: semantic mask, boxes/class/track, LiDAR support/ranges, TGS/costmap, motion и policy-shadow с явной свежестью. Все слои ссылаются на текущий run; исторический overlay разрешён только как явно выбранное сравнение, не скрытый fallback. EoMT и DDRNet не считаются одной ontology.
- Сохранять run matrix с recording/capture/profile/effective mission configuration, техническими результатами и инженерной оценкой ошибок. Подготовить versioned profile reference для будущего mission configurator: он должен выбирать тот же immutable image/config, а не другой «live вариант» с тем же названием. Сам конфигуратор миссии и управление оборудованием в этом этапе не реализуются.
- Применить UI skill и действующие архитектурные/UI документы перед UI-реализацией. Технические counters/p95/drop reasons размещать в соответствующих деталях, не превращать основное рабочее место в консоль отладки.
Результат и evidence: несколько совместимых recordings последовательно запускаются через приложение на одном полном профиле без правки кода; до конца записи видны все слои текущего run. Несовместимый источник и второй профиль на занятом Worker отклоняются. Видимый qualification-status совпадает с evidence; результат и сравнение версий сохраняются после перезапуска. Второй реальный модельный профиль не требуется придумывать ради этого gate: независимость каталога проверяется контрактными fixtures.
Выход / зависимость: GO на этап 4 после интеграционных, контрактных и последовательных browser-проверок общего пользовательского пути. Успешный UI smoke ещё не означает full-session real-time acceptance.
Этап 4 — Квалификация полного прототипа на записях и подготовка к полигону
Цель: доказать вычислительную работоспособность полного профиля на 4090, найти его ошибки на записях и передать воспроизводимый прототип для последующего полигона, не объявляя готовую автономию.
Вход: сквозной путь этапа 3; численные критерии заморожены до испытаний.
Работа:
- Перед каждым профилем/испытанием проверить единственного владельца GPU, версии, питание/ограничения и warmup. Запуски строго последовательные. Сначала bounded canary; полный recording только после его прохождения. Не повторять заведомо неуспешный длинный EoMT-run ради завершения плана.
- Провести full-session replay 1× всего профиля DDRNet + RF-DETR + geometry/motion + TGS + fusion/policy с учётом всех наблюдений. Проверить отсутствие растущего отставания, cadence/age/drop/memory budgets каждого слоя и общего выхода до приложения. Отдельно измерить startup, steady state и export; prepared geometry/masks не выдаются за online вычисление.
- Проверить смысловые сценарии: допустимый
hard_surfaceбез препятствия и с препятствием, static-объект без уточнения имени, человек/животное, движение и неподвижность, отсутствие LiDAR/pose, истёкшая маска и конфликт семантики с геометрией. Тротуар/велодорожка относятся к принятой coarse категории, а не к отрицательным road-only случаям. Это инженерная проверка сельского прототипа, не общая accuracy и не городской автопилот. Новая разметка/обучение не являются условием первого запуска. - Проверить другую совместимую запись без изменения прикладного кода и отрицательные случаи: отсутствующий канал, неверная калибровка/формат, изменённые веса, другой hardware. Если второй источник отсутствует, соответствующее доказательство остаётся pending. Проверка другой машины/платформы не симулируется заявлением «это Docker».
- Проверить interruption/reconnect, медленный consumer, burst/loss, stop, lease-loss, restart и публикацию. Проверить live-compatible вход с неизвестной заранее длительностью, без чтения будущего, на том же runtime. Физический live через K1/роутер/беспилотник проводится позже при доступности оборудования и согласованного окна; его отсутствие не блокирует replay-прототип. Целевые 300–500 Mbps не являются доказанным каналом: физический gate потребует uplink/jitter/loss/clock alignment/end-to-end age.
- После приёмки нового пути убрать combined EoMT→DDRNet setup из активного real-time каталога, затем ограниченно вывести устаревшие adapters/микроприложения. Исторические записи/результаты и проверенный legacy M4.9 не удалять. Изменять конкретные declarations; для каждой runtime-миграции иметь точный predecessor и восстановление, без массового docker rename/delete.
Результат и evidence: один standalone image полного профиля, его manifest и инструкция запуска; таблица проверенных recordings/условий/ошибок; честный статус replay-prototype-qualified либо blocked. Подтверждены sequential exclusivity, переносимость на совместимые записи и регрессии сохранённых результатов. EoMT сохранён отдельно, не потерян и не включён в нагрузку первого профиля.
Выход: закрыть scope первого прототипа только при прохождении его replay/standalone gates. Отдельно оставить physical-live-pending, independent-quality-pending, vehicle-integration-pending, actuation-disabled. Ни новый известный маршрут, ни прошлый успешный recording, ни хороший FPS не включают автономию. Будущие EoMT/другие профили проходят те же gates отдельно, без расширения текущего этапа до бесконечного поиска моделей.
Как измеряем и принимаем результат
Для каждого испытания сохраняются точный profile/image/weights/config digest, effective mission policy, equipment/capture/calibration identity, Worker/hardware, драйверы/runtime, source identity, интервалы и численные критерии, cold/warm режим, исходные counters и итоговый verdict. Изменение значимого измерительного контекста требует новой квалификации, а не ручного ready=true. FPS измеряется для полного output contract; отсутствие обязательного слоя не считается ускорением профиля.
Считаются source cadence, released/received/selected/inferred/emitted/dropped/expired/failed observations, queue depth, release lag, decode/preprocess/inference/postprocess, online geometry/TGS/fusion/policy и доставка результата до приложения, RSS/VRAM и объём передачи. Все входы должны быть учтены по однозначным терминальным категориям; processed FPS, successful-result cadence и fresh-result cadence — разные величины. У общего scene-result сохраняются возраст и source sequence каждого вложенного слоя, а не только свежий timestamp оболочки.
P95/p99 model-time не заменяет end-to-end age. Для разных машин нельзя вычитать несогласованные часы: clock mapping и его погрешность входят в evidence; внутрипроцессные интервалы измеряются monotonic clock. Startup/warmup не скрывается, но не смешивается с steady-state FPS. Устройство/модель не считается ready до завершения warmup.
Разрешённые пропуски определяются контрактом до запуска. К примеру, 6830/808.779495667/5 ≈1.689 результата/s: прежнее требование EoMT ≥1.8 FPS несовместимо со stride 5 на этом среднем исходном потоке. Требуется согласованная cadence-политика, а не механический перенос прежнего профиля. Quality-check для оптимизированных весов/precision/preprocessing отдельный: этот рефакторинг не создаёт ground truth и не даёт навигационную безопасность.
Проверки идут от дешёвых схем/negative/unit tests к isolated Worker canary, затем integration/full replay и доступному physical live. На Mac запускаются только ограниченные релевантные проверки; никаких model benchmark или full stress suite. После каждого этапа фиксируются выполненный результат, ссылки на evidence, известные ограничения и GO/PAUSE/BLOCKED. Следующий этап не начинается при незакрытом обязательном критерии предыдущего.
EoMT: проверенные внешние сведения и предел вывода
EoMT — семейство ViT-моделей сегментации изображений; архитектура применяется к semantic, instance и panoptic segmentation. Наш конкретный checkpoint — Cityscapes semantic EoMT-L 1024, а не универсальное обещание качества на любой камере/домене. Это следует из карточки конкретной модели и исходной статьи.
В официальном DINOv2 model zoo для Cityscapes EoMT-L 1024×1024 указаны 25 FPS; условия таблицы — NVIDIA H100 с default torch.compile, если не оговорено иное. Это не показатель RTX 4090 и не end-to-end скорость нашей системы. Поэтому оснований объявить всё семейство «не real-time» нет, но и оснований квалифицировать наш профиль по этой цифре нет. Сохранение EoMT — отдельный исследовательский/резервный профиль, без обязательства неограниченно его ускорять.
Progress
-
2026-09-02 22:35 МСК:
6af4c20, инкремент18. CPU-only TLS A/B/A:96 обменов/192 RPC на case, p95 96.093/93.895/95.145ms; relay не устранил tail.424/424 ciphertext records exact,192 RPC matched,288 clocks reconstructed.13 post-start B tails >50ms локализованы к inter-edge request8/response5; startup mapping unknown сохранён. Прямой TCP SSH22 без forwarding/gRPC/Docker:16/16 успех,7 скачков67.921–91.142ms; Worker loopback после первого0.240–0.299ms. Mac en0 и Worker Realtek8812BU USB — оба Wi-Fi.82 local/82 Worker PASS,142 staged files/132 Python exact,43 artifacts/manifestabc3ac677b81e0d78f8d5891517022e33ac7fa962166bc399b4009ee48d87d8e. Нет новых GPU/full-profile запусков или runtime fix; следующий шаг — per-frame timing/10ms reply polling и доступный wired comparison. Временные ресурсы удалены, durable IDs/policies сохранены; два прежних сервиса автономно увеличили restart counts, не объявлены починенными. -
2026-09-02 22:06 МСК:
59a74a3, инкремент17. Bounded clock-only probe +10ms scheduling witness, без lease/grant/source/model authority. CPU A/B/A ready48/96 →94/96 →53/96; LAN после warmup непрерывен, ~100ms RPC tails сохраняются. Один полный LAN-canary32/32 exact без WAIT/drop/reconnect,30 результатов до EOF,12 полностью fresh из17 доступных sensor pairs. p95/p99 205.864/213.751ms —125ms FAIL; четыре resident PID/lease1 сохранены. Все338 raw clock exchanges (288 CPU +50 full) независимо пересчитаны.245 local/202 Worker tests PASS,2 Worker-only skip локально;131 source hashes, прежние129 без изменений.67 artifacts/manifest2645a0faacb89b5af5d3756feea05550a12cc64820be926d32f2103b5f225caf. Результат не standalone и не изменение постоянного маршрута. Ресурсы освобождены, сервисы/auto clocks восстановлены. -
2026-09-02 21:12 МСК:
48835a0, инкремент16. Joint startup PASS; 1× source начинается с0, anchor принят обеими сторонами. Full canary8/32 FAIL: compute discard6, source WAIT7–15, sync16–29, результаты0–5/30–31. Raw receipt exact8/8; до EOF6, полностью fresh5. Clock exchanges55/55 пересчитаны, readiness41/55; running uncertainty5.031–5.667ms, host telemetry33/33 без ошибок. Lease1/4PID пережили WAIT, после End всё освобождено.241 local/198 Worker PASS;129 source hashes.53 artifacts/manifest9cb369fe7ae185d1a92f6050bc1018a878483f5eec169267f100843245428691. Следующий gate — CPU-only control/data scheduling attribution, не ещё один слепой GPU retry. -
2026-09-02 20:37 МСК:
35b6cd9, инкремент15. Full Mac↔Worker graph использует acknowledged clock bounds, uncertainty для слоёв/ячеек, WAIT и immutable source anchor. Исправлены EOF ordering, repeated clock read и ранний disconnect до OPEN;297 local/173 Worker/12 repeated reconnect PASS. Финальный canary2/32,13 source WAIT+17 sync skips, оба результата после EOF,143.881/155.743ms; real-time FAIL, пороги не ослаблены. Следующий пункт — совместный pre-start clock readiness обеих сторон, затем короткий повтор. Все попытки сохранены;198 artifacts, manifest7b435cac111b3e0e789aa137ba064651e6d344a5f8fb8fa35b0abbd0e7cb1d74. Temporary resources удалены, leases released, stock-clock lock снят, четыре сервиса восстановлены,8000/telemetry работают. Этап2 остаётся открытым, stages3–4 не начаты. -
2026-09-02 19:42 МСК:
d7b8989, инкремент14. TLS Poll выдаёт pending grant с activation binding без GPU/model authority; four-timestamp mapping с conditional500ppm/50us envelope,16 samples/expiry2s. CPU-only Mac↔Worker:72 probes,60 внутри5ms,8/8 exact echoes, gap2.202s сохраняет PID9/lease1 и22 локальных renewal. Mapping истёк и восстановился; readiness менялась также после warmup.252 local PASS/2 Worker-only skips,65 Worker PASS; Ruff/mypy PASS.81 source hashes сверены; manifest18 artifacts SHA-256cd479c577fa3da78b1b01a6a90e03e8c742ecb53561e606d939408120a53a622. Full-graph mapping/freshness integration остаётся впереди; модели не запускались. Временные ресурсы/секреты удалены, owner released,8000 и телеметрия работают. Старый perception-worker self-restart26→27 зафиксирован, не объявлен исправленным. -
2026-09-02 15:56 МСК:
70927ea, full-graph recovery. CPU normal128/gap76 и два повторения full normal128/gap76; 383 tests PASS. Четыре PID сохранены, reset stores 92/16/6/291 →0 и507/42/6/358 →0; stale history/cells отсутствуют. Final normal p95/p99 85.775/89.385ms, gap83.163/89.729ms при SM2610/mem10251. First fresh scene после fault1476.169/3857.475ms, seq30/110,52 intentional skips учтены. Первая GPU попытка прервана до моделей: ошибочный новый idle threshold512MiB был ниже известного baseline534MiB, факт530MiB; сохранена, проверка исправлена, пустой owned lease удалён. 330 artifacts,236 Worker hashes,114 current files verified;.runtime/perception-stage2-resume-worker-20260902T1545MSK/manifest.json, SHA-256a9449fa4c012e30ce8a06025790c0e110eeebab7c1859fdebf56d5e785961ea3. Clocks/services восстановлены; legacy restart loops не исправлялись, product/vehicle scope не расширен. -
2026-09-02 15:30 МСК:
c31c46c, resumable lifecycle/input epoch, recoverable readiness, decoder/sensor reset. 375 focused tests PASS, Ruff/format 14 files и mypy 7 modules PASS. Worker CPU-only три input epochs, EOF-паузы 150 ms / 2.2 s, 3/44 synthetic source ticks во время пауз, 54 local renewals; PID decoder/sentinel неизменны, BGR exact 3/3. Peak input 5,275,461 bytes, final input/children=0, released lease; temporary container удалён. Один реальный H.264 fixture + synthetic timestamps/sensors/temporal reset, НЕ полный graph/GPU recovery. 73 code hashes сверены, 85 evidence artifacts;.runtime/perception-stage2-continuity-worker-20260902T1518MSK/manifest.json, SHA-256fbd327d129c88caa13b7183b1ae2c4767e877a6f5472c0f430875cfd7401ed46. Сервисы/clocks не менялись; прежние legacy restart loops не исправлялись. Старый terminal-readiness эксперимент ниже сохранён как история; новый TARGET по решению владельца — wait/resync для временной недоступности. -
2026-09-02 14:52 МСК:
92625bf, readiness/lifecycle increment. 349 focused tests PASS; Worker Linux CPU-only 4/4 scenarios, stop 10.676–63.994 ms, 0 residual bytes, terminal fixture lease generation 4 released. Expired inventory остановил runtime через 1043.960 ms после последнего refresh, несмотря на 13 heartbeat renewals; late refresh/result rejected. Allowed overload сохранил violation после восстановления clocks. 70 measured code files verified, 86 evidence artifacts;.runtime/perception-stage2-readiness-worker-20260902T1450MSK/manifest.json, SHA-2564588995d763fe82d896b42689e981f1d00feedaf9d6aab29f4579f771d03da3a. GPU facts synthetic, no model timing or collector qualification. Service IDs/StartedAt/restart counts неизменны до/после; у legacy agents уже были restart counts 21/2/2 — состояние running не объявляется устойчивой готовностью. Clock setters, service mutations, network listeners, registry/UI отсутствуют. -
2026-09-02 14:22 МСК:
380b6ea/f39f1ff. CPU probe (NumPy 1.26.4, Worker x86) воспроизвёл две ошибки range_m через quaternion address 8 mod 16; aligned copy сохраняет bytes и прежние norm/projection результаты. Удалены четыре full-frame copies на связке decoder→parent→DDRNet; binary framing, source clock, TTL, lease checks не менялись. A–B–B–A, 4×128 без drops: контроль p95/p99 84.702/92.961 и 83.930/91.759 ms; кандидат 85.113/91.219 и 82.425/90.530 ms. Кандидат raw parity 128/128 дважды, available/fresh 76/128; global qualification=false. CPU oracle 128/128 BGR/sensors для обоих вариантов, hung decoder cleanup PASS. 279 focused tests PASS. Manifest 305 artifacts, SHA-2569c72a93833a1dda51c4787dca13fb9791a1bf2e31c763b7740e1b21406703707,.runtime/perception-stage2-ipc-worker-20260902T1410MSK/manifest.json. Частоты auto и сервисы восстановлены; registry/UI/image не менялись. -
2026-09-02 13:55 МСК:
221e429— supervised decoder RPC (250 ms deadline, 1 MiB input / 1,440,000-byte caller-owned BGR), общий causal sensor cache и atomic reservation → mailbox transfer. CPU oracle 32/32 exact до полного запуска и после review; native-hang injection учтён как failed cameras 0/1/2, child/lease/input освобождены. Полный binary 1×: 384/384 событий, 128/128 сцен без drops, BGR/segmentation/proposals/tracks/threats/material/raw costmap exact; два range_m отличаются на 1.388e-17 m, strict parity=false. p95/p99 161.974/191.806 ms; 76 available sensor pairs, 74 fresh scenes, seq106/107 дополнительно stale. 271 focused tests, Ruff/format/mypy PASS. Evidence.runtime/perception-stage2-binary-graph-worker-20260902T1335MSK/manifest.json: 161 artifacts, SHA-256e224de4e9f2c5fd419fe0fb0b9be6e01ec267628568e104795ae211ec803bce4. Один GPU-прогон, без изменений clocks/quotas/models; сервисы восстановлены. Standalone/network/product cutover не заявлены. -
2026-09-02 10:16 МСК:
097e450— six-layer shared ABI и read-only Worker operating-envelope checker. Два sequential PyTorch auto-clock runs, 128/128 без drops; финальный C p95/p99 122.11/141.40 ms. 27 свежих полных scenes, 52 missing sensor pairs, 49 stale costmaps; пять дополнительных отказов после receipt aging. Функциональные model/geometry/motion/TGS/material outputs точны к reference 128/128. 142 focused tests + 42 adjacent regressions PASS, 1 исторический evidence-root test FAIL из-за существующих symlinks в соседний checkout; данные и guard не менялись. Этап 1 закрыт как engineering baseline; этап 2 допущен, не реализован. Evidence manifest3b0a2ad32f6b60d3da48a4bcafdf6e11bc91209abc9d1f65da54b0eb36c52d45. -
2026-09-01 18:15 UTC: локальный обзор backend/frontend/Worker и двух документов выполнен в предыдущей итерации; ограничения и отсутствие свежей Worker-проверки перенесены в этот план.
-
2026-09-01 18:15 UTC: прочитаны все пять документов CODEX_V5; уточнение владельца о взаимоисключающих профилях внесено в TARGET. Проверены первичные источники EoMT. Создан план ровно из четырёх этапов.
-
2026-09-01, последующий аудит: прочитаны M4.9T5/E47/M4 и integrated artifacts; через SSH выполнены только read-only Docker inventory/inspect, чтение installed manifests и GPU status. Подтверждено расхождение между viewer composition, reusable graph и portable package; выявлены другие GPU-capable сервисы.
-
2026-09-01 18:48 UTC: по уточнённому сценарию владельца план переработан под один полный standalone Perception-профиль DDRNet + RF-DETR + geometry/motion + TGS + policy-shadow. Два обязательных сегментационных образа больше не являются целью первого прототипа. Road-only/coarse-material разрыв и dependency compatibility включены в этап 1.
-
2026-09-01, следующее решение владельца: fine-grained road-only исключён из первого прототипа; coarse
hard_surfaceпринят, сельская среда — текущий контекст. Static-obstacle представление переиспользуется без распознавания отдельных видов предметов. Предыдущее требование road-vs-sidewalk gate снято; dependency compatibility остаётся технической задачей. -
2026-09-01 19:15–19:58 UTC, этап 1: по прямому разрешению владельца остановлены Ollama/Frigate, Docker restart=no закреплён в runtime и Compose, добавлены manual-only profiles. Данные/модели/записи сохранены. После замеров эти два сервиса не восстанавливаются; остальные временно остановленные Mission Core Worker-контейнеры восстановлены.
-
2026-09-01 19:31–19:57 UTC: выполнены последовательные 64-sample baseline DDRNet, RF-DETR, TGS core и synthetic online local-surface. Ограничение BLAS/OMP/MKL до одного потока снизило mean synthetic local-surface с 198.0 до 63.2 ms без изменения алгоритмических порогов. Полный профиль этими цифрами не измерен.
-
2026-09-01 19:49–19:57 UTC: построен локальный диагностический image с Python 3.9 DDRNet environment, TensorRT 11/native Triton base, Python 3.12 geometry и C++ TGS. Все четыре исполнились отдельными последовательными probes одного image ID; DDRNet masks совпали на 64 кадрах. Модели ещё монтируются явно, общего supervisor/IPC нет; standalone/full-profile статус не присвоен.
-
2026-09-01: добавлены ADR 0049, transport-neutral stream/freshness/measurement contracts и pinned candidate manifest без image digest/active registry mutation. 78 focused tests прошли (51 новых contract + 27 существующих live-ingress/synchronizer/shadow); Ruff и mypy новых контрактов прошли. Модельные baseline и нагрузочные проверки на Mac не выполнялись.
-
2026-09-01 20:51 UTC: совместный граф выполнен на исходных camera/point/pose arrivals 1×. Исправлена bounded causal body history для motion/threat и векторизован costmap lookup. До оптимизации 120/128, 8 drops, p95/p99 353.98/401.19 ms; после — 128/128, 0 drops, 174.09/190.62 ms. Fresh input у 75/128 кадров; остальные явно unavailable. 86 focused tests прошли. Все результаты и отрицательные gates сохранены в отчёте этапа 1.
-
2026-09-02 00:20–00:41 МСК: уточнение владельца о долгосрочном экспериментариуме внесено в план, ADR, Desktop status и candidate
experiment_policy. Тяжёлые профили сохраняются; functional, quality и hardware/source/transport-specific performance статусы независимы. -
2026-09-02: добавлены CUDA-event/host-IPC timing и экспериментальные варианты DDRNet layout/CUDA Graph; оба не показали устойчивого выигрыша полного графа и не стали defaults. Затем реализован
--schedule overlap-cpu: один serial GPU worker, один chronological CPU consumer, общий бюджет двух pending кадров, единый bounded учёт входов. Первый fixed-slot вариант потерял один кадр и сохранён как отрицательный результат; dynamic shared-slot вариант дважды дал 128/128 без drops. Маски, proposals, metric observations, tracks, threats, costmap и non-timing TGS output совпали с reference на всех 128 кадрах; age-based policy проверяется отдельно. -
2026-09-02: 91 focused tests PASS (12 pilot, 52 contract, 27 existing live-ingress/synchronizer/shadow), Ruff PASS, Python 3.9 child lint PASS. Семь последовательных Worker runs и версии кода сохранены в
.runtime/perception-latency-20260902T0020MSK/manifest.json. Worker-сервисы восстановлены, Triton ready=200, local 8000=200; Frigate/Ollama exited/restart=no. Никаких продуктовых defaults/registry cutover. -
2026-09-02 01:06 МСК: по запросу владельца сохранены все 122 изменённых/новых исходных файла семью тематическими коммитами; чистая контрольная точка
ffd6be5. Коммиты:d655d69equipment/capture,a945d66backend lifecycle,62d5520Worker packaging,5a78c99portable UI,4e04d06real-time contracts,bfe6ef4streaming pilot,ffd6be5plan/evidence. Push не выполнялся; raw/weights/runtime не включены. Отдельный05c99efисправляет девять legacy test failures: исторические fixtures отделены от новых installed-package pins, старый image явно отвергается; production digest checks не ослаблены. -
2026-09-02: следующий source-binding increment отделяет первый preroll от текущих LiDAR increments, сохраняет history-only timestamps/points в rolling/TGS и добавляет поэлементные причины unavailable/stale/held. Metadata audit: первый кадр получает 4,787 current points, 7,207 preroll points остаются history-only; остальные 127 admissions и increment identities неизменны. 384 focused Python tests и 62 выбранных frontend architecture/Observatory tests PASS. Нового GPU run, frontend build, deployment или product cutover в этой итерации не было.
-
2026-09-02 01:22–01:33 МСК: preroll fix проверен тремя последовательными 128-frame Worker-прогонами полного графа. Во всех трёх кадр 0 valid и TGS рассчитан; model outputs на 127 общих последовательностях совпали с прежним control. Каждый прогон потерял ровно один кадр из-за
handoff-overflow: A — seq 84, B/C — seq 38. p95 = 127.18/125.19/120.84 ms, p99 = 143.22/138.02/135.46 ms. Ничего не продвинуто в defaults: zero-drop и 125 ms gate FAIL. Evidence:.runtime/perception-preroll-worker-20260902T0122MSK/manifest.json. -
2026-09-02 01:33 МСК: временно остановленные Triton, perception Worker и два Observatory agent возвращены в исходное состояние; Triton healthy/ready=200, оба agent running, canonical Mac 8000=200, Mac 8765 закрыт. Legacy perception Worker возобновил существовавший до замера HTTP 404 restart loop (running, restart count 4 на контрольном снимке); новый пилот от него не зависел. Ollama/Frigate сохранены exited/restart=no. Модельные запуски были строго последовательными; EoMT и посторонняя GPU-нагрузка не запускались.
-
2026-09-02 01:43–01:50 МСК:
2945859заменил ложную buffered reservation на synchronous rendezvous, только когда consumer уже ждёт. 109 focused tests и Ruff PASS. Два последовательных Worker-повтора: 128/128, 0 drops, unaccounted=0; p95 = 128.75/122.69 ms, p99 = 151.67/157.10 ms. Повторная функциональная parity всех 128 outputs PASS. Evidence:.runtime/perception-handoff-worker-20260902T0143MSK/manifest.json, SHA-256d68af383c42eb3686ef199afeebd4625f27d573b77109e7e8ff8c85e811a9003. -
2026-09-02 01:50 МСК: Worker-сервисы снова возвращены в исходное состояние; Triton healthy/ready=200, оба Observatory agent running, active pilot containers=0, canonical Mac 8000=200, Mac 8765 закрыт. Legacy perception Worker возвращён в прежнюю HTTP 404 restart-loop конфигурацию; Ollama/Frigate exited/restart=no.
-
2026-09-02 01:57–02:47 МСК: surface reuse
d9ea7c1сохранил functional parity 128/128, surface p99 19.44/21.87 ms. NVML/no-telemetry и cadence 50/100 ms не дали повторяемого latency PASS. Unified Triton с DDRNet/RF-DETR исполняет модели последовательно; NumPy preprocessing точен 128/128, но TensorRT mask отличается на 0.01195% пикселей и меняет одну ячейку grass→hard_surface / NO_GO→ALLOW_candidate. Backend не продвинут в default. Измерены пять whole-graph Triton variants, p99 137.58–151.37 ms; CUDA Graph/busy-wait проблему не закрыли. 119 focused tests PASS. Evidence:.runtime/perception-unified-triton-worker-20260902T0227MSK/manifest.json, SHA-256ed81475e71b7d02af03dbc65ef628065baaec80bf4877b83e80cc6b3d682a330. -
2026-09-02 02:47 МСК: pilot containers=0, Triton healthy, два Observatory agent running, local 8000=200, 8765 закрыт. Legacy perception Worker восстановлен в прежнюю HTTP404 restart-loop конфигурацию; Ollama/Frigate exited/restart=no. Нет product cutover/deployment, raw/weights/runtime не добавлены в Git.
-
Git checkpoint:
d9ea7c1— surface cache reuse;34f13ba— bounded Triton/cadence/NVML/preprocess diagnostics и regression tests. Документы и выводы фиксируются отдельно; push не выполнялся. -
2026-09-02 09:11–09:40 МСК: численная диагностика frame 115 связала большую часть mismatch с TF32, а critical policy flip — с sigmoid ties и ничьей двух ground votes.
c6c42c2переводит tie в unknown/NO_GO; 210 cell×frame значений на 41 кадре изменились только консервативно. 122 focused tests PASS. Masks/detector/geometry/motion outputs не изменились от этой правки. -
2026-09-02 09:31–09:37 МСК: по явному разрешению владельца A/B stock clock lock (requested SM 2610 / memory 10501 MHz; observed CUDA 2610/10251) без изменения 450 W или Docker limits. Auto B: p95/p99 123.14/138.16 ms; locked C/D: 64.08/70.46 и 63.97/67.77 ms; pinned PyTorch E: 71.80/77.02 ms; auto-restored F: 116.71/144.88 ms. Все шесть новых полных проб 128/128, 0 drops; функциональная parity clock A/B 128/128. Это повторяемый bounded latency PASS при указанном envelope, не whole-product qualification. Evidence:
.runtime/perception-parity-pacing-worker-20260902T0911MSK/manifest.json, SHA-256eac303c218ab391ed5dc2cd8d94be6f1eeecec2effc123da7585135a8b63f2dd. -
2026-09-02 09:40 МСК: clock resets успешны, GPU снова auto/P8 210/405 MHz, power limit 450 W; pilot containers=0. Четыре Mission Core сервиса восстановлены в прежнюю конфигурацию, Triton healthy/ready=200; прежние сторонние restart-loop дефекты не исправлялись. Ollama/Frigate exited/restart=no, Mac 8000=200, 8765 закрыт. Raw/weights не в Git, push/deployment не выполнялись.
-
2026-09-02 10:16 МСК: этап 1 закрыт как engineering baseline (
097e450,adcca7a), не qualification. Six-layer ABI и Worker envelope закреплены; final auto C: 128/128, 0 drops, p95/p99 122.11/141.40 ms, 27 fresh scenes. Подробности и известный historical baseline test FAIL сохранены в отчёте. -
2026-09-02 11:00 МСК: этап 2 начат.
bcacb02переносит queue/GPU scheduler в common perception, ограничивает drop-history и проверяет владение входом при release/cancel.1f8101eдобавляет адресную свежесть costmap; core tests и полный GPU-пилот используют тот же код. 202 focused tests, Ruff, mypy четырёх изменённых core modules и diff-check PASS. -
Два последовательных Worker runs: whole-scene p95/p99 125.01/130.31 ms, fresh 25/128; per-cell 123.91/136.17 ms, fresh 76/128. В обоих 128/128 без drops; raw functional parity 128/128, missing pairs 52. Per-cell блокирует 2195 cell×frame ground appearances (1994 при publication, ещё 201 при receipt); это не 2195 уникальных физических препятствий. Все 256 derived receipts повторно проверены по payload hashes/ages/policy.
-
Продуктовый backend/frontend path и registry не переключены. Этап 2 остаётся незавершённым: общий supervisor/lease fencing, binary live ingress без знания EOF и standalone package ещё не реализованы. Этапы 3–4 не начаты. Следующий bounded шаг — lifecycle/ownership + неизвестная длина входного потока; старый batch materializer не ослаблять.
-
Evidence первого инкремента этапа 2:
.runtime/perception-stage2-cells-worker-20260902T1055MSK/manifest.json, 125 artifacts, SHA-2561a951fd9e807099e500fa66f8a40b1076071f96e4c8e0be4ab3094caaa33bf09. Четыре сервиса восстановлены, Triton ready=200; Ollama/Frigate exited/restart=no, pilots=0, GPU auto P8, Mac 8000=200 и 8765 закрыт. Модели/сырые outputs не попали в Git. -
2026-09-02 12:00 МСК:
6acf468/ac69e3b— общий subprocess lifecycle и cooperative Worker-local lease/fencing подключены к полному пилоту. 223 focused tests PASS. Отдельные контейнеры подтвердили contention rejection, clean generation succession и crash quarantine. Global product queue не менялась; canonical persistent control root и backend integration не установлены. -
Normal pilot 128/128 без drops, p95/p99 124.98/136.12 ms, fresh 76/128. Intentional expiry A: 52 released = 51 complete + 1 GPU terminal drop; expiry trace B: 50 released = 50 complete. Оба
execution_complete=false, reason=lease-lost, unaccounted=0, все процессы/входы освобождены. Final trace: stop-request deadline +45.74 ms, retirement +4109.82 ms, receipts at/after deadline=0. Все 229 опубликованных raw outputs exact к reference prefix; clocks/quotas/models не менялись. -
Evidence:
.runtime/perception-stage2-lifecycle-worker-20260902T1146MSK/manifest.json, 259 artifacts, SHA-25600bd091a80845e50489a34ce4df2cbf3d2cd60d9ecb13d1d97accd03d44fdba4. Временные probe containers и два test volumes удалены после сохранения owner records. Четыре сервиса восстановлены; Triton ready=200, Ollama/Frigate exited/restart=no, Mac 8000=200, 8765 закрыт. Этап 2 остаётся в работе; дальше binary ingress, постоянная controller/recovery integration и standalone package. -
2026-09-02 12:35 МСК: третий инкремент (
da60fef,a937400,79ce55d), 276 focused tests PASS. Worker raw IPC: 103/103 exact, каждый data channel до End, peak 553,991 bytes; negative EOF: incomplete=1, delivered=0, release=true. Evidence.runtime/perception-stage2-binary-ingress-worker-20260902T1232MSK/manifest.json, 42 artifacts, SHA-2562a5492080027a86de9f176f051c9265e29f377d1d9207c86ac93cdff7632505a. Попытки 1230 (неполный diagnostic code pack) и 1231 (гонка финального timestamp journal) сохранены как rejected; их manifests связаны из принятого. Никакой повторной GPU-квалификации этим probe не выдано.
Surprises / открытые вопросы
-
Инкремент18: «LAN» не означал Ethernet — обе стороны работают по Wi-Fi, Worker через USB Realtek8812BU. Прямой TCP connect воспроизводит большой tail без нашего pipeline; reported866.7Mbps link rate не квалифицирует latency. Это не доказательство вины конкретного адаптера/AWDL/роутера или отсутствия других затрат в коде. Независимое clock/record evidence локализует контрольный tail, но не измеряет ещё крупные camera/scene buffers. First TLS startup без mapping сохранён отдельно; ICMP no-reply не выдан за общую потерю пакетов.
-
Инкремент17: clock readiness срывается в A/A2 даже при0 моделях/scene, поэтому общий scene event loop не является единственным достаточным объяснением. LAN улучшил короткий интервал ready, но не все RPC tails: Poll p95 A/B/A2 88.838/92.403/89.950ms, LAN ACK p95 98.266ms. Tailscale preflight показал direct LAN endpoint, а не доказанный DERP. Выбор маршрута относится к connection configuration, не к весам/профилю.32/32 выходов не равны32 свежим scene; локальные Worker accounting gates остаются unknown/false для внешнего источника, отдельный joined verifier доказывает отсутствие потерь. Нельзя складывать/вычитать p95 разных timing boundaries как стоимости независимых стадий.
-
Инкремент16: согласованный старт и отсутствие RPC errors не означают непрерывную готовность часов. Running bounds вышли за5ms без GPU/owner failure; это условная uncertainty при500ppm budget, не измеренный физический drift. Offline добавление всех probes в прежних2s всё ещё даёт FAIL на тех же девяти samples. Для следующего изменения нужен timing trace scheduling/control/data, а не автоматическое расширение history или бюджета.
-
2026-09-02 13:55 → 14:22 МСК: два старых range_m расхождения 1.3877787807814457e-17 m воспроизведены и исправлены. Quaternion начинался на byte 24 общего pose buffer; адрес 8 mod 16 менял norm на один ULP в текущем NumPy runtime. Offsets 0/16/32/48 возвращают reference, 8/24/40/56 точно воспроизводят оба отклонения. Теперь quaternion — отдельная immutable 32-byte копия с проверенным 16-byte alignment; формулы и comparator прежние. Полный граф подтвердил 128/128 exact дважды. Это квалификация numeric layout текущего pinned runtime, не универсальное обещание bitwise равенства на любом CPU/NumPy.
-
Четыре удалённые full-frame copies дают небольшой измеримый эффект в IPC, не объясняют разницу 192→91 ms. При одинаковых фиксированных частотах контроль тоже проходил 125-ms gate до оптимизации. Новый p95 колеблется внутри межпрогонного разброса; p99 немного ниже в обоих повторах. CPU-only кандидат имел native-decode outlier и худший total p99, хотя IPC-minus-decode снизился; отрицательный результат сохранён. Автоматический runtime не должен обещать fixed-clock qualification без фактического envelope и не должен сам менять host clocks без отдельной authority.
-
В том же запуске auto memory clocks переходят 10,251 → 405–810 MHz. По последнему 0.5-s sample перед receipt high/low cohorts имеют p95 88.269/172.079 ms (39/89 кадров). Это корреляция внутри одного прогона, не controlled A/B и не отдельная qualification. Общий p95/p99 161.974/191.806 ms остаётся FAIL. Decoder p95/p99 10.871/11.606 ms, RPC+bundle 18.053/38.991 ms, очередь 44.284/84.492 ms, DDRNet RPC 73.068/77.479 ms; CPU throttled delta=0. Нельзя приписать всю разницу с предыдущими 124.98/136.12 ms новому транспорту или сделать вывод об исчерпании 24 GiB VRAM.
-
2026-09-02 13:09 МСК: decoder-инкремент
350366b/f102712принят отдельно от full graph. Evidence.runtime/perception-stage2-decoded-ingress-worker-20260902T1310MSK/manifest.json, 43 artifacts, SHA-256612295eabbc8f203ad9b037a69ac9cf97b2df3134b087d9e51a9786738423f2f; связан с отдельными 128-frame demux/direct/reference manifests. Все 128 BGR совпадают; 32-camera binary canary и negative EOF освобождают весь input budget. Четыре Mission Core сервиса не останавливались; модели и GPU clocks не менялись. -
Повторный
av.open(init + fragment)не является полнофайловым барьером, но повторяет stream probing на каждом кадре. Принят узкий проверяемый ISO-BMFF layout → один AVCC sample → persistent codec; NumPy импортируется до readiness. p95 первого потокового варианта 19.927 ms → 11.156 ms. Это bounded CPU A/B без модели; не вычитать выигрыш из старого full-graph p99. Codec/parser не импортируют session store или materializer; archive API сохраняет прежние exception contracts. Иной codec/layout, B-frames, multi-sample, пропуск DTS или не-keyframe start требуют нового явно квалифицированного профиля/epoch, а не скрытого fallback. -
Исторический decode-only probe 13:09 не доказывал causal scene/calibration admission. В инкременте 13:55 supervised child, causal cut и full-graph handoff реализованы с прежней реальной калибровкой полного профиля; готовые MP4/masks/geometry не подмешиваются. Multi-recording calibration admission и field quality по-прежнему не проверены.
-
2026-09-02 12:00 МСК: истечение lease и освобождение GPU разделены. После crash OS lock свободен, но durable
activeне допускает новый запуск. Recovery намеренно отсутствует до trusted resource-release proof; нельзя удалять production marker ради продолжения. В пробах удалены только два заведомо временных experiment-owned volume после сохранения записей и остановки всех probe containers. -
Свежая camera/cloud/pose пара не равна свежему полному scene. У TGS last-seen разрешающих ячеек может быть старее camera anchor; новый guard сохраняет этот возраст. В финальном C пять scenes истекли за 1–4 ms между publisher guard и приёмом, хотя раньше выглядели бы свежими. Пока одна такая ячейка запрещает весь scene; per-cell expiry — следующий runtime increment без ослабления 250-ms TTL. 52 source gaps нельзя исправить GPU-ускорением.
-
New operating-envelope evaluator — проверяемый контракт readiness, не уже подключённый orchestrator и не host clock manager. Power/P-state/limit остаются измеряемыми фактами; continuous monitoring и авторитетный lease должен предоставить общий runtime. Low GPU utilization не доказывает владение, а snapshot PASS не квалифицирует целый run.
-
Малое численное расхождение backend не обязательно семантически безвредно. Critical cell flip устранён fail-closed tie rule, но PyTorch vs TensorRT material по-прежнему совпадает 127/128 кадров. Без ground truth и явной numeric acceptance нельзя заменить reference автоматически.
-
Автоматический downclock GPU/VRAM — подтверждённый A/B источник существенной части tail latency. CUDA Graph capture был реальным; CPU quota не троттлила. Server intervals всё ещё не являются CUDA kernel trace, а остаточные IPC/CPU/network затраты не исчезли. Две fixed-clock пробы пройдут 125-ms gate, возвращённый auto — нет; квалификация должна описывать условия Worker, а не только image digest.
-
Глобальная блокировка очереди противоречит независимости будущих Worker; нужно перенести ownership scope, а не просто оставить
max_concurrency=1во всех слоях. -
Старые combined-package manifests сохраняют batch-семантику и не исполняют detector/geometry/TGS/threat. Красивый общий viewer использует отдельные сохранённые результаты; это не готовый профиль.
-
FPS исходного recording и старые sampling/min-FPS требования математически расходятся. Численные product budgets должны быть закрыты в этапе 1; пользователь не задал их в этом уточнении.
-
Чистое GPU-окно для ограниченных component probes получено: после остановки сторонних и старых Mission Core GPU-процессов 0% utilization и около 529–531 MiB системного/display VRAM. Ollama/Frigate отключены постоянно из автозапуска по явному разрешению владельца. Source uplink, clock alignment и долгий эксклюзивный full-profile run не подтверждены; 300–500 Mbps и будущее hardware остаются гипотезами до проверки.
-
Существующий
static_obstacleдостаточен для неподвижных препятствий; точные semantic имена не являются пробелом scope первого прототипа. Динамика определяется temporal evidence, не классом объекта. -
Потеря различия дорога/тротуар/велодорожка в
hard_surface— осознанно принятый владельцем компромисс сельского прототипа, не блокер. Геометрический запрет остаётся выше material allowance. -
Самостоятельный полный образ ещё не построен. Совместные lifecycle/IPC, resident модели и последовательный GPU schedule проверены в bounded пилоте с mounts, но performance gate FAIL. Экспорт нового образа заблокирован отсутствующим cached Triton blob / NVCR 403. Будущая поставка обязана включить веса и явно задать scratch/cache; рабочий mounted probe не равен standalone. В Triton base отсутствуют Python grpc/protobuf/cv2/TensorRT SDK: native trtexec не означает их наличия. Внутренний RF-DETR HTTP adapter позволил выполнить пилот без них.
-
CPU online local-surface — выявленный latency risk даже после ограничения BLAS threads. TGS core около 1 ms на prepared clouds не включает online rolling preparation/costmap; нельзя подставлять эту цифру как стоимость всего геометрического слоя.
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. Scopedocker-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-256aac125bd1b182d164c95d18089793fa54bf9797478bce1afe3de2a1d9093f6ef,.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.
-
2026-09-01, решение владельца: EoMT сохранить отдельно, даже если не проходит real-time на текущей карте. Следствие: отрицательный benchmark оформляется как честный статус, а не повод блокировать DDRNet или бесконечно оптимизировать.
-
2026-09-01, рабочее решение плана: сначала контракты и baseline, затем runtime, затем продуктовая интеграция, затем квалификация и ограниченная миграция. Ровно четыре этапа; уточнения ведутся внутри них в этом же документе.
-
2026-09-01, решение владельца: первым нужен самостоятельный Docker с DDRNet, объектной детекцией, LiDAR-расстояниями и TGS для проверки многих записей K1 и последующего полигона. Следствие: цель — полный Perception-профиль, а не голая сегментация; нет зависимости от прежних вычисленных LAB результатов.
-
2026-09-01, решение владельца: беспилотника и motor integration сейчас нет. Следствие: текущий scope заканчивается проверенным perception/policy-shadow прототипом; actuator commands, autonomy acceptance и полный mission configurator — будущие отдельные gates, не скрытая часть этой реализации.
-
2026-09-01, рабочее решение прототипа: в одном контейнере допускаются несколько внутренних runtime-процессов одной задачи для сохранения модельной совместимости; все имеют одного supervisor и одного GPU scheduler. Изолированные среды не превращаются в отдельно устанавливаемые LAB-сервисы.
-
2026-09-01, решение владельца: никаких новых классов для столбиков/подобных предметов; существующего static-object / obstacle достаточно. Следствие: reuse текущего слоя и regression на RAV004, не новая модель/разметка перед первым прототипом.
-
2026-09-01, решение владельца: coarse
hard_surfaceдостаточен в сельской среде, включая тротуары/велодорожки. Следствие: прежние обязательные road-only/fine-class требования отменены; один segmenter DDRNet, без urban autonomy scope. Геометрия и unknown/freshness сохраняют приоритет. -
2026-09-01, решение владельца: Ollama и Frigate больше не нужны в постоянной нагрузке. Остановить сейчас, убрать автозапуск после reboot, не восстанавливать после benchmark; сохранить данные для ручного использования. Выполнено и проверено по Docker/Compose, без физического reboot системы.
-
2026-09-01, инженерное решение: стартовый replay stride=1, source clock=1×, ≤16 MiB inflight и два pending camera frames; whole-path p95/p99 ≤125 ms остаются preregistered candidate. Перегрузка должна быть видна и проваливать strict gate; нельзя скрыто замедлить источник/сменить stride/подменить слой старым результатом.
-
2026-09-02, решение владельца: разрешены временный A/B stock clock lock с возвратом и расширение Docker resource limits при необходимости. Clock A/B выполнен, все настройки восстановлены; CPU/RAM quotas и power limit не изменялись. Постоянный автозапуск фиксированных частот этим испытанием не вводится.
Восстановление и остановки
Для активного профиля transient input/telemetry loss означает waiting/resync с сохранением моделей/lease. Unknown inventory запрещает новый admission, но не доказывает конфликт текущего владельца. Подтверждённая утрата local lease, конфликт, child/decoder failure и cancel остаются terminal. Новый режим включён и измерен в полном binary pilot; прежние one-shot diagnostics сохраняются. Motion resume — отдельный будущий onboard safety gate, не следствие восстановления inference.
При неудаче короткого canary остановить только принадлежащий испытанию профиль, сохранить диагностику и проверить освобождение GPU; не убивать посторонние процессы и не продолжать full-session. Неясный владелец GPU или потеря lease требуют fail-closed остановки нового запуска, а не захвата ресурса поверх старого процесса. Переключение на другой профиль — отдельная последовательная операция, не автоматический GPU fallback.
Новые схемы/декларации вводятся версионно. Возврат к точному предыдущему образу/конфигурации не превращает старый batch-путь в real-time; при откате сохраняется честный статус unavailable/not-qualified. Общую старую очередь нельзя ослаблять без worker-scoped fencing. Опубликованная история и исходники записи не переписываются для прохождения проверок.
Новый scope, изменение аппаратной/операторской границы, необходимость физического действия, отсутствие нужного доступа или существенный выбор latency/quality — повод остановить соответствующую часть и запросить решение владельца. Обычные локальные исправления внутри согласованных границ не требуют переписывания плана. Настоящий прогресс, evidence и решения обновляются здесь, без новых параллельных планов на каждую проверку.
Outcomes / retrospective
Этап1 завершён; этап2 продолжается. Инкремент18 локализовал один существенный источник длинных задержек ниже Perception-приложения: между TLS edges, с независимым воспроизведением при TCP connect без gRPC/Docker/SSH forwarding. Оба конца на Wi-Fi; конкретный radio/AP/driver/OS механизм остаётся неизвестным, Ethernet comparison возможен при физическом подключении.424 encrypted records/192 RPC exact,288 clocks reconstructed;82 local/82 Worker tests PASS,142 staged files exact,43 artifacts. Модели/GPU/production runtime не запускались и не менялись; full-graph статус по-прежнему из инкремента17:32/32 continuous, p95/p99 205.864/213.751ms FAIL,12 fresh scene. Весь runtime не объявляется невиновным: далее per-frame очереди/сериализация/выдача, отдельный10ms polling и bounded lifecycle. Отсутствие Ethernet не блокирует экспериментальную разработку runtime/standalone. Этапы3–4/registry/UI/actuation не открыты. Временные ресурсы закрыты, IDs/restart policies сохранены; существующие autonomous service restarts отмечены отдельно, не исправлены. Mac8000 PID33360/telemetry работают,8765/18561 отсутствуют; Ollama/Frigate exited/restart=no.
После этапа 4 здесь будут перечислены digest самостоятельного полного образа, измеренные статусы и ошибки по recordings, реально проверенные source/hardware/config комбинации, состояние сохранённого EoMT-варианта и оставшиеся physical-live/quality/vehicle-integration ограничения. Готовый Docker и готовая автономия не отождествляются.