Triage Component Catalog

Version: 1.0 Status: Active Last Updated: 2025-12-26 Sprint: SPRINT_20251226_014_DOCS_triage_consolidation

Overview

This document catalogs all Angular components used in the unified triage experience, including the Smart-Diff Compare View, Triage Canvas, and Risk Dashboard. Each component is documented with its responsibilities, inputs/outputs, and relationships.

Component Hierarchy

src/Web/StellaOps.Web/src/app/
├── features/
│   ├── triage/
│   │   ├── triage-canvas/
│   │   │   ├── triage-canvas.component.ts          [Container]
│   │   │   ├── triage-list.component.ts
│   │   │   ├── triage-detail.component.ts
│   │   │   ├── ai-recommendation-panel.component.ts
│   │   │   ├── vex-decision-modal.component.ts
│   │   │   └── vex-history.component.ts
│   │   └── compare/
│   │       ├── compare-view.component.ts           [Container]
│   │       ├── baseline-selector.component.ts
│   │       ├── trust-indicators.component.ts
│   │       ├── delta-summary-strip.component.ts
│   │       ├── three-pane-layout.component.ts
│   │       ├── categories-pane.component.ts
│   │       ├── items-pane.component.ts
│   │       ├── proof-pane.component.ts
│   │       └── export-actions.component.ts
│   ├── risk-budget/
│   │   ├── risk-dashboard.component.ts             [Container]
│   │   ├── burn-up-chart.component.ts
│   │   ├── unknowns-heatmap.component.ts
│   │   ├── delta-table.component.ts
│   │   ├── exception-ledger.component.ts
│   │   └── kpi-tiles.component.ts
│   └── vulnerabilities/
│       └── vulnerability-detail.component.ts
└── shared/
    └── components/
        ├── confidence-badge.component.ts
        ├── determinism-badge.component.ts
        ├── severity-indicator.component.ts
        └── evidence-chain.component.ts

Container Components

TriageCanvasComponent

Location: features/triage/triage-canvas/triage-canvas.component.ts Sprint: SPRINT_20251226_013_FE Status: TODO

Purpose: Main container for the unified triage experience. Orchestrates list, detail, and decision panels.

Inputs:

NameTypeDescription
initialVulnIdstring?Pre-select vulnerability by ID
environmentstring?Filter by environment

Outputs:

NameTypeDescription
triageCompleteEventEmitterEmitted when triage decision saved
queueExhaustedEventEmitterEmitted when all items triaged

Child Components:


CompareViewComponent

Location: features/triage/compare/compare-view.component.ts Sprint: SPRINT_20251226_012_FE Status: TODO

Purpose: Three-pane Smart-Diff comparison view with baseline selection and proof display.

Inputs:

NameTypeDescription
currentDigeststringDigest of current scan
baselineDigeststring?Digest of baseline (auto-selected if not provided)

Outputs:

NameTypeDescription
baselineChangedEventEmitterNew baseline selected
exportRequestedEventEmitterExport action triggered

Child Components:


RiskDashboardComponent

Location: features/risk-budget/risk-dashboard.component.ts Sprint: SPRINT_20251226_004_FE Status: TODO

Purpose: Risk budget visualization with burn-up charts, heatmaps, and exception ledger.

Inputs:

NameTypeDescription
serviceIdstringService to display budget for
windowBudgetWindowBudget window (monthly, weekly)

Outputs:

NameTypeDescription
exceptionCreatedEventEmitterNew exception added
thresholdAlertEventEmitterBudget threshold crossed

Child Components:


Presentation Components

TriageListComponent

Location: features/triage/triage-canvas/triage-list.component.ts Sprint: SPRINT_20251226_013_FE Status: TODO

Purpose: Paginated, filterable list of vulnerabilities for triage.

Inputs:

NameTypeDescription
vulnerabilitiesVulnerability[]List of vulnerabilities
selectedIdstring?Currently selected vulnerability
filtersTriageFiltersActive filters

Outputs:

NameTypeDescription
selectionChangeEventEmitterVulnerability selected
bulkActionEventEmitterBulk triage requested

Features:


VexDecisionModalComponent

Location: features/triage/triage-canvas/vex-decision-modal.component.ts Sprint: SPRINT_20251226_013_FE Status: TODO

Purpose: Modal for creating/editing VEX decisions with full form controls.

Inputs:

NameTypeDescription
vulnerabilityVulnerabilityTarget vulnerability
existingDecisionVexDecision?Decision to edit
suggestedJustificationstring?AI-suggested justification

Outputs:

NameTypeDescription
saveEventEmitterDecision saved
cancelEventEmitterModal cancelled

Form Fields:


ThreePaneLayoutComponent

Location: features/triage/compare/three-pane-layout.component.ts Sprint: SPRINT_20251226_012_FE Status: TODO

Purpose: Responsive three-column layout for Categories, Items, and Proof panes.

Inputs:

NameTypeDescription
deltaDeltaComputed delta with items
selectedCategoryCategory?Currently selected category
selectedItemDeltaItem?Currently selected item

Outputs:

NameTypeDescription
categorySelectedEventEmitterCategory clicked
itemSelectedEventEmitterItem clicked

Layout Behavior:


BurnUpChartComponent

Location: features/risk-budget/burn-up-chart.component.ts Sprint: SPRINT_20251226_004_FE Status: TODO

Purpose: Risk budget burn-up chart showing budget line vs actual risk over time.

Inputs:

NameTypeDescription
budgetDataBudgetTimeSeriesHistorical budget data
releaseDateDateTarget release date
showMarkersbooleanShow milestone markers

Outputs:

NameTypeDescription
pointClickedEventEmitterChart point clicked

Chart Features:


Shared Components

ConfidenceBadgeComponent

Location: shared/components/confidence-badge.component.ts Status: COMPLETE

Purpose: Displays confidence level with color-coded visual indicator.

Inputs:

NameTypeDescription
confidencenumber0-1 confidence value
showValuebooleanDisplay numeric value

DeterminismBadgeComponent

Location: shared/components/determinism-badge.component.ts Status: COMPLETE

Purpose: Shows determinism status with hash verification.

Inputs:

NameTypeDescription
hashstringDeterminism hash
verifiedbooleanHash verification status
copyablebooleanShow copy button

Service Layer

TriageService

Location: core/services/triage.service.ts Sprint: SPRINT_20251226_013_FE

Methods:

getVulnerabilities(filters: TriageFilters): Observable<Page<Vulnerability>>
getVulnerability(id: string): Observable<Vulnerability>
getReachability(id: string): Observable<CallGraphSlice>

VexDecisionService

Location: core/services/vex-decision.service.ts Sprint: SPRINT_20251226_013_FE

Methods:

create(decision: CreateVexDecision): Observable<VexDecision>
update(id: string, decision: UpdateVexDecision): Observable<VexDecision>
getHistory(vulnId: string): Observable<VexDecision[]>

CompareService

Location: core/services/compare.service.ts Sprint: SPRINT_20251226_012_FE

Methods:

getBaselineRecommendations(digest: string): Observable<BaselineRecommendation[]>
computeDelta(current: string, baseline: string): Observable<Delta>
getTrustIndicators(deltaId: string): Observable<TrustIndicators>

RiskBudgetService

Location: core/services/risk-budget.service.ts Sprint: SPRINT_20251226_004_FE

Methods:

getBudgetStatus(serviceId: string): Observable<BudgetStatus>
getBurnUpData(serviceId: string, window: BudgetWindow): Observable<BudgetTimeSeries>
createException(exception: CreateException): Observable<Exception>

Interaction Diagrams

Triage Flow

User Action                    Component                      Service
    │                             │                              │
    │ Select vulnerability        │                              │
    ├────────────────────────────►│ TriageListComponent          │
    │                             ├─────────────────────────────►│
    │                             │                              │ getVulnerability()
    │                             │◄─────────────────────────────┤
    │                             │                              │
    │                             │ TriageDetailComponent        │
    │                             ├─────────────────────────────►│
    │                             │                              │ getReachability()
    │                             │◄─────────────────────────────┤
    │                             │                              │
    │ Click "Mark Not Affected"   │                              │
    ├────────────────────────────►│ VexDecisionModalComponent    │
    │                             │                              │
    │ Submit form                 │                              │
    ├────────────────────────────►│                              │
    │                             ├─────────────────────────────►│
    │                             │                              │ VexDecisionService.create()
    │                             │◄─────────────────────────────┤
    │                             │                              │
    │                             │ Update list, advance queue   │
    │◄────────────────────────────┤                              │

Compare Flow

User Action                    Component                      Service
    │                             │                              │
    │ Navigate to /compare/:id    │                              │
    ├────────────────────────────►│ CompareViewComponent         │
    │                             ├─────────────────────────────►│
    │                             │                              │ getBaselineRecommendations()
    │                             │◄─────────────────────────────┤
    │                             │                              │
    │                             │ Auto-select baseline         │
    │                             ├─────────────────────────────►│
    │                             │                              │ computeDelta()
    │                             │◄─────────────────────────────┤
    │                             │                              │
    │                             │ ThreePaneLayoutComponent     │
    │                             │  ├ CategoriesPaneComponent   │
    │                             │  ├ ItemsPaneComponent        │
    │                             │  └ ProofPaneComponent        │
    │                             │                              │
    │ Select category             │                              │
    ├────────────────────────────►│                              │
    │                             │ Filter items by category     │
    │                             │                              │
    │ Select item                 │                              │
    ├────────────────────────────►│                              │
    │                             │ Display proof in right pane  │
    │◄────────────────────────────┤                              │

Accessibility Requirements

All triage components must meet WCAG 2.1 AA compliance:

RequirementImplementation
Keyboard navigationTab/Arrow/Enter/Escape, documented shortcuts
Focus managementVisible focus indicators, logical tab order
Screen readerARIA labels, live regions for updates
Color contrast4.5:1 minimum for text, 3:1 for UI elements
Error messagesAssociated with inputs, announced immediately

Testing Requirements

Unit Tests

Integration Tests

E2E Tests (Playwright)


References