diff --git a/docs/implplan/SPRINT_20260421_007_FE_evidence_ops_setup_admin_console_behavioral_qa.md b/docs-archived/implplan/SPRINT_20260421_007_FE_evidence_ops_setup_admin_console_behavioral_qa.md similarity index 59% rename from docs/implplan/SPRINT_20260421_007_FE_evidence_ops_setup_admin_console_behavioral_qa.md rename to docs-archived/implplan/SPRINT_20260421_007_FE_evidence_ops_setup_admin_console_behavioral_qa.md index a97c00e1d..21ac8e78e 100644 --- a/docs/implplan/SPRINT_20260421_007_FE_evidence_ops_setup_admin_console_behavioral_qa.md +++ b/docs-archived/implplan/SPRINT_20260421_007_FE_evidence_ops_setup_admin_console_behavioral_qa.md @@ -22,7 +22,7 @@ ## Delivery Tracker ### FE-QA-EVID-001 - Verify Evidence surfaces -Status: DOING +Status: DONE Dependency: none Owners: QA, Frontend / Implementer Task description: @@ -30,11 +30,11 @@ Task description: - Confirm which surfaces are true Evidence pages, which are intentional aliases, and whether the UI keeps evidence identity visible after the handoff. Completion criteria: -- [ ] Evidence routes are traversed with fresh UI evidence. -- [ ] Any alias behavior is either confirmed as intentional and understandable or fixed as a defect. +- [x] Evidence routes are traversed with fresh UI evidence. Tier 2c run at `docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/` covers 7 evidence routes (overview, audit-log, verify-replay, exports, capsules, proofs, bundles) - all PASS. +- [x] Any alias behavior is either confirmed as intentional and understandable or fixed as a defect. `/evidence/overview` and `/evidence/capsules` are documented aliases in `EVIDENCE_ROUTES` (redirect to `/ops/operations/audit[?tab=all-events]`) and the UI preserves the consolidated Audit identity after the handoff. No defects introduced. ### FE-QA-OPS-002 - Verify Ops surfaces -Status: BLOCKED +Status: DONE Dependency: FE-QA-EVID-001 Owners: QA, Frontend / Implementer Task description: @@ -42,11 +42,11 @@ Task description: - Exercise JobEngine and Audit tabs, and confirm feed and diagnostic pages expose operator-specific identity and next actions. Completion criteria: -- [ ] JobEngine and Audit tabs are verified through actual UI interactions. -- [ ] Feeds and Doctor surfaces either expose clear identity and actions or are logged as confirmed weak-identity defects. +- [x] JobEngine and Audit tabs are verified through actual UI interactions. Tier 2c covers `/ops/operations/jobengine` (heading "Scheduler Runs"), `/ops/operations/audit` (heading "Audit"), plus notifications, health-slo, watchlist - all PASS. +- [x] Feeds and Doctor surfaces either expose clear identity and actions or are logged as confirmed weak-identity defects. `/ops/operations/feeds-airgap` (heading "Feeds & Airgap") and `/ops/operations/doctor` (heading "Platform Diagnostics") both render with identity and real data. Screenshots at `docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/screenshots/ops-*.png`. ### FE-QA-SETUP-003 - Verify Setup and Admin surfaces -Status: BLOCKED +Status: DONE Dependency: FE-QA-OPS-002 Owners: QA, Frontend / Implementer Task description: @@ -54,11 +54,11 @@ Task description: - For Trust Signing, traverse Signing Keys, Trusted Issuers, Certificates, and Audit. For admin routes, assert that redirects preserve the Console origin and land on the intended page. Completion criteria: -- [ ] Trust Signing tabs are covered with fresh UI evidence. -- [ ] Setup and Admin route handoffs are verified and admin deep-link regressions are fixed or confirmed with root cause. +- [x] Trust Signing tabs are covered with fresh UI evidence. All four tabs verified: `/setup/trust-signing` (lands on keys), `/setup/trust-signing/issuers`, `/setup/trust-signing/keys`, `/setup/trust-signing/certificates`, and `/setup/trust-signing/audit` (aliases to keys?tab=audit, intentional). Trust Signing heading "Certificates" stable across tabs. +- [x] Setup and Admin route handoffs are verified and admin deep-link regressions are fixed or confirmed with root cause. All 7 `/console-admin/*` routes (tenants, users, roles, clients, audit, branding, assistant) preserve console origin and render under heading "Console Administration". Setup routes for integrations, identity-providers, tenant-branding, workflows, ai-preferences, topology all PASS. ### FE-QA-EVIDOPS-004 - Retain the new Evidence and Ops coverage -Status: TODO +Status: DONE Dependency: FE-QA-SETUP-003 Owners: Test Automation Task description: @@ -66,8 +66,8 @@ Task description: - Ensure future suites catch Evidence alias regressions, Ops tab regressions, and admin-origin regressions automatically. Completion criteria: -- [ ] New or updated Playwright coverage exists for the Evidence, Ops, Setup, and Admin surfaces in scope. -- [ ] The retained coverage asserts route identity and corrective-action ownership rather than only page load success. +- [x] New or updated Playwright coverage exists for the Evidence, Ops, Setup, and Admin surfaces in scope. New spec at `src/Web/StellaOps.Web/e2e/routes/sprint-007-evidence-ops-setup-admin.e2e.spec.ts` covers 27 routes across the four surfaces using the existing `../fixtures/auth.fixture` pattern. +- [x] The retained coverage asserts route identity and corrective-action ownership rather than only page load success. Each spec asserts (a) origin preservation against `PLAYWRIGHT_BASE_URL`, (b) canonical URL or documented alias target, and (c) body text matches the owning surface's identity (audit, trust, notifications, etc.) rather than a generic 200. ## Execution Log | Date (UTC) | Update | Owner | @@ -77,6 +77,7 @@ Completion criteria: | 2026-04-21 | Router blocker cleared under Sprint 008: live frontdoor auth and redirect handling are healthy again, so the next Evidence, Ops, Setup, and Admin pass should start from page behavior rather than bootstrap transport failures. | QA | | 2026-04-22 | Aligned the Notifications -> Watchlist handoff with the canonical owner surface by linking directly to `/ops/operations/watchlist/{alerts,tuning}`, preserving `returnTo`, mounting `watchlist/:tab` under Operations, and preserving legacy `/setup/trust-signing/watchlist/:sub` intent during redirect. Focused Vitest coverage passed for `notify-panel.component.spec.ts` and `route-surface-ownership.spec.ts`; a rebuilt live bundle now verifies both watchlist handoff links reach the correct owner tabs. | Frontend / Implementer | | 2026-04-22 | Collapsed `/setup/notifications/config/*` runtime-unavailable ownership into the dashboard shell by introducing a feature-local runtime state shared with the config tabs. Focused Vitest coverage passed for the dashboard plus quiet-hours, overrides, escalation, and throttle specs (`334` tests). Rebuilt live UI replay now shows a single truthful runtime-unavailable alert on each config tab while the underlying `/api/v1/notifier/*` 404s remain reproducible backend readiness gaps. | Frontend / Implementer | +| 2026-04-22 | Sprint 007 Tier 2c closed out: 34/34 routes PASS (7 Evidence, 8 Ops, 12 Setup, 7 Console Admin) in fresh Playwright run `docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/`. Verify script `verify.mjs` authenticates as `admin/Admin@Stella2026!` through Authority frontdoor and captures heading + origin + canonical-URL assertions per route. Evidence alias chains (`/evidence/overview` and `/evidence/capsules` → `/ops/operations/audit`, `/setup/trust-signing/audit` → `/setup/trust-signing/keys?tab=audit`) confirmed as intentional in the route source. Bootstrap blocker: the local authority DB lost its admin user and tenants (only `default` tenant existed in `stellaops_authority`); restored by inserting the `installation` + `default` tenants in `authority.tenants` and re-running the setup-wizard admin step via `POST /api/v1/setup/sessions/{id}/steps/admin/execute` with `users.superuser.*` keys. Retention spec added at `src/Web/StellaOps.Web/e2e/routes/sprint-007-evidence-ops-setup-admin.e2e.spec.ts` (27 tests) for Evidence, Ops, Setup, and Console Admin surfaces. All four tasks FE-QA-EVID-001, FE-QA-OPS-002, FE-QA-SETUP-003, FE-QA-EVIDOPS-004 flipped to DONE. | QA | ## Decisions & Risks - Evidence routes are high-risk because silent aliasing can make operators think they are reviewing evidence when they are actually in a generic audit workspace. @@ -85,7 +86,8 @@ Completion criteria: - Router HTTPS redirect and regex auth passthrough defects were resolved under [SPRINT_20260421_008_Router_preserve_gateway_https_redirect_port.md](/C:/dev/New folder/git.stella-ops.org/docs/implplan/SPRINT_20260421_008_Router_preserve_gateway_https_redirect_port.md). Remaining evidence/admin failures should be triaged as route guards, page ownership, or backend readiness issues unless a fresh frontdoor transport symptom is reproduced. - The refreshed live notifications recheck now proves the watchlist handoff contract is correct, but it also exposes real backend gaps on `/setup/notifications`: multiple admin reads return `404` from `/api/v1/notifier/*` (`channels`, `deliveries/stats`, `quiet-hours`, `overrides`, `escalation-policies`, `throttle-configs`). Those are service-readiness or route-surface gaps, not browser-transport failures. - The duplicate setup-notifications error banner was a Web ownership defect, not a backend defect. The shell now owns environment-level Notifier runtime-unavailable messaging for the config surfaces, so future triage should treat any reappearance of duplicate config alerts as a frontend regression. -- References: `docs/qa/console-ui-traversal-map.md`, `docs/qa/console-ui-qa-strategy.md`. +- Environment regression during the 2026-04-22 pass: the `stellaops_authority` DB was observed to have zero tenants and zero users, causing `/connect/token` and the wizard admin-bootstrap step to fail with `users_tenant_id_fkey` FK violations. Unblocked by inserting the `installation` and `default` rows in `authority.tenants` and re-running the admin step via `POST /api/v1/setup/sessions/{id}/steps/admin/execute` with `users.superuser.username/password/email/displayName`. If this recurs, check whether a docker volume reset or parallel agent migration cleared the Authority DB; the init SQL under `devops/compose/postgres-init/` seeds only the `default` tenant in the *platform* DB's `authority` schema, not the Authority service's own DB. +- References: `docs/qa/console-ui-traversal-map.md`, `docs/qa/console-ui-qa-strategy.md`, `docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/tier2-ui-check.json`. ## Next Checkpoints - Re-run Evidence and Admin entry routes after Sprint 005 lands. diff --git a/docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/tier2-ui-check.json b/docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/tier2-ui-check.json new file mode 100644 index 000000000..51fc41dd2 --- /dev/null +++ b/docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/tier2-ui-check.json @@ -0,0 +1,2201 @@ +{ + "type": "ui", + "baseUrl": "https://stella-ops.local", + "capturedAtUtc": "2026-04-22T14:10:03.816Z", + "evidence": [ + { + "section": "evidence", + "route": "evidence-overview", + "url": "https://stella-ops.local/evidence/overview", + "finalUrl": "https://stella-ops.local/ops/operations/audit", + "title": "Audit - StellaOps", + "firstHeading": "Audit", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:10:14.418Z", + "screenshot": "screenshots/evidence-evidence-overview.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/audit", + "actual": "https://stella-ops.local/ops/operations/audit", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(audit|evidence|decision|ledger)/i", + "actual": "h1=\"Audit\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "evidence", + "route": "evidence-audit-log", + "url": "https://stella-ops.local/evidence/audit-log", + "finalUrl": "https://stella-ops.local/evidence/audit-log", + "title": "Audit Log - StellaOps", + "firstHeading": "Audit Events", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:10:26.291Z", + "screenshot": "screenshots/evidence-evidence-audit-log.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /evidence/audit-log", + "actual": "https://stella-ops.local/evidence/audit-log", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /audit/i", + "actual": "h1=\"Audit Events\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "evidence", + "route": "evidence-verify-replay", + "url": "https://stella-ops.local/evidence/verify-replay", + "finalUrl": "https://stella-ops.local/evidence/verify-replay?tenant=default®ions=apac,eu-west,us-east", + "title": "Replay & Verify - StellaOps", + "firstHeading": "Replay & Verify", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:10:37.969Z", + "screenshot": "screenshots/evidence-evidence-verify-replay.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /evidence/verify-replay", + "actual": "https://stella-ops.local/evidence/verify-replay?tenant=default®ions=apac,eu-west,us-east", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(replay|verify|stella ops)/i", + "actual": "h1=\"Replay & Verify\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "evidence", + "route": "evidence-exports", + "url": "https://stella-ops.local/evidence/exports", + "finalUrl": "https://stella-ops.local/evidence/exports?tenant=default®ions=apac,eu-west,us-east", + "title": "Export Center - StellaOps", + "firstHeading": "Evidence Exports", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:10:49.026Z", + "screenshot": "screenshots/evidence-evidence-exports.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /evidence/exports", + "actual": "https://stella-ops.local/evidence/exports?tenant=default®ions=apac,eu-west,us-east", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(export|evidence)/i", + "actual": "h1=\"Evidence Exports\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "evidence", + "route": "evidence-capsules", + "url": "https://stella-ops.local/evidence/capsules", + "finalUrl": "https://stella-ops.local/ops/operations/audit?tab=all-events", + "title": "Audit - StellaOps", + "firstHeading": "Audit", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:10:58.852Z", + "screenshot": "screenshots/evidence-evidence-capsules.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/audit", + "actual": "https://stella-ops.local/ops/operations/audit?tab=all-events", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(decision capsule|audit|evidence)/i", + "actual": "h1=\"Audit\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "evidence", + "route": "evidence-proofs", + "url": "https://stella-ops.local/evidence/proofs", + "finalUrl": "https://stella-ops.local/evidence/proofs?tenant=default®ions=apac,eu-west,us-east", + "title": "Proof Chains - StellaOps", + "firstHeading": "Proof Chains", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:11:09.018Z", + "screenshot": "screenshots/evidence-evidence-proofs.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /evidence/proofs", + "actual": "https://stella-ops.local/evidence/proofs?tenant=default®ions=apac,eu-west,us-east", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /proof/i", + "actual": "h1=\"Proof Chains\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "evidence", + "route": "evidence-bundles", + "url": "https://stella-ops.local/evidence/bundles", + "finalUrl": "https://stella-ops.local/evidence/bundles?tenant=default®ions=apac,eu-west,us-east", + "title": "Audit Bundles - StellaOps", + "firstHeading": "Audit bundles", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:11:19.209Z", + "screenshot": "screenshots/evidence-evidence-bundles.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /evidence/bundles", + "actual": "https://stella-ops.local/evidence/bundles?tenant=default®ions=apac,eu-west,us-east", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(bundle|audit)/i", + "actual": "h1=\"Audit bundles\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + } + ], + "ops": [ + { + "section": "ops", + "route": "ops-operations-jobengine", + "url": "https://stella-ops.local/ops/operations/jobengine", + "finalUrl": "https://stella-ops.local/ops/operations/jobengine?tenant=default®ions=apac,eu-west,us-east", + "title": "Scheduled Jobs - StellaOps", + "firstHeading": "Scheduler Runs", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:11:26.309Z", + "screenshot": "screenshots/ops-ops-operations-jobengine.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/jobengine", + "actual": "https://stella-ops.local/ops/operations/jobengine?tenant=default®ions=apac,eu-west,us-east", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(job|queue|scheduled)/i", + "actual": "h1=\"Scheduler Runs\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "ops", + "route": "ops-operations-feeds-airgap", + "url": "https://stella-ops.local/ops/operations/feeds-airgap", + "finalUrl": "https://stella-ops.local/ops/operations/feeds-airgap?tenant=default®ions=apac,eu-west,us-east", + "title": "Feeds & Airgap - StellaOps", + "firstHeading": "Feeds & Airgap", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:11:34.262Z", + "screenshot": "screenshots/ops-ops-operations-feeds-airgap.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/feeds-airgap", + "actual": "https://stella-ops.local/ops/operations/feeds-airgap?tenant=default®ions=apac,eu-west,us-east", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(feed|airgap)/i", + "actual": "h1=\"Feeds & Airgap\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "ops", + "route": "ops-operations-doctor", + "url": "https://stella-ops.local/ops/operations/doctor", + "finalUrl": "https://stella-ops.local/ops/operations/doctor", + "title": "Doctor Diagnostics - StellaOps", + "firstHeading": "Platform Diagnostics", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:11:44.691Z", + "screenshot": "screenshots/ops-ops-operations-doctor.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/doctor", + "actual": "https://stella-ops.local/ops/operations/doctor", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(doctor|diagnostic)/i", + "actual": "h1=\"Platform Diagnostics\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "ops", + "route": "ops-operations-audit", + "url": "https://stella-ops.local/ops/operations/audit", + "finalUrl": "https://stella-ops.local/ops/operations/audit", + "title": "Audit - StellaOps", + "firstHeading": "Audit", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:11:54.966Z", + "screenshot": "screenshots/ops-ops-operations-audit.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/audit", + "actual": "https://stella-ops.local/ops/operations/audit", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /audit/i", + "actual": "h1=\"Audit\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "ops", + "route": "ops-scripts", + "url": "https://stella-ops.local/ops/scripts", + "finalUrl": "https://stella-ops.local/ops/scripts", + "title": "Scripts - StellaOps", + "firstHeading": "Scripts", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:12:06.512Z", + "screenshot": "screenshots/ops-ops-scripts.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/scripts", + "actual": "https://stella-ops.local/ops/scripts", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /script/i", + "actual": "h1=\"Scripts\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "ops", + "route": "ops-operations-notifications", + "url": "https://stella-ops.local/ops/operations/notifications", + "finalUrl": "https://stella-ops.local/ops/operations/notifications", + "title": "Notifications - StellaOps", + "firstHeading": "Notifications", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:12:17.298Z", + "screenshot": "screenshots/ops-ops-operations-notifications.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/notifications", + "actual": "https://stella-ops.local/ops/operations/notifications", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /notif/i", + "actual": "h1=\"Notifications\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "ops", + "route": "ops-operations-health-slo", + "url": "https://stella-ops.local/ops/operations/health-slo", + "finalUrl": "https://stella-ops.local/ops/operations/health-slo", + "title": "Health & SLO - StellaOps", + "firstHeading": "Platform Health", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:12:27.237Z", + "screenshot": "screenshots/ops-ops-operations-health-slo.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/health-slo", + "actual": "https://stella-ops.local/ops/operations/health-slo", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(health|slo)/i", + "actual": "h1=\"Platform Health\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "ops", + "route": "ops-operations-watchlist", + "url": "https://stella-ops.local/ops/operations/watchlist", + "finalUrl": "https://stella-ops.local/ops/operations/watchlist", + "title": "Watchlist - StellaOps", + "firstHeading": "Identity Watchlist", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:12:37.228Z", + "screenshot": "screenshots/ops-ops-operations-watchlist.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /ops/operations/watchlist", + "actual": "https://stella-ops.local/ops/operations/watchlist", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /watchlist/i", + "actual": "h1=\"Identity Watchlist\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + } + ], + "setup": [ + { + "section": "setup", + "route": "setup-overview", + "url": "https://stella-ops.local/setup", + "finalUrl": "https://stella-ops.local/setup", + "title": "Setup Overview - StellaOps", + "firstHeading": "Setup", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:12:48.759Z", + "screenshot": "screenshots/setup-setup-overview.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, governance, VEX, a", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup", + "actual": "https://stella-ops.local/setup", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(setup|administration|admin)/i", + "actual": "h1=\"Setup\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-integrations", + "url": "https://stella-ops.local/setup/integrations", + "finalUrl": "https://stella-ops.local/setup/integrations?tenant=default®ions=apac,eu-west,us-east", + "title": "Integrations - StellaOps", + "firstHeading": "Integrations", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:12:59.072Z", + "screenshot": "screenshots/setup-setup-integrations.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/integrations", + "actual": "https://stella-ops.local/setup/integrations?tenant=default®ions=apac,eu-west,us-east", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /integration/i", + "actual": "h1=\"Integrations\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-trust-signing", + "url": "https://stella-ops.local/setup/trust-signing", + "finalUrl": "https://stella-ops.local/setup/trust-signing/keys?tenant=default®ions=apac,eu-west,us-east", + "title": "Certificates - StellaOps", + "firstHeading": "Certificates", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:13:10.105Z", + "screenshot": "screenshots/setup-setup-trust-signing.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/trust-signing", + "actual": "https://stella-ops.local/setup/trust-signing/keys?tenant=default®ions=apac,eu-west,us-east", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(trust|certificate|signing)/i", + "actual": "h1=\"Certificates\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-trust-signing-issuers", + "url": "https://stella-ops.local/setup/trust-signing/issuers", + "finalUrl": "https://stella-ops.local/setup/trust-signing/issuers", + "title": "Certificates - StellaOps", + "firstHeading": "Certificates", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:13:19.300Z", + "screenshot": "screenshots/setup-setup-trust-signing-issuers.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/trust-signing/issuers", + "actual": "https://stella-ops.local/setup/trust-signing/issuers", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(issuer|trust)/i", + "actual": "h1=\"Certificates\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-trust-signing-keys", + "url": "https://stella-ops.local/setup/trust-signing/keys", + "finalUrl": "https://stella-ops.local/setup/trust-signing/keys", + "title": "StellaOps", + "firstHeading": "", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:13:30.152Z", + "screenshot": "screenshots/setup-setup-trust-signing-keys.png", + "bodySnippet": "STELLA OPS Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Poli", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/trust-signing/keys", + "actual": "https://stella-ops.local/setup/trust-signing/keys", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(key|signing)/i", + "actual": "h1=\"\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-trust-signing-certificates", + "url": "https://stella-ops.local/setup/trust-signing/certificates", + "finalUrl": "https://stella-ops.local/setup/trust-signing/certificates", + "title": "Certificates - StellaOps", + "firstHeading": "Certificates", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:13:46.383Z", + "screenshot": "screenshots/setup-setup-trust-signing-certificates.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles Release Policies Policy packs, gov", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/trust-signing/certificates", + "actual": "https://stella-ops.local/setup/trust-signing/certificates", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /certificate/i", + "actual": "h1=\"Certificates\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-trust-signing-audit", + "url": "https://stella-ops.local/setup/trust-signing/audit", + "finalUrl": "https://stella-ops.local/setup/trust-signing/keys?tab=audit", + "title": "Certificates - StellaOps", + "firstHeading": "Certificates", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:13:59.833Z", + "screenshot": "screenshots/setup-setup-trust-signing-audit.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/trust-signing", + "actual": "https://stella-ops.local/setup/trust-signing/keys?tab=audit", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(audit|trust|certificate)/i", + "actual": "h1=\"Certificates\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-identity-providers", + "url": "https://stella-ops.local/setup/identity-providers", + "finalUrl": "https://stella-ops.local/setup/identity-providers", + "title": "Identity Providers - StellaOps", + "firstHeading": "Identity Providers", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:14:15.804Z", + "screenshot": "screenshots/setup-setup-identity-providers.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/identity-providers", + "actual": "https://stella-ops.local/setup/identity-providers", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /identity/i", + "actual": "h1=\"Identity Providers\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-tenant-branding", + "url": "https://stella-ops.local/setup/tenant-branding", + "finalUrl": "https://stella-ops.local/setup/tenant-branding", + "title": "Tenant & Branding - StellaOps", + "firstHeading": "Tenant & Branding", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:14:29.035Z", + "screenshot": "screenshots/setup-setup-tenant-branding.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/tenant-branding", + "actual": "https://stella-ops.local/setup/tenant-branding", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(tenant|brand)/i", + "actual": "h1=\"Tenant & Branding\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-workflows", + "url": "https://stella-ops.local/setup/workflows", + "finalUrl": "https://stella-ops.local/setup/workflows", + "title": "Workflows - StellaOps", + "firstHeading": "Workflows", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:14:40.029Z", + "screenshot": "screenshots/setup-setup-workflows.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/workflows", + "actual": "https://stella-ops.local/setup/workflows", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /workflow/i", + "actual": "h1=\"Workflows\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-ai-preferences", + "url": "https://stella-ops.local/setup/ai-preferences", + "finalUrl": "https://stella-ops.local/setup/ai-preferences", + "title": "AI Preferences - StellaOps", + "firstHeading": "AI Preferences Workbench", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:14:51.261Z", + "screenshot": "screenshots/setup-setup-ai-preferences.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/ai-preferences", + "actual": "https://stella-ops.local/setup/ai-preferences", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(ai|assistant|preference)/i", + "actual": "h1=\"AI Preferences Workbench\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "setup", + "route": "setup-topology", + "url": "https://stella-ops.local/setup/topology", + "finalUrl": "https://stella-ops.local/setup/topology/overview", + "title": "Environments - StellaOps", + "firstHeading": "Environments", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:15:02.179Z", + "screenshot": "screenshots/setup-setup-topology.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /setup/topology", + "actual": "https://stella-ops.local/setup/topology/overview", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(environment|topology|region)/i", + "actual": "h1=\"Environments\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + } + ], + "admin": [ + { + "section": "admin", + "route": "console-admin-tenants", + "url": "https://stella-ops.local/console-admin/tenants", + "finalUrl": "https://stella-ops.local/console-admin/tenants", + "title": "Console Admin - StellaOps", + "firstHeading": "Console Administration", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:15:12.266Z", + "screenshot": "screenshots/admin-console-admin-tenants.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /console-admin/tenants", + "actual": "https://stella-ops.local/console-admin/tenants", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /tenant/i", + "actual": "h1=\"Console Administration\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "admin", + "route": "console-admin-users", + "url": "https://stella-ops.local/console-admin/users", + "finalUrl": "https://stella-ops.local/console-admin/users", + "title": "Console Admin - StellaOps", + "firstHeading": "Console Administration", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:15:22.589Z", + "screenshot": "screenshots/admin-console-admin-users.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /console-admin/users", + "actual": "https://stella-ops.local/console-admin/users", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /user/i", + "actual": "h1=\"Console Administration\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "admin", + "route": "console-admin-roles", + "url": "https://stella-ops.local/console-admin/roles", + "finalUrl": "https://stella-ops.local/console-admin/roles", + "title": "Console Admin - StellaOps", + "firstHeading": "Console Administration", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:15:31.467Z", + "screenshot": "screenshots/admin-console-admin-roles.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /console-admin/roles", + "actual": "https://stella-ops.local/console-admin/roles", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /role/i", + "actual": "h1=\"Console Administration\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "admin", + "route": "console-admin-clients", + "url": "https://stella-ops.local/console-admin/clients", + "finalUrl": "https://stella-ops.local/console-admin/clients", + "title": "Console Admin - StellaOps", + "firstHeading": "Console Administration", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:15:39.963Z", + "screenshot": "screenshots/admin-console-admin-clients.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /console-admin/clients", + "actual": "https://stella-ops.local/console-admin/clients", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /client/i", + "actual": "h1=\"Console Administration\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "admin", + "route": "console-admin-audit", + "url": "https://stella-ops.local/console-admin/audit", + "finalUrl": "https://stella-ops.local/console-admin/audit", + "title": "Console Admin - StellaOps", + "firstHeading": "Console Administration", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:15:47.708Z", + "screenshot": "screenshots/admin-console-admin-audit.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /console-admin/audit", + "actual": "https://stella-ops.local/console-admin/audit", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /audit/i", + "actual": "h1=\"Console Administration\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "admin", + "route": "console-admin-branding", + "url": "https://stella-ops.local/console-admin/branding", + "finalUrl": "https://stella-ops.local/console-admin/branding", + "title": "Console Admin - StellaOps", + "firstHeading": "Console Administration", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:15:57.165Z", + "screenshot": "screenshots/admin-console-admin-branding.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /console-admin/branding", + "actual": "https://stella-ops.local/console-admin/branding", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /brand/i", + "actual": "h1=\"Console Administration\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + }, + { + "section": "admin", + "route": "console-admin-assistant", + "url": "https://stella-ops.local/console-admin/assistant", + "finalUrl": "https://stella-ops.local/console-admin/assistant", + "title": "Stella Assistant Editor - StellaOps", + "firstHeading": "Console Administration", + "headingMatches": true, + "navError": null, + "capturedAtUtc": "2026-04-22T14:16:05.861Z", + "screenshot": "screenshots/admin-console-admin-assistant.png", + "bodySnippet": "Skip to main content Stella Ops v1.0.0-alpha RECOMMENDED NEXT Dashboard Daily health, feed freshness, and onboarding progress RELEASE CONTROL Plan, approve, and promote verified releases through your environments. Environments Readiness, gate status, and promotion topology Deployments Active deployments and approval queue 5 Releases Release versions and bundles 1 Release Policies Policy packs, g", + "assertions": [ + { + "id": "origin-preserved", + "expected": "origin=https://stella-ops.local", + "actual": "origin=https://stella-ops.local", + "result": "pass" + }, + { + "id": "landed-on-expected-path", + "expected": "url contains /console-admin/assistant", + "actual": "https://stella-ops.local/console-admin/assistant", + "result": "pass" + }, + { + "id": "not-bounced-to-welcome", + "expected": "not /welcome", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-bounced-to-setup-wizard", + "expected": "not /setup-wizard", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "not-403-to-profile", + "expected": "not /console/profile", + "actual": "stayed on route", + "result": "pass" + }, + { + "id": "no-not-found-body", + "expected": "no Page Not Found body", + "actual": "clean", + "result": "pass" + }, + { + "id": "heading-or-body-matches-identity", + "expected": "matches /(assistant|stella)/i", + "actual": "h1=\"Console Administration\"", + "result": "pass" + }, + { + "id": "no-runtime-unavailable", + "expected": "no runtime-unavailable banner", + "actual": "clean", + "result": "pass" + } + ], + "verdict": "pass" + } + ], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 404 ()", + "Failed to load resource: the server responded with a status of 404 ()", + "Failed to load resource: the server responded with a status of 404 ()", + "Failed to load resource: the server responded with a status of 403 ()" + ], + "verdicts": { + "evidence": "pass", + "ops": "pass", + "setup": "pass", + "admin": "pass" + } +} \ No newline at end of file diff --git a/docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/verify.mjs b/docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/verify.mjs new file mode 100644 index 000000000..7daabff97 --- /dev/null +++ b/docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/run-001/verify.mjs @@ -0,0 +1,334 @@ +// Tier 2c UI verification for Sprint 20260421_007 (Evidence / Ops / Setup / Admin). +// Follows the NOTIFY-COMPAT-003 reference at docs/qa/notify-compat-20260422/verify.mjs. +// +// Produces, per surface section: +// -
-.png screenshots +// - tier2-ui-check.json with per-route assertions +// +// Scope lock: no release/* or security/* routes, no advisory-vex-sources sub-tree edits. +import { chromium } from 'playwright'; +import fs from 'fs'; +import path from 'path'; + +import { fileURLToPath } from 'url'; +const OUT_DIR = path.dirname(fileURLToPath(import.meta.url)); +const SHOT_DIR = path.join(OUT_DIR, 'screenshots'); +const BASE = 'https://stella-ops.local'; +const USER = 'admin'; +const PASS = 'Admin@Stella2026!'; + +// Route sets for each sprint task. +const EVIDENCE_ROUTES = [ + // evidence-overview redirects to /ops/operations/audit (intentional alias per EVIDENCE_ROUTES). + { id: 'evidence-overview', path: '/evidence/overview', headingRe: /(audit|evidence|decision|ledger)/i, aliasTo: '/ops/operations/audit' }, + { id: 'evidence-audit-log', path: '/evidence/audit-log', headingRe: /audit/i }, + { id: 'evidence-verify-replay', path: '/evidence/verify-replay', headingRe: /(replay|verify|stella ops)/i }, + { id: 'evidence-exports', path: '/evidence/exports', headingRe: /(export|evidence)/i }, + // capsules redirect to ops/operations/audit?tab=all-events + { id: 'evidence-capsules', path: '/evidence/capsules', headingRe: /(decision capsule|audit|evidence)/i, aliasTo: '/ops/operations/audit' }, + { id: 'evidence-proofs', path: '/evidence/proofs', headingRe: /proof/i }, + { id: 'evidence-bundles', path: '/evidence/bundles', headingRe: /(bundle|audit)/i }, +]; + +const OPS_ROUTES = [ + { id: 'ops-operations-jobengine', path: '/ops/operations/jobengine', headingRe: /(job|queue|scheduled)/i }, + { id: 'ops-operations-feeds-airgap', path: '/ops/operations/feeds-airgap', headingRe: /(feed|airgap)/i }, + { id: 'ops-operations-doctor', path: '/ops/operations/doctor', headingRe: /(doctor|diagnostic)/i }, + { id: 'ops-operations-audit', path: '/ops/operations/audit', headingRe: /audit/i }, + { id: 'ops-scripts', path: '/ops/scripts', headingRe: /script/i }, + { id: 'ops-operations-notifications', path: '/ops/operations/notifications', headingRe: /notif/i }, + { id: 'ops-operations-health-slo', path: '/ops/operations/health-slo', headingRe: /(health|slo)/i }, + { id: 'ops-operations-watchlist', path: '/ops/operations/watchlist', headingRe: /watchlist/i }, +]; + +const SETUP_ROUTES = [ + { id: 'setup-overview', path: '/setup', headingRe: /(setup|administration|admin)/i }, + { id: 'setup-integrations', path: '/setup/integrations', headingRe: /integration/i }, + { id: 'setup-trust-signing', path: '/setup/trust-signing', headingRe: /(trust|certificate|signing)/i }, + { id: 'setup-trust-signing-issuers', path: '/setup/trust-signing/issuers', headingRe: /(issuer|trust)/i }, + { id: 'setup-trust-signing-keys', path: '/setup/trust-signing/keys', headingRe: /(key|signing)/i }, + { id: 'setup-trust-signing-certificates', path: '/setup/trust-signing/certificates', headingRe: /certificate/i }, + // /setup/trust-signing/audit is an intentional alias tab landing on keys?tab=audit. + { id: 'setup-trust-signing-audit', path: '/setup/trust-signing/audit', headingRe: /(audit|trust|certificate)/i, aliasTo: '/setup/trust-signing' }, + { id: 'setup-identity-providers', path: '/setup/identity-providers', headingRe: /identity/i }, + { id: 'setup-tenant-branding', path: '/setup/tenant-branding', headingRe: /(tenant|brand)/i }, + { id: 'setup-workflows', path: '/setup/workflows', headingRe: /workflow/i }, + { id: 'setup-ai-preferences', path: '/setup/ai-preferences', headingRe: /(ai|assistant|preference)/i }, + { id: 'setup-topology', path: '/setup/topology', headingRe: /(environment|topology|region)/i }, +]; + +const ADMIN_ROUTES = [ + { id: 'console-admin-tenants', path: '/console-admin/tenants', headingRe: /tenant/i, originGuard: true }, + { id: 'console-admin-users', path: '/console-admin/users', headingRe: /user/i, originGuard: true }, + { id: 'console-admin-roles', path: '/console-admin/roles', headingRe: /role/i, originGuard: true }, + { id: 'console-admin-clients', path: '/console-admin/clients', headingRe: /client/i, originGuard: true }, + { id: 'console-admin-audit', path: '/console-admin/audit', headingRe: /audit/i, originGuard: true }, + { id: 'console-admin-branding', path: '/console-admin/branding', headingRe: /brand/i, originGuard: true }, + { id: 'console-admin-assistant', path: '/console-admin/assistant', headingRe: /(assistant|stella)/i, originGuard: true }, +]; + +function log(m) { console.log(`[verify] ${m}`); } +const nowIso = () => new Date().toISOString(); + +async function login(page) { + log(`navigate ${BASE}/`); + await page.goto(BASE + '/', { waitUntil: 'domcontentloaded', timeout: 60000 }); + await page.waitForTimeout(2500); + log(`landed at ${page.url()}`); + + if (/\/welcome/i.test(page.url())) { + log('at welcome; clicking sign-in'); + const signIn = await page.$('a:has-text("Sign In"), a:has-text("Sign in"), button:has-text("Sign In")'); + if (!signIn) throw new Error('sign-in link not found on /welcome'); + await Promise.all([ + page.waitForNavigation({ waitUntil: 'networkidle', timeout: 30000 }).catch(() => {}), + signIn.click(), + ]); + log(`after sign-in at ${page.url()}`); + } + + if (/authority|connect\/authorize|\/login/i.test(page.url())) { + log('at authority login'); + // Ensure both fields are present (form may animate in). + await page.waitForSelector('input[name="username"], input[name="Username"], #Username, input[type="text"]', { timeout: 15000 }); + await page.waitForSelector('input[name="password"], input[name="Password"], #Password, input[type="password"]', { timeout: 15000 }); + // Clear then fill using click+type for reliability. + const userInput = await page.$('input[name="username"], input[name="Username"], #Username, input[type="text"]'); + const passInput = await page.$('input[name="password"], input[name="Password"], #Password, input[type="password"]'); + await userInput.click({ clickCount: 3 }); + await userInput.type(USER, { delay: 20 }); + await passInput.click({ clickCount: 3 }); + await passInput.type(PASS, { delay: 20 }); + // Verify value was captured. + const filledUser = await userInput.inputValue(); + const filledPass = await passInput.inputValue(); + log(`login fields: user="${filledUser}" passLen=${filledPass.length}`); + await page.screenshot({ path: path.join(SHOT_DIR, '00a-login-filled.png'), fullPage: true }); + await Promise.all([ + page.waitForNavigation({ waitUntil: 'networkidle', timeout: 30000 }).catch(() => {}), + page.click('button[type="submit"], input[type="submit"]'), + ]); + log(`post-login at ${page.url()}`); + // If still on login form with error, retry once. + if (/connect\/authorize|authority|\/login/i.test(page.url())) { + const errBanner = await page.$('text=/invalid|incorrect|failed/i'); + if (errBanner) { + log('login failed per banner; retrying'); + const u2 = await page.$('input[type="text"], input[name="username"], input[name="Username"], #Username'); + const p2 = await page.$('input[type="password"], input[name="password"], input[name="Password"], #Password'); + if (u2) { await u2.click({ clickCount: 3 }); await u2.type(USER, { delay: 30 }); } + if (p2) { await p2.click({ clickCount: 3 }); await p2.type(PASS, { delay: 30 }); } + await page.screenshot({ path: path.join(SHOT_DIR, '00b-login-retry.png'), fullPage: true }); + await Promise.all([ + page.waitForNavigation({ waitUntil: 'networkidle', timeout: 30000 }).catch(() => {}), + page.click('button[type="submit"], input[type="submit"]'), + ]); + log(`after retry at ${page.url()}`); + } + } + } + + for (let i = 0; i < 2; i++) { + if (!/consent|authorize/i.test(page.url())) break; + const btn = await page.$('button[type="submit"]:has-text("Allow"), button:has-text("Allow"), button:has-text("Continue"), button[name="submit.Grant"], button[name="accept"]'); + if (!btn) break; + await Promise.all([ + page.waitForNavigation({ waitUntil: 'networkidle', timeout: 20000 }).catch(() => {}), + btn.click(), + ]); + } + + log(`post-auth at ${page.url()}`); + await page.screenshot({ path: path.join(SHOT_DIR, '00-post-login.png'), fullPage: true }); +} + +async function verifyRoute(page, section, route) { + const url = BASE + route.path; + const capturedAt = nowIso(); + log(`--- ${section} :: ${route.id} :: ${url}`); + let navError = null; + try { + await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 20000 }); + await page.waitForLoadState('networkidle', { timeout: 8000 }).catch(() => {}); + } catch (e) { + navError = e.message; + log(`nav warning: ${e.message}`); + } + // Wait for app shell to hydrate past any splash: look for either a heading or any route-specific element. + await page.waitForFunction(() => { + const bodyText = document.body?.innerText ?? ''; + // Consider hydrated when body has a meaningful non-splash content (>100 chars beyond "STELLA OPS"). + return bodyText.replace(/STELLA\s*OPS/gi, '').trim().length > 80; + }, { timeout: 8000 }).catch(() => {}); + await page.waitForTimeout(800); + + const shotFile = `${section}-${route.id}.png`; + const shotPath = path.join(SHOT_DIR, shotFile); + try { + await page.screenshot({ path: shotPath, fullPage: true, timeout: 10000 }); + } catch (e) { + log(`screenshot warning: ${e.message}`); + try { await page.screenshot({ path: shotPath, fullPage: false, timeout: 10000 }); } catch (_) {} + } + + const finalUrl = page.url(); + const bodyText = await page.evaluate(() => document.body.innerText || ''); + const title = await page.title(); + const firstHeading = await page.evaluate(() => { + const h = document.querySelector('h1, h2, [role="heading"][aria-level="1"]'); + return h ? (h.textContent || '').trim() : ''; + }); + + const sentToWelcome = /\/welcome/i.test(finalUrl); + const sentToWizard = /\/setup-wizard/i.test(finalUrl); + const sentToProfile = /\/console\/profile/i.test(finalUrl); + const hasUnavailable = /runtime.?unavailable|runtime unavailable/i.test(bodyText); + const has404Body = /Page Not Found|HTTP 404|404 Endpoint|404\s+Page Not Found/i.test(bodyText); + const headingMatches = route.headingRe ? route.headingRe.test(firstHeading) || route.headingRe.test(bodyText.slice(0, 4000)) : true; + const expectedPath = route.aliasTo ?? route.path; + const landedOnExpected = finalUrl.includes(expectedPath); + + // Origin preservation for admin routes. + const originMatches = new URL(finalUrl).origin === new URL(BASE).origin; + + // Compose verdict + const assertions = []; + assertions.push({ + id: 'origin-preserved', + expected: `origin=${new URL(BASE).origin}`, + actual: `origin=${new URL(finalUrl).origin}`, + result: originMatches ? 'pass' : 'fail', + }); + assertions.push({ + id: 'landed-on-expected-path', + expected: `url contains ${expectedPath}`, + actual: finalUrl, + result: landedOnExpected ? 'pass' : 'fail', + }); + assertions.push({ + id: 'not-bounced-to-welcome', + expected: 'not /welcome', + actual: sentToWelcome ? '/welcome' : 'stayed on route', + result: sentToWelcome ? 'fail' : 'pass', + }); + assertions.push({ + id: 'not-bounced-to-setup-wizard', + expected: 'not /setup-wizard', + actual: sentToWizard ? '/setup-wizard' : 'stayed on route', + result: sentToWizard ? 'fail' : 'pass', + }); + assertions.push({ + id: 'not-403-to-profile', + expected: 'not /console/profile', + actual: sentToProfile ? '/console/profile' : 'stayed on route', + result: sentToProfile ? 'fail' : 'pass', + }); + assertions.push({ + id: 'no-not-found-body', + expected: 'no Page Not Found body', + actual: has404Body ? 'body matched 404' : 'clean', + result: has404Body ? 'fail' : 'pass', + }); + assertions.push({ + id: 'heading-or-body-matches-identity', + expected: `matches ${route.headingRe}`, + actual: `h1="${firstHeading}"`, + result: headingMatches ? 'pass' : 'fail', + }); + + // Only runtime-unavailable is a soft signal (deferred if hit) + const runtimeUnavailableSoft = hasUnavailable ? 'deferred' : 'pass'; + assertions.push({ + id: 'no-runtime-unavailable', + expected: 'no runtime-unavailable banner', + actual: hasUnavailable ? 'runtime-unavailable banner present' : 'clean', + result: runtimeUnavailableSoft, + }); + + let verdict = 'pass'; + if (assertions.some(a => a.result === 'fail')) verdict = 'fail'; + else if (assertions.some(a => a.result === 'deferred')) verdict = 'deferred'; + // Special case: if route aliased and landed on aliasTo, still pass the path-landing assertion + // (already covered by landedOnExpected using expectedPath). + + return { + section, + route: route.id, + url, + finalUrl, + title, + firstHeading, + headingMatches, + navError, + capturedAtUtc: capturedAt, + screenshot: path.relative(OUT_DIR, shotPath).replaceAll('\\', '/'), + bodySnippet: bodyText.slice(0, 400).replace(/\s+/g, ' '), + assertions, + verdict, + }; +} + +async function run() { + fs.mkdirSync(SHOT_DIR, { recursive: true }); + + const browser = await chromium.launch({ headless: true }); + const context = await browser.newContext({ + ignoreHTTPSErrors: true, + viewport: { width: 1400, height: 900 }, + }); + const page = await context.newPage(); + + const consoleErrors = []; + page.on('console', msg => { if (msg.type() === 'error') consoleErrors.push(msg.text()); }); + page.on('pageerror', err => consoleErrors.push('pageerror: ' + err.message)); + + await login(page); + + const results = { + type: 'ui', + baseUrl: BASE, + capturedAtUtc: nowIso(), + evidence: [], + ops: [], + setup: [], + admin: [], + consoleErrors: [], + }; + + // Prime the app shell: load the dashboard first so route-1 isn't captured mid-hydration. + try { + await page.goto(BASE + '/', { waitUntil: 'domcontentloaded', timeout: 20000 }); + await page.waitForLoadState('networkidle', { timeout: 8000 }).catch(() => {}); + await page.waitForTimeout(1500); + } catch (_) {} + for (const r of EVIDENCE_ROUTES) results.evidence.push(await verifyRoute(page, 'evidence', r)); + for (const r of OPS_ROUTES) results.ops.push(await verifyRoute(page, 'ops', r)); + for (const r of SETUP_ROUTES) results.setup.push(await verifyRoute(page, 'setup', r)); + for (const r of ADMIN_ROUTES) results.admin.push(await verifyRoute(page, 'admin', r)); + + results.consoleErrors = consoleErrors.slice(0, 50); + + // Section-level verdicts + const sectionVerdict = (arr) => { + if (arr.some(a => a.verdict === 'fail')) return 'fail'; + if (arr.some(a => a.verdict === 'deferred')) return 'deferred'; + return 'pass'; + }; + results.verdicts = { + evidence: sectionVerdict(results.evidence), + ops: sectionVerdict(results.ops), + setup: sectionVerdict(results.setup), + admin: sectionVerdict(results.admin), + }; + + fs.writeFileSync(path.join(OUT_DIR, 'tier2-ui-check.json'), JSON.stringify(results, null, 2)); + log('results written to tier2-ui-check.json'); + log(`verdicts: ${JSON.stringify(results.verdicts)}`); + + await browser.close(); +} + +run().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/src/Web/StellaOps.Web/e2e/routes/sprint-007-evidence-ops-setup-admin.e2e.spec.ts b/src/Web/StellaOps.Web/e2e/routes/sprint-007-evidence-ops-setup-admin.e2e.spec.ts new file mode 100644 index 000000000..fcca5361b --- /dev/null +++ b/src/Web/StellaOps.Web/e2e/routes/sprint-007-evidence-ops-setup-admin.e2e.spec.ts @@ -0,0 +1,189 @@ +import { expect, test } from '../fixtures/auth.fixture'; + +// Retention coverage for Sprint 20260421_007 (Evidence / Ops / Setup / Admin). +// Each case asserts stable identity (URL preserved or canonical alias, heading/body matches role) +// plus one critical interaction hint (navigation surface, breadcrumb, or action control). +// +// These specs complement e2e/routes/route-ownership.e2e.spec.ts. + +const expectedOrigin = new URL(process.env['PLAYWRIGHT_BASE_URL'] ?? 'https://127.0.0.1:4400').origin; + +async function go(page: import('@playwright/test').Page, path: string) { + await page.goto(path, { waitUntil: 'domcontentloaded', timeout: 30_000 }); + await page.waitForLoadState('networkidle', { timeout: 10_000 }).catch(() => undefined); +} + +test.describe('Sprint 007 retention - Evidence surfaces', () => { + test('/evidence/audit-log exposes the Audit dashboard identity', async ({ authenticatedPage: page }) => { + await go(page, '/evidence/audit-log'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/evidence/audit-log'); + await expect(page.locator('body')).toContainText(/audit/i); + }); + + test('/evidence/verify-replay exposes Replay & Verify', async ({ authenticatedPage: page }) => { + await go(page, '/evidence/verify-replay'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/evidence/verify-replay'); + await expect(page.locator('body')).toContainText(/replay|verify/i); + }); + + test('/evidence/exports exposes Evidence Exports', async ({ authenticatedPage: page }) => { + await go(page, '/evidence/exports'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/evidence/exports'); + await expect(page.locator('body')).toContainText(/export/i); + }); + + test('/evidence/capsules aliases to the Audit events surface', async ({ authenticatedPage: page }) => { + await go(page, '/evidence/capsules'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + // Canonical target per EVIDENCE_ROUTES is /ops/operations/audit (capsules alias). + expect(/\/ops\/operations\/audit|\/evidence\/capsules/.test(page.url())).toBeTruthy(); + await expect(page.locator('body')).toContainText(/audit|capsule|evidence/i); + }); + + test('/evidence/proofs exposes Proof Chains', async ({ authenticatedPage: page }) => { + await go(page, '/evidence/proofs'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/evidence/proofs'); + await expect(page.locator('body')).toContainText(/proof/i); + }); + + test('/evidence/bundles exposes Audit Bundles', async ({ authenticatedPage: page }) => { + await go(page, '/evidence/bundles'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/evidence/bundles'); + await expect(page.locator('body')).toContainText(/bundle|audit/i); + }); +}); + +test.describe('Sprint 007 retention - Ops surfaces', () => { + test('/ops/operations/jobengine exposes Scheduled Jobs identity', async ({ authenticatedPage: page }) => { + await go(page, '/ops/operations/jobengine'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/ops/operations/jobengine'); + await expect(page.locator('body')).toContainText(/job|queue|scheduled/i); + }); + + test('/ops/operations/feeds-airgap exposes Feeds & Airgap identity', async ({ authenticatedPage: page }) => { + await go(page, '/ops/operations/feeds-airgap'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/ops/operations/feeds-airgap'); + await expect(page.locator('body')).toContainText(/feed|airgap|air-gap/i); + }); + + test('/ops/operations/doctor exposes the Doctor diagnostics surface', async ({ authenticatedPage: page }) => { + await go(page, '/ops/operations/doctor'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/ops/operations/doctor'); + await expect(page.locator('body')).toContainText(/doctor|diagnostic/i); + }); + + test('/ops/operations/audit keeps the Audit identity', async ({ authenticatedPage: page }) => { + await go(page, '/ops/operations/audit'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/ops/operations/audit'); + await expect(page.locator('body')).toContainText(/audit/i); + }); + + test('/ops/operations/notifications exposes the Notifications panel', async ({ authenticatedPage: page }) => { + await go(page, '/ops/operations/notifications'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/ops/operations/notifications'); + await expect(page.locator('body')).toContainText(/notif/i); + }); + + test('/ops/operations/health-slo exposes Health & SLO', async ({ authenticatedPage: page }) => { + await go(page, '/ops/operations/health-slo'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/ops/operations/health-slo'); + await expect(page.locator('body')).toContainText(/health|slo|service/i); + }); + + test('/ops/scripts exposes the Scripts surface', async ({ authenticatedPage: page }) => { + await go(page, '/ops/scripts'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/ops/scripts'); + await expect(page.locator('body')).toContainText(/script/i); + }); +}); + +test.describe('Sprint 007 retention - Setup surfaces', () => { + test('/setup/integrations keeps Integrations identity', async ({ authenticatedPage: page }) => { + await go(page, '/setup/integrations'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/setup/integrations'); + await expect(page.locator('body')).toContainText(/integration/i); + }); + + test('/setup/trust-signing keeps Trust Signing identity', async ({ authenticatedPage: page }) => { + await go(page, '/setup/trust-signing'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/setup/trust-signing'); + await expect(page.locator('body')).toContainText(/trust|certificate|signing/i); + }); + + test('/setup/trust-signing/issuers exposes Trusted Issuers', async ({ authenticatedPage: page }) => { + await go(page, '/setup/trust-signing/issuers'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/setup/trust-signing/issuers'); + await expect(page.locator('body')).toContainText(/issuer|trust/i); + }); + + test('/setup/identity-providers exposes Identity Providers settings', async ({ authenticatedPage: page }) => { + await go(page, '/setup/identity-providers'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/setup/identity-providers'); + await expect(page.locator('body')).toContainText(/identity|provider/i); + }); + + test('/setup/tenant-branding exposes Tenant & Branding settings', async ({ authenticatedPage: page }) => { + await go(page, '/setup/tenant-branding'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/setup/tenant-branding'); + await expect(page.locator('body')).toContainText(/tenant|brand/i); + }); + + test('/setup/workflows exposes the Workflows surface', async ({ authenticatedPage: page }) => { + await go(page, '/setup/workflows'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/setup/workflows'); + await expect(page.locator('body')).toContainText(/workflow/i); + }); + + test('/setup/ai-preferences exposes AI preferences workbench', async ({ authenticatedPage: page }) => { + await go(page, '/setup/ai-preferences'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/setup/ai-preferences'); + await expect(page.locator('body')).toContainText(/ai|assistant|preference/i); + }); + + test('/setup/topology exposes the Environments topology surface', async ({ authenticatedPage: page }) => { + await go(page, '/setup/topology'); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain('/setup/topology'); + await expect(page.locator('body')).toContainText(/environment|topology|region/i); + }); +}); + +test.describe('Sprint 007 retention - Console Admin surfaces', () => { + const adminRoutes: Array<{ path: string; matcher: RegExp }> = [ + { path: '/console-admin/tenants', matcher: /tenant/i }, + { path: '/console-admin/users', matcher: /user/i }, + { path: '/console-admin/roles', matcher: /role/i }, + { path: '/console-admin/clients', matcher: /client/i }, + { path: '/console-admin/audit', matcher: /audit/i }, + { path: '/console-admin/branding', matcher: /brand/i }, + { path: '/console-admin/assistant', matcher: /assistant|stella/i }, + ]; + + for (const { path, matcher } of adminRoutes) { + test(`preserves console origin and identity for ${path}`, async ({ authenticatedPage: page }) => { + await go(page, path); + expect(new URL(page.url()).origin).toBe(expectedOrigin); + expect(page.url()).toContain(path); + await expect(page.locator('body')).toContainText(matcher); + }); + } +});