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.
9.4 KiB
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/v1limits 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, K1planning_live.py: preserve native pose orientation in the neutral event ABI.live_tests.pyreceives 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, andPlanningProjectResult.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.348Z–18: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 0–577, map indices 0–785
(approximately 0–50 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 130–160 m
and context approximately 110–180 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 --checkpassed. - 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 34–42% 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 20–30 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.