Fix mission board reachability navigation

This commit is contained in:
master
2026-03-06 19:41:35 +02:00
parent 2446e2c61d
commit bcf708d688
3 changed files with 18 additions and 3 deletions

View File

@@ -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.

View File

@@ -274,7 +274,7 @@ interface MissionSummary {
<section class="domain-card" aria-label="Reachability summary">
<div class="card-header">
<h2 class="card-title">Reachability</h2>
<a routerLink="/security/findings" class="card-link">View reachability</a>
<a routerLink="/security/reachability" class="card-link">View reachability</a>
</div>
<div class="card-body">
<div class="bir-matrix">
@@ -305,7 +305,7 @@ interface MissionSummary {
</p>
</div>
<div class="card-footer">
<a routerLink="/security/findings" class="card-action">Deep analysis</a>
<a routerLink="/security/reachability" class="card-action">Deep analysis</a>
</div>
</section>
@@ -1146,4 +1146,3 @@ export class DashboardV3Component {
}
}

View File

@@ -187,6 +187,10 @@ const strictRouteExpectations: Partial<Record<(typeof canonicalRoutes)[number],
title: /SBOM Lake/i,
texts: ['SBOM Lake', 'Attestation Coverage Metrics'],
},
'/security/reachability': {
title: /Reachability/i,
texts: ['Reachability Center'],
},
'/ops/policy': {
title: /Policy/i,
texts: ['Policy Governance', 'Risk Budget Overview'],
@@ -1281,6 +1285,15 @@ test.describe('Pre-alpha key end-user interactions', () => {
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();