diff --git a/docs/implplan/SPRINT_20260306_003_FE_playwright_setup_reset_iteration_loop.md b/docs/implplan/SPRINT_20260306_003_FE_playwright_setup_reset_iteration_loop.md index 90b2f4e86..b6365b8cc 100644 --- a/docs/implplan/SPRINT_20260306_003_FE_playwright_setup_reset_iteration_loop.md +++ b/docs/implplan/SPRINT_20260306_003_FE_playwright_setup_reset_iteration_loop.md @@ -76,6 +76,9 @@ Completion criteria: | 2026-03-06 | Live mission-board interaction probe found a second routing defect: the visible `View SBOM` action linked to `/security/sbom/lake`, which stayed on that URL but rendered dashboard fallback content. Direct navigation proved the intended surface is `/security/sbom-lake`. | QA | | 2026-03-06 | Fixed the mission-board SBOM action to point at `/security/sbom-lake` and extended `prealpha-canonical-full-sweep.spec.ts` to cover both the canonical SBOM Lake route and the dashboard click-through path. | Developer (FE) | | 2026-03-06 | Verification: targeted Playwright slice passed locally (`npx playwright test tests/e2e/prealpha-canonical-full-sweep.spec.ts --grep \"sbom-lake|mission board SBOM card opens SBOM Lake\"` -> 2/2 pass). Frontend bundle rebuilt, synced into `compose_console-dist`, and live authenticated Playwright confirmed the mission-board `View SBOM` action now lands on `https://stella-ops.local/security/sbom-lake` with `SBOM Lake` / `Attestation Coverage Metrics` visible. | QA | +| 2026-03-06 | Follow-up mission-board QA found a semantic navigation defect: Playwright DOM capture showed both Reachability card actions (`View reachability`, `Deep analysis`) pointing at `/security/findings` even though the working canonical reachability surface is `/security/reachability`. | QA | +| 2026-03-06 | Updated the mission-board Reachability card actions to target `/security/reachability` and added focused Playwright coverage for the canonical reachability route plus the mission-board click-through. | Developer (FE) | +| 2026-03-06 | Verification: targeted Playwright slice passed locally (`npx playwright test tests/e2e/prealpha-canonical-full-sweep.spec.ts --grep \"route works: /security/reachability|mission board reachability card opens Reachability Center\"` -> 2/2 pass). Frontend bundle rebuilt, synced into `compose_console-dist`, and live authenticated Playwright confirmed the mission-board Reachability action now lands on `https://stella-ops.local/security/reachability` with `Reachability Center` visible. | QA | ## Decisions & Risks - Decision: this sprint stays inside `src/Web/StellaOps.Web` plus required sprint/doc updates only. diff --git a/src/Web/StellaOps.Web/src/app/features/dashboard-v3/dashboard-v3.component.ts b/src/Web/StellaOps.Web/src/app/features/dashboard-v3/dashboard-v3.component.ts index 1a39afaa5..e80c2f67c 100644 --- a/src/Web/StellaOps.Web/src/app/features/dashboard-v3/dashboard-v3.component.ts +++ b/src/Web/StellaOps.Web/src/app/features/dashboard-v3/dashboard-v3.component.ts @@ -274,7 +274,7 @@ interface MissionSummary {

Reachability

- View reachability + View reachability
@@ -305,7 +305,7 @@ interface MissionSummary {

@@ -1146,4 +1146,3 @@ export class DashboardV3Component { } } - diff --git a/src/Web/StellaOps.Web/tests/e2e/prealpha-canonical-full-sweep.spec.ts b/src/Web/StellaOps.Web/tests/e2e/prealpha-canonical-full-sweep.spec.ts index b272a6b06..45108732e 100644 --- a/src/Web/StellaOps.Web/tests/e2e/prealpha-canonical-full-sweep.spec.ts +++ b/src/Web/StellaOps.Web/tests/e2e/prealpha-canonical-full-sweep.spec.ts @@ -187,6 +187,10 @@ const strictRouteExpectations: Partial { await expect(page.locator('#main-content')).toContainText('Attestation Coverage Metrics'); }); + test('mission board reachability card opens Reachability Center', async ({ page }) => { + await page.goto('/mission-control/board', { waitUntil: 'domcontentloaded' }); + await page.locator('#main-content a[href="/security/reachability"]').first().click(); + + await expect(page).toHaveURL(/\/security\/reachability$/); + await expect(page).toHaveTitle(/Reachability/i); + await expect(page.locator('#main-content')).toContainText('Reachability Center'); + }); + test('sidebar root navigation works for all canonical workspaces', async ({ page }) => { await page.goto('/mission-control/board', { waitUntil: 'domcontentloaded' }); await page.locator('aside.sidebar a[href="/releases/overview"]').first().click();