docs(observatory): record saved replay evidence and open visual gates

This commit is contained in:
DCCONSTRUCTIONS
2026-09-03 13:24:32 +03:00
parent 9db29bcdc6
commit eff60e490a
2 changed files with 151 additions and 6 deletions
@@ -0,0 +1,138 @@
# Observatory — saved camera/TGS replay on Core
Date: 2026-09-03. Core packaging: `2797985`; shared viewer: `9db29bc`.
Stage 2B, saved-data projection increment; full visual
acceptance remains open. No new Worker computation, model change, acquisition,
Synology release or onboard/actuation work.
## Source and result
- Session: `20260828T130511Z_viewer_live`, RAVNOVES004TREE.
- Existing job: `observatory-run-b230216709dc4c59bc56c98c7e329bf1`, generation 1.
- Result: `m49-tgs-portable-review-a09d2b4a07d103e4f3693ba746a51be2197214768774eabfded4f109ae80dce4`.
- Package: `52e8afd6aaa38b615008463b873b94feae160946a69ce67aba12efc5f12b1589`.
- Base RRD: `a65196a55fc1a59d391329777608f512a3930b1287f38971da91b9bf379e1468`.
- New merged replay: `012e9c2bdc20a06c5e2c748b8e3d149230fd1a3cf13ac15570c39a3555573a87`,
**193,622,178 bytes**. Original recording and sealed result are unchanged.
The current profile is CPU TRAVEL TGS, not the planned full
DDRNet/RF-DETR/distance/motion/policy graph. No historical E47 or LAB overlay is
substituted for an absent layer.
## Implementation
`portable_tgs_replay.py` verifies artifact digests, source-stage identity,
frame/source clock equality, shapes, dtypes, state codes and measured z bounds.
Each map-gravity-local costmap is translated by its exact selected source pose;
no rotation or estimated pose is introduced. The base RRD remains sole owner
of points, pose and trajectory. Native Boxes3D carry TGS; missing/unobserved
cells have no invented physical volume. Per-state clears and an epoch-end clear
prevent stale obstacles surviving missing evidence or a seek.
`portable_replay.py` packages native AssetVideo/VideoFrameReference and TGS into
one source-clock RRD through the existing canonical merger. Video uses source
PTS, H.264, two encoder threads and a separately sealed proxy. Packaging is
serialized on Core; it has no Worker/model calls. Bounds include 768 MiB camera
input, 192 MiB video proxy, 1 GiB served RRD and a 3 GiB free-space start gate.
These are current admission bounds, not support for arbitrary recording sizes.
The same-origin API binds result ID, base generation and replay generation.
HEAD prepares a missing derivative; GET never prepares or computes. GET requires
the exact generation and supports Range; stale generations return 412.
Warm cache admission verifies publication, metadata, size and SHA, memoizing
the file identity at nanosecond precision in a bounded 32-entry map.
The common `CanonicalResultRerunReplay` is extracted from the existing LAB V1
viewer. Both thin profile adapters use one unmodified Rerun 0.36.3 viewer,
one native clock and existing Design Guideline controls. Source points use
zero accumulation; Local SLAM uses five seconds. No second media/Three.js player
or profile-specific page pattern is introduced. Existing selector semantics
remain: calculated current M49 below; uncalculated current LAB V1 in the selector.
## Video timing evidence
The first proxy exposed an encoder time-base defect: passthrough alone rounded
timestamps to 100 ms and produced **526 duplicate PTS**. It was rejected, not
admitted by weakening the check. The corrected proxy explicitly uses the demuxer
time base (`-enc_time_base -1`) together with `-fps_mode passthrough`.
Real source: 6,830 video packets; proxy: **6,748 decoded frames**, zero duplicate
or backwards PTS, maximum distance to the corresponding source packet PTS
**222 ns**. The last relative PTS is 717.945 s. This is not a claim that every
fragment produced a decodable frame. No synthetic fixed-rate renumbering occurs.
TGS has 6,830 anchors × 2,244 cells: 6,811 available LiDAR associations and
19 missing associations represented as UNOBSERVED. Anchors span
39.215263458757.160263458 s; the camera epoch ends at 757.260263458 s.
The base recording spans 0808.779495667 s. Outside the epoch the derived camera
and TGS are cleared; missing evidence does not imply free space.
## Validation and measurements
- **114 backend tests**: portable arrays/integrity/cache/API/video-timebase,
shared legacy merger, session API, publication and RRD blueprint tests.
- **728 frontend tests**, architecture checks, typecheck and production build.
Existing Vite chunk-size and TestClient deprecation warnings remain.
- Ruff on changed replay modules/tests and focused mypy on the three new
backend modules pass. `git diff --check` passes.
- Successful cold packaging HEAD: **116.950 s**; warm first SHA check:
**0.292 s**; warm HEAD after canonical restart/reopen: **0.046 s**.
Header time is not browser-ready time or inference latency. The browser
still loads/decodes a 194 MB RRD; opening is not instantaneous.
- Exact-generation Range request returns 206 and `RRF2`. Wrong generation,
missing preparation and same-size cache corruption have regression tests.
- Browser: saved M49 opened after canonical restarts, play/pause, forward and
backward seek (39 s, 77 s, 406.630 s, end and before coverage), normal/expanded
composition, Escape, Source/Local SLAM/TGS, camera modes and 3D/PLAN checked.
Unavailable semantic controls stay disabled. Coverage-end camera/TGS clearing
is visually confirmed. No Calculate action was used during this increment.
- Queue readback retains the same current M49 job, created 08:08:03.013Z;
no new M49 run was created by opening the viewer.
- Heavy local operations ran sequentially. Transient memory pressure 2 after
full frontend work recovered to 1 before the next heavy stage; no host load
test or Docker capacity increase was performed. Only three durable telemetry
containers remain; no model container was started by this work.
Private command evidence is in `.runtime/observatory-replay-Vt0m2o/`; raw
recordings, images, caches and logs stay out of Git.
Ops report **MISSIONCOR-72**, “Observatory — сохранённый M49 replay с Core”,
issue `4d8079b2-6a3e-4822-9e12-dcd4a4f20017`, was created through direct MCP.
An earlier transport-failed attempt was followed by a successful empty search
before creation was retried; no duplicate was found.
## Open visual boundary — do not mark full 2B complete
Rerun 0.36.3 activates a **clone** of the SDK blueprint. Appending to the SDK
source without activation does not update the visible layer. Reactivation
updates layers but discards the active clone's manually edited eye. A stable
source-store ID does **not** prove operator-camera preservation.
This is confirmed by browser orbit/toggle QA and
[upstream activation implementation](https://github.com/rerun-io/rerun/blob/0.36.3/crates/viewer/re_viewer_context/src/store_hub.rs#L910).
Portable replay explicitly opts into reactivation. Legacy/Data/live behavior
is not changed by this opt-in. Distinct native 3D and plan presets fix the
plan-to-3D return. Initial following-eye activation waits until source-clock
admission; initial/reset framing remains native, not a fixed world-origin eye.
QA also isolated initial latest-at boundary admission: at the exact first
timestamp derived layers were absent, while a small forward seek revealed them.
The portable initial cursor is placed 1 microsecond inside the first sample;
logged camera/TGS/source timestamps remain unchanged. This is not a per-frame
offset or evidence interpolation.
The final browser recheck of this one-microsecond initial-cursor change is
pending: after the final successful build macOS memory pressure stayed at 2
with all temporary test/build/viewer processes already stopped. The local
resource gate prevents another heavy replay until pressure returns to normal.
**Changing a portable layer still resets a manually changed
viewpoint to the preset.** Preserving that eye needs a supported native mechanism
or an explicitly reviewed dependency decision. No WASM patch/private API/fork,
DOM emulation of viewer controls or second camera engine is added.
Other remaining gates: detailed visual quality/coverage acceptance, versioned
incremental recorded-analysis input (2A), LAB V1 and second source (2C), bounded
disk eviction/recovery/catalog at scale (2D). The new derivative cache currently
has per-artifact bounds/free-space admission but no total LRU quota or health
aggregation. Packaging is still lazy on first open, not publication-time.
The old LAB V1 camera-proxy timing path is not repaired by this new adapter.
Replay success is neither realtime full-graph qualification nor traversability,
navigation, motor or safety authority.