Files
NODEDC_MISSION_CORE/docs/audits/2026-09-21-map-comparison-view.md
T

5.7 KiB
Raw Blame History

Corrected map comparison — view-only admission

Product surface brief

Operator job: inspect the recorded ring before and after reviewed correction, with identical observations, colors, clipping and camera. Primary entity remains the physical recording; correction is a separate derived representation.

Placement: Data → Sessions and recordings → selected source → Information. Extend the admitted overview with a canonical SegmentedControl labelled “Версия облака”: “Исходное / Исправленное”. This is domain content inside an existing composition (class A), not a new workspace, LAB or product root. Rejected: adding another catalog session (would impersonate a physical capture), or a separate experiment viewer (duplicates camera/lifecycle controls). The planner's source preview does not enable comparison and remains original.

States: no admitted pair → ordinary original overview; available pair → explicit version choice; pending update → retain previous view with an updating label; failure → retain previous view with visible error, never silently label original geometry as corrected. Source changes invalidate access. The information panel explicitly refers to original capture metrics in both modes.

Identity, geometry and authority

overview_comparison.py publishes a content-addressed, bounded paired geometry bundle outside the raw session catalog. Its manifest binds original session ID, overview generation, raw artifact digests and reviewed map generation. An atomic pointer selects an explicitly published pair; requests pin that pair, rather than following subsequent publications. No HTTP filesystem path input or mutation API.

The offline producer verifies the admitted map, its packaging receipt, frozen decoded-cache seal, original transport/clocks, frame/pose ownership and current overview. It then samples identical point and pose indices in both geometries. The preview policy is at most 180,000 points and 20,000 poses, uniformly across the complete capture including endpoints. These are viewer resource budgets, not route-distance, acquisition, correction or localization limits. Full resolution corrected and original files remain unchanged. The preview is not a ground-truth accuracy measurement or a new live reference.

Rerun lifetime

One original RRD supplies stable application/recording identity. Updates replace only /world/cloud, /world/route and /world/endpoints through the existing channel. No new recording, viewer mount, blueprint or camera journal update on version or clip change. Explicit Top/3D commands may change the camera; both representations use common bounds. Height controls start unclipped, with maximum at least 80 m. Paired observation colors are computed once conceptually from original heights, so a color shift cannot masquerade as geometry correction.

No Rerun fork customization, solver modification, source-session mutation, reference promotion, vehicle authority, or frontend root change is introduced.

Acceptance

  • Python: 78 focused tests passed across overview/comparison, candidate admission, packaging, reference preparation, planner, correction and registration. The 17 overview/comparison tests were rerun after formatting and passed. Coverage includes exact source/generation binding, hash corruption, symlinks, path traversal, missing version (409 rather than raw fallback), shared RRD identity, route/endpoints replacement, unchanged colors, reversible clipping, and no camera blueprint on representation changes.
  • Frontend: architecture gate, full typecheck, all 884 unit tests and production build passed. After the final footer-only adjustment, architecture + both overview test files (9 tests), typecheck and production build passed again.
  • Ruff and git diff --check passed. Existing Vite large-chunk and Starlette httpx deprecation warnings remain; no dependency change was made for them.
  • The real recorded ring was admitted as a view-only pair: 180,000 identical point indices, all 5,182 poses, original 579.797271 m and corrected 579.982703 m. Full-resolution original and corrected clouds remain intact. Private manifest and generation identities live under runtime evidence, not the session catalog.
  • Canonical API accepted the pair after restart. IAB visually displayed original and corrected versions, Top/3D, and height clipping at 5 m then full 80 m. A manually rotated view remained stable on toggling. Normal/expanded workspace modes preserved version and clipping; Escape closed the information view.
  • Final-build viewport geometry was identical before/after comparison switching: 308.828125 × 311.78125 CSS pixels at the same coordinates on the narrow IAB. The footer uses common copy to avoid changing viewer height with the version. Desktop 1440 × 1000 QA override was reset. The corrected real case remains open in the canonical IAB; no alternative server or extra viewer was started.
  • Resource gate: memory free percentage 4049%; builds, tests, materialization and browser work ran sequentially. Docker Desktop was not started.
  • Ops reporting remains pending: direct tasker_get_agent_instructions and tasker_list_projects both timed out after 60 seconds. No card ID was guessed, no duplicate card or substitute API write was used. This report preserves the implementation/acceptance record for the existing card when Ops is reachable.

Decision and remaining boundary

The candidate can now be inspected in the product. That does not admit it for live localization or autonomous movement. No new scan is necessary just to compare the two representations. A corrected-reference replay and independent repeat capture remain separate acceptance stages, not proved by this viewer.