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**:
* ``
* ``
* ``
* ``
* ``
* ``
* `` (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`
* 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({...})`
* `release = computed(...)`
* `gateSummary = computed(...)`
* `load(releaseId)` triggers effects + sets loading/error
* `refresh()` re-runs
* `requestPromotion()` command method
Stores live in:
`features//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` 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.
---