# Release Investigation Routes Reconnection ## Module Web ## Status IMPLEMENTED ## Sprint SPRINT_20260308_022_FE_unreachable_release_investigation_routes ## Description Integrated disconnected release-investigation route families (timeline, deploy-diff, change-trace) into the canonical Releases product under a bounded `/releases/investigation/` prefix. The investigation timeline is mounted as a secondary route to avoid colliding with the shipped run workspace tab at `/releases/runs/:runId/timeline`. ## Canonical URL Contract - `/releases/investigation/timeline` - Investigation timeline overview - `/releases/investigation/timeline/:correlationId` - Correlated event drill-in - `/releases/investigation/deploy-diff` - Deployment diff workspace; direct load shows a recovery state when no `from`/`to` digests are present - `/releases/investigation/change-trace` - Change trace workspace; direct load shows a recovery state until a comparison or trace id is selected - `/releases/investigation/change-trace/:traceId` - Specific trace detail ## Direct-Load Workspace Contract - `/releases/investigation/deploy-diff` no longer fails with `Missing Parameters`. Direct navigation now shows `No Comparison Selected` plus recovery actions back to `/releases/deployments` and `/releases/overview`. - `/releases/investigation/change-trace` no longer renders an inert `No Change Trace Loaded` shell. Direct navigation now shows `No Comparison Selected` plus recovery actions to `/releases/deployments`, or back to deploy-diff when `from`/`to` digests are already present. - Both workspaces preserve tenant/scope query context when it exists and fall back to the canonical `demo-prod` tenant on a fresh shell load. ## Timeline Decision **Bounded-secondary-route** (not absorb-into-run-workspace). The investigation timeline is a correlation-based tool that spans multiple services by correlationId, which is conceptually different from the run workspace's timeline tab showing run execution flow. Mounting it under `/releases/investigation/timeline` avoids URL collision and keeps both capabilities distinct. ## Implementation Details - **Route file**: `src/Web/StellaOps.Web/src/app/routes/releases.routes.ts` - Added three `loadChildren` entries under `investigation/` prefix - **Feature routes updated**: - `src/Web/StellaOps.Web/src/app/features/timeline/timeline.routes.ts` - Added breadcrumb, title, sprint ref - `src/Web/StellaOps.Web/src/app/features/deploy-diff/deploy-diff.routes.ts` - Updated canonical URL reference - `src/Web/StellaOps.Web/src/app/features/change-trace/change-trace.routes.ts` - Added breadcrumb, title, sprint ref - **Tests**: `src/Web/StellaOps.Web/src/app/routes/releases.routes.spec.ts` - **Recheck (2026-03-09)**: - `deploy-diff` is now backed by the live lineage compare contract instead of the dead `/api/v1/sbom/diff` path. - `change-trace` is now backed by the restored `/api/change-traces/build` and `/api/change-traces/{traceId}` compatibility endpoints in SbomService. - Focused verification passed on `src/Web/StellaOps.Web/src/app/features/deploy-diff/pages/deploy-diff.page.spec.ts` and `src/Web/StellaOps.Web/src/app/features/change-trace/change-trace-viewer.component.spec.ts`. ## Deliberately Excluded Legacy Behaviors - The old timeline route at `/timeline` (standalone top-level) is not revived - Direct mounting at `/releases/runs/:runId/timeline` for the investigation timeline is explicitly avoided (that path is owned by the run workspace)