fix(lab): seal RAV004 spatial replay transport
This commit is contained in:
@@ -22,6 +22,29 @@ Window structure, switching, seek, buffering and spatial scene code are shared.
|
||||
|
||||
## Why the previous LAB failed
|
||||
|
||||
### RAV004 did not use the accepted replay data plane
|
||||
|
||||
The working M4/Hologravity LAB uses sealed binary numeric tracks, retained scene
|
||||
state and bounded JSON metadata. RAV004 reused the visual component but silently
|
||||
left its custom timeline endpoint on the JSON fallback. Each eight-frame spatial
|
||||
window therefore transferred approximately 1.2-2.9 MB and took 0.87-1.37 s to
|
||||
produce while representing only about 0.84 s of playback. The next request
|
||||
aborted and replaced the previous one before spatial state could catch up.
|
||||
|
||||
The user screenshot captured the failure exactly: camera frame 366 was active
|
||||
while the last delivered spatial evidence was frame 230, a 136-frame gap. The
|
||||
backend also reopened and indexed the 6830-entry semantic ZIP for every requested
|
||||
mask and proposal frame. This explains why the same canonical viewer was smooth
|
||||
for Hologravity but stalled for RAV004: the window and interaction code were
|
||||
shared, but the data-plane contract was not.
|
||||
|
||||
RAV004 now publishes the same `missioncore.recorded-spatial-playback/v1`
|
||||
contract as the accepted LAB: an immutable Float32 map-point track, camera-frame
|
||||
offsets and 24-frame binary chunks. JSON chunks contain bounded frame metadata
|
||||
only; retained Local SLAM is reconstructed from exact source increments in the
|
||||
shared client. The semantic ZIP handle and member index are cached per immutable
|
||||
artifact instead of being reparsed per frame.
|
||||
|
||||
### Video and spatial state had different clocks
|
||||
|
||||
The removed RAV004 viewer advanced an animation/host clock even when the browser
|
||||
@@ -77,8 +100,11 @@ dozens of seconds old. The buffer now loads the active chunk first, the precedin
|
||||
chunk second and the next chunk as prefetch. The scene selects the latest proven
|
||||
source increment whose sequence is not later than the active camera frame.
|
||||
|
||||
At the final UI check, camera frame 189 causally held spatial frame 184. Before
|
||||
the fix the same point could hold frame 16.
|
||||
At the final UI check, playback restarted at frame 1, then ran continuously past
|
||||
frame 462. At frame 188 the DDRNet mask was frame 188, proposals were frame 187
|
||||
and spatial state was delivered without buffering; the one-frame proposal delay
|
||||
is the recorded causal overlay, not stale UI state. Before the transport fix the
|
||||
user's run had already fallen 136 frames behind by camera frame 366.
|
||||
|
||||
## Capability ledger
|
||||
|
||||
@@ -104,12 +130,17 @@ full-TGS result is also not reused because it has a different source identity an
|
||||
Measured on the canonical local service and current immutable artifacts:
|
||||
|
||||
- replay launch POST: 3.55 s on first opening;
|
||||
- timeline metadata: 0.02 s warm;
|
||||
- active spatial chunk, eight camera frames: 35.17 s first process-local RRD
|
||||
index build, 0.67 s warm, approximately 3.81 MB;
|
||||
- UI replay: passed the previously deterministic 11.422 s decoder stop, then
|
||||
continued to 59 s with media and timeline advancing together;
|
||||
- operator reset seek: 16.4 s to 0 s, one mounted media worker, successful;
|
||||
- first binary playback-manifest build after a service restart: 32.33 s while
|
||||
the process-local RRD point track is materialized; warm manifest: 0.18-0.20 s;
|
||||
- full retained point track: 3,893,445 Float32 map points, 46,721,340 bytes,
|
||||
divided into 285 immutable 24-frame chunks;
|
||||
- representative active binary chunks: 155-224 KB at 9-10 ms;
|
||||
- representative 24-frame metadata chunks: 24-32 KB at 0.78-1.0 s, covering
|
||||
about 2.4 s of playback;
|
||||
- cached semantic-mask reads: 5.6-7.8 ms instead of approximately 80 ms;
|
||||
- UI replay: reset to frame 1 and ran continuously beyond frame 462 with camera,
|
||||
semantic overlay and retained spatial state advancing together;
|
||||
- operator reset seek: successful, one mounted media worker;
|
||||
- browser console after the acceptance run: no warnings or errors.
|
||||
|
||||
The first RRD index is still process-local rather than a persistent disk cache.
|
||||
@@ -147,13 +178,14 @@ deploy it.
|
||||
|
||||
## Acceptance performed
|
||||
|
||||
- 44 focused backend tests passed;
|
||||
- 37 frontend replay, buffering and LAB contract tests passed;
|
||||
- 12 focused backend spatial/API tests passed;
|
||||
- 16 focused frontend replay transport/manifest tests passed;
|
||||
- TypeScript project typecheck passed;
|
||||
- production Vite build passed (only existing large-chunk warnings);
|
||||
- `git diff --check` passed;
|
||||
- live browser run verified the shared controls, disabled unsealed TGS/3D
|
||||
semantics, continuous media recovery, causal spatial hold and clean console.
|
||||
- live browser run verified reset seek, the shared controls, disabled unsealed
|
||||
TGS/3D semantics, continuous playback through the former failing interval,
|
||||
causal spatial hold and a clean console.
|
||||
|
||||
Visual QA: `docs/handoff/2026-08-30_RAV004_CANONICAL_LAB_QA.jpg`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user