1557 lines
131 KiB
Markdown
1557 lines
131 KiB
Markdown
# 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 160 Split-background promotion preflight (2026-07-10)
|
|
|
|
- Added `--preflight-only` to `scripts/run_split_background_promotion_workflow.sh`.
|
|
- Preflight validates local positive portfolio and operator manifest files, confirms required `pure_empty_negative` and `sparse_building_context` background categories, checks Python/curl availability and verifies the runtime API proxy returns the canonical envelope.
|
|
- Documented the quick post-redeploy preflight command before starting long configured-YOLO matrix inference.
|
|
- No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.
|
|
|
|
## Sprint 159 Split-background promotion workflow wrapper (2026-07-10)
|
|
|
|
- Added `scripts/run_split_background_promotion_workflow.sh` to run the split background matrix and split-aware promotion report from one operator command.
|
|
- Added readiness syntax coverage and regression tests for the wrapper contract.
|
|
- Documented the one-command Tower/runtime flow for the inactive AOI1024 background-aware model candidate.
|
|
- No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.
|
|
|
|
## Sprint 158 Split-aware promotion report (2026-07-10)
|
|
|
|
- Added `--background-split-summary` support to `scripts/build_detection_model_promotion_report.py`.
|
|
- The promotion report now resolves the split summary's `pure_empty_negative` source as the strict default-promotion background gate and records `sparse_building_context` as review-only evidence.
|
|
- Added regression coverage proving sparse-context detections do not block default promotion when the pure-empty gate passes.
|
|
- No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.
|
|
|
|
## Sprint 157 Background split matrix runner (2026-07-10)
|
|
|
|
- Added `scripts/run_background_corpus_split_matrix.sh` to run pure-empty and sparse-context hard-negative matrices separately from one operator command.
|
|
- Added `scripts/build_background_corpus_split_report.py` to combine both hard-negative summaries into `background_corpus_split_summary.json` and `.md`.
|
|
- Added readiness coverage and tests for the split runner/report contract.
|
|
- No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.
|
|
|
|
## Sprint 156 Background corpus classification (2026-07-10)
|
|
|
|
- Added explicit operator background categories to prepared sample manifests: `pure_empty_negative` when GRB returns zero reference buildings and `sparse_building_context` when contextual GRB buildings are present.
|
|
- Added `OPERATOR_BACKGROUND_CATEGORIES` to `scripts/run_operator_hard_negative_detection_matrix.sh` so strict default-promotion false-positive gates can run on pure-empty negatives separately from sparse-context review samples.
|
|
- Preserved `background_category` in exported YOLO tile metadata for training auditability.
|
|
- No model default, backend API, database migration, provider fetching, fake detection output or model download behavior changed.
|
|
|
|
## Sprint 155 Detection operator profiles (2026-07-09)
|
|
|
|
- Added explicit Detection Lab operator profiles for the inactive `geointel-building-yolov8s-aoi1024bg512r3e50-pt` local model asset.
|
|
- Added a balanced review profile at confidence threshold `0.15` and a conservative review profile at `0.35`, with persisted gate metrics shown in the UI.
|
|
- Kept both profiles clearly marked as candidate-only and not default-approved because the promotion recommendation remains `none` and background false-positive pressure still blocks automatic activation.
|
|
- No model download behavior, API contract, migration, provider fetching, fake detection output or active runtime default changed.
|
|
|
|
## Sprint 154 Background-aware AOI1024 YOLOv8s candidate gate (2026-07-09)
|
|
|
|
- Exported and audited background-aware AOI1024 training dataset `/app/storage/operator-data/yolo-building-aoi1024-bgaware512r3`; the audit passed with 162 tiles, 117 positive tiles, 45 negative tiles, 21,530 labels and no warnings.
|
|
- Trained inactive local model asset `geointel-building-yolov8s-aoi1024bg512r3e50-pt` from the background-aware dataset. The Tower catalog reports SHA256 `e0980572aac90e7efc514608eb16d7de5bfbf27a4bbec04e7bc1bc8c02f9601f`, `status=available`, `active=false` and `will_download_models=false`.
|
|
- Ultralytics validation for the completed 50-epoch CPU run ended at approximately precision `0.440`, recall `0.362`, mAP50 `0.251` and mAP50-95 `0.0878`.
|
|
- Ran the seven-reference AOI1024 persisted QA matrix at tile `512`, overlap `64` and thresholds `0.25`, `0.15` and `0.05`. Mean positive F1 improved to `0.4908049127242224` at threshold `0.05`, `0.5074022485589402` at `0.15` and `0.44378879337957716` at `0.25`.
|
|
- Ran an additional conservative-threshold positive matrix at thresholds `0.35`, `0.45` and `0.60`. Threshold `0.35` produced mean F1 `0.32086574003576274`, mean precision `0.840006` and mean recall `0.202135`.
|
|
- Ran full hard-negative/background matrices. The candidate still fails automatic default promotion because mixed background-candidate AOIs keep false-positive pressure: max detections were `184` at threshold `0.05`, `103` at `0.15`, `75` at `0.25`, `55` at `0.35`, `38` at `0.45` and `18` at `0.60`.
|
|
- Generated promotion reports at `artifacts/detection-model-promotion/aoi1024bg512r3e50-full/detection_model_promotion_report.md` and `artifacts/detection-model-promotion/aoi1024bg512r3e50-high-threshold/detection_model_promotion_report.md`; recommendation remains `none`.
|
|
- No API contract, migration, provider fetching, fake detection data, model download behavior or active model default changed.
|
|
|
|
## Sprint 153 AOI1024 clean-label YOLOv8s candidate gate (2026-07-09)
|
|
|
|
- Audited AOI1024 label-quality variants after paged GRB reference regeneration and selected `/app/storage/operator-data/yolo-building-aoi1024-visible050-minpx8` for training because it passed the dataset audit while keeping the 512px runtime scale.
|
|
- Trained inactive local model asset `geointel-building-yolov8s-aoi1024clean512e50-pt` from the cleaned 512px tile dataset. The Tower catalog reports SHA256 `7cfadb684dd56623d2e35ebd65593211d3051908c87121bef438b231d3e47cce`, `status=available`, `active=false` and `will_download_models=false`.
|
|
- Ultralytics validation for the completed 50-epoch CPU run ended at approximately precision `0.441`, recall `0.380`, mAP50 `0.265` and mAP50-95 `0.096`.
|
|
- Ran the full seven-reference AOI1024 persisted QA matrix at tile `512`, overlap `64` and thresholds `0.25`, `0.15` and `0.05`. Mean positive F1 improved materially: `0.4723513253430784` at threshold `0.05`, `0.4753322215541376` at `0.15` and `0.31021575247724875` at `0.25`.
|
|
- Ran the full nine-sample hard-negative/background matrix. Background false-positive pressure still blocks default promotion: max detections were `137` at threshold `0.05`, `75` at `0.15` and `55` at `0.25`.
|
|
- Generated the promotion report at `artifacts/detection-model-promotion/aoi1024clean512e50-full/detection_model_promotion_report.md`; recommendation remains `none` because every threshold fails `background_false_positive_pressure`.
|
|
- No API contract, migration, provider fetching, fake detection data, model download behavior or active model default changed.
|
|
|
|
## Sprint 152 GRB reference paging for operator samples (2026-07-09)
|
|
|
|
- Fixed the operator real-data sample preparer so GRB GBG reference GeoJSON is fetched through OGC API `rel=next` pagination links instead of stopping at the first `limit=1000` page.
|
|
- Added `--reference-page-limit` / `OPERATOR_GRB_PAGE_LIMIT` and `--reference-max-features` / `OPERATOR_GRB_MAX_FEATURES` safeguards for dense reference AOIs.
|
|
- Generated reference GeoJSON now records fetched page URLs, page count, truncation state and paging limits for auditability.
|
|
- Added regression coverage for paged GRB responses and the new CLI help options.
|
|
- Redeployed Tower, regenerated AOI1024 operator samples with paged GRB references and re-exported `yolo-building-aoi1024-visible025`; dense reference counts now exceed the old cap where expected, including Geel 2,268, Mol 1,993, Turnhout 3,278, Herentals 2,478, Balen 1,343, Retie 1,734 and Westerlo 1,133 features.
|
|
- The refreshed AOI1024 tile dataset now has 29,170 labels with 0 missing label files and 0 invalid rows; audit status remains `needs_attention` because small-box share is still high.
|
|
- No application provider endpoint, migration, API contract, live GRB product import, model download or active YOLO model changed.
|
|
|
|
## Sprint 151 runtime GIS upload and AOI1024 YOLO candidate (2026-07-09)
|
|
|
|
- Fixed the operator YOLO training wrapper so the all-in-one runtime defaults to `/opt/geointel/venv/bin/python` when present, while still falling back to `python3` for local shells.
|
|
- Raised the Nginx upload limit to `250m` in both the compose frontend proxy and Unraid all-in-one proxy after a live 1024px GeoTIFF QA upload hit `413 Request Entity Too Large`.
|
|
- Raised Nginx proxy read/send timeouts to `600s` after a long low-threshold persisted YOLO/QA run hit `504 Gateway Timeout`.
|
|
- Hardened `build_detection_model_promotion_report.py` so it correctly accepts both calibration evidence portfolios and multi-sample quality summaries as positive evidence inputs.
|
|
- Prepared a larger Tower operator sample manifest at `/app/storage/operator-data/operator-samples-1024` using explicit `1024x1024` rasters and doubled AOI half-size.
|
|
- Exported and audited `/app/storage/operator-data/yolo-building-aoi1024-visible025`: 144 tiles, 117 positive tiles, 27 negative tiles, 15,079 labels and `min_label_visible_ratio=0.25`; audit remains `needs_attention` because median label area is still below gate.
|
|
- Trained inactive local model asset `geointel-building-yolov8s-aoi1024visible025e50-pt` from the AOI1024 dataset. Ultralytics validation ended at approximately precision `0.275`, recall `0.331`, mAP50 `0.188` and mAP50-95 `0.0716`.
|
|
- Redeployed Tower and verified the previously failing Geel low-threshold persisted YOLO/QA path now completes instead of returning `504`; the run produced F1 `0.09136212624584718`, so the model remains rejected for default use.
|
|
- Ran the full four-sample AOI1024 positive matrix and nine-sample hard-negative matrix. Best positive result was Westerlo threshold `0.15` with F1 `0.28703703703703703`; background pressure still reached 59 detections at threshold `0.25`, 107 at `0.15` and 226 at `0.05`.
|
|
- Generated the AOI1024 promotion report after the parser fix; recommended candidate remains `none`. Mean positive F1 stayed below gate for all thresholds: `0.13307746028311157` at `0.05`, `0.13900227809255514` at `0.15` and `0.09694707724016788` at `0.25`.
|
|
- The candidate remains inactive and must pass persisted detection QA/QC plus background/hard-negative promotion gates before default activation.
|
|
- No API contract, migration, product feature, provider fetching, fake detection data or active model default changed.
|
|
|
|
## Sprint 150 YOLO label visible-ratio gate (2026-07-09)
|
|
|
|
- Added `--min-label-visible-ratio` / `OPERATOR_YOLO_MIN_LABEL_VISIBLE_RATIO` to the operator YOLO tile dataset exporter.
|
|
- The exporter can now drop clipped building labels where only a small share of the original object bbox is visible in an overlapping tile.
|
|
- Tile dataset summaries and audit reports now retain/report `min_label_visible_ratio`.
|
|
- Added operator-only `--width`, `--height` and `--half-size-scale` options to `prepare_operator_real_data_samples.py` so larger training AOIs can be prepared explicitly.
|
|
- Updated operator documentation for the recommended next dataset pass.
|
|
- No model was activated, no detections were faked, no provider fetching was introduced and no migration changed.
|
|
|
|
## Sprint 149 YOLO duplicate suppression evidence (2026-07-09)
|
|
|
|
- Added configured-YOLO cross-tile duplicate suppression before `Detection` rows are persisted.
|
|
- Added `YOLO_DUPLICATE_IOU_THRESHOLD` with default `0.5`; `0` disables the GeoIntel-side pass for debugging.
|
|
- Detection run result metadata now records raw candidate count, suppressed duplicate count and duplicate IoU threshold.
|
|
- Calibration and quality matrix scripts now fetch detection run details and include raw/suppressed counts in summaries.
|
|
- Updated Docker/Unraid env examples, API/AI/backend docs and detection pipeline notes.
|
|
- Redeployed Tower and reran Westerlo/Turnhout dense-AOI sweeps; duplicate suppression improved F1 but the AOI512 YOLOv8s candidate remains rejected for default use.
|
|
- No model was activated, no detections were faked, and no migration changed.
|
|
|
|
## Sprint 148 YOLO max-detection cap hardening (2026-07-09)
|
|
|
|
- Added `YOLO_MAX_DETECTIONS` with default `1000` and forward it to Ultralytics as `max_det`.
|
|
- Wired the setting through `.env.example`, Docker Compose, Unraid env examples and the Dockerman run script.
|
|
- Documented why dense building AOIs should not inherit the Ultralytics default cap of 300 detections before persisted QA/QC.
|
|
- Added regression coverage for adapter forwarding and Docker/Unraid runtime exposure.
|
|
- Redeployed the Tower all-in-one runtime and verified live dense-AOI sweeps can exceed 300 persisted detection candidates: Westerlo reached 523/1000 detections and Turnhout reached 822/1000 at tested thresholds.
|
|
- The current AOI512 YOLOv8s candidate remains rejected for default use because persisted QA/QC F1 remains too low despite the runtime cap fix.
|
|
- No model was activated, no detections were faked, and no API route or migration changed.
|
|
|
|
## Sprint 147 AOI512 YOLOv8s scale-match candidate gate (2026-07-09)
|
|
|
|
- Built and audited an AOI-scale YOLO dataset at `512px` tile size to test whether the previous `160px` training scale was the main quality blocker.
|
|
- Trained Tower-local model asset `geointel-building-yolov8s-aoi512e80-pt` from `/app/storage/operator-data/yolo-building-aoi512-uniquehardneg`.
|
|
- Ran 7 positive AOI sweeps, a 17,156-feature evidence portfolio, a 9-sample hard-negative/background matrix and a promotion report.
|
|
- Result: the candidate is rejected. The best threshold `0.25` reached mean positive F1 `0.13511851520077328` and still produced max background detections `56`.
|
|
- Conclusion: scale-match training helps the training validation curve but does not solve operational persisted QA/QC quality. The next model pass needs better positive AOI coverage and label strategy, not only more epochs or another threshold.
|
|
- No API contract, migration, frontend behavior, provider fetching, model download or active model configuration changed.
|
|
|
|
## Sprint 146 Unique hard-negative YOLOv8s candidate gate (2026-07-09)
|
|
|
|
- Fixed the all-in-one Docker image so the operator YOLO training wrapper is available at `/app/scripts/train_operator_yolo_detector.sh`.
|
|
- Trained the Tower-local `geointel-building-yolov8s-uniquehardneg160e50-pt` candidate from the `yolo-building-tile-uniquehardneg160` dataset and preserved it as an explicit local model asset.
|
|
- Ran 7 positive AOI calibration sweeps, a 17,008-feature evidence portfolio, a 9-sample hard-negative/background matrix and a promotion report.
|
|
- Result: the candidate is rejected. Mean positive F1 remains around `0.16` and background false-positive pressure reaches `58` detections at threshold `0.25`, `85` at `0.15` and `172` at `0.05`.
|
|
- Hardened the operator promotion report so older positive evidence portfolios can be compared with explicit positive tile-size/overlap defaults.
|
|
- No API contract, migration, frontend behavior, model download, provider-fetching behavior or active model configuration changed.
|
|
|
|
## Sprint 145 YOLOv8s hardneg r8 e60 full candidate evaluation (2026-07-08)
|
|
|
|
- Completed the Tower-local YOLOv8s hard-negative r8 training run through 60 CPU epochs and published local model asset `geointel-building-yolov8s-hardneg160r8e60-pt`.
|
|
- Ran the full 7-AOI positive matrix, hard-negative matrix, evidence portfolio and promotion report for the completed e60 artifact.
|
|
- Result: the model is rejected. It reduces Kasterlee-bos background detections versus `expanded160e50` at threshold `0.15` (`11` versus `46`), but mean positive F1 remains too low (`0.07870592446136859` at threshold `0.15`).
|
|
- No backend API, migration, frontend runtime, model download, provider-fetching behavior or active model configuration changed.
|
|
|
|
## Sprint 144 YOLOv8s hardneg r8 partial candidate evaluation (2026-07-08)
|
|
|
|
- Started a Tower-local YOLOv8s training run on the `yolo-building-tile-hardneg160r8` dataset with requested 60 epochs.
|
|
- Preserved the 12-epoch `best.pt` artifact as explicit partial model asset `geointel-building-yolov8s-hardneg160r8e12partial-pt` after the CPU training command reached the 1-hour command limit.
|
|
- Ran the partial candidate through the 7-AOI positive matrix, hard-negative matrix, evidence portfolio and promotion report.
|
|
- Result: the partial candidate is rejected. Best positive F1 was Westerlo at `0.14826498422712936`, mean positive F1 at threshold `0.05` was `0.05026994383963278`, and Kasterlee-bos still produced 18 detections at threshold `0.05`.
|
|
- No backend API, migration, frontend runtime, model download, provider-fetching behavior or active model configuration changed.
|
|
|
|
## Sprint 143 Detection model promotion decision report (2026-07-08)
|
|
|
|
- Added `scripts/build_detection_model_promotion_report.py` for operator-only model promotion review.
|
|
- The report combines positive-AOI calibration evidence portfolios with hard-negative/background matrix summaries.
|
|
- Candidate decisions are grouped by model asset, tile size, overlap and threshold, then gated by positive sample count, background sample count, mean F1 and maximum background detections per sample.
|
|
- Added regression coverage for promoting a clean candidate and rejecting a candidate with background false-positive pressure.
|
|
- Ran the report on Tower against the regenerated 7-AOI positive portfolio and live hard-negative summaries; it evaluated 15 candidates and recommended none for default promotion.
|
|
- No backend API, migration, frontend runtime, model weight, model download, inference or provider-fetching behavior changed.
|
|
|
|
## Sprint 141 Expanded positive-AOI matrix and portfolio metadata hardening (2026-07-08)
|
|
|
|
- Ran a fresh Tower quality matrix for Balen, Herentals and Westerlo using `geointel-building-yolov8n-expanded160e50-pt` and `geointel-building-yolov8n-hardneg160r8e40-pt`.
|
|
- Assembled an expanded 7-AOI positive evidence portfolio across Geel, Mol, Turnhout, Retie, Balen, Herentals and Westerlo.
|
|
- Hardened calibration evidence exports so model asset id, model request, tile size and tile overlap survive into evidence bundle summaries and GeoJSON properties.
|
|
- Result: expanded160e50 is stronger on positive AOIs, with Westerlo reaching F1 `0.3659305993690852`, but hard-negative matrices still show false-positive pressure tradeoffs that prevent blind default promotion.
|
|
- No backend API, migration, frontend runtime, model weight, provider fetching or Docker runtime change was introduced.
|
|
|
|
## Sprint 140 Live multi-AOI calibration portfolio run (2026-07-08)
|
|
|
|
- Ran the new multi-AOI calibration evidence portfolio assembler on Tower against existing persisted quality-matrix summaries for Geel, Mol and Turnhout.
|
|
- Produced a real operator handoff under `/mnt/user/appdata/geointel/artifacts/detection-calibration-portfolio/live-20260708/output/` with portfolio JSON, Markdown and per-AOI evidence GeoJSON/HTML review artifacts.
|
|
- Portfolio evidence contains 5,509 persisted QA evidence features across 3 AOIs: 5,239 false negatives, 164 false positives, 53 matched detections and 53 matched references.
|
|
- Result: the evidence pipeline works, but the evaluated model/threshold set should not be promoted because recall remains very low across the AOIs.
|
|
- No app rebuild, API change, migration, inference rerun, model training, model download, provider fetch or frontend runtime change was introduced.
|
|
|
|
## Sprint 139 Multi-AOI calibration evidence portfolio (2026-07-08)
|
|
|
|
- Added `scripts/assemble_detection_calibration_evidence_portfolio.sh` to package multiple AOI calibration summaries and their persisted QA evidence bundles into one model-review portfolio.
|
|
- The assembler copies each summary into a sample folder, runs the existing evidence exporter per AOI and writes `calibration_evidence_portfolio.json` plus `calibration_evidence_portfolio.md`.
|
|
- Added readiness syntax coverage and a mocked-endpoint regression test for the portfolio convention.
|
|
- No backend API, migration, inference, provider fetching, model download, live data mutation or frontend runtime behavior changed.
|
|
|
|
## Sprint 138 Browser calibration evidence bundle smoke (2026-07-08)
|
|
|
|
- Added `scripts/smoke_detection_calibration_evidence_bundle.sh` to exercise the browser `detection-calibration-summary.json` -> QA evidence bundle path locally.
|
|
- The smoke uses mocked canonical QA evidence endpoint responses, runs the real `export_detection_calibration_evidence.sh` script and verifies the emitted GeoJSON, summary JSON and HTML review artifacts.
|
|
- Added readiness syntax coverage and regression coverage for the smoke.
|
|
- No backend API, migration, inference, provider fetching, model download, live data mutation or frontend runtime behavior changed.
|
|
|
|
## Sprint 137 Browser calibration summary evidence bundle handoff (2026-07-08)
|
|
|
|
- Extended `scripts/export_detection_calibration_evidence.sh` so it accepts Detection Lab `detection-calibration-summary.json` browser exports in addition to the older operator calibration summary format.
|
|
- Added summary normalization for browser-exported `rows`, root `project_id`, persisted `quality_check_id` values and best-mode fallback selection.
|
|
- Updated operator docs with the direct browser summary command.
|
|
- No backend API, migration, inference, provider fetching, model download or frontend runtime behavior changed.
|
|
|
|
## Sprint 136 Guided calibration summary export (2026-07-08)
|
|
|
|
- Added a Detection Lab `Download calibration summary` action for guided calibration rows.
|
|
- The exported JSON includes thresholds, persisted analysis run IDs, job IDs, quality check IDs, metrics and evidence GeoJSON URLs for successful rows.
|
|
- Reused browser-side JSON download behavior only; no backend endpoint, API contract, migration, model, provider or inference behavior changed.
|
|
- Added regression coverage for the summary export wiring.
|
|
|
|
## Sprint 135 Calibration evidence handoff (2026-07-08)
|
|
|
|
- Added a guided-calibration table action that opens the persisted QA/QC evidence map for successful threshold rows.
|
|
- Reused the existing quality-check evidence API and Map workspace overlay flow; no backend route, migration, model, provider or inference behavior changed.
|
|
- Kept unsuccessful/queued calibration rows read-only by disabling evidence actions until a persisted `quality_check_id` exists.
|
|
- Added regression coverage for the Detection Lab wiring and TODO tracking.
|
|
|
|
## Sprint 134 External remote-sensing YOLO candidate benchmark (2026-07-07)
|
|
|
|
- Evaluated the Hugging Face `agademer/yolo-remote-sensing-photovoltaic` YOLOv8l detection checkpoint as an explicit operator-provided runtime model asset.
|
|
- Downloaded `yolo-remote-sensing-photovoltaic-v8l-solar-farms-and-cities-v20260331-detect-1000_epochs.pt` to the Tower runtime as `/app/models/yolo-remote-sensing-photovoltaic-v8l-detect-1000.pt`; the model file is not committed to Git.
|
|
- The model catalog exposes it as `yolo-remote-sensing-photovoltaic-v8l-detect-1000-pt` with SHA256 `242ff4ab889569278f0eb9fcd22eb2c4bf2a52e48d05d89cc7cfa7941165d203`.
|
|
- Live YOLO preflight loaded the model successfully with `status=ready`, `model_load_ok=true`, `manifest_valid=true`, `tile_paths_exist=true`, `will_download_models=false` and `will_run_inference=false`.
|
|
- Live 45-run dense QA matrix compared the external YOLOv8l candidate with `geointel-building-yolov8n-expanded160e50-pt` and `geointel-building-yolov8n-hardneg160r8e40-pt` across Geel, Mol, Turnhout, Retie and Kasterlee-bos.
|
|
- Result: the external candidate was very conservative and missed most dense GRB buildings. It scored F1 `0.0` on Geel, `0.010582010582010581` on Mol, `0.019070321811680575` on Turnhout and `0.0` on Retie, while expanded160e50 remained the dense-AOI winner.
|
|
- Live 27-run background matrix showed the external candidate was cleaner on Kasterlee-bos than local YOLOv8n candidates, with 1/2/5 detections at thresholds `0.25`/`0.15`/`0.05`, but it leaked 0/1/3 detections on Postel-bos and was therefore not uniformly cleaner than hardneg160r8e40.
|
|
- Decision: keep the model as runtime evidence only. It should not become the V1 default because recall is too low for operational extraction. The next pass should train a higher-capacity local model, starting from a stronger base and using the existing dense plus hard-negative benchmark gates.
|
|
- No API contract change, provider fetching, fake detections, model auto-provisioning, repository-stored weights or app-side model training behavior was introduced.
|
|
|
|
## Sprint 133 Hard-negative-balanced YOLO candidate (2026-07-07)
|
|
|
|
- Added `--background-negative-repeat` / `OPERATOR_YOLO_BACKGROUND_NEGATIVE_REPEAT` support to `scripts/export_operator_yolo_tile_dataset.py` so train-split background-candidate negative tiles can be repeated deterministically without duplicating validation tiles.
|
|
- Added exported tile provenance fields `sample_role`, `repeat_index` and `is_repeated_background_negative` plus regression coverage in `backend/tests/test_sprint130_operator_yolo_tile_dataset.py`.
|
|
- Live Tower export produced `/app/storage/operator-data/yolo-building-tile-hardneg160r8` with tile size `160`, stride `80`, background repeat `8`, 864 tiles, 260 positive tiles, 604 negative tiles, 11213 labels, 756 train tiles and 108 validation tiles.
|
|
- Live Tower 40-epoch CPU training produced `/app/models/geointel-building-yolov8n-hardneg160r8e40.pt`; the model catalog exposes it as `geointel-building-yolov8n-hardneg160r8e40-pt` with SHA256 `7a77bd9f68e4c3927ffc8a8cd978a81067b02f42cffe77ada5334b5f8dbb6b50`.
|
|
- Live YOLO preflight loaded the model successfully with `status=ready`, `model_load_ok=true`, `manifest_valid=true`, `tile_paths_exist=true`, `will_download_models=false` and `will_run_inference=false`.
|
|
- Live 60-run dense QA matrix showed `geointel-building-yolov8n-expanded160e50-pt` remains the better dense-AOI candidate; hardneg160r8e40 underperformed it on Geel, Mol, Turnhout and Retie.
|
|
- Live 36-run background matrix showed hardneg160r8e40 materially reduced false-positive pressure: Kasterlee-bos dropped from expanded160e50's 38/46/76 detections to 5/9/25 at thresholds `0.25`/`0.15`/`0.05`, and Postel-bos/Lommel-heide stayed at 0 detections across all thresholds.
|
|
- Decision: hardneg160r8e40 is useful evidence for a low-false-positive training direction, but it should not become the V1 default because dense-AOI recall/F1 regressed. The next model pass should combine stronger positive coverage with hard-negative balancing or test a stronger aerial-building architecture.
|
|
- No Training Studio UI, API contract change, provider fetching, model auto-provisioning, fake detections or app-side model training behavior was introduced.
|
|
|
|
## Sprint 132 Operator hard-negative detection matrix (2026-07-07)
|
|
|
|
- Added `scripts/run_operator_hard_negative_detection_matrix.sh` to score configured-YOLO false-positive pressure on documented background-candidate operator AOIs without uploading reference vectors or running QA/QC.
|
|
- Added readiness shell-syntax coverage and regression coverage in `backend/tests/test_sprint132_operator_hard_negative_matrix.py`.
|
|
- Live Tower 27-run hard-negative matrix compared `geointel-building-yolov8n-expanded160e50-pt`, `geointel-building-yolov8n-tile30-pt` and `yolov8s-building-segmentation-pt` on Postel-bos, Lommel-heide and Kasterlee-bos at thresholds `0.25`/`0.15`/`0.05`.
|
|
- Result: `geointel-building-yolov8n-expanded160e50-pt` produced 0 detections on Postel-bos and Lommel-heide at thresholds `0.25` and `0.15`, but produced 38/46/76 detections on Kasterlee-bos at thresholds `0.25`/`0.15`/`0.05`.
|
|
- Decision: the expanded local model remains the best dense-AOI candidate, but Kasterlee-bos false-positive pressure blocks it from becoming a V1 default. The next model pass must train against stronger hard-negative coverage or tune per-model threshold/max-detection policy.
|
|
- No QA metrics were faked; background scoring is detection-count based only. No provider fetching, fixture detections, model downloads, API contract changes or app-side training behavior were introduced.
|
|
|
|
## Sprint 131 Operator sample expansion and negative-tile YOLO candidate (2026-07-07)
|
|
|
|
- Expanded `scripts/prepare_operator_real_data_samples.py` from the original Geel/Mol/Turnhout corpus to 7 reference AOIs plus 3 background-candidate AOIs.
|
|
- Added `sample_role` and `allow_empty_reference` metadata so deliberate background candidates can be prepared without weakening the empty-GRB guard for normal reference samples.
|
|
- Added regression coverage in `backend/tests/test_sprint131_operator_sample_expansion.py` for the expanded sample registry, empty-reference background candidates and normal reference-sample rejection.
|
|
- Live Tower preparation produced 10 operator samples: Geel, Mol, Turnhout, Herentals, Balen, Retie, Westerlo, Postel-bos, Lommel-heide and Kasterlee-bos.
|
|
- Live Tower tile export produced `/app/storage/operator-data/yolo-building-tile-expanded160` with 360 tiles, 260 positive tiles, 100 negative tiles and 11213 clipped building labels.
|
|
- Live Tower 50-epoch CPU training produced `/app/models/geointel-building-yolov8n-expanded160e50.pt`; the model catalog exposes it as `geointel-building-yolov8n-expanded160e50-pt` with SHA256 `bf6a5e8d25a62d784ee53764ea11d7ce89c4e7aeeac7588010e497b8d7dafb2b`.
|
|
- Live YOLO preflight loaded `geointel-building-yolov8n-expanded160e50-pt` successfully with `status=ready`, `model_load_ok=true`, `manifest_valid=true`, `tile_paths_exist=true`, `will_download_models=false` and `will_run_inference=false`.
|
|
- Live 45-run Geel/Mol/Turnhout/Retie/Kasterlee-bos QA matrix showed the expanded model is the best current candidate on dense building AOIs: best overall score was Geel at tile `640`, threshold `0.05`, precision `0.30333333333333334`, recall `0.14748784440842788`, F1 `0.1984732824427481`.
|
|
- Hard-negative finding: on the sparse Kasterlee-bos sample, `yolov8s-building-segmentation-pt` remained cleaner, while the expanded local model produced too many false positives. The model is therefore improved but still experimental, not a V1 default.
|
|
- No Training Studio UI, API contract change, provider fetching, model auto-provisioning, fake detections or app-side model training behavior was introduced.
|
|
|
|
## Sprint 130 Operator YOLO tile-level dataset tooling (2026-07-07)
|
|
|
|
- Added `scripts/export_operator_yolo_tile_dataset.py` to convert prepared operator samples into overlapping YOLO tile datasets with clipped building labels and deterministic negative tile retention.
|
|
- Added readiness coverage for the tile exporter Python compile check.
|
|
- Added regression coverage in `backend/tests/test_sprint130_operator_yolo_tile_dataset.py` for script contract, help behavior without GIS imports, edge-covering tile windows and deterministic negative-tile selection.
|
|
- Updated operator documentation for tile-level dataset export and reuse of the existing local training wrapper.
|
|
- Live Tower tile export produced `/app/storage/operator-data/yolo-building-tile-dataset` with 75 overlapping tiles and 5321 clipped building labels from the Geel/Mol/Turnhout operator samples.
|
|
- Live Tower 30-epoch CPU training produced `/app/models/geointel-building-yolov8n-tile30.pt`; the model catalog exposes it as `geointel-building-yolov8n-tile30-pt` with SHA256 `b9e228202500d7c85836d12a72e320f4f2f0cef24cbb1b5bf7fa78a6778390af`.
|
|
- Live YOLO preflight loaded `geointel-building-yolov8n-tile30-pt` successfully with `status=ready`, `model_load_ok=true`, `manifest_valid=true`, `tile_paths_exist=true`, `will_download_models=false` and `will_run_inference=false`.
|
|
- Live 48-run Geel/Mol/Turnhout QA matrix compared `geointel-building-yolov8n-tile30-pt` with `yolov8s-building-segmentation-pt`; best overall score was Mol with the tile model, tile `640`, threshold `0.15`, precision `0.13602941176470587`, recall `0.09893048128342247`, F1 `0.11455108359133127`.
|
|
- Result decision: the tile-trained local model is now the best tested candidate on Geel/Mol and best overall, but remains experimental and should not become the V1 default until more AOIs and negative/background samples materially improve recall and false-positive behavior.
|
|
- No Training Studio UI, API contract change, provider fetching, model auto-provisioning or app-side model training behavior was introduced.
|
|
|
|
## Sprint 129 Operator YOLO training dataset tooling (2026-07-07)
|
|
|
|
- Added `scripts/export_operator_yolo_dataset.py` to convert prepared operator orthophoto/GRB sample pairs into a standard local YOLO detection dataset with `dataset.yaml`, train/validation image folders, label folders and `yolo_dataset_summary.json`.
|
|
- Added `scripts/train_operator_yolo_detector.sh` as an operator-only training smoke wrapper that uses an existing local base `.pt` model and writes a trained local `.pt` artifact plus `training_summary.json`.
|
|
- Disabled Ultralytics plot generation in the training wrapper so the smoke path avoids auxiliary plot/font network behavior.
|
|
- Added readiness coverage for the exporter Python compile check and training wrapper shell syntax.
|
|
- Added regression coverage in `backend/tests/test_sprint129_operator_yolo_training_dataset.py`.
|
|
- Updated operator documentation for dataset export, training smoke usage and the requirement to benchmark any trained model through the existing real-data Detection + QA matrix before treating it as useful.
|
|
- Live Tower export produced a YOLO dataset with 3 operator samples and 1427 labels; a clean 8-epoch CPU training smoke produced `/app/models/geointel-building-yolov8n-operator8.pt`.
|
|
- Live preflight loaded `geointel-building-yolov8n-operator8-pt` successfully with `will_download_models=false` and `will_run_inference=false`.
|
|
- Live multi-sample QA matrix showed the 8-epoch operator model is not useful yet: it produced zero detections at thresholds `0.15`-`0.50`, and the low-threshold `0.01` run produced mostly false positives with best F1 `0.003798670465337132`.
|
|
- `yolov8s-building-segmentation-pt` remains the best tested model, with best overall F1 `0.04195804195804196` on Mol at tile `640`, threshold `0.15`; still not sufficient for V1 default extraction.
|
|
- No Training Studio UI, API contract change, provider fetching, model auto-provisioning or app-side model training behavior was introduced.
|
|
|
|
## Sprint 128 Stronger building model runtime benchmark (2026-07-07)
|
|
|
|
- Added `keremberke/yolov8s-building-segmentation` as an explicit Tower runtime model asset at `/mnt/user/appdata/geointel/models/yolov8s-building-segmentation.pt`; the file is not committed to Git.
|
|
- Verified the live model catalog exposes `yolov8s-building-segmentation-pt` with `will_download_models=false` and SHA256 `a27af31654c6a4edbdc85581c33d93c13986b5919de7de410f8d85d801b3bb34`.
|
|
- YOLO preflight loaded the model locally with `model_load_ok=true` and no automatic download.
|
|
- Ran a 36-run Geel/Mol/Turnhout matrix comparing `yolov8n-building-segmentation-pt` and `yolov8s-building-segmentation-pt` across tile sizes `512`/`640` and thresholds `0.50`/`0.25`/`0.15`.
|
|
- Best overall score was Mol with `yolov8s-building-segmentation-pt`, tile `640`, threshold `0.15`: 55 detections, 9 matches, 46 false positives, 365 false negatives, precision `0.16363636363636364`, recall `0.02406417112299465`, F1 `0.04195804195804196`.
|
|
- Conclusion: `yolov8s` is cleaner than `yolov8n` on some samples, but still misses most GRB buildings; it is not a sufficient V1 default.
|
|
|
|
## Sprint 127 Multi-sample detection quality calibration tooling (2026-07-07)
|
|
|
|
- Added `scripts/prepare_operator_real_data_samples.py` to prepare documented Geel, Mol and Turnhout orthophoto/GRB GBG building sample pairs as explicit runtime artifacts.
|
|
- Added `scripts/run_multi_sample_detection_quality_matrix.sh` to run the existing real-data quality matrix for every prepared sample and combine the results.
|
|
- The combined summary writes `multi_sample_quality_summary.json` with overall score/recall/precision rankings and per-sample best configurations.
|
|
- Added readiness coverage and regression tests for the sample-preparation and multi-sample matrix contracts.
|
|
- Ran the full 24-run Tower matrix for Geel, Mol and Turnhout. Best overall score/recall was Turnhout with `yolov8n-building-segmentation-pt`, tile `512`, overlap `64`, threshold `0.15`, 142 detections, 18 matches, 124 false positives, 755 false negatives and F1 `0.03934426229508197`; generic `yolov8n-pt` produced zero building detections across all samples.
|
|
|
|
## Sprint 126 Detection quality matrix tooling (2026-07-07)
|
|
|
|
- Added `scripts/run_detection_quality_matrix.sh` to compare local model assets, raster tile sizes, tile overlaps and confidence thresholds through the existing real-data detection + QA workflow.
|
|
- The script writes per-run logs and a `quality_matrix_summary.json` with detection count, QA score, precision, recall, F1, mean IoU, matches, false positives and false negatives.
|
|
- The summary ranks `best_by_score`, `best_by_recall` and `best_by_precision` for operator model-quality decisions.
|
|
- Added readiness syntax coverage and static regression coverage for the quality matrix contract.
|
|
- Ran the matrix on Tower against the Geel operator sample: `yolov8n-building-segmentation-pt` with tile `512`, overlap `64` and threshold `0.15` ranked best by score/recall with 80 detections, 6 matches, 74 false positives, 611 false negatives and F1 `0.017216642754662843`; generic `yolov8n-pt` produced zero building detections.
|
|
|
|
## Sprint 125 Detection calibration evidence bundle (2026-07-07)
|
|
|
|
- Added `scripts/export_detection_calibration_evidence.sh` to export persisted QA evidence from a detection calibration summary.
|
|
- The script writes combined `calibration_evidence.geojson`, `calibration_evidence_summary.json` and a standalone `calibration_evidence_review.html` SVG artifact for matched detections, matched references, false positives and false negatives.
|
|
- Added readiness syntax coverage and regression coverage for the evidence bundle contract.
|
|
- Ran the export on Tower for the latest Geel calibration sweep; the bundle contained 2555 evidence features: 2460 false negatives, 79 false positives, 8 matched detections and 8 matched references.
|
|
- No inference, model dependency, provider fetching, fake data, API contract or frontend runtime behavior changed.
|
|
|
|
## Sprint 124 Detection calibration sweep tooling (2026-07-07)
|
|
|
|
- Added `scripts/run_detection_calibration_sweep.sh` to run the existing real-data detection + QA workflow across multiple configured-YOLO confidence thresholds.
|
|
- The sweep writes per-threshold logs and a `calibration_summary.json` with persisted detection count, QA score, precision, recall, F1, mean IoU, matches, false positives and false negatives.
|
|
- Added readiness syntax coverage and static regression coverage for the calibration sweep contract.
|
|
- Ran the sweep on Tower against the Geel operator sample; threshold `0.15` ranked best among `0.50`, `0.35`, `0.25` and `0.15`, but recall remained below 1%, confirming the next problem is model/data calibration rather than runtime availability.
|
|
- No new model dependencies, provider fetching, fake detections, API contracts or product UI behavior were introduced.
|
|
|
|
## Sprint 123 YOLO class and tile CRS normalization (2026-07-07)
|
|
|
|
- Fixed configured-YOLO class filtering so model labels such as `Building` match operator/domain filters such as `building`.
|
|
- Persisted configured-YOLO class names as canonical lowercase values while preserving the original model label in detection provenance.
|
|
- Added regression coverage for the mixed-case YOLO class route that caused the Geel real-data smoke to persist zero detections.
|
|
- Confirmed through direct Tower inference that the active local building model returns raw detections on the prepared Geel orthophoto tile; the remaining work is threshold/QA calibration rather than model availability.
|
|
- Fixed raster tile manifest CRS propagation so generated tile manifests include source CRS metadata required to convert YOLO pixel boxes to WGS84 Detection GeoJSON coordinates.
|
|
- Deployed the class-normalization and tile-CRS fixes to Tower, reran the real-data detection + QA workflow, confirmed 4 persisted detections and verified Detection GeoJSON now returns WGS84 coordinates around Geel.
|
|
|
|
## Sprint 122 Real operator data availability and raster metadata fix (2026-07-07)
|
|
|
|
- Created Tower operator sample artifacts under `/mnt/user/appdata/geointel/storage/operator-data`:
|
|
- `geel_orthophoto_wms_512.tif` from the Digitaal Vlaanderen OMWRGBMRVL WMS `Ortho` layer.
|
|
- `geel_grb_gbg_buildings.geojson` from the Digitaal Vlaanderen GRB OGC API Features `GBG` collection.
|
|
- Fixed raster upload metadata mapping so uploaded rasters persist canonical `bounds_json`, `resolution_json` and `bands_json` from extracted raster metadata.
|
|
- Added regression coverage for raster upload metadata mapping.
|
|
- Deployed the fix to Tower and ran the real-data detection + QA workflow against `http://192.168.10.150:1202`.
|
|
- The workflow passed with persisted raster/reference datasets, tile manifest, AnalysisRun, QualityCheck and detection GeoJSON export. A follow-up pass identified case-sensitive class filtering as the reason the initial Geel run persisted zero detections.
|
|
|
|
## Sprint 121 Real data detection and QA workflow smoke (2026-07-07)
|
|
|
|
- Added `scripts/verify_real_data_detection_qa_workflow.sh` for operator-provided GeoTIFF/reference-vector validation against a live runtime.
|
|
- The smoke uploads a real raster source dataset and real reference building vector, validates GIS metadata, tiles the raster, selects a mounted local model asset, runs configured YOLO detection, runs persisted detection QA/QC and exports detection GeoJSON.
|
|
- Registered the script in the readiness gate as a syntax check so normal development remains green without real local imagery or model files.
|
|
- Documented exact Tower usage in `scripts/README.md`, `backend/README.md`, `docs/AI_PIPELINES.md` and `docs/TODO.md`.
|
|
- The script refuses missing files, unsupported formats, demo workflow seeding, fixture detections, live provider fetching and model downloads.
|
|
|
|
## Sprint 120 Model asset detection workflow smoke (2026-07-06)
|
|
|
|
- Added `scripts/verify_model_asset_detection_workflow.sh` for live Docker/Tower validation of the configured-YOLO path with a selected local model asset.
|
|
- The smoke seeds the explicit demo raster, generates a tile manifest, selects a cataloged model asset, checks read-only YOLO preflight, runs the existing detection endpoint and verifies persisted AnalysisRun, Detection list and Detection GeoJSON outputs.
|
|
- Registered the new smoke script in the readiness gate as a syntax check so ordinary CI/dev runs do not require AI dependencies or model files.
|
|
- Documented that the smoke validates operational routing/provenance only; zero detections are acceptable on the synthetic demo raster and real GIS quality still requires local orthophoto/reference validation.
|
|
|
|
## Sprint 118 Local model and reference catalog clarity (2026-07-06)
|
|
|
|
- Added a read-only local model asset catalog endpoint at `GET /api/v1/detection/model-assets`.
|
|
- Added `YOLO_MODELS_DIR` so Docker/Unraid runtimes can expose mounted model files as selectable assets without downloading weights.
|
|
- Detection runs and YOLO preflight can now accept `model_asset_id` for `yolo-configured`, with backend-side resolution to a cataloged local file.
|
|
- Detection Lab now shows a local model asset picker with active-file, size and checksum context.
|
|
- Provider Capabilities now explicitly labels GRB/OSM/manual/fixture as reference-data source capabilities, not AI model choices.
|
|
- Added regression coverage for the backend model asset catalog and frontend model asset wiring.
|
|
|
|
## Sprint 117 Safe local YOLO model activation (2026-07-06)
|
|
|
|
- Added `scripts/configure_yolo_model.py` to configure an existing local YOLO model into the Unraid/Tower `.env` file without downloading weights, loading a model or running inference.
|
|
- The helper refuses no-model and ambiguous multi-model states, and only applies env changes when `--apply` is provided.
|
|
- Documented the Tower flow for placing model files under `/mnt/user/appdata/geointel/models`, applying the env update and restarting/redeploying the all-in-one container.
|
|
- Added regression coverage for no-model, multi-model, dry-run and env-file apply behavior.
|
|
- Hardened configured YOLO inference so single-band raster tiles are converted to temporary RGB prediction images and model runtime errors are returned as typed detection failures instead of raw server errors.
|
|
|
|
## Sprint 116 Operational GIS map workflow (2026-07-04)
|
|
|
|
- Switched the default MapLibre basemap from demo tiles to an OpenStreetMap road raster basemap with visible attribution while keeping `VITE_MAP_STYLE_URL` as the production override.
|
|
- Added a persisted database layer selector to the Map workspace so users can directly load a ready vector dataset from stored project data.
|
|
- Added an Operational GIS run panel that reuses AOI or active layer extents to query persisted PostGIS `vector_features` through the existing bbox selection flow.
|
|
- Added a basemap policy notice when the public OpenStreetMap fallback is active and a guided operational workflow for query, derived dataset, QA/QC and export handoff.
|
|
- Added a one-click full GIS workflow action that runs persisted selection, saves the derived dataset, saves a GeoJSON export and optionally runs QA/QC against the selected reference dataset.
|
|
- Added a full-workflow run mode selector so repeated Map QA/QC runs can reuse the latest saved derived dataset instead of creating duplicate dataset/export artifacts.
|
|
- Added an opt-in Docker/Unraid AI build path (`GEOINTEL_INSTALL_AI=true`) for installing optional PyTorch/Ultralytics dependencies while keeping the default GIS runtime lightweight and import-safe.
|
|
- Hardened the AI Docker runtime with OpenCV native libraries required by Ultralytics and made YOLO dependency detection use real imports instead of optimistic module discovery.
|
|
- Added a writable `YOLO_CONFIG_DIR` default under application storage so Ultralytics does not fall back to root user config paths in Docker/Unraid.
|
|
- Added YOLO preflight runtime diagnostics for dependency assumption state, model directory, `YOLO_CONFIG_DIR`, installed `torch`/`ultralytics` versions and CUDA availability without running inference or downloading weights.
|
|
- Added a canonical `GET /api/v1/detection/yolo/preflight` endpoint and Detection Lab panel so operators can inspect live YOLO runtime readiness from the web UI.
|
|
- Added static regression coverage for the road basemap, attribution, basemap policy notice, database layer selector and persisted operational GIS workflow wiring.
|
|
|
|
## Sprint 115 QA/QC and Exports usability layout pass (2026-07-04)
|
|
|
|
- Made the QA/QC workspace calmer by compacting summary, handoff, drilldown, feature evidence and metric history surfaces.
|
|
- Reduced raw QA provenance height so JSON evidence remains available without dominating the screen.
|
|
- Rebalanced QA/QC and Exports workspace columns for review-first usage.
|
|
- Made export handoff cards, latest artifact cards and export history controls denser and easier to scan.
|
|
- Added static regression coverage for compact QA evidence review and export handoff layouts.
|
|
|
|
## Sprint 114 Data and Map usability layout pass (2026-07-04)
|
|
|
|
- Made the Data workspace catalog more compact with quieter upload controls, denser role summaries and shorter dataset action buttons.
|
|
- Rebalanced the Data workspace columns so catalog review has more room while setup panels remain available.
|
|
- Made the Map workspace more map-first by placing the MapLibre frame before dense layer controls and increasing the desktop map height.
|
|
- Reduced Map context, provenance, bbox selection and feature extraction density while keeping existing selection/export/QA actions unchanged.
|
|
- Added static regression coverage for the compact Data catalog and map-first workspace ordering.
|
|
|
|
## Sprint 113 Calm workbench layout pass (2026-07-04)
|
|
|
|
- Reduced visual density in the workbench shell without changing API contracts or workflows.
|
|
- Softened the base palette, borders and shadows so panels read as a work surface instead of stacked cards.
|
|
- Made the top context bar, sidebar navigation, workspace heading, status tiles and inspector more compact.
|
|
- Hid the duplicated workspace command bar because the persistent sidebar already provides primary navigation.
|
|
- Added static regression coverage for the calmer shell density and mobile-safe navigation rules.
|
|
|
|
## Sprint 112 QA evidence map overlay (2026-06-25)
|
|
|
|
- Added a read-only QA/QC evidence GeoJSON endpoint for persisted quality checks.
|
|
- The endpoint resolves `match_evidence`, `false_positive_evidence` and `false_negative_evidence` ids back to persisted vector, detection or segmentation geometries where available.
|
|
- Added QA/QC actions to render evidence overlays in the existing MapLibre workspace with distinct match, false-positive and false-negative styling.
|
|
- Added frontend loading/error/clear states for the QA evidence overlay and a compact map legend.
|
|
- No migration, new table, provider fetching, AI behavior or new product domain was introduced.
|
|
|
|
## Sprint 111 QA feature evidence persistence (2026-06-25)
|
|
|
|
- Added feature-level QA evidence to dataset, detection and segmentation QA matching.
|
|
- Persisted matched feature ids, false-positive feature ids and false-negative feature ids inside `quality_checks.findings_json`.
|
|
- Extended QA/QC drilldown with compact matched/false-positive/false-negative feature id lists beside the existing metrics and raw findings JSON.
|
|
- Updated API contracts to document `match_evidence`, `false_positive_evidence` and `false_negative_evidence`.
|
|
- No migration, new table, provider fetching, AI behavior or new product domain was introduced.
|
|
|
|
## Sprint 110 Map QA evidence drilldown (2026-06-25)
|
|
|
|
- Extended the Map workspace QA/QC shortcut with inline evidence after comparing a saved derived selection dataset.
|
|
- The result now shows quality-check id, matches, false positives, false negatives, mean IoU and QA warnings beside precision/recall/F1.
|
|
- Added an `Open QA/QC evidence` handoff to the existing QA/QC workspace drilldown instead of creating a parallel QA detail system.
|
|
- No backend API contracts, migrations, provider fetching, AI behavior or new product domains were introduced.
|
|
|
|
## Sprint 109 Map selection QA shortcut (2026-06-25)
|
|
|
|
- Added a Map workspace QA/QC shortcut for saved derived selection datasets.
|
|
- The shortcut reuses the existing QA comparison workflow and persists `QualityCheck`/`Metric` rows through the existing backend route.
|
|
- Added reference dataset selection, loading/error state and compact precision/recall/F1/status feedback beside the saved map selection.
|
|
- Kept QA orchestration in a dedicated frontend hook so `App.tsx` remains an orchestrator and API calls stay out of the shell component.
|
|
- No backend API contracts, migrations, provider fetching, AI behavior or new product domains were introduced.
|
|
|
|
## Sprint 108 Map selection derived datasets (2026-06-25)
|
|
|
|
- Added `POST /api/v1/projects/{project_id}/datasets/{dataset_id}/vector/select/derive` to persist a map bbox selection as a reusable derived vector dataset.
|
|
- Derived selection datasets keep source provenance, write a GeoJSON artifact and index their features back into `vector_features`.
|
|
- Added `Save as dataset` to the Map workspace after area extract, including loading/error/latest dataset feedback.
|
|
- Added regression coverage for service persistence, empty-selection failure, canonical API envelope and frontend wiring.
|
|
|
|
## Sprint 107 Map selection export handoff (2026-06-25)
|
|
|
|
- Added `vector_selection` GeoJSON export support to persist bbox-selected map features as normal export artifacts.
|
|
- Selection exports query persisted PostGIS `vector_features`, write a `vector_selection_geojson` FeatureCollection and store selection bbox/count metadata in the export record.
|
|
- Added `Save area export` to the Map workspace after an area extract, including loading/error state and latest artifact path feedback.
|
|
- Updated frontend export typing/API hook wiring so saved selections appear in the existing Export Center history.
|
|
- No migrations, provider fetching, AI behavior, real model dependencies or new product domains were introduced.
|
|
|
|
## Sprint 106 Map area selection extract (2026-06-25)
|
|
|
|
- Added a read-only bbox selection endpoint for vector datasets: `POST /api/v1/projects/{project_id}/datasets/{dataset_id}/vector/select`.
|
|
- The endpoint queries persisted PostGIS `vector_features` and returns a canonical-envelope GeoJSON FeatureCollection with selection bbox, feature count, limit and truncation state.
|
|
- Added Map workspace area selection with two-click bbox drawing, manual EPSG:4326 bbox inputs, selected-feature/AOI/layer bbox shortcuts and client-side GeoJSON download/copy.
|
|
- Added MapLibre overlays for the active bbox and extracted selection result.
|
|
- Added regression coverage for backend selection behavior, route envelope and frontend wiring.
|
|
- No migrations, provider fetching, AI behavior, real model dependencies or new product domains were introduced.
|
|
|
|
## Sprint 105 Map feature extract (2026-06-25)
|
|
|
|
- Added a `Selection & extract` panel to the Map workspace for clicked map features.
|
|
- Selected features are highlighted through a dedicated MapLibre GeoJSON source/layer.
|
|
- The extract panel now shows geometry type, coordinate count, EPSG:4326 bbox and a property table.
|
|
- Added client-side `Download selected GeoJSON`, `Copy selected properties` and `Clear selection` actions for the clicked feature.
|
|
- No backend API contracts, migrations, provider fetching, AI behavior or database persistence changed.
|
|
|
|
## Sprint 102 Detection Lab handoff polish (2026-06-24)
|
|
|
|
- Updated the raster tile manifest handoff to Detection Lab so it automatically selects `yolo-configured`.
|
|
- Tightened the AI handoff browser smoke so it now verifies that the model selection is set by the UI handoff rather than by the test.
|
|
- Added regression coverage for the automatic model handoff.
|
|
- No backend API, persistence, migration, provider fetching or AI dependency behavior changed.
|
|
|
|
## Sprint 101 AI Lab handoff browser smoke (2026-06-24)
|
|
|
|
- Added `scripts/verify_ai_handoff_interactions.sh` to exercise the browser click path from raster tiling into Detection Lab and Segmentation Lab.
|
|
- The smoke seeds the explicit offline demo workflow, generates a small raster tile manifest, clicks both AI handoff buttons and verifies the selected raster dataset plus manifest path are preserved.
|
|
- Added readiness syntax coverage for the new browser interaction smoke and documented its optional Playwright requirement.
|
|
- Added regression coverage for the script/readiness contract.
|
|
- No product behavior, API contract, migration, AI dependency or provider-fetching changes were introduced.
|
|
|
|
## Sprint 100 raster tile Segmentation Lab handoff (2026-06-24)
|
|
|
|
- Added Segmentation Lab tile manifest state and wired it into the existing segmentation run request `tile_manifest_path`.
|
|
- Added a raster inspector handoff action that fills the selected raster dataset and tile manifest path in Segmentation Lab.
|
|
- Mirrored the existing Detection Lab manifest input pattern without adding new backend routes, migrations, AI dependencies or model behavior.
|
|
- Added regression coverage for the segmentation handoff wiring.
|
|
|
|
## Sprint 99 raster tile Detection Lab handoff (2026-06-23)
|
|
|
|
- Surfaced the latest persisted `raster.tile` manifest path in the raster dataset inspector.
|
|
- Added a direct Detection Lab handoff action that fills the selected raster dataset and tile manifest path from the existing raster tile job result.
|
|
- Preserved existing raster, detection and segmentation API contracts; no AI inference, provider fetching, migrations or backend route changes were introduced.
|
|
- Added regression coverage for the frontend handoff wiring.
|
|
|
|
## Sprint 98 demo raster workflow smoke (2026-06-23)
|
|
|
|
- Added `scripts/verify_demo_raster_workflow.sh` to validate the browser-facing demo raster happy path: inspect, preview, stats and tile manifest generation.
|
|
- Added readiness syntax coverage for the raster workflow smoke.
|
|
- Fixed raster tiling manifest generation for Rasterio versions that return window bounds as tuples instead of bound objects.
|
|
- Added regression coverage for tuple-based raster window bounds and the new raster smoke contract.
|
|
- No AI inference, external provider fetching, migrations or API route changes were introduced.
|
|
|
|
## Sprint 97 demo raster fixture workflow (2026-06-23)
|
|
|
|
- Added a deterministic local GeoTIFF raster fixture to the offline demo workflow so raster controls and AI Lab dataset prerequisites have usable V1 context.
|
|
- Returned `raster_dataset_id` from the canonical demo workflow response and wired the frontend demo loader to select it for Detection and Segmentation Labs.
|
|
- Kept the candidate vector dataset as the default Data/Map/Export context after demo load.
|
|
- Hardened workbench default/interactions smoke scripts to require the candidate vector, reference vector and raster fixture datasets as `3/3 ready`.
|
|
- No external provider fetching, real AI inference, migrations or API behavior outside the demo response contract changed.
|
|
|
|
## Sprint 96 useful default context (2026-06-22)
|
|
|
|
- Auto-open the first ready vector dataset after project data loads so Data, Map and Exports start with usable context.
|
|
- Kept user-driven dataset selection intact; the default is only applied when no dataset is selected.
|
|
- Added explicit Detection/Segmentation Lab guidance when no raster datasets are available.
|
|
- Added regression coverage for useful default dataset selection and AI Lab raster prerequisite messaging.
|
|
- No API contracts, migrations, provider fetching or AI/model behavior changed.
|
|
|
|
## Sprint 95 raster pipeline hardening (2026-06-22)
|
|
|
|
- Added a raster pipeline readiness surface to the dataset inspector.
|
|
- Surfaced metadata profile, CRS readiness, preview artifact, tile manifest handoff and clip AOI state before raster operations.
|
|
- Added processing guardrails for missing metadata, missing CRS, missing preview, invalid tile parameters, unavailable rasters and missing clip areas.
|
|
- Added responsive styling and regression coverage for the raster readiness/handoff structure.
|
|
- No API contracts, migrations, provider fetching or AI/model behavior changed.
|
|
|
|
## Sprint 94 QA/QC evidence drilldown (2026-06-22)
|
|
|
|
- Added a selected QA/QC evidence drilldown to the Quality Results panel.
|
|
- Surfaced candidate/reference layer names, analysis run/job provenance, status, score and completed/created timestamps for the selected persisted quality check.
|
|
- Added false-positive, false-negative and map-evidence handoff cards from persisted metric rows.
|
|
- Added parameter/findings JSON panes for persisted QA/QC provenance.
|
|
- Added regression coverage for drilldown structure, metric evidence and responsive styles.
|
|
- No API contracts, migrations, provider fetching or AI/model behavior changed.
|
|
|
|
## Sprint 93 export handoff artifact polish (2026-06-21)
|
|
|
|
- Added a latest handoff artifacts section to the Export Center for project reports, project metadata, dataset GeoJSON, detection GeoJSON and segmentation GeoJSON.
|
|
- Reused existing preview/download export actions from each latest artifact card without changing export API contracts or persistence.
|
|
- Added responsive styling for latest artifact cards, empty artifact states and compact artifact actions.
|
|
- Added regression coverage for grouped latest artifact surfaces and preserved preview/download controls.
|
|
- No API contracts, migrations, provider fetching or AI/model behavior changed.
|
|
|
|
## Sprint 92 workflow rail interaction polish (2026-06-21)
|
|
|
|
- Audited the live Overview workflow rail click path from Overview to Data, Map, QA/QC and Exports.
|
|
- Hardened the Map workflow step to reuse the first ready vector/GeoJSON dataset through the existing map-open flow when no layer is active.
|
|
- Hardened the Export workflow step to reuse the first ready vector/GeoJSON dataset through the existing export-open flow when no dataset is selected.
|
|
- Added regression coverage for the context-aware rail handler and fallback workspace navigation.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 91 populated workflow audit polish (2026-06-21)
|
|
|
|
- Audited the live populated demo workflow on `http://192.168.10.150:1202` across Overview, Data, Map, QA/QC, AI Labs and Exports.
|
|
- Tightened the Overview workflow guidance complete state so a fully populated flow shows `Ready for handoff` instead of another next-step prompt.
|
|
- Clarified the Map guidance detail by separating rendered layer feature count from AOI context.
|
|
- Added regression coverage for complete-state copy and precise Map guidance copy.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 90 workflow guidance polish (2026-06-20)
|
|
|
|
- Added an Overview workflow guidance rail for the V1 path: Project & AOI, Data, Map, QA / AI and Export.
|
|
- The guidance rail uses existing workspace navigation only; it does not add API calls, backend behavior or persistence.
|
|
- Added compact ready/waiting/next visual states based on already loaded project, dataset, map, QA/AI and export state.
|
|
- Added regression coverage for the guidance rail, existing workspace routing and responsive CSS contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 89 Export/System density polish (2026-06-20)
|
|
|
|
- Grouped Export Center summary, handoff readiness, artifact actions, state cards and history into focused surfaces.
|
|
- Grouped Provider Capabilities into a system shell with registry state cards, capability cards and attribution/license provenance cards.
|
|
- Preserved existing export action, filter, preview/download and provider refresh workflows without API or persistence changes.
|
|
- Added static regression coverage for Export/System hierarchy and density contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 88 AI Labs density polish (2026-06-20)
|
|
|
|
- Grouped Detection Lab and Segmentation Lab model registry, run controls, result loading and QA controls into focused surfaces.
|
|
- Added shared AI Lab density CSS for model lists, run forms, result/QA summaries and mobile-safe grids.
|
|
- Preserved existing detection/segmentation model loading, run, result filtering and QA callbacks without API or persistence changes.
|
|
- Added static regression coverage for AI Lab hierarchy and density contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 87 Change Detection density polish (2026-06-20)
|
|
|
|
- Grouped Change Detection heading, input controls, result states, summary and warnings into focused surfaces.
|
|
- Reused shared result-state cards for not-enough-data and error states.
|
|
- Added compact desktop/mobile grids for vector inputs and change summary metrics.
|
|
- Added static regression coverage for Change Detection hierarchy and density contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 86 QA/QC workspace density polish (2026-06-20)
|
|
|
|
- Grouped QA/QC summary, dataset evidence, refresh/filter controls and result history into focused surfaces.
|
|
- Kept existing persisted quality check filters, refresh behavior, metric cards and history rendering unchanged.
|
|
- Added compact mobile breakpoint grids for QA/QC summary, handoff evidence, filters and metric/history rows.
|
|
- Added static regression coverage for QA/QC workspace hierarchy and density contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 85 Map workspace density polish (2026-06-20)
|
|
|
|
- Added a compact Map workspace context summary for selected AOI, active layer and rendered feature state.
|
|
- Grouped map controls, provenance, map frame and feature inspector into clearer surfaces without changing MapLibre behavior.
|
|
- Tightened map toolbar/provenance spacing and mobile breakpoint grids so Map workspace scans better on desktop and narrow screens.
|
|
- Added static regression coverage for Map workspace hierarchy and density contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 84 Data workspace density polish (2026-06-20)
|
|
|
|
- Added selected-summary regions to Project, AOI and Dataset panels so active context is visible before forms.
|
|
- Split Data workspace panels into named form/list/catalog blocks to reduce form-first scanning friction.
|
|
- Restyled dataset upload as an embedded source-data block while preserving the existing upload flow.
|
|
- Added static regression coverage for Data workspace selected-summary, upload and catalog density contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 83 Workspace panel hierarchy polish (2026-06-20)
|
|
|
|
- Made the Overview readiness strip a calmer section surface with tighter status tiles.
|
|
- Added explicit Overview action-copy and recommended-action regions for easier scanning and future UI regression coverage.
|
|
- Restyled recommended next actions as a lighter callout instead of another equally weighted white card.
|
|
- Added static regression coverage for Overview hierarchy regions, compact status tiles and secondary action-callout styling.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 82 Shell density polish (2026-06-20)
|
|
|
|
- Added a keyboard skip link to jump directly from the workbench shell to active workspace content.
|
|
- Added an explicit primary workspace navigation label and main focus target.
|
|
- Made narrow-view context chips, sidebar navigation and workspace shortcuts more compact and scroll-safe.
|
|
- Locked the smallest mobile breakpoint so the topbar context remains a horizontal rail instead of expanding into a tall preamble.
|
|
- Added static regression coverage for shell density, skip-link and mobile navigation contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 81 Result state consistency polish (2026-06-20)
|
|
|
|
- Added shared result-state styling for compact loading, error, empty and ready states.
|
|
- Applied consistent state blocks to QA/QC results, export history and AI lab model/result panels.
|
|
- Replaced loose text/error rows in Detection and Segmentation Labs with scan-friendly state cards.
|
|
- Added static regression coverage for result-state CSS and panel usage contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 80 Operation form readability polish (2026-06-20)
|
|
|
|
- Added structured headings, helper text, field wrappers and action rows to dense raster operation controls.
|
|
- Added the same form readability structure to vector clip, buffer and intersect controls.
|
|
- Added compact CSS contracts for dataset tool headings, helper text, field grids, action rows and inline error blocks.
|
|
- Added static regression coverage for raster/vector operation form readability contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 79 Accessibility focus polish (2026-06-20)
|
|
|
|
- Added a shared visible focus-ring contract for primary buttons, workspace navigation, command chips, inspector tabs and dataset action buttons.
|
|
- Added explicit ARIA labels to workspace navigation, command chips and overview quick actions.
|
|
- Bound inspector tabs to their active tab panels with `aria-controls`, tab ids and `tabpanel` metadata.
|
|
- Added static regression coverage for keyboard focus and inspector tab accessibility contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 78 Export preview readability polish (2026-06-20)
|
|
|
|
- Added compact preview summary cards for JSON/GeoJSON export payloads.
|
|
- Wrapped export preview JSON in a scroll-contained shell with a lightweight toolbar.
|
|
- Improved long key/value wrapping for large handoff artifacts while preserving the stored payload.
|
|
- Added static regression coverage for export preview readability contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 77 Inspector mobile visual polish (2026-06-20)
|
|
|
|
- Added compact inspector action button grids for narrow screens.
|
|
- Added mobile-safe wrapping for dataset filenames, checksums, bounds, persisted export paths and loaded feature/job JSON.
|
|
- Added structured raster/vector tool panel classes so operation inputs and buttons stay inside the inspector.
|
|
- Added static regression coverage for inspector mobile CSS and dataset tool markup contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 76 Export/System mobile visual polish (2026-06-20)
|
|
|
|
- Added scan-friendly Provider Capabilities cards with structured status, authority, geometry, query mode and layer chips.
|
|
- Tightened mobile export action cards, export history controls and export card headers.
|
|
- Added overflow wrapping for long provider limitations, attribution text, export ids and artifact paths.
|
|
- Added static regression coverage for Export/System mobile CSS and workflow markup contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 75 AI Labs mobile visual polish (2026-06-20)
|
|
|
|
- Tightened mobile Detection and Segmentation Lab model card, form and result-summary sizing.
|
|
- Added overflow wrapping for long model ids, source tile paths, mask paths and QA summary values.
|
|
- Kept result tables scroll-contained instead of allowing them to widen the workbench.
|
|
- Added static regression coverage for AI Labs mobile CSS and workflow markup contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 74 Data/Map mobile visual polish (2026-06-20)
|
|
|
|
- Tightened mobile Data workspace upload form, file input and dataset action button sizing.
|
|
- Kept desktop dataset action grid width contract while adding compact mobile tracks.
|
|
- Tightened Map toolbar, layer control sliders and empty-map quick actions for narrow screens.
|
|
- Added static regression coverage for Data/Map mobile CSS contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 73 QA/QC result filtering (2026-06-20)
|
|
|
|
- Added client-side QA/QC result search, status and check-type filters.
|
|
- Added latest-eight density control with a show-all toggle for long-lived demo projects.
|
|
- Added a no-match empty state and reset action for filtered QA/QC result views.
|
|
- Kept metric evidence cards and raw persisted metrics unchanged.
|
|
- Added static regression coverage for QA/QC filtering and dense history styles.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 72 Mobile overflow hardening (2026-06-20)
|
|
|
|
- Clamped page-level horizontal overflow for the workbench shell on mobile.
|
|
- Kept sidebar navigation and workspace shortcut chips as contained horizontal scroll areas.
|
|
- Added wrapping/containment for long QA identifiers, dataset links and inspector values.
|
|
- Made inspector tabs two-column on narrow screens to avoid header overflow.
|
|
- Added static regression coverage for mobile overflow and long-identifier wrapping contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 71 QA/QC metric card polish (2026-06-19)
|
|
|
|
- Added core metric evidence cards for precision, recall, F1, mean IoU and false positive/negative counts.
|
|
- Kept the raw persisted metric list available below the promoted metric evidence.
|
|
- Added number formatting for compact metric display while preserving persisted metric values.
|
|
- Added static regression coverage for metric promotion and responsive metric-card styles.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 70 QA/QC handoff polish (2026-06-19)
|
|
|
|
- Added candidate/reference handoff cards to the QA/QC workspace.
|
|
- Resolved persisted quality-check candidate/reference dataset IDs back to loaded dataset names where available.
|
|
- Filtered QA candidate context to non-reference vector/GeoJSON datasets while keeping persisted dataset roles unchanged.
|
|
- Added static regression coverage for QA handoff props, App wiring and responsive handoff styles.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 69 Data catalog action polish (2026-06-19)
|
|
|
|
- Added recommended-action hints to each dataset card so reference and candidate layers explain their QA role.
|
|
- Reworked dataset card actions into compact two-line buttons for Inspect, Map, Export / QA and Metadata.
|
|
- Preserved existing handlers, API contracts and persistence behavior; this is UI affordance polish only.
|
|
- Added static regression coverage for the action hints, disabled-action copy and responsive action grid.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 68 Data catalog density polish (2026-06-19)
|
|
|
|
- Added a compact Data catalog summary for Selected, Reference, Candidate and Source layers.
|
|
- Added scan-friendly dataset role badges, source/layer/CRS context and safer title wrapping to dataset cards.
|
|
- Kept candidate as a frontend workbench display role only: persisted dataset roles and API contracts remain unchanged.
|
|
- Added static regression coverage for the dataset catalog density structure and responsive CSS.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 63 Map overlay ergonomics (2026-06-18)
|
|
|
|
- Added an active layer provenance rail to the Map workspace, showing layer source, provenance and draw state from existing frontend state.
|
|
- Added clear empty guidance when no vector/result layer is active on the map.
|
|
- Added scan-friendly selected-feature property chips before the raw JSON inspector.
|
|
- Tightened panel title alignment after the visual polish pass exposed a generic CSS selector specificity issue.
|
|
- Added static regression coverage for the map provenance and feature-summary UI contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 62 Workbench visual polish (2026-06-18)
|
|
|
|
- Added a compact workspace command bar for fast switching between the primary workbench surfaces.
|
|
- Polished the shell visual system with raised/sunken surfaces, softer shadows, tighter topbar spacing and more consistent panel styling.
|
|
- Replaced raw empty-state text in project/dataset panels with structured empty-state blocks.
|
|
- Improved Detection Lab and Segmentation Lab result summaries and wrapped long result tables in scroll-safe containers.
|
|
- Improved mobile workbench navigation by using horizontal rails for the primary nav and command chips, reducing vertical crowding without adding new behavior.
|
|
- Added static regression coverage for the visual polish contracts.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 61 Golden QA scenario expansion (2026-06-18)
|
|
|
|
- Expanded the deterministic QA/QC golden benchmark from one building scenario to four local fixture scenarios: partial match, perfect match, no-overlap and MultiPolygon match.
|
|
- Added `fixtures/golden/golden_qa_benchmarks.json` as the scenario manifest while preserving the original `expected_qa_metrics.json` baseline for existing demo workflow checks.
|
|
- Updated `scripts/run_golden_qa_benchmark.py` to run every scenario, verify metric drift and report aggregate `QualityCheck`/`Metric` persistence expectations.
|
|
- Added regression coverage for the multi-scenario manifest and aggregate benchmark output.
|
|
- No product behavior, API contract, migration, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 49 Workbench shell UI refactor (2026-06-17)
|
|
|
|
- Replaced the one-page workbench panel stack with a task-based UI shell.
|
|
- Added primary workspaces for Overview, Data, Map, QA/QC, AI Labs, Exports and System.
|
|
- Added a persistent top context bar for active project, AOI, dataset and layer state.
|
|
- Moved dataset details into a persistent right-side inspector instead of leaving them below the full workflow.
|
|
- Kept existing hooks, API contracts, backend behavior, migrations, provider behavior and AI configuration unchanged.
|
|
- Added static regression coverage for the new shell regions and workspace navigation anchors.
|
|
|
|
## Sprint 50 Workspace usability polish (2026-06-17)
|
|
|
|
- Reworked the Data workspace panels into compact operator forms and scan-friendly project/AOI/dataset cards.
|
|
- Reworked the Map workspace controls into a layer toolbar with clearer AOI/layer status.
|
|
- Reworked Detection Lab and Segmentation Lab into model, run, result and QA blocks instead of raw stacked controls.
|
|
- Added responsive card/form styling so nested workspaces do not overflow inside the shell.
|
|
- Added static regression coverage for the polished workspace structure.
|
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
|
|
|
## Sprint 48 Backend API contract audit (2026-06-17)
|
|
|
|
- Added `scripts/audit_api_contracts.py` to compare the active FastAPI route surface with `docs/API_CONTRACTS.md`.
|
|
- Added the API contract audit to the readiness gate so undocumented routes and stale documented routes fail release checks.
|
|
- Corrected API contract drift for area detail/update, vector stats, dataset content and future analysis/YOLO export placeholders.
|
|
- Added regression tests for the contract audit and readiness integration.
|
|
|
|
## Sprint 47 Workbench interaction smoke (2026-06-17)
|
|
|
|
- Added stable `data-testid` anchors to the existing project, area, map, dataset, QA/QC and export controls for browser regression checks.
|
|
- Added `scripts/verify_workbench_interactions.sh` to verify the live backing state for project switching, AOI/map selection, dataset readiness, QA refresh and export refresh.
|
|
- Added readiness syntax coverage and static regression tests for the new interaction smoke.
|
|
- No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.
|
|
|
|
## Sprint 46 Workbench default-state smoke (2026-06-17)
|
|
|
|
- Added `scripts/verify_workbench_default_state.sh` to verify the live frontend/API default demo state through the browser-facing URL.
|
|
- The smoke seeds the offline demo workflow and verifies the demo project, AOI geometry, ready candidate/reference datasets and persisted QA/QC result via canonical envelopes.
|
|
- Added readiness coverage for the new smoke script syntax and static tests for its expected contract checks.
|
|
- No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.
|
|
|
|
## Sprint 45 Default demo selection polish (2026-06-17)
|
|
|
|
- Improved frontend project selection so a cold start prefers a populated demo/workbench project over an empty first project.
|
|
- Preserved the current project selection when it still exists and selected newly created projects immediately after creation.
|
|
- Updated the demo workflow hook to pass the seeded project as the preferred project during refresh.
|
|
- Added static regression coverage for the smarter project selection and demo refresh behavior.
|
|
- No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.
|
|
|
|
## Sprint 44 Workbench UI polish pass (2026-06-17)
|
|
|
|
- Reworked the frontend workbench styling into a cleaner operational GIS interface with compact panels, modern controls, restrained green/neutral accents and scroll-contained long sections.
|
|
- Promoted `MapWorkspace` above the dense workflow grid so the map is visible early in the workbench flow.
|
|
- Moved `DatasetPanel` into the first workflow row beside project/area/provider setup.
|
|
- Added a static layout regression test for map-first ordering and scroll-contained workflow panels.
|
|
- No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.
|
|
|
|
## Sprint 43 Workbench bootstrap hook decomposition (2026-06-17)
|
|
|
|
- Moved frontend bootstrap/project/result reload effects from `App.tsx` into `frontend/src/hooks/useWorkbenchBootstrap.ts`.
|
|
- `App.tsx` no longer imports or owns `useEffect`; it wires hook state into panels and delegates lifecycle loading to focused hooks.
|
|
- Extended orchestration regression tests so bootstrap loading and result refresh effects stay out of `App.tsx`.
|
|
- No behavior, API contracts, migrations, provider fetching or AI behavior changed.
|
|
|
|
## Sprint 42 App entrypoint cleanup (2026-06-17)
|
|
|
|
- Removed the stale `FormEvent`/`useState` React imports from `frontend/src/App.tsx`.
|
|
- Removed the UTF-8 BOM from the frontend entrypoint so future text patches and static checks are stable.
|
|
- Added a regression test that keeps `App.tsx` free of the stale imports and BOM.
|
|
- No behavior, API contracts, migrations, provider fetching or AI behavior changed.
|
|
|
|
## Sprint 41 Demo workflow hook decomposition (2026-06-17)
|
|
|
|
- Moved offline demo workflow orchestration from `App.tsx` into `frontend/src/hooks/useDemoWorkflow.ts`.
|
|
- The hook keeps the existing cross-module selection behavior for project, candidate/reference datasets, map AOI, QA/QC, detection, segmentation and export refresh state.
|
|
- Extended frontend orchestration regression tests so `demoApi` stays out of `App.tsx`.
|
|
- No API contracts, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 40 Project workspace hook decomposition (2026-06-17)
|
|
|
|
- Moved project listing/creation, area creation and project-scoped area/dataset loading from `App.tsx` into `frontend/src/hooks/useProjectWorkspace.ts`.
|
|
- Moved default clip-area selection into `useDatasetWorkflow.ts` and default map-area selection into `useMapWorkspaceState.ts`, keeping selection state with the owning workflow.
|
|
- Extended frontend orchestration regression tests to keep project, provider, change-detection and map orchestration out of `App.tsx`.
|
|
- No API contracts, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 39 Frontend orchestration decomposition (2026-06-17)
|
|
|
|
- Moved provider capability loading from `App.tsx` into `frontend/src/hooks/useProviderCapabilities.ts`.
|
|
- Moved change detection state and API orchestration into `frontend/src/hooks/useChangeDetectionWorkflow.ts`.
|
|
- Moved derived MapLibre workbench state, feature collection selection and feature-inspector reset behavior into `frontend/src/hooks/useMapWorkspaceState.ts`.
|
|
- Added regression tests that keep provider/change/map orchestration out of `App.tsx`.
|
|
- No API contracts, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 38 Export Center preview hardening (2026-06-17)
|
|
|
|
- Prevented HTML project report artifacts from being offered through the JSON preview path in the frontend Export Center.
|
|
- Added a clear backend `EXPORT_CONTENT_UNSUPPORTED` response when `/api/v1/exports/{export_id}/content` is called for HTML report artifacts.
|
|
- Extracted export JSON preview rendering into `frontend/src/components/exports/ExportPreview.tsx`.
|
|
- Added regression coverage for HTML report content-preview rejection.
|
|
- No API routes, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 37 Tower PostgreSQL collation maintenance (2026-06-17)
|
|
|
|
- Created a live Tower database backup before collation maintenance: `backups/geointel-before-collation-refresh-20260617-065707.dump`.
|
|
- Ran `REINDEX DATABASE geointel;` and `ALTER DATABASE "geointel" REFRESH COLLATION VERSION;` against the all-in-one PostGIS runtime.
|
|
- Verified the reused database volume now reports matching collation versions: `stored=2.36 actual=2.36`.
|
|
- Re-ran live migration smoke, browser runtime smoke, GIS runtime smoke and demo/export/golden QA workflow smoke successfully against `http://192.168.10.150:1202`.
|
|
- No API contracts, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 36 PostgreSQL collation maintenance visibility (2026-06-17)
|
|
|
|
- Added database collation version reporting to `scripts/live_migration_smoke.sh`.
|
|
- The live smoke now prints `COLLATION_VERSION_MISMATCH` plus the exact `ALTER DATABASE ... REFRESH COLLATION VERSION` acknowledgement command when an old PostGIS volume is reused on a newer runtime.
|
|
- Documented the Unraid maintenance procedure and backup/index review guidance.
|
|
- Added regression coverage for the collation mismatch reporting path.
|
|
- No API contracts, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 35 Docker runtime secret hygiene (2026-06-17)
|
|
|
|
- Removed embedded PostGIS database name/user/password defaults from `deploy/unraid/Dockerfile.all-in-one` image metadata.
|
|
- Kept database credentials as runtime configuration through `.env`, the Unraid template, Compose or `docker run -e`.
|
|
- Added regression coverage so `GEOINTEL_POSTGRES_PASSWORD` is not baked into the all-in-one Dockerfile again.
|
|
- Updated Unraid runtime documentation to clarify that credentials are runtime config, not image metadata.
|
|
- No API contracts, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 34 browser-facing golden QA demo hardening (2026-06-17)
|
|
|
|
- Hardened `scripts/verify_demo_export_workflow.sh` so the browser-facing demo/export smoke compares persisted QA/QC metrics against `fixtures/golden/expected_qa_metrics.json`.
|
|
- The runtime smoke now verifies QA/QC status, F1 score, precision, recall, mean IoU, false positives, false negatives and match counts from persisted `quality_checks`/`metrics`.
|
|
- Corrected the offline demo AOI to cover the golden building fixtures and made existing demo workflows self-heal stale/unsupported QA checks by syncing the AOI and persisting a fresh golden QA result.
|
|
- Added regression tests to keep the golden QA baseline wired into the demo/export smoke.
|
|
- Updated script documentation for the stricter runtime QA/QC checks.
|
|
- No API contracts, migrations, product features, live provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 33 QA/QC benchmark readiness hardening (2026-06-17)
|
|
|
|
- Added `scripts/verify_golden_qa_benchmark.sh` as a shell wrapper for the deterministic QA/QC golden benchmark.
|
|
- Made `scripts/run_readiness_check.sh` execute the golden QA/QC benchmark and syntax-check the wrapper.
|
|
- Hardened fixture validation so `fixtures/golden` GeoJSON files and expected fixture paths are checked.
|
|
- Added regression tests to keep the golden benchmark in the readiness gate.
|
|
- Updated script/backend docs to document the benchmark wrapper and release gate behavior.
|
|
- No API contracts, migrations, product features, live provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 32 Unraid all-in-one runtime (2026-06-17)
|
|
|
|
- Added `docker-compose.unraid.yml` for a single `geointel` container on Unraid.
|
|
- Added `deploy/unraid/Dockerfile.all-in-one`, embedding PostgreSQL 16/PostGIS, FastAPI, nginx and the built React frontend in one image.
|
|
- Added `deploy/unraid/all-in-one-start.sh` to start embedded PostGIS, apply Alembic migrations, start the backend and serve nginx.
|
|
- Added `deploy/unraid/nginx-all-in-one.conf` with localhost backend proxying inside the same container.
|
|
- Added a PNG DockerMan icon and made the Unraid template name match the running `geointel` container.
|
|
- Added DockerMan labels to the all-in-one Compose service so Unraid can associate the running container with web UI and icon metadata.
|
|
- Added `deploy/unraid/run-dockerman-container.sh` so repo deploys automatically replace Compose-owned containers with a DockerMan-native `geointel` container while preserving/migrating persisted data.
|
|
- Switched Tower deploy image creation from `docker compose build` to plain `docker build` to avoid Compose metadata labels on the final DockerMan-managed container.
|
|
- Updated Tower deploy scripts to install `/boot/config/plugins/dockerMan/templates-user/my-geointel.xml` and `/boot/config/plugins/dockerMan/images/geointel-icon.png`.
|
|
- Updated Tower deploy scripts to stop the old multi-container stack without removing volumes and start the all-in-one stack.
|
|
- Updated the Unraid template so the Docker can be edited from Unraid with one web port, storage path, PostGIS data path and app icon.
|
|
- Hardened live migration and browser runtime smoke scripts with startup retries and an icon check.
|
|
- Verified Tower deployment at `http://192.168.10.150:1202` with one healthy `geointel` container, passing live migration smoke, API proxy smoke and icon smoke.
|
|
- No API contracts, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 31 Unraid deployment template (2026-06-17)
|
|
|
|
- Made Docker Compose ports, storage path, PostGIS credentials, CORS origins and upload limit configurable through `.env` defaults.
|
|
- Added `deploy/unraid/geointel.env.example` for Unraid/Tower setup.
|
|
- Added `deploy/unraid/geointel-unraid-template.xml` documenting editable Unraid settings for the multi-container Compose stack.
|
|
- Added GeoIntel SVG icon assets for Unraid/template use and frontend favicon serving.
|
|
- Added regression coverage for Compose env defaults, Unraid template settings, README instructions and icon availability.
|
|
- No API contracts, backend behavior, migrations, product features, provider fetching or AI behavior were introduced.
|
|
|
|
## Sprint 30 workbench component decomposition (2026-06-17)
|
|
|
|
- Moved persisted QA/QC result rendering into `QualityResultsPanel`.
|
|
- Moved map controls, MapLibre composition and feature inspector rendering into `MapWorkspace`.
|
|
- Added regression coverage to verify `App.tsx` wires these presentational components without taking QA/map markup back inline.
|
|
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.
|
|
|
|
## Sprint 29 dataset component decomposition (2026-06-17)
|
|
|
|
- Moved dataset upload/list UI into `DatasetPanel`.
|
|
- Moved dataset details and job list UI into `DatasetDetailPanel`.
|
|
- Split raster and vector controls into `RasterControls` and `VectorControls`.
|
|
- Added regression coverage to verify `App.tsx` wires the new presentational dataset components without taking dataset markup back inline.
|
|
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.
|
|
|
|
## Sprint 28 dataset workflow hook hardening (2026-06-17)
|
|
|
|
- Moved dataset selection, upload, detail loading, dataset jobs and raster/vector operation orchestration from `App.tsx` into `useDatasetWorkflow`.
|
|
- Kept project dataset listing in `App.tsx` so project/area loading remains the shared workbench boundary.
|
|
- Added regression coverage to verify `App.tsx` still wires dataset, raster and vector UI callbacks while operation API ownership stays inside the focused hook.
|
|
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.
|
|
|
|
## Sprint 27 export and QA workflow hook hardening (2026-06-17)
|
|
|
|
- Moved Export Center orchestration state and API calls from `App.tsx` into `useExportWorkflow`.
|
|
- Moved QA/QC comparison state and persisted quality-check loading from `App.tsx` into `useQualityWorkflow`.
|
|
- Added regression coverage to verify `App.tsx` wires the new hooks while export and QA API ownership stays inside focused hooks.
|
|
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.
|
|
|
|
## Sprint 26 frontend workflow hook hardening (2026-06-17)
|
|
|
|
- Moved Detection Lab orchestration state and API calls from `App.tsx` into `useDetectionWorkflow`.
|
|
- Moved Segmentation Lab orchestration state and API calls from `App.tsx` into `useSegmentationWorkflow`.
|
|
- Added shared frontend `formatError` helper.
|
|
- Added regression coverage to verify `App.tsx` wires the workflow hooks and panels without direct detection/segmentation API ownership.
|
|
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign were introduced.
|
|
|
|
## Sprint 25 YOLO compatibility smoke hardening (2026-06-17)
|
|
|
|
- Added an explicit `--check-model-load` mode to `scripts/yolo_preflight.py`.
|
|
- Added the same YOLO preflight entrypoint under `backend/scripts/` so it can run inside the backend Docker container.
|
|
- The smoke loads only a configured local model file through the YOLO adapter, runs no inference and does not download weights.
|
|
- The CLI rejects `--check-model-load` together with `--assume-dependencies` to avoid false-positive AI readiness.
|
|
- Added tests for successful mocked model-load smoke, load failure reporting and CLI guard behavior.
|
|
- Added the YOLO preflight script to the main readiness gate via Python compile validation.
|
|
- No base dependencies, API contracts, migrations, product features, provider fetching or detection persistence behavior were changed.
|
|
|
|
## Sprint 24 demo/export artifact cleanup tooling (2026-06-17)
|
|
|
|
- Added `scripts/cleanup_demo_artifacts.py`, a dry-run-first maintenance script for old offline demo export artifacts.
|
|
- Added the same cleanup entrypoint under `backend/scripts/` so it can run inside the backend Docker container.
|
|
- The cleanup keeps the newest exports per matching demo project, deletes only explicit `exports` rows/files when `--apply` is set and refuses file deletion outside `STORAGE_ROOT`.
|
|
- Added tests for cleanup candidate selection, storage-root path safety and readiness gate coverage.
|
|
- Added the cleanup script to the main readiness gate via Python compile validation.
|
|
- No API contracts, migrations, product features, provider fetching, AI inference or source dataset cleanup behavior were changed.
|
|
|
|
## Sprint 23 V1 report handoff summary (2026-06-17)
|
|
|
|
- Added V1 readiness summary data to project metadata exports.
|
|
- Added a V1 Readiness Summary and Known Limitations section to lightweight HTML project reports.
|
|
- The summary covers project, AOI, dataset readiness, QA/QC and export history using persisted state.
|
|
- No new report designer, PDF generation, provider fetching, AI inference, migrations or API route changes were introduced.
|
|
|
|
## Sprint 22 V1 workbench status strip (2026-06-17)
|
|
|
|
- Added a compact frontend status strip for project, AOI, datasets, active map layer, QA/QC and exports.
|
|
- The strip is driven by existing App state and suggests the next operator action in the V1 loop.
|
|
- Hardened the MapLibre component so GeoJSON sources/layers wait for the map style to finish loading before updates run.
|
|
- Hardened the offline demo workflow so duplicate historical demo projects prefer complete fixture state before repairing incomplete state.
|
|
- Added regression coverage to ensure the strip remains wired without introducing new API calls.
|
|
- No backend behavior, migrations, API contracts, provider downloads, AI inference or new dependencies were introduced.
|
|
|
|
## Sprint 21 V1 demo workflow smoke hardening (2026-06-17)
|
|
|
|
- Hardened the browser-facing demo/export smoke to verify connected V1 state: project area GeoJSON, fixture datasets, vector FeatureCollection content, vector feature summary, persisted QA/QC metrics and export downloads.
|
|
- Loading the offline demo workflow in the frontend now opens the candidate vector fixture dataset directly, so the map workbench is populated after the demo action.
|
|
- Added regression tests for the strengthened demo smoke and frontend demo dataset loading contract.
|
|
- No migrations, provider downloads, AI inference, new dependencies or API route renames were introduced.
|
|
|
|
## Sprint 20 selected area map overlay (2026-06-17)
|
|
|
|
- Added persisted AOI GeoJSON to area API responses without changing the database schema.
|
|
- Added a dedicated MapLibre area overlay layer with visibility and opacity controls.
|
|
- Added area list actions to choose which AOI is shown on the map.
|
|
- Added regression tests for area GeoJSON serialization and frontend map overlay wiring.
|
|
- No migrations, provider downloads, AI inference, new dependencies or API route renames were introduced.
|
|
|
|
## Sprint 19 V1 map workbench controls (2026-06-17)
|
|
|
|
- Added MapLibre layer visibility and opacity controls for the active GeoJSON workbench layer.
|
|
- Added click-to-inspect feature properties for the active map layer.
|
|
- Updated the visible app identity from the stale Sprint 9 label to GeoIntel Kempen V1 Workbench.
|
|
- Added regression tests that lock the map control and feature inspection wiring.
|
|
- No API contracts, migrations, backend behavior, provider fetching, AI inference or new dependencies were introduced.
|
|
|
|
## Sprint 18 vector change detection foundation (2026-06-16)
|
|
|
|
- Added `POST /api/v1/analysis/change-detection` for synchronous comparison of two vector datasets in the same project.
|
|
- Added a `ChangeDetectionService` that prefers persisted `vector_features`, falls back to stored GeoJSON with an explicit warning, and returns added/removed/unchanged GeoJSON features.
|
|
- Added a frontend Change Detection panel and MapLibre change overlay styling for added, removed and unchanged geometries.
|
|
- Added nginx no-cache headers for frontend HTML/assets so LAN Docker rebuilds are visible without stale browser modules.
|
|
- Added backend tests for persisted vector feature comparison and canonical API envelope behavior.
|
|
- No migrations, live provider fetching, AI inference, new dependencies, LiDAR, Copilot, Training Studio or separate Reports module were introduced.
|
|
|
|
## Release hardening audit pass (2026-06-15)
|
|
|
|
- Replaced remaining backend `datetime.utcnow()` usage with timezone-aware UTC timestamps.
|
|
- Verified the affected backend tests with `DeprecationWarning` promoted to errors.
|
|
- Split the frontend production bundle into explicit app, React vendor and MapLibre vendor chunks.
|
|
- Raised the Vite chunk warning threshold to match the isolated MapLibre GIS dependency rather than masking app-code growth.
|
|
- Hardened the main readiness gate so backend deprecation warnings fail release readiness.
|
|
- Added API contract smoke validation to the main readiness gate.
|
|
- Hardened the pass-end placeholder scan to skip dependency, build-output and bytecode-cache folders.
|
|
- Added backend tests for the release/readiness script expectations.
|
|
- Updated `docs/TODO.md` with current implementation status while preserving older planning context.
|
|
- No API contracts, migrations, product features, AI dependencies or provider behavior were changed.
|
|
|
|
## Docker runtime hardening (2026-06-15)
|
|
|
|
- Fixed the backend Docker build by copying `README.md` and `app/` before `pip install .`.
|
|
- Removed mandatory Compose `.env` references so `docker compose up` works with checked-in local defaults.
|
|
- Published the Docker Compose frontend on host port `1202`.
|
|
- Added backend CORS defaults for `http://localhost:1202` and `http://127.0.0.1:1202`.
|
|
- Stopped publishing PostGIS on host port `5432`; backend uses Docker-internal `db:5432`.
|
|
- Added a PostGIS healthcheck and made the backend wait for a healthy database.
|
|
- Added a backend Docker start script that retries a real SQL connection before running migrations, avoiding first-start database race conditions.
|
|
- Made the backend container run `alembic upgrade head` before starting Uvicorn.
|
|
- Added backend/frontend `.dockerignore` files to keep dependency folders, build outputs and caches out of Docker build contexts.
|
|
- Added Docker runtime configuration regression tests.
|
|
- Fixed Alembic logging format so Docker migration logs no longer print literal `%(levelname)` formatter strings.
|
|
- Changed the frontend API default to same-origin requests and added a Vite proxy for `/api` and `/health`, with Docker routing to `http://backend:8000`.
|
|
- Added a browser runtime verification script that fails when the frontend `/api` proxy returns Vite HTML instead of the backend JSON envelope.
|
|
- Updated environment and local runbook documentation so Docker/LAN browser clients use same-origin API calls through the frontend proxy by default.
|
|
- Corrected example YOLO environment variables to the names the backend actually reads: `YOLO_ENABLED`, `YOLO_MODEL_PATH` and `YOLO_MAX_TILES`.
|
|
- Replaced the Docker frontend runtime with an nginx-served production build and explicit `/api` plus `/health` reverse proxy to the backend service, avoiding Vite HTML fallback for API requests.
|
|
|
|
## M6 — Codex Autonomy Pack
|
|
|
|
Added:
|
|
|
|
- M6 autonomy boundaries.
|
|
- M6 quality gates.
|
|
- Codex self-review checklist.
|
|
- Failure recovery playbook.
|
|
- Gap registry.
|
|
- Next-day execution checklist.
|
|
- Final handoff template.
|
|
- Codex pass prompts PASS 00 through PASS 12.
|
|
- GitHub issue templates and PR template.
|
|
- GitHub Actions docs/contract smoke workflow.
|
|
- Codex preflight and pass-end scripts.
|
|
|
|
Purpose:
|
|
|
|
- Prepare the repository so Codex can build with strict guidance and bounded improvement freedom.
|
|
|
|
## M7 - Implementation Control Layer
|
|
|
|
Added:
|
|
|
|
- M7 implementation control layer.
|
|
- Locked build sequence.
|
|
- Regression trap catalogue.
|
|
- Codex self-review checklist.
|
|
- Geospatial calculation rules.
|
|
- Frontend state rules.
|
|
- API response rules.
|
|
- Module completion matrix.
|
|
- Codex decision boundaries.
|
|
- Proposed improvements backlog.
|
|
- End-of-pass review prompts.
|
|
- Regression and contract drift audit prompts.
|
|
- Module contracts for project/area/dataset, detection boundary and QA/QC.
|
|
- M7 self-review scripts.
|
|
|
|
## M8 - Tomorrow Execution Pack
|
|
|
|
- Added Day 1 Codex execution pack.
|
|
- Added pass-by-pass Day 1 prompts.
|
|
- Added autonomy boundaries, failure recovery and quality gate matrix.
|
|
- Added operator checklist and smoke script scaffold.
|
|
- Added next-pass guidance for Day 2 GeoAI loop.
|
|
|
|
## v0.9 — M9 Max Preparation
|
|
|
|
- Added Codex day-one master prompt.
|
|
- Added autonomous build doctrine and pass scorecards.
|
|
- Added real-vs-demo data policy and detailed data contracts.
|
|
- Added geospatial edge cases, UI state spec and API validation examples.
|
|
- Added implementation review script, regression map and gap-to-task conversion rules.
|
|
- Added final pre-code checklist and long-form prompt variants.
|
|
|
|
## Sprint 1 readiness hardening (2026-06-11)
|
|
|
|
- Added cross-platform backend/runtime scripts with `python`/`python3` fallback in readiness tooling.
|
|
- Fixed backend packaging metadata so editable install works in current flat repo layout.
|
|
- Added dependency and smoke test script updates for Sprint 1 services.
|
|
- Added minimal Sprint 1 tests for health endpoint, GeoJSON metadata extraction, invalid payload rejection, and dataset content reads.
|
|
- Fixed frontend README doc reference typo for repository conventions.
|
|
- Updated Sprint 1 docs to include backend import smoke and concrete local setup commands.
|
|
|
|
## Sprint 2 foundation (2026-06-11)
|
|
|
|
- Added canonical vector/raster dataset handling and lifecycle status transitions (`uploaded`, `validating`, `ready`, `failed`).
|
|
- Added vector metadata extraction (feature count, geometry types, bounds, approximate area, CRS assumptions).
|
|
- Added raster metadata extraction service with dependency-aware fallback (`RASTER_PROCESSING_UNAVAILABLE`).
|
|
- Added deterministic storage metadata capture (`original_filename`, `stored_filename`, `content_type`, `size_bytes`, `checksum_sha256`) and upload folder layout.
|
|
- Added dataset inspection/vector summary/raster metadata API endpoints and frontend detail panel support.
|
|
- Added Sprint 2 tests for vector metadata, invalid GeoJSON handling, legacy geojson compatibility and raster dependency fallback.
|
|
|
|
## Sprint 3 foundation (2026-06-11)
|
|
|
|
- Added job model and database migration for queued/running/success/failed operations.
|
|
- Added job APIs for create/list/read/status under project scope.
|
|
- Added vector operation services and route wiring for inspect/bbox/stats/clip/buffer/intersect.
|
|
- Added raster operation scaffolding for inspect/metadata/preview, with dependency-aware clip/tile unavailability.
|
|
- Added frontend operation controls, job status display, and derived dataset link-through in dataset detail panel.
|
|
- Updated API contracts and execution log for Sprint 3 foundations.
|
|
|
|
## Sprint 5 raster analytics hardening (2026-06-11)
|
|
|
|
- Added raster band statistics operation:
|
|
- min, max, mean, std, nodata count, nodata ratio, valid pixel count, dtype, band index and optional histogram.
|
|
- chunked raster reads to reduce memory pressure and explicit dependency-aware unavailable mode when raster libs are missing.
|
|
- Added raster reproject operation foundation with CRS validation:
|
|
- supports target CRS selection via explicit parameter,
|
|
- persists derived output dataset with operation provenance,
|
|
- records operation parameters and error details when invalid.
|
|
- Hardened raster clip and tile manifest flow:
|
|
- explicit empty clip failure behavior,
|
|
- bounds/metadata refresh and improved tile manifest fields.
|
|
- Added raster operation job persistence tests:
|
|
- result_json and error_message persistence,
|
|
- dependency-aware statistics failure behavior,
|
|
- invalid CRS handling,
|
|
- output linkage for reprojected datasets.
|
|
- Extended dataset UI dataset detail job panel:
|
|
- raster metadata visibility (CRS, bounds, resolution),
|
|
- raster band statistics rendering,
|
|
- reproject form and job result visibility.
|
|
|
|
## Sprint 6 local spectral indices (2026-06-12)
|
|
|
|
- Added local spectral index operations:
|
|
- NDVI endpoint
|
|
- NDWI endpoint
|
|
- NDBI endpoint
|
|
- Added explicit spectral index input validation:
|
|
- positive integer checks
|
|
- source raster band-count bounds checks
|
|
- Implemented dependency-aware index execution for missing raster dependencies.
|
|
- Added local spectral raster output generation using float32 and `NaN` invalid handling.
|
|
- Stored index-derived dataset provenance metadata:
|
|
- `source_dataset_id`
|
|
- `operation` (`raster.ndvi`, `raster.ndwi`, `raster.ndbi`)
|
|
- `band_mapping`
|
|
- `formula`
|
|
- `output_dtype`
|
|
- `nodata_strategy`
|
|
- `value_range_note`
|
|
- `created_at`
|
|
- `output_dataset_id`
|
|
- `path`
|
|
- Extended dataset detail UI with spectral index controls and result dataset actions.
|
|
- Updated:
|
|
- `docs/API_CONTRACTS.md`
|
|
- `docs/RASTER_OPERATIONS_SPEC.md`
|
|
- `backend/README.md`
|
|
- `frontend/README.md`
|
|
- `docs/CODEX_EXECUTION_LOG.md`
|
|
|
|
## Sprint 7A persistence and QA foundation (2026-06-12)
|
|
|
|
- Added `vector_features` as first-class queryable vector state while preserving original uploaded files as source artifacts.
|
|
- Added `quality_checks` and `metrics` as persisted QA/QC domain records.
|
|
- Added Alembic migration `202606120700_sprint7a_persistence_foundation.py` for vector features, quality checks, metrics and required indexes.
|
|
- Persisted uploaded vector GeoJSON feature properties and geometries into PostGIS-backed feature rows.
|
|
- Updated QA candidate-vs-reference jobs to persist quality checks and metric rows and return `quality_check_id`.
|
|
- Hardened GRB/OSM provider contracts as honest `not_configured` capability stubs only.
|
|
- Added tests for Sprint 7A persistence, dataset role validation, provider contracts, migration integrity and QA route persistence.
|
|
|
|
## Sprint 7B provider integration skeleton (2026-06-12)
|
|
|
|
- Added central provider registry entries for `grb`, `osm`, `manual` and `fixture`.
|
|
- Added provider capability, layer, status and future import-contract endpoints using the existing API envelope style.
|
|
- Kept GRB and OSM as explicit `not_configured` providers with no live WFS, Overpass or download behavior.
|
|
- Added provider-to-dataset mapping rules for future imports through `DatasetService` and `VectorFeatureService`.
|
|
- Added lightweight frontend Provider Capabilities panel with status, authority, layers, query modes and limitations.
|
|
- Added live PostGIS migration smoke script for opt-in local database verification.
|
|
- Added Sprint 7B provider registry/API tests.
|
|
|
|
## Sprint 8 Detection Lab foundation (2026-06-12)
|
|
|
|
- Added `detections` as first-class persisted PostGIS records linked to project, dataset, job and analysis run.
|
|
- Hardened `analysis_runs` with dataset/job/model/result metadata for future detection and segmentation workflows.
|
|
- Added model registry capabilities for `yolo-placeholder` and `manual-fixture-detector`.
|
|
- Added Detection Lab service and API foundation with dependency-aware `DETECTION_MODEL_UNAVAILABLE` responses.
|
|
- Added explicit fixture detector mode for tests/demo fixtures only; no fake production inference was introduced.
|
|
- Added minimal frontend Detection Lab panel for model status, raster dataset selection, confidence threshold and run status.
|
|
- Added Sprint 8 tests for persistence, model capabilities, unavailable model behavior, invalid dataset validation, explicit fixture persistence and API envelope shape.
|
|
|
|
## Sprint 8B configured YOLO foundation (2026-06-12)
|
|
|
|
- Added optional `ai` backend dependency group for Ultralytics/Torch without making AI dependencies mandatory for normal startup.
|
|
- Added `yolo-configured` model registry capability with `not_configured`, `dependency_unavailable` and `configured` status behavior.
|
|
- Added import-safe YOLO adapter that loads only an existing local model path and does not auto-download weights.
|
|
- Added raster tile manifest validation, configured tile limits and pixel bbox to EPSG:4326 detection polygon conversion.
|
|
- Added mocked YOLO persistence tests that verify first-class detection records without requiring YOLO dependencies.
|
|
- Added Detection Lab tile manifest path input for configured YOLO runs.
|
|
- Updated AI/API/backend/frontend docs for Sprint 8B configuration and limitations.
|
|
|
|
## Sprint 8C detection visualization and QA integration (2026-06-12)
|
|
|
|
- Added detection result review endpoints for run lists, filtered detections, detection detail and GeoJSON FeatureCollection output.
|
|
- Added detection QA against persisted reference `vector_features` using existing `quality_checks` and `metrics`.
|
|
- Added frontend Detection Lab run selection, detection table, class/confidence filters and MapLibre detection GeoJSON overlay.
|
|
- Added frontend detection QA controls and metric summary display.
|
|
- Added tests for detection GeoJSON shape, filters, detail, QA persistence, no-match QA and Sprint 8B manifest edge cases.
|
|
- Segmentation, LiDAR, Copilot, Training Studio and Reports remain out of scope.
|
|
|
|
## Sprint 9 Segmentation Lab foundation (2026-06-12)
|
|
|
|
- Added `segmentations` as first-class persisted PostGIS MultiPolygon records linked to project, dataset, job and analysis run.
|
|
- Added deterministic segmentation mask path convention under `storage/masks/{project_id}/{analysis_run_id}/tile_{tile_index}/`.
|
|
- Added segmentation model registry capabilities:
|
|
- `segmentation-placeholder`
|
|
- `fixture-segmenter`
|
|
- `yolo-seg-configured`
|
|
- `sam-configured`
|
|
- Added Segmentation Lab service and API foundation for model listing, run creation, run/result listing, detail, GeoJSON output and reference QA.
|
|
- Added segmentation QA against persisted reference `vector_features` using existing `quality_checks` and `metrics`.
|
|
- Added minimal frontend Segmentation Lab UI with model status, raster selection, run/result table, map overlay and QA metric display.
|
|
- Real SAM, real YOLO-seg, model downloads, new AI dependencies, LiDAR, Copilot, Training Studio and Reports remain out of scope.
|
|
|
|
## Sprint 10 release hardening and modularization (2026-06-13)
|
|
|
|
- Extracted project, area, provider capabilities, Detection Lab and Segmentation Lab UI sections from `frontend/src/App.tsx` into focused components.
|
|
- Preserved existing API client usage, state ownership, MapLibre overlay behavior and workbench UX.
|
|
- Hardened readiness checks to include Alembic head verification and `scripts/live_migration_smoke.sh` syntax validation.
|
|
- No new product features, migrations, AI dependencies or live external provider fetching were introduced.
|
|
|
|
## Sprint 11 live Docker/PostGIS runtime validation (2026-06-13)
|
|
|
|
- Hardened `scripts/live_migration_smoke.sh` so fresh databases run Alembic migrations before checking `PostGIS_Version()`.
|
|
- Added live runtime schema-object checks for core migrated tables and geometry indexes.
|
|
- Added backend tests that lock the live migration smoke ordering and schema-check contract.
|
|
- Documented exact Docker/PostGIS validation commands, expected `DATABASE_URL` and local cleanup commands.
|
|
- Docker was unavailable in the current shell, so live container execution remains pending on a Docker-enabled machine.
|
|
|
|
## Sprint 12 QA/QC golden dataset and benchmarking (2026-06-15)
|
|
|
|
- Added deterministic golden building QA/QC fixtures and expected metric baseline.
|
|
- Added `scripts/run_golden_qa_benchmark.py` to run existing QA/QC logic against the golden fixtures and fail on metric drift.
|
|
- Added backend tests covering expected golden metrics and `QualityCheck`/`Metric` persistence verification.
|
|
- Documented benchmark purpose, command, expected outputs, tolerance and limitations.
|
|
- No product features, API contracts, migrations, live providers, AI models or new dependencies were introduced.
|
|
|
|
## Sprint 13 real YOLO operational hardening (2026-06-15)
|
|
|
|
- Added `YoloPreflightService` for local configured-YOLO readiness checks without loading models or running inference.
|
|
- Added `scripts/yolo_preflight.py` for checking enabled state, optional dependency availability, local model path, tile manifest validity, tile limit and referenced tile paths.
|
|
- Added backend tests for disabled, dependency-unavailable and ready preflight states plus CLI JSON output.
|
|
- Documented preflight usage in backend and AI pipeline docs.
|
|
- No model downloads, API contracts, migrations, new dependencies, segmentation behavior or provider fetching were introduced.
|
|
|
|
## Sprint 14 Docker GIS runtime enablement (2026-06-16)
|
|
|
|
- Added a backend `gis` optional dependency group for the approved raster/vector runtime stack.
|
|
- Updated the backend Docker image to install the `gis` extra plus GDAL/GEOS/PROJ system packages.
|
|
- Added `scripts/verify_gis_runtime.sh` to verify browser-facing PostGIS, Rasterio and GeoPandas capabilities through the frontend proxy.
|
|
- Added `scripts/gis_import_smoke.py` and made the backend Docker build fail if Rasterio, GeoPandas or pyogrio cannot be imported.
|
|
- Moved the Docker build-time GIS import smoke into the backend build context and kept the root script as a local wrapper.
|
|
- Included the GIS runtime script syntax check in the main readiness gate.
|
|
- Added backend and frontend Docker Compose healthchecks and made the frontend wait for a healthy backend.
|
|
- Added regression tests for Docker GIS dependency installation and capability verification script coverage.
|
|
- Documented Docker GIS runtime verification commands for local and LAN deployments.
|
|
- No API contracts, migrations, AI dependencies, provider fetching or product features were changed.
|
|
|
|
## Sprint 15 explicit demo workflow seed (2026-06-16)
|
|
|
|
- Added `POST /api/v1/demo/workflow` to seed or return an explicit offline demo workflow.
|
|
- The demo workflow creates a project, AOI, fixture reference building dataset, fixture candidate building dataset and persisted QA/QC metrics.
|
|
- Added `scripts/seed_demo_workflow.py` for CLI-based demo seeding.
|
|
- Added frontend "Load demo workflow" action in the Projects panel.
|
|
- Added tests for the demo endpoint envelope and fixture contract.
|
|
- No live GRB/OSM fetching, AI inference, migrations or new dependencies were introduced.
|
|
|
|
## Sprint 16 QA/QC result visibility (2026-06-16)
|
|
|
|
- Added `GET /api/v1/projects/{project_id}/quality-checks` to list persisted quality checks and metric rows.
|
|
- Added a frontend QA/QC Results panel for project-level persisted QA output.
|
|
- Demo workflow loading and QA actions now refresh visible QA/QC results.
|
|
- Added backend tests for quality check listing and canonical response envelopes.
|
|
- No migrations, new dependencies, live provider fetching or AI inference were introduced.
|
|
|
|
## Sprint 17 export foundation (2026-06-16)
|
|
|
|
- Hardened `POST /api/v1/exports/geojson` so exports persist `Export` rows instead of returning dataset ids as export ids.
|
|
- Added GeoJSON export support for vector datasets, detection runs and segmentation runs using existing persisted geometry services.
|
|
- Added project metadata JSON export, lightweight project report HTML export and export list/read/content/download endpoints.
|
|
- Added a frontend Export Center panel for creating exports, listing export records, previewing JSON artifact content and downloading artifacts.
|
|
- Added export history to project metadata/report artifacts.
|
|
- Added `scripts/verify_demo_export_workflow.sh` to smoke test demo seeding, QA/QC visibility, metadata/report/vector exports, export listing and artifact downloads through the browser-facing URL.
|
|
- Added backend tests for export persistence, artifact writing, raster rejection, HTML report creation, canonical export envelopes and raw file downloads.
|
|
- No migrations, new dependencies, live provider fetching, AI inference, LiDAR, Copilot, Training Studio or separate Reports module were introduced.
|
|
|
|
## Sprint 51 QA/QC and export workspace polish (2026-06-17)
|
|
|
|
- Polished the QA/QC workspace with persisted-check summary tiles, clearer empty state, quality-check cards and metric chips.
|
|
- Polished the Exports workspace with artifact action groups, latest-export card, export history cards and preview panel framing.
|
|
- Preserved existing API clients, callbacks and export/QA behavior.
|
|
- Added regression coverage for the QA/QC and Exports workspace structure.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 52 selected context inspector tabs (2026-06-17)
|
|
|
|
- Replaced the fixed dataset-only right inspector with tabbed Context, Dataset, QA/Exports and AI Runs inspection.
|
|
- Reused the existing dataset detail component for raster/vector operations so dataset behavior and callbacks remain unchanged.
|
|
- Added context cards for selected project, AOI, map feature, latest QA/QC result, latest export and selected detection/segmentation run state.
|
|
- Added regression coverage for inspector wiring and tab structure.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 53 map/dataset selection ergonomics (2026-06-17)
|
|
|
|
- Added active selected-state styling to dataset cards.
|
|
- Added dataset quick actions for opening the selected dataset in the Map workspace or Exports workspace.
|
|
- Added inspector navigation actions for Data, Map, QA/QC, Exports and AI Labs workspaces.
|
|
- Preserved existing dataset detail loading, map layer state, export actions and API client behavior.
|
|
- Added regression coverage for dataset quick actions and inspector navigation wiring.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 54 populated-state UI polish (2026-06-17)
|
|
|
|
- Ran the live demo/export workflow against Tower and audited populated Data and Exports states.
|
|
- Changed the Data workspace to keep Project and AOI side by side while giving the Dataset catalog a full-width row.
|
|
- Compacted the Exports history to show the latest 10 artifacts by default with an explicit show-all toggle.
|
|
- Kept a visible Export Preview panel even before preview content is selected.
|
|
- Shortened displayed export paths while preserving the full path in the element title.
|
|
- Added regression coverage for populated-state Data layout, export limiting and export preview empty state.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 55 live visual shell polish (2026-06-17)
|
|
|
|
- Audited the live workbench visually in Browser on `http://192.168.10.150:1202`.
|
|
- Compacted the top context bar and primary navigation so the workbench has more usable canvas space.
|
|
- Moved the inspector below the workspace on standard desktop widths instead of forcing a cramped three-column layout.
|
|
- Preserved the side inspector behavior for wider screens.
|
|
- Improved Map workspace control wrapping so the map/status controls do not clip at 1280px.
|
|
- Reset page scroll on workspace changes so workspaces open from their heading instead of inheriting stale scroll positions.
|
|
- Added regression coverage for the standard-desktop layout and workspace scroll reset.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 56 export history controls (2026-06-17)
|
|
|
|
- Added frontend-only export history search across export type, status, id and storage path.
|
|
- Added export type and status filters based on the currently loaded export records.
|
|
- Made the existing latest-10 export limiter operate on filtered results instead of the whole export list.
|
|
- Added a no-match empty state and reset view action for filtered export history.
|
|
- Slightly compacted export action buttons so filters are visible earlier on standard desktop viewports.
|
|
- Added regression coverage for filtering controls, filtered list limiting and the no-match state.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 57 safer demo export cleanup (2026-06-17)
|
|
|
|
- Hardened the existing dry-run-first demo export cleanup command with a `--max-delete` safety cap.
|
|
- Added repeated `--export-type` filters so operators can clean only selected artifact kinds.
|
|
- Cleanup apply runs now report a `blocked_reason` instead of deleting when selected candidates exceed the cap.
|
|
- Dry-run output now includes `candidate_exports` with export ids so duplicate storage paths remain auditable.
|
|
- Updated root and backend cleanup entrypoints, docs and regression coverage.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 58 demo cleanup dry-run smoke (2026-06-18)
|
|
|
|
- Added `scripts/verify_demo_cleanup_dry_run.sh` to verify the demo export cleanup path against a running backend without passing `--apply`.
|
|
- The smoke supports compose, all-in-one container and local modes, and asserts `dry_run=true`, `deleted_export_count=0`, empty deleted files and candidate dry-run fields.
|
|
- Added the smoke syntax check to the main readiness gate and regression coverage for the non-mutating script contract.
|
|
- Updated maintenance documentation in `scripts/README.md`, `docs/STORAGE_ARCHITECTURE.md` and `backend/README.md`.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 59 workbench screenshot artifacts (2026-06-18)
|
|
|
|
- Added `scripts/capture_workbench_screenshots.sh` for optional visual regression handoff screenshots.
|
|
- The capture script seeds the explicit offline demo workflow, opens each main workspace and writes viewport PNG screenshots plus a `manifest.json` under ignored local artifacts.
|
|
- Desktop screenshots are always captured; mobile screenshots are captured by default and can be disabled with `CAPTURE_MOBILE=0`.
|
|
- Added readiness syntax coverage and regression checks for the non-mutating screenshot capture contract.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 60 API error-envelope contract hardening (2026-06-18)
|
|
|
|
- Aligned backend error responses with the documented `ApiError` contract: top-level `error`, `message`, `details` and `request_id`.
|
|
- Preserved frontend compatibility with both the canonical top-level error payload and the older nested error-object shape.
|
|
- Added regression coverage for AppError, HTTPException and validation-error envelopes.
|
|
- Added static frontend parser coverage so API client error parsing does not drift silently.
|
|
- No migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 64 export/report handoff polish (2026-06-18)
|
|
|
|
- Added a handoff readiness summary to the Export Center for selected dataset, detection run, segmentation run and latest artifact context.
|
|
- Grouped existing export actions into scan-friendly artifact cards for project report, metadata, vector GeoJSON, detection GeoJSON and segmentation GeoJSON.
|
|
- Added clearer export history provenance with formatted export-type badges, analysis-run ids and created timestamps when available.
|
|
- Added regression coverage for the Export Center handoff structure and responsive styling.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 65 project report readability polish (2026-06-18)
|
|
|
|
- Reworked the lightweight HTML project report template into a self-contained handoff layout with hero, readiness pill, scorecards and sectioned tables.
|
|
- Added print-friendly CSS and scroll-safe table wrappers while preserving the existing `project_report_html` export type and download behavior.
|
|
- Added source/CRS columns to the dataset inventory section and clearer "Dataset inventory", "QA/QC evidence" and "Artifact history" report headings.
|
|
- Added regression coverage for report layout markers, print CSS and HTML escaping.
|
|
- No API contracts, migrations, product capabilities, PDF/report-designer functionality, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 67 map empty-state quick actions (2026-06-19)
|
|
|
|
- Added ready vector/GeoJSON dataset quick actions to the Map workspace empty state.
|
|
- Reused the existing `openDatasetInMap` flow so selecting a quick action loads the persisted dataset layer without changing API contracts.
|
|
- Added responsive styling and regression coverage for the Map quick-action grid.
|
|
- Verified locally against the live demo state that the empty map state exposes two dataset actions and opens `demo_predicted_buildings.geojson` as a 2-feature map layer.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 103 AI Lab run readiness (2026-06-24)
|
|
|
|
- Added compact run-readiness panels to Detection Lab and Segmentation Lab.
|
|
- Detection readiness now shows raster dataset, model availability and the configured-YOLO tile manifest requirement before submitting a run.
|
|
- Segmentation readiness now shows raster dataset, model availability and tile manifest provenance state before submitting a run.
|
|
- Added regression coverage for the AI Lab readiness UI contract and styling.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Sprint 104 AI Lab action guardrails (2026-06-24)
|
|
|
|
- Added explicit action guardrails below Detection and Segmentation run-readiness panels.
|
|
- Detection now distinguishes configured model state from UI-runnable state and blocks the explicit test/demo-only fixture detector in the normal run form.
|
|
- Segmentation now distinguishes configured model state from UI-runnable state and blocks the explicit test/demo-only fixture segmenter in the normal run form.
|
|
- Added regression coverage for AI Lab action guardrails and compact guardrail styling.
|
|
- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced.
|
|
|
|
## Operator YOLOv8s hard-negative benchmark (2026-07-08)
|
|
|
|
- Trained a Tower-local YOLOv8s hard-negative building detector from the existing operator tile dataset.
|
|
- Published the trained runtime artifact as `geointel-building-yolov8s-hardneg160r4e50-pt` in the live model asset catalog without adding application download behavior.
|
|
- Reused persisted dense QA and hard-negative benchmark runs through the existing live API.
|
|
- Observed dense QA F1 scores up to `0.6380` and safest current threshold behavior around `0.25`.
|
|
- Kept the model inactive by default because the `kasterlee_bos` hard-negative sample still produced 10 detections at threshold `0.25`.
|
|
- No repository code, API contracts, migrations, product behavior, provider fetching or AI dependency strategy changed in this benchmark pass.
|
|
|
|
## Sprint 122 Detection model asset activation guardrails (2026-07-08)
|
|
|
|
- Hardened Detection Lab so local model assets are no longer auto-selected when the backend reports available model files.
|
|
- Required an explicit local model asset choice before configured YOLO can be submitted when local assets exist.
|
|
- Added local model asset details in the run surface: active runtime env status, SHA-256 preview, file size, path and `will_download_models`.
|
|
- Surfaced the current YOLOv8s hard-negative benchmark candidate and recommended starting threshold `0.25` as operator guidance.
|
|
- Added regression coverage for the no-auto-select behavior and UI guardrail copy.
|
|
- No backend API contracts, migrations, model downloads, provider fetching or model weight mutation behavior changed.
|
|
|
|
## Sprint 123 Raster detection manifest handoff (2026-07-08)
|
|
|
|
- Added a structured raster tile manifest handoff from the Data workspace into Detection Lab.
|
|
- Raster controls now surface manifest tile count, tile size, overlap and tile-set provenance before handing the manifest to AI workflows.
|
|
- The Detection Lab handoff now selects the configured YOLO run path, keeps local model assets explicit, applies the current recommended `0.25` starting threshold and refreshes YOLO preflight for the linked manifest.
|
|
- Detection Lab now shows linked tile manifest provenance plus preflight manifest validation, tile count and `will_run_inference` state.
|
|
- Added regression coverage for the handoff contract and preserved the existing no-auto-select model guardrail.
|
|
- No backend API contracts, migrations, model downloads, provider fetching or model weight mutation behavior changed.
|
|
|
|
## Sprint 133 Detection threshold calibration UX (2026-07-08)
|
|
|
|
- Added a Detection Lab calibration comparison panel that joins persisted detection runs with persisted QA/QC checks.
|
|
- The panel compares confidence threshold, model, detection count, precision, recall, F1, false positives and false negatives.
|
|
- Added operator guidance for best F1, best precision and lowest false-positive pressure, with a promotion guardrail to inspect evidence across AOIs before accepting a setting.
|
|
- Added regression coverage for the persisted calibration UI contract.
|
|
- No backend API contracts, migrations, model downloads, provider fetching or AI/model execution behavior changed.
|
|
|
|
## Sprint 134 Guided detection calibration runner (2026-07-08)
|
|
|
|
- Added an explicit in-app calibration runner to Detection Lab for operator-selected confidence threshold sweeps.
|
|
- The runner reuses existing detection and QA APIs once per threshold, producing persisted DetectionRun, Job, Detection, QualityCheck and Metric records.
|
|
- Added visible threshold progress with per-row status, detection count, precision, recall, F1, false positives and false negatives.
|
|
- Added validation guardrails for selected project, raster dataset, reference dataset, configured non-fixture model, tile manifest and explicit local model asset.
|
|
- Added regression coverage for the guided runner contract.
|
|
- No backend API contracts, migrations, model downloads, provider fetching, automatic promotion or model file mutation behavior changed.
|
|
|
|
## Sprint 142 Calibration evidence response uniqueness (2026-07-08)
|
|
|
|
- Hardened the calibration evidence exporter so response artifacts are keyed by threshold and quality-check id.
|
|
- Prevented multi-model portfolios from overwriting runs that share the same threshold.
|
|
- Added regression coverage proving same-threshold runs are preserved in the assembled portfolio.
|
|
- No API contracts, migrations, model downloads, provider fetching or AI inference behavior changed.
|
|
# Unreleased
|
|
|
|
- Added `scripts/audit_operator_yolo_dataset_quality.py`, an operator-only YOLO tile dataset quality audit that produces JSON and Markdown reports for sample coverage, split coverage, repeated hard-negative pressure and label-size integrity before further training runs.
|
|
- Added pytest coverage and readiness syntax checking for the new operator YOLO dataset audit script.
|
|
- Recorded live Tower audit results showing `yolo-building-tile-expanded160` as the clean current baseline and r4/r8 hard-negative datasets as repeat-heavy evidence sets that need more unique background AOIs before further hard-negative training.
|
|
- Expanded the explicit operator background-candidate AOI registry from 3 to 9 unique hard-negative locations and added tests for diversity/spread before further YOLO training.
|
|
- Fixed the all-in-one Dockerfile so documented operator scripts are copied into `/app/scripts/`, then prepared and audited the new Tower `yolo-building-tile-uniquehardneg160` dataset as the next training candidate.
|
|
- Fixed the YOLO preflight CLI so it respects environment-provided runtime configuration instead of reporting `not_configured` unless CLI flags were supplied.
|
|
- Rebuilt the Tower all-in-one image with AI dependencies and verified live migration smoke, browser runtime and YOLO preflight readiness against an existing raster tile manifest.
|
|
- Fixed the all-in-one Dockerfile so the operator YOLO training wrapper is available and executable inside `/app/scripts`.
|