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

93 lines
5.7 KiB
Markdown
Raw Permalink 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.
# 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 40–49%; 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.