176 KiB
176 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 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=lengthresponses instead of showing an incomplete answer.
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.6069to0.6248and 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
.envsetting was changed. - Replaced stale Detection Lab profile averages with coverage-aligned active
evidence: precision
0.6141, recall0.6062, F10.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.10and0.15over independent Mol holdouts in Achterbos, Gompel, Donk and Postel, plus the pure-empty Postel forest control. Threshold0.15retained 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_reviewspersistence 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/PostGISdelivery 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 Workbenchthe 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
waitingquality 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
buildingswith 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
7997a72and 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,WGRandADP; 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_configuredGRB 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
DatasetServiceandVectorFeatureService, 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
Kempenoperationally 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
13025and Nijlen12026. - 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 F10.4749, micro F10.6338and 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_jsonstructure 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
httpxtohttpx2; 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 auditfrom 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 Workbenchthe 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-evidenceand 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-ptfrom the previous active local model without downloading weights; the trained asset SHA256 isa9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1. - At tile
512, overlap64, threshold0.15and QA match IoU0.25, seven persisted AOIs reached mean precision0.5898, recall0.5770, F10.5825and minimum F10.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-ptcandidate from the 20-source expanded real-data corpus. - The recommended
512tile /64overlap /0.15confidence profile reached mean precision0.6471, recall0.4700and F10.5433across 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_splitprovenance 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-ptagainst 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 the0.25gate; threshold0.05also produced one pure-empty background detection. - Preserved the current active
aoi1024bg512r3e50model 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.shandscripts/deploy_tower.ps1source the remote.envbefore 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 withbashon Tower and removes the remote temp file while preserving the deploy exit code. - Remote
.envnow controlsGEOINTEL_INSTALL_AI=trueby 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.pyto validate a promotion report and exact candidate key before emitting YOLO.envactivation updates. - The helper supports dry-run by default and writes
.envonly with--apply; it does not download weights, load models or run inference. - Updated Detection Lab operator profiles: balanced
0.15remains candidate-only, while conservative0.35is marked as the promoted profile backed by the split-background pure-empty gate. - Added tests for dry-run activation,
.envapply 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
1800pxand2200pxfrontend 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-onlytoscripts/run_split_background_promotion_workflow.sh. - Preflight validates local positive portfolio and operator manifest files, confirms required
pure_empty_negativeandsparse_building_contextbackground 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.shto 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-summarysupport toscripts/build_detection_model_promotion_report.py. - The promotion report now resolves the split summary's
pure_empty_negativesource as the strict default-promotion background gate and recordssparse_building_contextas 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.shto run pure-empty and sparse-context hard-negative matrices separately from one operator command. - Added
scripts/build_background_corpus_split_report.pyto combine both hard-negative summaries intobackground_corpus_split_summary.jsonand.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_negativewhen GRB returns zero reference buildings andsparse_building_contextwhen contextual GRB buildings are present. - Added
OPERATOR_BACKGROUND_CATEGORIEStoscripts/run_operator_hard_negative_detection_matrix.shso strict default-promotion false-positive gates can run on pure-empty negatives separately from sparse-context review samples. - Preserved
background_categoryin 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-ptlocal model asset. - Added a balanced review profile at confidence threshold
0.15and a conservative review profile at0.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
noneand 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-ptfrom the background-aware dataset. The Tower catalog reports SHA256e0980572aac90e7efc514608eb16d7de5bfbf27a4bbec04e7bc1bc8c02f9601f,status=available,active=falseandwill_download_models=false. - Ultralytics validation for the completed 50-epoch CPU run ended at approximately precision
0.440, recall0.362, mAP500.251and mAP50-950.0878. - Ran the seven-reference AOI1024 persisted QA matrix at tile
512, overlap64and thresholds0.25,0.15and0.05. Mean positive F1 improved to0.4908049127242224at threshold0.05,0.5074022485589402at0.15and0.44378879337957716at0.25. - Ran an additional conservative-threshold positive matrix at thresholds
0.35,0.45and0.60. Threshold0.35produced mean F10.32086574003576274, mean precision0.840006and mean recall0.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
184at threshold0.05,103at0.15,75at0.25,55at0.35,38at0.45and18at0.60. - Generated promotion reports at
artifacts/detection-model-promotion/aoi1024bg512r3e50-full/detection_model_promotion_report.mdandartifacts/detection-model-promotion/aoi1024bg512r3e50-high-threshold/detection_model_promotion_report.md; recommendation remainsnone. - 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-minpx8for training because it passed the dataset audit while keeping the 512px runtime scale. - Trained inactive local model asset
geointel-building-yolov8s-aoi1024clean512e50-ptfrom the cleaned 512px tile dataset. The Tower catalog reports SHA2567cfadb684dd56623d2e35ebd65593211d3051908c87121bef438b231d3e47cce,status=available,active=falseandwill_download_models=false. - Ultralytics validation for the completed 50-epoch CPU run ended at approximately precision
0.441, recall0.380, mAP500.265and mAP50-950.096. - Ran the full seven-reference AOI1024 persisted QA matrix at tile
512, overlap64and thresholds0.25,0.15and0.05. Mean positive F1 improved materially:0.4723513253430784at threshold0.05,0.4753322215541376at0.15and0.31021575247724875at0.25. - Ran the full nine-sample hard-negative/background matrix. Background false-positive pressure still blocks default promotion: max detections were
137at threshold0.05,75at0.15and55at0.25. - Generated the promotion report at
artifacts/detection-model-promotion/aoi1024clean512e50-full/detection_model_promotion_report.md; recommendation remainsnonebecause every threshold failsbackground_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=nextpagination links instead of stopping at the firstlimit=1000page. - Added
--reference-page-limit/OPERATOR_GRB_PAGE_LIMITand--reference-max-features/OPERATOR_GRB_MAX_FEATURESsafeguards 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_attentionbecause 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/pythonwhen present, while still falling back topython3for local shells. - Raised the Nginx upload limit to
250min both the compose frontend proxy and Unraid all-in-one proxy after a live 1024px GeoTIFF QA upload hit413 Request Entity Too Large. - Raised Nginx proxy read/send timeouts to
600safter a long low-threshold persisted YOLO/QA run hit504 Gateway Timeout. - Hardened
build_detection_model_promotion_report.pyso 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-1024using explicit1024x1024rasters 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 andmin_label_visible_ratio=0.25; audit remainsneeds_attentionbecause median label area is still below gate. - Trained inactive local model asset
geointel-building-yolov8s-aoi1024visible025e50-ptfrom the AOI1024 dataset. Ultralytics validation ended at approximately precision0.275, recall0.331, mAP500.188and mAP50-950.0716. - Redeployed Tower and verified the previously failing Geel low-threshold persisted YOLO/QA path now completes instead of returning
504; the run produced F10.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.15with F10.28703703703703703; background pressure still reached 59 detections at threshold0.25, 107 at0.15and 226 at0.05. - Generated the AOI1024 promotion report after the parser fix; recommended candidate remains
none. Mean positive F1 stayed below gate for all thresholds:0.13307746028311157at0.05,0.13900227809255514at0.15and0.09694707724016788at0.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_RATIOto 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,--heightand--half-size-scaleoptions toprepare_operator_real_data_samples.pyso 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
Detectionrows are persisted. - Added
YOLO_DUPLICATE_IOU_THRESHOLDwith default0.5;0disables 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_DETECTIONSwith default1000and forward it to Ultralytics asmax_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
512pxtile size to test whether the previous160pxtraining scale was the main quality blocker. - Trained Tower-local model asset
geointel-building-yolov8s-aoi512e80-ptfrom/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.25reached mean positive F10.13511851520077328and still produced max background detections56. - 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-ptcandidate from theyolo-building-tile-uniquehardneg160dataset 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.16and background false-positive pressure reaches58detections at threshold0.25,85at0.15and172at0.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
expanded160e50at threshold0.15(11versus46), but mean positive F1 remains too low (0.07870592446136859at threshold0.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-hardneg160r8dataset with requested 60 epochs. - Preserved the 12-epoch
best.ptartifact as explicit partial model assetgeointel-building-yolov8s-hardneg160r8e12partial-ptafter 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 threshold0.05was0.05026994383963278, and Kasterlee-bos still produced 18 detections at threshold0.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.pyfor 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-ptandgeointel-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.shto 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.jsonpluscalibration_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.shto exercise the browserdetection-calibration-summary.json-> QA evidence bundle path locally. - The smoke uses mocked canonical QA evidence endpoint responses, runs the real
export_detection_calibration_evidence.shscript 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.shso it accepts Detection Labdetection-calibration-summary.jsonbrowser exports in addition to the older operator calibration summary format. - Added summary normalization for browser-exported
rows, rootproject_id, persistedquality_check_idvalues 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 summaryaction 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_idexists. - 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-photovoltaicYOLOv8l detection checkpoint as an explicit operator-provided runtime model asset. - Downloaded
yolo-remote-sensing-photovoltaic-v8l-solar-farms-and-cities-v20260331-detect-1000_epochs.ptto 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-ptwith SHA256242ff4ab889569278f0eb9fcd22eb2c4bf2a52e48d05d89cc7cfa7941165d203. - Live YOLO preflight loaded the model successfully with
status=ready,model_load_ok=true,manifest_valid=true,tile_paths_exist=true,will_download_models=falseandwill_run_inference=false. - Live 45-run dense QA matrix compared the external YOLOv8l candidate with
geointel-building-yolov8n-expanded160e50-ptandgeointel-building-yolov8n-hardneg160r8e40-ptacross Geel, Mol, Turnhout, Retie and Kasterlee-bos. - Result: the external candidate was very conservative and missed most dense GRB buildings. It scored F1
0.0on Geel,0.010582010582010581on Mol,0.019070321811680575on Turnhout and0.0on 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_REPEATsupport toscripts/export_operator_yolo_tile_dataset.pyso train-split background-candidate negative tiles can be repeated deterministically without duplicating validation tiles. - Added exported tile provenance fields
sample_role,repeat_indexandis_repeated_background_negativeplus regression coverage inbackend/tests/test_sprint130_operator_yolo_tile_dataset.py. - Live Tower export produced
/app/storage/operator-data/yolo-building-tile-hardneg160r8with tile size160, stride80, background repeat8, 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 asgeointel-building-yolov8n-hardneg160r8e40-ptwith SHA2567a77bd9f68e4c3927ffc8a8cd978a81067b02f42cffe77ada5334b5f8dbb6b50. - Live YOLO preflight loaded the model successfully with
status=ready,model_load_ok=true,manifest_valid=true,tile_paths_exist=true,will_download_models=falseandwill_run_inference=false. - Live 60-run dense QA matrix showed
geointel-building-yolov8n-expanded160e50-ptremains 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.shto 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-ptandyolov8s-building-segmentation-pton Postel-bos, Lommel-heide and Kasterlee-bos at thresholds0.25/0.15/0.05. - Result:
geointel-building-yolov8n-expanded160e50-ptproduced 0 detections on Postel-bos and Lommel-heide at thresholds0.25and0.15, but produced 38/46/76 detections on Kasterlee-bos at thresholds0.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.pyfrom the original Geel/Mol/Turnhout corpus to 7 reference AOIs plus 3 background-candidate AOIs. - Added
sample_roleandallow_empty_referencemetadata 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.pyfor 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-expanded160with 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 asgeointel-building-yolov8n-expanded160e50-ptwith SHA256bf6a5e8d25a62d784ee53764ea11d7ce89c4e7aeeac7588010e497b8d7dafb2b. - Live YOLO preflight loaded
geointel-building-yolov8n-expanded160e50-ptsuccessfully withstatus=ready,model_load_ok=true,manifest_valid=true,tile_paths_exist=true,will_download_models=falseandwill_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, threshold0.05, precision0.30333333333333334, recall0.14748784440842788, F10.1984732824427481. - Hard-negative finding: on the sparse Kasterlee-bos sample,
yolov8s-building-segmentation-ptremained 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.pyto 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.pyfor 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-datasetwith 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 asgeointel-building-yolov8n-tile30-ptwith SHA256b9e228202500d7c85836d12a72e320f4f2f0cef24cbb1b5bf7fa78a6778390af. - Live YOLO preflight loaded
geointel-building-yolov8n-tile30-ptsuccessfully withstatus=ready,model_load_ok=true,manifest_valid=true,tile_paths_exist=true,will_download_models=falseandwill_run_inference=false. - Live 48-run Geel/Mol/Turnhout QA matrix compared
geointel-building-yolov8n-tile30-ptwithyolov8s-building-segmentation-pt; best overall score was Mol with the tile model, tile640, threshold0.15, precision0.13602941176470587, recall0.09893048128342247, F10.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.pyto convert prepared operator orthophoto/GRB sample pairs into a standard local YOLO detection dataset withdataset.yaml, train/validation image folders, label folders andyolo_dataset_summary.json. - Added
scripts/train_operator_yolo_detector.shas an operator-only training smoke wrapper that uses an existing local base.ptmodel and writes a trained local.ptartifact plustraining_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-ptsuccessfully withwill_download_models=falseandwill_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-threshold0.01run produced mostly false positives with best F10.003798670465337132. yolov8s-building-segmentation-ptremains the best tested model, with best overall F10.04195804195804196on Mol at tile640, threshold0.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-segmentationas 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-ptwithwill_download_models=falseand SHA256a27af31654c6a4edbdc85581c33d93c13986b5919de7de410f8d85d801b3bb34. - YOLO preflight loaded the model locally with
model_load_ok=trueand no automatic download. - Ran a 36-run Geel/Mol/Turnhout matrix comparing
yolov8n-building-segmentation-ptandyolov8s-building-segmentation-ptacross tile sizes512/640and thresholds0.50/0.25/0.15. - Best overall score was Mol with
yolov8s-building-segmentation-pt, tile640, threshold0.15: 55 detections, 9 matches, 46 false positives, 365 false negatives, precision0.16363636363636364, recall0.02406417112299465, F10.04195804195804196. - Conclusion:
yolov8sis cleaner thanyolov8non 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.pyto prepare documented Geel, Mol and Turnhout orthophoto/GRB GBG building sample pairs as explicit runtime artifacts. - Added
scripts/run_multi_sample_detection_quality_matrix.shto run the existing real-data quality matrix for every prepared sample and combine the results. - The combined summary writes
multi_sample_quality_summary.jsonwith 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, tile512, overlap64, threshold0.15, 142 detections, 18 matches, 124 false positives, 755 false negatives and F10.03934426229508197; genericyolov8n-ptproduced zero building detections across all samples.
Sprint 126 Detection quality matrix tooling (2026-07-07)
- Added
scripts/run_detection_quality_matrix.shto 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.jsonwith detection count, QA score, precision, recall, F1, mean IoU, matches, false positives and false negatives. - The summary ranks
best_by_score,best_by_recallandbest_by_precisionfor 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-ptwith tile512, overlap64and threshold0.15ranked best by score/recall with 80 detections, 6 matches, 74 false positives, 611 false negatives and F10.017216642754662843; genericyolov8n-ptproduced zero building detections.
Sprint 125 Detection calibration evidence bundle (2026-07-07)
- Added
scripts/export_detection_calibration_evidence.shto export persisted QA evidence from a detection calibration summary. - The script writes combined
calibration_evidence.geojson,calibration_evidence_summary.jsonand a standalonecalibration_evidence_review.htmlSVG 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.shto run the existing real-data detection + QA workflow across multiple configured-YOLO confidence thresholds. - The sweep writes per-threshold logs and a
calibration_summary.jsonwith 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.15ranked best among0.50,0.35,0.25and0.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
Buildingmatch operator/domain filters such asbuilding. - 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.tiffrom the Digitaal Vlaanderen OMWRGBMRVL WMSOrtholayer.geel_grb_gbg_buildings.geojsonfrom the Digitaal Vlaanderen GRB OGC API FeaturesGBGcollection.
- Fixed raster upload metadata mapping so uploaded rasters persist canonical
bounds_json,resolution_jsonandbands_jsonfrom 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.shfor 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.mdanddocs/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.shfor 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_DIRso Docker/Unraid runtimes can expose mounted model files as selectable assets without downloading weights. - Detection runs and YOLO preflight can now accept
model_asset_idforyolo-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.pyto configure an existing local YOLO model into the Unraid/Tower.envfile 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
--applyis 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_URLas 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_featuresthrough 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_DIRdefault 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, installedtorch/ultralyticsversions and CUDA availability without running inference or downloading weights. - Added a canonical
GET /api/v1/detection/yolo/preflightendpoint 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_evidenceandfalse_negative_evidenceids 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_evidenceandfalse_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 evidencehandoff 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/Metricrows 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.tsxremains 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/deriveto 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 datasetto 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_selectionGeoJSON export support to persist bbox-selected map features as normal export artifacts. - Selection exports query persisted PostGIS
vector_features, write avector_selection_geojsonFeatureCollection and store selection bbox/count metadata in the export record. - Added
Save area exportto 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_featuresand 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 & extractpanel 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 propertiesandClear selectionactions 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.shto 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.tilemanifest 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.shto 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_idfrom 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:1202across Overview, Data, Map, QA/QC, AI Labs and Exports. - Tightened the Overview workflow guidance complete state so a fully populated flow shows
Ready for handoffinstead 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 andtabpanelmetadata. - 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.jsonas the scenario manifest while preserving the originalexpected_qa_metrics.jsonbaseline for existing demo workflow checks. - Updated
scripts/run_golden_qa_benchmark.pyto run every scenario, verify metric drift and report aggregateQualityCheck/Metricpersistence 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.pyto compare the active FastAPI route surface withdocs/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-testidanchors to the existing project, area, map, dataset, QA/QC and export controls for browser regression checks. - Added
scripts/verify_workbench_interactions.shto 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.shto 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
MapWorkspaceabove the dense workflow grid so the map is visible early in the workbench flow. - Moved
DatasetPanelinto 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.tsxintofrontend/src/hooks/useWorkbenchBootstrap.ts. App.tsxno longer imports or ownsuseEffect; 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/useStateReact imports fromfrontend/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.tsxfree 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.tsxintofrontend/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
demoApistays out ofApp.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.tsxintofrontend/src/hooks/useProjectWorkspace.ts. - Moved default clip-area selection into
useDatasetWorkflow.tsand default map-area selection intouseMapWorkspaceState.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.tsxintofrontend/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_UNSUPPORTEDresponse when/api/v1/exports/{export_id}/contentis 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;andALTER 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_MISMATCHplus the exactALTER DATABASE ... REFRESH COLLATION VERSIONacknowledgement 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-oneimage metadata. - Kept database credentials as runtime configuration through
.env, the Unraid template, Compose ordocker run -e. - Added regression coverage so
GEOINTEL_POSTGRES_PASSWORDis 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.shso the browser-facing demo/export smoke compares persisted QA/QC metrics againstfixtures/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.shas a shell wrapper for the deterministic QA/QC golden benchmark. - Made
scripts/run_readiness_check.shexecute the golden QA/QC benchmark and syntax-check the wrapper. - Hardened fixture validation so
fixtures/goldenGeoJSON 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.ymlfor a singlegeointelcontainer 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.shto start embedded PostGIS, apply Alembic migrations, start the backend and serve nginx. - Added
deploy/unraid/nginx-all-in-one.confwith localhost backend proxying inside the same container. - Added a PNG DockerMan icon and made the Unraid template name match the running
geointelcontainer. - 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.shso repo deploys automatically replace Compose-owned containers with a DockerMan-nativegeointelcontainer while preserving/migrating persisted data. - Switched Tower deploy image creation from
docker compose buildto plaindocker buildto avoid Compose metadata labels on the final DockerMan-managed container. - Updated Tower deploy scripts to install
/boot/config/plugins/dockerMan/templates-user/my-geointel.xmland/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:1202with one healthygeointelcontainer, 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
.envdefaults. - Added
deploy/unraid/geointel.env.examplefor Unraid/Tower setup. - Added
deploy/unraid/geointel-unraid-template.xmldocumenting 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.tsxwires 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
RasterControlsandVectorControls. - Added regression coverage to verify
App.tsxwires 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.tsxintouseDatasetWorkflow. - Kept project dataset listing in
App.tsxso project/area loading remains the shared workbench boundary. - Added regression coverage to verify
App.tsxstill 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.tsxintouseExportWorkflow. - Moved QA/QC comparison state and persisted quality-check loading from
App.tsxintouseQualityWorkflow. - Added regression coverage to verify
App.tsxwires 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.tsxintouseDetectionWorkflow. - Moved Segmentation Lab orchestration state and API calls from
App.tsxintouseSegmentationWorkflow. - Added shared frontend
formatErrorhelper. - Added regression coverage to verify
App.tsxwires 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-loadmode toscripts/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-loadtogether with--assume-dependenciesto 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
exportsrows/files when--applyis set and refuses file deletion outsideSTORAGE_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-detectionfor synchronous comparison of two vector datasets in the same project. - Added a
ChangeDetectionServicethat prefers persistedvector_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
DeprecationWarningpromoted 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.mdwith 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.mdandapp/beforepip install .. - Removed mandatory Compose
.envreferences sodocker compose upworks with checked-in local defaults. - Published the Docker Compose frontend on host port
1202. - Added backend CORS defaults for
http://localhost:1202andhttp://127.0.0.1:1202. - Stopped publishing PostGIS on host port
5432; backend uses Docker-internaldb: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 headbefore starting Uvicorn. - Added backend/frontend
.dockerignorefiles 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
/apiand/health, with Docker routing tohttp://backend:8000. - Added a browser runtime verification script that fails when the frontend
/apiproxy 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_PATHandYOLO_MAX_TILES. - Replaced the Docker frontend runtime with an nginx-served production build and explicit
/apiplus/healthreverse 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/python3fallback 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
NaNinvalid handling. - Stored index-derived dataset provenance metadata:
source_dataset_idoperation(raster.ndvi,raster.ndwi,raster.ndbi)band_mappingformulaoutput_dtypenodata_strategyvalue_range_notecreated_atoutput_dataset_idpath
- Extended dataset detail UI with spectral index controls and result dataset actions.
- Updated:
docs/API_CONTRACTS.mddocs/RASTER_OPERATIONS_SPEC.mdbackend/README.mdfrontend/README.mddocs/CODEX_EXECUTION_LOG.md
Sprint 7A persistence and QA foundation (2026-06-12)
- Added
vector_featuresas first-class queryable vector state while preserving original uploaded files as source artifacts. - Added
quality_checksandmetricsas persisted QA/QC domain records. - Added Alembic migration
202606120700_sprint7a_persistence_foundation.pyfor 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_configuredcapability 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,manualandfixture. - Added provider capability, layer, status and future import-contract endpoints using the existing API envelope style.
- Kept GRB and OSM as explicit
not_configuredproviders with no live WFS, Overpass or download behavior. - Added provider-to-dataset mapping rules for future imports through
DatasetServiceandVectorFeatureService. - 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
detectionsas first-class persisted PostGIS records linked to project, dataset, job and analysis run. - Hardened
analysis_runswith dataset/job/model/result metadata for future detection and segmentation workflows. - Added model registry capabilities for
yolo-placeholderandmanual-fixture-detector. - Added Detection Lab service and API foundation with dependency-aware
DETECTION_MODEL_UNAVAILABLEresponses. - 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
aibackend dependency group for Ultralytics/Torch without making AI dependencies mandatory for normal startup. - Added
yolo-configuredmodel registry capability withnot_configured,dependency_unavailableandconfiguredstatus 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_featuresusing existingquality_checksandmetrics. - 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
segmentationsas 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-placeholderfixture-segmenteryolo-seg-configuredsam-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_featuresusing existingquality_checksandmetrics. - 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.tsxinto 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.shsyntax 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.shso fresh databases run Alembic migrations before checkingPostGIS_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_URLand 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.pyto run existing QA/QC logic against the golden fixtures and fail on metric drift. - Added backend tests covering expected golden metrics and
QualityCheck/Metricpersistence 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
YoloPreflightServicefor local configured-YOLO readiness checks without loading models or running inference. - Added
scripts/yolo_preflight.pyfor 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
gisoptional dependency group for the approved raster/vector runtime stack. - Updated the backend Docker image to install the
gisextra plus GDAL/GEOS/PROJ system packages. - Added
scripts/verify_gis_runtime.shto verify browser-facing PostGIS, Rasterio and GeoPandas capabilities through the frontend proxy. - Added
scripts/gis_import_smoke.pyand 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/workflowto 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.pyfor 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-checksto 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/geojsonso exports persistExportrows 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.shto 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-deletesafety cap. - Added repeated
--export-typefilters so operators can clean only selected artifact kinds. - Cleanup apply runs now report a
blocked_reasoninstead of deleting when selected candidates exceed the cap. - Dry-run output now includes
candidate_exportswith 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.shto 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.mdandbackend/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.shfor 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.jsonunder 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
ApiErrorcontract: top-levelerror,message,detailsandrequest_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_htmlexport 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
openDatasetInMapflow 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.geojsonas 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-ptin 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.6380and safest current threshold behavior around0.25. - Kept the model inactive by default because the
kasterlee_boshard-negative sample still produced 10 detections at threshold0.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.25as 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.25starting 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_inferencestate. - 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-expanded160as 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 Toweryolo-building-tile-uniquehardneg160dataset as the next training candidate. - Fixed the YOLO preflight CLI so it respects environment-provided runtime configuration instead of reporting
not_configuredunless 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.