Files
NODEDC_MISSION_CORE/docs/audits/2026-09-21-recorded-cloud-fidelity-and-navigation.md
T

7.7 KiB

Recorded cloud fidelity and navigation — 2026-09-21

Scope and evidence

Operator report: JA-STROITEL-SUN-RING-002 is slow to reopen, its cloud is much sparser than the live scan, point-size changes do not appear effective, the accumulation control stops at 120 s, and the orbital pivot moves off the grid. No scanner commands, raw-cloud changes, alignment-threshold changes, or map correction changes are part of this work.

The large ring has 13,608 captured point frames and 49,217,854 points over 1,446.684 s. The selected corrected map remains generation 99f7b84541875a23aa3a8c58eb246116b66f8af03f1d2656eba4b527af36b1db. These are captured samples, not a count of unique surface points.

Confirmed causes

  1. The v12 RRD exporter retained only frames 1, 6, 11, … . Normal point batches were complete, but four out of five captured scans never reached playback. Another stride of four applied above 100,000 points per individual frame. Neither rule altered the immutable raw capture.
  2. Ordinary recorded-view settings appended blueprint rows without activating the updated blueprint. Upstream Rerun uses an active clone; updates need activation. The LAB costmap path already requested this, ordinary recordings did not. A visible slider value was therefore not evidence of native state.
  3. Both accumulation controls clamped to 120 seconds, independently of the duration of the source.
  4. Preparing the already-published v12 recording took 6.290 s on the first API request (including integrity checks), then 0.006 s on the next request with the same 182,745,691-byte RRD digest. No repeated map correction or RRD export was observed in those requests. This is not a browser-open timing: the disposable native viewer still reads and indexes the RRD when opened.
  5. Ordinary display requests sent a playback cursor, causing a full RRD bounds scan even though the eye did not change. Only tracking-relative camera transitions now send that cursor.
  6. Global HTTP gzip recompressed native RRD chunks; the stock 64 KiB file response also incurred thousands of thread/event-loop handoffs competing with telemetry/color work. RRD routes bypass gzip, and pinned file responses use bounded 1 MiB reads. JSON/text compression, Range, ETag and cache pins remain intact.

Implementation

  • v13 RRD projection retains every point of every captured frame. Color-only overlays follow the same timestamps and complete point ordering. Only the derived cache version changes; old projections are not accepted as v13.
  • Both existing accumulation controls use one shared 1,800-second maximum, with minute/second labels. The control changes the visible history; it does not delete or decimate archived points. Existing chosen values are retained.
  • Every recorded display update requests blueprint activation. Stable view IDs remain; ordinary display changes do not inject a guessed camera pose.
  • Export/cache failures remain explicit. There is no silent low-quality fallback. More complete data necessarily increases file and memory size.

Navigation boundary / pending decision

Rerun SDK and web viewer remain unmodified 0.36.3. Upstream eye.rs pans in the screen plane, not the XY ground plane. Its orbital zoom approaches the current look target; it does not fly through that target toward a remote object. The public WebViewer API cannot read/write the active eye. The local camera journal is a shadow estimate, not the native camera controller; changing that estimate alone would not fix ground-constrained pan and would risk more desynchronization.

The requested ground-constrained pivot and unchanged pivot during orbit need a deliberately supported native navigation extension (with pinned source, patch, build provenance and upgrade tests), not per-pointer HTTP blueprint replacement or another overlay renderer. Owner approval for that change to the unmodified-upstream architecture was requested. Native navigation is not claimed fixed by this increment.

Validation

  • Architecture tests, full TypeScript check and 889 frontend unit tests passed.
  • Production build passed (existing large-bundle warning remains).
  • Focused Python export/color/cache/corrected-map tests passed. New checks prove all 12 synthetic cloud frames are actually logged, all six color frames are emitted, corrected positions are retained for every frame, 0.5 screen-space radius is serialized, and a 30-minute history does not write eye controls.
  • Real v13 export completed. A streaming audit counted exactly 13,608 frames and 49,217,854 positions, matching capture metadata. Size 743,853,833 bytes; SHA-256 40dbebba5dddccf94ba5c48118a94909bdb01ee8de883746d0db54a5d4ea86f2. A repeat prepare request reused this digest in 16 ms, without another export.
  • Incremental gates: 81 frontend tests, full TypeScript check and production build passed; 12 focused HTTP/session tests passed, including unchanged RRD bytes, 206 ranges, length, ETag, pin release, overlay POST and retained JSON gzip. No extra integrated backend was started.
  • Bounded real HTTP sample: an 8 MiB range took 7.274 s with 64 KiB reads while the archive/color load was active. After the 1 MiB change, cold metadata restoration took 5.264 s and the body another 6 ms; the warm repeated request took 13.9 ms total. These differ in background load and are not a controlled throughput benchmark or a complete browser-open measurement.
  • Browser acceptance on the canonical IAB viewer: after the transport fix, the complete 24:06.684 timeline and dense playing cloud were visible at the first inspection roughly 45 s after open (upper bound, not a precise load stopwatch). Before the chunk-size fix, a 5+ minute observation still had no usable timeline. Native color defaults remained visible while the first requested height/Viridis overlay was preparing.
  • Paused playback at 60 s: 0.5 → 5 → 0.5 changed the actual native point footprint; a manually orbited camera retained its viewpoint through these settings changes. Expanded cloud/Escape restore worked. The existing display modal was used; its product anatomy was not changed in this task.
  • The 1,800-second slider showed “30 мин”; seeking to the exact archive end kept earlier geometry visible. However, this full-cloud draw took roughly 23 s for the UI capture and swap rose from about 9 GB to 14.8 GB. The viewer was closed immediately to release resources. This is functional acceptance of the range, not smooth full-ring interaction acceptance on the 18 GB Mac. No hidden decimation or lowered accumulation limit was substituted.

Remaining work and limits

  • Ground-constrained pivot, fixed-target orbit, and map-independent zoom are not implemented; they require the native-controller decision above.
  • First non-default coloring still decodes the complete source into a bounded overlay cache and can take minutes on this capture. The existing index cache is smaller than the complete 49M-point index. Opening no longer waits for this to show the base cloud, but color-preparation latency is not solved.
  • Full-fidelity storage is not a sufficient large-scene rendering strategy. A follow-up should separate a whole-route overview from full-detail spatial inspection, with explicit level-of-detail/provenance and access to every raw point. Do not reintroduce silent frame skipping as a performance “fix”.

Resource and authority policy

Single canonical service on port 8000; no Docker startup, extra viewer, load test, device command, changed raw evidence or regenerated corrected map. Tests, build, large export and browser QA run sequentially on the 18 GB Mac. The full-cloud view is not a guarantee of interactive performance at every history length. Any future LOD policy must be explicit and must preserve a full-fidelity inspection path.