Polish workflow rail context navigation
GeoIntel CI / docs-smoke (push) Has been cancelled
GeoIntel CI / contract-smoke (push) Has been cancelled

This commit is contained in:
Codex
2026-06-21 01:08:43 +02:00
parent 05e29598ef
commit 1872c60342
6 changed files with 63 additions and 2 deletions
+8
View File
@@ -7,6 +7,14 @@
# Changelog # 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) ## 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. - Audited the live populated demo workflow on `http://192.168.10.150:1202` across Overview, Data, Map, QA/QC, AI Labs and Exports.
@@ -28,7 +28,8 @@ def test_workflow_guidance_routes_to_existing_workspaces() -> None:
assert "target: 'analysis'" in app assert "target: 'analysis'" in app
assert "target: 'exports'" in app assert "target: 'exports'" in app
assert "onOpenAiWorkspace={() => setActiveWorkspace('ai')}" 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: 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 "layer feature" in app
assert "+ AOI" in app assert "+ AOI" in app
assert "AOI loaded" 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
+28
View File
@@ -3309,3 +3309,31 @@ Limitations:
Next recommended pass: Next recommended pass:
- After deploy and live validation, continue with any remaining populated-state visual issues found in the next audit. - 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.
+1
View File
@@ -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 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] 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] Audit populated demo workflow and tighten complete-state Overview guidance copy.
- [x] Make Overview workflow rail Map/Export clicks preserve useful dataset context.
+1
View File
@@ -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 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. - 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. - 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 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. - 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.
+12 -1
View File
@@ -449,6 +449,17 @@ function App(): JSX.Element {
} }
setActiveWorkspace('exports') 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 hasAnalysisOutput = qualityChecks.length > 0 || Boolean(changeDetectionResult) || detectionItems.length > 0 || segmentationItems.length > 0
const hasMapContext = mapFeatureCount > 0 || areaFeatureCount > 0 const hasMapContext = mapFeatureCount > 0 || areaFeatureCount > 0
const workflowGuidanceComplete = Boolean(selectedProjectId) && datasets.length > 0 && hasMapContext && hasAnalysisOutput && exports.length > 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 workflow-guidance-step-ready'
: 'workflow-guidance-step' : 'workflow-guidance-step'
} }
onClick={() => setActiveWorkspace(step.target)} onClick={() => openWorkflowGuidanceStep(step.target)}
aria-label={`Open ${step.title} step`} aria-label={`Open ${step.title} step`}
> >
<span className="workflow-step-status">{step.status}</span> <span className="workflow-step-status">{step.status}</span>