Files
NODEDC_MISSION_CORE/docs/audits/2026-09-19-registration-stabilization-006.md
T
DCCONSTRUCTIONS e515ab1b8c feat(planning): consolidate recorded-route localization and spatial scene
Preserve the completed teach-and-repeat laboratory stage: reference preparation, cascaded acquisition, local tracking and recovery, recording lifecycle, replay qualification, and persistent Rerun scene controls. Document the open grid-picking regression and Rerun upgrade contract. No autonomous driving or loop-closure optimization is claimed.
2026-09-21 08:47:19 +03:00

9.4 KiB
Raw Blame History

Registration stabilization after physical run 006

Date: 2026-09-19. Scope: LAB registration, live presentation, and reproducible qualification. Rover geometry, mounting profiles, obstacle clearance, controller integration, and autonomous motion are explicitly outside this change. Both vehicle_control and localization_confirmed remain false.

Evidence and decision

The preceding diagnosis is in 2026-09-19-physical-start-006-diagnosis.md. Physical run ja-sun-006 (ebee2e65-5d74-49f2-9489-1b2fecf30a76) initially registered successfully. Its late rejection coincided with inadequate reference-map coverage past the selected 30.01 m route. The old renderer then selected the travel-heading hint instead of retaining the accepted transform. Neither the user's uncertain viewing angle nor this reconstruction establishes exactly when the user noticed the apparent rotation. The original report and raw recordings are not rewritten.

The change addresses these demonstrated boundaries, without weakening GICP, initial-search completeness, freshness, or temporal consistency acceptance.

Implemented contracts

  • missions/reference_map.py, sources.py: a live reference map includes up to 20 m of recorded trajectory context on each side of the selected route. route-context-map/v1 limits extraction to three tiles of at most 40 m, 0.25 m voxel deduplication, and 100,000 points. Source identity and hashes are checked by the existing bound/submap path. Invalid distance ordering, excessive interval length, insufficient continuity, and oversized maps fail closed. Route geometry and its selected interval are unchanged. Recorded A/B comparison remains on its existing interval-based submap implementation.
  • missions/live_presentation.py, live_tests.py: latest display data, accepted alignment, and numerical evidence are separate. A newer same-segment cloud may advance under the last accepted transform only while its age is at most 2 s and the accepted fit age is at most 8 s. A rejected result cannot replace that transform. There is no travel-heading fallback before or after registration.
  • missions/live_scene.py: newer points use ordinary height colouring. Green correspondences belong only to the exact accepted fitted window and its own indices/transform. Loss, expiry, source change, and completion remove live highlighting. A terminal display is explicitly historical, not current pose.
  • New runs save a hashed aligned-preview.npz. Restored legacy runs use their last temporally accepted, hash-verified fit window. For old 006 this is a historical window, not a newly reconstructed full terminal cloud. Failed or absent integrity evidence does not authorize a substitute alignment.
  • missions/projects.py: archive rendering follows the same accepted-alignment rule; a versioned derived-scene cache prevents reuse of the old renderer output. Original result metrics remain visible with a note that the scene uses the last accepted alignment while the metrics describe the last calculation.
  • sessions/live_planning.py, K1 planning_live.py: preserve native pose orientation in the neutral event ABI. live_tests.py receives pose telemetry independently of the five-second fit cycle. This is K1 session-frame telemetry, not a chassis pose or a new navigation/control authority.
  • stationary_live.py: scene snapshots every 0.5 s; separate distance-limit, time-limit, cancellation, and input-end reasons. The 40 m LAB cap is unchanged.
  • Frontend PlanningLiveScene.tsx, PlanningSpatialWorkspace.tsx, PlanningTestContext.tsx, planningPresentation.ts, planningProjects.ts, and PlanningProjectResult.tsx: 0.5 s polling with unchanged-terminal revision suppression; explicit live/historical state and stricter cloud-age display gating. No new design primitive, control, CSS surface, or alternative viewer.

Recorded-input qualification

The extended scripts/check_planning_live_bootstrap.py and planning_archive_source.py replay original receipt intervals at 1x through the actual ingress queue and K1 decoder. The production reference-map builder is used before sealing the reference. No physical K1 access, second server, accelerated load, camera replay, or browser timing simulation was used. A 120 s input budget allows the service's existing 40 m cap to terminate the run.

Private evidence lives under the canonical data directory at missions/causal-replays/20260919-stabilization-006-positive-001 and missions/causal-replays/20260919-stabilization-006-negative-001. Each contains input/source hashes, copies of the 34 executed implementation files, reference provenance, receipt deliveries, decisions, scene measurements, RRDs, summary and artifact seal. The 82 original 006 artifacts were verified.

Check Correct entry Wrong reference region
Complete initial search 108 hypotheses; ready at 25.405 s Complete search, not timeout
Tracking Established at 38.356 s Never established
End Distance limit at 100.691 s Initial registration rejected
Final accepted geometry 98.232% overlap; inlier RMSE 0.1533 m No accepted localization
Delivered pose/cloud events 2,014 2,016
Maximum replay delivery lag 0.1679 s 0.0555 s
Qualification checks 11/11 11/11

Positive run: 396d1cd4-e80e-4b87-9a9b-6d1022637404, 2026-09-19T18:29:55.348Z18:31:36.318Z. Tracking persisted through the final accepted fit at 99.758 s, including the former failure region. The reference contains 70,870 points in two tiles, route indices 0577, map indices 0785 (approximately 050 m). The published final distance is 39.486 m; the subsequent input reaches the 40 m termination gate. Terminal display sequence 1995 retains alignment sequence 1983, with no live green authority.

Negative run: 75cad066-9b20-496a-87f0-eda98a783997; reference route 130160 m and context approximately 110180 m. Rejection at 24.443 s, without tracking. This is one wrong-region control, not a false-positive-rate estimate.

The positive replay produced 191 scene exports: server-side export latency p50 3.04 ms, p95 38.49 ms, maximum 171.82 ms. Maximum observed native pose age was 0.884 s. Pose queue overflow was zero; lidar overflow was 1 of 1,007 published frames. Unconsumed terminal queue depths (pose 3, lidar 4) are separate from overflow. These are private replay/server measurements, not physical sensor-to-browser or sensor-to-controller latency guarantees. Surface overlap and inlier RMSE are not independent localization accuracy.

Verification and runtime acceptance

  • 99 focused Python cases passed: stabilization, live/project/failure boundaries, planner, stationary bootstrap, recovery, causal replay, entry, registration, and recording ingress.
  • Architecture 4/4, full frontend 854/854, TypeScript typecheck, then production build passed sequentially. Existing bundle-size warnings remain. Production asset: app-D2qqIbEW.js.
  • Ruff check passed for the nine selected changed/new Python modules and harness files; this is not a whole-repository lint claim. git diff --check passed.
  • Browser QA on real 8000: old 006 opens with the historical accepted transform; the original rejected result remains 49.4% / 0.266 m. Its explanatory note is readable after inspector scrolling. Planner and spatial normal/expanded modes, 3D/top views, reset view, inspector maximize, and Escape were exercised. No browser console errors were reported. Narrow spatial mode retains existing limited toolbar/overlay space; expanded mode was restored. No live device was connected and no live end-to-end browser latency is claimed.
  • Before restart: source/control idle, completed acquisition, receiver stopped, physical command inactive. Versioned LaunchAgent plan/apply succeeded with backup and health acceptance; current and desired plist SHA-256 both 5d7a58122c016f8021fede27d1b21891ee20238fc38c281e5b33574ff8204e3f. No repository/environment migration. PID 91643 → 99603.
  • Runtime started 2026-09-19T18:39:44.252799Z, snapshot-runtime-564d78ca9bd1eb86e13bdce9b4b5be27. Health operational, plugin runtimes 1/1, only canonical 8000 listening and no 8765 listener. Restored 006 is completed/ended/historical, both authority flags false.
  • No Docker workloads were started. Sequential replay/test/build/browser work respected the 18 GB host; reported free memory was 3442% around these checks. Replay publishers and numerical workers terminated and released leases.

Next physical acceptance

Ready for another short manually carried K1 test near the known start, with a new recording name. Wait stationary for actual tracking, then walk 2030 m with the same reference. Do not interpret a fixed wait time, scanner calibration success alone, or one green cloud as permission to start. If tracking is lost, stop the walk, retain the evidence, and finish recording through normal controls. Evaluate startup, motion, height/orientation change, scene freshness, terminal view, recording closure and replay together. The entire raw/archive/camera path must still be accepted physically; this qualification did not exercise RTSP/MSE.

The currently qualified initial search radius remains 5 m. A 10 m start envelope, arbitrary-route global relocalization, generalized failure recovery, onboard timing, independent pose accuracy, and autonomous driving are not accepted by these results. No rover profile or footprint decision is needed to validate this registration change.