feat(observatory): ship modular AI inference labs

This commit is contained in:
DCCONSTRUCTIONS
2026-09-04 17:59:05 +03:00
parent eff60e490a
commit cada687173
145 changed files with 17651 additions and 1667 deletions
+301 -28
View File
@@ -1,11 +1,191 @@
# Observatory: модульные Docker-композиции → записанные LAB → CUDA-борт
## ЕДИНСТВЕННЫЙ ТЕКУЩИЙ МАРШРУТ — 2026-09-03, модульное решение
Этот раздел заменяет прежний маршрут ниже. Исторические `CURRENT`, «следующий
шаг», номера этапов и требования «один профиль = один полный Docker» в архивной
части не являются актуальными заданиями. Замеры и выполненная работа сохранены.
Решение владельца: [ADR 0051](adr/0051-modular-observatory-profiles.md).
Фактическая сверка и очистка:
[handoff report](../experiments/perception/OBSERVATORY_MODULAR_HANDOFF_2026-09-03.md).
### Цель и термины
Запись 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`, HEAD `eff60e4`, поверх него есть незакоммиченные
изменения предыдущих инкрементов. Не сбрасывать и не считать всё новым 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`
и последними решениями владельца. M4.9T5 ×004TREE рассчитан через UI, опубликован
и повторно открыт как документ из кэша после перезапуска. Визуальный replay ещё
не реализован для этого portable-результата. Разделы до журнала инкрементов — текущий
и последними решениями владельца. Проверки и сборка текущего инкремента поверх
`eff60e4` завершены; возврат к основному маршруту зафиксирован ниже. M4.9T5 ×004TREE рассчитан через UI, опубликован
и повторно открыт из кэша после перезапуска. Общий camera/TGS replay реализован;
подробная визуальная и memory-lifecycle приёмка ещё открыта. Разделы до журнала инкрементов — текущий
маршрут; исторические «следующий шаг» и «этап открыт/закрыт» ниже не команды.
### Цель и результат
@@ -29,9 +209,11 @@ PASS через Wi-Fi/LTE не является условием готовно
рассчитаны → выбор пуст, «Рассчитать» нет, «Обновить» остаётся. Плашек завершения
нет; во время работы общий индикатор показывает настоящую фазу и доступные счётчики.
Внутри первичного decode/передачи архива детальные счётчики ещё отсутствуют.
Лимит первых 6 карточек снят,
но пагинация сотен записей ещё не доказана.
- **Последняя приёмка:** 726 frontend tests, 128 focused progress/queue/API/
Обсерватория теперь показывает только 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. Эти проходы пересекаются,
@@ -47,12 +229,49 @@ PASS через Wi-Fi/LTE не является условием готовно
- **Текущие составы:** 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.js` healthy на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, не очистка данных/не покупка памяти.
[Полный отчёт и точные границы доказательств](../experiments/perception/OBSERVATORY_SAVED_REVIEW_RECOVERY_2026-09-03.md).
- **Есть инженерный прототип полного графа:** DDRNet/RF-DETR/geometry/distance/
motion/TGS/costmap/policy-shadow и короткие потоковые proofs. Не пишем заново.
Самостоятельный продуктовый образ и полный recorded-run этого состава не приняты.
- **Не закрыто:** полный recorded-analysis текущими
профилями, синхронный сохранённый visual replay, матрица двух профилей/записей, полный поиск/
пагинация каталога, standalone и фактический перенос на борт.
профилями, синхронный сохранённый visual replay, матрица двух профилей/записей,
оставшиеся recovery cases, standalone и фактический перенос на борт.
Источники: [ADR 0050](adr/0050-recorded-observatory-first.md),
[cache/UI evidence](../experiments/perception/OBSERVATORY_PUBLISHED_CACHE_2026-09-03.md),
@@ -62,6 +281,8 @@ Desktop final-status — операторская сводка и история
сохранение выполненной работы, не неподтверждённые сведения о runtime.
Текущее исполнение и точные declarations:
[progress / первый запуск](../experiments/perception/OBSERVATORY_RECORDED_PROGRESS_2026-09-03.md).
Последняя сверка и проверки:
[возврат к основному сценарию](../experiments/perception/OBSERVATORY_MAINLINE_RECONCILIATION_2026-09-03.md).
## Границы исполнения
@@ -106,8 +327,12 @@ normal/expanded UI; последний код `e436fb5` и отчёты выше
**Частично выполнено:** bounded attempt-scoped progress реализован и активирован.
Новый M49-run использовал прежний профиль и полностью выполнил его расписание.
Это не закрывает 2A: целиковый input barrier и `_capture_arrays()` до replay-cache
lookup ещё сохранены. Progress observation не является новым режимом исполнения.
Это не закрывает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](../experiments/perception/OBSERVATORY_SOURCE_REUSE_2026-09-03.md).
- Сохранить source timestamps и causal ordering. Медленный Worker притормаживает
подачу, а не выбрасывает обязательные кадры ради 1×. Учитывается каждый вход/
@@ -133,32 +358,45 @@ timeline. Это приёмка CPU TGS, не полного detector/segmentati
точный cache hit, исчезновение M49 из выбора и открытие документа после рестарта.
Найден и исправлен no-op reindex: служебная переиндексация больше не меняет
source identity; реальное изменение по-прежнему требует нового расчёта.
**Осталось в2B:** portable review сейчас JSON, не проигрыватель. Подключить
typed result/frame reader и общий `CanonicalRecordedLabReplay`, ленивое чтение
сохранённых TGS/costmap и точную камеру/временную привязку. Проверить coverage,
seek/play/pause, normal/expanded/restore/Escape и повторное открытие без job.
Сначала использовать уже sealed пакет; не считать заново и не подмешивать
архивные E47/M49 semantics. Название «полный маршрут и воспроизведение» само
по себе не доказывает доступность replay или полноту всей исходной сессии.
Общий `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 и отсутствие дубликатов.
- Исторические результаты получают допуск к review только при достаточном
evidence, без подделки provenance. Если binding отсутствует — исправить
проверяемую проекцию либо выполнить новый расчёт, не объявлять legacy новым.
- Довести постраничный поиск записей и результатов. Нельзя спрятать профиль
- **Реализовано:** Обсерватория не показывает Legacy/canonical архивные LAB;
они остаются в существующем архиве без миграции/удаления. Portable результаты
прошлых версий сохраняются при точном binding, независимо от имён и даты.
- **Реализовано и проверено:** постраничный каталог и поиск по загруженным
источникам. Нельзя спрятать профиль
из-за cache hit, соответствующий результат которого нельзя найти/открыть
из-за окна каталога. Сотни metadata entries проверяются функциональными
fixtures, не нагрузкой на Mac и не загрузкой всех видео в RAM.
[Evidence и границы traversal](../experiments/perception/OBSERVATORY_CATALOG_BOUNDARY_2026-09-03.md).
- **Новый 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 после
@@ -218,12 +456,16 @@ watchdog, stop/slow при пропаже данных, моторы и авто
- [x] 2026-09-03 — этап 1: queue/cache/identity/selector реализованы и локально проверены.
- [x] 2026-09-03 — история сохранена, completed-status UI удалён.
- [x] Этап 2A, часть progress — реальные bounded Worker → backend → UI snapshots.
- [x] Этап 2A, warm source reuse — shared CAS и LiDAR early lookup установлены на Worker;111 tests и cross-agent synthetic proof.
- [ ] Этап 2A, остаток — versioned recorded-analysis и устранение полного input barrier.
- [x] Этап 2B, compute/publish/cache — M4.9 ×004TREE завершён; документ повторно открыт после рестарта.
- [x] Найденный reindex-дефект exact cache исправлен; исходная связь восстановлена по точному SHA proof.
- [x] Этап 2B, saved replay — camera/source cloud/TGS в одном native Rerun, выдача с Core после рестарта без compute.
- [ ] Этап 2B, visual acceptance — сохранение ручного ракурса и подробная визуальная оценка; не подменять работающим проигрывателем.
- [ ] Этап 2C–2D — LAB V1/вторая запись, cache/recovery/каталог.
- [x] 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 продолжаются.
- [x] Этап 2D, каталог — Legacy separation, cursor pagination, fixture500 и real20-page proof; UI на8000 проверен.
- [ ] Этап 2C–2D — LAB V1/вторая запись и оставшиеся cache/recovery cases.
- [ ] Этап 3 — самостоятельный полный профиль и сравнение конфигураций.
- [ ] Этап 4 — кандидат, затем фактическая бортовая квалификация.
- [x] 2026-09-03 — план и Desktop-сводка синхронизируются с фактическим исполнением.
@@ -236,12 +478,40 @@ Core хранит/выдаёт 193,622,178-byte replay; Worker не нужен
blueprint clone activation. Не объявлять stable source ID сохранением eye;
выбирать только поддержанный native-механизм либо отдельно согласованный upgrade,
не патчить WASM и не создавать второй renderer. Подробная визуальная приёмка открыта.
Первым действием после нормализации памяти Mac повторить browser first-open для
последней правки initial cursor +1мкс; до этого не писать PASS начальной сцены.
Автотесты/build проходят; последняя визуальная проверка остановлена resource gate.
Отдельно закрыть остаток2A версионированным incremental input;
не объявлять прежний whole-recording materializer потоковым.
Не начинать снова с claim/v3, memory repair, селектора или сетевого canary.
Начальный 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](../experiments/perception/OBSERVATORY_MEMORY_LIFECYCLE_2026-09-03.md).
**Непосредственно дальше — основной этап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. Лабы в целом ещё не закрыты.
## Карта продолжения, проверка и восстановление
@@ -268,6 +538,9 @@ visual entities требуют отдельного решения. Провер
- 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×