Files
geointel/CHANGELOG.md
T
Codex 5b4e18059a
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s
Add governed bathymetry profile workflow
2026-07-17 15:25:00 +02:00

213 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 235 Governed bathymetry profiles and Belgian scale architecture (2026-07-17)

  • Added bounded official VHA cross-section acquisition with exact Area clipping, complete paging, checksums and ordinary Dataset/VectorFeature persistence.
  • Added nullable structured depth/width metrics, official profile-document evidence and explicit unsupported volume semantics.
  • Added a bathymetry source registry covering operational VHA profiles and audited MDK North Sea, SPW Walloon and port candidates without pretending those future connectors are configured.
  • Added the Waterbodem Map theme and a concise profile inspector.
  • Added the Mol operator command and a staged expansion roadmap for Flanders, Belgium, the territorial sea, EEZ and continental shelf with strict TAW/LAT/mDNG separation.

Sprint 234 Full audit closure and workspace lifecycle cleanup (2026-07-17)

  • Added reversible active/archived project lifecycle handling and made active workspaces the default project-list contract.
  • Added a dry-run-first, strict-allowlist operator command for archiving benchmark, calibration and smoke-test projects while preserving all related persistence and both canonical operational workspaces.
  • Moved overview orchestration, detection model management and pure map helpers into focused modules without changing API or persistence behavior.
  • Reduced end-user noise across Map, Quality, Detection and Segmentation by using Dutch task language and placing UUIDs, paths, checksums and runtime diagnostics behind technical disclosures.
  • Replaced persisted AI run/model/class/tile internals with friendly labels in the ordinary result tables while retaining the original provenance in persistence and technical views.
  • Added widescreen layout guardrails for AI workspaces and regression coverage for project lifecycle, packaged cleanup and the new component boundaries.
  • Bounded the 15-theme selector on narrow mobile screens so the primary map and result flow is no longer displaced by the complete theme inventory.
  • Hardened the packaged archive command for direct container execution and added a subprocess regression for the documented operator invocation.

Sprint 233 Operational correctness and result completion (2026-07-17)

  • Fixed the map-first contract so drawn/manual selections use bbox ∩ Area consistently for vector, raster, temporal, derived-dataset and export paths. The full-Area fast path is used only when the bbox covers the complete Area.
  • Made vector-selection exports Area-aware and added a canonical server-side map-result export for current vector/raster measurements and historical comparisons.
  • Changed the result handoff to persist the server-recomputed artifact before opening Downloads; map analyses, evolution results and vector selections now appear in the latest-download surface.
  • Added exact-name project filtering and canonical regional-workspace lookup, removing the dependency on the first 50 newest operator projects.
  • Improved source failure messages, workspace scroll reset, map viewport ergonomics, Detection Lab flow, QA score interpretation and Dutch download terminology.
  • Removed governed terrain, flood-hazard and thematic rasters from the Detection Lab luchtbeeld selector while keeping them available on the map.
  • Added focused regression coverage for selection scope, export persistence, canonical workspace lookup and the usability guardrails.

Sprint 232 V1 user-flow completion (2026-07-17)

  • Completed the primary end-user handoff from map analysis to a usable result, local AI question and downloads without exposing technical project or model setup in the normal path.
  • Added explicit metric names to the all-theme summary so values such as a station water level are no longer shown without their measured meaning.
  • Kept vector selections downloadable as GeoJSON and added JSON downloads for governed raster analyses and complete historical comparisons.
  • Added compact post-analysis actions for the local grounded Ollama assistant and the existing Downloads workspace, preserving the active area context.
  • Kept the map workspace mounted while visiting AI, Downloads or another workspace so the selected theme, computed result and evolution comparison remain available when the operator returns to the map.
  • Replaced the accumulated TODO lists as the product roadmap with one current V1 completion board; historical sprint checklists remain retained as implementation evidence.

Sprint 231 Governed orthophoto release promotion (2026-07-17)

  • Added an operator-only plan -> stage -> review -> apply coordinator for one bounded current Digitaal Vlaanderen orthophoto selection. It reuses and revalidates the Sprint 230 catalog, WMS, WCS and flight-day preflight.
  • Stage performs exactly one bounded allowlisted WMS GetMap, retains the raw response, normalizes a three-band EPSG:31370 GeoTIFF and creates a PNG review preview. Every source, raster, preview, request and preflight identity is SHA-256-bound under persistent operator evidence.
  • Review requires a named explicit approval. Apply requires exact plan and review hashes, rechecks remote and local state, and uploads only the approved GeoTIFF through the existing dataset upload/DatasetService transaction.
  • Added an explicit first-baseline transition for legacy most_recent_at_* markers. It requires both the exact legacy marker and the official edition; no existing Dataset is rewritten or deleted.
  • Made official YYYY.NN orthophoto Datasets take precedence over rolling acquisition markers in source-catalog comparison. No API, migration, scheduler, browser fetch or automatic refresh was added.
  • Made staged, reviewed and applied release evidence write-once. An idempotent apply validates and reuses the existing evidence instead of changing its timestamp or authorization history.
  • Made the read-only source-freshness audit prefer the governed official YYYY.NN orthophoto edition over retained legacy most_recent_at_* labels, while preserving the existing rolling-source review interval.

Sprint 230 Governed orthophoto release preflight (2026-07-17)

  • Added an operator-only, read-only preflight for the current Digitaal Vlaanderen orthophoto product. It binds the canonical product and catalog envelopes to exact official WMS capabilities and ISO edition evidence.
  • Added metadata-only WCS DescribeCoverage validation for the governed EPSG:31370, 15 cm, three-band Ortho raster domain and deterministic bounded Vliegdagcontour sampling for selected-area flight-year evidence.
  • Classified local official editions as current/update/baseline/remote-older and kept legacy most_recent_at_* values explicitly non-comparable. No raster pixels, Datasets, Jobs, migrations or automatic refresh were added.
  • Added trust-boundary, hash-drift, product, coverage, flight-year, bounds and runtime-packaging tests plus readiness compilation and operator docs.

Sprint 229 Governed ALZ definitive release promotion (2026-07-17)

  • Added an operator-only plan -> stage -> review -> apply coordinator for future definitive ALZ agricultural-use parcel editions. A provisional v1/v2 campaign snapshot remains visible release evidence but is never importable.
  • Derived the exact archive identity from the allowlisted publication year and date reported by the existing source-catalog probe. Arbitrary provider URLs, current/older releases, catalog drift and changed staged bytes fail closed.
  • Extended the existing agricultural provisioner to accept exactly one explicitly governed future edition, validate final download identity, keep streamed size bounds and read every paginated workspace Dataset consistently.
  • Bound archive, normalized GeoJSON, GeoPackage schema/CRS, crop-code list, scope totals and previous-edition deltas into named human review evidence. Apply still creates only an immutable Dataset through DatasetService.
  • Added focused trust-boundary, tamper, drift, approval, apply and packaging tests without adding an API route, migration, scheduler or frontend action.

Sprint 228 Governed Statbel population release promotion (2026-07-17)

  • Added an operator-only plan -> stage -> review -> apply coordinator for future official Statbel population editions. Plan is read-only, stage is preflight/filesystem-only, review requires a named approval and apply requires exact plan plus review SHA-256 values.
  • Derived population and matching geometry URLs only from the allowlisted catalog year/layout contract. Current, older, unavailable, ambiguous or catalog-drifted releases fail closed; the coordinator accepts no arbitrary provider URL and creates no scheduler or background fetch.
  • Extended the existing population provisioner to accept one complete explicitly governed future release, bound downloads before buffering and discover the latest retained baseline across dynamically added years.
  • Revalidated every source, manifest and snapshot byte immediately before the canonical DatasetService upload. Dataset discovery now paginates completely, preserving idempotence in workspaces with more than 200 datasets.
  • Added focused release-state, trust-boundary, tamper, review and apply tests, Docker packaging and readiness compilation without API or migration changes.

Sprint 227 Statbel population import compatibility preflight (2026-07-16)

  • Added a local, fail-closed preflight for staged official Statbel population and matching statistical-sector archives. It validates exact source identity, bounded ZIP contents, table/geometry schemas, REDEGEO layout, EPSG:31370, situation date, geometry validity, scope coverage, joins and reconciled national/scope totals before a new import is eligible.
  • Replaced the historical sector-prefix municipality assumption with explicit population/geometry municipality-field reconciliation, which supports the 2025 REDEGEO municipal-merger contract without weakening identity checks.
  • Accounted for official ZZZZ unlocated population separately from map-ready sectors and bounded lossless make_valid normalization of reported source topology errors. Both conditions are visible in the evidence manifest.
  • Hardened the existing population operator to retain official source ZIPs, atomically write derived evidence, require a passed manifest for new imports and revalidate source plus derived SHA-256 values immediately before upload.
  • Added negative regression coverage and packaged the preflight in the all-in-one image and release readiness compile gate. No API, migration, automatic import or existing Dataset was changed.

Sprint 226 Governed Statbel population edition probe (2026-07-16)

  • Extended the explicit read-only source catalog audit with the official Statbel DCAT Turtle catalog and the latest uniquely identified Dutch population-by-statistical-sector release.
  • Added strict catalog, redirect, landing-page, license and distribution URL validation with a separate 5 MiB bound. Distribution ZIP/XLSX files are never downloaded and no Dataset is imported or replaced.
  • Kept population year, statistical-sector geometry year and REDEGEO layout separate. The 2025 new layout is current; the old-layout file is transition evidence only, and 2026 sector geometry is not treated as 2026 population.
  • Reused the canonical source-catalog envelope, cache, operator command and Status UI, and propagated configuration through Compose and Unraid.
  • Added RDF/Turtle parser, ordering, trust-boundary, size-limit, redirect and no-distribution-fetch regression coverage without migrations.

Sprint 225 Governed ALZ edition probe (2026-07-16)

  • Extended the explicit read-only source catalog audit with the official ALZ agricultural-use parcel publication page without adding an importer, scheduler or background provider request.
  • Added strict release-page, redirect and archive-link allowlists and bounded HTML parsing; the probe never downloads the referenced ALZ ZIP archives.
  • Normalized only definitive third snapshots as comparable editions, so local 2025-definitive evidence matches official 2025-v3 while current 2026-v1 remains visibly provisional.
  • Reused the canonical source-catalog envelope, Status UI and operator command, and propagated the fixed release URL through Docker and Unraid runtime configuration.
  • Added focused release parsing, version ordering, cache, failure-isolation and trust-boundary regression coverage without changing persistence or migrations.

Sprint 224 Governed GRB evolution (2026-07-16)

  • Enabled fail-closed object evolution between the retained regional GRB snapshots by validating official OGC feature identities, approved operator provenance, completeness and collection-specific prefixes.
  • Removed geometry-hash identity fallbacks from future regional GRB imports; a provider feature without an official identity now aborts acquisition.
  • Added explicit identity contracts to future buildings, roads, water and parcel snapshots while retaining compatibility with the two already persisted governed editions.
  • Improved daily temporal labels and added a clear distinction between an official registration change and the unknown date of a physical change.
  • Documented a source-wide refresh-readiness matrix without enabling browser fetches, schedulers, migrations or automatic Dataset replacement.

Sprint 223 Governed regional GRB refresh (2026-07-16)

  • Added a canonical, read-only regional GRB refresh plan for buildings, roads, water and parcels, derived from the official catalog edition and persisted temporal snapshots.
  • Added an explicit operator coordinator with separate plan, stage and SHA-256-confirmed apply phases. Staging validates every municipality partition before PostGIS persistence is possible.
  • Kept all provider URLs and collections allowlisted, reused the existing resumable regional operators and DatasetService/VectorFeatureService import path, and retained every older snapshot.
  • Added compact Status UI, deterministic guardrail tests and readiness syntax coverage without changing migrations or enabling automatic refresh.
  • Fixed map theme ranking so a newer official observation always wins over an older snapshot with a marginally larger feature count.
  • Restored the active map theme from the selected dataset when returning to the Map workspace, keeping viewport queries, legends and zoom guidance aligned.

Sprint 222 Official source edition probes (2026-07-16)

  • Added explicit, read-only GRB and most-recent orthophoto catalog probes using official WFS/WMS capabilities and linked ISO 19139 CSW metadata records.
  • Added bounded response sizes, timeouts, provider-isolated failures, a short cache and strict metadata-host/path validation. No provider features, raster pixels or application data are fetched or modified.
  • Added canonical API, compact opt-in Status UI and operator CLI support. The local source-freshness audit remains automatic and provider-free.
  • Added deterministic XML/network-boundary tests and editable Compose/Unraid controls without changing migrations or persistence contracts.

Sprint 221 Governed source freshness audit (2026-07-16)

  • Added a project-wide read-only source report derived from Dataset, DatasetVersion and local storage evidence, with canonical API envelope.
  • Classified rolling snapshots, annual releases, fixed editions, scenarios, archives and local artifacts separately so historical publications are not mislabeled as stale.
  • Added integrity checks for missing versions, checksum disagreement, missing local files and size mismatches without changing persistence or migrations.
  • Added a compact frontend source-status panel and a packaged cron-compatible operator command. Neither path contacts providers, downloads files or performs automatic refreshes.

Sprint 218 Regional terrain and flood completion (2026-07-16)

  • Provisioned and audited the complete governed Kempen matrices: 56 DHMV DTM/DSM rasters and 336 VMM flood-scenario rasters across all 28 approved municipalities, each with one DatasetVersion and a non-empty checksum-bound GeoTIFF.
  • Bounded official WCS edge-grid rounding to at most 5%/0.25 m for DHMV and VMM tile assembly, resampled accepted edge tiles to the exact 5 m analysis grid and retained every source resolution and harmonized tile index in provenance. Larger mismatches still fail closed.
  • Added exact regional raster-selection endpoints. They open only intersecting persisted municipality partitions, mosaic the selected windows in memory and calculate global cell statistics under the existing 12-million-cell guard; no monolithic or hidden authoritative raster is created.
  • Updated the Map workspace to expose DHMV and VMM on the complete Kempen Area, render all 28 matching MapLibre partitions, deduplicate VMM into twelve scenario choices and analyse a drawn cross-boundary rectangle without first selecting a municipality.
  • Forwarded the active Area through drawn, coordinate, manual, temporal, derived-dataset and full-workflow selections so every result remains clipped to the chosen municipality or approved regional boundary.
  • Preserved the distinction between DHMV height, modeled VMM scenario depth, permanent water, bathymetry and concurrent flood volume.

Sprint 217 Regional DOV soil coverage (2026-07-16)

  • Added a governed regional DOV soil operator for all 28 approved Kempen municipalities. It validates the official scope artifact, clips in Lambert 72, retains deterministic gzip WFS responses and imports through the existing DatasetService/vector-feature flow.
  • Added NIS-suffixed persisted feature ids for source polygons split by municipality boundaries, while retaining the original DOV source id in provenance properties.
  • Persisted one complete regional snapshot with 27,200 valid soil polygons assembled from 62 source responses and 46,134 bounded source features.
  • Kept the 1949-1971 survey period, 1:20,000 scale and historical drainage limitation visible in map results and assistant context.
  • Disabled preclipped metric shortcuts for the regional snapshot. Exact PostGIS intersections remain mandatory because CRS round trips can create negligible coordinate-rounding slivers at administrative boundaries.
  • No migration, new endpoint, direct database write or current-soil claim was introduced.

Sprint 216 Regional thematic coverage (2026-07-16)

  • Provisioned all five governed Departement Omgeving thematic rasters for all 28 approved Kempen municipalities and for the complete persisted transport region. The resulting 145 ready Datasets remain linked to exact Areas and contain no duplicate area/product pairs.
  • Raised only the thematic-raster acquisition envelope to the measured Kempen extent: 60 km per side and 30 million output pixels. Official WCS reads stay partitioned into fixed 10 km tiles; orthophoto, DHMV and flood limits were not changed.
  • Added bounded retries for interrupted or transient official WCS tile responses. Partial bytes are never accepted and three failed attempts still produce the canonical provider-unavailable error.
  • Hardened the local assistant prompt so year, source and measurement quality must remain attached to the same Dataset when one requested theme has multiple official observations.
  • Verified the complete regional map workflow against live PostGIS. A full Kempen selection reports 45,126.87 ha space occupation, 97,375.81 ha open space, an estimated 484,146.70 inhabitants from the 2019 density raster and the persisted 2022 accessibility and service scores.
  • No migration, live provider integration, synthetic metric or direct database write was introduced.

Sprint 215 Grounded assistant cross-domain reliability (2026-07-16)

  • Raised the bounded local Ollama answer budget from 700 to 1,200 tokens after a live Mol profile exhausted the smaller limit; done_reason=length remains a hard error and incomplete text is still never returned.
  • Required listed themes to be covered without adding unrelated themes and kept cross-domain answers compact without weakening source, unit, estimate, chronology or unsupported-metric rules.
  • Exposed the output limit in the Unraid DockerMan template and aligned all Compose, runtime, example and operator documentation defaults.
  • Limited expensive PostGIS summaries to explicitly requested themes while preserving full context for general overview/source questions. This keeps a six-theme Mol profile from calculating unrelated agricultural subclasses.
  • Provisioned the five official thematic products and the 1,159-feature DOV soil map into Mol's Area in the central 28-municipality workbench, removing the mismatch with the earlier standalone Mol project.
  • Added deterministic semantic rounding for model context and normalized model Markdown to the existing plain-text renderer so hectare, population and score answers remain readable without exposing raw floating-point tails.
  • Prevented an area-weighted population estimate from retaining model phrases such as "official count" when its persisted metric is marked as estimated.
  • Preserved Dutch sentence casing and word order when the estimate guard rewrites contradictory population wording in a generated answer.
  • Fixed the narrow-screen geographic explorer cascade so the theme selector, map and results stack at their container width instead of retaining the generic section grid and clipping the map horizontally.
  • Recognized Dutch compound GIS terms such as bodemdetails, bevolkingsontwikkeling and perceeloppervlaktes when selecting the minimal grounded assistant context.
  • Kept supporting object counts in the canonical response evidence but omitted them from the model prompt whenever more meaningful area, length, population or score metrics exist. This prevents a model typo from competing with the authoritative semantic measurement.

Sprint 213-214 Cross-domain area profile (2026-07-16)

  • Implemented one allowlisted MercatorNet WCS registry for official Flemish space occupation 2025, open space 2022, population density 2019, public transport node value 2022 and total service level 2022 rasters.
  • Added bounded tiled acquisition, exact Area clipping in EPSG:31370, raster value/unit validation, checksummed Dataset/DatasetVersion provenance and source-correct selection metrics without accepting arbitrary service URLs or coverage identifiers.
  • Added MapLibre image overlays, legends and current-state selection for all five products. Raster cell values are presented as hectares, an explicitly estimated population total/density or source scores, never as object counts.
  • Grounded local Ollama answers in the persisted thematic measurements and retained unsupported-current-count, live-timetable and causal limitations.
  • Added the official DOV digital soil map as an explicit Mol operator. It paginates all bounded bodemkaart:bodemtypes features, stores checksummed raw evidence, clips exactly in Lambert 72 and imports through DatasetService.
  • Added a Soil map theme with mapped hectares and inspectable soil type, texture and drainage fields. The 1949-1971 survey period and 1:20,000 scale remain visible; current drainage is never inferred.
  • Added focused acquisition, GIS, analysis, API, AI-context, operator, packaging and frontend-contract tests. No migration or direct database write was introduced.

Sprint 212 Platform-wide official source portfolio (2026-07-16)

  • Rebalanced the source strategy across six user-facing domains: space and buildings, nature and agriculture, soil and relief, mobility and accessibility, population and services, and climate and living environment.
  • Added a central frontend source portfolio with official catalogue links, measurable outcomes, priorities and dataset matchers. A source is labelled operational only when a matching ready Dataset really exists.
  • Simplified the Sources inventory to six compact domain cards. Theme/time detail, active-source limitations and the complete candidate list now use progressive disclosure instead of competing for attention.
  • Stacked the source heading, explanation and operational-status badge on narrow viewports so the introduction remains readable on mobile.
  • Expanded the Datavindplaats roadmap beyond hydrology with land use, space occupation, soil, population, services, accessibility, business parks, mobility hubs, cycle highways, heat and air quality.
  • Recommended a governed allowlisted Mercator thematic-raster registry as the next implementation wave so one safe acquisition path unlocks several platform domains without arbitrary provider URLs or schema changes.

Sprint 211 Regional VMM flood-hazard provisioning support (2026-07-16)

  • Added provision_regional_flood_hazards.py, an explicit operator for the approved 28-municipality Kempen scope that provisions official VMM flood-depth scenarios per municipality Area through the existing canonical flood-hazard API.
  • Kept persistence inside the existing Dataset/DatasetVersion/Job raster flow; no direct PostGIS writes, no browser-side provider fetches, no startup fetches and no new schema/API contract were introduced.
  • Added dry-run, member/product subset, resume/reuse and failure-reporting controls so operators can validate Mol or selected municipalities before the full 336 municipality/scenario matrix.
  • Updated Unraid packaging, readiness checks, tests and docs. The semantic limitation remains explicit: VMM water depth is modeled scenario depth, not permanent water volume, current water level or bathymetry.
  • Fixed live operator pagination to respect the canonical Area list limit and verified the redeployed Tower runtime with a Mol pluviaal_current_t100 reuse/acquisition smoke.
  • Added a Datavindplaats source roadmap for the next governed public Vlaamse datasets: VHA waterlopen, afstromingskaart, bodem/erosion, ruimtebeslag/open ruimte, morphology and accessibility/service-score layers.

Sprint 210 Regional BWK/Natura 2000 expansion (2026-07-16)

  • Added an explicit 28-municipality operator for the official INBO BWK/Natura 2000 state-2025 WFS, reusing the governed Mol normalization and metrics.
  • Added exact EPSG:31370 municipality clipping, partition-unique source ids, deterministic gzip source evidence, checksum-bound cache reuse and one canonical regional Dataset upload.
  • Made map dataset selection prefer an exact Area snapshot over a broader compatible layer and changed the source inventory to report overlapping area snapshots without summing duplicate coverage.
  • Added a matching ORM/Alembic municipality expression index for fast regional fallback selection; live Mol and Geel reads now complete in 0.989 and 0.529 seconds respectively.
  • Provisioned the live 28-municipality Dataset with 72,933 valid EPSG:4326 features from 147 retained source responses. Idempotency, checksums and the single DatasetVersion were verified against PostGIS.
  • Live map results now expose 138,701.35 ha BWK-mapped surface, 6,580.43 ha Natura 2000 habitat and the governed BWK value classes across the Kempen; Mol continues to use its exact 4,668-feature snapshot.
  • Added focused GIS, persistence-contract, packaging and UI regression tests. No API contract, AI model or product scope changed.

Sprint 209 Regional historical land-use expansion (2026-07-15)

  • Added an explicit operator for the official 1778, 1873 and 1969 historical building, water and road land-use classes across all 28 approved Kempen transport-region municipalities.
  • Avoided the official WFS 10,000-result regional cap through resumable VRBG municipality partitions, exact raw-response gzip retention and SHA256 source/output manifests.
  • Added exact municipality clipping, partition-unique evidence ids, bounded feature limits and one canonical regional Dataset upload per theme/year.
  • Extended the regional time-series coordinator and release packaging without changing API contracts, database migrations or frontend architecture.
  • Provisioned all nine snapshots on live Tower/PostGIS: 207,717 persisted polygon features across three complete 28-municipality temporal series. Every Dataset is ready, has one immutable DatasetVersion and was reused by the idempotency run without duplicate persistence.
  • Added the exact-area fast path for these already-clipped regional artifacts, reducing complete-Kempen comparisons from minutes to 0.9-4.1 seconds in the live audit while preserving the calculated values.
  • Suppressed inapplicable generic line metrics for historical polygon classes; results now show governed hectares plus object counts, never artificial 0 km road/watercourse measurements.
  • Kept the top workbench source context synchronized with the selected Evolution series. Browser verification covered complete Kempen, Mol and a 3440 x 1440 viewport with no console warnings or errors.

Sprint 208 Governed VMM flood-hazard scenarios (2026-07-15)

  • Audited official water-depth and bathymetry sources and found no public, municipality-wide inland bathymetry suitable for permanent Mol waterbody volume; coastal and North Sea products are outside scope.
  • Added a fixed twelve-product VMM OGRK WCS registry for fluvial/pluvial, current climate/climate projection 2050 and T10/T100/T1000 depth scenarios.
  • Added bounded tiled WCS 1.1 acquisition, multipart GeoTIFF extraction, exact Area clipping, centimetre-to-metre normalization and immutable provenance through existing Dataset, DatasetVersion and Job persistence.
  • Aligned WCS tiles to the observed VMM 4.88 MB generated-coverage limit by using provider-safe 5 km requests and retaining readable XML exception text.
  • Added raster selection metrics for mapped inundated hectares/share, mean/P90/maximum local modeled depth and a strictly named maximum-depth area integral; permanent and concurrent water volume remain unsupported.
  • Added a separate Overstroming map theme, scenario selector, transparent MapLibre overlay, source inventory and source-grounded Ollama context.
  • Added the full-Mol operator, Unraid/runtime settings, focused GIS/API/UI/AI tests and documentation without a migration or new dependency.
  • Provisioned all twelve official scenarios on live Tower/PostGIS. Each ready Mol Dataset has one immutable DatasetVersion; a second operator run reused all twelve without duplicate persistence.
  • Browser validation confirmed the twelve-option scenario selector, raster overlay, exact full-Mol metrics, no console errors or horizontal overflow at 1280 px and 3440 px, and strict separation between surface water and flood hazard themes.

Sprint 207 Governed DHMV II terrain foundation (2026-07-15)

  • Added a fixed official Digitaal Vlaanderen DHMV II DTM/DSM WCS registry, rate-limited 10 km multipart GeoTIFF acquisition, georeferenced mosaicking and exact persisted-Area clipping.
  • Validates and retains native 1 m product identity, 5 m analysis resolution, EPSG:31370, Float32 nodata, TAW, acquisition period and source/output checksums through ordinary Dataset, DatasetVersion and Job persistence.
  • Added exact raster-selection metrics for mean/min/max/P10/P90 height, relief and slope, with explicit valid-cell coverage and computation methods.
  • Added a Mol operator and a Hoogte & reliëf map theme with colour-relief MapLibre overlay over the existing OpenStreetMap context.
  • Explicitly keeps drainage as a future derived analysis and prohibits presenting DHMV terrain/surface height as water depth or volume.
  • Added runtime/Unraid configuration and focused acquisition, GIS formula, persistence, API, frontend and packaging tests without a migration.
  • Live Mol DTM/DSM provisioning now persists 4,581,867 valid 5 m cells per product with complete Area coverage and immutable cache reuse. Browser validation confirmed the MapLibre relief overlay and full-Area metrics.
  • Scoped the orthophoto building-recognition prompt to the building theme so terrain results remain focused on elevation, relief and slope.

Sprint 206 Governed Buildings and Addresses Register snapshot (2026-07-15)

  • Added an explicit operator for the current official Digitaal Vlaanderen building, building-unit and address OGC collections with complete pagination, safety limits, retries and retained raw SHA256 evidence.
  • Hardened completeness against the production address service's omitted next link by continuing full pages with an explicit startIndex until a short terminal page is observed.
  • Added exact EPSG:31370 Area clipping, EPSG:4326 building persistence and classified reconciliation against checksummed persisted GRB partitions.
  • Persisted only building lifecycle data and aggregate unit/address counts; full addresses, street names and house/box numbers remain outside queryable output, and ambiguous address/GRB relations are never forced.
  • Added exact footprint, lifecycle, unit, address-status and confirmed-GRB selection metrics, including correct filtered feature_count execution.
  • Made the Map workspace prefer the richer Mol register snapshot only for the matching Mol Area and retain regional GRB coverage everywhere else.
  • Added source-inventory presentation, runtime packaging and focused operator, privacy, reconciliation, metric and UI tests.
  • Live Mol validation retained 43,945 exact building polygons, 30,382 units and 21,388 unambiguous address relations. It found a 98.45% realized-building GRB match rate, zero invalid geometries and zero prohibited address fields.

Sprint 205 Governed agricultural-use parcel history (2026-07-15)

  • Added an explicit ALZ operator for the definitive 2008-2025 annual agricultural-use parcel archives, with a fixed source allowlist, streamed size limit, ZIP safety checks and EPSG:31370 schema validation.
  • Retained official archives, annual crop-code lists and checksum manifests; exact scope clipping produces ordinary Dataset/vector_feature persistence only through the existing upload service.
  • Added a separate Agriculture map theme with exact declared-use hectares and server-owned official main-crop-group hectare metrics.
  • Added a scope-specific 18-edition temporal series while explicitly disabling parcel-level lineage and excluding the provisional current campaign.
  • Added focused source, clipping, metric, pagination, packaging and UI tests.
  • Added compatibility for the official comma-separated grain and horticulture group labels after live source validation exposed their exact wording.
  • Replaced internal agriculture/BWK/Waterinfo source identifiers with concise authority labels in the shared end-user dataset display path.

Sprint 204 Governed BWK and Natura 2000 for Mol (2026-07-15)

  • Added an explicit operator for the official INBO BWK/Natura 2000 state 2025 WFS with complete link/start-index pagination, retained raw page checksums and exact Mol clipping in EPSG:31370.
  • Preserved original BWK evaluation, mapping-unit, origin, habitat, percentage and habitat-origin fields while adding readable, source-faithful properties.
  • Added filtered PostGIS selection metrics for each official BWK value class, Natura 2000 habitat shares, regional biotopes and uncertain habitat gaps.
  • Added Nature Value as a seventh map theme and moved BWK/Natura 2000 from the follow-up catalogue to loaded evidence only after a real Dataset exists.
  • Kept the 2025 edition honest: it is a map state rather than one uniform 2025 survey, and PHAB-based partial-selection hectares remain labelled estimates.

Sprint 203 Governed hydrology and historical imagery (2026-07-15)

  • Added an explicit Waterinfo KiWIS operator for annual water-level and discharge station histories. It filters against the persisted Area, retains raw JSON/checksums and imports each real station/year through DatasetService.
  • Added numeric mean selection aggregation for station measurements while keeping every station in an independent temporal series with an explicit point-versus-area/volume limitation.
  • Added a fixed official orthophoto product registry covering current, annual 2012-2025, older winter periods, RGB 1979-1990 and panchromatic 1971.
  • Added historical raster temporal provenance, a constrained browser PNG endpoint and a MapLibre image overlay/product selector.
  • Kept configured-YOLO/current-GRB QA exclusive to the most-recent product; historical imagery never produces fake current-state quality metrics.
  • Converted BWK/Natura 2000, agricultural parcels, Buildings Register, DHMV and bathymetry into an ordered acceptance-criteria backlog.
  • Made the frontend dataset client exhaust canonical 200-row pages. Real Waterinfo persistence pushed the regional project beyond the old 50-row default and exposed that older sources otherwise disappeared from the UI.
  • Restored the source inventory as a full-width, naturally flowing overview band after the premium desktop grid rules had compressed it into a narrow, internally scrolling column.

Sprint 202 Source intelligence, full evolution metrics and local assistant (2026-07-15)

  • Extended temporal comparisons with exact persisted-Area filtering, every compatible semantic metric and a complete observation timeline.
  • Expanded the official 2013-2025 land-use operator to derive water, built functions and transport surface alongside forest from one retained 10 m source raster per year.
  • Added a source inventory that distinguishes loaded datasets from official follow-up sources such as historical orthophotos, BWK, agricultural parcels, the Buildings Register, DHMV and Waterinfo.
  • Added a source-grounded local GIS assistant through Ollama. The backend lists only installed models, supplies persisted GeoIntel metrics as context and refuses to infer unavailable values such as water volume.
  • Added editable Unraid environment/template settings and a Docker host-gateway mapping for the Ollama service running on the server.
  • Added an explicit 16,384-token Ollama context window and reject truncated done_reason=length responses instead of showing an incomplete answer.
  • Tightened generated answers to descriptive source evidence: estimates must remain labelled, unsupported causal/forecast claims are forbidden and plain text is requested for the existing chat renderer.
  • Added deterministic estimate disclosure for population answers and instructed the local model to copy governed values literally instead of inventing averages, rates or derived trends.
  • Clarified the source inventory so current GRB layers are shown as a different methodology beside, rather than as part of, the comparable 2013-2025 land-use time series.

Sprint 201 Semantic area-selection metrics (2026-07-15)

  • Replaced count-only primary results for known regional themes with meaningful PostGIS measurements: building footprint, forest, water and parcel area in hectares; road and watercourse length in kilometres; and population in inhabitants.
  • Kept intersecting feature counts as supporting evidence and added an additive metric list without removing the existing primary summary fields.
  • Added explicit source limitations: building footprint is not floor area or volume, road length is not traffic capacity and water volume is unavailable without reliable depth or bathymetry.
  • Updated future regional GRB provisioning metadata so new imports persist the semantic primary aggregation directly.

Sprint 200 Operational time-series handoff (2026-07-15)

  • Removed the dead-end Evolution state that appeared when the current building theme had only one regional snapshot while real historical series existed.
  • Evolution now opens the first available persisted series automatically and loads its latest snapshot on the map.
  • Theme cards distinguish genuine multi-snapshot series from current-only sources, including observation counts and year ranges.
  • Confirmed the deployed PostGIS temporal path with a real Statbel 2021-2025 comparison; no synthetic values or parallel frontend calculations were added.

Sprint 199 Reviewed accuracy expansion (2026-07-15)

  • Added six leakage-free training AOIs in Arendonk, Dessel, Meerhout, Laakdal, Nijlen and Hulshout, backed by 9,964 paged GRB building references.
  • Exported and audited a 252-tile, 79,192-label corpus; the configured audit and balanced 64-tile visual review found no invalid, missing or low-variance selections.
  • Fine-tuned one inactive local YOLOv8s challenger for 20 CPU epochs without downloads. Its best checkpoint SHA256 is 038f1f97a6afd534f29e1f392a730a58207b928ca01e31ab8d8fed6106705820.
  • Re-ran active and challenger models through the same current persisted QA/QC pipeline on four Mol and three regional holdouts. The challenger improved mean F1 from 0.6069 to 0.6248 and improved every zone.
  • Retained the active model because the challenger produced two detections in empty Postel-bos; the active profile remained zero across all three empty controls. No runtime model or .env setting was changed.
  • Replaced stale Detection Lab profile averages with coverage-aligned active evidence: precision 0.6141, recall 0.6062, F1 0.6069.

Sprint 198 Evidence-closed model review (2026-07-15)

  • Completed visual and geometric review of 48 persisted false-positive and 48 false-negative cards from Geel, Herentals and Turnhout. Only 5 FP and 10 FN records were confirmed model errors; 59 records were QA alignment effects and 22 were reference, imagery or uncertainty cases excluded from training.
  • Added a symmetric fail-closed false-negative decision validator and readiness compilation gate. It exports only explicit confirmed misses and rejects incomplete, mismatched or invalid decision sets.
  • Packaged the validator in the all-in-one Unraid image and covered that runtime file contract with the existing Docker configuration regression.
  • Audited the confirmed evidence against the active tile corpus and holdouts. Geel/Herentals evidence already belongs to the training source and Turnhout remains excluded, leaving zero novel leakage-free labels. No model was trained, downloaded, activated or reconfigured.
  • Clarified map quality output with strict match counts and the existing diagnostic reference-envelope match, without changing canonical QA metrics.
  • Live Mol proof measured 282 candidates, 209 strict matches, precision 74.1%, recall 68.5% and F1 71.2%; 212 diagnostic envelope matches made the remaining three possible box/footprint differences explicit.

Sprint 197 Measured detection accuracy and durable review (2026-07-15)

  • Re-ran the active local building model at confidence thresholds 0.10 and 0.15 over independent Mol holdouts in Achterbos, Gompel, Donk and Postel, plus the pure-empty Postel forest control. Threshold 0.15 retained the best F1 in every positive zone and both thresholds produced zero forest-control detections, so no speculative threshold or model promotion was made.
  • Aligned the map-driven building QA flow with the documented operational footprint match IoU 0.25. The map now reports candidate count, matches, precision, recall, F1, false positives and false negatives instead of presenting every model box as a recognized building.
  • Added first-class detection_reviews persistence and canonical project QA endpoints for paginated false-positive/false-negative review decisions.
  • Added a focused frontend review queue with role/status filters, notes, pagination and map handoff. Unreviewed or alignment-mismatch evidence cannot silently become hard-negative training data.
  • Bounded QA evidence resolution to the persisted evidence identifiers instead of loading complete regional reference datasets into application memory.
  • Added regression coverage for migration alignment, decision validation, API envelopes, bounded evidence access and the map QA threshold.
  • Passed the complete readiness gate with 592 backend tests, 88 documented API routes, one Alembic head and a green frontend typecheck/production build.
  • Live browser validation caught and fixed cramped map-result metric cells; quality values now use a readable two-column layout and the map legend calls unverified model output AI-kandidaten.

Sprint 196 Map-driven official orthophoto analysis (2026-07-15)

  • Added an explicit bounded endpoint for the official Digitaal Vlaanderen most-recent winter orthophoto WMS, with EPSG:31370 georeferencing, 128-1,024 metre side limits, response guards, exact-request reuse and complete Dataset/DatasetVersion provenance through DatasetService.
  • Connected a drawn map rectangle to one building-analysis action: official raster acquisition, canonical tiling, active local YOLO inference, persisted detections, existing GRB QA and MapLibre output.
  • Kept all fetches user-triggered and backend-only. No startup fetch, browser-side WMS call, model download, direct persistence write or fabricated detection/QA value was introduced.
  • Added Docker/Unraid controls and focused service, CRS, persistence, safety-bound and canonical-envelope regressions.
  • Scoped the acquisition guard to the approved Kempen regional boundary while retaining the selected municipality as a map filter, and translated known acquisition/model failures into concise Dutch operator feedback.
  • Proved the complete flow live on Tower: one 244 x 207 orthophoto request, one immutable DatasetVersion, one configured-YOLO run with 78 persisted detections and one persisted six-metric GRB quality check. At IoU 0.50 the run measured precision 0.5641, recall 0.3761, F1 0.4513 and mean IoU 0.6622.

Sprint 195 Guided raster-to-detection workflow (2026-07-14)

  • Replaced the Detection Lab's manual manifest-path prerequisite with one guided action that creates canonical 512 px raster tiles with 64 px overlap, reuses an existing manifest, validates raster size and the local YOLO runtime, runs persisted detection and loads the persisted GeoJSON result on the existing MapLibre map.
  • Added direct, explicit georeferenced GeoTIFF upload in Detection Lab through the existing dataset upload boundary; no browser-side provider fetch, model download or alternate persistence path was introduced.
  • Kept manual manifest execution, model assets, preflight and calibration available under technical/management disclosures while making persisted detection QA a primary user step.
  • Added clear preparation progress, understandable Dutch QA diagnostics, result-to-map navigation and focused regression coverage.
  • Did not change API contracts, database migrations, model dependencies or backend inference behavior.
  • Live Mol validation persisted 1,953 configured-YOLO detections from nine georeferenced tiles and exposed a regional QA scaling defect before release.
  • Detection QA now applies the persisted tile coverage through the existing GiST-indexed PostGIS geometry column before loading reference rows, while retaining the complete reference population in audit counts.
  • The unchanged exact IoU matcher now uses a Shapely spatial index to avoid testing geometries whose envelopes cannot intersect.
  • Clarified the primary map source and legend whenever an AI result is active so detections are never presented as the underlying official GRB source.
  • Made the fixed workbench context bar follow the active AI layer and exposed the IoU match threshold beside every detection-QA score.

Sprint 194 Regional official time-series synchronization (2026-07-14)

  • Generalized the proven Statbel population operator from a hardcoded Mol import to an approved geographic scope while keeping Mol as the backwards-compatible default.
  • Added one explicit regional synchronization command for official 2021-2025 population and 2013-2025 modern forest snapshots.
  • Added resumable municipality-partitioned WCS retrieval and native-resolution raster mosaicking after the upstream service rejected the complete regional response at its documented size limit.
  • Kept every fetch operator-triggered, idempotent and behind the canonical DatasetService upload path; no startup fetch, migration or API contract change was introduced.
  • Preserved separate Mol/regional series keys and honest partial-sector population and 10 m forest-area limitations.
  • Replaced internal provider identifiers with readable source labels in the primary map.
  • Added a provenance-gated full-Area query path for official pre-clipped datasets, avoiding redundant intersection of every feature against the same detailed municipal/regional boundary while preserving exact rectangle selection behavior.
  • Reduced a live complete-Kempen population/forest analysis from roughly 92 seconds to 2.8 seconds of API work while retaining the exact official totals.
  • Grouped dated population and forest snapshots into one current source plus an optional historical disclosure, translated remaining user-facing status/download/model-evaluation text and made municipality selection explicitly optional.
  • Replaced the last primary-map features/PostGIS delivery message with a plain Dutch zoom instruction and user-facing object counts.
  • Added focused scope filtering, command construction, boundary resolution, multi-NIS provenance, full-Area correctness, temporal-language and frontend-label tests; the full readiness gate now passes with 571 tests.

Sprint 193 End-user regional workbench simplification (2026-07-14)

  • Made the complete Kempen Regional Workbench the automatic fresh-session data context and removed the redundant region selector from the primary map.
  • Kept all available regional datasets loaded while treating Mol, the other 27 municipalities and the complete region as spatial work-area filters.
  • Replaced technical dataset names with theme/source labels and moved benchmark projects, raw source metadata, provider internals, QA evidence and model diagnostics behind advanced disclosures.
  • Defaulted Detection Lab to the configured local YOLO asset, active local model profile and measured operating threshold; model quality remains explicitly review-required rather than presented as production-perfect.
  • Simplified Quality, Downloads, Status and Beheer around end-user tasks without changing API contracts, migrations, persistence or inference behavior.
  • Followed the live browser audit by moving the legacy Mol-only workspace under advanced management, adding friendly regional-boundary dataset names, translating the active model profiles and replacing the empty waiting quality status with end-user language.
  • Completed the visible-language sweep for the details control, export preview and provider layer names.

Sprint 192 Regional map state correctness (2026-07-14)

  • Fixed the map-first work-area selector so changing from the complete Kempen region to a municipality clears the old bbox, theme totals and result geometry before switching Areas.
  • Invalidated outstanding single-theme and multi-theme selection requests on reset, preventing a slow previous-area response from restoring stale results after a scope change.
  • Replaced the hardcoded viewport instruction for buildings with the active dataset's reference layer name.
  • Added focused state/race/status regressions and passed the complete 556-test release gate plus frontend typecheck/build.
  • Deployed commit 7997a72 and verified the exact Kempen-to-Mol switch, a fresh 33,038-parcel Mol result, a 525-feature PostGIS detail viewport, clean browser logs and no horizontal overflow at 1280x720 or 3440x1440.

Sprint 191 Regional Kempen GRB context foundation (2026-07-14)

  • Added one explicit regional operator for current GRB roads, water and parcels, with independent resumable municipality partitions and one normal PostGIS dataset per theme.
  • Preserved official source geometry dimensions across Wegsegment, WTZ, WLAS, WGR and ADP; collection-qualified source IDs prevent collisions inside the combined water layer.
  • Assigned cross-boundary polygons by maximum overlap area and lines by maximum overlap length, with deterministic NIS-code tie breaking and clipping only to the complete approved region.
  • Reused DatasetService, VectorFeatureService, immutable dataset versions, exact selection aggregation and existing Area/bbox APIs; no API contract, migration or direct vector-feature write was added.
  • Added truncation guards, atomic manifests, checksum reuse, duplicate rejection, Docker packaging, readiness compilation and focused geometry/persistence tests.
  • Documented source semantics honestly: road objects are not traffic data, heterogeneous water objects are not volume metrics and ADP is not a legal cadastral survey.
  • Kept all source access operator-only; the browser, startup path and public not_configured GRB provider perform no external fetch.
  • Provisioned the live Tower snapshot: 84,504 roads, 88,332 water objects and 415,288 parcels across 28 complete partitions per theme; immediate repeat runs reused all artifacts and datasets.
  • Verified exact manifest/PostGIS/distinct-ID parity, valid non-empty EPSG:4326 geometries, one immutable DatasetVersion per snapshot and canonical full-region/Mol Area selection responses.

Sprint 190 Regional Kempen GRB buildings (2026-07-14)

  • Added an explicit regional GRB building operator that fetches the approved Kempen scope in 28 resumable municipality partitions and follows every OGC API pagination link.
  • Assigned boundary-crossing GRB features to exactly one partition using maximum municipality intersection, with deterministic NIS-code tie breaking and one retained source identity.
  • Added a covered-by-member fast path so ordinary interior buildings avoid the regional boundary-owner scan while true border cases retain the exact overlap rule.
  • Added streaming artifact copy and batch-wise partition indexing through DatasetService and VectorFeatureService, avoiding one giant multipart parse while preserving one normal regional dataset for existing map and PostGIS selection flows.
  • Added truncation guards, source/checksum manifests, immutable observation dates, duplicate-source rejection and focused service/operator tests.
  • Kept the provider endpoint contract unchanged and retained explicit operator-only fetching; no source request runs during application startup or interactive map use.
  • Provisioned the live 2026-07-14 regional snapshot on Tower: 466,078 unique GRB buildings from 879 source pages, 28 retained municipality partitions and one 478,143,249-byte managed artifact with reference_truncated=false.
  • Added optional persisted-Area filtering to the existing vector-selection contract so a full municipality or regional work area uses its exact PostGIS polygon instead of counting surrounding bbox corners.
  • Verified exact live selections of 36,941 buildings for Mol and 466,078 for the complete transport region, plus an interactive rectangle query and a 730-feature detail viewport with no browser errors or horizontal overflow.

Sprint 189 Official Kempen operational scope (2026-07-14)

  • Defined Kempen operationally as the official 28-municipality Vlaamse vervoerregio, with an explicit warning that this policy boundary is not the wider cultural or landscape Kempen.
  • Added a central operator scope registry with current municipality names and NIS codes, including Mol 13025 and Nijlen 12026.
  • Added an explicit, idempotent VRBG scope provisioner that creates one regional boundary, 28 member boundaries, one regional Area, 28 municipality Areas and canonical source datasets through the existing API.
  • Added a compact Mol/Kempen region selector to the map-first explorer and made its heading and full-area action scope-neutral.
  • Made region switches clear all project-bound state, ignore stale project-data responses and prefer the regional boundary/AOI, preventing Mol context from leaking into the Kempen workbench.
  • Kept thematic regional ingestion separate from the boundary pass so large GRB/WCS sources can be partitioned and validated without hidden startup fetches or truncated datasets.
  • Provisioned and verified the complete boundary foundation on Tower: 29 Areas, two canonical VRBG datasets, idempotent reruns, correct Mol/Kempen switching and a clean 1280/3440 px browser audit.

Sprint 188 Official modern Mol land-use series (2026-07-14)

  • Added an explicit, reusable MercatorNet WCS operator for official Departement Omgeving land-use snapshots in 2013, 2016, 2019, 2022 and 2025.
  • Validated categorical integer GeoTIFF input at 10 m in EPSG:31370, retained raw rasters/checksums/manifests and polygonized only documented class 12 (Bos).
  • Imported forest polygons through the existing DatasetService/VectorFeatureService path with canonical EPSG:4326 geometry and hectare intersection metrics; no startup fetch or direct PostGIS write was added.
  • Kept the modern 2013-2025 series separate from historical 1778/1873/1969 cartography and added a compact temporal-series selector when both are available.
  • Made the map-first forest theme prefer the authoritative modern source and its latest 2025 snapshot while preserving historical access.
  • Added focused raster, CRS, class, provenance, packaging and frontend contract tests plus readiness compilation coverage.
  • Provisioned all five snapshots in the live Tower/PostGIS workspace and verified idempotent reruns, canonical provenance and full-Mol temporal selection.
  • Aligned MapLibre layer and legend colors with the selected data theme and let the primary geographic explorer use the full available ultrawide width.

Sprint 187 Temporal Mol explorer (2026-07-14)

  • Added first-class temporal dataset metadata and immutable dataset-version provenance for uploaded and derived vector/raster datasets.
  • Added project temporal-series discovery and bounded snapshot comparison APIs with explicit observation dates, metric deltas, warnings and optional stable-identity object changes.
  • Extended bbox selection with source-governed PostGIS aggregations so population is reported as inhabitants and land cover as intersected hectares instead of misleading feature counts.
  • Added a calm Latest state/Evolution flow to the map-first explorer, including period selection, metric comparison and added/removed/modified overlays where source identities support them.
  • Added explicit operator provisioners for official Statbel Mol population snapshots (2021-2025) and Digitaal Vlaanderen historical land-use snapshots (1778, 1873 and 1969); no source is fetched during application startup.
  • Preserved methodological honesty: partial statistical sectors are labelled area-weighted estimates, historical land-use identity changes are not fabricated and all source URLs, versions and processing limitations are persisted.
  • Serialized Tower startup and migration-smoke validation by waiting for container health, preventing concurrent Alembic upgrades from racing on the same PostGIS schema.
  • Normalized valid source Z coordinates to the canonical 2D PostGIS vector store while retaining the original uploaded GeoJSON and reporting the source Z-feature count in metadata.
  • Made vector dataset, version and feature persistence one transaction, with file cleanup on rollback, so an indexing error cannot leave a ready dataset without persisted features.
  • Hardened MapLibre resizing and responsive fit behavior so the Mol boundary and road basemap fill the complete GIS stage on standard and 3440x1440 ultrawide viewports.
  • Completed live browser validation of full-municipality, rectangle and temporal population flows against the deployed Tower/PostGIS runtime with no console errors.

Sprint 186 Map-first Mol geographic explorer (2026-07-14)

  • Replaced the default dashboard entry with a calm map-first workflow: choose a real data theme, drag a rectangle, query PostGIS automatically and review results.
  • Kept the previous technical map, QA, export and AI controls available behind the advanced workbench instead of mixing them into the primary path.
  • Added explicit source availability for buildings, population, forest, water, roads and parcels; unavailable themes never receive simulated values.
  • Added true drag-to-select behavior in MapLibre and exact total intersection counts alongside the bounded 1,000-feature map preview.
  • Made the official full Mol municipality area and the largest authoritative building layer the initial map context.
  • Added an idempotent operator provisioner for official Mol GRB roads, water and parcels through the existing API/DatasetService/PostGIS persistence flow.
  • Prevented stale asynchronous dataset-detail responses from replacing the latest selected map layer and its visible context.
  • Kept GeoJSON download/copy actions attached to the active theme result when switching themes after a rectangle analysis.

Sprint 185 Coverage-aware Mol operational benchmark (2026-07-14)

  • Extended real detection quality-matrix evidence with persisted inference coverage, raw/evaluated/excluded/clipped populations and diagnostic-only box-to-footprint mismatch counts.
  • Preserved municipality, operational-zone, split and source-reference metadata in combined multi-sample summaries.
  • Added a fail-closed Mol benchmark report that groups exact model/tile/overlap/threshold candidates and gates four independent positive holdouts plus a pure-empty background control.
  • Kept canonical footprint-IoU metrics authoritative and made model-quality rejection a reported evidence outcome rather than a hidden runner failure or automatic model mutation.
  • Added readiness, all-in-one image and focused pass/reject regression coverage without changing APIs, migrations, inference behavior or dependencies.
  • Executed the active small-building model over Achterbos, Gompel, Donk and Postel plus the Postel-bos pure-empty control: mean F1 0.5975, minimum zone F1 0.4749, micro F1 0.6338 and zero background detections.
  • Accepted the active candidate for bounded operator use after evaluating 3,624 of 3,829 raw references; kept 205 outside-coverage references and 101 box-to-footprint diagnostic matches explicit rather than inflating canonical metrics.
  • Exported 7,078 persisted evidence features, audited 1,381 false negatives and 1,211 false positives, and rendered 96 balanced review cards across all four zones with no missing source tiles.

Sprint 184 Detection QA coverage and matching diagnostics (2026-07-14)

  • Clipped configured-YOLO candidate and reference QA populations to the union of the exact persisted inference tile footprints before canonical IoU matching.
  • Added fail-closed validation for missing, invalid or cross-dataset tile-manifest provenance while retaining the existing unbounded behavior for explicit fixture and legacy runs without a manifest.
  • Kept precision, recall, F1 and mean IoU strictly based on candidate polygons versus persisted reference footprints; added a separately labelled reference-envelope comparison as diagnostic evidence only.
  • Persisted raw/evaluated/excluded/clipped population counts and diagnostic matching evidence in the existing quality_checks.findings_json structure without changing migrations or canonical metric rows.
  • Surfaced inference coverage and box-to-footprint diagnostics in Detection Lab and hardened the real-data workflow assertions, documentation and regression coverage.
  • Live Tower/PostGIS validation on the persisted Mol-center run evaluated 304 of 374 GRB references, excluded 70 outside the inference tile, persisted six canonical Metric rows and exposed 14 possible box-to-footprint artifacts without inflating the strict scores.
  • Updated the API contract audit to use the canonical OpenAPI path map after FastAPI 0.139 introduced grouped top-level routers; this keeps all 81 operations audited across clean framework installations.
  • Kept Starlette on its supported pre-1.0 compatibility line until GeoIntel deliberately migrates its test client from httpx to httpx2; this removes the new framework deprecation warning without taking an unrelated test-stack upgrade.
  • Upgraded the build-only frontend toolchain to Vite 7.3.6 and React plugin 5.2, declared the Node 20.19+/22.12+ engine contract and reduced npm audit from one high plus one moderate finding to zero without changing React, MapLibre or runtime behavior.

Sprint 183 Mol map source clarity and live AI validation (2026-07-14)

  • Added an explicit Database/Analysis result map-content mode so an automatically loaded detection result can no longer mask a newly selected persisted municipality layer.
  • Kept the Map workspace database-first and made dataset selection switch back to the selected PostGIS layer without discarding available detection, segmentation or change-analysis results.
  • Restored the premium UI's viewport status row so visible/total feature counts and the 1,000-feature truncation warning remain readable.
  • Rebuilt and deployed the all-in-one Tower runtime, then passed PostGIS 3.6 connectivity, schema/index, single-head migration, frontend proxy and browser runtime checks.
  • Ran the bounded Mol-center raster -> tiles -> configured YOLO -> persisted Detection -> GRB QA -> export chain against the live runtime: 36 detections, 17 matches, precision 0.4722, recall 0.0455, F1 0.0829 and mean IoU 0.5958. These honest metrics confirm the workflow while keeping the current model below production-quality acceptance.

Sprint 182 Municipality viewport delivery and bounded AI handoff (2026-07-14)

  • Replaced full-file loading for vector datasets above 5,000 features with debounced, zoom-aware requests to the existing persisted PostGIS bbox-selection endpoint.
  • Kept each viewport response bounded to the canonical 1,000-feature maximum and made zoom-required, loading, visible/total, truncation and error states explicit in the Map workspace.
  • Prevented viewport responses from repeatedly fitting the map back to their own bounds while preserving AOI framing and existing behavior for small vectors, detection/segmentation results, selections and QA evidence.
  • Hardened the real raster/detection/QA operator smoke so it can reuse a validated existing project, attach both uploads to a persisted analysis Area and apply safe distinct upload filenames.
  • Added focused contract and frontend-wiring regression coverage. No migration, model dependency, provider fetch behavior or persistence schema changed.

Sprint 181 Complete Mol municipality workspace (2026-07-14)

  • Added an explicit operator provisioner for the official Digitaal Vlaanderen Mol municipality boundary (NIS 13025) and the complete GRB GBG building population clipped to that boundary.
  • Added auditable source artifacts and a manifest with page count, checksums, exact WGS84 bounds, municipality area, feature totals and truncation state; incomplete pagination now fails closed.
  • Declared EPSG:4326 explicitly in both official GeoJSON artifacts so downstream QA does not downgrade known OGC provenance to an inferred CRS.
  • Added bounded exponential retries for safe official-source GET requests after a live transient GRB page failure; upload POST requests are never retried automatically.
  • Provisioning remains explicit and imports Project, Area and Dataset records through existing canonical API routes and DatasetService/VectorFeatureService persistence rather than writing directly to PostGIS.
  • Made the complete Mol Municipality Workbench the preferred fresh-session context and the official municipality boundary its lightweight default layer, ahead of historical Postel validation projects.
  • Replaced large coordinate arrays and spread-based bounds calculations with streaming, memoized GeoJSON bounds so municipality-scale vector layers remain safe in MapLibre.
  • Removed per-feature ORM refreshes after vector import while retaining one flush and commit, avoiding tens of thousands of redundant queries for full-municipality datasets.
  • Added focused municipality clipping, truncation, persistence-scaling, runtime wiring and frontend-priority regression coverage. No migration or API contract changed.

Sprint 180 Premium workbench UX hardening (2026-07-14)

  • Rebuilt the workbench presentation hierarchy around grouped task navigation, a compact Mol context header and an optional selection-detail drawer instead of a permanent third column.
  • Fixed the narrow-screen shell so navigation is horizontal and the active workspace receives the full viewport width; desktop and ultrawide content now use stable, centered work areas.
  • Reworked Overview into one operational status band, one workflow rail and compact quick actions without changing readiness calculations or routing.
  • Made Data operational with three bounded project/AOI/dataset columns, scroll-safe populated catalogs and progressively disclosed create/upload forms.
  • Made Map controls and MapLibre the primary surface while collapsing provenance, BBox inputs and raw feature inspection into explicit detail disclosures.
  • Made AI Labs task-first by placing detection/segmentation run controls before model-registry diagnostics and collapsing registry/preflight detail.
  • Added focused UI regression coverage; no API contract, migration, persistence, GIS operation, QA metric, model dependency or inference behavior changed.

Sprint 179 Mol detection evidence diagnosis (2026-07-13)

  • Added a read-only, storage-confined false-negative contact-sheet renderer that projects persisted missed GRB geometries onto the exact source tile manifest recorded by the analysis run.
  • Added AOI/area-stratified review selection, nearby persisted candidate/reference overlays, explicit manual decision CSVs and separate GeoJSON evidence for references outside inference-tile coverage.
  • Added focused rendering, manifest-resolution, decision-default and path-confinement regression coverage plus all-in-one/readiness wiring.
  • Completed explicit Donk/Postel visual review: QA alignment dominated 37/48 false-positive and 27/48 false-negative samples; only 7 and 6 respectively were confirmed model errors.
  • Found 41 of 638 Donk/Postel false-negative evidence records outside all persisted inference tiles and kept coverage-adjusted recall as a diagnostic only; persisted QA metrics were not changed.
  • Recorded a NO-GO for immediate retraining. QA population clipping and box-to-footprint matching diagnostics are the required next pass.

Sprint 178 Mol multi-zone operational validation (2026-07-13)

  • Added documented Mol center, Achterbos, Gompel, Donk and Postel operator zones with municipality and operational-zone provenance.
  • Protected the four new positive zones as validation holdouts; they are not silently eligible for model training.
  • Hardened real-data quality workflows to persist manifest-backed EPSG:4326 Areas and Mol project regions alongside datasets and analysis evidence.
  • Added a single Mol operator runner that composes existing positive QA/QC and background detection-pressure workflows without fake metrics or model downloads.
  • Made the all-in-one runner's default evidence output persistent under /app/storage/operator-evidence and fixed manifest path handling in multi-sample aggregation.
  • Added all-in-one image/readiness wiring and focused regression coverage; APIs, migrations, model activation and frontend behavior remain unchanged.

Sprint 177 Mol-first operating context (2026-07-13)

  • Made Mol the explicit primary operating focus while retaining the broader Kempen as the validation and interoperability region.
  • Added one centralized frontend focus definition for the empty-map center, new-project region, default AOI and persisted project/dataset recognition.
  • Initial workbench selection now prefers real persisted Mol data without overriding an explicit current or newly created project selection.
  • Moved Mol to the front of default operator sample preparation and added AOI slugs to future detection quality-matrix project names.
  • Kept APIs, migrations, persistence, providers, AI dependencies and model behavior unchanged.

Sprint 176 Detection false-positive visual review gate (2026-07-13)

  • Enriched existing QA evidence GeoJSON with persisted detection and segmentation provenance without changing its endpoint or canonical envelope.
  • Added a read-only, storage-root-confined false-positive contact-sheet renderer with deterministic AOI/area/confidence stratification and persisted reference overlays.
  • Candidate-centred crops preserve non-square edge-tile aspect ratios and limit reference overlays to the local review context.
  • Added an explicit five-state operator review contract; incomplete reviews fail the completion gate and no decision is inferred.
  • Exported only manually confirmed model false-positives as possible review input, keeping reference gaps, QA alignment issues and uncertain cases separate.
  • Added focused provenance, visual rendering, path-confinement, incomplete-review and confirmed-export regression coverage plus all-in-one/readiness wiring.
  • Kept database migrations, model activation, inference, training and provider behavior unchanged.

Sprint 175 Detection result scale and false-positive evidence review (2026-07-13)

  • Bounded Detection Lab table rendering with client-side 25/50/100-row pagination while preserving the complete persisted detection set for MapLibre and QA/QC.
  • Compacted source-tile cells to filenames while preserving full persisted paths in tooltips.
  • Added a strict read-only false-positive evidence audit with role-count drift checks, polygon validation, WGS84 geodesic areas, size buckets, AOI/class/tile summaries and combined review GeoJSON.
  • Audited the active seven-AOI portfolio: 5,568 false positives among 13,613 candidates, median geometry area 184.5 m2, and 25.8% below 100 m2; Turnhout, Herentals and Geel carry the largest review volumes.
  • Recorded that existing QA evidence has no per-detection confidence values; the audit reports zero confidence coverage and does not infer scores from the run threshold.
  • Kept API contracts, database migrations, model activation, provider behavior and inference behavior unchanged.

Sprint 174 Focused small-building model promotion (2026-07-13)

  • Expanded the real operator corpus with four focused training AOIs and two independent validation AOIs, while keeping Turnhout, Retie and Westerlo outside the tile-training corpus as operation-level holdouts.
  • Exported and visually audited 198 tiles with 58,820 real GRB-derived labels; the accepted corpus contained no invalid labels, missing files or low-variance review selections.
  • Trained geointel-building-yolov8s-smallbld-minpx3-img640-ft30-pt from the previous active local model without downloading weights; the trained asset SHA256 is a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1.
  • At tile 512, overlap 64, threshold 0.15 and QA match IoU 0.25, seven persisted AOIs reached mean precision 0.5898, recall 0.5770, F1 0.5825 and minimum F1 0.5528; all three pure-empty controls remained at zero detections.
  • Fixed-reference evidence reduced false negatives from 7,753 to 6,182, including 745 fewer 25-100 m2 misses and 181 fewer sub-25 m2 misses. Precision is lower, so the UI states the increased false-positive review load explicitly.
  • Added persistent false-negative area summaries/GeoJSON, explicit tile-corpus sample selection provenance, missing runtime evaluation scripts, Docker COPY-source regression checks and warning-free Pydantic model-field schemas.
  • Fixed ultrawide two-panel workspaces so AI Labs, QA/QC and Exports use the available main width instead of leaving empty third/fourth columns, and decoupled backend README edits from the expensive all-in-one GIS/AI dependency cache layer.
  • Guarded activation updated only the Tower AI/model environment values; no fake outputs, provider fetching, API contract or database migration changed.

Sprint 173 Expanded building model promotion (2026-07-13)

  • Trained and fully gated the inactive geointel-building-yolov8s-aoi1024expandedminpx4vis035e50-pt candidate from the 20-source expanded real-data corpus.
  • The recommended 512 tile / 64 overlap / 0.15 confidence profile reached mean precision 0.6471, recall 0.4700 and F1 0.5433 across seven positive AOIs; all three pure-empty background AOIs remained at zero detections.
  • Compared fixed-threshold persisted evidence against the previous active model and reduced the false-negative rate in every validated positive AOI.
  • Activated the exact promoted local model through the guarded dry-run-first helper; no model was downloaded and no fake inference or QA result was introduced.
  • Updated Detection Lab operator profiles so the promoted expanded model is the recommended balanced review choice while the previous high-precision model remains available as a legacy conservative profile.
  • Redeployed the all-in-one Tower runtime with CPU-only Torch 2.13.0+cpu, verified a real local model load against a nine-tile manifest, and passed PostGIS, API, health and browser checks.
  • Persistent small-building misses remain the primary model-quality limitation and still require operator QA/QC.

Sprint 172 CPU AI image build hardening (2026-07-12)

  • Reordered the Unraid all-in-one Docker build so backend source changes reuse the Python/GIS/AI dependency layer.
  • Pinned the opt-in CPU runtime to PyTorch 2.13.0 and torchvision 0.28.0 from the official CPU wheel index, avoiding unused CUDA runtime packages while preserving the currently validated framework versions.
  • Kept AI dependencies opt-in and model weights local-only; no API, migration, model activation or inference contract changed.

Sprint 171.1 Validation coverage provenance (2026-07-12)

  • Added explicit retained and empty validation sample lists to generated YOLO tile summaries.
  • Quality-filtered holdouts such as Arendonk-heide remain visible in provenance without being counted as actual retained validation coverage.

Sprint 171 Positive AOI expansion and split safety (2026-07-12)

  • Added four explicit, real-reference Kempen training AOIs: Olen, Lille, Oud-Turnhout and Kasterlee center.
  • Preserved Turnhout, Retie, Westerlo and Arendonk-heide as manifest-backed validation holdouts and made the tile exporter reject unknown samples or holdout leakage.
  • Added recommended_split provenance to generated sample/reference/tile metadata and recorded the validation split in dataset summaries.
  • Hardened persistent false-negative comparison so portfolios with different reference feature identities cannot be compared.
  • Generated and audited the 20-source expanded dataset on Tower: 171 retained tiles, 45,892 valid labels, 9 low-variance negatives removed and no structural audit warnings.
  • Balanced visual label QA by source sample before selecting repeated dense tiles; the live pass covered all 19 retained sources without invalid labels, missing images or blank selections.
  • No model was activated and no product API or migration changed.

Sprint 170 Persistent false-negative evidence audit (2026-07-12)

  • Added fixed-threshold evidence portfolio input generation so model comparisons use exactly one matching model/tile/threshold run per AOI.
  • Added GIS-aware false-negative audit tooling with WGS84 geodetic areas, building-size buckets and persistent miss detection across multiple persisted QA portfolios.
  • Missing, invalid or non-polygon evidence geometry now fails the operator audit explicitly.
  • Added readiness compilation and focused regression coverage.
  • No API contract, migration, model activation, provider fetching, fake QA output or model download behavior changed.

Sprint 169 Filtered YOLO candidate gate and operator hardening (2026-07-12)

  • Trained and fully gated inactive geointel-building-yolov8s-aoi1024cleanpx12vis035lowvar512e50-pt against seven positive AOIs and split pure-empty/sparse-context backgrounds.
  • Rejected the candidate for default promotion: best mean positive F1 was approximately 0.154, below the 0.25 gate; threshold 0.05 also produced one pure-empty background detection.
  • Preserved the current active aoi1024bg512r3e50 model and all runtime defaults.
  • Added SHA256 provenance to future YOLO training summaries.
  • Improved long project/dataset/AOI readability with matching tooltips and compact two-line readiness values.
  • No API contract, migration, provider fetching, fake output, model download or automatic model activation changed.

Sprint 164 Tower AI deploy env hardening (2026-07-11)

  • Fixed Tower deploy automation so scripts/deploy_tower.sh and scripts/deploy_tower.ps1 source the remote .env before building the all-in-one image.
  • Hardened the PowerShell deploy wrapper to stream the remote script through bash -s, matching the Bash deploy path and preserving remote shell variable expansion.
  • The PowerShell wrapper now writes a UTF-8-without-BOM temporary script, copies it with scp, runs it with bash on Tower and removes the remote temp file while preserving the deploy exit code.
  • Remote .env now controls GEOINTEL_INSTALL_AI=true by default, with explicit local deploy overrides still supported.
  • Added regression coverage so future deploy changes cannot silently build a GIS-only image while runtime YOLO settings are enabled.
  • No API contract, database migration, provider fetching, fake detections, model download or product feature changed.

Sprint 163 Guarded YOLO candidate activation (2026-07-11)

  • Added scripts/activate_promoted_yolo_candidate.py to validate a promotion report and exact candidate key before emitting YOLO .env activation updates.
  • The helper supports dry-run by default and writes .env only with --apply; it does not download weights, load models or run inference.
  • Updated Detection Lab operator profiles: balanced 0.15 remains candidate-only, while conservative 0.35 is marked as the promoted profile backed by the split-background pure-empty gate.
  • Added tests for dry-run activation, .env apply behavior, rejected report handling and promoted UI profile status.
  • No API contract, database migration, provider fetching, fake detections, model file mutation or automatic runtime activation was introduced.

Sprint 162 Split-background promotion runtime pass (2026-07-11)

  • Hardened split-background preflight compatibility for legacy operator manifests by deriving missing background categories from reference_feature_count.
  • Ran Tower split-background promotion evidence against http://192.168.10.150:1202.
  • Produced a high-threshold promote candidate: geointel-building-yolov8s-aoi1024bg512r3e50-pt|512|64|0.35.
  • Verified the strict pure-empty background gate: 3 samples, 9 runs, 0 detections.
  • Preserved the current model default; no automatic activation, provider fetching, fake outputs, model downloads, API contracts or migrations changed.

Sprint 161 Widescreen workbench support (2026-07-10)

  • Added dedicated 1800px and 2200px frontend layout breakpoints for wide and ultrawide monitors.
  • Expanded the workbench shell, inspector and MapLibre review frame while preserving the existing Map/Data/QA/AI/Export workflows and API contracts.
  • Added regression tests for widescreen grid, map-height and ultrawide layout contracts.
  • No backend API, database migration, model default, provider fetching, fake detection output or model download behavior changed.

Sprint 160 Split-background promotion preflight (2026-07-10)

  • Added --preflight-only to scripts/run_split_background_promotion_workflow.sh.
  • Preflight validates local positive portfolio and operator manifest files, confirms required pure_empty_negative and sparse_building_context background categories, checks Python/curl availability and verifies the runtime API proxy returns the canonical envelope.
  • Hardened preflight compatibility for older operator manifests by deriving missing background categories from reference_feature_count, matching the existing matrix-runner behavior.
  • Documented the quick post-redeploy preflight command before starting long configured-YOLO matrix inference.
  • No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.

Sprint 159 Split-background promotion workflow wrapper (2026-07-10)

  • Added scripts/run_split_background_promotion_workflow.sh to run the split background matrix and split-aware promotion report from one operator command.
  • Added readiness syntax coverage and regression tests for the wrapper contract.
  • Documented the one-command Tower/runtime flow for the inactive AOI1024 background-aware model candidate.
  • No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.

Sprint 158 Split-aware promotion report (2026-07-10)

  • Added --background-split-summary support to scripts/build_detection_model_promotion_report.py.
  • The promotion report now resolves the split summary's pure_empty_negative source as the strict default-promotion background gate and records sparse_building_context as review-only evidence.
  • Added regression coverage proving sparse-context detections do not block default promotion when the pure-empty gate passes.
  • No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.

Sprint 157 Background split matrix runner (2026-07-10)

  • Added scripts/run_background_corpus_split_matrix.sh to run pure-empty and sparse-context hard-negative matrices separately from one operator command.
  • Added scripts/build_background_corpus_split_report.py to combine both hard-negative summaries into background_corpus_split_summary.json and .md.
  • Added readiness coverage and tests for the split runner/report contract.
  • No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.

Sprint 156 Background corpus classification (2026-07-10)

  • Added explicit operator background categories to prepared sample manifests: pure_empty_negative when GRB returns zero reference buildings and sparse_building_context when contextual GRB buildings are present.
  • Added OPERATOR_BACKGROUND_CATEGORIES to scripts/run_operator_hard_negative_detection_matrix.sh so strict default-promotion false-positive gates can run on pure-empty negatives separately from sparse-context review samples.
  • Preserved background_category in exported YOLO tile metadata for training auditability.
  • No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.

Sprint 155 Detection operator profiles (2026-07-09)

  • Added explicit Detection Lab operator profiles for the inactive geointel-building-yolov8s-aoi1024bg512r3e50-pt local model asset.
  • Added a balanced review profile at confidence threshold 0.15 and a conservative review profile at 0.35, with persisted gate metrics shown in the UI.
  • Kept both profiles clearly marked as candidate-only and not default-approved because the promotion recommendation remains none and background false-positive pressure still blocks automatic activation.
  • No model download behavior, API contract, migration, provider fetching, fake detection output or active runtime default changed.

Sprint 154 Background-aware AOI1024 YOLOv8s candidate gate (2026-07-09)

  • Exported and audited background-aware AOI1024 training dataset /app/storage/operator-data/yolo-building-aoi1024-bgaware512r3; the audit passed with 162 tiles, 117 positive tiles, 45 negative tiles, 21,530 labels and no warnings.
  • Trained inactive local model asset geointel-building-yolov8s-aoi1024bg512r3e50-pt from the background-aware dataset. The Tower catalog reports SHA256 e0980572aac90e7efc514608eb16d7de5bfbf27a4bbec04e7bc1bc8c02f9601f, status=available, active=false and will_download_models=false.
  • Ultralytics validation for the completed 50-epoch CPU run ended at approximately precision 0.440, recall 0.362, mAP50 0.251 and mAP50-95 0.0878.
  • Ran the seven-reference AOI1024 persisted QA matrix at tile 512, overlap 64 and thresholds 0.25, 0.15 and 0.05. Mean positive F1 improved to 0.4908049127242224 at threshold 0.05, 0.5074022485589402 at 0.15 and 0.44378879337957716 at 0.25.
  • Ran an additional conservative-threshold positive matrix at thresholds 0.35, 0.45 and 0.60. Threshold 0.35 produced mean F1 0.32086574003576274, mean precision 0.840006 and mean recall 0.202135.
  • Ran full hard-negative/background matrices. The candidate still fails automatic default promotion because mixed background-candidate AOIs keep false-positive pressure: max detections were 184 at threshold 0.05, 103 at 0.15, 75 at 0.25, 55 at 0.35, 38 at 0.45 and 18 at 0.60.
  • Generated promotion reports at artifacts/detection-model-promotion/aoi1024bg512r3e50-full/detection_model_promotion_report.md and artifacts/detection-model-promotion/aoi1024bg512r3e50-high-threshold/detection_model_promotion_report.md; recommendation remains none.
  • No API contract, migration, provider fetching, fake detection data, model download behavior or active model default changed.

Sprint 153 AOI1024 clean-label YOLOv8s candidate gate (2026-07-09)

  • Audited AOI1024 label-quality variants after paged GRB reference regeneration and selected /app/storage/operator-data/yolo-building-aoi1024-visible050-minpx8 for training because it passed the dataset audit while keeping the 512px runtime scale.
  • Trained inactive local model asset geointel-building-yolov8s-aoi1024clean512e50-pt from the cleaned 512px tile dataset. The Tower catalog reports SHA256 7cfadb684dd56623d2e35ebd65593211d3051908c87121bef438b231d3e47cce, status=available, active=false and will_download_models=false.
  • Ultralytics validation for the completed 50-epoch CPU run ended at approximately precision 0.441, recall 0.380, mAP50 0.265 and mAP50-95 0.096.
  • Ran the full seven-reference AOI1024 persisted QA matrix at tile 512, overlap 64 and thresholds 0.25, 0.15 and 0.05. Mean positive F1 improved materially: 0.4723513253430784 at threshold 0.05, 0.4753322215541376 at 0.15 and 0.31021575247724875 at 0.25.
  • Ran the full nine-sample hard-negative/background matrix. Background false-positive pressure still blocks default promotion: max detections were 137 at threshold 0.05, 75 at 0.15 and 55 at 0.25.
  • Generated the promotion report at artifacts/detection-model-promotion/aoi1024clean512e50-full/detection_model_promotion_report.md; recommendation remains none because every threshold fails background_false_positive_pressure.
  • No API contract, migration, provider fetching, fake detection data, model download behavior or active model default changed.

Sprint 152 GRB reference paging for operator samples (2026-07-09)

  • Fixed the operator real-data sample preparer so GRB GBG reference GeoJSON is fetched through OGC API rel=next pagination links instead of stopping at the first limit=1000 page.
  • Added --reference-page-limit / OPERATOR_GRB_PAGE_LIMIT and --reference-max-features / OPERATOR_GRB_MAX_FEATURES safeguards for dense reference AOIs.
  • Generated reference GeoJSON now records fetched page URLs, page count, truncation state and paging limits for auditability.
  • Added regression coverage for paged GRB responses and the new CLI help options.
  • Redeployed Tower, regenerated AOI1024 operator samples with paged GRB references and re-exported yolo-building-aoi1024-visible025; dense reference counts now exceed the old cap where expected, including Geel 2,268, Mol 1,993, Turnhout 3,278, Herentals 2,478, Balen 1,343, Retie 1,734 and Westerlo 1,133 features.
  • The refreshed AOI1024 tile dataset now has 29,170 labels with 0 missing label files and 0 invalid rows; audit status remains needs_attention because small-box share is still high.
  • No application provider endpoint, migration, API contract, live GRB product import, model download or active YOLO model changed.

Sprint 151 runtime GIS upload and AOI1024 YOLO candidate (2026-07-09)

  • Fixed the operator YOLO training wrapper so the all-in-one runtime defaults to /opt/geointel/venv/bin/python when present, while still falling back to python3 for local shells.
  • Raised the Nginx upload limit to 250m in both the compose frontend proxy and Unraid all-in-one proxy after a live 1024px GeoTIFF QA upload hit 413 Request Entity Too Large.
  • Raised Nginx proxy read/send timeouts to 600s after a long low-threshold persisted YOLO/QA run hit 504 Gateway Timeout.
  • Hardened build_detection_model_promotion_report.py so it correctly accepts both calibration evidence portfolios and multi-sample quality summaries as positive evidence inputs.
  • Prepared a larger Tower operator sample manifest at /app/storage/operator-data/operator-samples-1024 using explicit 1024x1024 rasters and doubled AOI half-size.
  • Exported and audited /app/storage/operator-data/yolo-building-aoi1024-visible025: 144 tiles, 117 positive tiles, 27 negative tiles, 15,079 labels and min_label_visible_ratio=0.25; audit remains needs_attention because median label area is still below gate.
  • Trained inactive local model asset geointel-building-yolov8s-aoi1024visible025e50-pt from the AOI1024 dataset. Ultralytics validation ended at approximately precision 0.275, recall 0.331, mAP50 0.188 and mAP50-95 0.0716.
  • Redeployed Tower and verified the previously failing Geel low-threshold persisted YOLO/QA path now completes instead of returning 504; the run produced F1 0.09136212624584718, so the model remains rejected for default use.
  • Ran the full four-sample AOI1024 positive matrix and nine-sample hard-negative matrix. Best positive result was Westerlo threshold 0.15 with F1 0.28703703703703703; background pressure still reached 59 detections at threshold 0.25, 107 at 0.15 and 226 at 0.05.
  • Generated the AOI1024 promotion report after the parser fix; recommended candidate remains none. Mean positive F1 stayed below gate for all thresholds: 0.13307746028311157 at 0.05, 0.13900227809255514 at 0.15 and 0.09694707724016788 at 0.25.
  • The candidate remains inactive and must pass persisted detection QA/QC plus background/hard-negative promotion gates before default activation.
  • No API contract, migration, product feature, provider fetching, fake detection data or active model default changed.

Sprint 150 YOLO label visible-ratio gate (2026-07-09)

  • Added --min-label-visible-ratio / OPERATOR_YOLO_MIN_LABEL_VISIBLE_RATIO to the operator YOLO tile dataset exporter.
  • The exporter can now drop clipped building labels where only a small share of the original object bbox is visible in an overlapping tile.
  • Tile dataset summaries and audit reports now retain/report min_label_visible_ratio.
  • Added operator-only --width, --height and --half-size-scale options to prepare_operator_real_data_samples.py so larger training AOIs can be prepared explicitly.
  • Updated operator documentation for the recommended next dataset pass.
  • No model was activated, no detections were faked, no provider fetching was introduced and no migration changed.

Sprint 149 YOLO duplicate suppression evidence (2026-07-09)

  • Added configured-YOLO cross-tile duplicate suppression before Detection rows are persisted.
  • Added YOLO_DUPLICATE_IOU_THRESHOLD with default 0.5; 0 disables the GeoIntel-side pass for debugging.
  • Detection run result metadata now records raw candidate count, suppressed duplicate count and duplicate IoU threshold.
  • Calibration and quality matrix scripts now fetch detection run details and include raw/suppressed counts in summaries.
  • Updated Docker/Unraid env examples, API/AI/backend docs and detection pipeline notes.
  • Redeployed Tower and reran Westerlo/Turnhout dense-AOI sweeps; duplicate suppression improved F1 but the AOI512 YOLOv8s candidate remains rejected for default use.
  • No model was activated, no detections were faked, and no migration changed.

Sprint 148 YOLO max-detection cap hardening (2026-07-09)

  • Added YOLO_MAX_DETECTIONS with default 1000 and forward it to Ultralytics as max_det.
  • Wired the setting through .env.example, Docker Compose, Unraid env examples and the Dockerman run script.
  • Documented why dense building AOIs should not inherit the Ultralytics default cap of 300 detections before persisted QA/QC.
  • Added regression coverage for adapter forwarding and Docker/Unraid runtime exposure.
  • Redeployed the Tower all-in-one runtime and verified live dense-AOI sweeps can exceed 300 persisted detection candidates: Westerlo reached 523/1000 detections and Turnhout reached 822/1000 at tested thresholds.
  • The current AOI512 YOLOv8s candidate remains rejected for default use because persisted QA/QC F1 remains too low despite the runtime cap fix.
  • No model was activated, no detections were faked, and no API route or migration changed.

Sprint 147 AOI512 YOLOv8s scale-match candidate gate (2026-07-09)

  • Built and audited an AOI-scale YOLO dataset at 512px tile size to test whether the previous 160px training scale was the main quality blocker.
  • Trained Tower-local model asset geointel-building-yolov8s-aoi512e80-pt from /app/storage/operator-data/yolo-building-aoi512-uniquehardneg.
  • Ran 7 positive AOI sweeps, a 17,156-feature evidence portfolio, a 9-sample hard-negative/background matrix and a promotion report.
  • Result: the candidate is rejected. The best threshold 0.25 reached mean positive F1 0.13511851520077328 and still produced max background detections 56.
  • Conclusion: scale-match training helps the training validation curve but does not solve operational persisted QA/QC quality. The next model pass needs better positive AOI coverage and label strategy, not only more epochs or another threshold.
  • No API contract, migration, frontend behavior, provider fetching, model download or active model configuration changed.

Sprint 146 Unique hard-negative YOLOv8s candidate gate (2026-07-09)

  • Fixed the all-in-one Docker image so the operator YOLO training wrapper is available at /app/scripts/train_operator_yolo_detector.sh.
  • Trained the Tower-local geointel-building-yolov8s-uniquehardneg160e50-pt candidate from the yolo-building-tile-uniquehardneg160 dataset and preserved it as an explicit local model asset.
  • Ran 7 positive AOI calibration sweeps, a 17,008-feature evidence portfolio, a 9-sample hard-negative/background matrix and a promotion report.
  • Result: the candidate is rejected. Mean positive F1 remains around 0.16 and background false-positive pressure reaches 58 detections at threshold 0.25, 85 at 0.15 and 172 at 0.05.
  • Hardened the operator promotion report so older positive evidence portfolios can be compared with explicit positive tile-size/overlap defaults.
  • No API contract, migration, frontend behavior, model download, provider-fetching behavior or active model configuration changed.

Sprint 145 YOLOv8s hardneg r8 e60 full candidate evaluation (2026-07-08)

  • Completed the Tower-local YOLOv8s hard-negative r8 training run through 60 CPU epochs and published local model asset geointel-building-yolov8s-hardneg160r8e60-pt.
  • Ran the full 7-AOI positive matrix, hard-negative matrix, evidence portfolio and promotion report for the completed e60 artifact.
  • Result: the model is rejected. It reduces Kasterlee-bos background detections versus expanded160e50 at threshold 0.15 (11 versus 46), but mean positive F1 remains too low (0.07870592446136859 at threshold 0.15).
  • No backend API, migration, frontend runtime, model download, provider-fetching behavior or active model configuration changed.

Sprint 144 YOLOv8s hardneg r8 partial candidate evaluation (2026-07-08)

  • Started a Tower-local YOLOv8s training run on the yolo-building-tile-hardneg160r8 dataset with requested 60 epochs.
  • Preserved the 12-epoch best.pt artifact as explicit partial model asset geointel-building-yolov8s-hardneg160r8e12partial-pt after the CPU training command reached the 1-hour command limit.
  • Ran the partial candidate through the 7-AOI positive matrix, hard-negative matrix, evidence portfolio and promotion report.
  • Result: the partial candidate is rejected. Best positive F1 was Westerlo at 0.14826498422712936, mean positive F1 at threshold 0.05 was 0.05026994383963278, and Kasterlee-bos still produced 18 detections at threshold 0.05.
  • No backend API, migration, frontend runtime, model download, provider-fetching behavior or active model configuration changed.

Sprint 143 Detection model promotion decision report (2026-07-08)

  • Added scripts/build_detection_model_promotion_report.py for operator-only model promotion review.
  • The report combines positive-AOI calibration evidence portfolios with hard-negative/background matrix summaries.
  • Candidate decisions are grouped by model asset, tile size, overlap and threshold, then gated by positive sample count, background sample count, mean F1 and maximum background detections per sample.
  • Added regression coverage for promoting a clean candidate and rejecting a candidate with background false-positive pressure.
  • Ran the report on Tower against the regenerated 7-AOI positive portfolio and live hard-negative summaries; it evaluated 15 candidates and recommended none for default promotion.
  • No backend API, migration, frontend runtime, model weight, model download, inference or provider-fetching behavior changed.

Sprint 141 Expanded positive-AOI matrix and portfolio metadata hardening (2026-07-08)

  • Ran a fresh Tower quality matrix for Balen, Herentals and Westerlo using geointel-building-yolov8n-expanded160e50-pt and geointel-building-yolov8n-hardneg160r8e40-pt.
  • Assembled an expanded 7-AOI positive evidence portfolio across Geel, Mol, Turnhout, Retie, Balen, Herentals and Westerlo.
  • Hardened calibration evidence exports so model asset id, model request, tile size and tile overlap survive into evidence bundle summaries and GeoJSON properties.
  • Result: expanded160e50 is stronger on positive AOIs, with Westerlo reaching F1 0.3659305993690852, but hard-negative matrices still show false-positive pressure tradeoffs that prevent blind default promotion.
  • No backend API, migration, frontend runtime, model weight, provider fetching or Docker runtime change was introduced.

Sprint 140 Live multi-AOI calibration portfolio run (2026-07-08)

  • Ran the new multi-AOI calibration evidence portfolio assembler on Tower against existing persisted quality-matrix summaries for Geel, Mol and Turnhout.
  • Produced a real operator handoff under /mnt/user/appdata/geointel/artifacts/detection-calibration-portfolio/live-20260708/output/ with portfolio JSON, Markdown and per-AOI evidence GeoJSON/HTML review artifacts.
  • Portfolio evidence contains 5,509 persisted QA evidence features across 3 AOIs: 5,239 false negatives, 164 false positives, 53 matched detections and 53 matched references.
  • Result: the evidence pipeline works, but the evaluated model/threshold set should not be promoted because recall remains very low across the AOIs.
  • No app rebuild, API change, migration, inference rerun, model training, model download, provider fetch or frontend runtime change was introduced.

Sprint 139 Multi-AOI calibration evidence portfolio (2026-07-08)

  • Added scripts/assemble_detection_calibration_evidence_portfolio.sh to package multiple AOI calibration summaries and their persisted QA evidence bundles into one model-review portfolio.
  • The assembler copies each summary into a sample folder, runs the existing evidence exporter per AOI and writes calibration_evidence_portfolio.json plus calibration_evidence_portfolio.md.
  • Added readiness syntax coverage and a mocked-endpoint regression test for the portfolio convention.
  • No backend API, migration, inference, provider fetching, model download, live data mutation or frontend runtime behavior changed.

Sprint 138 Browser calibration evidence bundle smoke (2026-07-08)

  • Added scripts/smoke_detection_calibration_evidence_bundle.sh to exercise the browser detection-calibration-summary.json -> QA evidence bundle path locally.
  • The smoke uses mocked canonical QA evidence endpoint responses, runs the real export_detection_calibration_evidence.sh script and verifies the emitted GeoJSON, summary JSON and HTML review artifacts.
  • Added readiness syntax coverage and regression coverage for the smoke.
  • No backend API, migration, inference, provider fetching, model download, live data mutation or frontend runtime behavior changed.

Sprint 137 Browser calibration summary evidence bundle handoff (2026-07-08)

  • Extended scripts/export_detection_calibration_evidence.sh so it accepts Detection Lab detection-calibration-summary.json browser exports in addition to the older operator calibration summary format.
  • Added summary normalization for browser-exported rows, root project_id, persisted quality_check_id values and best-mode fallback selection.
  • Updated operator docs with the direct browser summary command.
  • No backend API, migration, inference, provider fetching, model download or frontend runtime behavior changed.

Sprint 136 Guided calibration summary export (2026-07-08)

  • Added a Detection Lab Download calibration summary action for guided calibration rows.
  • The exported JSON includes thresholds, persisted analysis run IDs, job IDs, quality check IDs, metrics and evidence GeoJSON URLs for successful rows.
  • Reused browser-side JSON download behavior only; no backend endpoint, API contract, migration, model, provider or inference behavior changed.
  • Added regression coverage for the summary export wiring.

Sprint 135 Calibration evidence handoff (2026-07-08)

  • Added a guided-calibration table action that opens the persisted QA/QC evidence map for successful threshold rows.
  • Reused the existing quality-check evidence API and Map workspace overlay flow; no backend route, migration, model, provider or inference behavior changed.
  • Kept unsuccessful/queued calibration rows read-only by disabling evidence actions until a persisted quality_check_id exists.
  • Added regression coverage for the Detection Lab wiring and TODO tracking.

Sprint 134 External remote-sensing YOLO candidate benchmark (2026-07-07)

  • Evaluated the Hugging Face agademer/yolo-remote-sensing-photovoltaic YOLOv8l detection checkpoint as an explicit operator-provided runtime model asset.
  • Downloaded yolo-remote-sensing-photovoltaic-v8l-solar-farms-and-cities-v20260331-detect-1000_epochs.pt to the Tower runtime as /app/models/yolo-remote-sensing-photovoltaic-v8l-detect-1000.pt; the model file is not committed to Git.
  • The model catalog exposes it as yolo-remote-sensing-photovoltaic-v8l-detect-1000-pt with SHA256 242ff4ab889569278f0eb9fcd22eb2c4bf2a52e48d05d89cc7cfa7941165d203.
  • Live YOLO preflight loaded the model successfully with status=ready, model_load_ok=true, manifest_valid=true, tile_paths_exist=true, will_download_models=false and will_run_inference=false.
  • Live 45-run dense QA matrix compared the external YOLOv8l candidate with geointel-building-yolov8n-expanded160e50-pt and geointel-building-yolov8n-hardneg160r8e40-pt across Geel, Mol, Turnhout, Retie and Kasterlee-bos.
  • Result: the external candidate was very conservative and missed most dense GRB buildings. It scored F1 0.0 on Geel, 0.010582010582010581 on Mol, 0.019070321811680575 on Turnhout and 0.0 on Retie, while expanded160e50 remained the dense-AOI winner.
  • Live 27-run background matrix showed the external candidate was cleaner on Kasterlee-bos than local YOLOv8n candidates, with 1/2/5 detections at thresholds 0.25/0.15/0.05, but it leaked 0/1/3 detections on Postel-bos and was therefore not uniformly cleaner than hardneg160r8e40.
  • Decision: keep the model as runtime evidence only. It should not become the V1 default because recall is too low for operational extraction. The next pass should train a higher-capacity local model, starting from a stronger base and using the existing dense plus hard-negative benchmark gates.
  • No API contract change, provider fetching, fake detections, model auto-provisioning, repository-stored weights or app-side model training behavior was introduced.

Sprint 133 Hard-negative-balanced YOLO candidate (2026-07-07)

  • Added --background-negative-repeat / OPERATOR_YOLO_BACKGROUND_NEGATIVE_REPEAT support to scripts/export_operator_yolo_tile_dataset.py so train-split background-candidate negative tiles can be repeated deterministically without duplicating validation tiles.
  • Added exported tile provenance fields sample_role, repeat_index and is_repeated_background_negative plus regression coverage in backend/tests/test_sprint130_operator_yolo_tile_dataset.py.
  • Live Tower export produced /app/storage/operator-data/yolo-building-tile-hardneg160r8 with tile size 160, stride 80, background repeat 8, 864 tiles, 260 positive tiles, 604 negative tiles, 11213 labels, 756 train tiles and 108 validation tiles.
  • Live Tower 40-epoch CPU training produced /app/models/geointel-building-yolov8n-hardneg160r8e40.pt; the model catalog exposes it as geointel-building-yolov8n-hardneg160r8e40-pt with SHA256 7a77bd9f68e4c3927ffc8a8cd978a81067b02f42cffe77ada5334b5f8dbb6b50.
  • Live YOLO preflight loaded the model successfully with status=ready, model_load_ok=true, manifest_valid=true, tile_paths_exist=true, will_download_models=false and will_run_inference=false.
  • Live 60-run dense QA matrix showed geointel-building-yolov8n-expanded160e50-pt remains the better dense-AOI candidate; hardneg160r8e40 underperformed it on Geel, Mol, Turnhout and Retie.
  • Live 36-run background matrix showed hardneg160r8e40 materially reduced false-positive pressure: Kasterlee-bos dropped from expanded160e50's 38/46/76 detections to 5/9/25 at thresholds 0.25/0.15/0.05, and Postel-bos/Lommel-heide stayed at 0 detections across all thresholds.
  • Decision: hardneg160r8e40 is useful evidence for a low-false-positive training direction, but it should not become the V1 default because dense-AOI recall/F1 regressed. The next model pass should combine stronger positive coverage with hard-negative balancing or test a stronger aerial-building architecture.
  • No Training Studio UI, API contract change, provider fetching, model auto-provisioning, fake detections or app-side model training behavior was introduced.

Sprint 132 Operator hard-negative detection matrix (2026-07-07)

  • Added scripts/run_operator_hard_negative_detection_matrix.sh to score configured-YOLO false-positive pressure on documented background-candidate operator AOIs without uploading reference vectors or running QA/QC.
  • Added readiness shell-syntax coverage and regression coverage in backend/tests/test_sprint132_operator_hard_negative_matrix.py.
  • Live Tower 27-run hard-negative matrix compared geointel-building-yolov8n-expanded160e50-pt, geointel-building-yolov8n-tile30-pt and yolov8s-building-segmentation-pt on Postel-bos, Lommel-heide and Kasterlee-bos at thresholds 0.25/0.15/0.05.
  • Result: geointel-building-yolov8n-expanded160e50-pt produced 0 detections on Postel-bos and Lommel-heide at thresholds 0.25 and 0.15, but produced 38/46/76 detections on Kasterlee-bos at thresholds 0.25/0.15/0.05.
  • Decision: the expanded local model remains the best dense-AOI candidate, but Kasterlee-bos false-positive pressure blocks it from becoming a V1 default. The next model pass must train against stronger hard-negative coverage or tune per-model threshold/max-detection policy.
  • No QA metrics were faked; background scoring is detection-count based only. No provider fetching, fixture detections, model downloads, API contract changes or app-side training behavior were introduced.

Sprint 131 Operator sample expansion and negative-tile YOLO candidate (2026-07-07)

  • Expanded scripts/prepare_operator_real_data_samples.py from the original Geel/Mol/Turnhout corpus to 7 reference AOIs plus 3 background-candidate AOIs.
  • Added sample_role and allow_empty_reference metadata so deliberate background candidates can be prepared without weakening the empty-GRB guard for normal reference samples.
  • Added regression coverage in backend/tests/test_sprint131_operator_sample_expansion.py for the expanded sample registry, empty-reference background candidates and normal reference-sample rejection.
  • Live Tower preparation produced 10 operator samples: Geel, Mol, Turnhout, Herentals, Balen, Retie, Westerlo, Postel-bos, Lommel-heide and Kasterlee-bos.
  • Live Tower tile export produced /app/storage/operator-data/yolo-building-tile-expanded160 with 360 tiles, 260 positive tiles, 100 negative tiles and 11213 clipped building labels.
  • Live Tower 50-epoch CPU training produced /app/models/geointel-building-yolov8n-expanded160e50.pt; the model catalog exposes it as geointel-building-yolov8n-expanded160e50-pt with SHA256 bf6a5e8d25a62d784ee53764ea11d7ce89c4e7aeeac7588010e497b8d7dafb2b.
  • Live YOLO preflight loaded geointel-building-yolov8n-expanded160e50-pt successfully with status=ready, model_load_ok=true, manifest_valid=true, tile_paths_exist=true, will_download_models=false and will_run_inference=false.
  • Live 45-run Geel/Mol/Turnhout/Retie/Kasterlee-bos QA matrix showed the expanded model is the best current candidate on dense building AOIs: best overall score was Geel at tile 640, threshold 0.05, precision 0.30333333333333334, recall 0.14748784440842788, F1 0.1984732824427481.
  • Hard-negative finding: on the sparse Kasterlee-bos sample, yolov8s-building-segmentation-pt remained cleaner, while the expanded local model produced too many false positives. The model is therefore improved but still experimental, not a V1 default.
  • No Training Studio UI, API contract change, provider fetching, model auto-provisioning, fake detections or app-side model training behavior was introduced.

Sprint 130 Operator YOLO tile-level dataset tooling (2026-07-07)

  • Added scripts/export_operator_yolo_tile_dataset.py to convert prepared operator samples into overlapping YOLO tile datasets with clipped building labels and deterministic negative tile retention.
  • Added readiness coverage for the tile exporter Python compile check.
  • Added regression coverage in backend/tests/test_sprint130_operator_yolo_tile_dataset.py for script contract, help behavior without GIS imports, edge-covering tile windows and deterministic negative-tile selection.
  • Updated operator documentation for tile-level dataset export and reuse of the existing local training wrapper.
  • Live Tower tile export produced /app/storage/operator-data/yolo-building-tile-dataset with 75 overlapping tiles and 5321 clipped building labels from the Geel/Mol/Turnhout operator samples.
  • Live Tower 30-epoch CPU training produced /app/models/geointel-building-yolov8n-tile30.pt; the model catalog exposes it as geointel-building-yolov8n-tile30-pt with SHA256 b9e228202500d7c85836d12a72e320f4f2f0cef24cbb1b5bf7fa78a6778390af.
  • Live YOLO preflight loaded geointel-building-yolov8n-tile30-pt successfully with status=ready, model_load_ok=true, manifest_valid=true, tile_paths_exist=true, will_download_models=false and will_run_inference=false.
  • Live 48-run Geel/Mol/Turnhout QA matrix compared geointel-building-yolov8n-tile30-pt with yolov8s-building-segmentation-pt; best overall score was Mol with the tile model, tile 640, threshold 0.15, precision 0.13602941176470587, recall 0.09893048128342247, F1 0.11455108359133127.
  • Result decision: the tile-trained local model is now the best tested candidate on Geel/Mol and best overall, but remains experimental and should not become the V1 default until more AOIs and negative/background samples materially improve recall and false-positive behavior.
  • No Training Studio UI, API contract change, provider fetching, model auto-provisioning or app-side model training behavior was introduced.

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.
  • Live Tower export produced a YOLO dataset with 3 operator samples and 1427 labels; a clean 8-epoch CPU training smoke produced /app/models/geointel-building-yolov8n-operator8.pt.
  • Live preflight loaded geointel-building-yolov8n-operator8-pt successfully with will_download_models=false and will_run_inference=false.
  • Live multi-sample QA matrix showed the 8-epoch operator model is not useful yet: it produced zero detections at thresholds 0.15-0.50, and the low-threshold 0.01 run produced mostly false positives with best F1 0.003798670465337132.
  • yolov8s-building-segmentation-pt remains the best tested model, with best overall F1 0.04195804195804196 on Mol at tile 640, threshold 0.15; still not sufficient for V1 default extraction.
  • 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.

Operator YOLOv8s hard-negative benchmark (2026-07-08)

  • Trained a Tower-local YOLOv8s hard-negative building detector from the existing operator tile dataset.
  • Published the trained runtime artifact as geointel-building-yolov8s-hardneg160r4e50-pt in the live model asset catalog without adding application download behavior.
  • Reused persisted dense QA and hard-negative benchmark runs through the existing live API.
  • Observed dense QA F1 scores up to 0.6380 and safest current threshold behavior around 0.25.
  • Kept the model inactive by default because the kasterlee_bos hard-negative sample still produced 10 detections at threshold 0.25.
  • No repository code, API contracts, migrations, product behavior, provider fetching or AI dependency strategy changed in this benchmark pass.

Sprint 122 Detection model asset activation guardrails (2026-07-08)

  • Hardened Detection Lab so local model assets are no longer auto-selected when the backend reports available model files.
  • Required an explicit local model asset choice before configured YOLO can be submitted when local assets exist.
  • Added local model asset details in the run surface: active runtime env status, SHA-256 preview, file size, path and will_download_models.
  • Surfaced the current YOLOv8s hard-negative benchmark candidate and recommended starting threshold 0.25 as operator guidance.
  • Added regression coverage for the no-auto-select behavior and UI guardrail copy.
  • No backend API contracts, migrations, model downloads, provider fetching or model weight mutation behavior changed.

Sprint 123 Raster detection manifest handoff (2026-07-08)

  • Added a structured raster tile manifest handoff from the Data workspace into Detection Lab.
  • Raster controls now surface manifest tile count, tile size, overlap and tile-set provenance before handing the manifest to AI workflows.
  • The Detection Lab handoff now selects the configured YOLO run path, keeps local model assets explicit, applies the current recommended 0.25 starting threshold and refreshes YOLO preflight for the linked manifest.
  • Detection Lab now shows linked tile manifest provenance plus preflight manifest validation, tile count and will_run_inference state.
  • Added regression coverage for the handoff contract and preserved the existing no-auto-select model guardrail.
  • No backend API contracts, migrations, model downloads, provider fetching or model weight mutation behavior changed.

Sprint 133 Detection threshold calibration UX (2026-07-08)

  • Added a Detection Lab calibration comparison panel that joins persisted detection runs with persisted QA/QC checks.
  • The panel compares confidence threshold, model, detection count, precision, recall, F1, false positives and false negatives.
  • Added operator guidance for best F1, best precision and lowest false-positive pressure, with a promotion guardrail to inspect evidence across AOIs before accepting a setting.
  • Added regression coverage for the persisted calibration UI contract.
  • No backend API contracts, migrations, model downloads, provider fetching or AI/model execution behavior changed.

Sprint 134 Guided detection calibration runner (2026-07-08)

  • Added an explicit in-app calibration runner to Detection Lab for operator-selected confidence threshold sweeps.
  • The runner reuses existing detection and QA APIs once per threshold, producing persisted DetectionRun, Job, Detection, QualityCheck and Metric records.
  • Added visible threshold progress with per-row status, detection count, precision, recall, F1, false positives and false negatives.
  • Added validation guardrails for selected project, raster dataset, reference dataset, configured non-fixture model, tile manifest and explicit local model asset.
  • Added regression coverage for the guided runner contract.
  • No backend API contracts, migrations, model downloads, provider fetching, automatic promotion or model file mutation behavior changed.

Sprint 142 Calibration evidence response uniqueness (2026-07-08)

  • Hardened the calibration evidence exporter so response artifacts are keyed by threshold and quality-check id.
  • Prevented multi-model portfolios from overwriting runs that share the same threshold.
  • Added regression coverage proving same-threshold runs are preserved in the assembled portfolio.
  • No API contracts, migrations, model downloads, provider fetching or AI inference behavior changed.

Unreleased

  • Added scripts/audit_operator_yolo_dataset_quality.py, an operator-only YOLO tile dataset quality audit that produces JSON and Markdown reports for sample coverage, split coverage, repeated hard-negative pressure and label-size integrity before further training runs.
  • Added pytest coverage and readiness syntax checking for the new operator YOLO dataset audit script.
  • Recorded live Tower audit results showing yolo-building-tile-expanded160 as the clean current baseline and r4/r8 hard-negative datasets as repeat-heavy evidence sets that need more unique background AOIs before further hard-negative training.
  • Expanded the explicit operator background-candidate AOI registry from 3 to 9 unique hard-negative locations and added tests for diversity/spread before further YOLO training.
  • Fixed the all-in-one Dockerfile so documented operator scripts are copied into /app/scripts/, then prepared and audited the new Tower yolo-building-tile-uniquehardneg160 dataset as the next training candidate.
  • Fixed the YOLO preflight CLI so it respects environment-provided runtime configuration instead of reporting not_configured unless CLI flags were supplied.
  • Rebuilt the Tower all-in-one image with AI dependencies and verified live migration smoke, browser runtime and YOLO preflight readiness against an existing raster tile manifest.
  • Fixed the all-in-one Dockerfile so the operator YOLO training wrapper is available and executable inside /app/scripts.