Survey Checker — Changelog


v1.7.2 — 2026-06-29

Fixed

  • Resection check no longer flags valid stations — `check_resection_geometry` previously emitted a blocking ERROR ("0 active backsights") whenever a station's backsight control wasn't loaded as a CSV/keyed coordinate, which in turn drove the AI planner to propose *deleting* a perfectly valid station. Determinacy checks now apply only to `StandardResection` setups, the genuine "incomplete setup" ERROR keys off the parsed backsight count, and masking-induced shortfalls are WARN-level (never destructive).
  • Single-backsight known setups not flagged — a normal known-coordinate setup oriented by one backsight is no longer reported as "resection mathematically indeterminate."
  • AI planning crash with guidance text — added the missing `import re` in `planner.py`; submitting an AI auto-fix with instructions previously raised `NameError` → HTTP 500.
  • Point removal honours JXL invariant — `delete_point`/`remove_points` now set `PointRecord/Deleted=true` instead of physically deleting the record, preserving the audit trail per spec.
  • AI no longer proposes deleting in-use control — the iterative summary's `used` flag now uses the shared `_get_observed_names()` helper (which counts station setups), so control used as a station is not mislabelled `used:false`.
  • Residual errors clear when backsights are disabled — `check_station_residuals` now treats a station with no active (unmasked) control sightings as having an empty active set, so disabling the offending backsights actually clears its RESECTION_RESIDUAL issues instead of leaving them reported forever.
  • Optical view honours point_id-keyed corrections — the optical/error-ellipse HR & PC lookup now falls back from `target_id` to `point_id` (by membership, so a legitimate 0.000 m override is not skipped), matching how the corrections are stored.
  • Resection backsights counted by classification, not loaded control — `check_resection_geometry` and `check_station_residuals` now identify a station's resection backsights via the BackSight classification (mask-aware) instead of the loaded control set / the single BackBearing record. Fixes (a) a false "Only 1 active backsight of N recorded" WARN on every multi-point resection, (b) weak-geometry arc-span warnings computed from only the subset of backsights whose grid coords were keyed/loaded, and (c) TBC resection residuals being silently suppressed for backsights whose grid coordinate was forward-computed (`coord_source` 'computed') rather than keyed or loaded from a control CSV.
  • Planner keeps score-neutral fixes — the fix-sequence planner now applies any fix that does not worsen the quality score (a rename/code fix that clears a NOTE without moving the numeric score is no longer silently dropped); progress tracking still terminates the loop when fixes stop helping.
  • File tree ↔ issue list agree on disabled obs — the set-up panel now recognises the `set_status` action (mirroring `plan_state`), so an observation disabled via Status shows as disabled in the file tree as well as being excluded from issues.

  • Added

  • Per-observation outlier detection (`MERGE_OUTLIER`) — pinpoints the *specific bad shot* driving a bust. After merging the flagged duplicates, for each point observed from ≥3 setups it computes the point's position from each setup, takes the median, and flags the single observation that disagrees (e.g. "obs 2605211006→DW04 is +21mm vertically"). Where `MERGE_BUST` only says two setups disagree, this isolates *which observation* is wrong — the actionable finding to re-observe or disable. Needs ≥3 observers (with two you can't tell which is the outlier). Shares the merge-preview graph with `MERGE_BUST` (built once).
  • Post-merge bust detection — a position bust between two setups is invisible while coincident points still carry distinct names (e.g. `SEC1.A` vs `SEC1.A1`) — there is nothing for the multistation check to compare. The QC pass now previews the flagged duplicate merges on an effective graph, re-runs the multistation check, and surfaces the disagreements they reveal as `MERGE_BUST` findings, aggregated per station pair (one finding per pair, reporting the worst dH/dV). On a real deformation survey this exposes a 19mm horizontal / 61mm vertical bust that was otherwise only visible after manually merging. Reuses the Tier-3 effective-graph machinery; multistation issues now also carry structured `dh_mm`/`dv_mm`/`station_a`/`station_b` fields.

  • Changed

  • Merge passes scored by the planner — `MERGE_BUST`/`MERGE_OUTLIER` moved into `diagnosis.run_all_checks` (shared merge-preview graph, built once). Because `simulate()` calls `run_all_checks`, the planner now scores against them: disabling a genuine outlier observation removes a scored ERROR, so the fix-search confirms the fix instead of reverting it.
  • Planner won't game the score by masking — in the reasoning loop a disable/mask fix counts as *progress* only if it reduces the ERROR count. Every disable removes some issue and lowers the score, so without this the planner disabled observations one by one to shave WARN/NOTE flags (observed with Claude on a real survey). A genuine bad shot is an ERROR, so legitimate outlier/error removal still applies; masking a warning does not.
  • Issues recomputed on the effective post-change graph — `plan_state.get_state` now applies all approved changes (rename, merge, delete/remove points, delete station, disable/enable observations) to a copy of the parsed job and re-runs the full check suite, instead of name-filtering a cached raw issue list through ~6 special-case suppression blocks. This removes phantom issues for `record_id`-keyed checks (e.g. `FACE_SPREAD`, `RESECTION_GEOM`) of removed entities, lets checks that should newly fire/clear after an edit re-evaluate, refreshes per-observation `has_issue` flags, and makes adding a check or mutation no longer require editing a wall of filters. The recompute is signature-cached and falls back to the raw issues if it ever errors. Adds `tests/test_plan_state.py` (previously this path had no coverage).

  • v1.7.1 — 2026-06-22

    Changed

  • Hz/V buttons moved to Properties panel — per-obs Hz/V contribution toggles removed from file tree rows; now appear in the Observed Data section of the obs properties panel (inline with face header for multi-face obs, or as a Contribution row for single-face obs)
  • Face 1/Face 2/MTA removed from Layers panel — these layers were not useful controls for end-users; face visibility is managed via obs properties

  • v0.4.6 — 2026-06-21

    Fixed

  • Obs toggle — disappears from file tree — disabling an observation via checkbox no longer marks it ; it uses the Hz/V disabled sets so it stays visible in the file tree with unchecked checkbox and can be re-enabled
  • Per-observation Hz/V contribution — global M_hz/M_v/T_hz/T_v layer toggles removed; each observation row in the file tree now shows [Hz] [V] mini-buttons (green=on, red=off) to independently control contribution to position and elevation calculations
  • Station ordering — disabled stations remain in their original document-order position in the file tree instead of moving to the top of the list
  • Obs click pans plan — clicking an observation in the file tree now opens the properties panel AND pans/centres the plan view on the target point
  • Status dropdown sync — setting Status to Disabled in the properties panel also updates the obs mask checkbox in the file tree, keeping both in sync

  • v0.4.4 — 2026-06-21

    Fixed

  • JXL toggle independent of CSV — turning off a JXL file no longer hides CSV control points; control points from active CSVs remain visible on the plan even when the survey file is masked
  • Observation toggle affects issues — disabling a T or M observation via checkbox now excludes it from QC analysis (was display-only before); issues from disabled observations no longer appear
  • Observation toggle syncs properties ↔ file tree — toggling a face checkbox in either place reflects immediately in the other
  • Disabling M no longer cascades to T's — MTA record and individual face records (T) are now independently maskable
  • File tree always refreshes — file tree now updates after every state load (was only loaded once on first open); fixes F5 requirement after Reset or mask changes
  • Face filter chips hidden for T obs — when opening an individual face (T) record from the file tree, the All/M/T… tab row is hidden (superfluous for a single-face view)
  • ESC clears canvas highlight — closing the properties panel via ESC or the × now also removes the selection circle from the plan
  • Mask warning counts disabled observations — the N hidden badge in the toolbar now includes count of masked observations

  • v0.4.3 — 2026-06-21

    Fixed

  • File mask — JXL toggle — toggling a JXL file off clears canvas, point list, and issues correctly; does not incorrectly prompt "Add Files"
  • File mask — CSV toggle — toggling a control CSV file off removes its points from the plan and point list
  • File mask — all-JXL masked — shows "Survey file hidden" status message with guidance to restore via checkboxes; no longer shows a blank canvas or spurious Add Files dialog
  • Station mask persistence — masking a station no longer permanently removes it from the file tree; unchecking and re-checking restores the station correctly
  • File tree state — accordion open/closed state is preserved when toggling files or stations (was collapsing to closed on every toggle)
  • Reset restores masked files — Reset button now also clears the file/station mask; previously masked files and stations were not restored
  • Docked panels cover bottom bar — all docked panels (Issues, Optical, Chat) now stop 20px above the bottom bar instead of overflowing it
  • Issues panel × button overflow — close button no longer appears outside the panel boundary when the Issues panel is docked; header compacts gracefully in 420px width
  • Backsight legend color — backsight line in the plan legend is now dark green (#166534), matching the backsight lines on the canvas

  • v0.4.2 — 2026-06-21

    Fixed

  • Optical panel docking — added ◧/◨ dock buttons to Optical Observations modal header
  • Chat panel dock covers toolbar — docked chat panel now starts at 42px (below toolbar) instead of top:0
  • Empty session stuck on loading — loading overlay now dismissed when session has no JXL file; Add Files dialog opens immediately

  • v0.4.1 — 2026-06-20

    Added

  • Dockable panels — any panel (QC Issues, etc.) can be docked left or right using ◧/◨ buttons; stays open while working on the plan
  • Floating AI chat — toggleable 🤖 Chat panel in the toolbar; calls the AI advisor endpoint for advice on survey issues; supports docking left/right
  • Right-click context menu in file tree — right-clicking a station or file row in the set-up panel shows the same context menu as the plan view (hide/show, rename, set HR, multi-select, remove); excludes "Add control coordinate"
  • Multi-select — select multiple stations or files via context menu "Add to selection"; floating action bar allows bulk hide/show/remove
  • Project-based sessions — sessions are now identified by a project name (not individual JXL filenames); removing a JXL no longer kills the session; sessions list shows project name with JXL as secondary label
  • Session rename — ✎ button on sessions list renames a session; project name editable inline in the toolbar

  • Fixed

  • Reset now returns JSON — reset endpoint previously returned HTML 500 on error; now always returns JSON
  • Empty session handling — opening a session with no JXL file prompts "Add Files" instead of showing a blank canvas
  • File tree right-click — file header data-* attributes were missing, preventing context menu from showing on file rows

  • v1.7.0 — 2026-06-19

    Added

  • Project Information — settings modal now has a Project Information section (name, description, surveyor initials, survey dates, processed date, company); stored per-session in manifest
  • Promote to Control — point properties panel: "↑ Control" button promotes a computed point to the project control database; coordinates saved to `control_override.json` and picked up by agreement checks
  • Control foresight agreement check — flags control points whose observed position (from polar observations) disagrees with published coordinates beyond the position tolerance
  • Changelog — this view

  • v1.6.0 — 2026-06-18

    Added

  • Right-click context menu — right-click any point on the plan to add a control coordinate, disable the point, delete from JXL, or delete a station
  • Add Control Coordinate modal — enter E/N/H for any point directly; saved to per-session override file, no JXL modification required
  • Delete Point — permanently removes all PointRecords for a point from the JXL (with confirmation)
  • Face/MTA layer toggles — Layers panel: checkbox toggles for Face 1, Face 2, and MTA observations
  • Canvas → left panel sync — clicking a point or observation on the plan scrolls and highlights the corresponding row in the left panel
  • "See issues panel" link — clicking the issues badge in point/obs properties opens the issues panel and highlights the specific issue

  • v1.5.0 — 2026-06-18

    Added

  • Prism catalog — 16-entry catalog (Trimble, Leica, L-bar, generic) with standard constants; auto-selects nearest match by name or PC value on load; selecting a catalog entry auto-applies the constant; Custom entry opens manual PC edit
  • Backsight toggle — obs properties: dropdown to flip an observation between backsight and non-backsight; writes `Classification` in JXL
  • Point renaming — ✎ button next to Point ID in point properties; enters new name in edit modal; applies `rename` action to JXL
  • HR inline edit — removed the lingering bottom HR input bar; HR now editable via ✎ pencil button (matching HI and PC)

  • v1.4.0 — 2026-06-17

    Added

  • Feature Code always visible — point properties always shows Feature Code row (was hidden when empty); renamed from "Code"
  • Settings: split Hz/V face tolerances — separate sliders for Hz and V face spread (was one combined value)
  • Settings: EDM type info-only — EDM standard errors displayed as read-only reference, not editable
  • Settings: GNSS vector tolerance — two new tolerance fields for mean vector Hz and V
  • Settings: setout vertical tolerance — separate checkbox to enable/disable vertical tolerance on setout checks

  • v1.3.0 — 2026-06-16

    Added

  • Inline HI/PC editing — ✎ pencil button on Height of Instrument and Prism Constant rows in obs properties panel; edit modal commits `set_hi` / `set_pc` action to JXL
  • Face checkboxes — face-by-face enable/disable checkboxes in obs properties panel

  • v1.2.0 — 2026-06-15

    Added

  • Obs-detail API — `/api//obs-detail` endpoint; obs properties panel now shows full observation data (Hz, V, SD, HI, HR, PC, prism type, backsight, face) fetched on click
  • Face selection — clicking a specific observation selects the individual face in the properties panel

  • v1.1.0 — 2026-06-12

    Added

  • Dock panel — left panel can be collapsed/expanded; state persists across page loads
  • MTA slope residual — station properties panel shows MTA slope residual summary