Files
geointel/docs/CODEX_EXECUTION_LOG.md
T
Codex 694913a280
GeoIntel CI / docs-smoke (push) Has been cancelled
GeoIntel CI / contract-smoke (push) Has been cancelled
Add workbench screenshot capture smoke
2026-06-18 01:57:02 +02:00

2352 lines
133 KiB
Markdown

## Sprint 48 Backend API contract audit (2026-06-17)
Changed:
- Added `scripts/audit_api_contracts.py` to import the FastAPI app, enumerate the implemented `GET`/`POST`/`PATCH`/`DELETE` route surface and compare it with active `### METHOD route` headings in `docs/API_CONTRACTS.md`.
- Added the API contract audit to `scripts/run_readiness_check.sh`.
- Corrected contract drift in `docs/API_CONTRACTS.md`:
- documented `GET/PATCH /api/v1/projects/{project_id}/areas/{area_id}`;
- corrected vector stats from `POST` to implemented `GET`;
- documented `GET /api/v1/projects/{project_id}/datasets/{dataset_id}/content`;
- changed non-implemented building-stats, legacy analysis object-detection/segmentation and YOLO export entries from active route headings to future-route notes.
- Added `backend/tests/test_sprint48_api_contract_audit.py`.
- Updated `scripts/README.md`, `docs/TODO.md` and `CHANGELOG.md`.
Validation:
- RED: `cd backend && python -m pytest tests/test_sprint48_api_contract_audit.py -q` failed before implementation because the audit script, readiness integration and route docs were missing.
- RED: `python scripts/audit_api_contracts.py` reported missing docs for 4 implemented routes and 5 stale documented routes.
- `python scripts/audit_api_contracts.py` passed: 76 implemented routes matched docs and 2 explicit non-envelope endpoints were tracked.
- `cd backend && python -m pytest tests/test_sprint48_api_contract_audit.py tests/test_readiness_gate.py -q` passed: 12 tests.
- `python -m py_compile scripts/audit_api_contracts.py` passed.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 201 tests.
- `bash scripts/run_readiness_check.sh` passed and included `API contract audit OK`.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `cd backend && python -m alembic heads` passed: `202606120900 (head)`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1` passed and redeployed the all-in-one container to Tower on port 1202.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed after redeploy.
- `bash scripts/verify_workbench_default_state.sh http://192.168.10.150:1202` passed after redeploy.
- `bash scripts/verify_workbench_interactions.sh http://192.168.10.150:1202` passed after redeploy.
Limitations:
- This pass audits route documentation presence, implemented/stale route drift and explicit non-envelope exceptions. It does not yet exercise every error path response body at runtime.
- No API behavior, migrations, provider fetching, AI behavior or product capabilities changed.
Next recommended pass:
- Add an error-envelope runtime audit for representative invalid/missing-resource paths across projects, datasets, providers, detection, segmentation, QA and exports.
## Sprint 47 Workbench interaction smoke (2026-06-17)
Changed:
- Added stable `data-testid` anchors to the existing project, area, map, dataset, QA/QC and export controls so browser checks can target real controls instead of brittle text/layout selectors.
- Added `scripts/verify_workbench_interactions.sh`, a dependency-light runtime smoke that verifies the backing state for project switching, AOI/map selection, dataset selection, QA refresh and export refresh through the browser-facing API proxy.
- Added the script syntax check to `scripts/run_readiness_check.sh`.
- Added `backend/tests/test_sprint47_workbench_interaction_smoke.py` to keep the UI anchors, readiness gate and interaction smoke contract in place.
- Updated `scripts/README.md`, `docs/TODO.md` and `CHANGELOG.md`.
Validation:
- RED: `cd backend && python -m pytest tests/test_sprint47_workbench_interaction_smoke.py -q` failed before implementation because the UI anchors, readiness script reference and interaction smoke script were missing.
- `cd backend && python -m pytest tests/test_sprint47_workbench_interaction_smoke.py -q` passed: 3 tests.
- `cd frontend && npm run typecheck` passed.
- `bash -n scripts/verify_workbench_interactions.sh` passed.
- `bash scripts/verify_workbench_interactions.sh http://192.168.10.150:1202` passed against the pre-deploy runtime API surface.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 198 tests.
- `bash scripts/run_readiness_check.sh` passed.
- `cd frontend && npm run build` passed.
- `cd backend && python -m alembic heads` passed: `202606120900 (head)`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1` passed and redeployed the all-in-one container to Tower on port 1202.
- `bash scripts/verify_workbench_interactions.sh http://192.168.10.150:1202` passed after redeploy.
- `bash scripts/verify_workbench_default_state.sh http://192.168.10.150:1202` passed after redeploy.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed after redeploy.
- Live browser check against `http://192.168.10.150:1202` passed using the new anchors: project, map, dataset, QA/QC and export panels were present; QA refresh and export metadata actions worked; latest export updated; no horizontal overflow was detected.
Limitations:
- The shell smoke validates the state behind the controls but does not click rendered controls by itself. The added `data-testid` anchors are intended for Codex/browser click checks and future browser artifact automation.
- No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.
Next recommended pass:
- Add persisted screenshot artifact automation for the anchored browser pass, or move to a backend service contract audit if UI stabilization is sufficient.
## Sprint 46 Workbench default-state smoke (2026-06-17)
Changed:
- Added `scripts/verify_workbench_default_state.sh`, a dependency-light runtime smoke for the browser-facing workbench default demo state.
- The smoke calls the offline demo workflow, then verifies `GeoIntel Demo - Building QA`, `Demo AOI - Geel buildings`, `2/2 ready` datasets and a persisted QA/QC result through canonical `data.items` envelopes.
- Added the script syntax check to `scripts/run_readiness_check.sh`.
- Extended `backend/tests/test_readiness_gate.py` so the readiness gate and script keep covering the default-state smoke contract.
- Updated `scripts/README.md` and `CHANGELOG.md`.
Validation:
- RED: `cd backend && python -m pytest tests/test_readiness_gate.py -q` failed before implementation because `verify_workbench_default_state.sh` was missing and readiness did not reference it.
- `cd backend && python -m pytest tests/test_readiness_gate.py -q` passed: 9 tests.
- `bash -n scripts/verify_workbench_default_state.sh` passed.
- `bash scripts/verify_workbench_default_state.sh http://192.168.10.150:1202` passed.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 195 tests.
- `bash scripts/run_readiness_check.sh` passed.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `cd backend && python -m alembic heads` passed: `202606120900 (head)`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1` passed and redeployed the all-in-one container to Tower on port 1202.
- `bash scripts/verify_workbench_default_state.sh http://192.168.10.150:1202` passed after redeploy.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed after redeploy.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed after redeploy.
- Live browser check against `http://192.168.10.150:1202` passed at 1280x720: selected project `GeoIntel Demo - Building QA`, status showed `1 area`, `2/2 ready` datasets and `2 checks`, map workspace rendered and no horizontal overflow was detected.
Limitations:
- The committed smoke validates the connected default workbench state through HTTP/API contracts, not pixel layout. Browser screenshot and overflow validation remain a Codex/browser verification step.
- No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.
Next recommended pass:
- Add a deeper browser interaction smoke for core controls, starting with project switching, area selection and map layer opacity.
## Sprint 45 Default demo selection polish (2026-06-17)
Changed:
- Updated `frontend/src/hooks/useProjectWorkspace.ts` so cold-start project selection preserves an existing selected project, honors an explicit preferred project and otherwise prefers a populated demo/workbench project over an empty first project.
- New project creation now selects the newly created project immediately after creation.
- Updated `frontend/src/hooks/useDemoWorkflow.ts` so demo seed refresh passes the seeded project id to `loadProjects`.
- Extended orchestration tests to cover preferred demo selection and project creation selection behavior.
Validation:
- `cd backend && python -m pytest tests/test_sprint39_frontend_orchestration_hooks.py tests/test_sprint21_demo_workflow_smoke.py -q` passed: 11 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 194 tests.
- `bash scripts/run_readiness_check.sh` passed.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `cd backend && python -m alembic heads` passed: `202606120900 (head)`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- Browser check against local Vite preview with live backend passed after async settle: selected project `GeoIntel Demo - Building QA`, status showed `1 area`, `2/2 ready` datasets and `2 checks`.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1` passed and redeployed the all-in-one container to Tower on port 1202.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
- Live browser check against `http://192.168.10.150:1202` passed after async settle: selected project `GeoIntel Demo - Building QA`, status showed `1 area`, `2/2 ready` datasets and `2 checks`, with no horizontal overflow.
Limitations:
- No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.
- The heuristic probes up to eight project candidates on cold start; a future backend list endpoint with area/dataset counts would make this cleaner.
Next recommended pass:
- Add a lightweight browser regression script for the demo start page once the UI state is stable enough to automate end to end.
## Sprint 44 Workbench UI polish pass (2026-06-17)
Changed:
- Reworked `frontend/src/styles/app.css` from a minimal browser-default stylesheet into a compact GIS workbench skin with modern controls, restrained neutral/green accents, scroll-contained long panels and responsive layout rules.
- Promoted `MapWorkspace` above the dense workflow grid in `frontend/src/App.tsx` so GIS context is visible before lower-detail provider, AI, QA and export panels.
- Moved `DatasetPanel` into the first workflow row beside project/area/provider setup.
- Added a static layout regression test in `backend/tests/test_sprint30_workbench_components.py` for map-first ordering and scroll-contained workflow panels.
- Updated frontend README and changelog.
Validation:
- Browser visual check against local Vite preview passed at desktop width: map-first layout visible, workflow panels scroll-contained, page height reduced from roughly 14.9k px to roughly 3.2k px.
- Browser responsive check at 390px width passed with no horizontal overflow.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 194 tests.
- `bash scripts/run_readiness_check.sh` passed.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `cd backend && python -m alembic heads` passed: `202606120900 (head)`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1` passed and redeployed `geointel-all-in-one:latest` to Tower on port 1202.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
- Live browser check against `http://192.168.10.150:1202` passed: map-first layout rendered, scroll height roughly 3.2k px and no desktop horizontal overflow detected.
Limitations:
- No API contracts, migrations, provider fetching, AI behavior or product capabilities changed.
- This is still a dense operational workbench rather than a designed product shell with navigation or tabs.
- The live default selected project can still be an empty project with the demo name; project selection polish remains a separate follow-up.
Next recommended pass:
- Add UI browser regression coverage for the map-first demo workflow and polish the default project/demo selection state.
## Sprint 43 Workbench bootstrap hook decomposition (2026-06-17)
Changed:
- Moved frontend bootstrap, project-change reload/reset and detection/segmentation result reload effects from `frontend/src/App.tsx` into `frontend/src/hooks/useWorkbenchBootstrap.ts`.
- Kept `App.tsx` as a composition root that wires hook outputs into panels; it no longer imports `useEffect`.
- Extended orchestration tests so lifecycle side effects stay in the bootstrap hook.
- Updated frontend README, changelog and TODO status.
Validation:
- `cd backend && python -m pytest tests/test_sprint39_frontend_orchestration_hooks.py -q` passed: 9 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 193 tests.
- `bash scripts/run_readiness_check.sh` passed.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `cd backend && python -m alembic heads` passed: `202606120900 (head)`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1` passed and redeployed `geointel-all-in-one:latest` to Tower on port 1202.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
- `App.tsx` size audit after extraction: 621 lines; `useWorkbenchBootstrap.ts`: 81 lines.
Limitations:
- No UX behavior, API contracts, migrations, provider fetching or AI behavior changed.
- `App.tsx` line count remains high because it explicitly wires many panel props; the remaining size is primarily composition.
Next recommended pass:
- Pick the next V1 stabilization focus: UI browser regression coverage, backend service contract audit, or golden dataset expansion.
## Sprint 42 App entrypoint cleanup (2026-06-17)
Changed:
- Removed the stale `FormEvent`/`useState` React imports from `frontend/src/App.tsx`.
- Removed the UTF-8 BOM from `App.tsx` so patches and static checks use normal UTF-8 text.
- Added a regression test that verifies the clean entrypoint encoding and React import set.
- Recorded the current `App.tsx` size audit: 622 lines after the orchestration hook decomposition passes.
Validation:
- `cd backend && python -m pytest tests/test_sprint39_frontend_orchestration_hooks.py -q` passed: 8 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 192 tests.
- `bash scripts/run_readiness_check.sh` passed.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `cd backend && python -m alembic heads` passed: `202606120900 (head)`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1` passed and redeployed `geointel-all-in-one:latest` to Tower on port 1202.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
Limitations:
- No UX behavior, API contracts, migrations, provider fetching or AI behavior changed.
- `App.tsx` remains a large composition root; the remaining size is primarily panel wiring and hook outputs.
Next recommended pass:
- Optional bootstrap-effect extraction if another no-behavior size reduction is useful.
## Sprint 41 Demo workflow hook decomposition (2026-06-17)
Changed:
- Moved offline demo workflow orchestration from `frontend/src/App.tsx` into `frontend/src/hooks/useDemoWorkflow.ts`.
- Preserved the existing backend fixture seed flow and all cross-module selection updates for project, candidate/reference datasets, map AOI, QA/QC, detection, segmentation and exports.
- Extended static frontend orchestration tests so `demoApi.seedWorkflow` is owned by the new hook and not `App.tsx`.
- Updated frontend README, changelog and TODO status.
Validation:
- `cd backend && python -m pytest tests/test_sprint21_demo_workflow_smoke.py tests/test_sprint39_frontend_orchestration_hooks.py -q` passed: 9 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 191 tests.
- `bash scripts/run_readiness_check.sh` passed.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `cd backend && python -m alembic heads` passed: `202606120900 (head)`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1` passed and redeployed `geointel-all-in-one:latest` to Tower on port 1202.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
Limitations:
- No UX behavior, API contracts, migrations, provider fetching or AI behavior changed.
- `App.tsx` still has a UTF-8 BOM and a stale React import cleanup opportunity; TypeScript build is unaffected.
Next recommended pass:
- Do a final `App.tsx` size/import cleanup pass.
## Sprint 40 Project workspace hook decomposition (2026-06-17)
Changed:
- Moved project list/create state, area create state and project-scoped area/dataset loading into `frontend/src/hooks/useProjectWorkspace.ts`.
- Kept demo workflow orchestration in `App.tsx` because it coordinates project, dataset, QA/QC, detection, segmentation and export selections across multiple hooks.
- Moved default clip-area fallback selection into `frontend/src/hooks/useDatasetWorkflow.ts`.
- Moved default map-area fallback selection into `frontend/src/hooks/useMapWorkspaceState.ts`.
- Extended static frontend orchestration tests to lock these ownership boundaries.
- Updated frontend README, changelog and TODO status.
Validation:
- `cd backend && python -m pytest tests/test_sprint39_frontend_orchestration_hooks.py -q` passed: 6 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 190 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `bash scripts/run_readiness_check.sh` passed.
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1` rebuilt and redeployed the all-in-one Tower container at `http://192.168.10.150:1202`.
- Tower live migration smoke passed and reported `Database collation version: ok`.
- Tower browser runtime verification passed.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
Open:
- None for this pass.
Limitations:
- No UX behavior, API contracts, migrations, provider fetching or AI behavior changed.
- Demo workflow orchestration remains in `App.tsx` until it can be safely split without obscuring cross-module state updates.
Next recommended pass:
- Run full readiness and Tower deploy verification, then consider extracting the demo workflow coordinator into a dedicated hook.
## Sprint 39 Frontend orchestration decomposition (2026-06-17)
Changed:
- Moved provider capability loading state and `externalApi.listProviders` calls into `frontend/src/hooks/useProviderCapabilities.ts`.
- Moved change-detection state, validation and `analysisApi.runChangeDetection` calls into `frontend/src/hooks/useChangeDetectionWorkflow.ts`.
- Moved map-layer derived state, area GeoJSON feature construction and selected-feature reset behavior into `frontend/src/hooks/useMapWorkspaceState.ts`.
- Kept `App.tsx` as the cross-module composition layer without changing panel props, API contracts, migrations or product behavior.
- Added static regression tests for the extracted orchestration hooks.
- Updated frontend README, changelog and TODO status.
Validation:
- `cd backend && python -m pytest tests/test_sprint39_frontend_orchestration_hooks.py -q` passed: 4 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 188 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `bash scripts/run_readiness_check.sh` passed.
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1` rebuilt and redeployed the all-in-one Tower container at `http://192.168.10.150:1202`.
- Tower live migration smoke passed and reported `Database collation version: ok`.
- Tower browser runtime verification passed.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
Open:
- None for this pass.
Limitations:
- Project/area/dataset cross-load orchestration still lives in `App.tsx`; it is a good next low-risk decomposition target.
Next recommended pass:
- Run full readiness and Tower deploy verification, then extract project/area loading into a dedicated hook if behavior remains stable.
## Sprint 38 Export Center preview hardening (2026-06-17)
Changed:
- Hardened the export content preview path so HTML report artifacts return `EXPORT_CONTENT_UNSUPPORTED` instead of a generic JSON parse failure.
- Updated the frontend Export Center to offer JSON preview only for JSON/GeoJSON artifacts.
- HTML project report artifacts now display as download-only in the export list.
- Extracted export preview rendering from `frontend/src/App.tsx` into `frontend/src/components/exports/ExportPreview.tsx`.
- Updated API/frontend docs, changelog and TODO status.
Validation:
- `cd backend && python -m pytest tests/test_sprint17_export_foundation.py -q` passed: 10 tests.
- `cd frontend && npm run typecheck` passed.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest -W error::DeprecationWarning` passed: 184 tests.
- `cd frontend && npm run build` passed.
- `bash scripts/run_readiness_check.sh` passed.
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql` passed.
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1` rebuilt and redeployed the all-in-one Tower container at `http://192.168.10.150:1202`.
- Tower live migration smoke passed and reported `Database collation version: ok`.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
Open:
- None for this pass.
Limitations:
- This pass does not add new export formats, PDF reports, provider fetching, AI inference or migrations.
Next recommended pass:
- Run the full readiness gate, frontend build and Tower deploy smoke; then continue with shared workbench orchestration decomposition or export cleanup/history filtering.
## Sprint 37 Tower PostgreSQL collation maintenance (2026-06-17)
Changed:
- Performed the manual PostgreSQL collation maintenance action reported by the live migration smoke on the Tower all-in-one runtime.
- Created a pre-maintenance custom-format database backup at `backups/geointel-before-collation-refresh-20260617-065707.dump`.
- Ran `REINDEX DATABASE geointel;` followed by `ALTER DATABASE "geointel" REFRESH COLLATION VERSION;`.
- Confirmed the database collation metadata now matches the runtime collation version: `geointel stored=2.36 actual=2.36`.
Validation:
- `LIVE_SMOKE_CONTAINER=geointel bash scripts/live_migration_smoke.sh` passed on Tower and reported `Database collation version: ok`.
- `bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202` passed.
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202` passed.
Notes:
- An initial SSH script attempt was interrupted by PowerShell BOM/stdin handling before reindex or refresh executed; the subsequent base64-delivered script ran without `docker exec -i` stdin interference.
- Earlier backup attempts were left in `backups/` alongside the final validated backup.
- No code, API contracts, migrations, product features, provider fetching or AI behavior changed.
Next recommended pass:
- Continue with export/download polish or frontend export center hardening, using the now-clean Tower runtime as the validation target.
## Sprint 32 Unraid all-in-one runtime (2026-06-17)
Changed:
- Added `docker-compose.unraid.yml` for a single editable `geointel` container on Unraid.
- Added `deploy/unraid/Dockerfile.all-in-one` to build one image containing embedded PostGIS, backend GIS runtime, nginx and frontend static assets.
- Added `deploy/unraid/all-in-one-start.sh` to start embedded PostGIS, apply Alembic migrations, start FastAPI on internal localhost and serve nginx on container port 80.
- Added `deploy/unraid/nginx-all-in-one.conf` so `/api` and `/health` proxy to `127.0.0.1:8000` inside the same container.
- Updated `deploy/unraid/geointel.env.example`, Unraid XML template and README for one-container operation and editable web/storage/database paths.
- Updated Tower deploy scripts to stop the old multi-container stack without deleting volumes and start `docker-compose.unraid.yml`.
- Updated `scripts/live_migration_smoke.sh` to support both all-in-one `geointel` and legacy `backend` Compose services.
- Added root `.dockerignore` for all-in-one builds.
- Updated Sprint 31 tests to cover the all-in-one Dockerfile, startscript, nginx config, deploy scripts and template metadata.
Validation:
- `python -m pytest backend/tests/test_sprint31_unraid_template.py backend/tests/test_live_migration_smoke_script.py backend/tests/test_docker_runtime_config.py` passed: 26 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest` passed: 179 tests.
- `bash scripts/run_readiness_check.sh` passed: 179 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `cd backend && python -m alembic heads` passed: single head `202606120900`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- `bash -n deploy/unraid/all-in-one-start.sh` passed.
Notes:
- No API contracts, migrations, product features, provider fetching or AI behavior changed.
- Local Windows environment does not have `docker` in PATH; Tower deployment should provide the live all-in-one Docker validation.
## Sprint 31 Unraid deployment template (2026-06-17)
Changed:
- Made `docker-compose.yml` configurable through `.env` defaults for frontend port, backend port, storage path, PostGIS database/user/password, CORS origins and upload limit.
- Added `deploy/unraid/geointel.env.example` for Unraid/Tower runtime configuration.
- Added `deploy/unraid/geointel-unraid-template.xml` as Unraid/DockerMan-style metadata for the editable Compose stack settings.
- Added `deploy/unraid/geointel-icon.svg` and `deploy/unraid/geointel-icon.png`, served through matching `frontend/public` assets.
- Added the frontend favicon link for the GeoIntel icon.
- Added Sprint 31 tests for Unraid template coverage, compose variable coverage, docs and icon availability.
- Updated root README, TODO and changelog docs.
Validation:
- `python -m pytest backend/tests/test_sprint31_unraid_template.py backend/tests/test_docker_runtime_config.py` passed: 22 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest` passed: 177 tests.
- `bash scripts/run_readiness_check.sh` passed: 177 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `cd backend && python -m alembic heads` passed: single head `202606120900`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- Tower deploy via `scripts/deploy_tower.ps1` passed after commit `3a8b82f`.
- Tower Docker Compose config/build/up passed with the env-default compose file.
- Tower live migration smoke passed with PostGIS 3.4 and Alembic head `202606120900`.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
- Additional HTTP smoke passed for frontend HTML, `GET /api/v1/projects`, `/geointel-icon.svg` and `/geointel-icon.png`.
Notes:
- Local Windows environment does not have `docker` in PATH, so local `docker compose config` could not be run from this machine.
- Tower deployment validated Docker Compose config and live runtime after commit.
- No API contracts, backend behavior, migrations, product features, provider fetching or AI behavior changed.
## Sprint 30 workbench component decomposition (2026-06-17)
Changed:
- Moved persisted QA/QC result rendering from `frontend/src/App.tsx` into `frontend/src/components/quality/QualityResultsPanel.tsx`.
- Moved map layer controls, MapLibre composition and feature inspector rendering into `frontend/src/components/map/MapWorkspace.tsx`.
- Updated map/workbench and QA regression tests for the new component boundaries.
- Added Sprint 30 component wiring tests to keep QA and map markup out of `App.tsx`.
- Updated frontend README, TODO and changelog docs.
Validation:
- `python -m pytest backend/tests/test_sprint30_workbench_components.py backend/tests/test_sprint27_frontend_workflow_hooks.py backend/tests/test_sprint19_map_workbench.py` passed: 9 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest` passed: 173 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `bash scripts/run_readiness_check.sh` passed: 173 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `cd backend && python -m alembic heads` passed: single head `202606120900`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- Tower deploy via `scripts/deploy_tower.ps1` passed after commit `acf9590`.
- Tower live migration smoke passed with PostGIS 3.4 and Alembic head `202606120900`.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
- Additional HTTP smoke passed for frontend HTML and `GET /api/v1/projects` through the frontend proxy.
Notes:
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign changed.
- Next maintainability pass should split export preview and remaining shared workbench orchestration into focused components/hooks.
## Sprint 29 dataset component decomposition (2026-06-17)
Changed:
- Moved dataset upload/list rendering from `frontend/src/App.tsx` into `frontend/src/components/datasets/DatasetPanel.tsx`.
- Moved dataset detail and job-list rendering into `frontend/src/components/datasets/DatasetDetailPanel.tsx`.
- Split raster controls and vector controls into `frontend/src/components/datasets/RasterControls.tsx` and `frontend/src/components/datasets/VectorControls.tsx`.
- Updated Sprint 28 regression tests for the new component boundary and added Sprint 29 component wiring tests.
- Updated frontend README, TODO and changelog docs.
Validation:
- `python -m pytest backend/tests/test_sprint29_dataset_components.py backend/tests/test_sprint28_dataset_workflow_hook.py backend/tests/test_sprint27_frontend_workflow_hooks.py` passed: 10 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest` passed: 170 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `bash scripts/run_readiness_check.sh` passed: 170 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `cd backend && python -m alembic heads` passed: single head `202606120900`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- Tower deploy via `scripts/deploy_tower.ps1` passed after commit `1cbb356`.
- Tower live migration smoke passed with PostGIS 3.4 and Alembic head `202606120900`.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
- Additional HTTP smoke passed for frontend HTML and `GET /api/v1/projects` through the frontend proxy.
Notes:
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign changed.
- Next maintainability pass should split change detection, QA/QC results and map workspace controls into focused presentational components.
## Sprint 28 dataset workflow hook hardening (2026-06-17)
Changed:
- Moved dataset selection, upload form state, dataset detail loading, dataset jobs and raster/vector operation orchestration from `frontend/src/App.tsx` into `frontend/src/hooks/useDatasetWorkflow.ts`.
- Kept project dataset listing in `App.tsx` so project/area loading remains the shared workbench boundary.
- Added regression tests to verify App uses the dataset workflow hook and still wires dataset, raster and vector callbacks.
- Updated frontend README, TODO and changelog docs.
Validation:
- `python -m pytest backend/tests/test_sprint28_dataset_workflow_hook.py backend/tests/test_sprint27_frontend_workflow_hooks.py backend/tests/test_sprint26_frontend_workflow_hooks.py` passed: 11 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest` passed: 167 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `bash scripts/run_readiness_check.sh` passed: 167 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `cd backend && python -m alembic heads` passed: single head `202606120900`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- Initial Tower rebuild hit Docker btrfs storage exhaustion; safely reclaimed build cache only with `docker builder prune -af` without pruning volumes.
- Tower Docker storage recovered from `/var/lib/docker` 94% used to 58% used after cleanup and rebuild.
- Tower deploy via `scripts/deploy_tower.ps1` passed after commit `361776c`.
- Tower live migration smoke passed with PostGIS 3.4 and Alembic head `202606120900`.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
- Additional HTTP smoke passed for frontend HTML and `GET /api/v1/projects` through the frontend proxy.
Notes:
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign changed.
- Next maintainability pass should split dataset detail, raster controls and vector controls into presentational components fed by the hook state.
## Sprint 27 export and QA workflow hook hardening (2026-06-17)
Changed:
- Moved Export Center orchestration state and API calls from `frontend/src/App.tsx` into `frontend/src/hooks/useExportWorkflow.ts`.
- Moved QA/QC comparison state and persisted quality-check listing from `frontend/src/App.tsx` into `frontend/src/hooks/useQualityWorkflow.ts`.
- Added regression tests to verify App uses export/quality hooks and still wires QA/QC results plus ExportCenter callbacks.
- Updated frontend README, TODO and changelog docs.
Validation:
- `python -m pytest backend/tests/test_sprint27_frontend_workflow_hooks.py backend/tests/test_sprint26_frontend_workflow_hooks.py` passed: 8 tests.
- `python -m compileall backend/app` passed.
- `cd backend && python -m pytest` passed: 164 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `bash scripts/run_readiness_check.sh` passed: 164 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `cd backend && python -m alembic heads` passed: single head `202606120900`.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- Tower deploy via `scripts/deploy_tower.ps1` passed after commit `fd0000f`.
- Tower live migration smoke passed with PostGIS 3.4 and Alembic head `202606120900`.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
- Additional HTTP smoke passed for frontend HTML and `GET /api/v1/projects` through the frontend proxy.
Notes:
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign changed.
- Local Windows Docker CLI was unavailable (`docker` command not found); Tower deployment remains handled through `scripts/deploy_tower.ps1`.
- Next maintainability pass should extract dataset/raster/vector operation workflows from `App.tsx`.
## Sprint 26 frontend workflow hook hardening (2026-06-17)
Changed:
- Moved Detection Lab orchestration state and API calls from `frontend/src/App.tsx` into `frontend/src/hooks/useDetectionWorkflow.ts`.
- Moved Segmentation Lab orchestration state and API calls from `frontend/src/App.tsx` into `frontend/src/hooks/useSegmentationWorkflow.ts`.
- Added shared frontend `formatError` helper under `frontend/src/lib/formatError.ts`.
- Added regression tests to verify App uses workflow hooks and still wires DetectionLab/SegmentationLab callbacks.
- Updated frontend README, TODO and changelog docs.
Validation:
- `python -m pytest backend/tests/test_sprint26_frontend_workflow_hooks.py backend/tests/test_sprint22_workbench_status_strip.py` passed: 6 tests.
- `cd frontend && npm run typecheck` passed.
- `cd frontend && npm run build` passed.
- `bash scripts/run_readiness_check.sh` passed: 160 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `python -m compileall backend/app` passed.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- Tower deploy/live migration/browser runtime passed after commit `6c32f29`.
- In-app browser check passed on `http://192.168.10.150:1202`: workbench, status strip, Detection Lab, Segmentation Lab and Export Center visible with no console error logs.
Notes:
- No API contracts, backend behavior, migrations, product features, provider fetching, AI behavior or UI redesign changed.
## Sprint 25 YOLO compatibility smoke hardening (2026-06-17)
Changed:
- Added explicit `--check-model-load` support to `scripts/yolo_preflight.py`, `backend/scripts/yolo_preflight.py` and `YoloPreflightService`.
- The model-load smoke requires real optional AI dependencies, loads only an existing local model file, runs no inference and does not download weights.
- The CLI rejects `--check-model-load` with `--assume-dependencies` to avoid false-positive AI readiness.
- Added regression tests for mocked successful load, load failure reporting and CLI guard behavior.
- Added Python compile validation for both YOLO preflight entrypoints to the readiness gate.
- Updated AI pipeline, scripts, backend, TODO and changelog docs, including Docker runtime usage.
Validation:
- `python -m py_compile scripts/yolo_preflight.py` passed.
- `python -m pytest backend/tests/test_sprint13_yolo_preflight.py backend/tests/test_readiness_gate.py` passed: 14 tests.
- `bash scripts/run_readiness_check.sh` passed: 156 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `python -m compileall backend/app` passed.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` passed.
- Tower deploy/live migration/browser runtime passed after commit `6c32f29`.
- In-app browser check passed on `http://192.168.10.150:1202`: workbench, status strip, Detection Lab, Segmentation Lab and Export Center visible with no console error logs.
- Tower deploy/live migration/browser runtime passed after commit `382dcad`.
- Backend-container YOLO preflight sanity passed: default status `not_configured`, `will_download_models=false`, `will_run_inference=false`.
- Backend-container CLI guard passed: `--check-model-load` with `--assume-dependencies` is rejected.
Notes:
- No base dependencies, API contracts, migrations, product features, provider fetching or detection persistence behavior changed.
## Sprint 24 demo/export artifact cleanup tooling (2026-06-17)
Changed:
- Added `scripts/cleanup_demo_artifacts.py` for dry-run-first cleanup of old offline demo export artifacts.
- Added `backend/scripts/cleanup_demo_artifacts.py` so the same cleanup can run inside the backend Docker container.
- Cleanup is constrained to an exact demo project name by default, keeps the newest exports per project and refuses file deletion outside `STORAGE_ROOT`.
- Added regression tests for cleanup selection, path safety, dry-run candidate reporting and readiness gate coverage.
- Added Python compile validation for the cleanup script to `scripts/run_readiness_check.sh`.
- Documented cleanup usage in `scripts/README.md`, `docs/STORAGE_ARCHITECTURE.md`, `backend/README.md`, `docs/TODO.md` and `CHANGELOG.md`.
Validation:
- `python -m py_compile scripts/cleanup_demo_artifacts.py` passed.
- `python -m pytest backend/tests/test_sprint24_cleanup_demo_artifacts.py backend/tests/test_readiness_gate.py` passed: 10 tests.
- `bash scripts/run_readiness_check.sh` passed twice after adding the backend container entrypoint: 152 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.
- `python -m compileall backend/app` passed.
- `cd backend && python -m alembic upgrade head --sql` passed.
- `bash -n scripts/live_migration_smoke.sh` and `bash -n scripts/verify_demo_export_workflow.sh` passed.
- Local `docker compose config` could not run because the Windows Docker CLI is not installed in this Codex environment.
- Tower deploy/live migration/browser runtime passed after final commit `2d4e6bd`.
- Live backend-container cleanup dry-run exposed and then fixed confusing dry-run labeling so candidates are reported as `candidate_files`, not `deleted_files`; final dry-run reported 2 candidate files, 0 deleted files and 0 deleted export rows.
Notes:
- No API contracts, migrations, product features, provider fetching, AI inference or source dataset cleanup behavior changed.
## Sprint 23 V1 report handoff summary (2026-06-17)
Changed:
- Added V1 readiness summary data to project metadata exports.
- Added V1 Readiness Summary and Known Limitations sections to lightweight HTML project report exports.
- Included persisted AOI, dataset readiness, QA/QC and export-history counts in the handoff summary.
- Updated export tests, API contract docs, frontend README, TODO and changelog.
Tested:
- Passed: backend compile, export tests through full readiness, full backend pytest, frontend typecheck/build, Alembic heads, Alembic SQL upgrade, live smoke syntax check, Tower deploy, live migration smoke and live project report smoke.
Known limitations:
- Report export remains a lightweight HTML artifact, not a PDF designer or custom report builder.
Next recommended pass:
- Add optional cleanup tooling for stale demo/export artifacts if repeated smoke runs keep accumulating local artifacts.
## Sprint 22 V1 workbench status strip (2026-06-17)
Changed:
- Added `frontend/src/components/WorkbenchStatusStrip.tsx` to summarize existing V1 state for project, AOI, datasets, active map layer, QA/QC and exports.
- Wired the status strip into `frontend/src/App.tsx` using existing orchestration state only.
- Added compact status-strip styling and regression tests for the frontend wiring contract.`n- Hardened `frontend/src/components/GeoMap.tsx` so MapLibre source/layer updates wait for style readiness before adding sources.`n- Hardened demo project lookup so duplicate historical demo projects prefer complete fixture state before repairing incomplete state.
- Updated frontend README, TODO and changelog.
Tested:
- Passed: backend compile, focused pytest, full backend pytest with DeprecationWarning as error, frontend typecheck/build, Alembic heads, Alembic SQL upgrade, readiness via Git Bash and live smoke syntax check via Git Bash.
Known limitations:
- The strip is a read-only operator summary; it intentionally does not add new backend status APIs or product workflows.
Next recommended pass:
- Add a compact project handoff summary in exports/report output if the browser-facing V1 workflow remains green.
## Sprint 21 V1 demo workflow smoke hardening (2026-06-17)
Changed:
- Hardened `scripts/verify_demo_export_workflow.sh` so the explicit offline demo smoke validates area GeoJSON, fixture datasets, vector FeatureCollection content, vector feature summaries, persisted QA/QC metrics and export downloads through the frontend proxy.
- Updated the frontend demo workflow action to open the candidate vector fixture dataset after seeding/loading the demo, so the Map Workbench is populated without a manual dataset click.
- Added regression tests for the strengthened smoke script and frontend demo loading contract.
- Updated scripts/frontend documentation, changelog and TODO status.
Tested:
- Passed: backend compile, backend pytest with DeprecationWarning as error, readiness, frontend typecheck/build, Alembic heads, Alembic SQL upgrade, Tower deploy, live migration smoke, browser-runtime smoke and expanded demo/export workflow smoke.
Known limitations:
- The demo smoke intentionally seeds fixture demo data when run; it should be used as an explicit verification command, not as an implicit healthcheck.
Next recommended pass:
- Add a compact V1 dashboard/status strip for project, AOI, datasets, QA and exports so operators can see readiness at a glance after opening a project.
## Sprint 20 V1 selected area map overlay (2026-06-17)
Changed:
- Added GeoJSON geometry serialization for project areas so persisted AOIs can be displayed by the map workbench.
- Added a dedicated MapLibre area overlay layer with separate visibility and opacity controls.
- Added area list actions and map workspace controls to select the active AOI.
- Updated API/frontend docs, changelog and TODO status for selected area display.
Tested:
- Passed: backend compile, backend pytest with DeprecationWarning as error, readiness, frontend typecheck/build, Alembic heads, Alembic SQL upgrade, Tower deploy, live migration smoke, browser-runtime smoke and browser UI audit.
Known limitations:
- Area geometry is displayed as a simple filled/outlined GeoJSON overlay; no drawing/editing workflow is introduced in this pass.
Next recommended pass:
- Add a small V1 workflow polish pass for richer dataset/area empty states and a fixture-driven end-to-end browser smoke once the new build is deployed.
## Sprint 19 V1 map workbench controls (2026-06-17)
Changed:
- Added active MapLibre layer visibility and opacity controls.
- Added click-to-inspect feature property display for the active GeoJSON workbench layer.
- Added active layer label and feature count to the Map workspace panel.
- Updated the app header from the stale Sprint 9 label to the GeoIntel Kempen V1 Workbench identity.
- Added regression tests for the frontend map control and feature inspection wiring.
Limitations:
- The current workbench still shows one active GeoJSON overlay at a time; multi-layer stack ordering remains a later UI enhancement.
- Raster preview display still remains metadata/path-oriented unless the backend exposes a browser-safe raster image/tile URL.
- No API contracts, migrations, backend behavior, provider fetching, AI inference or new dependencies were introduced.
Validation planned:
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh` via Git Bash on Windows
- Tower redeploy through `scripts/deploy_tower.ps1`
## Sprint 18 vector change detection foundation (2026-06-16)
Changed:
- Added `POST /api/v1/analysis/change-detection` for comparing two vector datasets in the same project through the existing synchronous job envelope.
- Added `ChangeDetectionService` with persisted `vector_features` as the primary source of comparable geometries and explicit stored-GeoJSON fallback warnings for older datasets.
- Added frontend Change Detection controls, summary counts and MapLibre overlay styling for `added`, `removed` and `unchanged` feature properties.
- Added nginx no-cache headers for frontend HTML/assets after browser verification exposed stale cached modules on the LAN deployment.
- Added backend tests for persisted-vector comparison and canonical API envelope behavior.
Limitations:
- The foundation classifies `added`, `removed` and `unchanged` only. It does not emit fake `changed` objects without durable object ids/versioning.
- No migrations, live GRB/OSM/Sentinel fetching, AI inference, new dependencies, LiDAR, Copilot, Training Studio or separate Reports module were introduced.
Validation:
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh` via Git Bash on Windows
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql`
# Codex Execution Log
This file must be updated by Codex after each implementation pass.
## Format
```md
## Pass X — Title
Date:
### Completed
- ...
### Files changed
- ...
### Tests run
- ...
### Known limitations
- ...
### Next recommended pass
- ...
```
## Initial status
Specification phase completed through M0. No code foundation has been implemented yet.
## M2 Engineering Package
- [x] Add ADR decision records.
- [x] Add RFC placeholders for future modules.
- [x] Add API/database/event contracts.
- [x] Add model registry and class catalogs.
- [x] Add queue architecture.
- [x] Add acceptance matrix and test catalog.
- [x] Add Codex M2 build prompts.
- [ ] Start Codex Pass 01 backend foundation.
## M8 preparation
Added the tomorrow execution layer for Codex autonomy: Day 1 master prompt, pass prompts, failure recovery, quality gates, operator checklist and smoke script scaffold.
## Sprint 1 readiness hardening (2026-06-11)
Date: 2026-06-11
### Completed
- Hardened backend dependency declarations for Sprint 1 runtime modules in `backend/pyproject.toml`.
- Normalized helper scripts for backend/frontend install/test/dev/readiness across `python`/`python3` interpreter availability.
- Fixed PostGIS/geospatial stack compatibility issues (`geojson_service` import path, package config).
- Updated backend/frontend/docs/readme commands for import smoke, setup, and readiness verification.
- Fixed frontend shell script line-ending parsing failures and added `npm` availability checks.
- Added missing frontend type path fixes and TypeScript typing corrections.
- Added/verified minimal Sprint 1 tests for health and GeoJSON parsing/rejection behaviors.
### Files changed
- `backend/pyproject.toml`
- `backend/app/core/config.py`
- `backend/app/services/geojson_service.py`
- `backend/tests/test_health.py`
- `backend/tests/test_geojson_dataset_service.py`
- `backend/README.md`
- `frontend/package.json`
- `frontend/tsconfig.json`
- `frontend/src/components/GeoMap.tsx`
- `frontend/src/services/api/areas.ts`
- `frontend/src/services/api/projects.ts`
- `frontend/src/services/api/datasets.ts`
- `frontend/src/App.tsx`
- `frontend/README.md`
- `scripts/run_readiness_check.sh`
- `scripts/backend_install.sh`
- `scripts/backend_test.sh`
- `scripts/backend_dev.sh`
- `scripts/codex_pass_end_check.sh`
- `scripts/smoke_backend_import.sh`
- `scripts/frontend_install.sh`
- `scripts/frontend_typecheck.sh`
- `scripts/frontend_build.sh`
- `scripts/frontend_dev.sh`
- `README.md`
- `.env.example`
- `CHANGELOG.md`
- `Makefile`
### Tests run
- `python -m compileall backend/app` (pass)
- `cd backend; python -m pytest` (pass, 5 tests)
- `cd backend; python -c "from app.main import app; print(app.title)"` (pass)
- `bash scripts/run_readiness_check.sh` (pass)
- `bash scripts/smoke_backend_import.sh` (pass)
- `bash scripts/frontend_install.sh` (pass)
- `bash scripts/frontend_typecheck.sh` (pass)
- `bash scripts/frontend_build.sh` (pass)
- `make`-based targets not runnable in this environment (`make` command missing)
- `docker compose config` not runnable in this environment (`docker` command missing)
- `python3` commands fail in this environment because `python3` maps to Microsoft Store stub; use `python` instead.
### Known limitations
- `docker` and `make` are not installed in the current local shell environment.
- `python3` is not a usable interpreter in this environment; `python` must be used for all backend runtime/tests.
### Next recommended pass
- Run `docker compose` validation and DB-backed migration checks in an environment with Docker + PostGIS service available.
## Pass 12 — Sprint 2 Foundation
Date: 2026-06-11
### Completed
- Added vector/raster dataset typing and lifecycle states (`uploaded`, `validating`, `ready`, `failed`) in dataset service.
- Added vector metadata extraction details (feature counts, geometry types, bounds, area, CRS assumptions).
- Added raster metadata service with dependency-aware unavailable behavior and explicit `RASTER_PROCESSING_UNAVAILABLE` handling.
- Added dataset vector inspect/summary and raster metadata endpoints for project-scoped datasets.
- Persisted deterministic storage metadata for uploads (original/stored filename, MIME, size, checksum).
- Extended frontend dataset manager details panel with type/status/file metadata/feature counts and raster summary readiness.
- Added minimal Sprint 2 tests for vector metadata, legacy `geojson` compatibility, storage metadata persistence, and raster dependency fallback.
### Files changed
- `backend/app/services/dataset_service.py`
- `backend/app/services/raster_service.py`
- `backend/app/services/geojson_service.py`
- `backend/app/schemas/dataset.py`
- `backend/app/api/routes/datasets.py`
- `backend/app/services/storage_service.py`
- `backend/tests/test_geojson_dataset_service.py`
- `backend/tests/test_raster_service.py`
- `backend/tests/test_storage_service.py`
- `backend/README.md`
- `frontend/src/App.tsx`
- `frontend/src/services/api/datasets.ts`
- `frontend/src/types.ts`
- `docs/API_CONTRACTS.md`
- `docs/CODEX_EXECUTION_LOG.md`
- `.env.example`
- `backend/README.md`
- `frontend/README.md`
- `CHANGELOG.md`
- `README.md`
### Tests run
- Sprint 2 tests to be executed via readiness commands (see below).
### Known limitations
- `rasterio` is not required by default; raster metadata extraction is unavailable until installed in the environment.
- Docker and PostGIS validation still depends on local availability of Docker/DB runtime.
### Next recommended pass
- Keep Sprint 1/2 architecture; implement raster clipping/tiling APIs and status jobs before Detection/Segmentation modules.
## Pass 13 — Sprint 2 validation and legacy compatibility hardening
Date: 2026-06-11
### Completed
- Verified Sprint 2 readiness commands in current environment (where tools are available).
- Revalidated backend tests and frontend typecheck/build after a Sprint 2 compatibility patch.
- Added frontend vector-detail compatibility for legacy `geojson` dataset rows in Sprint 1 records.
- Confirmed backend import smoke and dataset/raster/vector service behavior remain intact.
### Files changed
- `frontend/src/App.tsx`
- `docs/CODEX_EXECUTION_LOG.md`
### Tests run
- `python -m compileall backend/app` (pass)
- `cd backend && python -m pytest` (pass, 11 tests)
- `bash scripts/run_readiness_check.sh` (pass)
- `bash scripts/smoke_backend_import.sh` (pass)
- `cd frontend && npm run typecheck` (pass)
- `cd frontend && npm run build` (pass)
- `cd backend; python3 -m compileall backend/app` (fails: python3 shim unavailable in this shell)
- `cd backend; python3 -c "from app.main import app; print(app.title)"` (fails: python3 shim unavailable in this shell)
- `docker compose config` (fails: docker command unavailable in this shell)
### Known limitations
- `python3` is not available in the current environment; use `python` commands for verification.
- `docker` is not available in the current environment.
### Next recommended pass
- Run the same sprint verification commands in an environment with `python3` and `docker` installed.
## Pass 14 — Sprint 3 operations + job foundation
Date: 2026-06-11
### Completed
- Added lightweight job model/migration and service layer with statuses `queued`, `running`, `success`, `failed`.
- Added job API endpoints for create/list/read/status under project scope.
- Added vector operation service foundation:
- inspect
- bbox
- stats
- clip by area
- buffer
- intersect
- Added raster operation foundation:
- inspect
- metadata
- preview readiness
- clip placeholder (dependency-aware)
- tile placeholder (dependency-aware)
- Added job-based execution wrappers for vector/raster operation endpoints.
- Updated dataset detail UI with available operations, job list/status, and derived output navigation.
- Added/updated Sprint 3 API contract and backend/frontend documentation updates.
### Files changed
- `backend/app/schemas/operations.py`
- `backend/app/schemas/__init__.py`
- `backend/app/services/vector_operations_service.py`
- `backend/app/services/raster_operations_service.py`
- `backend/app/services/job_service.py`
- `backend/app/api/routes/jobs.py`
- `backend/app/models/entities.py`
- `backend/app/models/__init__.py`
- `backend/alembic/versions/20260611212435_add_jobs_table.py`
- `backend/tests/test_vector_operations_service.py`
- `backend/tests/test_raster_operations_service.py`
- `backend/tests/test_storage_service.py`
- `frontend/src/App.tsx`
- `frontend/src/services/api/datasets.ts`
- `frontend/src/services/api/jobs.ts`
- `frontend/src/types.ts`
- `backend/README.md`
- `frontend/README.md`
- `docs/API_CONTRACTS.md`
- `docs/CODEX_EXECUTION_LOG.md`
- `CHANGELOG.md`
### Tests run
- `python -m compileall backend/app` (pass)
- `cd backend && python -m pytest` (pass)
- `bash scripts/run_readiness_check.sh` (pass)
- `bash scripts/smoke_backend_import.sh` (pass)
- `cd frontend && npm run typecheck` (pass)
- `cd frontend && npm run build` (pass)
### Known limitations
- Raster processing beyond readiness/metadata is intentionally dependency-aware placeholder in Sprint 3.
- `docker` remains unavailable in this environment.
- `python3` still resolves to Windows Store stub; use `python` for verification.
### Next recommended pass
- Install rasterio/GDAL for real raster clipping/tile implementations.
- Add queue-backed worker (Redis/RQ) behind existing synchronous job facade.
- Add deeper operation acceptance tests for output dataset geometry correctness and persisted metadata.
## Pass 15 — Sprint 4 raster foundation
Date: 2026-06-11
### Completed
- Finalized dependency-aware raster processing behavior for clip/tile/preview and improved metadata enrichment.
- Ensured raster metadata and preview responses include deterministic file metadata (`size_bytes`, `checksum_sha256`, `path`) where available.
- Added raster tile manifest generation with deterministic storage paths and returned manifest payload.
- Updated API contracts and execution documentation from placeholder wording to actual raster-op foundations.
- Added targeted Sprint 4 tests for missing-area clip behavior and tile manifest payload shape.
### Files changed
- `backend/app/services/raster_operations_service.py`
- `backend/app/api/routes/health.py`
- `backend/tests/test_raster_operations_service.py`
- `docs/API_CONTRACTS.md`
- `docs/CODEX_EXECUTION_LOG.md`
- `backend/README.md`
- `frontend/README.md`
- `README.md`
- `CHANGELOG.md`
### Tests run
- `python -m compileall backend/app`
- `cd backend && python -m pytest`
- `bash scripts/run_readiness_check.sh`
- `bash scripts/smoke_backend_import.sh`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
### Known limitations
- Raster dependency packages remain optional and will report `RASTER_PROCESSING_UNAVAILABLE` if absent.
- Raster clip/tile remain synchronous under the current in-process job wrapper.
### Next recommended pass
- Run full raster end-to-end tests with real GeoTIFF fixtures and validate output dataset metadata persistence.
## Pass 16 Sprint 4 raster operations foundation hardening
Date: 2026-06-11
### Completed
- Realized the Sprint 4 raster foundation readiness in implementation and docs alignment:
- metadata extraction now returns real raster profile fields when rasterio is available
- preview generation writes deterministic PNG artifacts and reuses cached previews
- clip and tile operations persist deterministic outputs and manifest structure
- all raster processing paths now use explicit dependency-aware errors when rasterio/numpy/pillow are missing
- Fixed remaining frontend render/type issues introduced during raster path handling.
- Strengthened raster tests for tile manifest minimum size and dependency-aware behavior.
- Updated sprint milestone docs to reflect Sprint 4 status:
- `backend/README.md`
- `frontend/README.md`
### Files changed
- `backend/app/services/raster_operations_service.py`
- `backend/tests/test_raster_operations_service.py`
- `backend/app/api/routes/datasets.py`
- `backend/app/schemas/operations.py`
- `frontend/src/App.tsx`
- `backend/README.md`
- `frontend/README.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Tests run
- `python -m compileall backend/app` (pass)
- `cd backend && python -m pytest` (pass, 26 tests)
- `bash scripts/run_readiness_check.sh` (pass)
- `bash scripts/smoke_backend_import.sh` (pass)
- `cd frontend && npm run typecheck` (pass)
- `cd frontend && npm run build` (pass)
### Known limitations
- `docker` command is unavailable in this environment, so `docker compose config` could not be executed.
- `python3` command is unavailable as an alias in this environment; use `python` instead.
- Full raster dependency stack may be unavailable in some dev environments; those cases intentionally return structured `RASTER_PROCESSING_UNAVAILABLE` responses.
### Next recommended pass
- Sprint 5: add end-to-end RasterOps coverage for CRS-preserving re-projection, export-quality metadata policy, and tile set artifact cleanup lifecycle.
## Pass 17 — Sprint 5 raster analytics hardening
Date: 2026-06-11
### Completed
- Implemented Sprint 5 raster analytics foundation:
- band statistics endpoint and service with dependency-aware unavailable mode.
- reproject operation with CRS validation and reprojection metadata persistence.
- clip/tile hardening for missing/invalid geometry and empty clip output handling.
- enriched tile manifest fields (`tile_set_id`, `tile_size`, `overlap`, `source_dataset_id`, `source_raster_id`, `bounds`, `count`, `tile_paths`, `ai_inference`, `tile_server`, `created_at`, parameters).
- Updated raster stats/job error tests:
- dependency-aware stats failure coverage.
- invalid CRS request validation for reproject.
- persisted derived dataset assertions for reproject and clip.
- failure persistence test for failed raster jobs (`_run_job_sync`).
- Strengthened raster frontend detail panel rendering:
- job result JSON is visible for raster/vector operations.
- clearer raster metadata/status visibility retained for CRS/bounds/resolution display.
- Updated docs:
- backend/README Sprint 5 section.
- frontend/README Sprint 5 section.
- CHANGELOG entry for Sprint 5.
### Files changed
- `backend/app/services/raster_operations_service.py` (final reproject and manifest hardening alignment)
- `backend/tests/test_raster_operations_service.py`
- `frontend/src/App.tsx`
- `backend/README.md`
- `frontend/README.md`
- `docs/API_CONTRACTS.md`
- `docs/RASTER_OPERATIONS_SPEC.md`
- `docs/CODEX_EXECUTION_LOG.md`
- `CHANGELOG.md`
### Tests run
- `python -m compileall backend/app` (pass)
- `cd backend && python -m pytest` (pass)
- `bash scripts/run_readiness_check.sh` (pass)
- `bash scripts/smoke_backend_import.sh` (pass)
- `cd frontend && npm run typecheck` (pass)
- `cd frontend && npm run build` (pass)
### Known limitations
- Raster statistics and reproject operations still depend on environment availability of `rasterio`/`numpy`.
- Raster dependency checks and operation errors remain dependency-aware when libraries are unavailable.
### Next recommended pass
- Sprint 6: add raster index/mask workflows (NDVI/NDWI/NDBI), tile serving or export packaging, and AI-ready dataset linking.
## Pass 18 - Sprint 6 spectral indices
### Completed
- Added local raster index operations (`ndvi`, `ndwi`, `ndbi`) under the existing raster operation architecture.
- Added typed band payload validation and explicit `INVALID_PARAMETERS` handling for missing/invalid band indexes.
- Implemented dependency-aware failure behavior for index execution (`RASTER_PROCESSING_UNAVAILABLE`) when `rasterio` or `numpy` are unavailable.
- Implemented local index output generation with float32 raster derivation and persisted provenance metadata on derived datasets.
- Extended dataset detail UI with spectral index controls (NDVI/NDWI/NDBI), run actions, and output dataset navigation from jobs.
- Updated API contracts, raster operation spec, and project documentation for Sprint 6 behavior.
### Files changed
- `backend/app/schemas/operations.py`
- `backend/app/services/raster_operations_service.py`
- `backend/app/api/routes/datasets.py`
- `backend/tests/test_raster_operations_service.py`
- `frontend/src/services/api/datasets.ts`
- `frontend/src/App.tsx`
- `frontend/src/types.ts`
- `docs/API_CONTRACTS.md`
- `docs/RASTER_OPERATIONS_SPEC.md`
- `backend/README.md`
- `frontend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Tests run
- `python -m compileall backend/app`
- `cd backend && python -m pytest`
- `bash scripts/run_readiness_check.sh`
- `bash scripts/smoke_backend_import.sh`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
### Known limitations
- Raster dependency checks remain optional; missing raster packages return explicit `RASTER_PROCESSING_UNAVAILABLE` results.
- Job execution remains synchronous under current Sprint 3 job facade.
- `docker` and `python3` availability still depend on developer environment.
### Next recommended pass
- Keep operation architecture stable, then add threshold/mask workflows and output export packaging in a follow-up pass.
## Pass 19 - RC-2 stabilization
Date: 2026-06-12
### Completed
- Fixed backend compile/import blockers identified in RC-1:
- corrected dataset upload parameter ordering.
- corrected schema package re-exports for area schemas.
- Fixed frontend typecheck/build blockers in `App.tsx`.
- Added Alembic migration for dataset reference/provenance metadata columns required by current ORM models.
- Fixed QA comparison runtime crash and added focused QA service coverage.
- Corrected envelope response-model mismatches for vector inspect and raster stats endpoints.
- Strengthened `scripts/run_readiness_check.sh` so readiness runs backend compile, backend tests, frontend typecheck and frontend build.
- Improved readiness Python interpreter selection so it chooses an interpreter capable of running pytest.
### Files changed
- `backend/app/services/dataset_service.py`
- `backend/app/schemas/__init__.py`
- `backend/app/api/routes/datasets.py`
- `backend/app/services/qa_service.py`
- `backend/alembic/versions/202606120001_add_dataset_reference_metadata.py`
- `backend/tests/test_qa_service.py`
- `frontend/src/App.tsx`
- `scripts/run_readiness_check.sh`
- `docs/CODEX_EXECUTION_LOG.md`
### Tests run
- `python -m compileall backend\\app` (pass)
- `cd backend && python -m pytest` (pass, 40 tests)
- `cd frontend && npm run typecheck` (pass)
- `cd frontend && npm run build` (pass; bundle-size warning only)
- `bash scripts/run_readiness_check.sh` (pass)
- `cd backend && python -m alembic heads` (pass, single head `202606120001`)
- `cd backend && python -m alembic upgrade head --sql` (pass, generated SQL includes required dataset metadata columns)
- `docker compose config` not runnable in this environment because `docker` is not installed.
### Known limitations
- Fresh online database migration was validated only as generated Alembic SQL in this environment; run `cd backend && python -m alembic upgrade head` against a live PostgreSQL/PostGIS database on a machine with Docker or Postgres available.
- Existing non-RC architecture limitations from RC-1 remain intentionally unfixed: synchronous job facade, file-first vector outputs, monolithic frontend component, and incomplete future AI/storage architecture.
### Next recommended pass
- Do not start Sprint 7 until RC-2 verification is repeated against a live Docker/PostGIS environment.
## Pass 20 - Sprint 7A persistence and QA foundation
Date: 2026-06-12
### Completed
- Added first-class `vector_features` ORM model and Alembic migration with dataset and GiST geometry indexes.
- Persisted uploaded vector GeoJSON features into PostGIS-backed `vector_features` while keeping original file storage intact.
- Added first-class `quality_checks` and `metrics` ORM models and Alembic migration indexes.
- Added `QualityService` for persisted QA/QC domain records and metric rows.
- Updated QA candidate-vs-reference route so successful QA jobs also persist a `QualityCheck` and metrics, and return `quality_check_id` in `result_json`.
- Hardened provider capability contracts for GRB and OSM as `not_configured` stubs with supported layers, geometry types and query modes.
- Added Sprint 7A tests for vector feature persistence, quality check persistence, metrics persistence, dataset role validation, provider contracts, migration integrity and QA route persistence.
- Updated database/API documentation for Vector Features Architecture, Quality Check Architecture, Metrics Architecture and Provider Architecture.
### Files changed
- `backend/app/models/entities.py`
- `backend/app/models/__init__.py`
- `backend/app/services/dataset_service.py`
- `backend/app/services/vector_feature_service.py`
- `backend/app/services/quality_service.py`
- `backend/app/api/routes/qa.py`
- `backend/app/providers/base.py`
- `backend/app/providers/grb.py`
- `backend/app/providers/osm.py`
- `backend/app/schemas/health.py`
- `backend/alembic/versions/202606120700_sprint7a_persistence_foundation.py`
- `backend/tests/test_sprint7a_persistence_foundation.py`
- `docs/DATABASE_IMPLEMENTATION_PLAN.md`
- `docs/API_CONTRACTS.md`
- `docs/CODEX_EXECUTION_LOG.md`
- `CHANGELOG.md`
### Tests run
- `python -m compileall backend/app` (pass)
- `python -m pytest backend -q` (pass, 47 tests)
### Known limitations
- Sprint 7A intentionally does not implement GRB downloads, OSM downloads, Detection Lab, Segmentation Lab, LiDAR, AI Copilot, Training Studio or Reports.
- Job execution remains the existing synchronous facade.
- Live database migration still needs validation against a running PostgreSQL/PostGIS service in an environment with Docker or Postgres available.
### Next recommended pass
- Complete full release validation commands, including Alembic heads/SQL generation, readiness script, frontend typecheck/build and Docker config if Docker is available.
### Validation addendum
Date: 2026-06-12
Additional Sprint 7A validation completed after migration index cleanup:
- `python -m compileall backend/app` (pass)
- `cd backend && python -m pytest` (pass, 47 tests)
- `bash scripts/run_readiness_check.sh` (pass)
- `cd frontend && npm run typecheck` (pass)
- `cd frontend && npm run build` (pass; Vite chunk-size warning only)
- `cd backend && python -m alembic heads` (pass, single head `202606120700`)
- `cd backend && python -m alembic upgrade head --sql` (pass; generated SQL includes `vector_features`, `quality_checks`, `metrics` and the named GiST index `ix_vector_features_geometry`)
- `docker compose config` could not run because Docker is not installed in this shell.
## Pass 21 - Sprint 7B provider integration skeleton (2026-06-12)
- Implemented central provider registry for `grb`, `osm`, `manual` and `fixture`.
- Added provider capability, layer, status and future import-contract endpoints using the existing response envelope style.
- Preserved GRB and OSM as explicit `not_configured` providers; no live WFS, Overpass, download or fake provider data was introduced.
- Documented and tested provider-to-dataset mapping rules; future provider output must flow through `DatasetService` / `VectorFeatureService` rather than direct `vector_features` writes.
- Added frontend Provider Capabilities panel without live import buttons for GRB/OSM.
- Added opt-in `scripts/live_migration_smoke.sh` for real PostGIS migration smoke checks.
- Added Sprint 7B tests for provider registry, API envelopes, invalid provider handling, import contract and smoke script presence.
## Pass 22 - Sprint 8 Detection Lab foundation (2026-06-12)
### Completed
- Added first-class `detections` ORM model and Alembic migration with project, dataset, analysis run, class and GiST geometry indexes.
- Hardened `analysis_runs` with dataset, job, model, result and created-at fields while keeping jobs conceptually separate from analysis lifecycle.
- Added model registry capability service for `yolo-placeholder` (`not_configured`) and `manual-fixture-detector` (explicit fixture/demo only).
- Added `DetectionService` boundary for model listing, request validation, analysis run creation, job creation, unavailable model responses and explicit fixture persistence.
- Added Detection Lab API endpoints under `/api/v1/detection` using the existing response envelope style.
- Added minimal frontend Detection Lab panel for model capability status, raster dataset selection, confidence threshold and run result/error display.
- Updated database, API, AI pipeline, backend/frontend README, TODO and changelog docs.
### Known limitations
- Real YOLO/PyTorch inference is not enabled and no model downloads are performed.
- Fixture detector requires `fixture_mode=true` and explicit fixture detections; it is not production inference.
- Segmentation, LiDAR, AI Copilot, Training Studio and Reports remain out of scope.
### Next recommended pass
- Verify Sprint 8 with full backend/frontend/readiness/Alembic gates, then perform a Sprint 8 verification audit before Sprint 8B real YOLO integration.
## Pass 23 - Sprint 8B configured YOLO foundation (2026-06-12)
### Completed
- Added optional backend `ai` dependency group for `ultralytics` and `torch`; normal backend startup remains import-safe without those packages.
- Added YOLO configuration settings:
- `YOLO_ENABLED`
- `YOLO_MODEL_PATH`
- `YOLO_MODEL_ID`
- `YOLO_MODEL_DISPLAY_NAME`
- `YOLO_MODEL_VERSION`
- `YOLO_DEVICE`
- `YOLO_IMAGE_SIZE`
- `YOLO_MAX_TILES`
- `YOLO_BATCH_SIZE`
- Added `yolo-configured` model registry capability with honest `not_configured`, `dependency_unavailable` and `configured` states.
- Added `YoloDetectionAdapter` that imports Ultralytics only in the load path and refuses missing local model files before model construction.
- Added raster tile manifest validation and configured tile-limit enforcement for real YOLO runs.
- Added pixel bbox to EPSG:4326 polygon georeferencing from tile transform or bounds metadata.
- Routed configured YOLO outputs through existing `DetectionService`, `Job`, `AnalysisRun` and first-class `Detection` persistence.
- Added Detection Lab tile manifest path input for the configured YOLO model.
- Added mocked Sprint 8B tests for model registry status, dependency-unavailable behavior, tile manifest validation, georeferencing and persisted detections.
- Updated API, AI pipeline, backend/frontend README and changelog documentation.
### Known limitations
- Sprint 8B does not add workers/queues; configured YOLO runs remain synchronous behind the existing job abstraction.
- Real model loading is validated at execution time. The registry reports configured when dependencies and local model path are present.
- No model weights are downloaded by GeoIntel.
- Detection visualization/map overlays are deferred.
- Segmentation, LiDAR, AI Copilot, Training Studio and Reports remain out of scope.
### Next recommended pass
- Run full Sprint 8B validation and then perform a Sprint 8B verification audit before advancing to detection visualization/QA or segmentation planning.
## Pass 24 - Sprint 8C detection visualization and QA integration (2026-06-12)
### Completed
- Added detection result review endpoints for listing runs, listing detections by run/dataset, retrieving detection detail and returning persisted detections as GeoJSON FeatureCollections.
- Added lightweight detection filters for class name and minimum confidence.
- Added detection QA against persisted reference `vector_features` using the existing `QualityService`, `quality_checks` and `metrics` persistence path.
- Added frontend Detection Lab run selection, detection table, class/confidence filters and MapLibre detection GeoJSON overlay via the existing map component.
- Added frontend detection QA controls and metric summary display.
- Added Sprint 8C tests for GeoJSON output, list/filter behavior, detection detail, API envelope shape, QA persistence and no-match QA behavior.
- Added direct Sprint 8B tests for missing and invalid tile manifest files.
- Updated API, AI pipeline, backend/frontend README and changelog documentation.
### Known limitations
- Detection QA requires reference datasets to have persisted `vector_features`; unsupported references return a clear error instead of fake metrics.
- Detection overlays reuse the existing single GeoJSON map layer styling; complex class-based map styling is deferred.
- Segmentation, LiDAR, AI Copilot, Training Studio and Reports remain out of scope.
### Next recommended pass
- Run full Sprint 8C validation and perform a Sprint 8C verification audit before starting Sprint 9 Segmentation Lab.
## Pass 25 - Sprint 9 Segmentation Lab foundation (2026-06-12)
### Completed
- Added first-class `segmentations` ORM model and Alembic migration with project, dataset, job, analysis run, class and GiST geometry indexes.
- Added segmentation model registry capabilities for `segmentation-placeholder`, `fixture-segmenter`, `yolo-seg-configured` and `sam-configured`.
- Added `SegmentationService` boundary for raster validation, job/analysis-run lifecycle, unavailable model responses and explicit fixture-only persistence.
- Added segmentation adapter placeholder module with no SAM, YOLO-seg, torch or ultralytics imports.
- Added persisted segmentation GeoJSON output generated from PostGIS geometry and provenance properties.
- Added segmentation QA against persisted reference `vector_features` using existing `quality_checks` and `metrics`.
- Added minimal frontend Segmentation Lab panel for model states, raster selection, runs/results, GeoJSON map overlay and QA metric display.
- Updated API, AI pipeline, storage, database, backend/frontend README and changelog documentation.
### Files changed
- `backend/app/models/entities.py`
- `backend/app/models/__init__.py`
- `backend/alembic/versions/202606120900_sprint9_segmentation_foundation.py`
- `backend/app/schemas/segmentation.py`
- `backend/app/schemas/__init__.py`
- `backend/app/services/model_registry_service.py`
- `backend/app/services/segmentation_adapter.py`
- `backend/app/services/segmentation_service.py`
- `backend/app/api/routes/segmentation.py`
- `backend/app/main.py`
- `backend/tests/test_sprint9_segmentation_foundation.py`
- `frontend/src/types.ts`
- `frontend/src/services/api/segmentation.ts`
- `frontend/src/services/api/index.ts`
- `frontend/src/App.tsx`
- `docs/API_CONTRACTS.md`
- `docs/AI_PIPELINES.md`
- `docs/STORAGE_ARCHITECTURE.md`
- `docs/DATABASE_IMPLEMENTATION_PLAN.md`
- `backend/README.md`
- `frontend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Tests run
- `python -m pytest backend/tests/test_sprint9_segmentation_foundation.py -q` (red first: missing `Segmentation` import, then pass)
- `cd backend && python -m pytest` (pass, 88 tests)
- `cd frontend && npm run typecheck` (pass)
### Known limitations
- Sprint 9 intentionally does not implement real SAM, real YOLO-seg, model downloads, new AI dependencies or production-scale async inference.
- Fixture segmenter requires explicit `fixture_mode=true` and explicit fixture segmentations; it is not production inference.
- Metric area is only persisted when provided by the fixture/output payload; Sprint 9 does not compute authoritative area from masks.
### Next recommended pass
- Run full Sprint 9 validation and then perform Sprint 9 Verification Audit before considering future real SAM/YOLO-seg integration.
### Validation addendum
- `python -m compileall backend/app` (pass)
- `cd backend && python -m pytest` (pass, 88 tests)
- `bash scripts/run_readiness_check.sh` (pass)
- `cd frontend && npm run typecheck` (pass)
- `cd frontend && npm run build` (pass; existing Vite chunk-size warning only)
- `cd backend && python -m alembic heads` (pass, single head `202606120900`)
- `cd backend && python -m alembic upgrade head --sql` (pass; generated SQL includes `segmentations` and GiST index)
- `bash -n scripts/live_migration_smoke.sh` (pass)
- `docker compose config` could not run because Docker is not installed in this shell.
## Pass 26 - Sprint 10 release hardening and frontend modularization (2026-06-13)
### Completed
- Extracted Provider Capabilities, Detection Lab and Segmentation Lab sections from `frontend/src/App.tsx` into focused frontend components.
- Preserved existing workbench state ownership, API client calls, map overlay behavior and UI copy.
- Hardened `scripts/run_readiness_check.sh` with Alembic head verification and live migration smoke script syntax validation.
- Updated frontend README and changelog documentation for Sprint 10 maintainability work.
### Files changed
- `frontend/src/App.tsx`
- `frontend/src/components/providers/ProviderPanel.tsx`
- `frontend/src/components/detection/DetectionLab.tsx`
- `frontend/src/components/segmentation/SegmentationLab.tsx`
- `scripts/run_readiness_check.sh`
- `frontend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- Sprint 10 intentionally does not add new backend capabilities, migrations, product features, AI dependencies or live provider fetching.
- `App.tsx` still owns shared workbench state orchestration; further extraction can be considered in a later maintainability pass if needed.
### Sprint 10 addendum - additional frontend extraction
- Extracted `frontend/src/components/project/ProjectPanel.tsx` and `frontend/src/components/project/AreaPanel.tsx` from `frontend/src/App.tsx`.
- Kept project and area form state owned by `App.tsx`; extracted components receive state and callbacks only.
- `cd frontend && npm run typecheck` passed after the additional extraction.
## Pass 27 - Sprint 11 Live Docker/PostGIS Runtime Validation (2026-06-13)
### Completed
- Hardened `scripts/live_migration_smoke.sh` so it runs `SELECT 1`, applies `alembic upgrade head`, then checks `PostGIS_Version()`.
- Added migrated schema-object checks for core tables and geometry indexes after the live migration step.
- Added `backend/tests/test_live_migration_smoke_script.py` to lock the smoke-script ordering and schema-check contract.
- Documented the Docker/PostGIS validation command sequence, expected local `DATABASE_URL` and cleanup commands in `backend/README.md`.
### Files changed
- `scripts/live_migration_smoke.sh`
- `backend/tests/test_live_migration_smoke_script.py`
- `backend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Runtime status
- Docker is not installed or not available in this shell, so `docker compose config`, `docker compose up -d db` and the live container-backed smoke could not be completed here.
- On a Docker-enabled machine, run:
- `docker compose config`
- `docker compose up -d db`
- `DATABASE_URL=postgresql+psycopg://geointel:geointel@localhost:5432/geointel bash scripts/live_migration_smoke.sh`
### Known limitations
- Sprint 11 did not add product behavior, API contracts, migrations, AI dependencies or provider fetching.
- Live runtime validation is partially blocked until Docker/PostGIS is available in the execution environment.
## Pass 28 - Sprint 12 QA/QC golden dataset and benchmarking (2026-06-15)
### Completed
- Added deterministic golden QA/QC fixtures for reference and predicted building polygons.
- Added `fixtures/golden/expected_qa_metrics.json` with the expected partial-match baseline.
- Added `scripts/run_golden_qa_benchmark.py` to run existing `QaService` logic and verify `QualityService` persistence output.
- Added backend tests for expected golden metrics, benchmark command output and persisted metric keys.
- Updated QA/QC specification, backend README and changelog documentation.
### Files changed
- `fixtures/golden/reference_buildings.geojson`
- `fixtures/golden/predicted_buildings.geojson`
- `fixtures/golden/expected_qa_metrics.json`
- `scripts/run_golden_qa_benchmark.py`
- `backend/tests/test_sprint12_golden_qa_benchmark.py`
- `docs/QA_QC_SPECIFICATION.md`
- `backend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Expected benchmark metrics
- precision: `0.5`
- recall: `0.5`
- F1: `0.5`
- mean IoU: `0.8339768339761133`
- false positives: `1`
- false negatives: `1`
### Known limitations
- The benchmark uses explicit fixture/demo data and an in-memory persistence session; it does not replace the pending Docker/PostGIS live smoke.
- Sprint 12 does not add product features, API contracts, migrations, live providers, AI model execution or new dependencies.
## Pass 29 - Sprint 13 Real YOLO operational hardening (2026-06-15)
### Completed
- Added `YoloPreflightService` for local configured-YOLO readiness checks without model loading, inference or downloads.
- Added `scripts/yolo_preflight.py` for CLI checks of enabled state, dependencies, local model file, tile manifest validity, tile limit and tile paths.
- Added Sprint 13 backend tests for disabled, dependency-unavailable and ready preflight states plus CLI JSON output.
- Updated AI pipeline, backend README and changelog documentation.
### Files changed
- `backend/app/services/yolo_preflight_service.py`
- `scripts/yolo_preflight.py`
- `backend/tests/test_sprint13_yolo_preflight.py`
- `docs/AI_PIPELINES.md`
- `backend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- Preflight does not prove model compatibility or inference correctness; it intentionally avoids loading YOLO models.
- Optional AI dependencies are still not installed by default.
- Docker/PostGIS live validation remains pending until Docker is available.
## Pass 30 - Release hardening audit pass (2026-06-15)
### Completed
- Audited release-readiness signals after Sprint 13, including timestamp warnings, frontend bundle output, migration SQL rendering and readiness coverage.
- Replaced backend `datetime.utcnow()` calls with timezone-aware UTC timestamps in service paths.
- Verified the affected backend tests with `DeprecationWarning` promoted to errors.
- Split frontend production output into app, React vendor and MapLibre vendor chunks, with an explicit chunk warning threshold for the known MapLibre GIS runtime.
- Updated backend/frontend README, TODO and changelog documentation.
### Files changed
- `backend/app/services/dataset_service.py`
- `backend/app/services/geojson_service.py`
- `backend/app/services/job_service.py`
- `backend/app/services/qa_service.py`
- `backend/app/services/quality_service.py`
- `frontend/vite.config.ts`
- `backend/README.md`
- `frontend/README.md`
- `docs/TODO.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- This pass does not add product features, migrations, API contracts, AI dependencies, provider fetching or model execution.
- Docker/PostGIS live validation still requires a Docker-enabled machine.
- Larger frontend architectural decomposition remains a separate low-risk planning item; this pass only hardened build output.
## Pass 31 - Extended release hardening sweep (2026-06-15)
### Completed
- Promoted the backend readiness gate to run `pytest` with `-W error::DeprecationWarning`.
- Added backend tests that verify readiness and pass-end scripts keep the stricter release checks in place.
- Hardened `scripts/codex_pass_end_check.sh` so placeholder scans skip `node_modules`, `dist` and `__pycache__` folders.
- Updated `docs/TODO.md` with a current implementation status layer while preserving older planning context.
- Re-ran pass-end checks and strict backend warning checks.
### Files changed
- `scripts/run_readiness_check.sh`
- `scripts/codex_pass_end_check.sh`
- `backend/tests/test_readiness_gate.py`
- `backend/README.md`
- `docs/TODO.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- This pass still does not add API contracts, migrations, product features, provider fetching, AI dependencies or model execution.
- Docker/PostGIS live validation remains blocked in this local environment because Docker is unavailable.
## Pass 32 - Readiness contract gate hardening (2026-06-15)
### Completed
- Added API contract smoke validation to `scripts/run_readiness_check.sh`.
- Added a regression test that requires the readiness gate to keep running `scripts/smoke_contracts.py`.
- Re-ran the full readiness gate after the change.
### Files changed
- `scripts/run_readiness_check.sh`
- `backend/tests/test_readiness_gate.py`
- `backend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- Docker/PostGIS live validation remains blocked in this local environment because Docker is unavailable.
## Pass 33 - Docker runtime build hardening (2026-06-15)
### Completed
- Investigated Unraid/Tower Docker build failure from pasted server output.
- Fixed backend Docker build ordering so `README.md` and `app/` exist before `pip install .`.
- Removed mandatory root `.env` references from Compose; default local runtime now uses checked-in environment values.
- Added PostGIS healthcheck and backend `depends_on` health condition.
- Made the backend container run `python -m alembic upgrade head` before starting Uvicorn.
- Added backend and frontend `.dockerignore` files to reduce Docker build context and exclude dependency/build/cache outputs.
- Added regression tests for Dockerfile package-source ordering, Compose env behavior, DB health/migration startup and Docker ignore coverage.
### Files changed
- `backend/Dockerfile`
- `docker-compose.yml`
- `backend/.dockerignore`
- `frontend/.dockerignore`
- `backend/tests/test_docker_runtime_config.py`
- `README.md`
- `backend/README.md`
- `docs/TODO.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- Docker commands still cannot be executed in this local Codex environment because Docker is unavailable here.
- The server should rerun `docker compose build --no-cache && docker compose up -d` to verify the real Docker runtime.
## Pass 34 - Docker browser port 1202 (2026-06-15)
### Completed
- Changed Docker Compose frontend host publishing from `5173:5173` to `1202:5173`.
- Added backend Docker CORS defaults for `http://localhost:1202` and `http://127.0.0.1:1202`.
- Updated `.env.example` and local/Docker documentation to point browser users to `http://localhost:1202` for Docker Compose.
- Added a regression assertion to Docker runtime config tests.
### Files changed
- `docker-compose.yml`
- `.env.example`
- `backend/tests/test_docker_runtime_config.py`
- `README.md`
- `backend/README.md`
- `frontend/README.md`
- `docs/LOCAL_DEVELOPMENT_RUNBOOK.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- Docker commands still cannot be executed in this local Codex environment because Docker is unavailable here.
## Pass 35 - Docker backend database startup retry (2026-06-16)
### Completed
- Investigated Tower runtime logs showing backend Alembic startup failed with `connection refused` even after the db container reported healthy.
- Added `backend/docker_start.sh` to retry a real SQLAlchemy `SELECT 1` connection before migrations.
- Updated Compose to run `sh /app/docker_start.sh` for backend startup.
- Added regression tests that require the Docker start script and SQL readiness retry before migrations.
### Files changed
- `backend/docker_start.sh`
- `docker-compose.yml`
- `backend/tests/test_docker_runtime_config.py`
- `backend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- Docker commands still cannot be executed in this local Codex environment because Docker is unavailable here.
## Pass 36 - Alembic Docker log formatting fix (2026-06-16)
### Completed
- Investigated backend Docker logs showing repeated literal `%(levelname)-5.5s [%(name)s] %(message)s` lines during migrations.
- Fixed `backend/alembic.ini` logging formatter from escaped `%%(...)` tokens to runtime interpolation `%(...)` tokens.
- Added a regression test for Alembic logging formatter correctness.
- Verified Alembic SQL rendering no longer emits literal formatter spam.
### Files changed
- `backend/alembic.ini`
- `backend/tests/test_alembic_logging_config.py`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
## Pass 37 - Frontend same-origin API proxy for Docker LAN access (2026-06-16)
### Completed
- Audited the running app at `http://192.168.10.150:1202` from Codex: frontend HTML and backend `/health` were reachable, but `/api/v1/projects` on the frontend origin returned the frontend HTML fallback.
- Changed the frontend API client default from `http://localhost:8000` to same-origin requests.
- Added Vite proxy routes for `/api` and `/health`.
- Added Docker Compose `VITE_API_PROXY_TARGET=http://backend:8000` so LAN browsers use `http://192.168.10.150:1202` only and the frontend container proxies API calls internally.
- Added regression tests for same-origin API/proxy behavior.
### Files changed
- `frontend/src/services/api/client.ts`
- `frontend/vite.config.ts`
- `docker-compose.yml`
- `backend/tests/test_docker_runtime_config.py`
- `README.md`
- `frontend/README.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- The running Tower deployment needs a rebuild/restart before this fix is active.
## Pass 38 - Browser runtime proxy guard (2026-06-16)
### Completed
- Added `scripts/verify_browser_runtime.sh` to verify the browser-facing frontend URL, `/api/v1/projects` proxy behavior and optional backend health endpoint.
- Added readiness syntax validation for the browser runtime verification script.
- Updated environment and local development documentation to prefer same-origin frontend API calls with Vite proxying in Docker/LAN deployments.
### Files changed
- `scripts/verify_browser_runtime.sh`
- `scripts/run_readiness_check.sh`
- `backend/tests/test_docker_runtime_config.py`
- `README.md`
- `docs/ENVIRONMENT_SPEC.md`
- `docs/LOCAL_DEVELOPMENT_RUNBOOK.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- The currently running Tower deployment at `http://192.168.10.150:1202` still returns frontend HTML for `/api/v1/projects` until the frontend image is rebuilt and restarted.
## Pass 39 - Environment contract cleanup (2026-06-16)
### Completed
- Corrected `.env.example` and `docs/ENVIRONMENT_SPEC.md` to use the YOLO environment variable names read by backend settings: `YOLO_ENABLED`, `YOLO_MODEL_PATH`, `YOLO_MODEL_VERSION` and `YOLO_MAX_TILES`.
- Updated frontend example settings to keep `VITE_API_BASE_URL` empty by default and expose `VITE_API_PROXY_TARGET` for Vite proxy routing.
- Added regression coverage for example environment names and browser runtime proxy verification.
### Files changed
- `.env.example`
- `docs/ENVIRONMENT_SPEC.md`
- `backend/tests/test_docker_runtime_config.py`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- Docker cannot be executed in this local Codex environment; Tower still needs an image rebuild/restart to activate the frontend proxy fix.
## Pass 40 - Frontend Docker nginx reverse proxy (2026-06-16)
### Completed
- Replaced the Docker frontend runtime with a production Vite build served by nginx.
- Added `frontend/nginx.conf` with explicit reverse proxy rules for `/api/` and `/health` to `backend:8000`.
- Changed Docker Compose frontend publishing from `1202:5173` to `1202:80`.
- Updated Docker runtime regression tests and documentation so the browser-facing API path is no longer dependent on Vite dev-server proxy behavior.
### Files changed
- `frontend/Dockerfile`
- `frontend/nginx.conf`
- `docker-compose.yml`
- `backend/tests/test_docker_runtime_config.py`
- `README.md`
- `frontend/README.md`
- `docs/ENVIRONMENT_SPEC.md`
- `docs/LOCAL_DEVELOPMENT_RUNBOOK.md`
- `CHANGELOG.md`
- `docs/CODEX_EXECUTION_LOG.md`
### Known limitations
- Docker still cannot be executed in this local Codex environment. Tower must rebuild the frontend image to activate the nginx runtime.
## Sprint 14 - Docker GIS runtime enablement (2026-06-16)
- Added backend `gis` optional dependency group for the approved Rasterio/GeoPandas runtime stack.
- Updated backend Docker image to install `.[gis]` and GDAL/GEOS/PROJ system packages.
- Added `scripts/verify_gis_runtime.sh` to verify PostGIS, Rasterio and GeoPandas capabilities through the browser-facing frontend proxy.
- Added readiness syntax coverage for the GIS runtime verification script.
- Added regression tests for Docker GIS dependency installation and capability verification coverage.
- Updated backend, environment, root README and changelog documentation with local/LAN verification commands.
- No API contracts, migrations, AI dependencies, provider fetching or product features were changed.
- Added `scripts/gis_import_smoke.py` and wired it into the backend Docker build so broken Rasterio/GeoPandas/pyogrio imports fail during image build.
- Added Docker Compose healthchecks for backend and frontend; frontend now waits for backend service health before starting.
- Corrected the GIS import smoke placement so the backend Docker build can access it inside the `./backend` build context; the root script now wraps the backend script.
## Sprint 15 - Explicit demo workflow seed (2026-06-16)
- Added `POST /api/v1/demo/workflow` for an explicit offline demo workflow seed.
- Added `DemoWorkflowService` to create or return a demo project, AOI, fixture reference dataset, fixture candidate dataset and persisted QA/QC metrics.
- Added `scripts/seed_demo_workflow.py` for terminal-based demo seeding.
- Added frontend `Load demo workflow` action in the Projects panel.
- Added endpoint/fixture-contract tests and readiness compile coverage for the demo seed script.
- 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` for read-only project QA/QC result listing.
- Added `QualityCheckService` to return persisted `quality_checks` with metric rows.
- Added frontend QA/QC Results panel and API client support.
- Demo workflow loading and QA actions now refresh persisted QA/QC results in the UI.
- Added backend tests for quality check listing and canonical envelopes.
- No migrations, live provider fetching, AI inference or new dependencies were introduced.
## Sprint 17 export foundation (2026-06-16)
Changed:
- Hardened GeoJSON exports so vector dataset, detection run and segmentation run exports persist `exports` rows and write JSON artifacts.
- Added project metadata JSON export plus export list/read/content endpoints.
- Added a frontend Export Center panel for creating exports, listing export records and previewing JSON content.
- Added backend tests for export persistence, artifact writing, raster rejection and canonical envelope behavior.
Tested:
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh`
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql`
- `bash -n scripts/live_migration_smoke.sh && bash -n scripts/verify_browser_runtime.sh && bash -n scripts/verify_gis_runtime.sh`
Open:
- Docker/live browser validation must be rerun on the deployment host after rebuild.
- YOLO-format export and report export remain documented future work; this pass only implements JSON/GeoJSON export foundation.
Limitations:
- Export artifacts are returned through API JSON content preview; browser file-download UX is not implemented yet.
- Detection and segmentation exports require existing persisted runs; no inference or fake output generation is introduced.
Next recommended pass:
- Rebuild/redeploy the Docker stack and verify `/api/v1/exports/*` through the LAN frontend proxy, then consider a lightweight file-download endpoint or report artifact pass.
## Sprint 17 export download hardening (2026-06-16)
Changed:
- Added `GET /api/v1/exports/{export_id}/download` as a raw file response for stored JSON/GeoJSON export artifacts.
- Reused the same export artifact existence validation for content preview and downloads.
- Added frontend Export Center download buttons using the configured/same-origin API base URL.
- Added backend tests for missing artifacts and file download response headers/content.
Tested:
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh`
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql`
- `bash -n scripts/live_migration_smoke.sh && bash -n scripts/verify_browser_runtime.sh && bash -n scripts/verify_gis_runtime.sh`
Open:
- Docker/LAN validation should be rerun after redeploy on the Tower host.
Limitations:
- Download endpoint is intentionally a raw file response, not a canonical JSON envelope, because it is a browser/file artifact path.
Next recommended pass:
- Rebuild Docker and verify Export Center create/preview/download against `http://192.168.10.150:1202`.
## Sprint 17 lightweight report artifact export (2026-06-16)
Changed:
- Added `POST /api/v1/exports/report` to create a lightweight HTML project report artifact from persisted project, dataset and QA/QC summary state.
- Added HTML escaping for report-rendered project and dataset values.
- Updated export downloads to return `text/html` for HTML report artifacts and `application/json` for JSON/GeoJSON artifacts.
- Added a frontend Export Center action for project report HTML export.
- Added backend tests for HTML report artifact creation and HTML download response behavior.
Tested:
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh`
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql`
- `bash -n scripts/live_migration_smoke.sh && bash -n scripts/verify_browser_runtime.sh && bash -n scripts/verify_gis_runtime.sh`
Open:
- Docker/LAN verification should be rerun after deployment rebuild.
Limitations:
- Report export is intentionally a simple HTML artifact, not a PDF designer or standalone Reports module.
- Report content is summary-only and uses existing persisted project, dataset and QA/QC rows.
Next recommended pass:
- Rebuild Docker and verify Export Center metadata, GeoJSON, report HTML and download flows through the LAN URL.
## Sprint 17 export audit trail and LAN demo/export smoke (2026-06-16)
Changed:
- Added export history to project metadata JSON and lightweight HTML report artifacts.
- Added `scripts/verify_demo_export_workflow.sh` to verify the browser-facing demo workflow, persisted QA/QC listing, metadata export, report export, vector GeoJSON export, export listing and artifact downloads.
- Included the demo/export workflow script in the main readiness syntax gate.
- Added backend tests to lock export-history content and demo/export script coverage.
Tested:
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh`
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql`
- `bash -n scripts/live_migration_smoke.sh && bash -n scripts/verify_browser_runtime.sh && bash -n scripts/verify_gis_runtime.sh && bash -n scripts/verify_demo_export_workflow.sh`
Open:
- `scripts/verify_demo_export_workflow.sh` still needs to be run against the rebuilt Tower deployment URL.
Limitations:
- The smoke script intentionally uses explicit fixture demo data and does not fetch live GRB/OSM or run AI inference.
Next recommended pass:
- Rebuild Docker on the Tower host and run `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202`.
## Sprint 32 Unraid all-in-one runtime verification (2026-06-17)
Changed:
- Converted the Unraid/Tower runtime to a single editable `geointel` Docker container via `docker-compose.unraid.yml`.
- Built the all-in-one image from `postgres:16-bookworm` with PostgreSQL 16/PostGIS packages, the FastAPI backend, nginx and the React frontend.
- Removed the default nginx site from the image so `/api/v1/*` is proxied to the embedded backend instead of returning nginx 404s.
- Hardened live migration smoke and browser runtime verification with startup retries.
- Browser runtime verification now checks the frontend, `/api/v1/projects` canonical JSON envelope and `/geointel-icon.png`.
Tested:
- `python -m pytest backend\tests\test_sprint31_unraid_template.py`
- `bash -n deploy/unraid/all-in-one-start.sh`
- `bash -n scripts/live_migration_smoke.sh`
- `bash -n scripts/verify_browser_runtime.sh`
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1`
- `docker compose -f docker-compose.unraid.yml ps` on Tower
- `bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202`
Verified runtime:
- Tower runs one GeoIntel app container: `geointel`.
- Published browser port is `0.0.0.0:1202->80/tcp`.
- Container health is `healthy`.
- Live migration smoke passed with PostGIS available and one Alembic head.
- Frontend, API proxy and icon are reachable at `http://192.168.10.150:1202`.
Open:
- Existing reused PostgreSQL volume logs a collation version mismatch because the old database was created on Debian glibc 2.31 and the all-in-one runtime uses glibc 2.36. Runtime and migrations pass; a future maintenance pass can rebuild/refresh collation metadata if needed.
## Sprint 32 DockerMan template/icon follow-up (2026-06-17)
Changed:
- Added a PNG icon for Unraid/DockerMan because DockerMan may not reliably render app-served SVG icons.
- Changed the Unraid template `<Name>` to `geointel` so it matches the running all-in-one container name.
- Changed the template icon URL to the absolute PNG URL `http://192.168.10.150:1202/geointel-icon.png`.
- Added DockerMan labels to `docker-compose.unraid.yml` so the running Compose container exposes Unraid managed/webui/icon metadata.
- Updated Tower deploy scripts to copy the editable template to `/boot/config/plugins/dockerMan/templates-user/my-geointel.xml`.
- Updated Tower deploy scripts to copy the PNG icon to `/boot/config/plugins/dockerMan/images/geointel-icon.png`.
Expected Unraid behavior:
- Refresh the Unraid Docker page after deploy so DockerMan reloads the user template metadata.
- The running `geointel` container should have template-backed editable fields and a PNG icon.
## Sprint 32 automatic DockerMan-native deploy follow-up (2026-06-17)
Changed:
- Added `deploy/unraid/run-dockerman-container.sh` as the single source of truth for the final Unraid container launch.
- Updated Tower deploy scripts so repository deploys validate the Compose reference, build the image with plain `docker build` and start the final container with `docker run` plus DockerMan labels.
- The launch script installs the DockerMan template/icon, removes old `geointel` containers, preserves/migrates the old Compose PostGIS volume when needed and starts the final `geointel` container as DockerMan-managed.
- Updated live migration smoke to support direct container execution through `LIVE_SMOKE_CONTAINER=geointel`.
Expected Unraid behavior:
- A deploy from the repo should no longer leave the final app as a plain Compose-owned container.
- The final image/container should avoid Compose metadata labels that can confuse Unraid's Docker page.
- The running `geointel` container should expose `net.unraid.docker.managed=dockerman`, web UI metadata and icon metadata immediately after deploy.
## Sprint 33 QA/QC benchmark readiness hardening (2026-06-17)
Changed:
- Added `scripts/verify_golden_qa_benchmark.sh` as a shell wrapper for the deterministic QA/QC golden benchmark.
- Made `scripts/run_readiness_check.sh` run `scripts/run_golden_qa_benchmark.py --json` so QA/QC metric drift fails the main release gate.
- Added a readiness syntax check for the golden benchmark wrapper.
- Hardened `scripts/validate_fixtures.py` so `fixtures/golden` GeoJSON files and expected fixture paths are validated alongside the general GeoJSON fixtures.
- Added backend regression tests that keep the golden benchmark wired into readiness.
- Updated script/backend docs, TODO and changelog.
Tested:
- `python scripts/validate_fixtures.py`
- `python scripts/run_golden_qa_benchmark.py --json`
- `bash -n scripts/verify_golden_qa_benchmark.sh`
- `bash scripts/verify_golden_qa_benchmark.sh`
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh`
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql`
- `bash -n scripts/live_migration_smoke.sh`
Open:
- None for this pass.
Limitations:
- The benchmark intentionally uses explicit local fixtures only. It does not fetch live GRB/OSM data and does not run AI inference.
Next recommended pass:
- Continue with broader QA/QC golden demo coverage or frontend export preview decomposition.
## Sprint 34 browser-facing golden QA demo hardening (2026-06-17)
Changed:
- Hardened `scripts/verify_demo_export_workflow.sh` so the browser-facing demo/export smoke loads `fixtures/golden/expected_qa_metrics.json`.
- The smoke now verifies persisted QA/QC status, F1 score, precision, recall, mean IoU, false positives, false negatives and match counts against the golden baseline.
- Corrected the offline demo AOI to cover the golden fixture geometries instead of an older broad Kempen placeholder outside the fixture coordinates.
- Made existing demo workflows self-heal stale/unsupported QA checks by syncing the demo AOI and persisting a fresh golden QA/QC result.
- Added regression checks in backend tests so the demo/export smoke cannot regress back to key-existence-only QA/QC validation.
- Updated script documentation, TODO and changelog.
Tested:
- `python -m compileall backend/app`
- `cd backend && python -m pytest tests/test_sprint15_demo_workflow.py tests/test_sprint21_demo_workflow_smoke.py tests/test_readiness_gate.py -q`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh`
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- `bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202`
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202`
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202`
Open:
- Docker build still emits a warning about `GEOINTEL_POSTGRES_PASSWORD` being present as an image `ENV`; runtime behavior is green, but a future secret-hygiene pass should move that default out of the Dockerfile.
Limitations:
- The demo/export smoke remains intentionally fixture-based and idempotent. It does not fetch live providers and does not run AI inference.
Next recommended pass:
- Run the full release-readiness gate and then rebuild/deploy to Tower for browser-facing verification.
## Sprint 35 Docker runtime secret hygiene (2026-06-17)
Changed:
- Removed embedded PostGIS database name/user/password defaults from `deploy/unraid/Dockerfile.all-in-one` image metadata.
- Kept database credentials as runtime configuration supplied by `.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 and changelog.
Tested:
- `cd backend && python -m pytest tests/test_sprint31_unraid_template.py tests/test_docker_runtime_config.py -q`
- `bash -n deploy/unraid/all-in-one-start.sh`
- `bash -n deploy/unraid/run-dockerman-container.sh`
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh`
- `cd backend && python -m alembic heads && python -m alembic upgrade head --sql`
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- `bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202`
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202`
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202`
Open:
- Local Windows shell has no `docker` command in PATH, so Docker build/config verification must run on Tower during deploy.
- Tower rebuild completed and the previous Docker BuildKit `SecretsUsedInArgOrEnv` warning no longer appears.
Limitations:
- The start script still has safe local defaults for standalone/dev startup. Shared deployments should set `GEOINTEL_POSTGRES_PASSWORD` via runtime configuration.
Next recommended pass:
- Run release readiness, rebuild/deploy Tower and verify browser/GIS/demo smoke again.
## Sprint 36 PostgreSQL collation maintenance visibility (2026-06-17)
Changed:
- Added PostgreSQL database collation version reporting to `scripts/live_migration_smoke.sh`.
- The live smoke now prints `COLLATION_VERSION_MISMATCH` with stored and actual versions when a reused PostGIS volume was created under an older libc/collation runtime.
- The smoke also prints the exact `ALTER DATABASE "... " REFRESH COLLATION VERSION;` acknowledgement command, but does not run it automatically.
- Documented the Unraid maintenance procedure and backup/index review guidance.
- Added regression coverage for the collation reporting path.
Tested:
- `cd backend && python -m pytest tests/test_live_migration_smoke_script.py -q`
- `bash -n scripts/live_migration_smoke.sh`
- `python -m compileall backend/app`
- `cd backend && python -m pytest -W error::DeprecationWarning`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh`
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- `bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202`
- `bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202`
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202`
Open:
- Tower live smoke reports `COLLATION_VERSION_MISMATCH: database=geointel stored=2.31 actual=2.36`.
- Runtime remains green. The next maintenance action is optional/manual acknowledgement after backup/index review: `ALTER DATABASE "geointel" REFRESH COLLATION VERSION;`.
Limitations:
- The smoke reports and documents the maintenance action. It intentionally does not mutate collation metadata automatically.
Next recommended pass:
- Run release readiness, deploy Tower and decide whether to manually acknowledge the current collation version.
## Sprint 49 Workbench shell UI refactor (2026-06-17)
Changed:
- Audited the live workbench UI and confirmed the main usability issue was information architecture: all V1 workflows were mounted as one long vertical panel stack.
- Refactored the frontend into a task-based workbench shell with Overview, Data, Map, QA/QC, AI Labs, Exports and System workspaces.
- Added a persistent top context bar for active project, AOI, dataset and layer state.
- Moved selected dataset details into a persistent right-side inspector while keeping the same dataset/raster/vector operation callbacks.
- Added stable primary navigation test anchors.
- Documented the new frontend shell structure and updated the changelog.
Tested:
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- Local Vite visual audit on `http://127.0.0.1:5175`
Open:
- Local Vite visual audit shows `Request failed (404)` when no local backend/proxy target is available. Docker/nginx same-origin proxy behavior remains the production path.
- The next pass should run full release readiness and deploy to Tower for browser-facing verification on `http://192.168.10.150:1202`.
Limitations:
- This pass intentionally changes UI structure only. It does not add product capabilities, alter API contracts, change migrations, fetch live providers or enable new AI models.
Next recommended pass:
- Run full readiness, rebuild/deploy Tower, then perform a live browser smoke through the new workbench navigation.
## Sprint 50 Workspace usability polish (2026-06-17)
Changed:
- Refined the task-based shell workspaces after the first UI refactor.
- Converted Project, AOI and Dataset panels into compact forms and card-based lists for faster scanning.
- Converted the Map workspace controls into a toolbar with dedicated AOI/layer controls and status.
- Converted Detection Lab and Segmentation Lab into model, run, result and QA blocks.
- Added CSS utilities for entity cards, dataset cards, model cards, lab blocks, primary/secondary actions and responsive nested forms.
- Added regression coverage for the polished workspace structure.
Tested:
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `cd backend && python -m pytest tests/test_sprint47_workbench_interaction_smoke.py tests/test_sprint49_workbench_shell_refactor.py -q`
Open:
- Run full release readiness and deploy the polish to Tower.
Limitations:
- This pass remains frontend-only. It does not add features, change API contracts, alter migrations, fetch live providers or enable new AI models.
Next recommended pass:
- Deploy to Tower and verify the Data, Map and AI Labs workspaces on `http://192.168.10.150:1202`.
## Sprint 51 QA/QC and export workspace polish (2026-06-17)
Changed:
- Refined the QA/QC workspace so persisted checks are shown as summary tiles, quality-check cards and metric chips instead of a raw nested list.
- Refined the Exports workspace with grouped export actions, latest-export status, artifact history cards and a framed JSON/GeoJSON preview panel.
- Kept the existing `useQualityWorkflow` and `useExportWorkflow` dataflow intact; no API client calls or backend contracts changed.
- Added regression coverage for the polished QA/QC and Exports workspace structure.
Tested:
- `cd frontend && npm run typecheck`
- `cd backend && python -m pytest tests/test_sprint27_frontend_workflow_hooks.py tests/test_sprint30_workbench_components.py tests/test_sprint47_workbench_interaction_smoke.py -q`
- `cd backend && python -m pytest tests/test_sprint51_quality_export_polish.py -q`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh` (`207 passed`)
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- Tower live migration smoke passed.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
Open:
- Manual visual review of populated QA/QC and Exports states with real project artifacts remains useful after the next demo workflow run.
Limitations:
- This pass remains UI polish only. It does not add product capabilities, change API contracts, alter migrations, fetch live providers or enable new AI models.
Next recommended pass:
- Verify QA/QC and Exports on the deployed Tower workbench, then continue with selected-object inspector detail tabs.
## Sprint 52 selected context inspector tabs (2026-06-17)
Changed:
- Replaced the dataset-only right inspector with a tabbed `WorkbenchInspector`.
- Added Context, Dataset, QA/Exports and AI Runs tabs using existing project, AOI, dataset, QA, export and AI-run state.
- Kept the existing `DatasetDetailPanel` as the Dataset tab so raster/vector operations and callbacks remain behavior-compatible.
- Added inspector cards for selected map feature properties, latest QA/QC, latest export and selected detection/segmentation run summaries.
- Added regression coverage for inspector wiring and tab structure.
Tested:
- `cd frontend && npm run typecheck`
- `cd backend && python -m pytest tests/test_sprint49_workbench_shell_refactor.py tests/test_sprint50_workspace_usability_polish.py tests/test_sprint51_quality_export_polish.py -q`
- `cd backend && python -m pytest tests/test_sprint28_dataset_workflow_hook.py tests/test_sprint29_dataset_components.py tests/test_sprint52_workbench_inspector_tabs.py -q`
- `cd backend && python -m pytest tests/test_sprint52_workbench_inspector_tabs.py -q`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh` (`210 passed`)
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- Tower live migration smoke passed.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
Open:
- Manual click-through of each inspector tab with populated demo data remains useful for visual fine-tuning.
Limitations:
- This pass remains UI orchestration only. It does not add features, change API contracts, alter migrations, fetch live providers or enable new AI models.
Next recommended pass:
- Verify the tabbed inspector live on Tower, then continue with map/dataset selection ergonomics.
## Sprint 53 map/dataset selection ergonomics (2026-06-17)
Changed:
- Added active-state styling to dataset cards so the selected dataset is visibly anchored in the catalog.
- Added dataset quick actions to open a dataset directly in the Map workspace or Exports workspace after loading details.
- Added inspector navigation actions to jump to Data, Map, QA/QC, Exports and AI Labs without hunting through the left navigation.
- Kept the existing dataset loading, map layer state, export flow and API clients unchanged.
- Added regression coverage for selection quick actions and inspector navigation wiring.
Tested:
- `cd frontend && npm run typecheck`
- `cd backend && python -m pytest tests/test_sprint28_dataset_workflow_hook.py tests/test_sprint29_dataset_components.py tests/test_sprint52_workbench_inspector_tabs.py -q`
- `cd backend && python -m pytest tests/test_sprint53_selection_ergonomics.py -q`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh` (`213 passed`)
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- Tower live migration smoke passed.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
Open:
- Manual demo-data click-through can still tune copy/density after real populated cards are visible.
Limitations:
- This pass remains UI orchestration only. It does not add features, change API contracts, alter migrations, fetch live providers or enable new AI models.
Next recommended pass:
- Verify dataset quick actions with demo data on Tower, then improve populated map/detail readability if needed.
## Sprint 54 populated-state UI polish (2026-06-17)
Changed:
- Ran the live demo/export workflow against the Tower deployment to inspect real populated workbench states.
- Adjusted the Data workspace so Project and AOI remain side by side while the Dataset catalog spans the full row for readable populated dataset cards.
- Made dataset-card action rows responsive so Map/Exports/detail actions do not crowd or clip on populated cards.
- Limited the Exports artifact history to the latest 10 entries by default with an explicit show-all toggle.
- Kept the Export Preview panel visible even before an artifact is selected, avoiding a blank middle column in the Exports workspace.
- Shortened displayed export storage paths while keeping the full path available in the title attribute.
- Added regression coverage for the populated Data layout and Exports populated-state behavior.
Tested:
- `bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202`
- Local Vite visual audit using the live Tower API proxy on `http://127.0.0.1:5176`
- `cd frontend && npm run typecheck`
- `cd backend && python -m pytest tests/test_sprint51_quality_export_polish.py tests/test_sprint53_selection_ergonomics.py -q`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh` (`214 passed`)
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- Tower live migration smoke passed.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
- Direct HTTP check passed for `http://192.168.10.150:1202` and `http://192.168.10.150:1202/api/v1/projects`.
Open:
- Continue monitoring export history growth during repeated demo workflow runs.
Limitations:
- This pass remains UI polish only. It does not add features, change API contracts, alter migrations, fetch live providers or enable new AI models.
Next recommended pass:
- Add export history filtering or retention controls if artifact history continues to grow during demo runs.
## Sprint 55 live visual shell polish (2026-06-17)
Changed:
- Performed a Browser-based visual audit of the live Tower workbench at `http://192.168.10.150:1202`.
- Confirmed the main visual defect was the cramped three-column desktop shell: left navigation, central workspace and inspector competed for width at 1280px.
- Compacted the sticky top context bar and left navigation.
- Changed the standard desktop breakpoint so the inspector moves below the workspace up to 1360px, while remaining a side panel on wider displays.
- Made the Map toolbar wrap responsively instead of forcing four controls into a narrow row.
- Added a workspace-change scroll reset so switching pages starts at the workspace heading instead of inheriting stale scroll position.
- Added regression coverage for the standard desktop shell width and scroll-reset behavior.
Tested:
- Local Browser visual audit against `http://127.0.0.1:5177` using the live Tower API proxy.
- Verified Overview, Data, Map and Exports workspaces visually after the shell changes.
- Browser console error/warning check returned no entries.
- `cd frontend && npm run typecheck`
- `cd backend && python -m pytest tests/test_sprint53_selection_ergonomics.py tests/test_sprint50_workspace_usability_polish.py -q`
- `cd frontend && npm run build`
- `bash scripts/run_readiness_check.sh` (`215 passed`)
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- Tower live migration smoke passed.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
- Live Browser visual verification passed for Overview and Map on `http://192.168.10.150:1202`.
Open:
- Export history still grows during repeated demo runs and should get filtering or retention controls.
Limitations:
- This pass remains UI shell polish only. It does not add features, change API contracts, alter migrations, fetch live providers or enable new AI models.
Next recommended pass:
- Continue with export history filtering or retention controls if repeated demo runs keep growing artifact history.
## Sprint 56 export history controls (2026-06-17)
Changed:
- Added frontend-only search for export type, status, id and storage path in the Exports workspace.
- Added export type and status filters generated from the loaded export records.
- Made the latest-10 limiter apply after filtering so large histories stay manageable without hiding matching records unexpectedly.
- Added a clear no-match empty state and reset view action.
- Slightly compacted export action buttons so the history controls are visible earlier on standard desktop viewports.
- Added regression coverage for the export history controls, filtered list limiting and no-match state.
Tested:
- `cd frontend && npm run typecheck`
- `cd backend && python -m pytest tests/test_sprint51_quality_export_polish.py -q`
- `cd frontend && npm run build`
- Local Browser visual audit against `http://127.0.0.1:5178` using the live Tower API proxy.
- Verified Exports history controls render with 50 live artifacts and a `report` search narrows the list to 17 matching artifacts.
- Browser console error/warning check returned no entries.
Open:
- Run full readiness, deploy Tower and verify the live Exports filters on `http://192.168.10.150:1202`.
Limitations:
- This pass remains frontend UI hardening only. It does not add backend filtering, retention deletion, API changes, migrations, live provider fetching or AI model behavior.
Next recommended pass:
- Consider a safe export retention/cleanup command if the artifact table keeps growing beyond demo needs.
## Sprint 57 safer demo export cleanup (2026-06-17)
Changed:
- Hardened the existing dry-run-first demo export cleanup command instead of creating a parallel cleanup path.
- Added `--max-delete` with a default cap of 25 so large `--apply` runs are blocked until explicitly reviewed and raised.
- Added repeatable `--export-type` filters for targeted cleanup, e.g. reports only.
- Extended the cleanup summary with `keep_latest`, `max_delete`, `export_types`, `type_filtered_export_count`, `candidate_exports` and `blocked_reason`.
- Updated the root wrapper to expose the new filter helper.
- Updated `scripts/README.md`, `docs/STORAGE_ARCHITECTURE.md`, `backend/README.md`, `docs/TODO.md` and `CHANGELOG.md`.
- Added regression coverage for export-type filtering, parser defaults and max-delete options.
Tested:
- `python -m py_compile scripts/cleanup_demo_artifacts.py backend/scripts/cleanup_demo_artifacts.py`
- `cd backend && python -m pytest tests/test_sprint24_cleanup_demo_artifacts.py tests/test_readiness_gate.py -q` (`16 passed`)
- Tower dry-run command passed without deleting data:
`docker exec geointel /opt/geointel/venv/bin/python /app/scripts/cleanup_demo_artifacts.py --keep-latest 10 --max-delete 100 --export-type project_report_html`
- Tower dry-run reported `matched_export_count=51`, `type_filtered_export_count=17`, `selected_export_count=7`, `deleted_export_count=0`.
Open:
- Run full readiness and redeploy Tower with the clearer `candidate_exports` dry-run output.
Limitations:
- Cleanup still targets demo export records/files only. It does not delete source uploads, vector features, projects, AOIs, QA/QC records, rasters, tiles, masks or production data.
Next recommended pass:
- Add a small live maintenance smoke that runs cleanup in dry-run mode through the deployed all-in-one container.
## Sprint 58 demo cleanup dry-run smoke (2026-06-18)
Changed:
- Added `scripts/verify_demo_cleanup_dry_run.sh` as a live maintenance smoke for the demo export cleanup path.
- The smoke auto-detects a running compose backend or all-in-one `geointel` container, with explicit `CLEANUP_MODE=local|compose|container` overrides.
- The smoke runs cleanup without `--apply`, then verifies `dry_run=true`, `deleted_export_count=0`, `deleted_files=[]`, expected filter settings and candidate dry-run fields.
- Added the smoke syntax check to `scripts/run_readiness_check.sh`.
- Added regression coverage that the readiness gate checks the smoke and that the smoke contract remains non-mutating.
- Updated `scripts/README.md`, `docs/STORAGE_ARCHITECTURE.md`, `backend/README.md`, `docs/TODO.md` and `CHANGELOG.md`.
Tested:
- `bash -n scripts/verify_demo_cleanup_dry_run.sh`
- `python -m py_compile scripts/cleanup_demo_artifacts.py backend/scripts/cleanup_demo_artifacts.py`
- `cd backend && python -m pytest tests/test_readiness_gate.py tests/test_sprint24_cleanup_demo_artifacts.py -q` (`18 passed`)
- `bash scripts/run_readiness_check.sh` (`219 passed`)
- `powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1`
- Tower live migration smoke passed.
- Tower browser runtime verification passed on `http://192.168.10.150:1202`.
- Tower cleanup dry-run smoke passed with `matched=51`, `type_filtered=17`, `selected=7`, `deleted=0`.
Open:
- None for this pass.
Limitations:
- The readiness gate checks this live smoke's syntax only. The actual cleanup dry-run still requires a running backend/PostGIS runtime.
Next recommended pass:
- Add browser screenshot artifact automation for visual regression handoff.
## Sprint 59 workbench screenshot artifacts (2026-06-18)
Changed:
- Added `scripts/capture_workbench_screenshots.sh` for optional visual regression handoff screenshots.
- The script seeds the explicit offline demo workflow, opens Overview, Data, Map, QA/QC, AI Labs, Exports and System, then writes viewport screenshots plus `manifest.json`.
- Desktop capture is always enabled; mobile capture is enabled by default and can be disabled with `CAPTURE_MOBILE=0`.
- Added `/artifacts/` to `.gitignore` so screenshot outputs stay local.
- Added readiness syntax coverage and regression checks for the screenshot capture contract.
- Updated `scripts/README.md`, `docs/TODO.md` and `CHANGELOG.md`.
Tested:
- `bash -n scripts/capture_workbench_screenshots.sh`
- `cd backend && python -m pytest tests/test_readiness_gate.py -q` (`13 passed`)
- `bash scripts/run_readiness_check.sh` (`221 passed`)
- Local script execution without Playwright fails cleanly with setup instructions instead of producing partial artifacts.
- Browser-plugin visual capture against `http://192.168.10.150:1202` created viewport screenshots for all seven workspaces with no console errors or warnings.
Open:
- Commit, deploy Tower and keep the visual artifact script available for future Playwright-enabled runners.
Limitations:
- Playwright/Chromium is intentionally optional and not added to the frontend dependency set. The readiness gate checks script syntax only.
Next recommended pass:
- Run a backend error-envelope audit for expected user-error paths.