198 KiB
Sprint 48 Backend API contract audit (2026-06-17)
Changed:
- Added
scripts/audit_api_contracts.pyto import the FastAPI app, enumerate the implementedGET/POST/PATCH/DELETEroute surface and compare it with active### METHOD routeheadings indocs/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
POSTto implementedGET; - 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.
- documented
- Added
backend/tests/test_sprint48_api_contract_audit.py. - Updated
scripts/README.md,docs/TODO.mdandCHANGELOG.md.
Validation:
- RED:
cd backend && python -m pytest tests/test_sprint48_api_contract_audit.py -qfailed before implementation because the audit script, readiness integration and route docs were missing. - RED:
python scripts/audit_api_contracts.pyreported missing docs for 4 implemented routes and 5 stale documented routes. python scripts/audit_api_contracts.pypassed: 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 -qpassed: 12 tests.python -m py_compile scripts/audit_api_contracts.pypassed.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 201 tests.bash scripts/run_readiness_check.shpassed and includedAPI contract audit OK.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.cd backend && python -m alembic headspassed:202606120900 (head).cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1passed and redeployed the all-in-one container to Tower on port 1202.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed after redeploy.bash scripts/verify_workbench_default_state.sh http://192.168.10.150:1202passed after redeploy.bash scripts/verify_workbench_interactions.sh http://192.168.10.150:1202passed 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-testidanchors 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.pyto keep the UI anchors, readiness gate and interaction smoke contract in place. - Updated
scripts/README.md,docs/TODO.mdandCHANGELOG.md.
Validation:
- RED:
cd backend && python -m pytest tests/test_sprint47_workbench_interaction_smoke.py -qfailed 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 -qpassed: 3 tests.cd frontend && npm run typecheckpassed.bash -n scripts/verify_workbench_interactions.shpassed.bash scripts/verify_workbench_interactions.sh http://192.168.10.150:1202passed against the pre-deploy runtime API surface.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 198 tests.bash scripts/run_readiness_check.shpassed.cd frontend && npm run buildpassed.cd backend && python -m alembic headspassed:202606120900 (head).cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1passed and redeployed the all-in-one container to Tower on port 1202.bash scripts/verify_workbench_interactions.sh http://192.168.10.150:1202passed after redeploy.bash scripts/verify_workbench_default_state.sh http://192.168.10.150:1202passed after redeploy.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed after redeploy.- Live browser check against
http://192.168.10.150:1202passed 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-testidanchors 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 readydatasets and a persisted QA/QC result through canonicaldata.itemsenvelopes. - Added the script syntax check to
scripts/run_readiness_check.sh. - Extended
backend/tests/test_readiness_gate.pyso the readiness gate and script keep covering the default-state smoke contract. - Updated
scripts/README.mdandCHANGELOG.md.
Validation:
- RED:
cd backend && python -m pytest tests/test_readiness_gate.py -qfailed before implementation becauseverify_workbench_default_state.shwas missing and readiness did not reference it. cd backend && python -m pytest tests/test_readiness_gate.py -qpassed: 9 tests.bash -n scripts/verify_workbench_default_state.shpassed.bash scripts/verify_workbench_default_state.sh http://192.168.10.150:1202passed.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 195 tests.bash scripts/run_readiness_check.shpassed.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.cd backend && python -m alembic headspassed:202606120900 (head).cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1passed and redeployed the all-in-one container to Tower on port 1202.bash scripts/verify_workbench_default_state.sh http://192.168.10.150:1202passed after redeploy.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed after redeploy.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed after redeploy.- Live browser check against
http://192.168.10.150:1202passed at 1280x720: selected projectGeoIntel Demo - Building QA, status showed1 area,2/2 readydatasets and2 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.tsso 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.tsso demo seed refresh passes the seeded project id toloadProjects. - 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 -qpassed: 11 tests.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 194 tests.bash scripts/run_readiness_check.shpassed.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.cd backend && python -m alembic headspassed:202606120900 (head).cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.- Browser check against local Vite preview with live backend passed after async settle: selected project
GeoIntel Demo - Building QA, status showed1 area,2/2 readydatasets and2 checks. powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1passed and redeployed the all-in-one container to Tower on port 1202.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.- Live browser check against
http://192.168.10.150:1202passed after async settle: selected projectGeoIntel Demo - Building QA, status showed1 area,2/2 readydatasets and2 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.cssfrom 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
MapWorkspaceabove the dense workflow grid infrontend/src/App.tsxso GIS context is visible before lower-detail provider, AI, QA and export panels. - Moved
DatasetPanelinto the first workflow row beside project/area/provider setup. - Added a static layout regression test in
backend/tests/test_sprint30_workbench_components.pyfor 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/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 194 tests.bash scripts/run_readiness_check.shpassed.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.cd backend && python -m alembic headspassed:202606120900 (head).cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1passed and redeployedgeointel-all-in-one:latestto Tower on port 1202.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.- Live browser check against
http://192.168.10.150:1202passed: 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.tsxintofrontend/src/hooks/useWorkbenchBootstrap.ts. - Kept
App.tsxas a composition root that wires hook outputs into panels; it no longer importsuseEffect. - 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 -qpassed: 9 tests.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 193 tests.bash scripts/run_readiness_check.shpassed.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.cd backend && python -m alembic headspassed:202606120900 (head).cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1passed and redeployedgeointel-all-in-one:latestto Tower on port 1202.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.App.tsxsize audit after extraction: 621 lines;useWorkbenchBootstrap.ts: 81 lines.
Limitations:
- No UX behavior, API contracts, migrations, provider fetching or AI behavior changed.
App.tsxline 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/useStateReact imports fromfrontend/src/App.tsx. - Removed the UTF-8 BOM from
App.tsxso 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.tsxsize audit: 622 lines after the orchestration hook decomposition passes.
Validation:
cd backend && python -m pytest tests/test_sprint39_frontend_orchestration_hooks.py -qpassed: 8 tests.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 192 tests.bash scripts/run_readiness_check.shpassed.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.cd backend && python -m alembic headspassed:202606120900 (head).cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1passed and redeployedgeointel-all-in-one:latestto Tower on port 1202.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.
Limitations:
- No UX behavior, API contracts, migrations, provider fetching or AI behavior changed.
App.tsxremains 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.tsxintofrontend/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.seedWorkflowis owned by the new hook and notApp.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 -qpassed: 9 tests.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 191 tests.bash scripts/run_readiness_check.shpassed.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.cd backend && python -m alembic headspassed:202606120900 (head).cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1passed and redeployedgeointel-all-in-one:latestto Tower on port 1202.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.
Limitations:
- No UX behavior, API contracts, migrations, provider fetching or AI behavior changed.
App.tsxstill has a UTF-8 BOM and a stale React import cleanup opportunity; TypeScript build is unaffected.
Next recommended pass:
- Do a final
App.tsxsize/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.tsxbecause 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 -qpassed: 6 tests.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 190 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.bash scripts/run_readiness_check.shpassed.cd backend && python -m alembic heads && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the all-in-one Tower container athttp://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:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.
Open:
- None for this pass.
Limitations:
- No UX behavior, API contracts, migrations, provider fetching or AI behavior changed.
- Demo workflow orchestration remains in
App.tsxuntil 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.listProviderscalls intofrontend/src/hooks/useProviderCapabilities.ts. - Moved change-detection state, validation and
analysisApi.runChangeDetectioncalls intofrontend/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.tsxas 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 -qpassed: 4 tests.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 188 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.bash scripts/run_readiness_check.shpassed.cd backend && python -m alembic heads && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the all-in-one Tower container athttp://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:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.
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_UNSUPPORTEDinstead 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.tsxintofrontend/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 -qpassed: 10 tests.cd frontend && npm run typecheckpassed.python -m compileall backend/apppassed.cd backend && python -m pytest -W error::DeprecationWarningpassed: 184 tests.cd frontend && npm run buildpassed.bash scripts/run_readiness_check.shpassed.cd backend && python -m alembic heads && python -m alembic upgrade head --sqlpassed.powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the all-in-one Tower container athttp://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:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.
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 byALTER 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.shpassed on Tower and reportedDatabase collation version: ok.bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202passed.bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202passed.bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202passed.
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 -istdin 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.ymlfor a single editablegeointelcontainer on Unraid. - Added
deploy/unraid/Dockerfile.all-in-oneto build one image containing embedded PostGIS, backend GIS runtime, nginx and frontend static assets. - Added
deploy/unraid/all-in-one-start.shto 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.confso/apiand/healthproxy to127.0.0.1:8000inside 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.shto support both all-in-onegeointeland legacybackendCompose services. - Added root
.dockerignorefor 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.pypassed: 26 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.python -m compileall backend/apppassed.cd backend && python -m pytestpassed: 179 tests.bash scripts/run_readiness_check.shpassed: 179 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.cd backend && python -m alembic headspassed: single head202606120900.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.bash -n deploy/unraid/all-in-one-start.shpassed.
Notes:
- No API contracts, migrations, product features, provider fetching or AI behavior changed.
- Local Windows environment does not have
dockerin PATH; Tower deployment should provide the live all-in-one Docker validation.
Sprint 31 Unraid deployment template (2026-06-17)
Changed:
- Made
docker-compose.ymlconfigurable through.envdefaults for frontend port, backend port, storage path, PostGIS database/user/password, CORS origins and upload limit. - Added
deploy/unraid/geointel.env.examplefor Unraid/Tower runtime configuration. - Added
deploy/unraid/geointel-unraid-template.xmlas Unraid/DockerMan-style metadata for the editable Compose stack settings. - Added
deploy/unraid/geointel-icon.svganddeploy/unraid/geointel-icon.png, served through matchingfrontend/publicassets. - 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.pypassed: 22 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.python -m compileall backend/apppassed.cd backend && python -m pytestpassed: 177 tests.bash scripts/run_readiness_check.shpassed: 177 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.cd backend && python -m alembic headspassed: single head202606120900.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.- Tower deploy via
scripts/deploy_tower.ps1passed after commit3a8b82f. - 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.svgand/geointel-icon.png.
Notes:
- Local Windows environment does not have
dockerin PATH, so localdocker compose configcould 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.tsxintofrontend/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.pypassed: 9 tests.python -m compileall backend/apppassed.cd backend && python -m pytestpassed: 173 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.bash scripts/run_readiness_check.shpassed: 173 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.cd backend && python -m alembic headspassed: single head202606120900.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.- Tower deploy via
scripts/deploy_tower.ps1passed after commitacf9590. - 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/projectsthrough 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.tsxintofrontend/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.tsxandfrontend/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.pypassed: 10 tests.python -m compileall backend/apppassed.cd backend && python -m pytestpassed: 170 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.bash scripts/run_readiness_check.shpassed: 170 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.cd backend && python -m alembic headspassed: single head202606120900.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.- Tower deploy via
scripts/deploy_tower.ps1passed after commit1cbb356. - 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/projectsthrough 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.tsxintofrontend/src/hooks/useDatasetWorkflow.ts. - Kept project dataset listing in
App.tsxso 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.pypassed: 11 tests.python -m compileall backend/apppassed.cd backend && python -m pytestpassed: 167 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.bash scripts/run_readiness_check.shpassed: 167 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.cd backend && python -m alembic headspassed: single head202606120900.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.- Initial Tower rebuild hit Docker btrfs storage exhaustion; safely reclaimed build cache only with
docker builder prune -afwithout pruning volumes. - Tower Docker storage recovered from
/var/lib/docker94% used to 58% used after cleanup and rebuild. - Tower deploy via
scripts/deploy_tower.ps1passed after commit361776c. - 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/projectsthrough 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.tsxintofrontend/src/hooks/useExportWorkflow.ts. - Moved QA/QC comparison state and persisted quality-check listing from
frontend/src/App.tsxintofrontend/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.pypassed: 8 tests.python -m compileall backend/apppassed.cd backend && python -m pytestpassed: 164 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.bash scripts/run_readiness_check.shpassed: 164 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.cd backend && python -m alembic headspassed: single head202606120900.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.- Tower deploy via
scripts/deploy_tower.ps1passed after commitfd0000f. - 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/projectsthrough 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 (
dockercommand not found); Tower deployment remains handled throughscripts/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.tsxintofrontend/src/hooks/useDetectionWorkflow.ts. - Moved Segmentation Lab orchestration state and API calls from
frontend/src/App.tsxintofrontend/src/hooks/useSegmentationWorkflow.ts. - Added shared frontend
formatErrorhelper underfrontend/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.pypassed: 6 tests.cd frontend && npm run typecheckpassed.cd frontend && npm run buildpassed.bash scripts/run_readiness_check.shpassed: 160 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.python -m compileall backend/apppassed.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.- 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-loadsupport toscripts/yolo_preflight.py,backend/scripts/yolo_preflight.pyandYoloPreflightService. - 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-loadwith--assume-dependenciesto 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.pypassed.python -m pytest backend/tests/test_sprint13_yolo_preflight.py backend/tests/test_readiness_gate.pypassed: 14 tests.bash scripts/run_readiness_check.shpassed: 156 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.python -m compileall backend/apppassed.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shpassed.- 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-loadwith--assume-dependenciesis 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.pyfor dry-run-first cleanup of old offline demo export artifacts. - Added
backend/scripts/cleanup_demo_artifacts.pyso 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.mdandCHANGELOG.md.
Validation:
python -m py_compile scripts/cleanup_demo_artifacts.pypassed.python -m pytest backend/tests/test_sprint24_cleanup_demo_artifacts.py backend/tests/test_readiness_gate.pypassed: 10 tests.bash scripts/run_readiness_check.shpassed twice after adding the backend container entrypoint: 152 backend tests, frontend typecheck/build, Alembic head check and script syntax checks.python -m compileall backend/apppassed.cd backend && python -m alembic upgrade head --sqlpassed.bash -n scripts/live_migration_smoke.shandbash -n scripts/verify_demo_export_workflow.shpassed.- Local
docker compose configcould 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, notdeleted_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.tsxto summarize existing V1 state for project, AOI, datasets, active map layer, QA/QC and exports. - Wired the status strip into
frontend/src/App.tsxusing existing orchestration state only. - Added compact status-strip styling and regression tests for the frontend wiring contract.
n- Hardenedfrontend/src/components/GeoMap.tsxso 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.shso 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/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shvia 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-detectionfor comparing two vector datasets in the same project through the existing synchronous job envelope. - Added
ChangeDetectionServicewith persistedvector_featuresas 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,removedandunchangedfeature 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,removedandunchangedonly. It does not emit fakechangedobjects 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/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shvia Git Bash on Windowscd 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
## 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
- Add ADR decision records.
- Add RFC placeholders for future modules.
- Add API/database/event contracts.
- Add model registry and class catalogs.
- Add queue architecture.
- Add acceptance matrix and test catalog.
- 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/python3interpreter availability. - Fixed PostGIS/geospatial stack compatibility issues (
geojson_serviceimport 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
npmavailability 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.tomlbackend/app/core/config.pybackend/app/services/geojson_service.pybackend/tests/test_health.pybackend/tests/test_geojson_dataset_service.pybackend/README.mdfrontend/package.jsonfrontend/tsconfig.jsonfrontend/src/components/GeoMap.tsxfrontend/src/services/api/areas.tsfrontend/src/services/api/projects.tsfrontend/src/services/api/datasets.tsfrontend/src/App.tsxfrontend/README.mdscripts/run_readiness_check.shscripts/backend_install.shscripts/backend_test.shscripts/backend_dev.shscripts/codex_pass_end_check.shscripts/smoke_backend_import.shscripts/frontend_install.shscripts/frontend_typecheck.shscripts/frontend_build.shscripts/frontend_dev.shREADME.md.env.exampleCHANGELOG.mdMakefile
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 (makecommand missing)docker compose confignot runnable in this environment (dockercommand missing)python3commands fail in this environment becausepython3maps to Microsoft Store stub; usepythoninstead.
Known limitations
dockerandmakeare not installed in the current local shell environment.python3is not a usable interpreter in this environment;pythonmust be used for all backend runtime/tests.
Next recommended pass
- Run
docker composevalidation 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_UNAVAILABLEhandling. - 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
geojsoncompatibility, storage metadata persistence, and raster dependency fallback.
Files changed
backend/app/services/dataset_service.pybackend/app/services/raster_service.pybackend/app/services/geojson_service.pybackend/app/schemas/dataset.pybackend/app/api/routes/datasets.pybackend/app/services/storage_service.pybackend/tests/test_geojson_dataset_service.pybackend/tests/test_raster_service.pybackend/tests/test_storage_service.pybackend/README.mdfrontend/src/App.tsxfrontend/src/services/api/datasets.tsfrontend/src/types.tsdocs/API_CONTRACTS.mddocs/CODEX_EXECUTION_LOG.md.env.examplebackend/README.mdfrontend/README.mdCHANGELOG.mdREADME.md
Tests run
- Sprint 2 tests to be executed via readiness commands (see below).
Known limitations
rasteriois 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
geojsondataset rows in Sprint 1 records. - Confirmed backend import smoke and dataset/raster/vector service behavior remain intact.
Files changed
frontend/src/App.tsxdocs/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
python3is not available in the current environment; usepythoncommands for verification.dockeris not available in the current environment.
Next recommended pass
- Run the same sprint verification commands in an environment with
python3anddockerinstalled.
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.pybackend/app/schemas/__init__.pybackend/app/services/vector_operations_service.pybackend/app/services/raster_operations_service.pybackend/app/services/job_service.pybackend/app/api/routes/jobs.pybackend/app/models/entities.pybackend/app/models/__init__.pybackend/alembic/versions/20260611212435_add_jobs_table.pybackend/tests/test_vector_operations_service.pybackend/tests/test_raster_operations_service.pybackend/tests/test_storage_service.pyfrontend/src/App.tsxfrontend/src/services/api/datasets.tsfrontend/src/services/api/jobs.tsfrontend/src/types.tsbackend/README.mdfrontend/README.mddocs/API_CONTRACTS.mddocs/CODEX_EXECUTION_LOG.mdCHANGELOG.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.
dockerremains unavailable in this environment.python3still resolves to Windows Store stub; usepythonfor 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.pybackend/app/api/routes/health.pybackend/tests/test_raster_operations_service.pydocs/API_CONTRACTS.mddocs/CODEX_EXECUTION_LOG.mdbackend/README.mdfrontend/README.mdREADME.mdCHANGELOG.md
Tests run
python -m compileall backend/appcd backend && python -m pytestbash scripts/run_readiness_check.shbash scripts/smoke_backend_import.shcd frontend && npm run typecheckcd frontend && npm run build
Known limitations
- Raster dependency packages remain optional and will report
RASTER_PROCESSING_UNAVAILABLEif 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.mdfrontend/README.md
Files changed
backend/app/services/raster_operations_service.pybackend/tests/test_raster_operations_service.pybackend/app/api/routes/datasets.pybackend/app/schemas/operations.pyfrontend/src/App.tsxbackend/README.mdfrontend/README.mddocs/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
dockercommand is unavailable in this environment, sodocker compose configcould not be executed.python3command is unavailable as an alias in this environment; usepythoninstead.- Full raster dependency stack may be unavailable in some dev environments; those cases intentionally return structured
RASTER_PROCESSING_UNAVAILABLEresponses.
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.pyfrontend/src/App.tsxbackend/README.mdfrontend/README.mddocs/API_CONTRACTS.mddocs/RASTER_OPERATIONS_SPEC.mddocs/CODEX_EXECUTION_LOG.mdCHANGELOG.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_PARAMETERShandling for missing/invalid band indexes. - Implemented dependency-aware failure behavior for index execution (
RASTER_PROCESSING_UNAVAILABLE) whenrasterioornumpyare 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.pybackend/app/services/raster_operations_service.pybackend/app/api/routes/datasets.pybackend/tests/test_raster_operations_service.pyfrontend/src/services/api/datasets.tsfrontend/src/App.tsxfrontend/src/types.tsdocs/API_CONTRACTS.mddocs/RASTER_OPERATIONS_SPEC.mdbackend/README.mdfrontend/README.mdCHANGELOG.mddocs/CODEX_EXECUTION_LOG.md
Tests run
python -m compileall backend/appcd backend && python -m pytestbash scripts/run_readiness_check.shbash scripts/smoke_backend_import.shcd frontend && npm run typecheckcd frontend && npm run build
Known limitations
- Raster dependency checks remain optional; missing raster packages return explicit
RASTER_PROCESSING_UNAVAILABLEresults. - Job execution remains synchronous under current Sprint 3 job facade.
dockerandpython3availability 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.shso 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.pybackend/app/schemas/__init__.pybackend/app/api/routes/datasets.pybackend/app/services/qa_service.pybackend/alembic/versions/202606120001_add_dataset_reference_metadata.pybackend/tests/test_qa_service.pyfrontend/src/App.tsxscripts/run_readiness_check.shdocs/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 head202606120001)cd backend && python -m alembic upgrade head --sql(pass, generated SQL includes required dataset metadata columns)docker compose confignot runnable in this environment becausedockeris 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 headagainst 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_featuresORM model and Alembic migration with dataset and GiST geometry indexes. - Persisted uploaded vector GeoJSON features into PostGIS-backed
vector_featureswhile keeping original file storage intact. - Added first-class
quality_checksandmetricsORM models and Alembic migration indexes. - Added
QualityServicefor persisted QA/QC domain records and metric rows. - Updated QA candidate-vs-reference route so successful QA jobs also persist a
QualityCheckand metrics, and returnquality_check_idinresult_json. - Hardened provider capability contracts for GRB and OSM as
not_configuredstubs 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.pybackend/app/models/__init__.pybackend/app/services/dataset_service.pybackend/app/services/vector_feature_service.pybackend/app/services/quality_service.pybackend/app/api/routes/qa.pybackend/app/providers/base.pybackend/app/providers/grb.pybackend/app/providers/osm.pybackend/app/schemas/health.pybackend/alembic/versions/202606120700_sprint7a_persistence_foundation.pybackend/tests/test_sprint7a_persistence_foundation.pydocs/DATABASE_IMPLEMENTATION_PLAN.mddocs/API_CONTRACTS.mddocs/CODEX_EXECUTION_LOG.mdCHANGELOG.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 head202606120700)cd backend && python -m alembic upgrade head --sql(pass; generated SQL includesvector_features,quality_checks,metricsand the named GiST indexix_vector_features_geometry)docker compose configcould 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,manualandfixture. - Added provider capability, layer, status and future import-contract endpoints using the existing response envelope style.
- Preserved GRB and OSM as explicit
not_configuredproviders; 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/VectorFeatureServicerather than directvector_featureswrites. - Added frontend Provider Capabilities panel without live import buttons for GRB/OSM.
- Added opt-in
scripts/live_migration_smoke.shfor 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
detectionsORM model and Alembic migration with project, dataset, analysis run, class and GiST geometry indexes. - Hardened
analysis_runswith 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) andmanual-fixture-detector(explicit fixture/demo only). - Added
DetectionServiceboundary 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/detectionusing 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=trueand 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
aidependency group forultralyticsandtorch; normal backend startup remains import-safe without those packages. - Added YOLO configuration settings:
YOLO_ENABLEDYOLO_MODEL_PATHYOLO_MODEL_IDYOLO_MODEL_DISPLAY_NAMEYOLO_MODEL_VERSIONYOLO_DEVICEYOLO_IMAGE_SIZEYOLO_MAX_TILESYOLO_BATCH_SIZE
- Added
yolo-configuredmodel registry capability with honestnot_configured,dependency_unavailableandconfiguredstates. - Added
YoloDetectionAdapterthat 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,AnalysisRunand first-classDetectionpersistence. - 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_featuresusing the existingQualityService,quality_checksandmetricspersistence 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
segmentationsORM 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-configuredandsam-configured. - Added
SegmentationServiceboundary 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_featuresusing existingquality_checksandmetrics. - 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.pybackend/app/models/__init__.pybackend/alembic/versions/202606120900_sprint9_segmentation_foundation.pybackend/app/schemas/segmentation.pybackend/app/schemas/__init__.pybackend/app/services/model_registry_service.pybackend/app/services/segmentation_adapter.pybackend/app/services/segmentation_service.pybackend/app/api/routes/segmentation.pybackend/app/main.pybackend/tests/test_sprint9_segmentation_foundation.pyfrontend/src/types.tsfrontend/src/services/api/segmentation.tsfrontend/src/services/api/index.tsfrontend/src/App.tsxdocs/API_CONTRACTS.mddocs/AI_PIPELINES.mddocs/STORAGE_ARCHITECTURE.mddocs/DATABASE_IMPLEMENTATION_PLAN.mdbackend/README.mdfrontend/README.mdCHANGELOG.mddocs/CODEX_EXECUTION_LOG.md
Tests run
python -m pytest backend/tests/test_sprint9_segmentation_foundation.py -q(red first: missingSegmentationimport, 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=trueand 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 head202606120900)cd backend && python -m alembic upgrade head --sql(pass; generated SQL includessegmentationsand GiST index)bash -n scripts/live_migration_smoke.sh(pass)docker compose configcould 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.tsxinto focused frontend components. - Preserved existing workbench state ownership, API client calls, map overlay behavior and UI copy.
- Hardened
scripts/run_readiness_check.shwith 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.tsxfrontend/src/components/providers/ProviderPanel.tsxfrontend/src/components/detection/DetectionLab.tsxfrontend/src/components/segmentation/SegmentationLab.tsxscripts/run_readiness_check.shfrontend/README.mdCHANGELOG.mddocs/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.tsxstill 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.tsxandfrontend/src/components/project/AreaPanel.tsxfromfrontend/src/App.tsx. - Kept project and area form state owned by
App.tsx; extracted components receive state and callbacks only. cd frontend && npm run typecheckpassed after the additional extraction.
Pass 27 - Sprint 11 Live Docker/PostGIS Runtime Validation (2026-06-13)
Completed
- Hardened
scripts/live_migration_smoke.shso it runsSELECT 1, appliesalembic upgrade head, then checksPostGIS_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.pyto lock the smoke-script ordering and schema-check contract. - Documented the Docker/PostGIS validation command sequence, expected local
DATABASE_URLand cleanup commands inbackend/README.md.
Files changed
scripts/live_migration_smoke.shbackend/tests/test_live_migration_smoke_script.pybackend/README.mdCHANGELOG.mddocs/CODEX_EXECUTION_LOG.md
Runtime status
- Docker is not installed or not available in this shell, so
docker compose config,docker compose up -d dband the live container-backed smoke could not be completed here. - On a Docker-enabled machine, run:
docker compose configdocker compose up -d dbDATABASE_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.jsonwith the expected partial-match baseline. - Added
scripts/run_golden_qa_benchmark.pyto run existingQaServicelogic and verifyQualityServicepersistence 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.geojsonfixtures/golden/predicted_buildings.geojsonfixtures/golden/expected_qa_metrics.jsonscripts/run_golden_qa_benchmark.pybackend/tests/test_sprint12_golden_qa_benchmark.pydocs/QA_QC_SPECIFICATION.mdbackend/README.mdCHANGELOG.mddocs/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
YoloPreflightServicefor local configured-YOLO readiness checks without model loading, inference or downloads. - Added
scripts/yolo_preflight.pyfor 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.pyscripts/yolo_preflight.pybackend/tests/test_sprint13_yolo_preflight.pydocs/AI_PIPELINES.mdbackend/README.mdCHANGELOG.mddocs/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
DeprecationWarningpromoted 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.pybackend/app/services/geojson_service.pybackend/app/services/job_service.pybackend/app/services/qa_service.pybackend/app/services/quality_service.pyfrontend/vite.config.tsbackend/README.mdfrontend/README.mddocs/TODO.mdCHANGELOG.mddocs/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
pytestwith-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.shso placeholder scans skipnode_modules,distand__pycache__folders. - Updated
docs/TODO.mdwith 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.shscripts/codex_pass_end_check.shbackend/tests/test_readiness_gate.pybackend/README.mddocs/TODO.mdCHANGELOG.mddocs/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.shbackend/tests/test_readiness_gate.pybackend/README.mdCHANGELOG.mddocs/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.mdandapp/exist beforepip install .. - Removed mandatory root
.envreferences from Compose; default local runtime now uses checked-in environment values. - Added PostGIS healthcheck and backend
depends_onhealth condition. - Made the backend container run
python -m alembic upgrade headbefore starting Uvicorn. - Added backend and frontend
.dockerignorefiles 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/Dockerfiledocker-compose.ymlbackend/.dockerignorefrontend/.dockerignorebackend/tests/test_docker_runtime_config.pyREADME.mdbackend/README.mddocs/TODO.mdCHANGELOG.mddocs/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 -dto verify the real Docker runtime.
Pass 34 - Docker browser port 1202 (2026-06-15)
Completed
- Changed Docker Compose frontend host publishing from
5173:5173to1202:5173. - Added backend Docker CORS defaults for
http://localhost:1202andhttp://127.0.0.1:1202. - Updated
.env.exampleand local/Docker documentation to point browser users tohttp://localhost:1202for Docker Compose. - Added a regression assertion to Docker runtime config tests.
Files changed
docker-compose.yml.env.examplebackend/tests/test_docker_runtime_config.pyREADME.mdbackend/README.mdfrontend/README.mddocs/LOCAL_DEVELOPMENT_RUNBOOK.mdCHANGELOG.mddocs/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 refusedeven after the db container reported healthy. - Added
backend/docker_start.shto retry a real SQLAlchemySELECT 1connection before migrations. - Updated Compose to run
sh /app/docker_start.shfor backend startup. - Added regression tests that require the Docker start script and SQL readiness retry before migrations.
Files changed
backend/docker_start.shdocker-compose.ymlbackend/tests/test_docker_runtime_config.pybackend/README.mdCHANGELOG.mddocs/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)slines during migrations. - Fixed
backend/alembic.inilogging 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.inibackend/tests/test_alembic_logging_config.pyCHANGELOG.mddocs/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:1202from Codex: frontend HTML and backend/healthwere reachable, but/api/v1/projectson the frontend origin returned the frontend HTML fallback. - Changed the frontend API client default from
http://localhost:8000to same-origin requests. - Added Vite proxy routes for
/apiand/health. - Added Docker Compose
VITE_API_PROXY_TARGET=http://backend:8000so LAN browsers usehttp://192.168.10.150:1202only and the frontend container proxies API calls internally. - Added regression tests for same-origin API/proxy behavior.
Files changed
frontend/src/services/api/client.tsfrontend/vite.config.tsdocker-compose.ymlbackend/tests/test_docker_runtime_config.pyREADME.mdfrontend/README.mdCHANGELOG.mddocs/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.shto verify the browser-facing frontend URL,/api/v1/projectsproxy 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.shscripts/run_readiness_check.shbackend/tests/test_docker_runtime_config.pyREADME.mddocs/ENVIRONMENT_SPEC.mddocs/LOCAL_DEVELOPMENT_RUNBOOK.mdCHANGELOG.mddocs/CODEX_EXECUTION_LOG.md
Known limitations
- The currently running Tower deployment at
http://192.168.10.150:1202still returns frontend HTML for/api/v1/projectsuntil the frontend image is rebuilt and restarted.
Pass 39 - Environment contract cleanup (2026-06-16)
Completed
- Corrected
.env.exampleanddocs/ENVIRONMENT_SPEC.mdto use the YOLO environment variable names read by backend settings:YOLO_ENABLED,YOLO_MODEL_PATH,YOLO_MODEL_VERSIONandYOLO_MAX_TILES. - Updated frontend example settings to keep
VITE_API_BASE_URLempty by default and exposeVITE_API_PROXY_TARGETfor Vite proxy routing. - Added regression coverage for example environment names and browser runtime proxy verification.
Files changed
.env.exampledocs/ENVIRONMENT_SPEC.mdbackend/tests/test_docker_runtime_config.pyCHANGELOG.mddocs/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.confwith explicit reverse proxy rules for/api/and/healthtobackend:8000. - Changed Docker Compose frontend publishing from
1202:5173to1202: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/Dockerfilefrontend/nginx.confdocker-compose.ymlbackend/tests/test_docker_runtime_config.pyREADME.mdfrontend/README.mddocs/ENVIRONMENT_SPEC.mddocs/LOCAL_DEVELOPMENT_RUNBOOK.mdCHANGELOG.mddocs/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
gisoptional 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.shto 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.pyand 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
./backendbuild context; the root script now wraps the backend script.
Sprint 15 - Explicit demo workflow seed (2026-06-16)
- Added
POST /api/v1/demo/workflowfor an explicit offline demo workflow seed. - Added
DemoWorkflowServiceto create or return a demo project, AOI, fixture reference dataset, fixture candidate dataset and persisted QA/QC metrics. - Added
scripts/seed_demo_workflow.pyfor terminal-based demo seeding. - Added frontend
Load demo workflowaction 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-checksfor read-only project QA/QC result listing. - Added
QualityCheckServiceto return persistedquality_checkswith 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
exportsrows 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/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shcd backend && python -m alembic heads && python -m alembic upgrade head --sqlbash -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}/downloadas 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/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shcd backend && python -m alembic heads && python -m alembic upgrade head --sqlbash -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/reportto 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/htmlfor HTML report artifacts andapplication/jsonfor 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/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shcd backend && python -m alembic heads && python -m alembic upgrade head --sqlbash -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.shto 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/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shcd backend && python -m alembic heads && python -m alembic upgrade head --sqlbash -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.shstill 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
geointelDocker container viadocker-compose.unraid.yml. - Built the all-in-one image from
postgres:16-bookwormwith 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/projectscanonical JSON envelope and/geointel-icon.png.
Tested:
python -m pytest backend\tests\test_sprint31_unraid_template.pybash -n deploy/unraid/all-in-one-start.shbash -n scripts/live_migration_smoke.shbash -n scripts/verify_browser_runtime.shpowershell -NoProfile -ExecutionPolicy Bypass -File scripts\deploy_tower.ps1docker compose -f docker-compose.unraid.yml pson Towerbash 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>togeointelso 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.ymlso 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
geointelcontainer 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.shas 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 buildand start the final container withdocker runplus DockerMan labels. - The launch script installs the DockerMan template/icon, removes old
geointelcontainers, preserves/migrates the old Compose PostGIS volume when needed and starts the finalgeointelcontainer 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
geointelcontainer should exposenet.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.shas a shell wrapper for the deterministic QA/QC golden benchmark. - Made
scripts/run_readiness_check.shrunscripts/run_golden_qa_benchmark.py --jsonso QA/QC metric drift fails the main release gate. - Added a readiness syntax check for the golden benchmark wrapper.
- Hardened
scripts/validate_fixtures.pysofixtures/goldenGeoJSON 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.pypython scripts/run_golden_qa_benchmark.py --jsonbash -n scripts/verify_golden_qa_benchmark.shbash scripts/verify_golden_qa_benchmark.shpython -m compileall backend/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shcd backend && python -m alembic heads && python -m alembic upgrade head --sqlbash -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.shso the browser-facing demo/export smoke loadsfixtures/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/appcd backend && python -m pytest tests/test_sprint15_demo_workflow.py tests/test_sprint21_demo_workflow_smoke.py tests/test_readiness_gate.py -qcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shpowershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202
Open:
- Docker build still emits a warning about
GEOINTEL_POSTGRES_PASSWORDbeing present as an imageENV; 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-oneimage metadata. - Kept database credentials as runtime configuration supplied by
.env, the Unraid template, Compose ordocker run -e. - Added regression coverage so
GEOINTEL_POSTGRES_PASSWORDis not baked into the all-in-one Dockerfile again. - Updated Unraid runtime documentation and changelog.
Tested:
cd backend && python -m pytest tests/test_sprint31_unraid_template.py tests/test_docker_runtime_config.py -qbash -n deploy/unraid/all-in-one-start.shbash -n deploy/unraid/run-dockerman-container.shpython -m compileall backend/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shcd backend && python -m alembic heads && python -m alembic upgrade head --sqlpowershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202bash scripts/verify_demo_export_workflow.sh http://192.168.10.150:1202
Open:
- Local Windows shell has no
dockercommand in PATH, so Docker build/config verification must run on Tower during deploy. - Tower rebuild completed and the previous Docker BuildKit
SecretsUsedInArgOrEnvwarning no longer appears.
Limitations:
- The start script still has safe local defaults for standalone/dev startup. Shared deployments should set
GEOINTEL_POSTGRES_PASSWORDvia 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_MISMATCHwith 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 -qbash -n scripts/live_migration_smoke.shpython -m compileall backend/appcd backend && python -m pytest -W error::DeprecationWarningcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.shpowershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1bash scripts/verify_browser_runtime.sh http://192.168.10.150:1202bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202bash 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 typecheckcd 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 typecheckcd frontend && npm run buildcd 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
useQualityWorkflowanduseExportWorkflowdataflow 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 typecheckcd backend && python -m pytest tests/test_sprint27_frontend_workflow_hooks.py tests/test_sprint30_workbench_components.py tests/test_sprint47_workbench_interaction_smoke.py -qcd backend && python -m pytest tests/test_sprint51_quality_export_polish.py -qcd frontend && npm run buildbash 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
DatasetDetailPanelas 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 typecheckcd 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 -qcd backend && python -m pytest tests/test_sprint28_dataset_workflow_hook.py tests/test_sprint29_dataset_components.py tests/test_sprint52_workbench_inspector_tabs.py -qcd backend && python -m pytest tests/test_sprint52_workbench_inspector_tabs.py -qcd frontend && npm run buildbash 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 typecheckcd backend && python -m pytest tests/test_sprint28_dataset_workflow_hook.py tests/test_sprint29_dataset_components.py tests/test_sprint52_workbench_inspector_tabs.py -qcd backend && python -m pytest tests/test_sprint53_selection_ergonomics.py -qcd frontend && npm run buildbash 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 typecheckcd backend && python -m pytest tests/test_sprint51_quality_export_polish.py tests/test_sprint53_selection_ergonomics.py -qcd frontend && npm run buildbash 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:1202andhttp://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:5177using 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 typecheckcd backend && python -m pytest tests/test_sprint53_selection_ergonomics.py tests/test_sprint50_workspace_usability_polish.py -qcd frontend && npm run buildbash 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 typecheckcd backend && python -m pytest tests/test_sprint51_quality_export_polish.py -qcd frontend && npm run build- Local Browser visual audit against
http://127.0.0.1:5178using the live Tower API proxy. - Verified Exports history controls render with 50 live artifacts and a
reportsearch 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-deletewith a default cap of 25 so large--applyruns are blocked until explicitly reviewed and raised. - Added repeatable
--export-typefilters for targeted cleanup, e.g. reports only. - Extended the cleanup summary with
keep_latest,max_delete,export_types,type_filtered_export_count,candidate_exportsandblocked_reason. - Updated the root wrapper to expose the new filter helper.
- Updated
scripts/README.md,docs/STORAGE_ARCHITECTURE.md,backend/README.md,docs/TODO.mdandCHANGELOG.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.pycd 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_exportsdry-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.shas a live maintenance smoke for the demo export cleanup path. - The smoke auto-detects a running compose backend or all-in-one
geointelcontainer, with explicitCLEANUP_MODE=local|compose|containeroverrides. - The smoke runs cleanup without
--apply, then verifiesdry_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.mdandCHANGELOG.md.
Tested:
bash -n scripts/verify_demo_cleanup_dry_run.shpython -m py_compile scripts/cleanup_demo_artifacts.py backend/scripts/cleanup_demo_artifacts.pycd 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.shfor 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.gitignoreso screenshot outputs stay local. - Added readiness syntax coverage and regression checks for the screenshot capture contract.
- Updated
scripts/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
bash -n scripts/capture_workbench_screenshots.shcd 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:1202created 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.
Sprint 60 API error-envelope contract hardening (2026-06-18)
Changed:
- Audited the backend error payload shape against
docs/API_CONTRACTS.md. - Changed central FastAPI error serialization to return top-level
error,message,detailsandrequest_idfields. - Preserved HTTPException detail dict support for future explicit error codes.
- Updated the frontend API client to parse the canonical top-level error contract while remaining tolerant of the older nested
error.code/message/detailsshape. - Added regression tests for AppError, HTTPException and validation-error envelopes.
- Updated provider-registry error assertions to the canonical top-level schema.
- Added static frontend parser coverage for canonical and legacy error payloads.
- Updated
docs/TODO.mdandCHANGELOG.md.
Tested:
cd backend && python -m pytest tests/test_error_envelope_contract.py tests/test_sprint7b_provider_registry.py::test_provider_api_envelopes_and_invalid_provider -q(4 passed)python -m compileall backend/appcd frontend && npm run typecheckcd backend && python -m pytest -q(224 passed)cd frontend && npm run buildcd backend && python -m pytest tests/test_error_envelope_contract.py tests/test_frontend_api_client_error_parser.py tests/test_sprint7b_provider_registry.py::test_provider_api_envelopes_and_invalid_provider -q(6 passed)bash scripts/run_readiness_check.sh(226 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
GET /api/v1/external/providers/unknownreturned{"error":"PROVIDER_NOT_FOUND","message":"Provider not found","details":{},"request_id":null}. - Live
GET /api/v1/projects/not-a-uuidreturned top-levelVALIDATION_ERROR.
Open:
- None for this pass.
Limitations:
- This pass changes only the centralized response envelope and frontend parser. It does not rename route-level error codes or change product behavior.
Next recommended pass:
- Expand golden datasets beyond the current building QA fixtures.
Sprint 61 Golden QA scenario expansion (2026-06-18)
Changed:
- Added
fixtures/golden/golden_qa_benchmarks.jsonas the explicit scenario manifest for deterministic QA/QC regression coverage. - Added local golden fixture pairs for perfect-match, no-overlap and MultiPolygon building comparisons.
- Updated
scripts/run_golden_qa_benchmark.pyto execute all manifest scenarios, assert expected metric drift, persist simulatedQualityCheck/Metricrows for each scenario and report aggregate persistence totals. - Preserved backward-compatible top-level benchmark fields for scripts that still read the original single-scenario output shape.
- Updated
scripts/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
cd backend && python -m pytest tests/test_sprint12_golden_qa_benchmark.py -qfailed on missing multi-scenario manifest/output. cd backend && python -m pytest tests/test_sprint12_golden_qa_benchmark.py -q(4 passed)python scripts/run_golden_qa_benchmark.py --json
Open:
- Run full readiness and deploy Tower after the expanded golden benchmark passes the release gate.
Limitations:
- These are deterministic local QA/QC fixtures only. They do not introduce new production QA metrics or provider data.
Next recommended pass:
- Continue with frontend visual polish backlog or add a live golden benchmark smoke only if a running PostGIS environment needs that extra release signal.
Sprint 62 Workbench visual polish (2026-06-18)
Changed:
- Added a compact workspace command bar under the active workspace heading for quick movement between the main workbench surfaces.
- Polished the shared frontend visual system with raised/sunken surface tokens, softer shadows, tighter topbar spacing and consistent workspace panel styling.
- Replaced raw project/dataset empty-state text with structured empty-state blocks.
- Wrapped Detection Lab and Segmentation Lab result summaries in scan-friendly result cards and long result tables in scroll-safe containers.
- Improved mobile navigation density by making the primary nav and command chips horizontal rails on narrow screens.
- Added
backend/tests/test_sprint62_frontend_visual_polish.pyto guard the visual polish contracts. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
cd backend && python -m pytest tests/test_sprint62_frontend_visual_polish.py -qfailed on missing command bar, panel polish and empty/result wrappers. cd backend && python -m pytest tests/test_sprint62_frontend_visual_polish.py tests/test_sprint49_workbench_shell_refactor.py tests/test_sprint50_workspace_usability_polish.py -q(6 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local Chrome/Playwright visual check against
http://127.0.0.1:5175with live API proxy: desktop and mobile screenshots captured, no console warnings/errors, no horizontal page overflow.
Open:
- Run full readiness and deploy Tower after this visual polish pass.
Limitations:
- This is a frontend usability polish pass only. It does not add new API behavior, data processing, provider fetching or AI model functionality.
Next recommended pass:
- Continue with map/result overlay ergonomics, especially making selected dataset/result provenance easier to see beside the map.
Sprint 63 Map overlay ergonomics (2026-06-18)
Changed:
- Added active map layer source/provenance/draw-state context in the Map workspace using existing selected dataset, detection, segmentation and change-detection frontend state.
- Added a clear map empty-state when no vector/result layer is active.
- Added selected-feature property chips before the raw JSON feature inspector so common properties are scan-friendly.
- Tightened panel-title alignment with a scoped CSS override after the broader visual polish exposed a specificity issue in the existing
section > div:not(...)rule. - Added
backend/tests/test_sprint63_map_overlay_ergonomics.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
cd backend && python -m pytest tests/test_sprint63_map_overlay_ergonomics.py -qfailed on missing map provenance/feature-summary UI. cd backend && python -m pytest tests/test_sprint63_map_overlay_ergonomics.py tests/test_sprint30_workbench_components.py tests/test_sprint53_selection_ergonomics.py -q(11 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local Chrome/Playwright check against
http://127.0.0.1:5175with live API proxy: Map workspace opened, provenance rail present, no console warnings/errors, no horizontal page overflow.
Open:
- Run full readiness and deploy Tower after this pass.
Limitations:
- This is a frontend ergonomics pass only. It does not add new map layers, backend endpoints, provider fetching or geospatial processing.
Next recommended pass:
- Continue with export/report handoff polish or add a live browser smoke that explicitly visits every workspace after deployment.
Sprint 64 Export/report handoff polish (2026-06-18)
Changed:
- Added a handoff readiness card to the Export Center using existing project, selected dataset, selected detection run, selected segmentation run and latest export state.
- Reworked existing export actions into artifact cards for refresh, project report, project metadata, selected vector GeoJSON, detection GeoJSON and segmentation GeoJSON.
- Added formatted export-type badges and extra export-card provenance for analysis-run ids and created timestamps when those fields are available.
- Added responsive styling for handoff summary/action cards.
- Added
backend/tests/test_sprint64_export_handoff_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint64_export_handoff_polish.py -qfailed on missing handoff summary/action structure and styles. python -m pytest backend/tests/test_sprint64_export_handoff_polish.py backend/tests/test_sprint51_quality_export_polish.py -q(4 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local Chrome/Playwright check against
http://127.0.0.1:5175with live API proxy: Exports workspace opened, handoff summary/actions present, no console warnings/errors, no horizontal page overflow on desktop or mobile. bash scripts/run_readiness_check.sh(233 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the all-in-one container on Tower, with live migration smoke and browser runtime verification passing.- Live Chrome/Playwright check against
http://192.168.10.150:1202: Exports workspace opened, 6 handoff action cards present, no console warnings/errors, no horizontal page overflow on desktop or mobile.
Open:
- None for this pass.
Limitations:
- This is a frontend handoff usability pass only. It does not add export endpoints, change export persistence, introduce provider fetching or add AI/model behavior.
Next recommended pass:
- Run a live browser smoke across Exports and Overview after deployment, then continue with report artifact readability if the exported HTML itself needs visual polish.
Sprint 65 Project report readability polish (2026-06-18)
Changed:
- Reworked the lightweight
project_report_htmlrenderer into a self-contained handoff layout with hero, readiness pill, scorecards and sectioned report content. - Added print-friendly CSS and scroll-safe table wrappers to the HTML artifact.
- Added source and CRS columns to the dataset inventory section.
- Preserved existing export type, endpoint behavior, download behavior and storage flow.
- Added
backend/tests/test_sprint65_project_report_polish.py. - Updated
backend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint65_project_report_polish.py -qfailed on missing report shell, scorecards, print styles and readiness pill classes. python -m pytest backend/tests/test_sprint65_project_report_polish.py backend/tests/test_sprint17_export_foundation.py -q(12 passed)python -m compileall backend/appcd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(235 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live report smoke through
http://192.168.10.150:1202: seeded explicit demo workflow, createdproject_report_html, downloaded the HTML artifact and verified it in Chrome with 5 scorecards, 5 report sections, no console warnings/errors and no horizontal overflow on desktop or mobile.
Open:
- None for this pass.
Limitations:
- This remains a lightweight HTML handoff artifact. It does not add PDF generation, a report designer, new endpoints, live provider fetching or AI/model behavior.
Next recommended pass:
- Continue with a full-workspace browser smoke and then refine any remaining dense panels found during populated-state review.
Sprint 66 Live workspace smoke polish (2026-06-19)
Changed:
- Ran a live browser smoke against
http://192.168.10.150:1202across Overview, Data, Map, QA/QC, AI Labs, Exports and System. - Captured desktop and mobile screenshots under
artifacts/sprint66-live-workspace-smoke/. - Confirmed all primary workspaces load with no console warnings/errors and no page-level horizontal overflow.
- Tightened Export Center handoff card CSS so action cards and readiness cells wrap by available width instead of forcing cramped three/four-column layouts in the populated Exports workspace.
- Added
backend/tests/test_sprint66_live_workspace_smoke_polish.py.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint66_live_workspace_smoke_polish.py -qfailed on missing width-aware export grid CSS and Sprint 66 log entry. - Live desktop browser smoke: all seven primary workspaces opened, screenshots captured, no console warnings/errors, no horizontal page overflow.
- Live mobile browser smoke: all seven primary workspaces opened, screenshots captured, no console warnings/errors, no page-level horizontal overflow. The mobile primary nav intentionally remains a horizontal rail.
- Local post-fix browser check against
http://127.0.0.1:5175with live API proxy: Exports handoff action cards wrap to 2 desktop columns and 1 mobile column, no console warnings/errors and no horizontal page overflow. bash scripts/run_readiness_check.sh(237 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live post-deploy Exports check on
http://192.168.10.150:1202: handoff action cards render as 2 usable columns at desktop width, no console warnings/errors and no horizontal overflow.
Open:
- None for this pass.
Limitations:
- This is a visual ergonomics hardening pass only. It does not add endpoints, migrations, provider fetching, AI/model behavior or new product capabilities.
Next recommended pass:
- Continue with populated Map/Data interaction polish, especially making it easier to activate the demo vector layer from the map empty state.
Sprint 67 Map empty-state quick actions (2026-06-19)
Changed:
- Added ready vector/GeoJSON dataset quick actions to the Map workspace empty state.
- Reused the existing
openDatasetInMapfrontend flow so quick actions load the same persisted dataset layer as the Data workspace button. - Added width-aware
.map-empty-action-gridstyling for desktop and mobile. - Added
backend/tests/test_sprint67_map_empty_state_quick_actions.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint67_map_empty_state_quick_actions.py -qfailed on missing Map quick-action props, App wiring and CSS. python -m pytest backend/tests/test_sprint67_map_empty_state_quick_actions.py backend/tests/test_sprint63_map_overlay_ergonomics.py backend/tests/test_sprint30_workbench_components.py -q(9 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local Chrome/Playwright check against
http://127.0.0.1:5175with live API proxy: Map empty state showed 2 ready dataset actions, clicking the first loadeddemo_predicted_buildings.geojsonas a 2-feature active layer, no console warnings/errors and no horizontal overflow. bash scripts/run_readiness_check.sh(240 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live post-deploy Map quick-action check on
http://192.168.10.150:1202: Map empty state showed 2 ready dataset actions, clicking the first loadeddemo_predicted_buildings.geojsonas a 2-feature active layer, no console warnings/errors and no horizontal overflow.
Open:
- None for this pass.
Limitations:
- This is a frontend interaction polish pass only. It does not add map layers, backend endpoints, migrations, provider fetching or geospatial processing.
Next recommended pass:
- Continue with Data catalog density polish, especially making selected/reference/candidate dataset roles easier to scan in populated demo projects.
Sprint 68 Data catalog density polish (2026-06-19)
Changed:
- Added a compact role summary to the Data catalog for Selected, Reference, Candidate and Source datasets.
- Added scan-friendly dataset card badges plus source, reference layer and CRS context.
- Treated non-reference vector/GeoJSON datasets as QA Candidate display roles in the frontend only, preserving persisted
dataset_rolevalues and API contracts. - Added responsive role-summary and role-badge CSS.
- Added
backend/tests/test_sprint68_dataset_catalog_density.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint68_dataset_catalog_density.py -qfailed on missing role summary, role badges and responsive CSS. python -m pytest backend/tests/test_sprint68_dataset_catalog_density.py backend/tests/test_sprint67_map_empty_state_quick_actions.py backend/tests/test_sprint30_workbench_components.py -q(10 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser check against
http://127.0.0.1:5175with live API proxy: Data workspace showed Selected, Reference, Candidate and Source summary cards, with 1 Reference, 1 Candidate and 0 Source in the demo catalog; dataset badges rendered correctly on desktop and mobile, no console warnings/errors and no horizontal overflow. - Screenshots captured under
artifacts/sprint68-dataset-catalog-density/. bash scripts/run_readiness_check.sh(243 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live post-deploy Data catalog check on
http://192.168.10.150:1202: Data workspace showed Selected, Reference, Candidate and Source summary cards, candidate/reference badges rendered, no console warnings/errors and no horizontal overflow on desktop or mobile.
Open:
- None for this pass.
Limitations:
- This is a frontend density/readability pass only. It does not change dataset persistence, backend role validation, API contracts, migrations, provider fetching or AI/model behavior.
Next recommended pass:
- Continue with Data workspace action polish, especially making QA/export affordances clearer once candidate and reference layers are present.
Sprint 69 Data catalog action polish (2026-06-19)
Changed:
- Added role-aware recommended action hints to dataset cards.
- Reworked dataset card actions into compact two-line buttons for Inspect, Map, Export / QA and Metadata.
- Kept all existing Data workspace handlers and API calls unchanged.
- Added disabled-action explanation copy for unsupported export/QA and raster metadata refresh cases.
- Added responsive
.dataset-action-gridand.dataset-action-buttonCSS. - Added
backend/tests/test_sprint69_dataset_action_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint69_dataset_action_polish.py -qfailed on missing action hints, action grid and responsive styles. python -m pytest backend/tests/test_sprint69_dataset_action_polish.py backend/tests/test_sprint68_dataset_catalog_density.py backend/tests/test_sprint29_dataset_components.py -q(9 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser check against
http://127.0.0.1:5175with live API proxy: Data workspace rendered 2 role-aware hints and 8 compact dataset actions across the demo candidate/reference datasets, no console warnings/errors and no horizontal overflow on desktop or mobile. - Screenshots captured under
artifacts/sprint69-dataset-action-polish/. bash scripts/run_readiness_check.sh(246 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live post-deploy Data action check on
http://192.168.10.150:1202: Data workspace rendered 2 role-aware hints and 8 compact dataset actions across the demo candidate/reference datasets, no console warnings/errors and no horizontal overflow on desktop or mobile.
Open:
- None for this pass.
Limitations:
- This is a frontend affordance/readability pass only. It does not add new workflows, change dataset persistence, change API contracts, add migrations, fetch providers or alter AI/model behavior.
Next recommended pass:
- Continue with QA/QC workspace handoff polish, especially linking the existing candidate/reference dataset context more clearly to persisted QA results.
Sprint 70 QA/QC handoff polish (2026-06-19)
Changed:
- Added candidate/reference handoff cards to the QA/QC results panel.
- Resolved persisted quality-check candidate/reference dataset IDs to loaded dataset names when available.
- Passed
candidateDatasetsandreferenceDatasetsfromApp.tsxintoQualityResultsPanel. - Tightened QA candidate context to non-reference vector/GeoJSON datasets while preserving persisted
dataset_rolevalues. - Added responsive
.quality-handoff-grid,.quality-dataset-nameand.quality-check-dataset-linkCSS. - Added
backend/tests/test_sprint70_quality_handoff_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint70_quality_handoff_polish.py -qfailed on missing dataset context props, handoff markup, App wiring and styles. python -m pytest backend/tests/test_sprint70_quality_handoff_polish.py backend/tests/test_sprint39_frontend_orchestration_hooks.py backend/tests/test_sprint51_quality_export_polish.py -q(15 passed)python -m pytest backend/tests/test_sprint70_quality_handoff_polish.py backend/tests/test_sprint51_quality_export_polish.py backend/tests/test_sprint30_workbench_components.py backend/tests/test_sprint27_frontend_workflow_hooks.py -q(14 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser check against
http://127.0.0.1:5175with live API proxy: QA/QC workspace showed 1 candidate layer, 1 reference layer, latest comparison names and named dataset links inside persisted quality-check cards, with no console warnings/errors and no horizontal overflow. - Screenshots captured under
artifacts/sprint70-quality-handoff-polish/. bash scripts/run_readiness_check.sh(250 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live post-deploy QA/QC handoff check on
http://192.168.10.150:1202: QA/QC workspace showed 1 candidate layer, 1 reference layer, latest comparison names and named dataset links inside persisted quality-check cards, with no console warnings/errors and no horizontal overflow on desktop or mobile.
Open:
- None for this pass.
Limitations:
- This is a frontend handoff/readability pass only. It does not change QA persistence, metric calculations, API contracts, migrations, provider fetching or AI/model behavior.
Next recommended pass:
- Continue with QA/QC result card polish, especially making metric groups easier to scan in long-lived demo projects.
Sprint 71 QA/QC metric card polish (2026-06-19)
Changed:
- Added core metric evidence cards to QA/QC result cards for precision, recall, F1, mean IoU, false positives and false negatives.
- Kept the raw persisted metric list visible below the promoted evidence cards.
- Added compact metric label/value formatting in
QualityResultsPanel. - Added responsive
.quality-metric-grid,.quality-metric-cardand.quality-metric-card-criticalCSS. - Added
backend/tests/test_sprint71_quality_metric_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint71_quality_metric_polish.py -qfailed on missing metric promotion helpers, markup and styles. python -m pytest backend/tests/test_sprint71_quality_metric_polish.py backend/tests/test_sprint70_quality_handoff_polish.py backend/tests/test_sprint51_quality_export_polish.py backend/tests/test_sprint30_workbench_components.py -q(13 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser check against
http://127.0.0.1:5175with live API proxy: QA/QC workspace rendered 12 promoted metric cards across 2 persisted quality checks, retained 2 raw metric sections, no console warnings/errors and no horizontal overflow on desktop or mobile. - Screenshots captured under
artifacts/sprint71-quality-metric-polish/. bash scripts/run_readiness_check.sh(253 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live post-deploy QA/QC metric check on
http://192.168.10.150:1202: QA/QC workspace rendered 12 promoted metric cards across 2 persisted quality checks, retained 2 raw metric sections, no console warnings/errors and no body-level horizontal overflow on desktop or mobile. - Live mobile screenshot captured at
artifacts/sprint71-quality-metric-polish/live-qa-metrics-mobile.png.
Open:
- None for this pass.
Limitations:
- Frontend readability pass only; no QA calculation, persistence, API, migrations, provider or AI/model changes.
Next recommended pass:
- Continue with QA/QC metric/result filtering or result-card density for long-lived demo projects.
Sprint 72 Mobile overflow hardening (2026-06-20)
Changed:
- Clamped page-level horizontal overflow for
html,bodyand the workbench shell. - Kept mobile sidebar navigation and workspace shortcut chips as contained horizontal scroll regions with overscroll containment.
- Added min-width/max-width containment for the workbench layout, main area, inspector panel and card surfaces.
- Allowed long QA check IDs, dataset links and inspector values to wrap instead of widening result cards.
- Switched inspector tabs to a two-column layout on narrow screens.
- Added
backend/tests/test_sprint72_mobile_overflow_hardening.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint72_mobile_overflow_hardening.py -qfailed on missing mobile overflow and identifier wrapping contracts. python -m pytest backend/tests/test_sprint72_mobile_overflow_hardening.py backend/tests/test_sprint71_quality_metric_polish.py backend/tests/test_sprint62_frontend_visual_polish.py backend/tests/test_sprint30_workbench_components.py -q(11 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser check against
http://127.0.0.1:5176with live API proxy at a 390px viewport: QA/QC workspace rendered 2 quality cards and 12 metric cards; body, shell, inspector, inspector panel and inspector tabs stayed within viewport width; sidebar/workspace nav retained contained horizontal scrolling; no console warnings/errors. - Screenshot captured under
artifacts/sprint72-mobile-overflow-hardening/. bash scripts/run_readiness_check.sh(255 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live post-deploy mobile check on
http://192.168.10.150:1202at a 390px viewport: QA/QC workspace rendered 2 quality cards and 12 metric cards; body, shell, inspector, inspector panel and inspector tabs stayed within viewport width; sidebar/workspace nav retained contained horizontal scrolling; no console warnings/errors. - Live screenshot captured at
artifacts/sprint72-mobile-overflow-hardening/live-mobile-qa.png.
Open:
- None for this pass.
Limitations:
- Frontend CSS hardening only; no UI flow, API, persistence, migration, provider or AI/model changes.
Next recommended pass:
- Continue with QA/QC result filtering/density for long-lived demo projects, or a broader mobile visual pass across Data and Map once the overflow baseline is stable.
Sprint 73 QA/QC result filtering (2026-06-20)
Changed:
- Added client-side QA/QC result search across check id, type, status, candidate/reference dataset ids, analysis/job ids and resolved dataset names.
- Added status and check-type filters derived from the loaded quality-check list.
- Added latest-eight result density control with a show-all toggle.
- Added a no-match empty state and reset action for filtered result views.
- Reused the dense history control styling pattern while allowing the QA/QC controls to wrap inside narrower workspace columns.
- Added
backend/tests/test_sprint73_quality_result_filtering.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint73_quality_result_filtering.py -qfailed on missing filter state, filtered list logic and styles. python -m pytest backend/tests/test_sprint73_quality_result_filtering.py backend/tests/test_sprint72_mobile_overflow_hardening.py backend/tests/test_sprint71_quality_metric_polish.py backend/tests/test_sprint70_quality_handoff_polish.py backend/tests/test_sprint51_quality_export_polish.py -q(13 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser check against
http://127.0.0.1:5177with live API proxy: QA/QC filters rendered against 2 persisted demo checks; search/status conflict showed the no-match state; reset restored 2 checks and 12 metric cards; no console warnings/errors and no body-level overflow. - Local mobile browser check at a 390px viewport: filter controls stayed within viewport width, with 2 checks and 12 metric cards visible.
- Screenshots captured under
artifacts/sprint73-quality-result-filtering/. bash scripts/run_readiness_check.sh(257 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container, with live migration smoke and browser runtime verification passing.- Live post-deploy QA/QC filtering check on
http://192.168.10.150:1202: search/status conflict showed the no-match state; reset restored 2 checks and 12 metric cards; no console warnings/errors and no body-level overflow. - Live mobile check at a 390px viewport: QA/QC filter controls stayed within viewport width, with 2 checks and 12 metric cards visible.
- Live screenshots captured at
artifacts/sprint73-quality-result-filtering/live-qa-filtering.pngandartifacts/sprint73-quality-result-filtering/live-qa-filtering-mobile.png.
Open:
- None for this pass.
Limitations:
- Frontend filtering/density pass only; filtering is client-side over already-loaded persisted checks and does not change API pagination, persistence, QA calculations, migrations, provider behavior or AI/model behavior.
Next recommended pass:
- Continue with Data/Map mobile visual polish, especially dataset upload/action forms and map toolbar density on narrow screens.
Sprint 74 Data/Map mobile visual polish (2026-06-20)
Changed:
- Added mobile-density CSS for Data workspace upload forms, file input sizing and dataset action grids.
- Kept the desktop dataset action grid width contract intact while adding compact mobile tracks.
- Added touch/width containment for map toolbar controls, range sliders and empty-map quick actions.
- Reduced mobile map container height to keep controls and map visible together on narrow screens.
- Added
backend/tests/test_sprint74_data_map_mobile_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint74_data_map_mobile_polish.py -qfailed on missing mobile Data/Map CSS contracts. python -m pytest backend/tests/test_sprint74_data_map_mobile_polish.py backend/tests/test_sprint72_mobile_overflow_hardening.py backend/tests/test_sprint69_dataset_action_polish.py backend/tests/test_sprint68_dataset_catalog_density.py backend/tests/test_sprint67_map_empty_state_quick_actions.py backend/tests/test_sprint63_map_overlay_ergonomics.py backend/tests/test_sprint50_workspace_usability_polish.py backend/tests/test_sprint30_workbench_components.py -q(21 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser check against
http://127.0.0.1:5178with live API proxy at a 390px viewport: Data upload form, file input and 8 dataset action buttons stayed within the viewport with no body-level horizontal overflow; Map toolbar, 2 layer controls, range sliders and empty-map quick actions also stayed within the viewport. - Screenshots captured under
artifacts/sprint74-data-map-mobile-polish/. bash scripts/run_readiness_check.sh(259 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, with live migration smoke and browser runtime verification passing.- Live post-deploy browser check on
http://192.168.10.150:1202at a 390px viewport: Data upload form, file input and 8 dataset action buttons stayed within the viewport; Map toolbar, 2 layer controls, range sliders and empty-map quick actions stayed within the viewport; no body-level horizontal overflow was detected. - Live screenshots captured at
artifacts/sprint74-data-map-mobile-polish/live-data-mobile.pngandartifacts/sprint74-data-map-mobile-polish/live-map-mobile.png.
Open:
- None for this pass.
Limitations:
- Frontend CSS polish only; no Data/Map workflow, API, persistence, migration, provider or AI/model changes.
Next recommended pass:
- Continue with AI Labs mobile/density polish, especially detection and segmentation forms/tables.
Sprint 75 AI Labs mobile visual polish (2026-06-20)
Changed:
- Added mobile-density CSS for Detection and Segmentation Lab model cards, run forms and result summaries.
- Added overflow wrapping for long model ids, source tile paths, mask paths and QA summary values.
- Kept AI result tables scroll-contained while reducing their mobile minimum width.
- Added
backend/tests/test_sprint75_ai_labs_mobile_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint75_ai_labs_mobile_polish.py -qfailed on missing AI Labs mobile CSS contracts. python -m pytest backend/tests/test_sprint75_ai_labs_mobile_polish.py backend/tests/test_sprint74_data_map_mobile_polish.py backend/tests/test_sprint72_mobile_overflow_hardening.py backend/tests/test_sprint62_frontend_visual_polish.py backend/tests/test_sprint30_workbench_components.py backend/tests/test_sprint8c_detection_visualization_qa.py backend/tests/test_sprint9_segmentation_foundation.py -q(30 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser check against
http://127.0.0.1:5179with live API proxy at a 390px viewport: AI Labs rendered 2 panels, 7 model cards, 6 lab blocks and 4 lab forms with no body-level horizontal overflow. - Screenshot captured under
artifacts/sprint75-ai-labs-mobile-polish/. bash scripts/run_readiness_check.sh(261 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, with live migration smoke and browser runtime verification passing.- Live post-deploy browser check on
http://192.168.10.150:1202at a 390px viewport: AI Labs rendered 2 panels, 7 model cards, 6 lab blocks and 4 lab forms with no body-level horizontal overflow. - Live screenshot captured at
artifacts/sprint75-ai-labs-mobile-polish/live-ai-labs-mobile.png.
Open:
- None for this pass.
Limitations:
- Frontend CSS polish only; no Detection/Segmentation workflow, API, persistence, migration, provider or AI/model changes.
Next recommended pass:
- Continue with Export/System mobile-density polish, especially export action cards and provider capability lists.
Sprint 76 Export/System mobile visual polish (2026-06-20)
Changed:
- Added scan-friendly Provider Capabilities cards with structured provider header, status badge, authority/configuration/geometry/query mode fields and layer chips.
- Added mobile-density CSS for provider cards, export action cards, export history controls and export card headers.
- Added overflow wrapping for long provider limitations, attribution/license notes, export ids and artifact paths.
- Added
backend/tests/test_sprint76_export_system_mobile_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint76_export_system_mobile_polish.py -qfailed on missing Export/System mobile CSS and provider markup contracts. python -m pytest backend/tests/test_sprint76_export_system_mobile_polish.py backend/tests/test_sprint75_ai_labs_mobile_polish.py backend/tests/test_sprint74_data_map_mobile_polish.py backend/tests/test_sprint31_unraid_template.py backend/tests/test_sprint64_export_handoff_polish.py backend/tests/test_sprint7b_provider_registry.py backend/tests/test_sprint30_workbench_components.py -q(27 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(263 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, with live migration smoke and browser runtime verification passing.
Open:
- None for this pass.
Limitations:
- Frontend presentation polish only; no export workflow, provider API, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with right-side inspector mobile polish, especially long dataset/vector/raster metadata and action groups.
Sprint 77 Inspector mobile visual polish (2026-06-20)
Changed:
- Added compact inspector action button grids and mobile-safe wrapping for long inspector values.
- Added scroll/wrap containment for dataset detail text, job JSON and loaded feature metadata.
- Added
dataset-tool-panelanddataset-tool-groupclasses to raster/vector operation controls. - Added CSS containment for raster/vector tool labels, inputs, selects and buttons inside the inspector.
- Added
backend/tests/test_sprint77_inspector_mobile_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint77_inspector_mobile_polish.py -qfailed on missing inspector mobile CSS and dataset tool markup contracts. python -m pytest backend/tests/test_sprint77_inspector_mobile_polish.py backend/tests/test_sprint76_export_system_mobile_polish.py backend/tests/test_sprint75_ai_labs_mobile_polish.py backend/tests/test_sprint72_mobile_overflow_hardening.py backend/tests/test_sprint52_workbench_inspector_tabs.py backend/tests/test_sprint30_workbench_components.py backend/tests/test_sprint29_dataset_components.py -q(18 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(265 passed)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, with live migration smoke and browser runtime verification passing.
Open:
- None for this pass.
Limitations:
- Frontend presentation polish only; no dataset workflow, raster/vector operation behavior, API, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with report/export preview readability polish, especially large JSON/HTML handoff artifacts.
Sprint 78 Export preview readability polish (2026-06-20)
Changed:
- Added preview summary cards for JSON/GeoJSON export payload root type, root key count and rendered preview size.
- Added a scroll-contained export preview JSON shell and toolbar around the existing stored payload preview.
- Added wrapping for long JSON keys/values inside the preview body.
- Added
backend/tests/test_sprint78_export_preview_readability.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint78_export_preview_readability.py -qfailed on missing preview summary/shell CSS and markup contracts. python -m pytest backend/tests/test_sprint78_export_preview_readability.py backend/tests/test_sprint77_inspector_mobile_polish.py backend/tests/test_sprint76_export_system_mobile_polish.py backend/tests/test_sprint51_quality_export_polish.py backend/tests/test_sprint64_export_handoff_polish.py backend/tests/test_sprint17_export_foundation.py -q(20 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(267 passed; frontend typecheck/build passed; Alembic single head202606120900)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.
Open:
- None for this pass.
Limitations:
- Frontend presentation polish only; no export content, export API, artifact storage, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with accessibility/keyboard focus polish across primary workbench controls.
Sprint 79 Accessibility focus polish (2026-06-20)
Changed:
- Added a shared visible keyboard focus contract for primary buttons, workspace navigation, command chips, inspector tabs and dataset action buttons.
- Added explicit ARIA labels for workspace sidebar navigation, workspace command chips and overview quick actions.
- Bound inspector tabs to active tab panels with
aria-controls, tab ids,tabpanelrole andaria-labelledby. - Added
backend/tests/test_sprint79_accessibility_focus_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint79_accessibility_focus_polish.py -qfailed on missing focus-visible CSS, navigation labels and inspector tab/panel bindings. python -m pytest backend/tests/test_sprint79_accessibility_focus_polish.py backend/tests/test_sprint77_inspector_mobile_polish.py backend/tests/test_sprint53_selection_ergonomics.py backend/tests/test_sprint49_workbench_shell_refactor.py backend/tests/test_sprint47_workbench_interaction_smoke.py -q(15 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(270 passed; frontend typecheck/build passed; Alembic single head202606120900)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.
Open:
- None for this pass.
Limitations:
- Frontend accessibility/presentation polish only; no workflow behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with form-level validation/readability polish for dense raster/vector operation panels.
Sprint 80 Operation form readability polish (2026-06-20)
Changed:
- Added structured headings, helper text, field wrappers, responsive field grids and action rows to raster operation controls.
- Added equivalent readability structure to vector clip, buffer and intersect controls.
- Added inline dataset tool error styling for raster clip/tile validation messages.
- Added
backend/tests/test_sprint80_operation_form_readability.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint80_operation_form_readability.py -qfailed on missing form readability CSS and markup contracts. python -m pytest backend/tests/test_sprint80_operation_form_readability.py -q(3 passed)python -m pytest backend/tests/test_sprint80_operation_form_readability.py backend/tests/test_sprint77_inspector_mobile_polish.py backend/tests/test_sprint29_dataset_components.py backend/tests/test_sprint28_dataset_workflow_hook.py backend/tests/test_vector_operations_service.py backend/tests/test_raster_operations_service.py -q(37 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(273 passed; frontend typecheck/build passed; Alembic single head202606120900)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.
Open:
- None for this pass.
Limitations:
- Frontend readability/presentation polish only; no raster/vector operation behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with compact empty/error-state polish across QA, exports and AI lab result panels.
Sprint 81 Result state consistency polish (2026-06-20)
Changed:
- Added shared
result-stateCSS variants for loading, error, empty and ready states. - Applied result-state blocks to QA/QC error/empty/filter-empty states.
- Applied result-state blocks to export loading, error and empty/filter-empty states.
- Applied result-state blocks to Detection and Segmentation model loading/errors, empty registries, result counts and QA/run errors.
- Added
backend/tests/test_sprint81_result_state_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint81_result_state_polish.py -qfailed on missing result-state CSS and panel markup contracts. python -m pytest backend/tests/test_sprint81_result_state_polish.py -q(3 passed)python -m pytest backend/tests/test_sprint81_result_state_polish.py backend/tests/test_sprint80_operation_form_readability.py backend/tests/test_sprint75_ai_labs_mobile_polish.py backend/tests/test_sprint76_export_system_mobile_polish.py backend/tests/test_sprint73_quality_result_filtering.py backend/tests/test_sprint70_quality_handoff_polish.py backend/tests/test_sprint8c_detection_visualization_qa.py backend/tests/test_sprint9_segmentation_foundation.py -q(34 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(276 passed; frontend typecheck/build passed; Alembic single head202606120900)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.
Open:
- None for this pass.
Limitations:
- Frontend presentation/state polish only; no workflow behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with visual density review for topbar/sidebar/responsive shell after another live browser pass.
Sprint 82 Shell density polish (2026-06-20)
Changed:
- Added a keyboard skip link that targets the active workspace main region.
- Added an explicit
Primary workspaceslabel to the sidebar navigation and a focusableworkspace-maintarget. - Tightened narrow-screen topbar, context chip, sidebar nav and workspace shortcut density while keeping intentional horizontal rails scroll-safe.
- Added
backend/tests/test_sprint82_shell_density_polish.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Live browser pre-check against
http://192.168.10.150:1202showed no console errors, no horizontal document overflow and a too-tall narrow viewport topbar/context stack. - Red step:
python -m pytest backend/tests/test_sprint82_shell_density_polish.py -qfailed on missing skip-link, main focus target and compact mobile shell CSS contracts. python -m pytest backend/tests/test_sprint82_shell_density_polish.py -q(3 passed)python -m pytest backend/tests/test_sprint82_shell_density_polish.py backend/tests/test_sprint79_accessibility_focus_polish.py backend/tests/test_sprint72_mobile_overflow_hardening.py backend/tests/test_sprint49_workbench_shell_refactor.py backend/tests/test_sprint47_workbench_interaction_smoke.py -q(13 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(279 passed; frontend typecheck/build passed; Alembic single head202606120900)- Live post-deploy browser check found a narrow-screen cascade override that made
.context-barone-column again; tightened the regression test and kept the context rail scrollable through the smallest breakpoint. - Re-ran
python -m pytest backend/tests/test_sprint82_shell_density_polish.py -q,cd frontend && npm run typecheck,cd frontend && npm run buildandbash scripts/run_readiness_check.sh(279 passed) after that fix. powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.- Final live browser check against
http://192.168.10.150:1202passed on desktop and mobile viewports: no console warnings/errors, no horizontal document overflow, skip link/main target present,Primary workspacesnav label present and mobile context bar stayed compact at 64px tall.
Open:
- None for this pass.
Limitations:
- Frontend shell presentation/accessibility polish only; no workflow behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with a live visual review of dense workspace panel hierarchy after the shell density changes are deployed.
Sprint 83 Workspace panel hierarchy polish (2026-06-20)
Changed:
- Made the Overview readiness strip visually calmer with a compact section surface and tighter status tiles.
- Added explicit
overview-action-copy,overview-quick-actionsandquick-action-buttonregions to the recommended-action block. - Restyled the recommended flow block as a lighter accent callout so it no longer competes visually with the readiness strip.
- Added
backend/tests/test_sprint83_workspace_panel_hierarchy.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Live browser pre-check against
http://192.168.10.150:1202showed no console errors or horizontal overflow, but the first workspace viewport still had several equally weighted white cards. - Red step:
python -m pytest backend/tests/test_sprint83_workspace_panel_hierarchy.py -qfailed on missing Overview hierarchy regions and compact section-surface CSS contracts. python -m pytest backend/tests/test_sprint83_workspace_panel_hierarchy.py -q(3 passed)python -m pytest backend/tests/test_sprint83_workspace_panel_hierarchy.py backend/tests/test_sprint82_shell_density_polish.py backend/tests/test_sprint62_frontend_visual_polish.py backend/tests/test_sprint50_workspace_usability_polish.py backend/tests/test_sprint22_workbench_status_strip.py backend/tests/test_sprint47_workbench_interaction_smoke.py -q(15 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(282 passed; frontend typecheck/build passed; Alembic single head202606120900)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.- Final live browser check against
http://192.168.10.150:1202passed on desktop and mobile viewports: no console warnings/errors, no horizontal document overflow, Overview hierarchy regions present and four recommended-action buttons rendered.
Open:
- None for this pass.
Limitations:
- Frontend Overview presentation hierarchy only; no workflow behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with Data workspace panel hierarchy and selected-item density after this pass is deployed and visually checked.
Sprint 84 Data workspace density polish (2026-06-20)
Changed:
- Added selected-summary regions to Project, AOI and Dataset panels so the active data context appears before creation/upload forms.
- Split Project and AOI panels into
data-panel-form-blockanddata-panel-list-blockregions. - Split Dataset catalog into selected dataset, upload source data and available dataset regions.
- Restyled dataset upload as an embedded source-data block while preserving the existing upload flow.
- Added
backend/tests/test_sprint84_data_workspace_density.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Live browser pre-check against
http://192.168.10.150:1202showed Data workspace had no console errors or horizontal overflow, but the first Data viewport was still form-first and visually heavy. - Red step:
python -m pytest backend/tests/test_sprint84_data_workspace_density.py -qfailed on missing selected-summary and named form/list/catalog regions. python -m pytest backend/tests/test_sprint84_data_workspace_density.py -q(3 passed)python -m pytest backend/tests/test_sprint84_data_workspace_density.py backend/tests/test_sprint83_workspace_panel_hierarchy.py backend/tests/test_sprint50_workspace_usability_polish.py backend/tests/test_sprint29_dataset_components.py backend/tests/test_sprint68_dataset_catalog_density.py backend/tests/test_sprint69_dataset_action_polish.py backend/tests/test_sprint47_workbench_interaction_smoke.py -q(20 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(285 passed; frontend typecheck/build passed; Alembic single head202606120900)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.- Final live browser DOM/console check against
http://192.168.10.150:1202passed on desktop and mobile viewports: Data workspace active, no console warnings/errors, no horizontal document overflow, three selected-summary regions, three form blocks and three list/catalog blocks rendered.
Open:
- None for this pass.
Limitations:
- Frontend Data workspace presentation hierarchy only; no upload behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with Map workspace panel hierarchy and layer-control density after this pass is deployed and visually checked.
Sprint 85 Map workspace density polish (2026-06-20)
Changed:
- Added a compact Map workspace context summary for selected AOI, active layer and rendered feature state.
- Wrapped existing layer controls and provenance in a dedicated
map-control-surface. - Wrapped the existing MapLibre component in a
map-frame-surfaceand the selected-feature inspector in amap-inspection-surface. - Added
backend/tests/test_sprint85_map_workspace_density.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Live browser pre-check against
http://192.168.10.150:1202showed Map workspace had no console errors or horizontal overflow, but controls, provenance, map frame and inspector still read as a loose vertical stack. - Red step:
python -m pytest backend/tests/test_sprint85_map_workspace_density.py -qfailed on missing Map workspace surface and context-summary contracts. python -m pytest backend/tests/test_sprint85_map_workspace_density.py -q(3 passed)python -m pytest backend/tests/test_sprint85_map_workspace_density.py backend/tests/test_sprint63_map_overlay_ergonomics.py backend/tests/test_sprint67_map_empty_state_quick_actions.py backend/tests/test_sprint74_data_map_mobile_polish.py backend/tests/test_sprint47_workbench_interaction_smoke.py -q(13 passed)cd frontend && npm run typecheckcd frontend && npm run build- Live browser post-deploy check showed desktop Map workspace was structured and overflow-free, but the mobile breakpoint still stacked controls too tall above the map.
- Red step:
python -m pytest backend/tests/test_sprint85_map_workspace_density.py -qthen failed on missing compact mobile Map workspace breakpoint contracts. python -m pytest backend/tests/test_sprint85_map_workspace_density.py -q(4 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(289 passed; frontend typecheck/build passed; Alembic single head202606120900)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.- Final live browser check against
http://192.168.10.150:1202passed on desktop and mobile viewports: no console warnings/errors, no horizontal document overflow, three Map context summary cards, two layer control cards, separated control/map/inspector surfaces and mobile control preamble reduced after the compact breakpoint correction.
Open:
- None for this pass.
Limitations:
- Frontend Map workspace presentation hierarchy only; no overlay behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with QA/QC workspace result hierarchy and filter density after this pass is deployed and visually checked.
Sprint 86 QA/QC workspace density polish (2026-06-20)
Changed:
- Wrapped QA/QC summary metrics in
quality-summary-surface. - Wrapped candidate/reference/latest comparison context in
quality-evidence-surface. - Wrapped refresh, result states, filters and list limit controls in
quality-control-surface. - Wrapped persisted quality check cards in
quality-history-surface. - Added compact mobile CSS contracts for QA/QC summary, handoff, filter, score, metric and raw metric grids.
- Added
backend/tests/test_sprint86_quality_workspace_density.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Live browser pre-check against
http://192.168.10.150:1202showed QA/QC workspace had no console errors or horizontal overflow, but summary, handoff, filters and history were still visually stacked at equal weight. Mobile measured summary at 210px, handoff at 295px and filters at 278px before the result history. - Red step:
python -m pytest backend/tests/test_sprint86_quality_workspace_density.py -qfailed on missing QA/QC surface and density CSS contracts. python -m pytest backend/tests/test_sprint86_quality_workspace_density.py -q(3 passed)python -m pytest backend/tests/test_sprint86_quality_workspace_density.py backend/tests/test_sprint70_quality_handoff_polish.py backend/tests/test_sprint71_quality_metric_polish.py backend/tests/test_sprint73_quality_result_filtering.py backend/tests/test_sprint81_result_state_polish.py backend/tests/test_sprint47_workbench_interaction_smoke.py -q(18 passed)cd frontend && npm run typecheckcd frontend && npm run build- First full readiness run caught a compatibility regression in
backend/tests/test_sprint51_quality_export_polish.py: the rootquality-results-panelclass was no longer exact. Kept the old root class and moved the new shell into a wrapper. python -m pytest backend/tests/test_sprint51_quality_export_polish.py backend/tests/test_sprint86_quality_workspace_density.py backend/tests/test_sprint70_quality_handoff_polish.py backend/tests/test_sprint73_quality_result_filtering.py -q(11 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(292 passed; frontend typecheck/build passed; Alembic single head202606120900)powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1rebuilt and redeployed the Tower all-in-one container on port 1202, then passed live migration smoke and browser runtime verification.- Final live browser check against
http://192.168.10.150:1202passed on desktop and mobile viewports: no console warnings/errors, no horizontal document overflow, QA/QC shell/surfaces present and two persisted quality check cards rendered.
Open:
- None for this pass.
Limitations:
- Frontend QA/QC workspace presentation hierarchy only; no quality-check behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with Change Detection panel hierarchy and analysis workspace balance after this pass is deployed and visually checked.
Sprint 87 Change Detection density polish (2026-06-20)
Changed:
- Wrapped Change Detection input controls in
change-detection-input-surface. - Replaced loose error/empty text with shared
result-statecards insidechange-detection-state-stack. - Wrapped result metrics in
change-detection-result-surface. - Wrapped warning output in
change-detection-warning-surface. - Added compact responsive CSS contracts for Change Detection form and summary grids.
- Added
backend/tests/test_sprint87_change_detection_density.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Live browser pre-check attempt against
http://192.168.10.150:1202hit a transient browser automation click timeout on the QA/QC workspace nav; source review showed Change Detection was still the older header/form/summary stack. - Red step:
python -m pytest backend/tests/test_sprint87_change_detection_density.py -qfailed on missing Change Detection surface and density CSS contracts. python -m pytest backend/tests/test_sprint87_change_detection_density.py backend/tests/test_sprint18_change_detection.py backend/tests/test_sprint39_frontend_orchestration_hooks.py backend/tests/test_sprint86_quality_workspace_density.py backend/tests/test_sprint47_workbench_interaction_smoke.py -q(20 passed)cd frontend && npm run typecheckcd frontend && npm run buildbash scripts/run_readiness_check.sh(295 passed; frontend typecheck/build passed; Alembic head202606120900; live smoke syntax passed)- Tower deploy via
scripts/deploy_tower.ps1rebuilt and restarted the all-in-one container onhttp://192.168.10.150:1202. - Tower deploy live migration smoke passed with PostGIS
3.6 USE_GEOS=1 USE_PROJ=1 USE_STATS=1and required runtime schema objects present. - Browser runtime verification passed for frontend, proxied API and icon.
- Direct Chrome live UI check passed on desktop
1440x1000and mobile390x844: Change Detection shell/input surface rendered, no horizontal overflow and no console warnings/errors.
Open:
- None known after full readiness, Tower deploy and live browser validation.
Limitations:
- Frontend Change Detection presentation hierarchy only; no change-detection behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with AI Labs run-form hierarchy and detection/segmentation result density after this pass is deployed and visually checked.
Sprint 88 AI Labs density polish (2026-06-20)
Changed:
- Wrapped Detection Lab and Segmentation Lab in shared
ai-lab-shellworkspace shells. - Grouped model registry states into
ai-lab-model-surfacewith a sharedai-lab-state-stack. - Grouped run controls into
ai-lab-run-surface. - Grouped persisted detection/segmentation result loading and tables into
ai-lab-results-surface. - Grouped QA controls and metric summaries into
ai-lab-qa-surface. - Added shared AI Lab CSS contracts for compact model grids, form grids and summary grids.
- Added
backend/tests/test_sprint88_ai_lab_density.py. - Updated
frontend/README.md,docs/TODO.mdandCHANGELOG.md.
Tested:
- Red step:
python -m pytest backend/tests/test_sprint88_ai_lab_density.py -qfailed on missing AI Lab shells/surfaces and CSS contracts. python -m pytest backend/tests/test_sprint88_ai_lab_density.py backend/tests/test_sprint8c_detection_visualization_qa.py backend/tests/test_sprint9_segmentation_foundation.py backend/tests/test_sprint39_frontend_orchestration_hooks.py backend/tests/test_sprint47_workbench_interaction_smoke.py -q(34 passed)cd frontend && npm run typecheckcd frontend && npm run build- Local browser UI check against
http://127.0.0.1:5174passed on desktop and mobile: Detection/Segmentation shells and model/run/result/QA surfaces rendered, no horizontal overflow and no console warnings/errors. The local-only screenshot showed expected API 500 states because only the frontend Vite server was running. - First full readiness run caught legacy AI Lab static contract expectations for exact
lab-blockandresult-summary-cardclass names. Kept those compatibility anchors while preserving the new AI Lab surfaces. python -m pytest backend/tests/test_sprint50_workspace_usability_polish.py backend/tests/test_sprint75_ai_labs_mobile_polish.py backend/tests/test_sprint88_ai_lab_density.py -q(8 passed)bash scripts/run_readiness_check.sh(299 passed; frontend typecheck/build passed; Alembic head202606120900; live smoke syntax passed)- Tower deploy via
scripts/deploy_tower.ps1rebuilt and restarted the all-in-one container onhttp://192.168.10.150:1202. - Tower deploy live migration smoke passed with PostGIS
3.6 USE_GEOS=1 USE_PROJ=1 USE_STATS=1and required runtime schema objects present. - Browser runtime verification passed for frontend, proxied API and icon.
- Live browser AI Labs check against
http://192.168.10.150:1202passed on desktop and mobile: Detection/Segmentation shells and model/run/result/QA surfaces rendered, no horizontal overflow and no console warnings/errors.
Open:
- None known after full readiness, Tower deploy and live browser validation.
Limitations:
- Frontend AI Labs presentation hierarchy only; no detection/segmentation behavior, API contract, persistence, migration, provider fetching or AI/model changes.
Next recommended pass:
- Continue with export/system final visual consistency or live workflow guidance once this pass is deployed and visually checked.