From e56eb42507d005cc372ac4a53785a080b116e227 Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Sat, 5 Sep 2026 09:20:35 +0300 Subject: [PATCH] docs: inventory Rerun customizations and upstream dependencies --- ...m-rerun-canonical-recorded-lab-pipeline.md | 11 + ...026-09-05-rerun-customization-inventory.md | 201 ++++++++++++++++++ .../2026-09-05-rerun-upstream-evidence.json | 67 ++++++ 3 files changed, 279 insertions(+) create mode 100644 docs/audits/2026-09-05-rerun-customization-inventory.md create mode 100644 docs/audits/2026-09-05-rerun-upstream-evidence.json diff --git a/docs/adr/0045-upstream-rerun-canonical-recorded-lab-pipeline.md b/docs/adr/0045-upstream-rerun-canonical-recorded-lab-pipeline.md index deb8066..2705394 100644 --- a/docs/adr/0045-upstream-rerun-canonical-recorded-lab-pipeline.md +++ b/docs/adr/0045-upstream-rerun-canonical-recorded-lab-pipeline.md @@ -3,6 +3,17 @@ Date: 2026-08-30 Status: accepted; RAVNOVES004TREE is the first migrated full-route LAB +Implementation audit, 2026-09-05: see the +[complete customization inventory](../audits/2026-09-05-rerun-customization-inventory.md) +and [upstream provenance evidence](../audits/2026-09-05-rerun-upstream-evidence.json). +The historical decision below remains recorded as written. The current code +uses private Python blueprint/reader hooks, a camera-input journal and an outer +controlled splitter; the old pointer-relay/native-divider description is no +longer its implementation. The audit also distinguishes the canonical LAB's +ready gate from Saved Sessions' progressive policy and lists unimplemented +display settings. These are upgrade dependencies and known gaps, not claims +that upstream packages have been modified. + ## Context The accepted LAB product composition was repeatedly rebuilt over independent diff --git a/docs/audits/2026-09-05-rerun-customization-inventory.md b/docs/audits/2026-09-05-rerun-customization-inventory.md new file mode 100644 index 0000000..5e74c6f --- /dev/null +++ b/docs/audits/2026-09-05-rerun-customization-inventory.md @@ -0,0 +1,201 @@ +# Полная карта интеграции и кастомизации Rerun + +Снимок кода `b2a1b23131642ac496829e467c20c8c069915be9`, 2026-09-05. Ревизия подготовлена для карточки MISSION CORE #74 «Additional Core · Переносимая кастомизация Rerun». Изменения в runtime в рамках аудита не выполнялись. + +## Зафиксированное состояние · 5 сентября 2026 + +Репозиторий NODEDC_MISSION_CORE_m5_observatory. Принятый код: b2a1b23131642ac496829e467c20c8c069915be9. Ветка codex/m5-1-observatory перенесена в main fast-forward; прежний main 7fba39a6297e4a1792c67eccab317731abaeab72 является предком. main опубликован без переписывания истории. Остальные worktree сохранены. + +Это аудит фактической реализации и карта переноса, а не обновление Rerun или новый рефакторинг. Точка отсчёта — официальный Rerun 0.36.3. Исторические формулировки ADR 0045 и карточки #66, не совпадающие с перечисленными ниже файлами, не следует считать описанием текущего кода. + +Версионируемый снимок: docs/audits/2026-09-05-rerun-customization-inventory.md; машинные свидетельства происхождения: docs/audits/2026-09-05-rerun-upstream-evidence.json. Карточка #74 — полный рабочий реестр; #66 — канон интеграции. + +## Официальное ядро и проверка происхождения + +Активные версии строго закреплены: @rerun-io/web-viewer=0.36.3 в apps/control-station/package.json и package-lock.json; rerun-sdk==0.36.3 в pyproject.toml и uv.lock. Upstream tag 0.36.3 и npm gitHead: 6ded109d33c549e98185f7c95fa8009d44e4adef. + +Заново скачан официальный npm-архив; SHA-512 совпадает с registry и lockfile. Все 12 опубликованных файлов побайтно совпадают с установленным пакетом. SHA-256 re_viewer_bg.wasm: 02d6d9c3a569d3faceb01cf89104342d970fc85e7c31a08dedd357b6c7104d2f. Тот же хеш у WASM в apps/control-station/dist/assets/re_viewer_bg-BO4B44yr.wasm. SHA-256 re_viewer.js: d2a94836dd0e6de40538c4d657cfb423b1803e354e6ee0cd550735eb5aaab09b. + +Заново скачан официальный macOS ARM64 wheel Python SDK: rerun_sdk-0.36.3-cp310-abi3-macosx_11_0_arm64.whl. SHA-256 804067d6e71747f8461104988be82543b318b583a2837935558a5e79a5e9befd совпал с PyPI и uv.lock. Все 507 файлов пакетов rerun_sdk/ и rerun_bindings/ совпали с установленной .venv. + +Активного postinstall-патча и импорта архивного vendor нет. vite.config.ts использует стандартный wasm plugin, target esnext, отдельный rerun-runtime.html и исключение Web Viewer из optimizeDeps ради корректного относительного URL WASM. Активный WASM и SDK не модифицированы. Это не означает отсутствия зависимостей надстроек от внутренних API: они перечислены отдельно. + +## Граница и владельцы надстроек + +Rerun владеет визуализацией, native store, декодированием и камерой; Mission Core владеет источниками, конфигурацией, адаптерами, внешними контролами и сохранённым display profile. Ни viewer, ни его cache не являются владельцем raw evidence, AI worker или управления оборудованием. + +Основной компонент: apps/control-station/src/components/RerunViewport.tsx. Recorded-путь запускает обычный WebViewer внутри одноразового same-origin iframe; live-путь импортирует официальный WebViewer напрямую. Существует ровно один native renderer и clock на смонтированный recorded viewer, а не отдельный экземпляр на каждую половину LAB. + +Действующие файлы в apps/control-station/src/components/rerun/: isolatedRerunEntry.ts, isolatedRerunHost.ts, isolatedRerunInput.ts, recordedRerunProtocol.ts, recordedRerunOwner.ts, recordedRerunFacade.ts, recordedRerunCameraJournal.ts. Прежние названия isolatedRerunOwner/rerunFacade/rerunProtocol в этой карточке были неточными. + +Публичный JS-контракт: start(rrd,parent,options), stop, ready, on, open, close, open_channel, override_panel_state; get_active_recording_id/get_active_timeline/get_current_time/get_playing/get_time_range; set_active_timeline/set_current_time/set_playing. configure/get-camera-eye — методы нашей границы, не официальный API чтения native камеры. + +## Изолированный runtime, протокол и освобождение ресурсов + +rerun-runtime.html и isolatedRerunEntry.ts создают runtime; isolatedRerunHost.ts владеет iframe, handshake версии 2 и таймаутом 30 секунд. recordedRerunProtocol.ts задаёт команды/события; recordedRerunFacade.ts передаёт primitive JSON и синхронные Uint8Array; recordedRerunOwner.ts владеет SDK, каналами, подписками и журналом камеры внутри iframe. + +SDK handles, DOM, native closures и startup promise не выдаются родителю. Dispose отклоняет родительское ожидание, закрывает каждый канал независимо от ошибок других, отписывает события и удаляет iframe. Завершившийся после dispose поздний SDK start останавливается повторно. Это прикладная изоляция жизненного цикла, не sandbox безопасности. + +isolatedRerunInput.ts сейчас ретранслирует только Escape. Старое утверждение ADR о передаче pointer events родителю устарело: native gestures остаются в iframe, журнал навигации тоже находится там. Pagehide/pageshow и stale generation управляются RerunViewport и core/observation/recordedRerunLifecycle.ts. + +При обновлении проверять start/stop, закрытие до загрузки iframe, закрытие во время SDK start, ошибки каналов, late callbacks, восстановление страницы. Снятие DOM само по себе не доказывает освобождение памяти: повторять последовательные open/close и измерять процесс без принудительного GC. + +## Источники, admission и единые часы + +Контракты: core/observation/viewerProfile.ts, recordedObservationSources.ts, recordedSessionAdmission.ts, useRecordedSessionAdmission.ts и recordedRerunLifecycle.ts; операторский playback — RerunViewport.tsx и ObservationTimeline.tsx. + +Live использует stream_time и отдельную acquisition identity. Recorded использует session_time, immutable source URL/generation, согласованные application_id/recording_id, SHA-256 и byte length. Native receiver читает URL RRD; слой приложения не собирает основной архив в постоянно растущий JS Blob. Blueprint и необязательные perception/color sidecars входят в тот же store и clock. + +Различать три пути: live → прямой upstream; Saved Sessions/Data → свой admission и внешняя RecordedFmp4Player.tsx для записанного видео; canonical LAB → merged RRD с native AssetVideo/VideoFrameReference внутри изолированного upstream viewer. Старый лабораторный fMP4/Three.js путь сохранён только для явно выбранного legacy comparison. + +CanonicalResultRerunReplay.tsx сейчас задаёт presentationGate="ready": canonical LAB может ожидать полной native готовности. Прогрессивная политика Saved Sessions не доказывает быстрый cold open LAB. Подготовка merged RRD, загрузка/декодирование и inference модели — разные измерения. Аудит не подтверждает real-time inference. + +Границы текущей реализации: blueprint transport до 1 MiB, необязательный perception payload до 512 MiB; canonical producer source/overlay/replay до 768/256/1024 MiB. Это transport/resource ограничения, не лимиты точного ввода накопления. + +## Blueprint: слои, идентичность и внутренние Python API + +Владелец — src/k1link/viewer/recorded.py; HTTP-контракт — src/k1link/web/session_api.py, POST /api/v1/observation-sessions/{session_id}/blueprint.rrd. + +Штатные Spatial3DView(/world), Spatial2DView(/perception/camera), metrics; unified LAB использует Horizontal(camera,spatial) с column_shares. Обычные режимы spatial/perception/perception3d/metrics используют устойчивые view/container UUID; owner token входит в uuid5, reset generation 0/1 и mode-specific Tabs identity отделяют намеренный reset/смену режима от обновления слоёв. auto_layout и auto_views выключены, native TimePanel скрыт, общий timeline session_time. + +EntityBehavior меняет видимость /world/points, /world/trajectory, /world/costmap, perception-слоёв и /perception/camera/{image,detections,segmentation/city,segmentation/vegetation}. VisibleTimeRanges применяет накопление к точкам/траектории; динамическая perception остаётся latest-at без искусственных шлейфов. Размер точек — штатный Points3D visualizer override. План меняет eye, не геометрию данных. + +Версионно чувствительная часть: bindings.new_blueprint, RecordingStream._from_native, Blueprint._log_to_stream, bindings.send_blueprint, memory_recording().storage, binary_stream/to_native. Это прямое использование внутренних/низкоуровневых Python hooks, несмотря на неизменённый SDK. Один source blueprint stream живёт на владельца; обновления добавляются последовательно, активная копия повторно активируется. + +Обычные переключения слоёв не записывают eye. 3D/план/reset применяют явные пресеты; FOLLOW имеет отдельный протокол восстановления. При обновлении надо проверять семантику active blueprint clone и сохранение runtime eye, а не только то, что Python-функции существуют. + +## Blueprint lease, bounds и цветовые cache + +src/k1link/viewer/recorded_blueprint_lifecycle.py: ключ (application_id, recording_id, blueprint_session_id), idle TTL 300 секунд, reaper 30 секунд, максимум 32 entries, release tombstones до 4096. Renew открытого владельца каждые 30 секунд; render/release сериализованы; активный render не обрывается по TTL. Есть shutdown cleanup. Durable записи при release не удаляются. + +Frontend core/observation/recordedBlueprintLifecycle.ts отправляет renew/release в /blueprint-lifecycle; при закрытии bounded keepalive с таймаутом 5 секунд. Эта граница относится к ephemeral viewer resources, не к остановке вычислений. + +recorded_camera_bounds.py использует bindings.RrdReaderInternal и названия Arrow-компонентов. LRU на 8 поколений keyed by path/size/mtime хранит scene bounds и индекс translation /world/sensor_pose на session_time. RRD не перечитывается при каждом переключении. Максимальный zoom-out выводится из диагонали сцены и upstream factor 5. + +device_plugins/xgrids_k1/recorded_point_colors.py пишет цветовой RRD override в тот же recording, без дублирования геометрии/траектории/видео/AI. Режимы intensity/height/distance/rgb/class; палитры turbo/viridis/plasma/grayscale/custom. Cache индекса по умолчанию 384 MiB, payload 192 MiB; отдельный payload ограничен 256 MiB. Правила fallback/метаданных принадлежат этому адаптеру. + +RrdReaderInternal, Arrow component schema, правила слияния override и memory ownership — обязательные точки проверки при смене SDK. + +## Навигация и FOLLOW: фактический механизм + +recordedRerunCameraJournal.ts реконструирует position/lookTarget/eyeUp по pointer orbit/pan/roll и wheel. Публичного WebViewer API для чтения текущего native eye в 0.36.3 нет: журнал не является снимком из ядра. + +Скопирована модель поведения из upstream eye.rs: rotation 0.004, pan 0.001 × radius, wheel exp(delta/200), отдельный pinch/ctrl divisor 100, line scroll factor 8, near radius 0.02, ограничение pitch 0.99 × π/2, scene-derived max radius. Эти численные и событийные правила — контракт переноса даже без vendor patch. + +Коммит b2a1b23: при FOLLOW off session_api.py добавляет к journal offset текущий /world/sensor_pose и записывает мировую eye-позу; камера остаётся на месте, сканер продолжает движение. При FOLLOW on сначала устанавливается tracking, затем после двух animation frames восстанавливаются направление/up/радиус относительно текущего пивота. Это компенсирует upstream auto-fit нового tracking entity. Обычные TGS/DDRNet/рамки не должны писать eye или пересоздавать viewer. + +Проверенный сценарий и результаты предыдущей browser acceptance сохранены отдельным историческим блоком. Не распространять это доказательство на все native gestures: WASD, double-click/picking fit, inertia и другие неотражённые журналом действия могут расходиться с восстановленной позой. Полная замена журнала официальным pose API — возможное последующее улучшение, если такой API появится; в этой ревизии не выполнялась. + +Точная исходная опора: https://github.com/rerun-io/rerun/blob/0.36.3/crates/viewer/re_view_spatial/src/eye.rs . + +## Viewport UI, разделитель и native chrome + +apps/control-station/src/components/laboratory/CanonicalRecordedLabReplay.tsx размещает внешний @nodedc/ui-react SplitPane над одним native viewer. Контролы принадлежат секциям overlay; separator меняет controlled primarySize. CanonicalResultRerunReplay.tsx передаёт размер в native Horizontal column_shares с debounce 75 ms. Это управляемая внешняя компоновка плюс синхронизация blueprint, а не отслеживание перетаскивания native Rerun divider. + +У canonical result начальное соотношение 46/54. Внешний SplitPane ограничивает обе стороны минимумом 24%, backend share принимает 10–90%. Если источники дают только camera или spatial, выбирается одно окно. Панель каждого окна находится сверху слева в его границах; pointer-events разрешены для контролов/разделителя, прозрачная остальная область не должна блокировать native input. + +styles/m4-replay-threat.css: flex-wrap и display:contents обеспечивают перенос отдельных групп/контролов по доступной ширине; под глобальные refresh/fullscreen резервируется 7rem справа. 3D/план и FOLLOW остаются в общей адаптивной строке spatial-панели. Общие действия принадлежат LaboratoryEvidenceViewer.tsx. Refresh здесь — явный сброс положения видов через reset generation; не произвольная перезагрузка данных. + +styles/spatial.css обрезает native chrome сверху на 72px (три ряда по 24px). Это чувствительно к версии native UI и масштабу, хоть WASM не патчится. Старый фиксированный camera interaction lock не включён в canonical profile. + +Сегодня это реализация camera + spatial/single pane с фиксированными видами, а не готовый универсальный редактор дерева из 50 viewport. Расширение дерева компоновки и проверка resource budget для десятков окон остаются отдельной задачей. + +## Конфигурация, онтология и точный смысл кнопок + +Проекция модулей и viewer layers: src/k1link/observatory/domain_ontology.py, portable_setup_projection.py, frontend core/observatory и CanonicalResultRerunReplay.tsx. Сохранённые moduleIds/viewerLayers определяют доступные панели и кнопки; отсутствующие возможности не должны появляться из текста заголовка. Точные конфигурационные значения и display profile отделены от immutable результатов расчёта. + +КАМЕРА управляет только /perception/camera/image; рамки и segmentation независимы от фона камеры. РАМКИ доступны по наличию detections. EOMT → segmentation/city, DDRNET → segmentation/vegetation. Если оба semantic toggles включены, текущий selector отдаёт приоритет EoMT; это не одновременная визуализация двух масок. + +TGS → /world/costmap. ИСХ. ТОЧКИ и ЛОК. SLAM используют одно sealed /world/points: showPoints = source || localSLAM; SLAM дополнительно включает trajectory и выбранное накопление, source-only использует 0. Это не два разных набора математических/декоративных точек. Настройки не меняют расчётные raw данные. + +3D/ПЛАН — явные camera presets; СЛЕДОВАТЬ — tracking текущего sensor_pose с восстановлением eye. Профиль отсутствующего слоя не должен запускать inference или создавать имитацию evidence. + +## Display profile LAB: хранение и применяемые поля + +Frontend: CanonicalResultRerunReplay.tsx, core/observatory/labViewProfile.ts. Backend: src/k1link/observatory/lab_view_profiles.py, web/modular_observatory_api.py. Профиль привязан к result_id, хранится отдельно от immutable calculation config; запись файла через temp/fsync/atomic replace. + +Изменения отображаются сразу; localStorage хранит локальный draft, при открытии читается серверный профиль. Закрытие окна настроек отправляет PUT. Окно закрывается и при ошибке; compact error toast сообщает, что серверная запись не подтверждена. Успех в памяти или localStorage не равен подтверждённому сохранению на сервере. + +Поля: point_size, accumulation_seconds, color_mode, palette, show_grid, show_labels, show_camera_frustums. Накопление: slider 0–500 s, точный ввод конечного значения ≥0 без верхнего product cap. Point size: slider 0.1–10 px, точный ввод ≥0.1 без верхнего cap. Нормализация: накопление до целой секунды, размер до одного десятичного знака; отрицательные/NaN/Infinity недопустимы. + +Размер, диапазон накопления, цвет/палитра и grid подключены к viewer. show_labels и show_camera_frustums сохраняются и доступны в UI, но не входят в blueprint request/recorded.py текущего canonical LAB: визуальное применение этих двух настроек НЕ подтверждено и не реализовано в этом пути. + +Layer toggles, FOLLOW, camera eye и split ratio не записываются в этот durable display profile; это состояние текущего просмотра. Проверка cache-clear должна касаться серверно сохранённых полей, а не обещать сохранение всего состояния viewport. + +## RRD producers и данные для официального viewer + +Данные — отдельная часть карты совместимости, не патч ядра. src/k1link/device_plugins/xgrids_k1/rrd_export.py экспортирует базовые points/pose/trajectory; viewer/rerun_bridge.py обслуживает live SDK/GRPC, RH_Z_UP и stream_time. calibrated_overlay.py добавляет калиброванную evidence projection. + +src/k1link/laboratory/canonical_rerun_overlay.py формирует совместимые AssetVideo, VideoFrameReference, EncodedImage masks, Boxes2D и Clear. Renderer identity: upstream-rerun-0.36.3-encoded-optimized-v6, replay identity: upstream-rerun-0.36.3-canonical-replay-v1. Источник store identity читается через RrdReaderInternal. Видео приводится ffmpeg к native-compatible H.264; immutable lineage/digest связывают cache с исходной записью и renderer. + +CLI Rerun применяется для merge/optimize. Профиль оптимизации overlay: object-store, max-size 4MiB, max-rows 512, num-pass 20. Поведение CLI, поддержка codecs/components, store identity и порядок latest-at/Clear должны повторно проверяться при обновлении; менять имя renderer без повторной materialization недостаточно. + +Другие владельцы Rerun evidence: observatory/portable_replay.py, portable_semantic_replay.py, portable_object_replay.py, portable_tgs_replay.py; sessions/lab_cache.py и canonical_lab_spatial.py; compute/results.py, integrated_perception.py, fusion_epoch.py. Их логирование надо сверять с SDK при обновлении даже если viewport UI не менялся. + +application_id, recording_id, временная шкала и entity paths обязаны совпадать у base/sidecar. Старые sealed results нельзя переписывать ради смены viewer: производные cache перестраиваются с новой renderer identity и проверкой lineage. + +## Архивный форк 0.34.1 · сохранён, не активен + +Полный старый набор находится в apps/control-station/vendor/rerun-web-viewer-0.34.1/: BUILD_INFO.md, NODEDC_ZOOM_TO_CURSOR.patch, re_viewer.nodedc.js, re_viewer_bg.nodedc.wasm. Upstream commit 4efb18f17f6f0e41985cda99a2bdcd012febc8d5; история до миграции помечена baseline/custom-legacy-before-canonical-rerun-2026-08-30. + +Rust patch менял eye.rs и ui_3d.rs: zoom вокруг точки под курсором/focus plane, orbit вокруг picked point, dolly после near radius 0.02, scene-scale floor скорости, persistent follow при orbit/zoom, восстановление последнего rendered eye после blueprint activation. Эти возможности не следует автоматически приписывать текущему upstream 0.36.3. + +scripts/patch-rerun-web-viewer.mjs также содержал ready/handle guard watchdog и общий keyup listener; scripts/transform-rerun-web-viewer-glue.mjs — per-instance WASM glue, teardown/finalization/destructor guards. Installer проверяет версию строго 0.34.1 и известные хеши. Он больше не вызывается postinstall; импортов архивной пары в активной сборке нет. Не запускать его для 0.36.3. + +Воспроизводимость старой сборки описана BUILD_INFO.md: Rust 1.92.0, Binaryen 117, rust:1.92-bookworm с digest e90e846de4124376164ddfbaab4b0774c7bdeef5e738866295e5a90a34a307a2, upstream builder и transform script. Исторические Rust tests: 10 passed, не повторялись в этом аудите. + +Архивный WASM SHA-256 ffe7543d28bb3394f289f6299de43d038767eef83d781c2b7f8f5683308a0469; glue SHA-256 0f7b76c9f24cbd8437021b5d37499894aeadc586183e422ebc82ef556d7b8339. Этот архив — свидетельство прежних изменений, не инструкция автоматически возвращать их при следующем обновлении. + +## Что остаётся чувствительным и что не подтверждено + +1. SDK не изменён, но blueprint transport и чтение RRD зависят от private bindings. Универсальная переносимость без адаптации не доказана. +2. Журнал камеры повторяет часть native navigation. Полная идентичность для всех способов навигации не доказана; текущая FOLLOW-компенсация зависит от auto-fit и порядка кадров. +3. Native chrome crop 72px и синхронизация external/native layout зависят от UI и blueprint поведения Rerun. +4. show_labels/show_camera_frustums сохраняются без применения в canonical LAB; два semantic toggles не дают две одновременно показанные маски. +5. Source/SLAM — два способа представления одной геометрии. Раздельные raw/math и decorative geometry здесь не реализованы. +6. Конструктор произвольного числа viewport и работа 50 окон не реализованы/не квалифицированы. Лимит blueprint owners 32 нельзя трактовать как поддержку 50 viewers. +7. Cold materialization, полная готовность LAB и освобождение memory требуют самостоятельных измерений. Быстрое переключение слоёв не доказывает real-time inference. + +Эта ревизия фиксирует ограничения, не устраняет их рискованным изменением принятого viewer. При следующем обновлении сначала квалифицировать новые публичные API и затем отдельно решать, какие private adapters можно упростить. + +## Свидетельства этой ревизии и воспроизведение + +5 сентября 2026 повторно сверены upstream npm/PyPI archive hashes, installed files и built WASM. Матрица файлов/методов составлена по коду b2a1b23, а camera/blueprint зависимости — по исходникам официального тега 0.36.3. Исходные хеши и archive URLs записаны в JSON-свидетельстве. + +Повторно запущено: node --test test/rerunWebViewerVendor.test.mjs test/recordedRerunCameraJournal.test.mjs test/recordedViewerResourceLifecycle.test.mjs из apps/control-station — 16 passed. Из корня: .venv/bin/python -m pytest -q tests/test_recorded_blueprint_lifecycle.py tests/test_recorded_camera_bounds.py tests/test_observatory_lab_view_profiles.py — 12 passed. + +Полная предыдущая проверка принятого FOLLOW-кода: 759 frontend tests, 65 backend tests, typecheck/build/Ruff и ручной browser-сценарий указаны в историческом блоке; в этом документальном аудите полные suites и browser-сценарий заново не выполнялись. Runtime-код не изменён. + +Для независимого повторения происхождения: получить архив точной версии из npm registry/PyPI; сверить digest с lockfile и registry; сравнить каждый файл npm package с node_modules, файлы rerun_sdk/rerun_bindings из wheel с .venv; отдельно SHA-256 установленного и dist WASM. Не считать один version string доказательством неизменённого пакета. + +Официальные исходники: https://github.com/rerun-io/rerun/blob/0.36.3/rerun_js/web-viewer/index.ts ; https://github.com/rerun-io/rerun/blob/0.36.3/crates/viewer/re_view_spatial/src/eye.rs ; https://github.com/rerun-io/rerun/blob/0.36.3/rerun_py/rerun_sdk/rerun/blueprint/api.py . + +## Обязательная проверка при следующем обновлении + +- [ ] Создать отдельную ветку от зафиксированного main; записать старую/новую пару SDK+Web Viewer, upstream commit, lockfile и archive hashes. Не запускать installer архивного форка. +- [ ] Сверить публичный WebViewer API, загрузку Vite/WASM, iframe handshake/facade и события; проверить stop, late start и закрытие всех каналов. +- [ ] Сверить private blueprint hooks, RrdReaderInternal/Arrow schema, active clone semantics, UUID/reset identity; отдельно подтвердить lifecycle renew/release/TTL. +- [ ] Сопоставить eye.rs/ui_3d.rs: orbit/pan/roll/wheel/pinch, min/max radius, tracking auto-fit; повторить FOLLOW off/static/on при текущем pivot с тем же масштабом. +- [ ] Проверить native chrome crop и layout на обычном/полном экране; подвигать разделитель в обе стороны, проверить локальные панели и перенос без перекрытия refresh/fullscreen. +- [ ] Открыть полную LAB, DDRNet и TRAVEL TGS; отдельно camera-only/spatial-only. Проверить каждую доступную кнопку, raw camera off при работающих masks/boxes и все слои off. +- [ ] При play и pause переключить TGS/DDRNet/boxes/source/SLAM: eye и zoom сохраняются, нет прежней двухсекундной задержки. Записать измерения, не ограничиваться видом активной кнопки. +- [ ] Приблизиться, отдалиться, pan/orbit/roll, использовать native keyboard/double-click и повторить follow. Несовпадения журнала отмечать отдельно, не скрывать. +- [ ] Сохранить cloud profile через закрытие, проверить server readback, открыть после очистки browser storage. Проверить 300/500 секунд и точный ввод выше slider; ошибка PUT не запирает окно. +- [ ] Квалифицировать show_labels/show_camera_frustums и двойной semantic selection; известный пробел не отмечать выполненным без подключения и UI-проверки. +- [ ] Проверить export/merge/optimize, codecs, masks/boxes/Clear, color override и lineage на новых SDK. Новый renderer digest и cache строить без изменения sealed source/results. +- [ ] Проверить Saved Sessions и live отдельно от canonical LAB: admission, пять seek на pause, play/resume, clocks, decoder recovery, отсутствие зависимости replay от worker. +- [ ] Измерить cold/warm open и последовательные open/close memory без forced GC; RRD/receiver/canvas identity стабильна при playback/layer changes. +- [ ] Запустить профильные tests, typecheck/build и ручную UI acceptance. Зафиксировать версии, diff адаптеров, результаты, отклонения и пригодный scoped rollback до main. +- [ ] Rollback делать откатом коммита обновления/lockfiles и пересборкой его dist/cache; не применять старый vendor patch или глобальный reset параллельной работы. Канонический сервис оставить на 8000. + +## Исправление FOLLOW · 5 сентября 2026 + +Коммит b2a1b23, ветка codex/m5-1-observatory. При FOLLOW off журнал камеры раньше передавал координаты без смещения текущего /world/sensor_pose: камера возвращалась к началу маршрута. При FOLLOW on upstream Rerun 0.36.3 выполняет автоматическое кадрирование нового tracking entity и меняет дистанцию. + +Исправление в надстройке: recorded_camera_bounds.py индексирует translation /world/sensor_pose в том же generation-keyed LRU; session_api.py переводит eye offset относительно пивота в мировые координаты на текущем cursor. При отключении FOLLOW записывается текущая мировая поза. При включении сначала устанавливается native tracking, затем после двух animation frames восстанавливаются направление, up и радиус оператора относительно текущего пивота. Обычные переключения слоёв не записывают eye. recorded.py больше не применяет стартовый пресет при смене FOLLOW; пресеты остаются для явных 3D/план/reset. + +Файлы: apps/control-station/src/components/RerunViewport.tsx; src/k1link/viewer/{recorded.py,recorded_camera_bounds.py}; src/k1link/web/session_api.py. Ядро и vendor-сборка Rerun не изменены. + +Проверено: 65 backend-тестов по camera bounds, RRD export и session API; 759 frontend unit-тестов; typecheck; production build; Ruff; git diff --check. Browser acceptance на RAVNOVES004TREE с DDRNet-39, RF-DETR, TRAVEL TGS и LiDAR: приближение при FOLLOW on, off без изменения кадра, воспроизведение с неподвижной мировой камерой от 00:39.215 до 01:26.491, on с переносом к текущему пивоту при сохранении масштаба, повторный off без прыжка к старту. Ошибок уровня error в браузере не зарегистрировано. + +При обновлении Rerun повторно проверить правило auto-fit нового tracking entity, порядок активации blueprint и математику журнала навигации. Основание upstream: https://github.com/rerun-io/rerun/blob/0.36.3/crates/viewer/re_view_spatial/src/eye.rs#L893-L991 . diff --git a/docs/audits/2026-09-05-rerun-upstream-evidence.json b/docs/audits/2026-09-05-rerun-upstream-evidence.json new file mode 100644 index 0000000..cffc2b3 --- /dev/null +++ b/docs/audits/2026-09-05-rerun-upstream-evidence.json @@ -0,0 +1,67 @@ +{ + "npm": { + "version": "0.36.3", + "tarball": "https://registry.npmjs.org/@rerun-io/web-viewer/-/web-viewer-0.36.3.tgz", + "integrity": "sha512-LMGnsxRmY5UwiGras2dZrMnEYkow5Xr4v+1hAUSspXWPPiilMqoz9G77jo8Ps/deAaX81TnOq123DFO8iX/Ulw==", + "git_head": "6ded109d33c549e98185f7c95fa8009d44e4adef", + "compared_file_count": 12, + "mismatches": [], + "hashes": { + "index.js": "009aa5f66c8674ea268a91926c00e2f82cc7a7b7e5535056d93bd4656d6f6812", + "re_viewer.js": "d2a94836dd0e6de40538c4d657cfb423b1803e354e6ee0cd550735eb5aaab09b", + "index.d.ts": "649637dad4e50ef4f2310fc1920b580d16832226a0dda5238355059bf167efba", + "index.ts": "087b25170f720a28aa69c411903133286238900050ac775d2cc511b919846696", + "re_viewer_bg.wasm": "02d6d9c3a569d3faceb01cf89104342d970fc85e7c31a08dedd357b6c7104d2f" + } + }, + "upstream_tag_commit": "6ded109d33c549e98185f7c95fa8009d44e4adef", + "sources": [ + { + "path": "rerun_js/web-viewer/index.ts", + "sha256": "087b25170f720a28aa69c411903133286238900050ac775d2cc511b919846696" + }, + { + "path": "crates/viewer/re_view_spatial/src/eye.rs", + "sha256": "491cf8143630ce7d955689d39bfe02b306172a30005135a1f86cdf348424fe68" + }, + { + "path": "crates/viewer/re_view_spatial/src/ui_3d.rs", + "sha256": "b552f343dd5eb2970827d0b55d3f2febd2d9cfc663d1d5fcc44b5477b33a8ed8" + }, + { + "path": "rerun_py/rerun_sdk/rerun/blueprint/api.py", + "sha256": "00db63587a2daca04d50a38eadef4852b2aaba70e45aa044597189a3f3ea5c1f" + } + ], + "python": { + "version": "0.36.3", + "official_wheel": "https://files.pythonhosted.org/packages/43/ff/e8ce81a4fa451f232abb10f0737c5fa8c812a4b2979bda2f655c58c478eb/rerun_sdk-0.36.3-cp310-abi3-macosx_11_0_arm64.whl", + "wheel_sha256": "804067d6e71747f8461104988be82543b318b583a2837935558a5e79a5e9befd", + "compared_package_files": 507, + "mismatches": [] + }, + "built_wasm": [ + { + "path": "apps/control-station/dist/assets/re_viewer_bg-BO4B44yr.wasm", + "sha256": "02d6d9c3a569d3faceb01cf89104342d970fc85e7c31a08dedd357b6c7104d2f" + } + ], + "audit_date": "2026-09-05", + "application_code_commit": "b2a1b23131642ac496829e467c20c8c069915be9", + "methodology": { + "npm": "Official registry tarball integrity matched registry and lockfile; all published package files byte-compared with installed node_modules package.", + "python": "Official PyPI macOS ARM64 wheel SHA-256 matched PyPI and uv.lock; rerun_sdk and rerun_bindings package files byte-compared with installed .venv.", + "built_wasm": "SHA-256 of production dist WASM compared with the verified npm WASM.", + "upstream_sources": "Pinned tag source files downloaded from the official rerun-io/rerun repository; tag commit compared with npm gitHead.", + "scope": "Documentation-only audit; no SDK, viewer or runtime source changes." + }, + "legacy": { + "version": "0.34.1", + "active": false, + "upstream_commit": "4efb18f17f6f0e41985cda99a2bdcd012febc8d5", + "hashes_verified": { + "re_viewer_bg.nodedc.wasm": "ffe7543d28bb3394f289f6299de43d038767eef83d781c2b7f8f5683308a0469", + "re_viewer.nodedc.js": "0f7b76c9f24cbd8437021b5d37499894aeadc586183e422ebc82ef556d7b8339" + } + } +}