doctor enhancements, setup, enhancements, ui functionality and design consolidation and , test projects fixes , product advisory attestation/rekor and delta verfications enhancements

This commit is contained in:
master
2026-01-19 09:02:59 +02:00
parent 8c4bf54aed
commit 17419ba7c4
809 changed files with 170738 additions and 12244 deletions

View File

@@ -0,0 +1,535 @@
Below is a UI/UX advisory based on your **new product vision** (evidence-based release control plane with hybrid reachability) and the ASCII blueprints of the **current UI information architecture**.
Im going to be blunt: you already have many of the right primitives (evidence bundles, proof chain, policy simulation, orchestration, reachability center), but the **IA and “default story”** still tells users “scanner + admin console.” The fix is not cosmetic—this is a **release-first product reframing** in navigation, objects, and workflows.
---
## 1) What the UI must communicate in 10 seconds
When a buyer opens Stella Ops, they must immediately understand:
1. **“What is deployed where”** (by digest, per environment/target)
2. **“What is allowed to ship next”** (promotion requests + approvals)
3. **“Why it is allowed/blocked”** (policy gates + reachability evidence)
4. **“Where the evidence is”** (one-click proof chain and export)
Everything else (vuln explorer, SBOM graph, VEX hub, feeds, ops health) is supporting detail.
Right now the UI communicates: “Security dashboard → findings → triage → policy → ops/admin.”
Thats the wrong default narrative for a release control plane.
---
## 2) New UX mental model: 5 core objects, 3 core jobs
### Core objects (they must exist everywhere as first-class nouns)
* **Release**: bundle of component→digest mappings (immutable identity)
* **Environment**: Dev/QA/Staging/Prod (policies, windows, approvals)
* **Promotion**: request to move a Release to an Environment
* **Deployment**: execution instance (workflow run against targets)
* **Evidence Packet**: signed bundle of inputs/outputs of a decision/run
### Core jobs (the UI must optimize for these first)
1. **Ship a release**: create → request promotion → approve → deploy
2. **Explain/justify a decision**: why allowed/blocked + evidence
3. **Operate with confidence**: drift, CVE updates, replay, audit export
Your current UI has these elements, but theyre **fragmented across Analyze/Triage/Policy/Evidence/Ops**.
---
## 3) High-level IA change: make “Releases” the product, not a submenu
### Current top-level nav (scanner-centric)
HOME / ANALYZE / TRIAGE / POLICY / OPS / NOTIFY / ADMIN
### Recommended top-level nav (release control plane)
Use fewer, higher-signal nouns. Example:
1. **Control Plane** (default landing)
2. **Releases**
3. **Approvals**
4. **Security**
5. **Evidence**
6. **Operations**
7. **Settings** (consolidated configuration)
If you insist on 5 groups max, merge:
* **Control Plane + Releases** (same section)
* **Operations** remains admin-only
* **Settings** stays separate
### What changes immediately
* **Home `/` becomes “Control Plane Overview”** (release pipeline + action inbox)
* **Release Orchestrator becomes the central product area** (not hidden)
* **Analyze/Triage collapse into “Security”** (because they exist to inform release gating)
* **Evidence becomes a single unified section** (today its scattered across triage, evidence-export, proof-chain, release evidence)
---
## 4) Shell & navigation redesign: move from top mega-menu to left rail
Your current header menu already has too many cognitive branches. A release control plane benefits from a **left navigation rail** + a **top bar for global context**.
### Proposed shell blueprint
```
┌──────────────────────────────────────────────────────────────────────────────┐
│ Stella Ops [Global Search: release/digest/CVE/env] [Tenant ▼] [User] │
│ Offline: OK | Feeds: 2026-01-15 | Policy: prod-baseline v3 | Evidence: ON │
├───────────────┬──────────────────────────────────────────────────────────────┤
│ CONTROL PLANE │ Control Plane Overview │
│ Releases │ ┌────────────────────────────────────────────────────────┐ │
│ Approvals │ │ Environment Pipeline: Dev → QA → Staging → Prod │ │
│ Security │ │ Dev: v1.3.0 QA: v1.2.5 Stg: v1.2.4 Prod: v1.2.3 │ │
│ Evidence │ └────────────────────────────────────────────────────────┘ │
│ Operations │ ┌───────────────────────────┐ ┌──────────────────────────┐ │
│ Settings │ │ Action Inbox │ │ Drift & Risk Changes │ │
│ │ │ - 3 approvals pending │ │ - 2 prod drifts detected │ │
│ │ │ - 1 blocked promotion │ │ - 5 CVEs updated │ │
│ │ │ - 2 failed deployments │ │ - 1 key expiring │ │
│ │ └───────────────────────────┘ └──────────────────────────┘ │
└───────────────┴──────────────────────────────────────────────────────────────┘
```
**Top bar is for:**
* Global search
* Tenant context
* Offline / feed snapshot / policy baseline status (your differentiators)
* Evidence mode (exportability / signing availability)
* User actions
**Left nav is for the product story.**
---
## 5) Consolidate configuration into a single “Settings” area
You already identified this, and youre correct. Right now configuration is scattered:
* `/setup`, `/console/configuration`, `/integrations`, `/admin/*`, `/ops/*`, `/concelier/*`
This creates a “Where do I configure X?” problem and makes the product feel unfinished.
### Proposed Settings structure (single hub, left-side tabs)
**Settings**
* **Integrations**
* Registries
* SCM
* CI/CD
* Targets & Hosts
* Secrets
* Notifications
* **Release Control**
* Environments (policies, approval rules, freeze windows)
* Targets (Docker/Compose/ECS/Nomad)
* Agents (health, capabilities)
* Workflows (templates, step registry)
* **Trust & Signing**
* Keys (rotation)
* Issuers
* Certificates
* Rekor / transparency settings
* **Security Data**
* Advisory sources / connectors
* Feed mirror / airgap
* Version locks
* **Identity & Access**
* Users
* Roles & scopes
* OAuth clients
* API keys
* **Tenant / Branding**
* **Usage & Limits** (quotas, throttle)
* **System**
* Platform health
* Doctor diagnostics
* SLOs
* Jobs / queues (admin-only)
### What to *move* under Settings (specific existing routes)
* `/console/configuration` → Settings → Integrations
* `/integrations/*` → Settings → Integrations (same UI, one place)
* `/admin/trust/*` → Settings → Trust & Signing
* `/admin/registries` → Settings → Integrations → Registries (merge)
* `/admin/notifications` → Settings → Integrations → Notifications (or Settings → Notifications)
* `/ops/feeds`, `/ops/offline-kit` → Settings → Security Data (unless you want “Operations”)
* `/ops/quotas` → Settings → Usage & Limits
* `/console/admin/*` → Settings → Identity & Access (admin-only)
This one consolidation will make the product feel 2x more mature.
---
## 6) Rebuild “Home” into a Release Control Plane dashboard (not a security dashboard)
Your current Home dashboard is well designed—but it optimizes the wrong story (vulns, risk, reachability pie charts).
### Replace `/` with: “Control Plane Overview”
Must show:
* Environment pipeline status (whats deployed)
* Pending promotions & approvals
* Deployment outcomes (last N)
* Drift / risk changes since last evidence
* “System trust posture” (feeds stale? keys expiring? offline?)
Security metrics should be **secondary** and contextual.
### Keep the current security dashboard, but move it under Security
* The existing `/` dashboard becomes `/security/overview` (or `/security/dashboard`)
---
## 7) Make “Approvals” a first-class product surface, not a subpage
Approvals are the moment where buyers “feel” governance and auditability.
### Current approvals blueprint is good; whats missing is evidence-first structure
**Approval card must answer:**
1. What is changing?
2. What is the risk delta?
3. What do the gates say?
4. Where is the evidence?
5. What do I do next?
### Suggested approval card layout
```
Release: app-svc v1.2.5 (Digest bundle locked)
From: QA → To: Staging Requested by: deploy-bot 2h ago
WHAT CHANGED (Diff summary)
- Components changed: 3
- New CVEs introduced: 2 (1 reachable)
- Fixed CVEs: 5
- Config drift: none
GATES (Policy baseline: stg-baseline v3.1)
✅ SBOM valid + signed
✅ Provenance present (SLSA attestation)
⚠️ 3 high CVEs (2 not-affected via VEX, 1 uncertain reachability)
❌ 1 reachable critical path found (confidence 0.82)
ACTIONS:
[View Evidence Packet] [View Reachability Witness] [Request Exception] [Approve] [Reject]
```
Key UX improvements:
* **Diff-first** becomes a core affordance everywhere (you already have lineage diff patterns—reuse them).
* “View Reachability Witness” must exist right on the approval decision (this is your moat).
---
## 8) Unify “Releases” around digest-first identity and environment mapping
Today you have:
* Artifact Workspace (triage)
* Release Orchestrator (separate)
* Findings and scans (analyze)
To match the vision, “Release” becomes the thing users manage, and “Artifacts” become a supporting detail.
### New Releases area should have 4 core pages
1. **Releases List**
2. **Release Detail**
3. **Environment Detail**
4. **Deployment Runs**
#### Release detail page should be your flagship screen
Must include:
* Release identity (bundle, digests)
* Promotion history and current deployment per environment
* Gate results (policy + reachability + VEX)
* Evidence packet + proof chain (one-click)
* “Create promotion request” and “Rollback” actions
**Release detail blueprint (suggested)**
```
RELEASE: v1.2.5 Bundle: sha256:bundle... Created by CI: gh-actions #882
[Overview] [Components] [Gates] [Promotions] [Deployments] [Evidence] [Proof Chain]
OVERVIEW
- Dev: deployed ✓ QA: deployed ✓ Staging: pending approval ⚠ Prod: v1.2.3
- Risk score: 62 (↓ -8 from previous) Reachability coverage: 89%
PRIMARY ACTIONS: [Request Promotion] [Generate Evidence] [Export] [Replay Verify]
```
---
## 9) Embed reachability everywhere it matters (and nowhere it doesnt)
Reachability is not a separate “center” for most users. Its an explanation layer that must appear:
* On approvals (decision moment)
* On finding detail (why this CVE matters)
* On release gates (why blocked/allowed)
* In evidence packet (what was proven)
### Reachability presentation rules (UX contract)
* Always show a **three-tier summary**:
* **State**: Reachable / Unreachable / Uncertain
* **Confidence**: numeric and explained (“0.82; runtime signal present”)
* **Evidence**: witness path / guards / dynamic edges
* Only show full graphs on demand (progressive disclosure).
* “Uncertain” must be actionable: show why uncertain, and the top 12 ways to resolve uncertainty (runtime signal, config, guard).
### Add a “Witness Viewer” component (reusable)
A dedicated view that can render:
* Mermaid/DOT export
* Call path
* Guards/dynamic loading notes
* Evidence URIs
* Replay/verify button
This becomes a shared panel used in:
* Approvals
* Finding detail slide-out
* Evidence packet viewer
---
## 10) Evidence: stop scattering it; make one “Evidence” experience
You currently have evidence in:
* `/evidence/*`
* `/proofs/:subjectDigest`
* `/triage/audit-bundles`
* `/release-orchestrator/evidence`
This is a classic maturity killer: users lose trust when “audit artifacts” are spread across 4 locations.
### Recommended change
Create **one Evidence section** with:
* Evidence Packets (searchable, filterable by release/env/deployment)
* Proof Chains
* Replay/Verify
* Export Center
* Audit Bundles (as a type of evidence packet)
Then:
* Remove / hide “Evidence” tabs inside other areas, replacing them with a link:
* “Open Evidence Packet” → takes you to Evidence section pre-filtered.
---
## 11) Rename/merge “Analyze” + “Triage” into a single “Security” area
Right now:
* Analyze = findings/vulns/graph/lineage/reachability/vex/unknowns/patch-map
* Triage = artifacts/exceptions/audit bundles/risk profiles
To a customer this reads like: “two versions of security.”
### Recommended Security structure
**Security**
* Overview (the old home security dashboard)
* Findings (scans & findings)
* Vulnerabilities (global library CVEs)
* Artifact Intelligence (SBOM graph, lineage diff, unknowns, patch map)
* VEX (hub + consensus + conflicts)
* Exceptions (policy exceptions and risk acceptances)
* Risk (profiles / scoring explanations)
And crucially:
* Each of these pages must link back to **Releases/Environments impacted**.
Example:
* Vulnerability detail shows: “Impacts: 3 releases; deployed in Prod: yes/no.”
Thats how security becomes a gate, not a silo.
---
## 12) Fix route and naming inconsistencies (small work, big polish)
Your own observations list the fragmentation. Customers feel this as “unfinished.”
### Normalize path prefixes
* `/release-orchestrator/*``/releases/*` (or `/control-plane/*`)
* `/admin/vex-hub/*``/security/vex/*`
* `/scheduler/*``/ops/scheduler/*` (or `/operations/scheduler/*`)
* `/console/admin/*``/settings/access/*` (admin-only)
* `/concelier/trivy-db-settings``/settings/security-data/trivy`
### Normalize nouns in the UI
* “Artifact Workspace” is security-centric; for release product it becomes:
* “Artifacts” (inventory) or “Digests”
* “Scans & Findings” should be “Findings”
* “Policy Studio” is fine for power users, but add a simple “Policies” list entry for everyone.
---
## 13) Add an “Action Inbox” to unify the product experience
Today approvals are one page, exceptions are another, dead-letter jobs are in ops, drift alerts are separate docs.
Create a single page: **Inbox**
* Pending approvals
* Pending exception reviews
* Drift alerts (reachability drift, risk drift)
* Failed deployments
* Key expirations / feed staleness (if they block evidence)
This becomes the daily entry point for an operator.
---
## 14) Styling and readability guidance (practical, not decorative)
A release control plane UI must be “audit calm,” not “security noisy.”
**Rules:**
* Prefer **text + badge** over emoji status indicators in production UI.
* Use **progressive disclosure**: summary → details panel → deep technical view.
* Replace “dashboard card overload” with 23 high-signal panels:
* Pipeline
* Inbox
* Drift/Risk Changes
* Make **digest visibility consistent**:
* show short digest everywhere; full digest on hover/copy
* Provide “Copy” buttons for operational fields (digest, env, release id, evidence id).
* Use consistent phrasing for gates:
* PASS / WARN / BLOCK
* always with one-line reason
* Show **policy baseline version** and **feed snapshot version** where decisions are made. Thats trust.
---
## 15) Concrete agent task list (what to change, where)
### A) Navigation & IA refactor
1. **Add new top-level nav items**:
* Control Plane, Releases, Approvals, Security, Evidence, Operations, Settings
2. **Move Release Orchestrator into nav** and make it default landing route.
3. **Remove Analyze/Triage split** from top-level; merge into Security.
4. **Move VEX Hub out of /admin** and into Security section (keep permissions).
5. **Add Settings section** and start migrating config pages under it.
### B) Home `/` replacement
1. Replace `HomeDashboardComponent` content:
* Pipeline view, inbox, drift/risk deltas, system trust posture.
2. Move existing “Security Dashboard” content to `/security/overview`.
### C) Release experience upgrades
1. Implement **Release Detail flagship page**:
* Tabs: Overview, Components, Gates, Promotions, Deployments, Evidence, Proof Chain
2. Implement **Diff-first** view for promotions (reuse lineage diff patterns).
### D) Approvals redesign
1. Make Approvals a first-class nav item.
2. Add “View Evidence Packet” + “View Reachability Witness” as primary actions.
3. Add “Request Exception” flow from the approval screen (no hunting).
### E) Evidence unification
1. Create a single Evidence hub:
* Bundles, Proof Chains, Replay/Verify, Export
2. Redirect:
* `/proofs/:subjectDigest` into Evidence area
* `/release-orchestrator/evidence` becomes a filtered Evidence view
* `/triage/audit-bundles` becomes Evidence → Audit Bundles
### F) Settings consolidation
1. Create Settings shell page + left sidebar.
2. Migrate:
* Integrations (merge configuration pane + integration hub)
* Trust, registries, notifications, feeds/offline kit, quotas
3. Deprecate redundant entry points after migration.
### G) Cross-linking (critical)
Add “Impacts” panels everywhere:
* On CVE detail: affected releases/environments + deployed status
* On Finding detail: show release gate impact + direct link to approval/promotion
* On Release gate: show underlying findings list filtered to that release
### H) Reachability witness viewer component
1. Build a reusable panel:
* State, confidence, witness path, guards/dynamic loading flags, replay verify
2. Embed it in:
* Approvals
* Finding detail
* Evidence packet viewer
---
## 16) What I would prioritize (highest ROI, least debate)
If you do only three things first, do these:
1. **Make `/` the Control Plane Overview** (pipeline + inbox + drift)
2. **Consolidate Settings** (stop configuration fragmentation)
3. **Make Approvals evidence-first with reachability witness** (moat on display)
Everything else becomes easier after those.
---

View File

@@ -0,0 +1,435 @@
Below are the redesigned **flagship page wireframes (ASCII)** for Stella Ops as an **evidence-based release control plane** with **hybrid reachability** as a first-class gate and explanation layer.
Im keeping the pages “small” in feel: the **most important words first**, then compact supporting text, with **deep detail behind links/panels**.
---
## 0) Shared Shell (applies to all flagship pages)
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ Stella Ops [ Search: release | digest | CVE | env | target ] Tenant: ACME User ▼ │
│ Offline: OK Feed Snapshot: 2026-01-15 Policy Baseline: prod-baseline v3.1 Evidence: ON│
├───────────────┬────────────────────────────────────────────────────────────────────────────┤
│ CONTROL PLANE │ Breadcrumb: <Section> > <Page> │
│ RELEASES │ │
│ APPROVALS │ <router-outlet> │
│ SECURITY │ │
│ EVIDENCE │ │
│ OPERATIONS │ │
│ SETTINGS │ │
└───────────────┴────────────────────────────────────────────────────────────────────────────┘
Conventions:
- Primary actions are top-right.
- “Open Evidence” and “Open Proof Chain” are always one click away when decisions happen.
- Digests show short form + copy action; full value in hover/expand.
- Gate states: [PASS] [WARN] [BLOCK]
- Reachability states: Reachable / Unreachable / Uncertain + Confidence + Witness link
```
---
## 1) CONTROL PLANE — Overview (new `/`)
**Goal:** answer in one screen: **whats deployed where**, **whats pending**, **what changed**, **what needs me**.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ CONTROL PLANE │
│ Release governance with evidence. Promote by digest. Explain every decision. [Docs →] │
│ [Create Release]│
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ ENVIRONMENT PIPELINE │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ DEV │ --->│ QA │ --->│ STAGING │ --->│ PROD │ │
│ │ v1.3.0 │ │ v1.2.5 │ │ v1.2.4 │ │ v1.2.3 │ │
│ │ OK │ │ OK │ │ PENDING │ │ OK │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
│ Deployed by digest. Click an environment to see targets, drift, and evidence. │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌───────────────────────────────────────────────┐ ┌──────────────────────────────────────┐ │
│ │ ACTION INBOX │ │ DRIFT & RISK CHANGES │ │
│ │ (what needs attention) │ │ (since last evidence) │ │
│ │ │ │ │ │
│ │ • 3 approvals pending │ │ • 2 promotions newly BLOCKED │ │
│ │ • 1 blocked promotion (reachability) │ │ • 5 CVEs updated (1 reachable) │ │
│ │ • 2 failed deployments (retry available) │ │ • 1 feed stale risk (OSV 36h old) │ │
│ │ • 1 key expiring in 14 days │ │ • 0 config drifts in prod │ │
│ │ │ │ │ │
│ │ [Go to Approvals] [Go to Deployments] │ │ [View Drift] [View Security Impact] │ │
│ └───────────────────────────────────────────────┘ └──────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ PENDING PROMOTIONS │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ Release From → To Status Gates Risk Delta Actions │ │
│ │ v1.2.5 QA → Staging Waiting [PASS][WARN] +2 new CVEs [Open Approval] │ │
│ │ v1.2.6 Dev → QA Auto-approved [PASS] net safer [Deploy Now] │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 2) RELEASES — List (`/releases`)
**Goal:** inventory releases as **immutable bundles**, show **where deployed**, and enable **promotion/evidence**.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ RELEASES │
│ Immutable digest bundles. Promote releases across environments. [Docs →] │
│ [Create Release] [Export CSV] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ Filters: [Search release/component/digest…] [Env ▼] [Deployed ▼] [Gate ▼] [Date ▼] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐
│ │ Release Bundle Digest Components Deployed Where Gates Evidence Action│
│ │ v1.2.6 sha256:9c1…3a 12 Dev, QA [PASS] Signed [View]│
│ │ v1.2.5 sha256:7aa…2f 12 QA [WARN] Signed [View]│
│ │ v1.2.4 sha256:0b2…c9 11 Staging [PASS] Signed [View]│
│ │ v1.2.3 sha256:1d9…11 11 Prod [PASS] Signed [View]│
│ └──────────────────────────────────────────────────────────────────────────────────────────┘
│ Multi-select actions: [Request Promotion] [Generate Evidence] [Replay Verify] [Compare] │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 3) RELEASES — Release Detail (`/releases/:releaseId`)
**Goal:** one flagship screen that ties **promotion + gates + reachability + evidence + proof chain**.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ RELEASE v1.2.5 │
│ Bundle: sha256:7aa…2f (copy) Created: 2026-01-15 Source: CI build #882 [Docs →] │
│ [Request Promotion] [Rollback] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ DEPLOYMENT MAP │
│ Dev: v1.3.0 (not this) QA: v1.2.5 (THIS) Staging: pending Prod: v1.2.3 │
│ [Open Environment QA] [Open Approval] [Open Deployments] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ Tabs: [Overview] [Components] [Gates] [Promotions] [Deployments] [Evidence] [Proof Chain] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ OVERVIEW │
│ ┌───────────────────────────────────────────────┐ ┌──────────────────────────────────────┐ │
│ │ GATE SUMMARY (Policy: stg-baseline v3.1) │ │ SECURITY IMPACT │ │
│ │ SBOM signed: [PASS] │ │ New CVEs: 2 (1 reachable) │ │
│ │ Provenance present: [PASS] │ │ Fixed CVEs: 5 │ │
│ │ Reachability coverage: [WARN] 89% │ │ VEX: 2 not-affected, 1 under review │ │
│ │ Critical reachable: [BLOCK] 1 (0.82 conf) │ │ Exceptions: 0 │ │
│ │ │ │ [Open Findings for this Release] │ │
│ │ [Open Reachability Witness] [Explain] │ └──────────────────────────────────────┘ │
│ └───────────────────────────────────────────────┘ │
│ MOST RECENT EVIDENCE PACKET │
│ Evidence: EVD-2026-0045 Signed: YES Verified: YES Feed Snapshot: 2026-01-15 │
│ [Open Evidence Packet] [Export Bundle] [Replay Verify] │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 4) APPROVALS — Inbox (`/approvals`)
**Goal:** make approvals the **decision cockpit**: diff-first, evidence-first, reachability-first.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ APPROVALS │
│ Decide promotions with policy + reachability, backed by signed evidence. [Docs →] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ Filters: [Pending ▼] [Env ▼] [Team ▼] [Policy Baseline ▼] [Search…] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐
│ │ PENDING (3) │
│ ├──────────────────────────────────────────────────────────────────────────────────────────┤
│ │ v1.2.5 QA → Staging Requested by: deploy-bot 2h ago │
│ │ WHAT CHANGED: +3 pkgs +2 CVEs (1 reachable) -5 fixed Drift: none │
│ │ GATES: SBOM[PASS] Provenance[PASS] Reachability[BLOCK] VEX[WARN] │
│ │ Actions: [Open] [Open Evidence] [Open Witness] [Request Exception] [Approve] [Reject] │
│ ├──────────────────────────────────────────────────────────────────────────────────────────┤
│ │ v1.2.6 Dev → QA Auto-approved gates. Waiting deploy window. │
│ │ WHAT CHANGED: net safer -2 CVEs Coverage: 92% │
│ │ Actions: [Deploy Now] [Open Evidence] │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 5) APPROVALS — Approval Detail (`/approvals/:approvalId`)
**Goal:** show everything needed to make a decision—without navigating away.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ APPROVAL: v1.2.5 QA → Staging │
│ Requested by: deploy-bot 2h ago Policy: stg-baseline v3.1 Feed Snapshot: 2026-01-15 │
│ [Open Evidence] [Docs →] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ LEFT: DIFF & GATES RIGHT: DECISION & COMMENTS │
│ ┌───────────────────────────────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ WHAT CHANGED (Diff-first) │ │ DECISION │ │
│ │ Components changed: 3 │ │ [Approve] [Reject] │ │
│ │ New CVEs: 2 (1 reachable) │ │ Require comment: [____] │ │
│ │ Fixed CVEs: 5 │ │ Optional: [Request Exception]│ │
│ │ Config drift: none │ └─────────────────────────────┘ │
│ ├───────────────────────────────────────────────────────┤ │
│ │ GATES (expandable) │ ┌─────────────────────────────┐ │
│ │ SBOM signed: [PASS] │ │ COMMENTS / AUDIT NOTES │ │
│ │ Provenance attested: [PASS] │ │ - user1: needs exception? │ │
│ │ Reachability: [BLOCK] │ │ - sec: confirm witness path │ │
│ │ VEX consensus: [WARN] │ │ [Add comment] │ │
│ │ │ └─────────────────────────────┘ │
│ │ [Explain Gate Results] [Open Proof Chain] │ │
│ └───────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ REACHABILITY WITNESS (the moat) │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ Finding: CVE-2026-1234 in log4j │
│ │ State: Reachable Confidence: 0.82 Reason: static path + runtime signal present │
│ │ Witness Path: main() → processRequest() → Logger.log() → vulnerable() │
│ │ Guards: none detected Dynamic loading: no │
│ │ Actions: [Open Full Witness] [Export DOT] [Replay Verify] │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 6) ENVIRONMENTS — List (`/environments`)
**Goal:** show environments as **release destinations** (not just config objects).
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ ENVIRONMENTS │
│ What is deployed where, with policy and evidence. [Docs →] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐
│ │ Environment Current Release Freeze Targets Policy Baseline Last Deploy Action│
│ │ Dev v1.3.0 Off 12 dev-baseline v2.0 10m ago [Open]│
│ │ QA v1.2.5 Off 8 qa-baseline v2.5 2h ago [Open]│
│ │ Staging v1.2.4 On 6 stg-baseline v3.1 6h ago [Open]│
│ │ Prod v1.2.3 Off 20 prod-baseline v3.1 1d ago [Open]│
│ └──────────────────────────────────────────────────────────────────────────────────────────┘
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 7) ENVIRONMENTS — Environment Detail (`/environments/:envId`)
**Goal:** environment as a “release ledger”: targets, drift, promotions, evidence.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ ENVIRONMENT: Staging │
│ Current: v1.2.4 Policy: stg-baseline v3.1 Freeze: ON (window 18:0020:00 UTC) [Docs →]│
│ [Request Promotion] [Open Evidence] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ Tabs: [Overview] [Targets] [Promotions] [Deployments] [Drift] [Evidence] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ OVERVIEW │
│ ┌───────────────────────────────────────────────┐ ┌──────────────────────────────────────┐ │
│ │ RELEASE HISTORY (ledger) │ │ CURRENT RISK SNAPSHOT │ │
│ │ v1.2.2 → v1.2.3 → v1.2.4 (current) │ │ Gate summary: [PASS][WARN] │ │
│ │ Last promotion: QA → Staging 6h ago │ │ Reachability coverage: 89% │ │
│ │ Evidence: EVD-2026-0044 (verified) │ │ Drift since evidence: none │ │
│ │ [Open Proof Chain] │ │ [Open Findings Impacting Staging] │ │
│ └───────────────────────────────────────────────┘ └──────────────────────────────────────┘ │
│ TARGETS (quick view) │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ Target Type Status Deployed Digest Last Seen Action │ │
│ │ stg-host-01 Docker OK sha256:abc… 1m ago [Details] │ │
│ │ stg-compose-02 Compose OK sha256:abc… 1m ago [Details] │ │
│ │ stg-ecs-service ECS OK sha256:abc… 2m ago [Details] │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 8) DEPLOYMENTS — List (`/deployments`)
**Goal:** operational truth: deployments as executions with artifacts + evidence.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ DEPLOYMENTS │
│ Execution history by environment and release, with evidence for every run. [Docs →] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ Filters: [Env ▼] [Release ▼] [Status ▼] [Target Type ▼] [Date ▼] [Search…] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐
│ │ Deployment Env Release Started Duration Status Evidence Action │
│ │ DEP-2026-045 Prod v1.2.3 2h ago 3m12s OK Verified [Open] │
│ │ DEP-2026-044 Staging v1.2.4 6h ago 2m55s OK Verified [Open] │
│ │ DEP-2026-043 QA v1.2.5 10h ago 5m01s FAILED Partial [Open] │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 9) DEPLOYMENTS — Run Detail (`/deployments/:deployId`)
**Goal:** show workflow DAG, logs, generated artifacts (immutable), and evidence.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ DEPLOYMENT: DEP-2026-045 │
│ Env: Prod Release: v1.2.3 Plan Hash: ph_91a… Agent: prod-agent-02 [Docs→]│
│ [Open Evidence] [Rollback] [Replay Verify]│
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ Tabs: [Workflow] [Targets] [Artifacts] [Logs] [Evidence] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ WORKFLOW (DAG) │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ Fetch Digests → Generate compose.stella.lock.yml → Deploy → Verify → Seal Evidence │
│ │ OK OK OK OK OK │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘ │
│ ARTIFACTS (immutable outputs) │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ compose.stella.lock.yml sha256:11a… [View] [Download] │
│ │ deploy.stella.script.dll sha256:22b… [View] [Download] │
│ │ release.evidence.json sha256:33c… [View] [Download] │
│ │ stella.version.json sha256:44d… [View] [Download] │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 10) EVIDENCE — Evidence Center (`/evidence`)
**Goal:** one unified hub for evidence packets (release/promotion/deploy/audit), verification, export, replay.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ EVIDENCE │
│ Search, verify, export signed evidence packets and proof chains. [Docs →]│
│ [Create Audit Bundle] [Export] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ Filters: [Type ▼] [Release ▼] [Env ▼] [Signed ▼] [Verified ▼] [Date ▼] [Search…] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐
│ │ Evidence ID Type Subject Signed Verified Snapshot Action │
│ │ EVD-2026-0045 Promotion v1.2.5 QA→Staging Yes Yes 2026-01-15 [Open] │
│ │ EVD-2026-0044 Deployment DEP-2026-044 Yes Yes 2026-01-15 [Open] │
│ │ EVD-2026-0043 Release v1.2.3 Yes Yes 2026-01-14 [Open] │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 11) EVIDENCE — Evidence Packet Viewer (`/evidence/:evidenceId`)
**Goal:** evidence as a structured “who/what/why/how/when” record + bundle contents + verify.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ EVIDENCE PACKET: EVD-2026-0045 │
│ Type: Promotion Subject: v1.2.5 QA→Staging Signed: YES Verified: YES [Docs →]│
│ [Download Bundle] [Open Proof Chain] [Replay Verify]│
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ SUMMARY (audit-friendly) │
│ Who: user1@acme What: release bundle sha256:7aa…2f When: 2026-01-15 10:23 UTC │
│ Why: Gate verdict BLOCK (reachability) + VEX WARN │
│ How: workflow ph_91a… agent prod-agent-02 │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ CONTENTS │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ SBOM (CycloneDX 1.7) sha256:aa1… [View] [Download] │ │
│ │ Policy verdict (K4 lattice) sha256:bb2… [View] [Explain] │ │
│ │ Reachability witness slice sha256:cc3… [Open Witness] [Export DOT] │ │
│ │ VEX statements (OpenVEX) sha256:dd4… [View] │ │
│ │ Attestations (DSSE) sha256:ee5… [View] │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 12) SECURITY — Findings (release-aware) (`/security/findings`)
**Goal:** security becomes decision support: every finding shows **impact on releases/environments**.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ SECURITY FINDINGS │
│ Findings with reachability and release impact. Triage feeds the release gates. [Docs →]│
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ Filters: [Search CVE/pkg/release…] [Severity ▼] [Reachability ▼] [Env Impact ▼] [Date ▼] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐
│ │ Sev Finding Component Reachability (conf) Impacts Gate Impact │
│ │ CRIT CVE-2026-1234 log4j@2.14.1 Reachable (0.82) v1.2.5 Staging BLOCK │
│ │ HIGH CVE-2026-5678 spring@5.2.1 Uncertain (0.55) v1.2.6 QA WARN │
│ │ MED CVE-2026-9012 commons-io@2.4 Unreachable (0.90) v1.2.3 Prod PASS │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘
│ Selecting a row opens a detail drawer: Witness, VEX status, Exceptions, Evidence links. │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 13) SECURITY — Vulnerability Detail (impact-first) (`/security/vulnerabilities/:cveId`)
**Goal:** unify CVE intelligence with **where it matters** (deployed + gated) + VEX + reachability witness.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ VULNERABILITY: CVE-2026-1234 │
│ Severity: Critical CVSS: 9.8 EPSS: 0.72 Exploited: Yes (KEV) [Docs →]│
│ [Open Findings] [Open Evidence] [Open Witness] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ IMPACT (where it matters) │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ Deployed Environments: Staging (via v1.2.5), Prod (via v1.2.3) │ │
│ │ Gate Impact: Blocks QA→Staging promotions for v1.2.5 │ │
│ │ Fix path: Upgrade log4j to 2.17.x (available) │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ REACHABILITY SUMMARY │
│ State: Reachable Confidence: 0.82 Witness: main()→processRequest()→Logger.log()→vuln() │
│ Guards: none detected Dynamic loading: no │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 14) Reachability Witness Viewer (full page when needed) (`/witness/:id`)
**Goal:** this is your “best-in-class” differentiator page—clear, exportable, replayable.
```
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ REACHABILITY WITNESS │
│ Subject: CVE-2026-1234 Component: log4j@2.14.1 Release: v1.2.5 Env: Staging [Docs →]│
│ State: Reachable Confidence: 0.82 Snapshot: 2026-01-15 Deterministic: YES │
│ [Export DOT] [Export Mermaid] [Replay Verify] │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ PATH (human-readable) │
│ main() → processRequest() → Logger.log() → vulnerable_function() │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ EXPLANATION (why confidence is 0.82) │
│ • Static path found: yes │
│ • Runtime signal present: yes │
│ • Guards detected: none │
│ • Dynamic loading: no │
│ • Reflection: no │
├────────────────────────────────────────────────────────────────────────────────────────────┤
│ GRAPH (collapsed by default; expand on demand) │
│ [ Expand Graph Viewer ] │
└────────────────────────────────────────────────────────────────────────────────────────────┘
```
---

View File

@@ -0,0 +1,721 @@
Below is a **concrete Angular 17+ standalone component breakdown** aligned to the **new flagship UI** (evidence-based release control plane + hybrid reachability), using **standalone components**, **signals**, and **lazy-loaded feature route trees**.
Im optimizing for:
* **Diff-first + decision-first** UX (Approvals, Release Detail)
* **Evidence-first** navigation (Evidence always one click away)
* **Digest-first identity** everywhere (no tag ambiguity)
* **Determinism & replay** surfaced as first-class metadata
* **Minimum cognitive load** (fewer “product area” silos; more “release lifecycle” flows)
---
# 1) Folder and ownership model (standalone-first)
## 1.1 High-level structure
```
src/app/
core/ # auth, api client, guards, nav config, app init
layout/ # app shell, sidebar, topbar, page scaffolding
shared/
ui/ # design system primitives (buttons, chips, tables...)
domain/ # domain widgets (digest chip, gate badges, evidence link)
overlays/ # drawers/modals (evidence drawer, witness drawer)
pipes/ # formatting
util/ # helpers, comparators, trackBy fns
features/
control-plane/
releases/
approvals/
environments/
deployments/
security/
evidence/
reachability/
operations/
settings/
```
## 1.2 Container vs presentational convention
* **`Page` components**: own routing params, assemble layout, bind stores, handle page-level actions.
* Suffix: `...PageComponent`
* **`Container` components**: own feature state, wire subcomponents, and orchestrate queries.
* Suffix: `...ContainerComponent`
* **Pure UI components**: take `@Input()` signals/values + emit outputs (events), no data fetching.
* Suffix: `...Component` / `...WidgetComponent`
All use:
* `changeDetection: ChangeDetectionStrategy.OnPush`
* Signals for view-model state (computed selectors, effects)
* `inject()` + `DestroyRef` instead of `ngOnDestroy` boilerplate
---
# 2) Core layout components (shared across all pages)
## 2.1 App Shell
### `AppShellComponent`
* **Selector**: `app-shell`
* **Responsibility**: Top-level layout wrapper with topbar + sidebar + router outlet + overlay hosts.
* **Contains**:
* `<app-topbar />`
* `<app-sidebar />`
* `<app-breadcrumb />`
* `<router-outlet />`
* `<app-command-palette />`
* `<app-toast-host />`
* `<app-overlay-host />` (drawers/modals portal)
### `AppTopbarComponent`
* Shows global context + global search.
* **Children**:
* `GlobalSearchComponent`
* `TenantBadgeComponent`
* `OfflineStatusChipComponent`
* `FeedSnapshotChipComponent`
* `PolicyBaselineChipComponent`
* `EvidenceModeChipComponent`
* `UserMenuComponent`
### `AppSidebarComponent`
* Left nav: CONTROL PLANE / RELEASES / APPROVALS / SECURITY / EVIDENCE / OPERATIONS / SETTINGS.
* **Children**:
* `SidebarNavGroupComponent`
* `SidebarNavItemComponent`
* `SidebarPinnedItemsComponent` (optional “pins”: Prod, Pending approvals, etc.)
### `BreadcrumbComponent`
* Builds from router data.
* Supports “context crumbs” (Release v1.2.5, Env Staging).
---
# 3) Shared UI primitives (low-level, reusable)
These should live under `shared/ui/` and be used everywhere.
* `PageHeaderComponent`
* Title, subtitle, primary CTA area, secondary actions area
* `FilterBarComponent`
* Search box + filter chips + “Reset” + saved views
* `DataTableComponent<T>`
* Virtual scroll option, sticky header, column templates
* `SplitPaneComponent`
* Left list + right details; collapsible
* `TabbedNavComponent`
* Controlled tabs, supports router-based tabs
* `StatusBadgeComponent`
* OK/WARN/BLOCK/FAILED etc.
* `MetricCardComponent`
* number + label + delta + sparkline slot
* `TimelineListComponent`
* for audit/evidence/deploy events
* `EmptyStateComponent`
* `InlineCodeComponent` (for digests/IDs)
* `CopyToClipboardButtonComponent`
---
# 4) Shared domain widgets (your “moat UI”: digest, gates, evidence, witness)
These are the **high-leverage** components that encode Stellas differentiators and make the product feel coherent.
## 4.1 Digest identity
### `DigestChipComponent`
* Inputs: `digest: string`, `label?: string`, `variant?: 'bundle'|'image'|'artifact'`
* Outputs: `(open)`, `(copy)`
* Behavior: displays `sha256:abc…123`, copy on click, hover reveals full digest.
### `BundleDigestHeaderComponent`
* Inputs: `releaseId`, `bundleDigest`, `createdAt`, `sourceRef`
* Renders release identity block (consistent across Release/Approval/Evidence pages).
## 4.2 Gate system (Policy + Reachability + VEX)
### `GateBadgeComponent`
* Inputs: `state: 'PASS'|'WARN'|'BLOCK'|'SKIP'`, `label: string`
* Used in lists and summaries.
### `GateSummaryPanelComponent`
* Inputs: `gates: GateResult[]`, `policyRef`, `snapshotRef`
* Outputs: `(openExplain)`, `(openEvidence)`
* Renders the compact gate list, with drill-down.
### `GateExplainDrawerComponent` (overlay)
* Inputs: `gateRunId` or `decisionDigest`
* Shows: rule hits, K4 lattice explanation, evidence anchors.
## 4.3 Evidence UX
### `EvidenceLinkComponent`
* Inputs: `evidenceId`, `type`, `verified`, `signed`
* Output: `(open)`
* Always consistent link target (drawer or page).
### `EvidencePacketSummaryComponent`
* Inputs: `EvidencePacketHeaderVM`
* Displays Who/What/Why/How/When in compact audit-friendly block.
### `ProofChainLinkComponent`
* Inputs: `subjectDigest`
* Output: `(open)`
* Standard entry to proof chain.
## 4.4 Reachability witness UX
### `ReachabilityStateChipComponent`
* Inputs: `state: 'Reachable'|'Unreachable'|'Uncertain'`, `confidence: number`
* Output: `(openWitness)`
### `WitnessPathPreviewComponent`
* Inputs: `path: string[]`, `guards: GuardSummary`, `deterministic: boolean`
* Output: `(openFull)`
* Used on Approval Detail + Release Detail.
### `WitnessViewerComponent` (page core)
* Inputs: `witnessId` or `sliceRef`
* Slots: exports (DOT/Mermaid), replay verify action.
---
# 5) Feature-by-feature component trees (flagship pages)
Below, each page includes:
* **Page component** (route-bound)
* **Container** (state + orchestration)
* **Widgets** (UI)
* **Drawers** used
---
## 5.1 CONTROL PLANE (`/`)
### `ControlPlanePageComponent`
* Owns route; sets page title and CTAs.
### `ControlPlaneContainerComponent`
* Loads:
* environment pipeline state
* action inbox counts
* pending promotions list
* drift/risk deltas summary
**Children widgets:**
* `PageHeaderComponent` (CTA: Create Release)
* `EnvironmentPipelineWidgetComponent`
* `ActionInboxWidgetComponent`
* `DriftRiskDeltaWidgetComponent`
* `PendingPromotionsTableComponent`
**Overlays used:**
* Evidence drawer, Approval drawer quick-open, Deployment detail drawer (optional)
---
## 5.2 RELEASES LIST (`/releases`)
### `ReleasesListPageComponent`
### `ReleasesListContainerComponent`
* Loads release list; supports filters + saved views.
**Children:**
* `PageHeaderComponent` (Create Release)
* `FilterBarComponent`
* `ReleasesTableComponent`
* row actions: View, Compare, Request Promotion, Export Evidence
**Row widgets:**
* `DigestChipComponent` (bundle digest)
* `GateBadgeComponent` summary cell
* `EvidenceLinkComponent`
---
## 5.3 RELEASE DETAIL (`/releases/:releaseId`)
### `ReleaseDetailPageComponent`
* Reads `releaseId` param.
### `ReleaseDetailContainerComponent`
* Loads:
* release bundle metadata (digest map)
* deployed environments map
* gate summary (policy run refs)
* security impact summary (new CVEs, reachable)
* evidence latest packet
* tabs data on demand
**Children:**
* `BundleDigestHeaderComponent`
* `ReleaseDeploymentMapWidgetComponent`
* `ReleaseTabsComponent` (router tabs)
* `ReleaseOverviewTabComponent`
* `ReleaseComponentsTabComponent`
* `ReleaseGatesTabComponent`
* `ReleasePromotionsTabComponent`
* `ReleaseDeploymentsTabComponent`
* `ReleaseEvidenceTabComponent`
* `ReleaseProofChainTabComponent`
**Key widgets:**
* `GateSummaryPanelComponent`
* `SecurityImpactWidgetComponent`
* `EvidencePacketCardComponent` (compact)
* `WitnessPathPreviewComponent` embedded when “critical reachable” exists
**Overlays:**
* `GateExplainDrawerComponent`
* `EvidencePacketDrawerComponent`
* `WitnessDrawerComponent`
---
## 5.4 APPROVALS INBOX (`/approvals`)
### `ApprovalsInboxPageComponent`
### `ApprovalsInboxContainerComponent`
* Loads approvals by status, env, policy baseline.
**Children:**
* `PageHeaderComponent`
* `FilterBarComponent`
* `ApprovalsInboxListComponent`
* composed of `ApprovalInboxCardComponent` rows
**Card children:**
* `ApprovalSummaryHeaderComponent` (release/from/to/requested-by)
* `DiffSummaryInlineComponent` (what changed)
* `GateBadgeRowComponent`
* Actions bar:
* `OpenApprovalButton`, `OpenEvidenceButton`, `OpenWitnessButton`
* `ApproveButton`, `RejectButton`, `RequestExceptionButton`
---
## 5.5 APPROVAL DETAIL (`/approvals/:approvalId`)
### `ApprovalDetailPageComponent`
### `ApprovalDetailContainerComponent`
* Loads:
* approval metadata
* diff summary + detail
* gate evaluation + explanations
* reachability witness (preview + links)
* evidence packet / proof chain
* comment thread
**Children:**
* `ApprovalHeaderComponent` (context bar)
* `SplitPaneComponent`
* Left:
* `DiffFirstPanelComponent`
* `GateResultsPanelComponent`
* Right:
* `DecisionPanelComponent` (approve/reject/comment)
* `CommentsPanelComponent`
* `ReachabilityWitnessPanelComponent` (below split)
* `EvidenceQuickPanelComponent`
**Overlays:**
* `GateExplainDrawerComponent`
* `EvidencePacketDrawerComponent`
* `WitnessViewerDrawerComponent` (or open full page)
---
## 5.6 ENVIRONMENTS LIST (`/environments`)
### `EnvironmentsListPageComponent`
### `EnvironmentsListContainerComponent`
* Loads env list with current release, freeze, targets count, policy baseline.
**Children:**
* `EnvironmentsTableComponent`
* cells: current release link, freeze chip, last deploy
---
## 5.7 ENVIRONMENT DETAIL (`/environments/:envId`)
### `EnvironmentDetailPageComponent`
### `EnvironmentDetailContainerComponent`
* Loads:
* env metadata (freeze windows, baseline)
* current release
* target inventory + status
* promotions and deployments history
* drift status
* evidence ledger
**Children:**
* `EnvironmentHeaderComponent`
* `TabbedNavComponent` (router tabs)
* `EnvOverviewTabComponent`
* `EnvTargetsTabComponent`
* `EnvPromotionsTabComponent`
* `EnvDeploymentsTabComponent`
* `EnvDriftTabComponent`
* `EnvEvidenceTabComponent`
**Widgets:**
* `ReleaseLedgerWidgetComponent`
* `TargetsQuickTableComponent`
* `RiskSnapshotWidgetComponent`
---
## 5.8 DEPLOYMENTS LIST (`/deployments`)
### `DeploymentsListPageComponent`
### `DeploymentsListContainerComponent`
**Children:**
* `FilterBarComponent`
* `DeploymentsTableComponent`
* row includes: env, release, duration, status, evidence link
---
## 5.9 DEPLOYMENT DETAIL (`/deployments/:deployId`)
### `DeploymentDetailPageComponent`
### `DeploymentDetailContainerComponent`
* Loads:
* deployment run metadata
* workflow DAG nodes + node logs
* produced artifacts + hashes
* targets results
* evidence packet
**Children:**
* `DeploymentHeaderComponent`
* `TabbedNavComponent`
* `DeploymentWorkflowTabComponent`
* `WorkflowDagWidgetComponent`
* `DeploymentTargetsTabComponent`
* `DeploymentArtifactsTabComponent`
* `ArtifactListComponent` (immutable outputs)
* `DeploymentLogsTabComponent`
* `DeploymentEvidenceTabComponent`
---
## 5.10 EVIDENCE CENTER (`/evidence`)
### `EvidenceCenterPageComponent`
### `EvidenceCenterContainerComponent`
* Loads evidence packets with filters; verification status; export actions.
**Children:**
* `PageHeaderComponent` (Create Audit Bundle / Export)
* `FilterBarComponent`
* `EvidenceTableComponent`
* Optional right detail drawer:
* `EvidencePacketDrawerComponent`
---
## 5.11 EVIDENCE PACKET VIEWER (`/evidence/:evidenceId`)
### `EvidencePacketPageComponent`
### `EvidencePacketContainerComponent`
* Loads header + contents manifest (SBOM, verdict, witness slice, VEX, attestations).
**Children:**
* `EvidencePacketSummaryComponent` (Who/What/Why/How/When)
* `EvidenceContentsListComponent`
* each row uses `EvidenceArtifactRowComponent` with [View] [Download]
* `VerifyEvidencePanelComponent` (signature + Rekor inclusion proofs)
---
## 5.12 SECURITY FINDINGS (`/security/findings`)
### `SecurityFindingsPageComponent`
### `SecurityFindingsContainerComponent`
* Loads findings with reachability + “impacts releases/envs”.
**Children:**
* `FilterBarComponent`
* `FindingsImpactTableComponent`
* `FindingDetailDrawerComponent` (row click)
* witness preview
* VEX status
* exceptions
* “Impacts” list with links to approvals/releases
---
## 5.13 VULNERABILITY DETAIL (`/security/vulnerabilities/:cveId`)
### `VulnerabilityDetailPageComponent`
### `VulnerabilityDetailContainerComponent`
* Loads CVE intel + affected components + deployed impacts + gate impacts + witness summary.
**Children:**
* `VulnerabilityHeaderComponent`
* `ImpactSummaryWidgetComponent`
* `DeployedImpactListComponent`
* `ReachabilitySummaryPanelComponent`
* `FixPathPanelComponent`
* `VexConsensusPanelComponent`
---
## 5.14 WITNESS VIEWER (`/witness/:witnessId`)
### `WitnessPageComponent`
### `WitnessContainerComponent`
* Loads witness graph slice + explanation + exports + replay verification.
**Children:**
* `WitnessHeaderComponent`
* `WitnessPathPreviewComponent`
* `WitnessExplanationPanelComponent`
* `WitnessGraphCollapsedPanelComponent` (expand to graph viewer)
* `WitnessExportActionsComponent` (DOT/Mermaid)
* `ReplayVerifyPanelComponent`
---
# 6) State, services, and API clients (signals-first)
## 6.1 API client pattern
`core/api/`:
* `ApiClient` (wraps HttpClient, error handling, auth headers)
* Feature clients:
* `ReleasesApi`
* `ApprovalsApi`
* `EnvironmentsApi`
* `DeploymentsApi`
* `EvidenceApi`
* `SecurityApi`
* `ReachabilityApi`
* `PolicyApi`
Each returns typed DTOs.
## 6.2 Signal store pattern (recommended)
For each major page/container, create a store service:
Example:
* `ReleaseDetailStore`
* `state = signal<ReleaseDetailState>({...})`
* `release = computed(...)`
* `gateSummary = computed(...)`
* `load(releaseId)` triggers effects + sets loading/error
* `refresh()` re-runs
* `requestPromotion()` command method
Stores live in:
`features/<feature>/state/`
This avoids global NgRx complexity while keeping logic testable.
## 6.3 Cross-cutting stores
* `AppContextStore`
* tenant, user, offline mode, feed snapshot, evidence mode
* `GlobalSearchStore`
* query → aggregated results across types
* `OverlayStore`
* open/close drawers (evidence, witness, gate explain)
---
# 7) Overlays (drawers/modals) to keep pages “small”
These are essential to your “small pages, deep drill-down” requirement.
* `EvidencePacketDrawerComponent`
* opens from anywhere; renders same core as Evidence Packet page but condensed.
* `WitnessDrawerComponent`
* preview witness path + quick export + “open full”
* `GateExplainDrawerComponent`
* show K4 lattice reasoning + rule hits + evidence anchors
* `CreateReleaseModalComponent`
* `RequestPromotionModalComponent`
* `RollbackModalComponent`
* `RequestExceptionModalComponent`
---
# 8) Concrete component inventory (by section)
## Layout (layout/)
* `AppShellComponent`
* `AppTopbarComponent`
* `AppSidebarComponent`
* `BreadcrumbComponent`
* `GlobalSearchComponent`
* `CommandPaletteComponent`
* `ToastHostComponent`
* `OverlayHostComponent`
## Shared domain (shared/domain/)
* `DigestChipComponent`
* `GateBadgeComponent`
* `GateSummaryPanelComponent`
* `ReachabilityStateChipComponent`
* `EvidenceLinkComponent`
* `EvidencePacketSummaryComponent`
* `ProofChainLinkComponent`
* `WitnessPathPreviewComponent`
## Features (features/*)
* `ControlPlanePageComponent` + widgets
* `ReleasesListPageComponent`, `ReleaseDetailPageComponent` + tabs
* `ApprovalsInboxPageComponent`, `ApprovalDetailPageComponent`
* `EnvironmentsListPageComponent`, `EnvironmentDetailPageComponent` + tabs
* `DeploymentsListPageComponent`, `DeploymentDetailPageComponent` + tabs
* `EvidenceCenterPageComponent`, `EvidencePacketPageComponent`
* `SecurityFindingsPageComponent`, `VulnerabilityDetailPageComponent`
* `WitnessPageComponent`
---
# 9) Implementation details that matter (so the UX feels “best-in-class”)
1. **One “context header” pattern**
`PageHeaderComponent` + `ContextChipsRowComponent` (Offline, Snapshot, Policy, Evidence) used everywhere.
2. **Tables are consistent**
One `DataTableComponent<T>` powering releases/approvals/deployments/evidence/findings so keyboard nav, filters, row actions behave identically.
3. **Drawers always open with stable deep links**
Drawer open should push a URL query param (e.g., `?evidence=EVD-...`) so refresh/back works:
* `?evidence=...`
* `?witness=...`
* `?explainGateRun=...`
4. **Diff-first everywhere it matters**
* Approvals: diff summary is always above gates.
* Release detail: security impact summary is above evidence link.
5. **Witness is a product feature, not an internal detail**
Always show: state + confidence + why + export + replay verify.
---

View File

@@ -0,0 +1,425 @@
Below is a **migration map** from your **current route surface (~120+)** to a **canonical release-control-plane IA**, plus a **redirect/alias strategy** designed to **preserve existing deep links**, keep bookmarks working, and **avoid breaking external references** (docs, emails, Slack links, ticket comments, etc.).
Im assuming the **new canonical IA** is:
* **Product flows (what customers do):**
`/` (Control Plane), `/releases`, `/approvals`, `/environments`, `/deployments`, `/security/*`, `/evidence/*`, `/witness/*`
* **Operations (running the platform):**
`/operations/*`
* **Settings (configuration + access control):**
`/settings/*`
* **Policy authoring (still first-class):**
`/policy/*` (instead of `/policy-studio/*`)
If you want to keep `/ops/*` and `/console/*` as canonical, you can—but then your route taxonomy stays inconsistent. The plan below keeps canonical clean **without breaking anything**, by keeping `/ops/*` and `/console/*` as legacy aliases indefinitely.
---
## 0) Canonical new route taxonomy (what were migrating to)
### 0.1 Control plane and release lifecycle
* `/`**Control Plane** (pipeline, pending approvals, drift/risk deltas)
* `/releases` → Releases list
* `/releases/:releaseId` → Release detail (gates, diff, evidence, proof chain)
* `/approvals` → Approvals inbox
* `/approvals/:approvalId` → Approval detail (diff-first + decision + evidence)
* `/environments` → Environments
* `/environments/:envId` → Environment detail
* `/deployments` → Deployments list
* `/deployments/:deployId` → Deployment detail (workflow DAG + artifacts + evidence)
### 0.2 Security (scanner heritage becomes “gate inputs”)
* `/security/overview` → Security overview dashboard (old Home dashboard preserved here)
* `/security/findings` → Findings (impact-to-release, reachability chips)
* `/security/scans/:scanId` → Scan run detail
* `/security/vulnerabilities` → CVE explorer
* `/security/vulnerabilities/:cveId` → CVE detail
* `/security/sbom/graph` → SBOM graph explorer
* `/security/lineage` → Lineage/compare (global)
* `/security/reachability` → Reachability center
* `/security/vex` → VEX hub (no longer under `/admin`)
* `/security/unknowns` → Unknowns tracking
* `/security/patch-map` → Patch map
### 0.3 Evidence and verification
* `/evidence` → Evidence center (packets, bundles, export, replay, provenance)
* `/evidence/:evidenceId` → Evidence packet viewer
* `/evidence/packs` and `/evidence/packs/:packId` → Evidence packs
* `/evidence/proofs/:subjectDigest` → Proof chain viewer
* `/witness/:witnessId` → Witness viewer (reachability slice + replay/verify)
### 0.4 Policy (rename, but keep semantics)
* `/policy/packs` (list)
* `/policy/packs/:packId/editor`
* `/policy/packs/:packId/yaml`
* `/policy/packs/:packId/simulate`
* `/policy/packs/:packId/approvals`
* `/policy/packs/:packId/rules`
* `/policy/packs/:packId/explain/:runId`
* `/policy/packs/:packId/dashboard`
* `/policy/exceptions` (exception queue + approvals)
### 0.5 Operations
* `/operations/orchestrator` (+ jobs, quotas)
* `/operations/quotas/*`
* `/operations/dead-letter/*`
* `/operations/slo/*`
* `/operations/health/*`
* `/operations/feeds/*`
* `/operations/offline-kit/*`
* `/operations/aoc/*`
* `/operations/scheduler/*`
* `/operations/doctor`
### 0.6 Settings
* `/settings/profile`
* `/settings/integrations/*` (hub + detail + activity)
* `/settings/admin/*` (tenants/users/roles/clients/tokens/branding)
* `/settings/trust/*` (keys/issuers/certs/score-config/audit)
* `/settings/registries` (registry token service)
* `/settings/notifications/*`
* `/settings/policy/governance`
* `/settings/sbom-sources`
* `/settings/trivy-db` (or fold into feeds)
---
# 1) Migration principles (minimize breaking links)
**Principle A — Keep old links working forever:**
Every old route either:
* **Redirects** to the new canonical route, or
* Remains as an **alias** that renders the same page/module.
**Principle B — Preserve identifiers and semantics:**
If `:scanId`, `:packId`, `:subjectDigest` exist today, do not change their format. New routes simply “re-home” them.
**Principle C — Use redirects only when mapping is 1:1:**
If old route needs **query params** (e.g., “filter type=audit”), use a **guard-based redirect** returning a `UrlTree` (so you can append query parameters safely).
**Principle D — Track legacy usage:**
Add telemetry: whenever a legacy route is hit, record `{ oldPath, newPath }`. This lets you quantify remaining legacy usage.
---
# 2) Old → new route migration map
Each entry includes: **Old route → New canonical route** + **strategy**.
Legend:
* **KEEP** = route stays as-is (canonical already good)
* **REDIRECT** = Angular router redirect (1:1 mapping)
* **SMART REDIRECT** = redirect via guard/matcher to add query params/open specific view
* **ALIAS** = old route still loads same module/component as new (no visible URL change)
---
## 2.1 Home & dashboard routes
| Old Route | New Route | Strategy | Notes |
| -------------------- | ------------------- | ---------------------- | ------------------------------------------------------------------------------------------ |
| `/` | `/` | KEEP (content changes) | Home becomes **Control Plane**. Preserve old “security dashboard” as `/security/overview`. |
| `/welcome` | `/welcome` | KEEP | Usually public. Keep stable. |
| `/dashboard/sources` | `/operations/feeds` | REDIRECT | Old “sources dashboard” becomes operational view of feeds/mirrors. |
Add a prominent navigation link: **Security Overview**`/security/overview` to avoid “we removed my dashboard” backlash.
---
## 2.2 Analyze routes → Security namespace
| Old Route | New Route | Strategy | Notes |
| ---------------------------------- | -------------------------------------- | ----------------- | --------------------------------------------------------------------- |
| `/findings` | `/security/findings` | REDIRECT | Findings become security impact-to-release view. |
| `/findings/:scanId` | `/security/scans/:scanId` | REDIRECT | Preserve deep links; scan detail page remains. |
| `/vulnerabilities` | `/security/vulnerabilities` | REDIRECT | CVE explorer moved under security. |
| `/vulnerabilities/:vulnId` | `/security/vulnerabilities/:vulnId` | REDIRECT | 1:1 mapping. |
| `/graph` | `/security/sbom/graph` | REDIRECT | SBOM graph belongs under Security. |
| `/lineage` | `/security/lineage` | REDIRECT | (Or `/releases/lineage`, choose one canonical; I recommend Security.) |
| `/lineage/:artifact/compare` | `/security/lineage/:artifact/compare` | ALIAS or REDIRECT | Keep params same. |
| `/lineage/compare` | `/security/lineage/compare` | REDIRECT | Stable. |
| `/reachability` | `/security/reachability` | REDIRECT | Reachability center is security analysis. |
| `/admin/vex-hub` | `/security/vex` | REDIRECT | VEX is not “admin-only”; move. |
| `/admin/vex-hub/search` | `/security/vex/search` | REDIRECT | Keep identical subroutes. |
| `/admin/vex-hub/search/detail/:id` | `/security/vex/search/detail/:id` | REDIRECT | 1:1. |
| `/admin/vex-hub/stats` | `/security/vex/stats` | REDIRECT | 1:1. |
| `/admin/vex-hub/consensus` | `/security/vex/consensus` | REDIRECT | 1:1. |
| `/admin/vex-hub/explorer` | `/security/vex/explorer` | REDIRECT | 1:1. |
| `/analyze/unknowns` | `/security/unknowns` | REDIRECT | 1:1. |
| `/analyze/patch-map` | `/security/patch-map` | REDIRECT | 1:1. |
| `/scans/:scanId` | `/security/scans/:scanId` | REDIRECT | Consolidate scan detail here. |
| `/compare/:currentId` | `/security/lineage/compare/:currentId` | REDIRECT | Preserve compare deep links. |
| `/cvss/receipts/:receiptId` | `/evidence/receipts/cvss/:receiptId` | REDIRECT | CVSS receipt is an **evidence artifact**. |
---
## 2.3 Triage routes → split between Security (artifact triage) and Policy/Evidence
| Old Route | New Route | Strategy | Notes |
| ------------------------------- | ---------------------------------- | -------------- | ------------------------------------------------------------------------------------------- |
| `/triage/artifacts` | `/security/artifacts` | REDIRECT | “Artifact workspace” becomes security artifact index (digest-first). |
| `/triage/artifacts/:artifactId` | `/security/artifacts/:artifactId` | REDIRECT | Preserve the triage workspace; it becomes “Artifact Detail”. |
| `/exceptions` | `/policy/exceptions` | REDIRECT | Exceptions are governance controls for gates. |
| `/triage/audit-bundles` | `/evidence?type=audit` | SMART REDIRECT | Needs query param. Alternatively create `/evidence/bundles/audit` to allow simple redirect. |
| `/triage/audit-bundles/new` | `/evidence/bundles/new?type=audit` | SMART REDIRECT | Needs query param. |
| `/risk` | `/security/risk` | REDIRECT | Risk dashboard becomes security analytics. |
**Recommendation to reduce SMART redirects:** create explicit canonical paths:
* `/evidence/bundles/audit`
* `/evidence/bundles/release`
* `/evidence/bundles/scan`
Then redirects are trivial and do not require query injection.
---
## 2.4 Policy routes (`/policy-studio/*` → `/policy/*`)
| Old Route | New Route | Strategy | Notes |
| --------------------------------------------- | -------------------------------------- | -------- | -------------------- |
| `/policy-studio/packs` | `/policy/packs` | REDIRECT | Rename for brevity. |
| `/policy-studio/packs/:packId/editor` | `/policy/packs/:packId/editor` | REDIRECT | 1:1. |
| `/policy-studio/packs/:packId/yaml` | `/policy/packs/:packId/yaml` | REDIRECT | 1:1. |
| `/policy-studio/packs/:packId/simulate` | `/policy/packs/:packId/simulate` | REDIRECT | 1:1. |
| `/policy-studio/packs/:packId/approvals` | `/policy/packs/:packId/approvals` | REDIRECT | 1:1. |
| `/policy-studio/packs/:packId/rules` | `/policy/packs/:packId/rules` | REDIRECT | 1:1. |
| `/policy-studio/packs/:packId/explain/:runId` | `/policy/packs/:packId/explain/:runId` | REDIRECT | 1:1. |
| `/policy-studio/packs/:packId/dashboard` | `/policy/packs/:packId/dashboard` | REDIRECT | 1:1. |
| `/orchestrator` | `/operations/orchestrator` | REDIRECT | Orchestrator is ops. |
| `/orchestrator/jobs` | `/operations/orchestrator/jobs` | REDIRECT | 1:1. |
| `/orchestrator/jobs/:jobId` | `/operations/orchestrator/jobs/:jobId` | REDIRECT | 1:1. |
| `/orchestrator/quotas` | `/operations/orchestrator/quotas` | REDIRECT | 1:1. |
---
## 2.5 Ops routes (`/ops/*` + `/scheduler/*` → `/operations/*`)
| Old Route | New Route | Strategy | Notes |
| ------------------------------------- | -------------------------------------- | ----------------- | ---------------------------------------------------------------------------------------- |
| `/sbom-sources` | `/settings/sbom-sources` | REDIRECT | This is configuration, not ops. |
| `/ops/quotas` | `/operations/quotas` | REDIRECT | 1:1. |
| `/ops/quotas/tenants` | `/operations/quotas/tenants` | REDIRECT | 1:1. |
| `/ops/quotas/tenants/:tenantId` | `/operations/quotas/tenants/:tenantId` | REDIRECT | 1:1. |
| `/ops/quotas/throttle` | `/operations/quotas/throttle` | REDIRECT | 1:1. |
| `/ops/quotas/alerts` | `/operations/quotas/alerts` | REDIRECT | 1:1. |
| `/ops/quotas/forecast` | `/operations/quotas/forecast` | REDIRECT | 1:1. |
| `/ops/quotas/reports` | `/operations/quotas/reports` | REDIRECT | 1:1. |
| `/ops/orchestrator/dead-letter` | `/operations/dead-letter` | REDIRECT | Flatten path; keep subroute for queue. |
| `/ops/orchestrator/dead-letter/queue` | `/operations/dead-letter/queue` | REDIRECT | 1:1. |
| `/ops/orchestrator/slo` | `/operations/slo` | REDIRECT | 1:1. |
| `/ops/orchestrator/slo/alerts` | `/operations/slo/alerts` | REDIRECT | 1:1. |
| `/ops/orchestrator/slo/definitions` | `/operations/slo/definitions` | REDIRECT | 1:1. |
| `/ops/health` | `/operations/health` | REDIRECT | 1:1. |
| `/ops/feeds` | `/operations/feeds` | REDIRECT | 1:1. |
| `/ops/feeds/mirror/:mirrorId` | `/operations/feeds/mirror/:mirrorId` | REDIRECT | 1:1. |
| `/ops/feeds/airgap/import` | `/operations/feeds/airgap/import` | REDIRECT | 1:1. |
| `/ops/feeds/airgap/export` | `/operations/feeds/airgap/export` | REDIRECT | 1:1. |
| `/ops/feeds/version-locks` | `/operations/feeds/version-locks` | REDIRECT | 1:1. |
| `/ops/offline-kit/*` | `/operations/offline-kit/*` | ALIAS or REDIRECT | Either keep the segment name to avoid churn, or canonicalize to `/operations/offline/*`. |
| `/ops/aoc/*` | `/operations/aoc/*` | REDIRECT | Keep short; avoid nested `/compliance/` unless you really need it. |
| `/ops/doctor` | `/operations/doctor` | REDIRECT | 1:1. |
| `/scheduler/*` | `/operations/scheduler/*` | REDIRECT | Fix inconsistent prefix. |
| `/ops/scanner/*` | `/operations/scanner/*` | REDIRECT | Scanner ops is now “security gate engine ops”. |
---
## 2.6 Notify
| Old Route | New Route | Strategy | Notes |
| --------- | --------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- |
| `/notify` | `/operations/notifications` | REDIRECT | If `/notify` is history/dispatch, it belongs to operations. If it is configuration, redirect to `/settings/notifications`. |
---
## 2.7 Admin + Console routes → Settings namespace
| Old Route | New Route | Strategy | Notes |
| ------------------------------ | ------------------------------- | -------- | ---------------------------------------------------------- |
| `/console/profile` | `/settings/profile` | REDIRECT | Consolidate under settings. |
| `/console/status` | `/operations/status` | REDIRECT | Status is ops. |
| `/console/configuration` | `/settings/integrations` | REDIRECT | Configuration pane becomes integrations hub. |
| `/console/admin/tenants` | `/settings/admin/tenants` | REDIRECT | 1:1. |
| `/console/admin/users` | `/settings/admin/users` | REDIRECT | 1:1. |
| `/console/admin/roles` | `/settings/admin/roles` | REDIRECT | 1:1. |
| `/console/admin/clients` | `/settings/admin/clients` | REDIRECT | 1:1. |
| `/console/admin/tokens` | `/settings/admin/tokens` | REDIRECT | 1:1. |
| `/console/admin/audit` | `/evidence/audit` | REDIRECT | Audit is evidence. |
| `/console/admin/branding` | `/settings/admin/branding` | REDIRECT | 1:1. |
| `/admin/audit/*` | `/evidence/audit/*` | REDIRECT | Unified audit log belongs under evidence. |
| `/admin/trust/*` | `/settings/trust/*` | REDIRECT | Keys/issuers/certs/score config consolidated. |
| `/admin/registries` | `/settings/registries` | REDIRECT | Registry token service is configuration. |
| `/admin/issuers` | `/settings/trust/issuers` | REDIRECT | Fold into trust. |
| `/admin/notifications` | `/settings/notifications/admin` | REDIRECT | Admin notifications config. |
| `/admin/policy/governance` | `/settings/policy/governance` | REDIRECT | Governance is configuration. |
| `/admin/policy/simulation` | `/policy/simulation` | REDIRECT | Or keep `/settings/policy/simulation` if truly admin-only. |
| `/concelier/trivy-db-settings` | `/settings/trivy-db` | REDIRECT | Or fold into `/operations/feeds/trivy`. |
---
## 2.8 Release Orchestrator routes (`/release-orchestrator/*` → lifecycle roots)
| Old Route | New Route | Strategy | Notes |
| ------------------------------------ | --------------------------------------- | -------------- | ------------------------------------------------------------------------------- |
| `/release-orchestrator` | `/` | REDIRECT | Control plane becomes the orchestrator home. |
| `/release-orchestrator/environments` | `/environments` | REDIRECT | 1:1. |
| `/release-orchestrator/releases` | `/releases` | REDIRECT | 1:1. |
| `/release-orchestrator/workflows` | `/workflows` (or `/settings/workflows`) | REDIRECT | Decide: if workflows are editable config → settings; if used daily → top-level. |
| `/release-orchestrator/approvals` | `/approvals` | REDIRECT | 1:1. |
| `/release-orchestrator/deployments` | `/deployments` | REDIRECT | 1:1. |
| `/release-orchestrator/evidence` | `/evidence?type=release` | SMART REDIRECT | Better to create `/evidence/bundles/release` for simple redirect. |
---
## 2.9 Evidence routes (mostly keep)
| Old Route | New Route | Strategy | Notes |
| ------------------------- | --------------------------------- | ------------------- | -------------------------------------------------------- |
| `/evidence` | `/evidence` | KEEP | Already good. |
| `/evidence/bundles` | `/evidence` | ALIAS or REDIRECT | If you keep tabbed routes, you can keep it as alias. |
| `/evidence/export` | `/evidence/export` | KEEP | Stable. |
| `/evidence/replay` | `/evidence/replay` | KEEP | Stable. |
| `/evidence/provenance` | `/evidence/provenance` | KEEP | Stable. |
| `/evidence-packs` | `/evidence/packs` | REDIRECT | Normalize under evidence namespace. |
| `/evidence-packs/:packId` | `/evidence/packs/:packId` | REDIRECT | 1:1. |
| `/proofs/:subjectDigest` | `/evidence/proofs/:subjectDigest` | ALIAS (recommended) | Keep `/proofs/*` forever as a public-friendly shortlink. |
---
## 2.10 Integrations routes → Settings
| Old Route | New Route | Strategy | Notes |
| ------------------------------ | --------------------------------------- | -------- | ----------------------------------------------------------- |
| `/integrations` | `/settings/integrations` | REDIRECT | Canonicalize. |
| `/integrations/registries` | `/settings/integrations/registries` | REDIRECT | 1:1. |
| `/integrations/scm` | `/settings/integrations/scm` | REDIRECT | 1:1. |
| `/integrations/ci` | `/settings/integrations/ci` | REDIRECT | 1:1. |
| `/integrations/hosts` | `/settings/integrations/hosts` | REDIRECT | 1:1. |
| `/integrations/feeds` | `/settings/integrations/feeds` | REDIRECT | 1:1. |
| `/integrations/activity` | `/settings/integrations/activity` | REDIRECT | Or move to `/operations/integrations/activity` if you want. |
| `/integrations/:integrationId` | `/settings/integrations/:integrationId` | REDIRECT | 1:1. |
---
## 2.11 Other routes
| Old Route | New Route | Strategy | Notes |
| ----------------- | ---------------------------- | -------- | ----------------------------------------- |
| `/ai-runs` | `/operations/ai-runs` | REDIRECT | AI runs are operational telemetry. |
| `/ai-runs/:runId` | `/operations/ai-runs/:runId` | REDIRECT | 1:1. |
| `/change-trace` | `/evidence/change-trace` | REDIRECT | Change trace is evidence lineage. |
| `/setup` | `/setup` | KEEP | Installation wizard should remain stable. |
| `/auth/callback` | `/auth/callback` | KEEP | Must remain stable for OIDC. |
---
# 3) Redirect strategy (implementation plan that wont bite you)
## 3.1 Use a dedicated “Legacy Routes” layer (lowest priority in router)
**Order matters.** Put all legacy redirects **after** the new canonical route tree so you dont accidentally intercept new paths.
* `app.routes.ts`
1. New canonical routes
2. Legacy redirect/alias routes
3. `**` fallback
## 3.2 Three redirect mechanisms (use the right one)
### Mechanism 1 — Simple static redirect (`redirectTo`)
Use when mapping is clean and 1:1:
* `/findings``/security/findings`
* `/release-orchestrator/releases``/releases`
### Mechanism 2 — Param redirect (`redirectTo` with `:param`)
Use when its still 1:1 but has params:
* `/vulnerabilities/:vulnId``/security/vulnerabilities/:vulnId`
* `/findings/:scanId``/security/scans/:scanId`
### Mechanism 3 — SMART redirect (guard/matcher returning a UrlTree)
Use when you must:
* Add query params (e.g., `type=audit`)
* Switch tabs
* Open a drawer based on route
Examples:
* `/triage/audit-bundles``/evidence?type=audit`
* `/release-orchestrator/evidence``/evidence?type=release`
**Strong recommendation:** Avoid SMART redirects by giving evidence bundle types **real paths**:
* `/evidence/bundles/audit`
* `/evidence/bundles/release`
Then you can use simple redirects and remove complexity.
## 3.3 Preserve query params and fragments always
Legacy URLs in tickets often include query params. Your redirect logic must preserve:
* `?tab=...`
* `?filters=...`
* `#anchor`
In Angular, **guard-based UrlTree** redirects are the most reliable way to preserve and augment query params intentionally.
## 3.4 Keep “short links” as permanent aliases
Some paths are extremely convenient and should remain:
* `/proofs/:subjectDigest` (keep forever, even if canonical is under `/evidence/proofs/...`)
* Potentially `/deploy/:id` if you ever add it
This reduces friction when humans share links.
## 3.5 Add a “Legacy URL” banner (optional but useful)
On legacy-rendered aliases (not redirects), show a slim banner:
* “This URL has moved. Update bookmarks.”
* Button: “Go to new location”
* Include one-click copy of canonical URL
This is very effective during the transition without forcing redirects.
## 3.6 Instrument legacy hits
Emit a telemetry event:
* `legacy_route_hit`
* `oldPath`
* `newPath`
* `tenantId`
* `userId` (if available)
* `timestamp`
This tells you when its safe to remove legacy routes (if you ever choose to).
---
# 4) Practical redirect coverage checklist (to prevent surprises)
Before shipping, test these as **direct loads** (not SPA navigation):
1. `/admin/vex-hub/search/detail/123` loads and lands on `/security/vex/search/detail/123`
2. `/findings/SCAN-123` lands on scan detail
3. `/proofs/sha256:...` still works and lands on proof viewer
4. `/release-orchestrator/environments` lands on `/environments`
5. `/triage/audit-bundles` lands on the correct evidence bundle view (no empty state)
---