refactor(lab): restore canonical RAV004 replay

This commit is contained in:
DCCONSTRUCTIONS
2026-08-30 01:22:44 +03:00
parent 74da6437e9
commit f1cbe0061a
21 changed files with 1181 additions and 719 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

@@ -0,0 +1,167 @@
# RAVNOVES004TREE canonical LAB replay audit
Date: 2026-08-30
Scope: Mission Core recorded LAB replay, RAVNOVES004TREE, OPS perception state
Excluded: Gaussian/simulation workers and their artifacts
## Outcome
RAVNOVES004TREE no longer owns a custom LAB viewer. It supplies recording and
model configuration to the same `M4ReplayThreatVisual` and
`CanonicalRecordedLabReplay` implementation used by the accepted recorded LAB.
No new window or status type was added. The stable interaction contract remains:
- media: `SEMANTICS`, model selector, `VIDEO` / `CAMERA`;
- spatial: `SOURCE POINTS`, `LOCAL SLAM`, `TGS COSTMAP`, `SEMANTICS`, `3D` / `PLAN`;
- one timeline, one resizable split and one media-owned playback clock.
Models, result IDs, endpoints, labels and replay transport are configuration.
Window structure, switching, seek, buffering and spatial scene code are shared.
## Why the previous LAB failed
### Video and spatial state had different clocks
The removed RAV004 viewer advanced an animation/host clock even when the browser
decoder stopped. The point cloud therefore continued while the camera frame and
timeline could remain frozen. The shared viewer now uses the decoded media time
as the external clock, and image masks/boxes are rendered only when their time is
within 250 ms of the actually presented video time.
The RAV004 MP4 itself is not clean. An independent `ffmpeg` decode around the
reproducible stop at 11.422 s reported non-monotonic DTS values and corrupt H.264
macroblocks. The RAV004 profile therefore uses the shared segmented MSE transport
and an opt-in timestamp recovery rule. Recovery is allowed only when all of these
conditions are true:
- playback is requested and the media element is not paused, ended or seeking;
- decoded media time has not advanced by 20 ms for at least 1.25 s;
- the browser reports decoded media buffered ahead of the frozen timestamp.
Only then is the broken timestamp interval skipped by 180 ms. The media clock
immediately remains authoritative; the host does not free-run. A stale callback
from the old MSE window is also prevented from undoing an operator seek.
### LiDAR orientation inherited the wrong axes
The RRD declares `/world` as RFU (`Right`, `Forward`, `Up`) and logs
`/world/points` in map space. The earlier adapter treated raw LiDAR quaternion
columns as rover forward/left/up and inherited sensor roll/pitch. That is why the
grid, rover and facade could visibly disagree.
The v3 adapter now uses:
- map `+Z` as gravity/up;
- the smoothed pose-trajectory tangent projected onto the ground as forward;
- `left = up × forward`;
- projected sensor `+Y` only as a fallback when the tangent is unavailable.
This is a deterministic coordinate contract, not a visual angle correction.
### Sensor height was treated as a constant
RAV004 does not have a stable 0.4 m mounting height throughout the recording.
The adapter now estimates the local ground plane from a causal one-second
near-field point window and uses the sealed session estimate only as fallback.
Observed local heights include approximately 0.17 m, 1.24 m, 1.05 m and 0.22 m
at different route positions; a single hand-entered value is therefore invalid.
### Sparse LiDAR frames were held incorrectly
Camera is approximately 9.51 Hz while source points arrive at approximately
2 Hz. A camera frame without a new LiDAR increment used to retain whichever
spatial frame happened to finish loading last; under fast playback this could be
dozens of seconds old. The buffer now loads the active chunk first, the preceding
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.
## Capability ledger
| Layer | RAV004 full route | UI behavior | Authority |
|---|---:|---|---|
| Recorded RIGHT camera | 6830/6830 | `VIDEO` / `CAMERA`, segmented playback | recorded evidence |
| DDRNet semantic mask | 6830/6830 | selectable, opaque enough for review | diagnostic prediction |
| EoMT semantic mask | 6830/6830 | selectable | diagnostic prediction |
| Diagnostic object boxes | derived from connected EoMT mask components | media-time gated | not an independent detector |
| Source points | 1444 increments | `SOURCE POINTS` | recorded geometry |
| Bounded Local SLAM | causal 5 s / 27k-point limit | `LOCAL SLAM` | visual-derived |
| Full-route TGS | **absent** | canonical `TGS COSTMAP` control is visible but disabled | unavailable, fail closed |
| Point-aligned 3D semantics | **absent** | canonical `SEMANTICS` control is visible but disabled | unavailable |
| Independent person/vehicle detector | **absent** | no STOP claim | unavailable |
Ten old TGS review anchors exist, but they are not a continuous route artifact.
They are not repeated or held as if they were full TGS. The accepted RAVNOVES00
full-TGS result is also not reused because it has a different source identity and
4489-frame timeline.
## Performance evidence
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;
- browser console after the acceptance run: no warnings or errors.
The first RRD index is still process-local rather than a persistent disk cache.
That is an explicit remaining performance gap; warm playback is the admitted
profile, cold restart latency is not yet accepted.
## Nature perception: current OPS stopping point
OPS card `MISSIONCOR-65` defines the intended independent layers as EoMT,
DDRNet, frozen YOLOX and TGS. The current immutable RAV004 artifact proves full
EoMT and DDRNet inference only. It does not prove full TGS, negative-obstacle
handling, an independent person/vehicle STOP layer or combined real-time load.
Isolated full-route measurements:
- DDRNet-39: p95 27.44 ms, 52.67 inference FPS, validation mean IoU 29.715%,
vegetation mean IoU 0.3701;
- EoMT: p95 361.62 ms, approximately 3.01 inference FPS;
- prior accepted RAVNOVES00 TGS: p95 1.694 ms CPU-only, but this is algorithm
performance on another source, not RAV004 proof.
The DDRNet isolated throughput is sufficient for a 10 FPS budget. DDRNet is not
accepted for driving policy because temporal stability and nature quality are
not sufficient: the OPS temporal sample recorded adjacent-frame IoU near 0.195
for high grass and 0.400 for woody vegetation. EoMT does not meet 10 FPS in its
current form. The next evidentiary milestone is therefore not another UI model
toggle; it is synchronized truth for grass/tree/ditch/drop-off, full TGS and
negative-obstacle evidence, frozen independent detector output and a combined
load test at at least 10 FPS.
Worker 006 was audited read-only. Triton and the Gaussian containers were left
untouched. The separate Mission Core perception worker is currently in a restart
loop (404 during model inference startup); this audit did not stop, recreate or
deploy it.
## Acceptance performed
- 44 focused backend tests passed;
- 37 frontend replay, buffering and LAB contract 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.
Visual QA: `docs/handoff/2026-08-30_RAV004_CANONICAL_LAB_QA.jpg`.
## External coordinate and media references
- Rerun ViewCoordinates: <https://rerun.io/docs/reference/types/datatypes/view_coordinates>
- Rerun transform relation: <https://rerun.io/docs/reference/types/components/transform_relation>
- Rerun transforms: <https://rerun.io/docs/concepts/logging-and-ingestion/transforms>
- Rerun Transform3D: <https://rerun.io/docs/reference/types/archetypes/transform3d>
- WHATWG media element model: <https://html.spec.whatwg.org/multipage/media.html>
- W3C Media Source Extensions: <https://www.w3.org/TR/media-source-2/>