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.
183 lines
11 KiB
Markdown
183 lines
11 KiB
Markdown
# Reference preparation and recovery before the long field route
|
||
|
||
## Scope and decision
|
||
|
||
Owner-authorized follow-up: useful, evidence-based preparation before recording
|
||
a 1–2 km reference. Preserve dense-start-first v6, all eligible route regions,
|
||
ambiguity rejection, source freshness and independent recording ownership.
|
||
No new field capture, K1 command, threshold relaxation or vehicle authority.
|
||
The current worktree already contained substantial unrelated and earlier work;
|
||
no commit, reset or unrelated cleanup was performed.
|
||
|
||
## Implementation
|
||
|
||
- `missions/sources.py`: prepare one verified private source snapshot for the
|
||
tiles of one atlas, instead of copying and hashing the raw recording again
|
||
for every tile. Verify original source identity and digests before staging
|
||
and after assembly, before returning the atlas. Staging is removed on success,
|
||
corruption, extraction failure and cancellation. Cancellation from the shared
|
||
recording copier is translated to `InterruptedError`, so it remains a cancelled
|
||
planning preparation rather than a product error. Single-submap API remains
|
||
compatible; numerical and presentation maps remain separate derivatives.
|
||
- `missions/reference_map.py`: assemble inside that verified snapshot context.
|
||
Retain the original tile order, 40 m tile geometry and first-point-per-voxel
|
||
deduplication semantics. Lightweight archive/test adapters without a prepared
|
||
snapshot capability retain the existing submap interface.
|
||
- `missions/reference_window.py`: an immutable, run-owned spatial index stores
|
||
source indices grouped in 10 m cells. Exact spherical filtering retains all
|
||
eligible points, duplicates, boundary points and original source order.
|
||
No point-count acceptance gate, thinning, expanded acceptance radius or changed
|
||
transform convention. A reference-identity mismatch fails explicitly.
|
||
- `missions/stationary_live.py`: build the index once for the run and reuse it
|
||
for fresh validation windows. The index is local to the live worker and is
|
||
discarded with it. Lookup mode and examined-point count are retained in each
|
||
window's evidence alongside the unchanged target-array hash.
|
||
- `missions/route_relocalization.py`: preprocess the exact local target once
|
||
per candidate place, sharing its GICP tree across that place's three yaw
|
||
seeds. Seed list, ranking, complete-search obligation, deadlines, ambiguity
|
||
and fresh confirmation are unchanged. This is not a new global retrieval
|
||
algorithm and does not qualify arbitrary kilometre-scale cold starts.
|
||
- `scripts/planning_archive_source.py`, `check_planning_live_bootstrap.py`:
|
||
explicit receipt-drop interval for the private archive adapter, preserving
|
||
surviving source payloads, identity and receipt intervals. Capture ownership,
|
||
recovery and source integrity are checked independently of recognition success.
|
||
- `scripts/check_reference_windows.py`, `check_reference_preparation.py`: bounded
|
||
real-data exactness and preparation checks. They do not use a live singleton,
|
||
connect to hardware, modify physical reports or generate synthetic kilometres.
|
||
|
||
## Exact geometry and measured preparation
|
||
|
||
Private physical source: existing reference JA-SADOVAYA-001 and independent
|
||
physical repeat 018, with source digests from the previous sealed acceptance.
|
||
|
||
`qualification-20260920-reference-index-018.json` and its `-r2` successor show
|
||
the index's development measurements. All 21 saved fresh-fit input windows
|
||
matched both the full-scan result and original frozen registration target
|
||
bit-for-bit. Initial default sorting was slower; stable integer sorting retained
|
||
exact source order with lower overhead. These are retained measurements, not
|
||
a claim that the short reference became faster.
|
||
|
||
Final preparation evidence:
|
||
`.runtime/qualification-20260920-reference-preparation-full/report.json`.
|
||
The harness uses the real `PlanningSources` verification/staging/export/map
|
||
path with a private, hash-bound archive catalog adapter; no production catalog
|
||
or application state is changed.
|
||
|
||
| Measured reference | Selected physical interval | Complete saved trajectory |
|
||
|---|---:|---:|
|
||
| Recorded length | 120.073 m | 487.611 m |
|
||
| Preparation tiles | 4 | 13 |
|
||
| Numerical points | 172,954 | 390,668 |
|
||
| Numerical array bytes | 4,150,896 | 9,376,032 |
|
||
| Preparation wall time | 8.671 s | 28.109 s |
|
||
| Index construction | 0.081 s | 0.187 s |
|
||
| Index integer-array bytes, excluding dictionary overhead | 1,383,632 | 3,125,344 |
|
||
| Median full-scan window | 3.076 ms | 5.682 ms |
|
||
| Median indexed window | 3.508 ms | 5.109 ms |
|
||
| Median examined points | 76,985 | 114,760 |
|
||
|
||
The selected interval's reconstructed map is bit-identical to the original
|
||
physical report. For each map, 21 real query windows matched the corresponding
|
||
full-scan implementation exactly. The complete map contains additional nearby
|
||
geometry, so its targets are not claimed identical to targets on the smaller
|
||
map. This is preparation/lookup evidence, not a 488 m independent traversal or
|
||
recognition acceptance on the expanded map. Timings are one bounded pass per
|
||
map, not a latency guarantee or a synthetic load test.
|
||
|
||
Trajectory export took 0.353 s for 4,959 poses; its private cache is 868,331 bytes.
|
||
All input/code digest checks and staging-cleanup checks passed.
|
||
|
||
## Real archive baseline and injected loss
|
||
|
||
`.runtime/qualification-20260920-map-preparation-018-baseline` replays complete
|
||
018 spatial receipts at 1x through the production ingress/decoder/planner,
|
||
numerical child and in-process 10 Hz scene-delta endpoint. All 13 acceptance
|
||
checks passed. Tracking began at 45.84 s; 22/22 disjoint fresh checks passed over
|
||
85.023 m, with no recovery before admitted STOP. Both spatial queues published
|
||
1,439 and consumed 1,435 receipts, with zero overflow; four per modality remained
|
||
queued at STOP, not lost from raw recording. Maximum depths: lidar 10/32, pose
|
||
9/32. Maximum publisher lag 0.048 s; 1,261 scene requests. Compared with the
|
||
previous 52.40 s replay this acquired earlier, but the comparison is not a
|
||
controlled performance guarantee and scheduling changes fresh-window boundaries.
|
||
|
||
`.runtime/qualification-20260920-map-preparation-018-gap` uses the same archive
|
||
with only derived pose/lidar receipts from [70, 80) seconds omitted. Surviving
|
||
timestamps are not compressed and raw files are unchanged. Exactly 198 receipts
|
||
were omitted (99 each). All 17 checks passed: tracking established before the
|
||
fault; authority cleared at about 74.25 s when the last accepted result expired;
|
||
recovery began with capture still active; ordinary STOP completed the study;
|
||
no previous transform was resurrected as live authority.
|
||
|
||
The recorded operator continues walking after this artificial loss and stops
|
||
for less than the required 10-second stationary prefix at the end. Recovery
|
||
therefore remains unconfirmed. The recorded 270 `recovery_attempt` increments
|
||
are repeated motion-interrupted collection attempts, **not 270 expensive route
|
||
searches**. No new successful numerical recovery or stationary behaviour was
|
||
invented. Both queues again had zero overflow (1,340 published / 1,337 consumed
|
||
per modality); three remained queued at STOP. This proves continued recovery
|
||
ownership and fail-closed behaviour on moving real data, not successful physical
|
||
stop-and-reacquire. That success remains a separate field check; focused tests
|
||
cover the orchestration with a new stationary prefix and three fresh checks.
|
||
|
||
Both replays sealed unchanged executed code and original inputs. The subsequent
|
||
production change was only cancellation-exception translation in `sources.py`;
|
||
these archive replays supply already-prepared geometry and do not exercise that
|
||
method. The later real preparation probe and final focused suite exercise the
|
||
final `sources.py`. No executed replay source was edited during its run.
|
||
|
||
## Tests and runtime
|
||
|
||
Final focused suite: 152 tests, zero failures/errors/skips, retained in
|
||
`.runtime/qualification-20260920-reference-preparation-tests.xml`.
|
||
Coverage includes exact indexed lookup, source mismatch, one snapshot per atlas,
|
||
mutation after assembly, extraction failure, cancellation during copying and
|
||
between tiles, unchanged single-submap API, survivor clocks/payloads, complete
|
||
ranked search, exhausted budget, ambiguity, late jobs, actual loss/recovery,
|
||
STOP ownership, route limits, recording separation and lease cleanup.
|
||
Ruff and whitespace checks passed; existing TestClient/httpx deprecation warning
|
||
remains. All heavy checks ran sequentially; no Mac synthetic load/stress job.
|
||
|
||
The canonical 8000 LaunchAgent was reloaded using its reviewed plan/apply tool,
|
||
after proving no acquisition and resolved/inactive device-command state.
|
||
Current/desired plist SHA remained
|
||
`5d7a58122c016f8021fede27d1b21891ee20238fc38c281e5b33574ff8204e3f`;
|
||
backup and health acceptance succeeded. This is a local code reload, not a NAS
|
||
artifact deployment, data-root migration or scanner command. The UI and 80 m
|
||
presentation ceiling were not changed.
|
||
|
||
Post-reload acceptance: operational health, idle acquisition/control, resolved
|
||
inactive physical command, preserved historical completed planning result and
|
||
80 m ceiling. PID 6431 was the sole backend listener on 8000; none on 8765 and
|
||
no temporary replay/numerical/test/Docker workload remained. Swap decreased
|
||
from 5,947.50 to 5,931.50 MiB across the sequential checks. A concise result was
|
||
appended to the existing MISSIONCOR-81 card via ops-context; private identifiers,
|
||
paths and raw operational evidence were kept local.
|
||
|
||
## Remaining scaling work and next field gate
|
||
|
||
The preparation still decodes selected frames after two sequential archive
|
||
passes per tile and merges voxel keys over the accumulated map. These costs
|
||
still grow with route size. Shared staging removes repeated copying/hashing,
|
||
not all route-length-dependent work. The atlas remains in memory; it is not a
|
||
disk-paged large-area map. A shared seekable frame index / streaming tile builder
|
||
is the next preparation optimisation if the long capture's measurements require it.
|
||
|
||
Protective implementation bounds still exist: export/extraction wall budgets,
|
||
trajectory cache byte/pose count bounds, per-tile frame/point budgets, queue
|
||
capacity and numerical freshness deadlines. None is evidence of a 100 m maximum.
|
||
They were identified, not blindly removed. The original 100,000-point local-map
|
||
rejection remains absent; the separate 100,000 **trajectory pose** bound remains.
|
||
The current 4,959-pose reference does not qualify that bound at long dwell times.
|
||
|
||
Cold route-wide search still verifies every eligible 5 m anchor with three
|
||
precise seeds within its existing budget. Around 2 km gives 401 anchors; sharing
|
||
target preprocessing does not prove this exhaustive stage will finish on time.
|
||
Do not weaken ambiguity checks or accept an incomplete search to hide this.
|
||
|
||
Morning sequence remains: ordinary recording of one approximately 2 km reference
|
||
(line or convenient loop); verify complete capture, export/map preparation,
|
||
memory and source integrity; then a separate repeat from a known start. Cold
|
||
mid-route restart on the long map and physical stop-and-reacquire are separate
|
||
gates. No 2 km, seasonal, absolute-position or autonomous-driving acceptance is
|
||
claimed by the present increment.
|