diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e456174..138c2226 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ # Changelog +## Sprint 92 workflow rail interaction polish (2026-06-21) + +- Audited the live Overview workflow rail click path from Overview to Data, Map, QA/QC and Exports. +- Hardened the Map workflow step to reuse the first ready vector/GeoJSON dataset through the existing map-open flow when no layer is active. +- Hardened the Export workflow step to reuse the first ready vector/GeoJSON dataset through the existing export-open flow when no dataset is selected. +- Added regression coverage for the context-aware rail handler and fallback workspace navigation. +- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed. + ## Sprint 91 populated workflow audit polish (2026-06-21) - Audited the live populated demo workflow on `http://192.168.10.150:1202` across Overview, Data, Map, QA/QC, AI Labs and Exports. diff --git a/backend/tests/test_sprint90_workflow_guidance.py b/backend/tests/test_sprint90_workflow_guidance.py index 2b500214..f7a5523b 100644 --- a/backend/tests/test_sprint90_workflow_guidance.py +++ b/backend/tests/test_sprint90_workflow_guidance.py @@ -28,7 +28,8 @@ def test_workflow_guidance_routes_to_existing_workspaces() -> None: assert "target: 'analysis'" in app assert "target: 'exports'" in app assert "onOpenAiWorkspace={() => setActiveWorkspace('ai')}" in app - assert "onClick={() => setActiveWorkspace(step.target)}" in app + assert "onClick={() => openWorkflowGuidanceStep(step.target)}" in app + assert "setActiveWorkspace(target)" in app def test_workflow_guidance_has_responsive_contracts() -> None: @@ -50,3 +51,14 @@ def test_workflow_guidance_complete_state_and_map_copy_are_precise() -> None: assert "layer feature" in app assert "+ AOI" in app assert "AOI loaded" in app + + +def test_workflow_guidance_map_and_export_steps_reuse_dataset_context() -> None: + app = (ROOT / "frontend" / "src" / "App.tsx").read_text(encoding="utf-8") + + assert "openWorkflowGuidanceStep" in app + assert "target === 'map'" in app + assert "openDatasetInMap(availableMapDatasets[0])" in app + assert "target === 'exports'" in app + assert "openDatasetExport(availableMapDatasets[0])" in app + assert "onClick={() => openWorkflowGuidanceStep(step.target)}" in app diff --git a/docs/CODEX_EXECUTION_LOG.md b/docs/CODEX_EXECUTION_LOG.md index a7d2deaf..af3ca993 100644 --- a/docs/CODEX_EXECUTION_LOG.md +++ b/docs/CODEX_EXECUTION_LOG.md @@ -3309,3 +3309,31 @@ Limitations: Next recommended pass: - After deploy and live validation, continue with any remaining populated-state visual issues found in the next audit. + +## Sprint 92 workflow rail interaction polish (2026-06-21) + +Changed: +- Audited the live Overview workflow rail click path on `http://192.168.10.150:1202`. +- Added `openWorkflowGuidanceStep` so Map and Export rail clicks can reuse existing dataset context flows. +- Map rail click now opens the first ready vector/GeoJSON dataset through `openDatasetInMap` when no layer is active. +- Export rail click now opens the first ready vector/GeoJSON dataset through `openDatasetExport` when no dataset is selected. +- Extended `backend/tests/test_sprint90_workflow_guidance.py` with regression coverage for the context-aware rail handler. +- Updated `frontend/README.md`, `docs/TODO.md` and `CHANGELOG.md`. + +Tested: +- Live pre-change browser audit showed the rail navigated correctly but Map landed with no active layer and Exports landed with `Selected dataset: none`. +- Red step: `python -m pytest backend/tests/test_sprint90_workflow_guidance.py -q` failed on missing `openWorkflowGuidanceStep` / dataset-context handler contracts. +- `python -m pytest backend/tests/test_sprint90_workflow_guidance.py backend/tests/test_sprint53_selection_ergonomics.py backend/tests/test_sprint67_map_empty_state_quick_actions.py backend/tests/test_sprint64_export_handoff_polish.py -q` (`15 passed`) +- `cd frontend && npm run typecheck` +- `cd frontend && npm run build` +- Local browser UI check against `http://127.0.0.1:5174` passed for rail rendering with no horizontal overflow. Local console showed expected Vite proxy 500s because only the frontend server was running. +- `bash scripts/run_readiness_check.sh` (`308 passed`; frontend typecheck/build passed; Alembic head `202606120900`; live smoke syntax passed) + +Open: +- Tower deploy and live post-change rail interaction validation still pending for this pass. + +Limitations: +- Frontend workflow navigation polish only; no API contract, persistence, migration, provider fetching or AI/model behavior changes. + +Next recommended pass: +- After deploy and live validation, continue with export artifact action ergonomics or QA result drill-down, depending on the next live friction point. diff --git a/docs/TODO.md b/docs/TODO.md index 61acc219..89f9def2 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -363,3 +363,4 @@ This file now starts with the current implementation status. Older preparation/b - [x] Add QA/QC result filtering and density controls for long-running demo projects. - [x] Add Overview workflow guidance for the V1 project -> data -> map -> QA/AI -> export path. - [x] Audit populated demo workflow and tighten complete-state Overview guidance copy. +- [x] Make Overview workflow rail Map/Export clicks preserve useful dataset context. diff --git a/frontend/README.md b/frontend/README.md index b7354b4c..bd9af2fc 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -250,6 +250,7 @@ Detection Lab and Segmentation Lab now share the same AI workspace hierarchy: mo - The Overview workspace separates readiness, status tiles and recommended next actions into distinct visual hierarchy regions, keeping the first screen scannable without changing workflow behavior. - The Overview workspace now also shows a compact workflow guidance rail for the V1 path from project and AOI setup through data, map review, QA/AI validation and export handoff. - When the V1 workflow is populated end to end, the Overview rail switches to a `Ready for handoff` state and keeps map guidance explicit about layer features versus AOI context. +- Overview rail Map and Export clicks reuse the first ready vector/GeoJSON dataset when no layer or dataset is active, keeping the happy path connected without adding new API calls. - The Data workspace surfaces selected project, AOI and dataset context before creation/upload forms, then separates form and catalog/list regions for faster scanning. - The Export Center includes a handoff readiness summary, grouped artifact actions and provenance-rich export cards so report/GeoJSON handoff stays understandable in long-running demo projects. diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 24c54a5b..94c890b2 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -449,6 +449,17 @@ function App(): JSX.Element { } setActiveWorkspace('exports') } + const openWorkflowGuidanceStep = (target: WorkspaceKey) => { + if (target === 'map' && availableMapDatasets.length > 0 && !mapFeatureCollection) { + openDatasetInMap(availableMapDatasets[0]) + return + } + if (target === 'exports' && availableMapDatasets.length > 0 && !selectedDataset) { + openDatasetExport(availableMapDatasets[0]) + return + } + setActiveWorkspace(target) + } const hasAnalysisOutput = qualityChecks.length > 0 || Boolean(changeDetectionResult) || detectionItems.length > 0 || segmentationItems.length > 0 const hasMapContext = mapFeatureCount > 0 || areaFeatureCount > 0 const workflowGuidanceComplete = Boolean(selectedProjectId) && datasets.length > 0 && hasMapContext && hasAnalysisOutput && exports.length > 0 @@ -630,7 +641,7 @@ function App(): JSX.Element { ? 'workflow-guidance-step workflow-guidance-step-ready' : 'workflow-guidance-step' } - onClick={() => setActiveWorkspace(step.target)} + onClick={() => openWorkflowGuidanceStep(step.target)} aria-label={`Open ${step.title} step`} > {step.status}