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:
535
docs-archived/ui-analysis/rework/01-ui-rework-adivsory.md
Normal file
535
docs-archived/ui-analysis/rework/01-ui-rework-adivsory.md
Normal 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**.
|
||||
|
||||
I’m 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 re‑framing** 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.”
|
||||
That’s 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 they’re **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 it’s 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 you’re 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 (what’s 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; what’s 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 doesn’t)
|
||||
|
||||
Reachability is not a separate “center” for most users. It’s 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 1–2 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.”
|
||||
|
||||
That’s 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 2–3 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. That’s 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.
|
||||
|
||||
---
|
||||
435
docs-archived/ui-analysis/rework/02-wireframes.md
Normal file
435
docs-archived/ui-analysis/rework/02-wireframes.md
Normal 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.
|
||||
|
||||
I’m 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: **what’s deployed where**, **what’s 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:00–20: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 ] │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
@@ -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**.
|
||||
|
||||
I’m 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 Stella’s 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.
|
||||
|
||||
---
|
||||
|
||||
|
||||
425
docs-archived/ui-analysis/rework/04-migration-map.md
Normal file
425
docs-archived/ui-analysis/rework/04-migration-map.md
Normal 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.).
|
||||
|
||||
I’m 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 we’re 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 won’t 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 don’t 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 it’s 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 it’s 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)
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user