Files
NODEDC_MISSION_CORE/docs/audits/2026-09-21-full-route-search-fix.md
T

119 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Complete route search before provisional localization
## Decision and scope
Owner-approved follow-up to the [entry/seam audit](2026-09-21-ring-entry-and-seam-review.md).
Fix cold-start search scheduling, retain the precise start-area solver and all
geometric/fresh-data gates. No device commands, threshold relaxation, map
correction changes, endpoint snapping or retroactive edit of the failed study.
`route-relocalization/v7` compares the complete selected route before choosing a
provisional place. A finite hypothesis queue replaces the shared 35-second
deadline. `stationary-fresh-bootstrap/v4` separates search geometry from current
localization evidence; an old prefix can never establish tracking directly.
## Algorithm and boundaries
1. Collect the existing 10-second stationary prefix.
2. Run all 108 established dense-start seeds at the start/last confirmed hint.
Keep a qualified dense candidate, but do not accept it before route comparison.
A missing local start target does not prohibit searching the remaining map.
3. Index the complete reference and rank all geometrically usable route anchors,
spaced by the existing 5-m policy. Ranking changes order, never eligibility.
4. At each anchor, test the existing three yaw proposals with two translations:
sensor entry to route anchor, and the former cloud-median placement. One
prepared local target tree is shared by all six fits. No atlas density cap
or new thinning is introduced.
5. Compare the resulting SE(3) clusters together with the dense-start candidate.
A distinct similarly good place remains ambiguous; first passing fit is not
accepted. A failed fresh trial can advance to the next unambiguous candidate,
with a new receipt fence and no reused validation data.
6. During search, continue checking source identity/order, receipt segment,
pose/cloud freshness and stationary translation (existing 0.10-m envelope).
Movement or broken input invalidates the hypothesis. The existing 40-second
prefix-age fence remains for the legacy local protocol, not for v7's explicitly
monitored stationary whole-route search.
7. After the result arrives, discard all pre-result receipts for confirmation.
Three consistent fresh geometric checks remain mandatory before tracking.
Ordinary tracking, local reference extraction, quality thresholds and the
8-second fresh-result gate are unchanged.
The numerical child emits progress after individual work units. The supervisor
allows arbitrary total search duration while work advances; 60 seconds with no
progress is a **worker stall**, not evidence that the location is unknown.
STOP, source end, moved-search cancellation and teardown terminate/reap that
exact child. A queued operator retry waits for its release and starts with a new
prefix. Recording remains owned by the device plugin.
The candidate queue stays in one worker across scheduling batches; this is not
a durable checkpoint/resume facility after a process crash. A failed worker
returns incomplete search and offers reinitialization without stopping recording.
Operator copy uses the existing status surface under the product UI canon.
## Real saved-input regressions
Same immutable run `473870e0-5210-452c-b9e4-9d7937e93646`, query
`20260921T103511Z_viewer_live`, corrected full reference
`JA-STROITEL-SUN-RING · correction v2`, 579.98 m / 694,420 points.
Only original initialization arrays enter the production worker. No end pose,
later successful transform, manually selected anchor or offline deadline override.
One CPU worker at a time; numerical thread counts fixed to one.
| Original attempt | New result | Surface overlap | Inlier RMSE | Worker wall |
| --- | --- | --- | --- | --- |
| First, failed cold start near route end | Candidate at anchor 113 / 565 m | 98.8467% | 0.14330 m | 138.58 s |
| Second, familiar start | Candidate at start | 98.7191% | 0.13466 m | 156.52 s |
Both searches completed 810/810 fits: 108 dense + 117 anchors × 3 yaws × 2 seeds.
No remaining route anchors; no competing qualified location close enough to
trigger ambiguity. The second case retained the dense-start solution rather
than degrading its target geometry.
All 159 files of the original saved study were hashed before/after each replay
and remained unchanged. Raw evidence and generated arrays/results remain in the
ignored private `2026-09-21-full-route-fix` audit directory. The earlier study
still truthfully records its failed first initialization.
## Validation and review
- 121 focused backend tests passed: route coverage, last-ranked candidate,
dense/global competition, median-seed regression, anchor-origin placement,
multi-minute search, stationary continuity, distinct fresh windows, stale and
ambiguous rejection, live recovery, cancellation, same-recording retry,
child stall/forced cleanup and corrected-map source admission.
- Focused Ruff and `git diff --check` passed.
- Replacing median placement outright failed the existing lateral-offset GICP
regression; therefore both initializations are retained. No quality threshold
was weakened to make that test pass.
- Registration/correction producer files and reference generations are unchanged.
- Application architecture checks, TypeScript, all 887 frontend tests and the
production build passed sequentially. Only the existing large-chunk build
warning remains. Normal/expanded planner, latest ring evidence and Escape menu
dismissal were checked in the existing in-app browser; no live state was faked.
- With acquisition idle and the old study completed, the canonical LaunchAgent
was restarted. Health/liveness passed on the sole port-8000 backend (PID 64086);
no backend on 8765 and no temporary search/test workers remain. New captures
use v7; the old report continues to expose its original v6 evidence.
## Limitations and next field acceptance
Completeness is relative to the declared finite anchor/yaw/seed policy, not a
mathematical proof that every pose in continuous space was searched. Descriptor
ranking remains imperfect; queue completeness prevents a low rank from excluding
the real place, but is not a fast kilometer-scale place-recognition index.
Full comparison increases even familiar-start latency to roughly 2–3 minutes on
this 580-m map. This is an explicit regression in speed, accepted here for complete
comparison, not a claim of final optimization. Target preprocessing is reused;
safe coarse-to-fine acceleration still needs independent evidence.
Offline replay proves the corrected numerical cold-start outcome, **not** live
stationary continuity or independent absolute pose accuracy. Synthetic tests
prove the temporal contract; the operator must confirm it on a new capture.
Surface overlap/RMSE are not position accuracy or autonomous-driving acceptance.
Field check: start at the formerly rejected place (last point of the old pass),
leave the scanner stationary through search and fresh confirmation, then walk
20–30 m across the seam and back. Record the time to tracking and any interruption.
No longer route is needed to answer this regression question.