Files
geointel/CHANGELOG.md
T
Codex 3524ee7fb2
GeoIntel CI / docs-smoke (push) Has been cancelled
GeoIntel CI / contract-smoke (push) Has been cancelled
Disable YOLO training plot side effects
2026-07-07 05:25:47 +02:00

93 KiB

M13 — Codex Optimization Pack

  • Added reusable Codex skills under skills/.
  • Added prompt discipline, token/context budget policy, secrets policy and parallel-agent strategy.
  • Added M13 day-one optimized master prompt and pass completion report prompt.
  • Added M13 validation script and included it in readiness checks.

Changelog

Sprint 129 Operator YOLO training dataset tooling (2026-07-07)

  • Added scripts/export_operator_yolo_dataset.py to convert prepared operator orthophoto/GRB sample pairs into a standard local YOLO detection dataset with dataset.yaml, train/validation image folders, label folders and yolo_dataset_summary.json.
  • Added scripts/train_operator_yolo_detector.sh as an operator-only training smoke wrapper that uses an existing local base .pt model and writes a trained local .pt artifact plus training_summary.json.
  • Disabled Ultralytics plot generation in the training wrapper so the smoke path avoids auxiliary plot/font network behavior.
  • Added readiness coverage for the exporter Python compile check and training wrapper shell syntax.
  • Added regression coverage in backend/tests/test_sprint129_operator_yolo_training_dataset.py.
  • Updated operator documentation for dataset export, training smoke usage and the requirement to benchmark any trained model through the existing real-data Detection + QA matrix before treating it as useful.
  • No Training Studio UI, API contract change, provider fetching, model auto-provisioning or app-side model training behavior was introduced.

Sprint 128 Stronger building model runtime benchmark (2026-07-07)

  • Added keremberke/yolov8s-building-segmentation as an explicit Tower runtime model asset at /mnt/user/appdata/geointel/models/yolov8s-building-segmentation.pt; the file is not committed to Git.
  • Verified the live model catalog exposes yolov8s-building-segmentation-pt with will_download_models=false and SHA256 a27af31654c6a4edbdc85581c33d93c13986b5919de7de410f8d85d801b3bb34.
  • YOLO preflight loaded the model locally with model_load_ok=true and no automatic download.
  • Ran a 36-run Geel/Mol/Turnhout matrix comparing yolov8n-building-segmentation-pt and yolov8s-building-segmentation-pt across tile sizes 512/640 and thresholds 0.50/0.25/0.15.
  • Best overall score was Mol with yolov8s-building-segmentation-pt, tile 640, threshold 0.15: 55 detections, 9 matches, 46 false positives, 365 false negatives, precision 0.16363636363636364, recall 0.02406417112299465, F1 0.04195804195804196.
  • Conclusion: yolov8s is cleaner than yolov8n on some samples, but still misses most GRB buildings; it is not a sufficient V1 default.

Sprint 127 Multi-sample detection quality calibration tooling (2026-07-07)

  • Added scripts/prepare_operator_real_data_samples.py to prepare documented Geel, Mol and Turnhout orthophoto/GRB GBG building sample pairs as explicit runtime artifacts.
  • Added scripts/run_multi_sample_detection_quality_matrix.sh to run the existing real-data quality matrix for every prepared sample and combine the results.
  • The combined summary writes multi_sample_quality_summary.json with overall score/recall/precision rankings and per-sample best configurations.
  • Added readiness coverage and regression tests for the sample-preparation and multi-sample matrix contracts.
  • Ran the full 24-run Tower matrix for Geel, Mol and Turnhout. Best overall score/recall was Turnhout with yolov8n-building-segmentation-pt, tile 512, overlap 64, threshold 0.15, 142 detections, 18 matches, 124 false positives, 755 false negatives and F1 0.03934426229508197; generic yolov8n-pt produced zero building detections across all samples.

Sprint 126 Detection quality matrix tooling (2026-07-07)

  • Added scripts/run_detection_quality_matrix.sh to compare local model assets, raster tile sizes, tile overlaps and confidence thresholds through the existing real-data detection + QA workflow.
  • The script writes per-run logs and a quality_matrix_summary.json with detection count, QA score, precision, recall, F1, mean IoU, matches, false positives and false negatives.
  • The summary ranks best_by_score, best_by_recall and best_by_precision for operator model-quality decisions.
  • Added readiness syntax coverage and static regression coverage for the quality matrix contract.
  • Ran the matrix on Tower against the Geel operator sample: yolov8n-building-segmentation-pt with tile 512, overlap 64 and threshold 0.15 ranked best by score/recall with 80 detections, 6 matches, 74 false positives, 611 false negatives and F1 0.017216642754662843; generic yolov8n-pt produced zero building detections.

Sprint 125 Detection calibration evidence bundle (2026-07-07)

  • Added scripts/export_detection_calibration_evidence.sh to export persisted QA evidence from a detection calibration summary.
  • The script writes combined calibration_evidence.geojson, calibration_evidence_summary.json and a standalone calibration_evidence_review.html SVG artifact for matched detections, matched references, false positives and false negatives.
  • Added readiness syntax coverage and regression coverage for the evidence bundle contract.
  • Ran the export on Tower for the latest Geel calibration sweep; the bundle contained 2555 evidence features: 2460 false negatives, 79 false positives, 8 matched detections and 8 matched references.
  • No inference, model dependency, provider fetching, fake data, API contract or frontend runtime behavior changed.

Sprint 124 Detection calibration sweep tooling (2026-07-07)

  • Added scripts/run_detection_calibration_sweep.sh to run the existing real-data detection + QA workflow across multiple configured-YOLO confidence thresholds.
  • The sweep writes per-threshold logs and a calibration_summary.json with persisted detection count, QA score, precision, recall, F1, mean IoU, matches, false positives and false negatives.
  • Added readiness syntax coverage and static regression coverage for the calibration sweep contract.
  • Ran the sweep on Tower against the Geel operator sample; threshold 0.15 ranked best among 0.50, 0.35, 0.25 and 0.15, but recall remained below 1%, confirming the next problem is model/data calibration rather than runtime availability.
  • No new model dependencies, provider fetching, fake detections, API contracts or product UI behavior were introduced.

Sprint 123 YOLO class and tile CRS normalization (2026-07-07)

  • Fixed configured-YOLO class filtering so model labels such as Building match operator/domain filters such as building.
  • Persisted configured-YOLO class names as canonical lowercase values while preserving the original model label in detection provenance.
  • Added regression coverage for the mixed-case YOLO class route that caused the Geel real-data smoke to persist zero detections.
  • Confirmed through direct Tower inference that the active local building model returns raw detections on the prepared Geel orthophoto tile; the remaining work is threshold/QA calibration rather than model availability.
  • Fixed raster tile manifest CRS propagation so generated tile manifests include source CRS metadata required to convert YOLO pixel boxes to WGS84 Detection GeoJSON coordinates.
  • Deployed the class-normalization and tile-CRS fixes to Tower, reran the real-data detection + QA workflow, confirmed 4 persisted detections and verified Detection GeoJSON now returns WGS84 coordinates around Geel.

Sprint 122 Real operator data availability and raster metadata fix (2026-07-07)

  • Created Tower operator sample artifacts under /mnt/user/appdata/geointel/storage/operator-data:
    • geel_orthophoto_wms_512.tif from the Digitaal Vlaanderen OMWRGBMRVL WMS Ortho layer.
    • geel_grb_gbg_buildings.geojson from the Digitaal Vlaanderen GRB OGC API Features GBG collection.
  • Fixed raster upload metadata mapping so uploaded rasters persist canonical bounds_json, resolution_json and bands_json from extracted raster metadata.
  • Added regression coverage for raster upload metadata mapping.
  • Deployed the fix to Tower and ran the real-data detection + QA workflow against http://192.168.10.150:1202.
  • The workflow passed with persisted raster/reference datasets, tile manifest, AnalysisRun, QualityCheck and detection GeoJSON export. A follow-up pass identified case-sensitive class filtering as the reason the initial Geel run persisted zero detections.

Sprint 121 Real data detection and QA workflow smoke (2026-07-07)

  • Added scripts/verify_real_data_detection_qa_workflow.sh for operator-provided GeoTIFF/reference-vector validation against a live runtime.
  • The smoke uploads a real raster source dataset and real reference building vector, validates GIS metadata, tiles the raster, selects a mounted local model asset, runs configured YOLO detection, runs persisted detection QA/QC and exports detection GeoJSON.
  • Registered the script in the readiness gate as a syntax check so normal development remains green without real local imagery or model files.
  • Documented exact Tower usage in scripts/README.md, backend/README.md, docs/AI_PIPELINES.md and docs/TODO.md.
  • The script refuses missing files, unsupported formats, demo workflow seeding, fixture detections, live provider fetching and model downloads.

Sprint 120 Model asset detection workflow smoke (2026-07-06)

  • Added scripts/verify_model_asset_detection_workflow.sh for live Docker/Tower validation of the configured-YOLO path with a selected local model asset.
  • The smoke seeds the explicit demo raster, generates a tile manifest, selects a cataloged model asset, checks read-only YOLO preflight, runs the existing detection endpoint and verifies persisted AnalysisRun, Detection list and Detection GeoJSON outputs.
  • Registered the new smoke script in the readiness gate as a syntax check so ordinary CI/dev runs do not require AI dependencies or model files.
  • Documented that the smoke validates operational routing/provenance only; zero detections are acceptable on the synthetic demo raster and real GIS quality still requires local orthophoto/reference validation.

Sprint 118 Local model and reference catalog clarity (2026-07-06)

  • Added a read-only local model asset catalog endpoint at GET /api/v1/detection/model-assets.
  • Added YOLO_MODELS_DIR so Docker/Unraid runtimes can expose mounted model files as selectable assets without downloading weights.
  • Detection runs and YOLO preflight can now accept model_asset_id for yolo-configured, with backend-side resolution to a cataloged local file.
  • Detection Lab now shows a local model asset picker with active-file, size and checksum context.
  • Provider Capabilities now explicitly labels GRB/OSM/manual/fixture as reference-data source capabilities, not AI model choices.
  • Added regression coverage for the backend model asset catalog and frontend model asset wiring.

Sprint 117 Safe local YOLO model activation (2026-07-06)

  • Added scripts/configure_yolo_model.py to configure an existing local YOLO model into the Unraid/Tower .env file without downloading weights, loading a model or running inference.
  • The helper refuses no-model and ambiguous multi-model states, and only applies env changes when --apply is provided.
  • Documented the Tower flow for placing model files under /mnt/user/appdata/geointel/models, applying the env update and restarting/redeploying the all-in-one container.
  • Added regression coverage for no-model, multi-model, dry-run and env-file apply behavior.
  • Hardened configured YOLO inference so single-band raster tiles are converted to temporary RGB prediction images and model runtime errors are returned as typed detection failures instead of raw server errors.

Sprint 116 Operational GIS map workflow (2026-07-04)

  • Switched the default MapLibre basemap from demo tiles to an OpenStreetMap road raster basemap with visible attribution while keeping VITE_MAP_STYLE_URL as the production override.
  • Added a persisted database layer selector to the Map workspace so users can directly load a ready vector dataset from stored project data.
  • Added an Operational GIS run panel that reuses AOI or active layer extents to query persisted PostGIS vector_features through the existing bbox selection flow.
  • Added a basemap policy notice when the public OpenStreetMap fallback is active and a guided operational workflow for query, derived dataset, QA/QC and export handoff.
  • Added a one-click full GIS workflow action that runs persisted selection, saves the derived dataset, saves a GeoJSON export and optionally runs QA/QC against the selected reference dataset.
  • Added a full-workflow run mode selector so repeated Map QA/QC runs can reuse the latest saved derived dataset instead of creating duplicate dataset/export artifacts.
  • Added an opt-in Docker/Unraid AI build path (GEOINTEL_INSTALL_AI=true) for installing optional PyTorch/Ultralytics dependencies while keeping the default GIS runtime lightweight and import-safe.
  • Hardened the AI Docker runtime with OpenCV native libraries required by Ultralytics and made YOLO dependency detection use real imports instead of optimistic module discovery.
  • Added a writable YOLO_CONFIG_DIR default under application storage so Ultralytics does not fall back to root user config paths in Docker/Unraid.
  • Added YOLO preflight runtime diagnostics for dependency assumption state, model directory, YOLO_CONFIG_DIR, installed torch/ultralytics versions and CUDA availability without running inference or downloading weights.
  • Added a canonical GET /api/v1/detection/yolo/preflight endpoint and Detection Lab panel so operators can inspect live YOLO runtime readiness from the web UI.
  • Added static regression coverage for the road basemap, attribution, basemap policy notice, database layer selector and persisted operational GIS workflow wiring.

Sprint 115 QA/QC and Exports usability layout pass (2026-07-04)

  • Made the QA/QC workspace calmer by compacting summary, handoff, drilldown, feature evidence and metric history surfaces.
  • Reduced raw QA provenance height so JSON evidence remains available without dominating the screen.
  • Rebalanced QA/QC and Exports workspace columns for review-first usage.
  • Made export handoff cards, latest artifact cards and export history controls denser and easier to scan.
  • Added static regression coverage for compact QA evidence review and export handoff layouts.

Sprint 114 Data and Map usability layout pass (2026-07-04)

  • Made the Data workspace catalog more compact with quieter upload controls, denser role summaries and shorter dataset action buttons.
  • Rebalanced the Data workspace columns so catalog review has more room while setup panels remain available.
  • Made the Map workspace more map-first by placing the MapLibre frame before dense layer controls and increasing the desktop map height.
  • Reduced Map context, provenance, bbox selection and feature extraction density while keeping existing selection/export/QA actions unchanged.
  • Added static regression coverage for the compact Data catalog and map-first workspace ordering.

Sprint 113 Calm workbench layout pass (2026-07-04)

  • Reduced visual density in the workbench shell without changing API contracts or workflows.
  • Softened the base palette, borders and shadows so panels read as a work surface instead of stacked cards.
  • Made the top context bar, sidebar navigation, workspace heading, status tiles and inspector more compact.
  • Hid the duplicated workspace command bar because the persistent sidebar already provides primary navigation.
  • Added static regression coverage for the calmer shell density and mobile-safe navigation rules.

Sprint 112 QA evidence map overlay (2026-06-25)

  • Added a read-only QA/QC evidence GeoJSON endpoint for persisted quality checks.
  • The endpoint resolves match_evidence, false_positive_evidence and false_negative_evidence ids back to persisted vector, detection or segmentation geometries where available.
  • Added QA/QC actions to render evidence overlays in the existing MapLibre workspace with distinct match, false-positive and false-negative styling.
  • Added frontend loading/error/clear states for the QA evidence overlay and a compact map legend.
  • No migration, new table, provider fetching, AI behavior or new product domain was introduced.

Sprint 111 QA feature evidence persistence (2026-06-25)

  • Added feature-level QA evidence to dataset, detection and segmentation QA matching.
  • Persisted matched feature ids, false-positive feature ids and false-negative feature ids inside quality_checks.findings_json.
  • Extended QA/QC drilldown with compact matched/false-positive/false-negative feature id lists beside the existing metrics and raw findings JSON.
  • Updated API contracts to document match_evidence, false_positive_evidence and false_negative_evidence.
  • No migration, new table, provider fetching, AI behavior or new product domain was introduced.

Sprint 110 Map QA evidence drilldown (2026-06-25)

  • Extended the Map workspace QA/QC shortcut with inline evidence after comparing a saved derived selection dataset.
  • The result now shows quality-check id, matches, false positives, false negatives, mean IoU and QA warnings beside precision/recall/F1.
  • Added an Open QA/QC evidence handoff to the existing QA/QC workspace drilldown instead of creating a parallel QA detail system.
  • No backend API contracts, migrations, provider fetching, AI behavior or new product domains were introduced.

Sprint 109 Map selection QA shortcut (2026-06-25)

  • Added a Map workspace QA/QC shortcut for saved derived selection datasets.
  • The shortcut reuses the existing QA comparison workflow and persists QualityCheck/Metric rows through the existing backend route.
  • Added reference dataset selection, loading/error state and compact precision/recall/F1/status feedback beside the saved map selection.
  • Kept QA orchestration in a dedicated frontend hook so App.tsx remains an orchestrator and API calls stay out of the shell component.
  • No backend API contracts, migrations, provider fetching, AI behavior or new product domains were introduced.

Sprint 108 Map selection derived datasets (2026-06-25)

  • Added POST /api/v1/projects/{project_id}/datasets/{dataset_id}/vector/select/derive to persist a map bbox selection as a reusable derived vector dataset.
  • Derived selection datasets keep source provenance, write a GeoJSON artifact and index their features back into vector_features.
  • Added Save as dataset to the Map workspace after area extract, including loading/error/latest dataset feedback.
  • Added regression coverage for service persistence, empty-selection failure, canonical API envelope and frontend wiring.

Sprint 107 Map selection export handoff (2026-06-25)

  • Added vector_selection GeoJSON export support to persist bbox-selected map features as normal export artifacts.
  • Selection exports query persisted PostGIS vector_features, write a vector_selection_geojson FeatureCollection and store selection bbox/count metadata in the export record.
  • Added Save area export to the Map workspace after an area extract, including loading/error state and latest artifact path feedback.
  • Updated frontend export typing/API hook wiring so saved selections appear in the existing Export Center history.
  • No migrations, provider fetching, AI behavior, real model dependencies or new product domains were introduced.

Sprint 106 Map area selection extract (2026-06-25)

  • Added a read-only bbox selection endpoint for vector datasets: POST /api/v1/projects/{project_id}/datasets/{dataset_id}/vector/select.
  • The endpoint queries persisted PostGIS vector_features and returns a canonical-envelope GeoJSON FeatureCollection with selection bbox, feature count, limit and truncation state.
  • Added Map workspace area selection with two-click bbox drawing, manual EPSG:4326 bbox inputs, selected-feature/AOI/layer bbox shortcuts and client-side GeoJSON download/copy.
  • Added MapLibre overlays for the active bbox and extracted selection result.
  • Added regression coverage for backend selection behavior, route envelope and frontend wiring.
  • No migrations, provider fetching, AI behavior, real model dependencies or new product domains were introduced.

Sprint 105 Map feature extract (2026-06-25)

  • Added a Selection & extract panel to the Map workspace for clicked map features.
  • Selected features are highlighted through a dedicated MapLibre GeoJSON source/layer.
  • The extract panel now shows geometry type, coordinate count, EPSG:4326 bbox and a property table.
  • Added client-side Download selected GeoJSON, Copy selected properties and Clear selection actions for the clicked feature.
  • No backend API contracts, migrations, provider fetching, AI behavior or database persistence changed.

Sprint 102 Detection Lab handoff polish (2026-06-24)

  • Updated the raster tile manifest handoff to Detection Lab so it automatically selects yolo-configured.
  • Tightened the AI handoff browser smoke so it now verifies that the model selection is set by the UI handoff rather than by the test.
  • Added regression coverage for the automatic model handoff.
  • No backend API, persistence, migration, provider fetching or AI dependency behavior changed.

Sprint 101 AI Lab handoff browser smoke (2026-06-24)

  • Added scripts/verify_ai_handoff_interactions.sh to exercise the browser click path from raster tiling into Detection Lab and Segmentation Lab.
  • The smoke seeds the explicit offline demo workflow, generates a small raster tile manifest, clicks both AI handoff buttons and verifies the selected raster dataset plus manifest path are preserved.
  • Added readiness syntax coverage for the new browser interaction smoke and documented its optional Playwright requirement.
  • Added regression coverage for the script/readiness contract.
  • No product behavior, API contract, migration, AI dependency or provider-fetching changes were introduced.

Sprint 100 raster tile Segmentation Lab handoff (2026-06-24)

  • Added Segmentation Lab tile manifest state and wired it into the existing segmentation run request tile_manifest_path.
  • Added a raster inspector handoff action that fills the selected raster dataset and tile manifest path in Segmentation Lab.
  • Mirrored the existing Detection Lab manifest input pattern without adding new backend routes, migrations, AI dependencies or model behavior.
  • Added regression coverage for the segmentation handoff wiring.

Sprint 99 raster tile Detection Lab handoff (2026-06-23)

  • Surfaced the latest persisted raster.tile manifest path in the raster dataset inspector.
  • Added a direct Detection Lab handoff action that fills the selected raster dataset and tile manifest path from the existing raster tile job result.
  • Preserved existing raster, detection and segmentation API contracts; no AI inference, provider fetching, migrations or backend route changes were introduced.
  • Added regression coverage for the frontend handoff wiring.

Sprint 98 demo raster workflow smoke (2026-06-23)

  • Added scripts/verify_demo_raster_workflow.sh to validate the browser-facing demo raster happy path: inspect, preview, stats and tile manifest generation.
  • Added readiness syntax coverage for the raster workflow smoke.
  • Fixed raster tiling manifest generation for Rasterio versions that return window bounds as tuples instead of bound objects.
  • Added regression coverage for tuple-based raster window bounds and the new raster smoke contract.
  • No AI inference, external provider fetching, migrations or API route changes were introduced.

Sprint 97 demo raster fixture workflow (2026-06-23)

  • Added a deterministic local GeoTIFF raster fixture to the offline demo workflow so raster controls and AI Lab dataset prerequisites have usable V1 context.
  • Returned raster_dataset_id from the canonical demo workflow response and wired the frontend demo loader to select it for Detection and Segmentation Labs.
  • Kept the candidate vector dataset as the default Data/Map/Export context after demo load.
  • Hardened workbench default/interactions smoke scripts to require the candidate vector, reference vector and raster fixture datasets as 3/3 ready.
  • No external provider fetching, real AI inference, migrations or API behavior outside the demo response contract changed.

Sprint 96 useful default context (2026-06-22)

  • Auto-open the first ready vector dataset after project data loads so Data, Map and Exports start with usable context.
  • Kept user-driven dataset selection intact; the default is only applied when no dataset is selected.
  • Added explicit Detection/Segmentation Lab guidance when no raster datasets are available.
  • Added regression coverage for useful default dataset selection and AI Lab raster prerequisite messaging.
  • No API contracts, migrations, provider fetching or AI/model behavior changed.

Sprint 95 raster pipeline hardening (2026-06-22)

  • Added a raster pipeline readiness surface to the dataset inspector.
  • Surfaced metadata profile, CRS readiness, preview artifact, tile manifest handoff and clip AOI state before raster operations.
  • Added processing guardrails for missing metadata, missing CRS, missing preview, invalid tile parameters, unavailable rasters and missing clip areas.
  • Added responsive styling and regression coverage for the raster readiness/handoff structure.
  • No API contracts, migrations, provider fetching or AI/model behavior changed.

Sprint 94 QA/QC evidence drilldown (2026-06-22)

  • Added a selected QA/QC evidence drilldown to the Quality Results panel.
  • Surfaced candidate/reference layer names, analysis run/job provenance, status, score and completed/created timestamps for the selected persisted quality check.
  • Added false-positive, false-negative and map-evidence handoff cards from persisted metric rows.
  • Added parameter/findings JSON panes for persisted QA/QC provenance.
  • Added regression coverage for drilldown structure, metric evidence and responsive styles.
  • No API contracts, migrations, provider fetching or AI/model behavior changed.

Sprint 93 export handoff artifact polish (2026-06-21)

  • Added a latest handoff artifacts section to the Export Center for project reports, project metadata, dataset GeoJSON, detection GeoJSON and segmentation GeoJSON.
  • Reused existing preview/download export actions from each latest artifact card without changing export API contracts or persistence.
  • Added responsive styling for latest artifact cards, empty artifact states and compact artifact actions.
  • Added regression coverage for grouped latest artifact surfaces and preserved preview/download controls.
  • No API contracts, migrations, provider fetching or AI/model behavior changed.

Sprint 92 workflow rail interaction polish (2026-06-21)

  • Audited the live Overview workflow rail click path from Overview to Data, Map, QA/QC and Exports.
  • Hardened the Map workflow step to reuse the first ready vector/GeoJSON dataset through the existing map-open flow when no layer is active.
  • Hardened the Export workflow step to reuse the first ready vector/GeoJSON dataset through the existing export-open flow when no dataset is selected.
  • Added regression coverage for the context-aware rail handler and fallback workspace navigation.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 91 populated workflow audit polish (2026-06-21)

  • Audited the live populated demo workflow on http://192.168.10.150:1202 across Overview, Data, Map, QA/QC, AI Labs and Exports.
  • Tightened the Overview workflow guidance complete state so a fully populated flow shows Ready for handoff instead of another next-step prompt.
  • Clarified the Map guidance detail by separating rendered layer feature count from AOI context.
  • Added regression coverage for complete-state copy and precise Map guidance copy.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 90 workflow guidance polish (2026-06-20)

  • Added an Overview workflow guidance rail for the V1 path: Project & AOI, Data, Map, QA / AI and Export.
  • The guidance rail uses existing workspace navigation only; it does not add API calls, backend behavior or persistence.
  • Added compact ready/waiting/next visual states based on already loaded project, dataset, map, QA/AI and export state.
  • Added regression coverage for the guidance rail, existing workspace routing and responsive CSS contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 89 Export/System density polish (2026-06-20)

  • Grouped Export Center summary, handoff readiness, artifact actions, state cards and history into focused surfaces.
  • Grouped Provider Capabilities into a system shell with registry state cards, capability cards and attribution/license provenance cards.
  • Preserved existing export action, filter, preview/download and provider refresh workflows without API or persistence changes.
  • Added static regression coverage for Export/System hierarchy and density contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 88 AI Labs density polish (2026-06-20)

  • Grouped Detection Lab and Segmentation Lab model registry, run controls, result loading and QA controls into focused surfaces.
  • Added shared AI Lab density CSS for model lists, run forms, result/QA summaries and mobile-safe grids.
  • Preserved existing detection/segmentation model loading, run, result filtering and QA callbacks without API or persistence changes.
  • Added static regression coverage for AI Lab hierarchy and density contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 87 Change Detection density polish (2026-06-20)

  • Grouped Change Detection heading, input controls, result states, summary and warnings into focused surfaces.
  • Reused shared result-state cards for not-enough-data and error states.
  • Added compact desktop/mobile grids for vector inputs and change summary metrics.
  • Added static regression coverage for Change Detection hierarchy and density contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 86 QA/QC workspace density polish (2026-06-20)

  • Grouped QA/QC summary, dataset evidence, refresh/filter controls and result history into focused surfaces.
  • Kept existing persisted quality check filters, refresh behavior, metric cards and history rendering unchanged.
  • Added compact mobile breakpoint grids for QA/QC summary, handoff evidence, filters and metric/history rows.
  • Added static regression coverage for QA/QC workspace hierarchy and density contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 85 Map workspace density polish (2026-06-20)

  • Added a compact Map workspace context summary for selected AOI, active layer and rendered feature state.
  • Grouped map controls, provenance, map frame and feature inspector into clearer surfaces without changing MapLibre behavior.
  • Tightened map toolbar/provenance spacing and mobile breakpoint grids so Map workspace scans better on desktop and narrow screens.
  • Added static regression coverage for Map workspace hierarchy and density contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 84 Data workspace density polish (2026-06-20)

  • Added selected-summary regions to Project, AOI and Dataset panels so active context is visible before forms.
  • Split Data workspace panels into named form/list/catalog blocks to reduce form-first scanning friction.
  • Restyled dataset upload as an embedded source-data block while preserving the existing upload flow.
  • Added static regression coverage for Data workspace selected-summary, upload and catalog density contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 83 Workspace panel hierarchy polish (2026-06-20)

  • Made the Overview readiness strip a calmer section surface with tighter status tiles.
  • Added explicit Overview action-copy and recommended-action regions for easier scanning and future UI regression coverage.
  • Restyled recommended next actions as a lighter callout instead of another equally weighted white card.
  • Added static regression coverage for Overview hierarchy regions, compact status tiles and secondary action-callout styling.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 82 Shell density polish (2026-06-20)

  • Added a keyboard skip link to jump directly from the workbench shell to active workspace content.
  • Added an explicit primary workspace navigation label and main focus target.
  • Made narrow-view context chips, sidebar navigation and workspace shortcuts more compact and scroll-safe.
  • Locked the smallest mobile breakpoint so the topbar context remains a horizontal rail instead of expanding into a tall preamble.
  • Added static regression coverage for shell density, skip-link and mobile navigation contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 81 Result state consistency polish (2026-06-20)

  • Added shared result-state styling for compact loading, error, empty and ready states.
  • Applied consistent state blocks to QA/QC results, export history and AI lab model/result panels.
  • Replaced loose text/error rows in Detection and Segmentation Labs with scan-friendly state cards.
  • Added static regression coverage for result-state CSS and panel usage contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 80 Operation form readability polish (2026-06-20)

  • Added structured headings, helper text, field wrappers and action rows to dense raster operation controls.
  • Added the same form readability structure to vector clip, buffer and intersect controls.
  • Added compact CSS contracts for dataset tool headings, helper text, field grids, action rows and inline error blocks.
  • Added static regression coverage for raster/vector operation form readability contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 79 Accessibility focus polish (2026-06-20)

  • Added a shared visible focus-ring contract for primary buttons, workspace navigation, command chips, inspector tabs and dataset action buttons.
  • Added explicit ARIA labels to workspace navigation, command chips and overview quick actions.
  • Bound inspector tabs to their active tab panels with aria-controls, tab ids and tabpanel metadata.
  • Added static regression coverage for keyboard focus and inspector tab accessibility contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 78 Export preview readability polish (2026-06-20)

  • Added compact preview summary cards for JSON/GeoJSON export payloads.
  • Wrapped export preview JSON in a scroll-contained shell with a lightweight toolbar.
  • Improved long key/value wrapping for large handoff artifacts while preserving the stored payload.
  • Added static regression coverage for export preview readability contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 77 Inspector mobile visual polish (2026-06-20)

  • Added compact inspector action button grids for narrow screens.
  • Added mobile-safe wrapping for dataset filenames, checksums, bounds, persisted export paths and loaded feature/job JSON.
  • Added structured raster/vector tool panel classes so operation inputs and buttons stay inside the inspector.
  • Added static regression coverage for inspector mobile CSS and dataset tool markup contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 76 Export/System mobile visual polish (2026-06-20)

  • Added scan-friendly Provider Capabilities cards with structured status, authority, geometry, query mode and layer chips.
  • Tightened mobile export action cards, export history controls and export card headers.
  • Added overflow wrapping for long provider limitations, attribution text, export ids and artifact paths.
  • Added static regression coverage for Export/System mobile CSS and workflow markup contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 75 AI Labs mobile visual polish (2026-06-20)

  • Tightened mobile Detection and Segmentation Lab model card, form and result-summary sizing.
  • Added overflow wrapping for long model ids, source tile paths, mask paths and QA summary values.
  • Kept result tables scroll-contained instead of allowing them to widen the workbench.
  • Added static regression coverage for AI Labs mobile CSS and workflow markup contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 74 Data/Map mobile visual polish (2026-06-20)

  • Tightened mobile Data workspace upload form, file input and dataset action button sizing.
  • Kept desktop dataset action grid width contract while adding compact mobile tracks.
  • Tightened Map toolbar, layer control sliders and empty-map quick actions for narrow screens.
  • Added static regression coverage for Data/Map mobile CSS contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 73 QA/QC result filtering (2026-06-20)

  • Added client-side QA/QC result search, status and check-type filters.
  • Added latest-eight density control with a show-all toggle for long-lived demo projects.
  • Added a no-match empty state and reset action for filtered QA/QC result views.
  • Kept metric evidence cards and raw persisted metrics unchanged.
  • Added static regression coverage for QA/QC filtering and dense history styles.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 72 Mobile overflow hardening (2026-06-20)

  • Clamped page-level horizontal overflow for the workbench shell on mobile.
  • Kept sidebar navigation and workspace shortcut chips as contained horizontal scroll areas.
  • Added wrapping/containment for long QA identifiers, dataset links and inspector values.
  • Made inspector tabs two-column on narrow screens to avoid header overflow.
  • Added static regression coverage for mobile overflow and long-identifier wrapping contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 71 QA/QC metric card polish (2026-06-19)

  • Added core metric evidence cards for precision, recall, F1, mean IoU and false positive/negative counts.
  • Kept the raw persisted metric list available below the promoted metric evidence.
  • Added number formatting for compact metric display while preserving persisted metric values.
  • Added static regression coverage for metric promotion and responsive metric-card styles.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 70 QA/QC handoff polish (2026-06-19)

  • Added candidate/reference handoff cards to the QA/QC workspace.
  • Resolved persisted quality-check candidate/reference dataset IDs back to loaded dataset names where available.
  • Filtered QA candidate context to non-reference vector/GeoJSON datasets while keeping persisted dataset roles unchanged.
  • Added static regression coverage for QA handoff props, App wiring and responsive handoff styles.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 69 Data catalog action polish (2026-06-19)

  • Added recommended-action hints to each dataset card so reference and candidate layers explain their QA role.
  • Reworked dataset card actions into compact two-line buttons for Inspect, Map, Export / QA and Metadata.
  • Preserved existing handlers, API contracts and persistence behavior; this is UI affordance polish only.
  • Added static regression coverage for the action hints, disabled-action copy and responsive action grid.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 68 Data catalog density polish (2026-06-19)

  • Added a compact Data catalog summary for Selected, Reference, Candidate and Source layers.
  • Added scan-friendly dataset role badges, source/layer/CRS context and safer title wrapping to dataset cards.
  • Kept candidate as a frontend workbench display role only: persisted dataset roles and API contracts remain unchanged.
  • Added static regression coverage for the dataset catalog density structure and responsive CSS.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 63 Map overlay ergonomics (2026-06-18)

  • Added an active layer provenance rail to the Map workspace, showing layer source, provenance and draw state from existing frontend state.
  • Added clear empty guidance when no vector/result layer is active on the map.
  • Added scan-friendly selected-feature property chips before the raw JSON inspector.
  • Tightened panel title alignment after the visual polish pass exposed a generic CSS selector specificity issue.
  • Added static regression coverage for the map provenance and feature-summary UI contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 62 Workbench visual polish (2026-06-18)

  • Added a compact workspace command bar for fast switching between the primary workbench surfaces.
  • Polished the shell visual system with raised/sunken surfaces, softer shadows, tighter topbar spacing and more consistent panel styling.
  • Replaced raw empty-state text in project/dataset panels with structured empty-state blocks.
  • Improved Detection Lab and Segmentation Lab result summaries and wrapped long result tables in scroll-safe containers.
  • Improved mobile workbench navigation by using horizontal rails for the primary nav and command chips, reducing vertical crowding without adding new behavior.
  • Added static regression coverage for the visual polish contracts.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 61 Golden QA scenario expansion (2026-06-18)

  • Expanded the deterministic QA/QC golden benchmark from one building scenario to four local fixture scenarios: partial match, perfect match, no-overlap and MultiPolygon match.
  • Added fixtures/golden/golden_qa_benchmarks.json as the scenario manifest while preserving the original expected_qa_metrics.json baseline for existing demo workflow checks.
  • Updated scripts/run_golden_qa_benchmark.py to run every scenario, verify metric drift and report aggregate QualityCheck/Metric persistence expectations.
  • Added regression coverage for the multi-scenario manifest and aggregate benchmark output.
  • No product behavior, API contract, migration, provider fetching or AI model behavior changed.

Sprint 49 Workbench shell UI refactor (2026-06-17)

  • Replaced the one-page workbench panel stack with a task-based UI shell.
  • Added primary workspaces for Overview, Data, Map, QA/QC, AI Labs, Exports and System.
  • Added a persistent top context bar for active project, AOI, dataset and layer state.
  • Moved dataset details into a persistent right-side inspector instead of leaving them below the full workflow.
  • Kept existing hooks, API contracts, backend behavior, migrations, provider behavior and AI configuration unchanged.
  • Added static regression coverage for the new shell regions and workspace navigation anchors.

Sprint 50 Workspace usability polish (2026-06-17)

  • Reworked the Data workspace panels into compact operator forms and scan-friendly project/AOI/dataset cards.
  • Reworked the Map workspace controls into a layer toolbar with clearer AOI/layer status.
  • Reworked Detection Lab and Segmentation Lab into model, run, result and QA blocks instead of raw stacked controls.
  • Added responsive card/form styling so nested workspaces do not overflow inside the shell.
  • Added static regression coverage for the polished workspace structure.
  • No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.

Sprint 48 Backend API contract audit (2026-06-17)

  • Added scripts/audit_api_contracts.py to compare the active FastAPI route surface with docs/API_CONTRACTS.md.
  • Added the API contract audit to the readiness gate so undocumented routes and stale documented routes fail release checks.
  • Corrected API contract drift for area detail/update, vector stats, dataset content and future analysis/YOLO export placeholders.
  • Added regression tests for the contract audit and readiness integration.

Sprint 47 Workbench interaction smoke (2026-06-17)

  • Added stable data-testid anchors to the existing project, area, map, dataset, QA/QC and export controls for browser regression checks.
  • Added scripts/verify_workbench_interactions.sh to verify the live backing state for project switching, AOI/map selection, dataset readiness, QA refresh and export refresh.
  • Added readiness syntax coverage and static regression tests for the new interaction smoke.
  • No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.

Sprint 46 Workbench default-state smoke (2026-06-17)

  • Added scripts/verify_workbench_default_state.sh to verify the live frontend/API default demo state through the browser-facing URL.
  • The smoke seeds the offline demo workflow and verifies the demo project, AOI geometry, ready candidate/reference datasets and persisted QA/QC result via canonical envelopes.
  • Added readiness coverage for the new smoke script syntax and static tests for its expected contract checks.
  • No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.

Sprint 45 Default demo selection polish (2026-06-17)

  • Improved frontend project selection so a cold start prefers a populated demo/workbench project over an empty first project.
  • Preserved the current project selection when it still exists and selected newly created projects immediately after creation.
  • Updated the demo workflow hook to pass the seeded project as the preferred project during refresh.
  • Added static regression coverage for the smarter project selection and demo refresh behavior.
  • No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.

Sprint 44 Workbench UI polish pass (2026-06-17)

  • Reworked the frontend workbench styling into a cleaner operational GIS interface with compact panels, modern controls, restrained green/neutral accents and scroll-contained long sections.
  • Promoted MapWorkspace above the dense workflow grid so the map is visible early in the workbench flow.
  • Moved DatasetPanel into the first workflow row beside project/area/provider setup.
  • Added a static layout regression test for map-first ordering and scroll-contained workflow panels.
  • No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.

Sprint 43 Workbench bootstrap hook decomposition (2026-06-17)

  • Moved frontend bootstrap/project/result reload effects from App.tsx into frontend/src/hooks/useWorkbenchBootstrap.ts.
  • App.tsx no longer imports or owns useEffect; it wires hook state into panels and delegates lifecycle loading to focused hooks.
  • Extended orchestration regression tests so bootstrap loading and result refresh effects stay out of App.tsx.
  • No behavior, API contracts, migrations, provider fetching or AI behavior changed.

Sprint 42 App entrypoint cleanup (2026-06-17)

  • Removed the stale FormEvent/useState React imports from frontend/src/App.tsx.
  • Removed the UTF-8 BOM from the frontend entrypoint so future text patches and static checks are stable.
  • Added a regression test that keeps App.tsx free of the stale imports and BOM.
  • No behavior, API contracts, migrations, provider fetching or AI behavior changed.

Sprint 41 Demo workflow hook decomposition (2026-06-17)

  • Moved offline demo workflow orchestration from App.tsx into frontend/src/hooks/useDemoWorkflow.ts.
  • The hook keeps the existing cross-module selection behavior for project, candidate/reference datasets, map AOI, QA/QC, detection, segmentation and export refresh state.
  • Extended frontend orchestration regression tests so demoApi stays out of App.tsx.
  • No API contracts, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 40 Project workspace hook decomposition (2026-06-17)

  • Moved project listing/creation, area creation and project-scoped area/dataset loading from App.tsx into frontend/src/hooks/useProjectWorkspace.ts.
  • Moved default clip-area selection into useDatasetWorkflow.ts and default map-area selection into useMapWorkspaceState.ts, keeping selection state with the owning workflow.
  • Extended frontend orchestration regression tests to keep project, provider, change-detection and map orchestration out of App.tsx.
  • No API contracts, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 39 Frontend orchestration decomposition (2026-06-17)

  • Moved provider capability loading from App.tsx into frontend/src/hooks/useProviderCapabilities.ts.
  • Moved change detection state and API orchestration into frontend/src/hooks/useChangeDetectionWorkflow.ts.
  • Moved derived MapLibre workbench state, feature collection selection and feature-inspector reset behavior into frontend/src/hooks/useMapWorkspaceState.ts.
  • Added regression tests that keep provider/change/map orchestration out of App.tsx.
  • No API contracts, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 38 Export Center preview hardening (2026-06-17)

  • Prevented HTML project report artifacts from being offered through the JSON preview path in the frontend Export Center.
  • Added a clear backend EXPORT_CONTENT_UNSUPPORTED response when /api/v1/exports/{export_id}/content is called for HTML report artifacts.
  • Extracted export JSON preview rendering into frontend/src/components/exports/ExportPreview.tsx.
  • Added regression coverage for HTML report content-preview rejection.
  • No API routes, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 37 Tower PostgreSQL collation maintenance (2026-06-17)

  • Created a live Tower database backup before collation maintenance: backups/geointel-before-collation-refresh-20260617-065707.dump.
  • Ran REINDEX DATABASE geointel; and ALTER DATABASE "geointel" REFRESH COLLATION VERSION; against the all-in-one PostGIS runtime.
  • Verified the reused database volume now reports matching collation versions: stored=2.36 actual=2.36.
  • Re-ran live migration smoke, browser runtime smoke, GIS runtime smoke and demo/export/golden QA workflow smoke successfully against http://192.168.10.150:1202.
  • No API contracts, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 36 PostgreSQL collation maintenance visibility (2026-06-17)

  • Added database collation version reporting to scripts/live_migration_smoke.sh.
  • The live smoke now prints COLLATION_VERSION_MISMATCH plus the exact ALTER DATABASE ... REFRESH COLLATION VERSION acknowledgement command when an old PostGIS volume is reused on a newer runtime.
  • Documented the Unraid maintenance procedure and backup/index review guidance.
  • Added regression coverage for the collation mismatch reporting path.
  • No API contracts, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 35 Docker runtime secret hygiene (2026-06-17)

  • Removed embedded PostGIS database name/user/password defaults from deploy/unraid/Dockerfile.all-in-one image metadata.
  • Kept database credentials as runtime configuration through .env, the Unraid template, Compose or docker run -e.
  • Added regression coverage so GEOINTEL_POSTGRES_PASSWORD is not baked into the all-in-one Dockerfile again.
  • Updated Unraid runtime documentation to clarify that credentials are runtime config, not image metadata.
  • No API contracts, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 34 browser-facing golden QA demo hardening (2026-06-17)

  • Hardened scripts/verify_demo_export_workflow.sh so the browser-facing demo/export smoke compares persisted QA/QC metrics against fixtures/golden/expected_qa_metrics.json.
  • The runtime smoke now verifies QA/QC status, F1 score, precision, recall, mean IoU, false positives, false negatives and match counts from persisted quality_checks/metrics.
  • Corrected the offline demo AOI to cover the golden building fixtures and made existing demo workflows self-heal stale/unsupported QA checks by syncing the AOI and persisting a fresh golden QA result.
  • Added regression tests to keep the golden QA baseline wired into the demo/export smoke.
  • Updated script documentation for the stricter runtime QA/QC checks.
  • No API contracts, migrations, product features, live provider fetching or AI behavior were introduced.

Sprint 33 QA/QC benchmark readiness hardening (2026-06-17)

  • Added scripts/verify_golden_qa_benchmark.sh as a shell wrapper for the deterministic QA/QC golden benchmark.
  • Made scripts/run_readiness_check.sh execute the golden QA/QC benchmark and syntax-check the wrapper.
  • Hardened fixture validation so fixtures/golden GeoJSON files and expected fixture paths are checked.
  • Added regression tests to keep the golden benchmark in the readiness gate.
  • Updated script/backend docs to document the benchmark wrapper and release gate behavior.
  • No API contracts, migrations, product features, live provider fetching or AI behavior were introduced.

Sprint 32 Unraid all-in-one runtime (2026-06-17)

  • Added docker-compose.unraid.yml for a single geointel container on Unraid.
  • Added deploy/unraid/Dockerfile.all-in-one, embedding PostgreSQL 16/PostGIS, FastAPI, nginx and the built React frontend in one image.
  • Added deploy/unraid/all-in-one-start.sh to start embedded PostGIS, apply Alembic migrations, start the backend and serve nginx.
  • Added deploy/unraid/nginx-all-in-one.conf with localhost backend proxying inside the same container.
  • Added a PNG DockerMan icon and made the Unraid template name match the running geointel container.
  • Added DockerMan labels to the all-in-one Compose service so Unraid can associate the running container with web UI and icon metadata.
  • Added deploy/unraid/run-dockerman-container.sh so repo deploys automatically replace Compose-owned containers with a DockerMan-native geointel container while preserving/migrating persisted data.
  • Switched Tower deploy image creation from docker compose build to plain docker build to avoid Compose metadata labels on the final DockerMan-managed container.
  • Updated Tower deploy scripts to install /boot/config/plugins/dockerMan/templates-user/my-geointel.xml and /boot/config/plugins/dockerMan/images/geointel-icon.png.
  • Updated Tower deploy scripts to stop the old multi-container stack without removing volumes and start the all-in-one stack.
  • Updated the Unraid template so the Docker can be edited from Unraid with one web port, storage path, PostGIS data path and app icon.
  • Hardened live migration and browser runtime smoke scripts with startup retries and an icon check.
  • Verified Tower deployment at http://192.168.10.150:1202 with one healthy geointel container, passing live migration smoke, API proxy smoke and icon smoke.
  • No API contracts, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 31 Unraid deployment template (2026-06-17)

  • Made Docker Compose ports, storage path, PostGIS credentials, CORS origins and upload limit configurable through .env defaults.
  • Added deploy/unraid/geointel.env.example for Unraid/Tower setup.
  • Added deploy/unraid/geointel-unraid-template.xml documenting editable Unraid settings for the multi-container Compose stack.
  • Added GeoIntel SVG icon assets for Unraid/template use and frontend favicon serving.
  • Added regression coverage for Compose env defaults, Unraid template settings, README instructions and icon availability.
  • No API contracts, backend behavior, migrations, product features, provider fetching or AI behavior were introduced.

Sprint 30 workbench component decomposition (2026-06-17)

  • Moved persisted QA/QC result rendering into QualityResultsPanel.
  • Moved map controls, MapLibre composition and feature inspector rendering into MapWorkspace.
  • Added regression coverage to verify App.tsx wires these presentational components without taking QA/map markup back inline.
  • No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.

Sprint 29 dataset component decomposition (2026-06-17)

  • Moved dataset upload/list UI into DatasetPanel.
  • Moved dataset details and job list UI into DatasetDetailPanel.
  • Split raster and vector controls into RasterControls and VectorControls.
  • Added regression coverage to verify App.tsx wires the new presentational dataset components without taking dataset markup back inline.
  • No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.

Sprint 28 dataset workflow hook hardening (2026-06-17)

  • Moved dataset selection, upload, detail loading, dataset jobs and raster/vector operation orchestration from App.tsx into useDatasetWorkflow.
  • Kept project dataset listing in App.tsx so project/area loading remains the shared workbench boundary.
  • Added regression coverage to verify App.tsx still wires dataset, raster and vector UI callbacks while operation API ownership stays inside the focused hook.
  • No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.

Sprint 27 export and QA workflow hook hardening (2026-06-17)

  • Moved Export Center orchestration state and API calls from App.tsx into useExportWorkflow.
  • Moved QA/QC comparison state and persisted quality-check loading from App.tsx into useQualityWorkflow.
  • Added regression coverage to verify App.tsx wires the new hooks while export and QA API ownership stays inside focused hooks.
  • No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.

Sprint 26 frontend workflow hook hardening (2026-06-17)

  • Moved Detection Lab orchestration state and API calls from App.tsx into useDetectionWorkflow.
  • Moved Segmentation Lab orchestration state and API calls from App.tsx into useSegmentationWorkflow.
  • Added shared frontend formatError helper.
  • Added regression coverage to verify App.tsx wires the workflow hooks and panels without direct detection/segmentation API ownership.
  • No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.

Sprint 25 YOLO compatibility smoke hardening (2026-06-17)

  • Added an explicit --check-model-load mode to scripts/yolo_preflight.py.
  • Added the same YOLO preflight entrypoint under backend/scripts/ so it can run inside the backend Docker container.
  • The smoke loads only a configured local model file through the YOLO adapter, runs no inference and does not download weights.
  • The CLI rejects --check-model-load together with --assume-dependencies to avoid false-positive AI readiness.
  • Added tests for successful mocked model-load smoke, load failure reporting and CLI guard behavior.
  • Added the YOLO preflight script to the main readiness gate via Python compile validation.
  • No base dependencies, API contracts, migrations, product features, provider fetching or detection persistence behavior were changed.

Sprint 24 demo/export artifact cleanup tooling (2026-06-17)

  • Added scripts/cleanup_demo_artifacts.py, a dry-run-first maintenance script for old offline demo export artifacts.
  • Added the same cleanup entrypoint under backend/scripts/ so it can run inside the backend Docker container.
  • The cleanup keeps the newest exports per matching demo project, deletes only explicit exports rows/files when --apply is set and refuses file deletion outside STORAGE_ROOT.
  • Added tests for cleanup candidate selection, storage-root path safety and readiness gate coverage.
  • Added the cleanup script to the main readiness gate via Python compile validation.
  • No API contracts, migrations, product features, provider fetching, AI inference or source dataset cleanup behavior were changed.

Sprint 23 V1 report handoff summary (2026-06-17)

  • Added V1 readiness summary data to project metadata exports.
  • Added a V1 Readiness Summary and Known Limitations section to lightweight HTML project reports.
  • The summary covers project, AOI, dataset readiness, QA/QC and export history using persisted state.
  • No new report designer, PDF generation, provider fetching, AI inference, migrations or API route changes were introduced.

Sprint 22 V1 workbench status strip (2026-06-17)

  • Added a compact frontend status strip for project, AOI, datasets, active map layer, QA/QC and exports.
  • The strip is driven by existing App state and suggests the next operator action in the V1 loop.
  • Hardened the MapLibre component so GeoJSON sources/layers wait for the map style to finish loading before updates run.
  • Hardened the offline demo workflow so duplicate historical demo projects prefer complete fixture state before repairing incomplete state.
  • Added regression coverage to ensure the strip remains wired without introducing new API calls.
  • No backend behavior, migrations, API contracts, provider downloads, AI inference or new dependencies were introduced.

Sprint 21 V1 demo workflow smoke hardening (2026-06-17)

  • Hardened the browser-facing demo/export smoke to verify connected V1 state: project area GeoJSON, fixture datasets, vector FeatureCollection content, vector feature summary, persisted QA/QC metrics and export downloads.
  • Loading the offline demo workflow in the frontend now opens the candidate vector fixture dataset directly, so the map workbench is populated after the demo action.
  • Added regression tests for the strengthened demo smoke and frontend demo dataset loading contract.
  • No migrations, provider downloads, AI inference, new dependencies or API route renames were introduced.

Sprint 20 selected area map overlay (2026-06-17)

  • Added persisted AOI GeoJSON to area API responses without changing the database schema.
  • Added a dedicated MapLibre area overlay layer with visibility and opacity controls.
  • Added area list actions to choose which AOI is shown on the map.
  • Added regression tests for area GeoJSON serialization and frontend map overlay wiring.
  • No migrations, provider downloads, AI inference, new dependencies or API route renames were introduced.

Sprint 19 V1 map workbench controls (2026-06-17)

  • Added MapLibre layer visibility and opacity controls for the active GeoJSON workbench layer.
  • Added click-to-inspect feature properties for the active map layer.
  • Updated the visible app identity from the stale Sprint 9 label to GeoIntel Kempen V1 Workbench.
  • Added regression tests that lock the map control and feature inspection wiring.
  • No API contracts, migrations, backend behavior, provider fetching, AI inference or new dependencies were introduced.

Sprint 18 vector change detection foundation (2026-06-16)

  • Added POST /api/v1/analysis/change-detection for synchronous comparison of two vector datasets in the same project.
  • Added a ChangeDetectionService that prefers persisted vector_features, falls back to stored GeoJSON with an explicit warning, and returns added/removed/unchanged GeoJSON features.
  • Added a frontend Change Detection panel and MapLibre change overlay styling for added, removed and unchanged geometries.
  • Added nginx no-cache headers for frontend HTML/assets so LAN Docker rebuilds are visible without stale browser modules.
  • Added backend tests for persisted vector feature comparison and canonical API envelope behavior.
  • No migrations, live provider fetching, AI inference, new dependencies, LiDAR, Copilot, Training Studio or separate Reports module were introduced.

Release hardening audit pass (2026-06-15)

  • Replaced remaining backend datetime.utcnow() usage with timezone-aware UTC timestamps.
  • Verified the affected backend tests with DeprecationWarning promoted to errors.
  • Split the frontend production bundle into explicit app, React vendor and MapLibre vendor chunks.
  • Raised the Vite chunk warning threshold to match the isolated MapLibre GIS dependency rather than masking app-code growth.
  • Hardened the main readiness gate so backend deprecation warnings fail release readiness.
  • Added API contract smoke validation to the main readiness gate.
  • Hardened the pass-end placeholder scan to skip dependency, build-output and bytecode-cache folders.
  • Added backend tests for the release/readiness script expectations.
  • Updated docs/TODO.md with current implementation status while preserving older planning context.
  • No API contracts, migrations, product features, AI dependencies or provider behavior were changed.

Docker runtime hardening (2026-06-15)

  • Fixed the backend Docker build by copying README.md and app/ before pip install ..
  • Removed mandatory Compose .env references so docker compose up works with checked-in local defaults.
  • Published the Docker Compose frontend on host port 1202.
  • Added backend CORS defaults for http://localhost:1202 and http://127.0.0.1:1202.
  • Stopped publishing PostGIS on host port 5432; backend uses Docker-internal db:5432.
  • Added a PostGIS healthcheck and made the backend wait for a healthy database.
  • Added a backend Docker start script that retries a real SQL connection before running migrations, avoiding first-start database race conditions.
  • Made the backend container run alembic upgrade head before starting Uvicorn.
  • Added backend/frontend .dockerignore files to keep dependency folders, build outputs and caches out of Docker build contexts.
  • Added Docker runtime configuration regression tests.
  • Fixed Alembic logging format so Docker migration logs no longer print literal %(levelname) formatter strings.
  • Changed the frontend API default to same-origin requests and added a Vite proxy for /api and /health, with Docker routing to http://backend:8000.
  • Added a browser runtime verification script that fails when the frontend /api proxy returns Vite HTML instead of the backend JSON envelope.
  • Updated environment and local runbook documentation so Docker/LAN browser clients use same-origin API calls through the frontend proxy by default.
  • Corrected example YOLO environment variables to the names the backend actually reads: YOLO_ENABLED, YOLO_MODEL_PATH and YOLO_MAX_TILES.
  • Replaced the Docker frontend runtime with an nginx-served production build and explicit /api plus /health reverse proxy to the backend service, avoiding Vite HTML fallback for API requests.

M6 — Codex Autonomy Pack

Added:

  • M6 autonomy boundaries.
  • M6 quality gates.
  • Codex self-review checklist.
  • Failure recovery playbook.
  • Gap registry.
  • Next-day execution checklist.
  • Final handoff template.
  • Codex pass prompts PASS 00 through PASS 12.
  • GitHub issue templates and PR template.
  • GitHub Actions docs/contract smoke workflow.
  • Codex preflight and pass-end scripts.

Purpose:

  • Prepare the repository so Codex can build with strict guidance and bounded improvement freedom.

M7 - Implementation Control Layer

Added:

  • M7 implementation control layer.
  • Locked build sequence.
  • Regression trap catalogue.
  • Codex self-review checklist.
  • Geospatial calculation rules.
  • Frontend state rules.
  • API response rules.
  • Module completion matrix.
  • Codex decision boundaries.
  • Proposed improvements backlog.
  • End-of-pass review prompts.
  • Regression and contract drift audit prompts.
  • Module contracts for project/area/dataset, detection boundary and QA/QC.
  • M7 self-review scripts.

M8 - Tomorrow Execution Pack

  • Added Day 1 Codex execution pack.
  • Added pass-by-pass Day 1 prompts.
  • Added autonomy boundaries, failure recovery and quality gate matrix.
  • Added operator checklist and smoke script scaffold.
  • Added next-pass guidance for Day 2 GeoAI loop.

v0.9 — M9 Max Preparation

  • Added Codex day-one master prompt.
  • Added autonomous build doctrine and pass scorecards.
  • Added real-vs-demo data policy and detailed data contracts.
  • Added geospatial edge cases, UI state spec and API validation examples.
  • Added implementation review script, regression map and gap-to-task conversion rules.
  • Added final pre-code checklist and long-form prompt variants.

Sprint 1 readiness hardening (2026-06-11)

  • Added cross-platform backend/runtime scripts with python/python3 fallback in readiness tooling.
  • Fixed backend packaging metadata so editable install works in current flat repo layout.
  • Added dependency and smoke test script updates for Sprint 1 services.
  • Added minimal Sprint 1 tests for health endpoint, GeoJSON metadata extraction, invalid payload rejection, and dataset content reads.
  • Fixed frontend README doc reference typo for repository conventions.
  • Updated Sprint 1 docs to include backend import smoke and concrete local setup commands.

Sprint 2 foundation (2026-06-11)

  • Added canonical vector/raster dataset handling and lifecycle status transitions (uploaded, validating, ready, failed).
  • Added vector metadata extraction (feature count, geometry types, bounds, approximate area, CRS assumptions).
  • Added raster metadata extraction service with dependency-aware fallback (RASTER_PROCESSING_UNAVAILABLE).
  • Added deterministic storage metadata capture (original_filename, stored_filename, content_type, size_bytes, checksum_sha256) and upload folder layout.
  • Added dataset inspection/vector summary/raster metadata API endpoints and frontend detail panel support.
  • Added Sprint 2 tests for vector metadata, invalid GeoJSON handling, legacy geojson compatibility and raster dependency fallback.

Sprint 3 foundation (2026-06-11)

  • Added job model and database migration for queued/running/success/failed operations.
  • Added job APIs for create/list/read/status under project scope.
  • Added vector operation services and route wiring for inspect/bbox/stats/clip/buffer/intersect.
  • Added raster operation scaffolding for inspect/metadata/preview, with dependency-aware clip/tile unavailability.
  • Added frontend operation controls, job status display, and derived dataset link-through in dataset detail panel.
  • Updated API contracts and execution log for Sprint 3 foundations.

Sprint 5 raster analytics hardening (2026-06-11)

  • Added raster band statistics operation:
    • min, max, mean, std, nodata count, nodata ratio, valid pixel count, dtype, band index and optional histogram.
    • chunked raster reads to reduce memory pressure and explicit dependency-aware unavailable mode when raster libs are missing.
  • Added raster reproject operation foundation with CRS validation:
    • supports target CRS selection via explicit parameter,
    • persists derived output dataset with operation provenance,
    • records operation parameters and error details when invalid.
  • Hardened raster clip and tile manifest flow:
    • explicit empty clip failure behavior,
    • bounds/metadata refresh and improved tile manifest fields.
  • Added raster operation job persistence tests:
    • result_json and error_message persistence,
    • dependency-aware statistics failure behavior,
    • invalid CRS handling,
    • output linkage for reprojected datasets.
  • Extended dataset UI dataset detail job panel:
    • raster metadata visibility (CRS, bounds, resolution),
    • raster band statistics rendering,
    • reproject form and job result visibility.

Sprint 6 local spectral indices (2026-06-12)

  • Added local spectral index operations:
    • NDVI endpoint
    • NDWI endpoint
    • NDBI endpoint
  • Added explicit spectral index input validation:
    • positive integer checks
    • source raster band-count bounds checks
  • Implemented dependency-aware index execution for missing raster dependencies.
  • Added local spectral raster output generation using float32 and NaN invalid handling.
  • Stored index-derived dataset provenance metadata:
    • source_dataset_id
    • operation (raster.ndvi, raster.ndwi, raster.ndbi)
    • band_mapping
    • formula
    • output_dtype
    • nodata_strategy
    • value_range_note
    • created_at
    • output_dataset_id
    • path
  • Extended dataset detail UI with spectral index controls and result dataset actions.
  • Updated:
    • docs/API_CONTRACTS.md
    • docs/RASTER_OPERATIONS_SPEC.md
    • backend/README.md
    • frontend/README.md
    • docs/CODEX_EXECUTION_LOG.md

Sprint 7A persistence and QA foundation (2026-06-12)

  • Added vector_features as first-class queryable vector state while preserving original uploaded files as source artifacts.
  • Added quality_checks and metrics as persisted QA/QC domain records.
  • Added Alembic migration 202606120700_sprint7a_persistence_foundation.py for vector features, quality checks, metrics and required indexes.
  • Persisted uploaded vector GeoJSON feature properties and geometries into PostGIS-backed feature rows.
  • Updated QA candidate-vs-reference jobs to persist quality checks and metric rows and return quality_check_id.
  • Hardened GRB/OSM provider contracts as honest not_configured capability stubs only.
  • Added tests for Sprint 7A persistence, dataset role validation, provider contracts, migration integrity and QA route persistence.

Sprint 7B provider integration skeleton (2026-06-12)

  • Added central provider registry entries for grb, osm, manual and fixture.
  • Added provider capability, layer, status and future import-contract endpoints using the existing API envelope style.
  • Kept GRB and OSM as explicit not_configured providers with no live WFS, Overpass or download behavior.
  • Added provider-to-dataset mapping rules for future imports through DatasetService and VectorFeatureService.
  • Added lightweight frontend Provider Capabilities panel with status, authority, layers, query modes and limitations.
  • Added live PostGIS migration smoke script for opt-in local database verification.
  • Added Sprint 7B provider registry/API tests.

Sprint 8 Detection Lab foundation (2026-06-12)

  • Added detections as first-class persisted PostGIS records linked to project, dataset, job and analysis run.
  • Hardened analysis_runs with dataset/job/model/result metadata for future detection and segmentation workflows.
  • Added model registry capabilities for yolo-placeholder and manual-fixture-detector.
  • Added Detection Lab service and API foundation with dependency-aware DETECTION_MODEL_UNAVAILABLE responses.
  • Added explicit fixture detector mode for tests/demo fixtures only; no fake production inference was introduced.
  • Added minimal frontend Detection Lab panel for model status, raster dataset selection, confidence threshold and run status.
  • Added Sprint 8 tests for persistence, model capabilities, unavailable model behavior, invalid dataset validation, explicit fixture persistence and API envelope shape.

Sprint 8B configured YOLO foundation (2026-06-12)

  • Added optional ai backend dependency group for Ultralytics/Torch without making AI dependencies mandatory for normal startup.
  • Added yolo-configured model registry capability with not_configured, dependency_unavailable and configured status behavior.
  • Added import-safe YOLO adapter that loads only an existing local model path and does not auto-download weights.
  • Added raster tile manifest validation, configured tile limits and pixel bbox to EPSG:4326 detection polygon conversion.
  • Added mocked YOLO persistence tests that verify first-class detection records without requiring YOLO dependencies.
  • Added Detection Lab tile manifest path input for configured YOLO runs.
  • Updated AI/API/backend/frontend docs for Sprint 8B configuration and limitations.

Sprint 8C detection visualization and QA integration (2026-06-12)

  • Added detection result review endpoints for run lists, filtered detections, detection detail and GeoJSON FeatureCollection output.
  • Added detection QA against persisted reference vector_features using existing quality_checks and metrics.
  • Added frontend Detection Lab run selection, detection table, class/confidence filters and MapLibre detection GeoJSON overlay.
  • Added frontend detection QA controls and metric summary display.
  • Added tests for detection GeoJSON shape, filters, detail, QA persistence, no-match QA and Sprint 8B manifest edge cases.
  • Segmentation, LiDAR, Copilot, Training Studio and Reports remain out of scope.

Sprint 9 Segmentation Lab foundation (2026-06-12)

  • Added segmentations as first-class persisted PostGIS MultiPolygon records linked to project, dataset, job and analysis run.
  • Added deterministic segmentation mask path convention under storage/masks/{project_id}/{analysis_run_id}/tile_{tile_index}/.
  • Added segmentation model registry capabilities:
    • segmentation-placeholder
    • fixture-segmenter
    • yolo-seg-configured
    • sam-configured
  • Added Segmentation Lab service and API foundation for model listing, run creation, run/result listing, detail, GeoJSON output and reference QA.
  • Added segmentation QA against persisted reference vector_features using existing quality_checks and metrics.
  • Added minimal frontend Segmentation Lab UI with model status, raster selection, run/result table, map overlay and QA metric display.
  • Real SAM, real YOLO-seg, model downloads, new AI dependencies, LiDAR, Copilot, Training Studio and Reports remain out of scope.

Sprint 10 release hardening and modularization (2026-06-13)

  • Extracted project, area, provider capabilities, Detection Lab and Segmentation Lab UI sections from frontend/src/App.tsx into focused components.
  • Preserved existing API client usage, state ownership, MapLibre overlay behavior and workbench UX.
  • Hardened readiness checks to include Alembic head verification and scripts/live_migration_smoke.sh syntax validation.
  • No new product features, migrations, AI dependencies or live external provider fetching were introduced.

Sprint 11 live Docker/PostGIS runtime validation (2026-06-13)

  • Hardened scripts/live_migration_smoke.sh so fresh databases run Alembic migrations before checking PostGIS_Version().
  • Added live runtime schema-object checks for core migrated tables and geometry indexes.
  • Added backend tests that lock the live migration smoke ordering and schema-check contract.
  • Documented exact Docker/PostGIS validation commands, expected DATABASE_URL and local cleanup commands.
  • Docker was unavailable in the current shell, so live container execution remains pending on a Docker-enabled machine.

Sprint 12 QA/QC golden dataset and benchmarking (2026-06-15)

  • Added deterministic golden building QA/QC fixtures and expected metric baseline.
  • Added scripts/run_golden_qa_benchmark.py to run existing QA/QC logic against the golden fixtures and fail on metric drift.
  • Added backend tests covering expected golden metrics and QualityCheck/Metric persistence verification.
  • Documented benchmark purpose, command, expected outputs, tolerance and limitations.
  • No product features, API contracts, migrations, live providers, AI models or new dependencies were introduced.

Sprint 13 real YOLO operational hardening (2026-06-15)

  • Added YoloPreflightService for local configured-YOLO readiness checks without loading models or running inference.
  • Added scripts/yolo_preflight.py for checking enabled state, optional dependency availability, local model path, tile manifest validity, tile limit and referenced tile paths.
  • Added backend tests for disabled, dependency-unavailable and ready preflight states plus CLI JSON output.
  • Documented preflight usage in backend and AI pipeline docs.
  • No model downloads, API contracts, migrations, new dependencies, segmentation behavior or provider fetching were introduced.

Sprint 14 Docker GIS runtime enablement (2026-06-16)

  • Added a backend gis optional dependency group for the approved raster/vector runtime stack.
  • Updated the backend Docker image to install the gis extra plus GDAL/GEOS/PROJ system packages.
  • Added scripts/verify_gis_runtime.sh to verify browser-facing PostGIS, Rasterio and GeoPandas capabilities through the frontend proxy.
  • Added scripts/gis_import_smoke.py and made the backend Docker build fail if Rasterio, GeoPandas or pyogrio cannot be imported.
  • Moved the Docker build-time GIS import smoke into the backend build context and kept the root script as a local wrapper.
  • Included the GIS runtime script syntax check in the main readiness gate.
  • Added backend and frontend Docker Compose healthchecks and made the frontend wait for a healthy backend.
  • Added regression tests for Docker GIS dependency installation and capability verification script coverage.
  • Documented Docker GIS runtime verification commands for local and LAN deployments.
  • No API contracts, migrations, AI dependencies, provider fetching or product features were changed.

Sprint 15 explicit demo workflow seed (2026-06-16)

  • Added POST /api/v1/demo/workflow to seed or return an explicit offline demo workflow.
  • The demo workflow creates a project, AOI, fixture reference building dataset, fixture candidate building dataset and persisted QA/QC metrics.
  • Added scripts/seed_demo_workflow.py for CLI-based demo seeding.
  • Added frontend "Load demo workflow" action in the Projects panel.
  • Added tests for the demo endpoint envelope and fixture contract.
  • No live GRB/OSM fetching, AI inference, migrations or new dependencies were introduced.

Sprint 16 QA/QC result visibility (2026-06-16)

  • Added GET /api/v1/projects/{project_id}/quality-checks to list persisted quality checks and metric rows.
  • Added a frontend QA/QC Results panel for project-level persisted QA output.
  • Demo workflow loading and QA actions now refresh visible QA/QC results.
  • Added backend tests for quality check listing and canonical response envelopes.
  • No migrations, new dependencies, live provider fetching or AI inference were introduced.

Sprint 17 export foundation (2026-06-16)

  • Hardened POST /api/v1/exports/geojson so exports persist Export rows instead of returning dataset ids as export ids.
  • Added GeoJSON export support for vector datasets, detection runs and segmentation runs using existing persisted geometry services.
  • Added project metadata JSON export, lightweight project report HTML export and export list/read/content/download endpoints.
  • Added a frontend Export Center panel for creating exports, listing export records, previewing JSON artifact content and downloading artifacts.
  • Added export history to project metadata/report artifacts.
  • Added scripts/verify_demo_export_workflow.sh to smoke test demo seeding, QA/QC visibility, metadata/report/vector exports, export listing and artifact downloads through the browser-facing URL.
  • Added backend tests for export persistence, artifact writing, raster rejection, HTML report creation, canonical export envelopes and raw file downloads.
  • No migrations, new dependencies, live provider fetching, AI inference, LiDAR, Copilot, Training Studio or separate Reports module were introduced.

Sprint 51 QA/QC and export workspace polish (2026-06-17)

  • Polished the QA/QC workspace with persisted-check summary tiles, clearer empty state, quality-check cards and metric chips.
  • Polished the Exports workspace with artifact action groups, latest-export card, export history cards and preview panel framing.
  • Preserved existing API clients, callbacks and export/QA behavior.
  • Added regression coverage for the QA/QC and Exports workspace structure.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 52 selected context inspector tabs (2026-06-17)

  • Replaced the fixed dataset-only right inspector with tabbed Context, Dataset, QA/Exports and AI Runs inspection.
  • Reused the existing dataset detail component for raster/vector operations so dataset behavior and callbacks remain unchanged.
  • Added context cards for selected project, AOI, map feature, latest QA/QC result, latest export and selected detection/segmentation run state.
  • Added regression coverage for inspector wiring and tab structure.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 53 map/dataset selection ergonomics (2026-06-17)

  • Added active selected-state styling to dataset cards.
  • Added dataset quick actions for opening the selected dataset in the Map workspace or Exports workspace.
  • Added inspector navigation actions for Data, Map, QA/QC, Exports and AI Labs workspaces.
  • Preserved existing dataset detail loading, map layer state, export actions and API client behavior.
  • Added regression coverage for dataset quick actions and inspector navigation wiring.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 54 populated-state UI polish (2026-06-17)

  • Ran the live demo/export workflow against Tower and audited populated Data and Exports states.
  • Changed the Data workspace to keep Project and AOI side by side while giving the Dataset catalog a full-width row.
  • Compacted the Exports history to show the latest 10 artifacts by default with an explicit show-all toggle.
  • Kept a visible Export Preview panel even before preview content is selected.
  • Shortened displayed export paths while preserving the full path in the element title.
  • Added regression coverage for populated-state Data layout, export limiting and export preview empty state.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 55 live visual shell polish (2026-06-17)

  • Audited the live workbench visually in Browser on http://192.168.10.150:1202.
  • Compacted the top context bar and primary navigation so the workbench has more usable canvas space.
  • Moved the inspector below the workspace on standard desktop widths instead of forcing a cramped three-column layout.
  • Preserved the side inspector behavior for wider screens.
  • Improved Map workspace control wrapping so the map/status controls do not clip at 1280px.
  • Reset page scroll on workspace changes so workspaces open from their heading instead of inheriting stale scroll positions.
  • Added regression coverage for the standard-desktop layout and workspace scroll reset.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 56 export history controls (2026-06-17)

  • Added frontend-only export history search across export type, status, id and storage path.
  • Added export type and status filters based on the currently loaded export records.
  • Made the existing latest-10 export limiter operate on filtered results instead of the whole export list.
  • Added a no-match empty state and reset view action for filtered export history.
  • Slightly compacted export action buttons so filters are visible earlier on standard desktop viewports.
  • Added regression coverage for filtering controls, filtered list limiting and the no-match state.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 57 safer demo export cleanup (2026-06-17)

  • Hardened the existing dry-run-first demo export cleanup command with a --max-delete safety cap.
  • Added repeated --export-type filters so operators can clean only selected artifact kinds.
  • Cleanup apply runs now report a blocked_reason instead of deleting when selected candidates exceed the cap.
  • Dry-run output now includes candidate_exports with export ids so duplicate storage paths remain auditable.
  • Updated root and backend cleanup entrypoints, docs and regression coverage.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 58 demo cleanup dry-run smoke (2026-06-18)

  • Added scripts/verify_demo_cleanup_dry_run.sh to verify the demo export cleanup path against a running backend without passing --apply.
  • The smoke supports compose, all-in-one container and local modes, and asserts dry_run=true, deleted_export_count=0, empty deleted files and candidate dry-run fields.
  • Added the smoke syntax check to the main readiness gate and regression coverage for the non-mutating script contract.
  • Updated maintenance documentation in scripts/README.md, docs/STORAGE_ARCHITECTURE.md and backend/README.md.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 59 workbench screenshot artifacts (2026-06-18)

  • Added scripts/capture_workbench_screenshots.sh for optional visual regression handoff screenshots.
  • The capture script seeds the explicit offline demo workflow, opens each main workspace and writes viewport PNG screenshots plus a manifest.json under ignored local artifacts.
  • Desktop screenshots are always captured; mobile screenshots are captured by default and can be disabled with CAPTURE_MOBILE=0.
  • Added readiness syntax coverage and regression checks for the non-mutating screenshot capture contract.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 60 API error-envelope contract hardening (2026-06-18)

  • Aligned backend error responses with the documented ApiError contract: top-level error, message, details and request_id.
  • Preserved frontend compatibility with both the canonical top-level error payload and the older nested error-object shape.
  • Added regression coverage for AppError, HTTPException and validation-error envelopes.
  • Added static frontend parser coverage so API client error parsing does not drift silently.
  • No migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 64 export/report handoff polish (2026-06-18)

  • Added a handoff readiness summary to the Export Center for selected dataset, detection run, segmentation run and latest artifact context.
  • Grouped existing export actions into scan-friendly artifact cards for project report, metadata, vector GeoJSON, detection GeoJSON and segmentation GeoJSON.
  • Added clearer export history provenance with formatted export-type badges, analysis-run ids and created timestamps when available.
  • Added regression coverage for the Export Center handoff structure and responsive styling.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 65 project report readability polish (2026-06-18)

  • Reworked the lightweight HTML project report template into a self-contained handoff layout with hero, readiness pill, scorecards and sectioned tables.
  • Added print-friendly CSS and scroll-safe table wrappers while preserving the existing project_report_html export type and download behavior.
  • Added source/CRS columns to the dataset inventory section and clearer "Dataset inventory", "QA/QC evidence" and "Artifact history" report headings.
  • Added regression coverage for report layout markers, print CSS and HTML escaping.
  • No API contracts, migrations, product capabilities, PDF/report-designer functionality, live provider fetching or AI/model dependency changes were introduced.

Sprint 67 map empty-state quick actions (2026-06-19)

  • Added ready vector/GeoJSON dataset quick actions to the Map workspace empty state.
  • Reused the existing openDatasetInMap flow so selecting a quick action loads the persisted dataset layer without changing API contracts.
  • Added responsive styling and regression coverage for the Map quick-action grid.
  • Verified locally against the live demo state that the empty map state exposes two dataset actions and opens demo_predicted_buildings.geojson as a 2-feature map layer.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 103 AI Lab run readiness (2026-06-24)

  • Added compact run-readiness panels to Detection Lab and Segmentation Lab.
  • Detection readiness now shows raster dataset, model availability and the configured-YOLO tile manifest requirement before submitting a run.
  • Segmentation readiness now shows raster dataset, model availability and tile manifest provenance state before submitting a run.
  • Added regression coverage for the AI Lab readiness UI contract and styling.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.

Sprint 104 AI Lab action guardrails (2026-06-24)

  • Added explicit action guardrails below Detection and Segmentation run-readiness panels.
  • Detection now distinguishes configured model state from UI-runnable state and blocks the explicit test/demo-only fixture detector in the normal run form.
  • Segmentation now distinguishes configured model state from UI-runnable state and blocks the explicit test/demo-only fixture segmenter in the normal run form.
  • Added regression coverage for AI Lab action guardrails and compact guardrail styling.
  • No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.