Unified Triage Experience Specification

Version: 1.0 Status: Active Last Updated: 2025-12-26 Consolidated From: 3 product advisories (see References)

1. Executive Summary

The Problem

Modern container security generates overwhelming vulnerability data. Competitors offer fragmented solutions: Snyk provides reachability analysis, Anchore offers VEX annotations, Prisma Cloud delivers runtime signals. Security teams must context-switch between tools, losing precious time and context.

The Stella Ops Solution

A unified triage canvas that combines:

2. Competitive Landscape

Snyk — Reachability + Continuous Context

Anchore — Vulnerability Annotations + VEX Export

Prisma Cloud — Runtime Defense

Stella Ops Differentiation

FeatureSnykAnchorePrismaStella Ops
Reachability analysisYesPartialNoYes (static + binary + runtime)
VEX as policy objectsNoExport onlyNoFirst-class
Attestable exceptionsNoNoNoYes (DSSE)
Offline replayNoNoNoYes
AI-assisted triageYesNoNoYes (AdvisoryAI)
Evidence graphsPartialNoPartialFull chain

3. Core UI Concepts

3.1 Visual Diff Pattern

Every policy decision or reachability change is treated as a visual diff, enabling quick, explainable triage.

Side-by-Side Panes

Evidence Strip (Right Rail)

Human-readable facts used by the engine:

Diff Verdict Header

Risk ↓ from Medium → Low (policy v1.8 → v1.9)

Filter Chips

Scope by: component, package, CVE, policy rule, environment

3.2 Data Models

interface GraphSnapshot {
  nodes: GraphNode[];
  edges: GraphEdge[];
  metadata: { component: string; version: string; tags: string[] };
}

interface PolicySnapshot {
  version: string;
  rulesHash: string;
  inputs: { flags: Record<string, boolean>; env: string; vexSources: string[] };
}

interface Delta {
  added: DeltaItem[];
  removed: DeltaItem[];
  changed: DeltaItem[];
  ruleOutcomes: RuleOutcomeDelta[];
}

interface EvidenceItem {
  type: 'trace_hit' | 'sbom_line' | 'vex_claim' | 'config_value';
  source: string;
  digest: string;
  excerpt: string;
  timestamp: string;
}

interface SignedDeltaVerdict {
  status: 'routine' | 'review' | 'block';
  signatures: Signature[];
  producer: string;
}

3.3 Micro-Interactions

InteractionBehavior
Hover changed nodeInline badge explaining “why it changed”
Click rule in railSpotlight the exact subgraph affected
Toggle “explain like I’m new”Expands jargon into plain language
One-click “copy audit bundle”Exports delta + evidence as attachment

3.4 Keyboard Shortcuts

KeyAction
1Focus changes only
2Show full graph
EExpand evidence
AExport audit bundle
NNext item in queue
PPrevious item
MMark not affected

4. Risk Budget Visualization

4.1 Concept

4.2 Dashboard Components

Heatmap of Unknowns

ComponentVulnsCompliancePerfDataSupply Chain
Service A🟡 12🟢 0🟡 3🔴 8🟡 5
Service B🔴 24🟡 2🟢 1🟡 4🟢 0

Cell value = unknowns count × severity weight

Delta Table (Risk Decay per Release)

ReleaseBeforeAfterRetiredShiftedUnknowns
v2.3.18567-22+412
v2.3.09285-15+818

Exception Ledger

Every accepted risk has: ID, owner, expiry, evidence note, auto-reminder.

4.3 Risk Budget Burn-Up Chart

Risk Points
    ^
100 |__________ Budget Line (flat or stepped)
    |         \
 80 |          \  ← Actual Risk (cumulative)
    |           \
 60 |            \_____ Headroom (green)
    |                 \
 40 |                  \__ Target by release
    |
    +---------------------------------> Time
         T-30    T-14   T-7   T-2   Release

4.4 Computation Formulas

// Risk points per issue
risk_points = severity_weight × exposure_factor × evidence_freshness_penalty

// Unknown penalty (no evidence ≤ N days)
if (days_since_evidence > threshold) {
  risk_points *= 1.5; // multiplier
}

// Decay on fix
if (fix_landed && evidence_refreshed) {
  subtract_points(issue.risk_points);
}

// Guardrails
if (unknowns > K || actual_risk > budget) {
  fail_gate();
}

5. Implementation Components

5.1 Component Hierarchy

TriageCanvasComponent
├── TriageListComponent
│   ├── SeverityFilterComponent
│   ├── VulnerabilityRowComponent
│   └── BulkActionBarComponent
├── TriageDetailComponent
│   ├── AffectedPackagesPanel
│   ├── AdvisoryRefsPanel
│   ├── ReachabilityContextComponent
│   └── EvidenceProvenanceComponent
├── AiRecommendationPanel
│   ├── ReachabilityExplanation
│   ├── SuggestedJustification
│   └── SimilarVulnsComponent
├── VexDecisionModalComponent
│   ├── StatusSelector
│   ├── JustificationTypeSelector
│   ├── EvidenceRefInput
│   └── ScopeSelector
└── VexHistoryComponent

CompareViewComponent
├── BaselineSelectorComponent
├── TrustIndicatorsComponent
├── DeltaSummaryStripComponent
├── ThreePaneLayoutComponent
│   ├── CategoriesPaneComponent
│   ├── ItemsPaneComponent
│   └── ProofPaneComponent
├── ActionablesPanelComponent
└── ExportActionsComponent

RiskDashboardComponent
├── BurnUpChartComponent
├── UnknownsHeatmapComponent
├── DeltaTableComponent
├── ExceptionLedgerComponent
└── KpiTilesComponent

5.2 Service Layer

// Core services
TriageService           // Vulnerability list + filtering
VexDecisionService      // CRUD for VEX decisions
AdvisoryAiService       // AI recommendations
CompareService          // Baseline + delta computation
RiskBudgetService       // Budget + burn tracking
EvidenceService         // Evidence retrieval

6. API Integration

VulnExplorer Endpoints

GET  /api/v1/vulnerabilities                    // List with filters
GET  /api/v1/vulnerabilities/{id}               // Detail
GET  /api/v1/vulnerabilities/{id}/reachability  // Call graph slice
POST /api/v1/vex-decisions                      // Create VEX decision
PUT  /api/v1/vex-decisions/{id}                 // Update VEX decision
GET  /api/v1/vex-decisions?vulnId={id}          // History for vuln

AdvisoryAI Endpoints

POST /api/v1/advisory/plan                      // Get analysis plan
POST /api/v1/advisory/execute                   // Execute analysis
GET  /api/v1/advisory/output/{taskId}           // Get recommendations

Delta/Compare Endpoints

GET  /api/v1/baselines/recommendations/{digest}
POST /api/v1/delta/compute
GET  /api/v1/delta/{id}/trust-indicators
GET  /api/v1/actionables/delta/{id}

7. Implementation Status

ComponentSprintStatus
Risk Dashboard BaseSPRINT_20251226_004_FETODO
Smart-Diff Compare ViewSPRINT_20251226_012_FETODO
Unified Triage CanvasSPRINT_20251226_013_FETODO
Documentation ConsolidationSPRINT_20251226_014_DOCSTODO
VEX Decision ModelsVulnExplorer/ModelsCOMPLETE
AdvisoryAI Pipelinesrc/AdvisoryAICOMPLETE
Confidence BadgeWeb/shared/componentsCOMPLETE
Release FlowWeb/features/releasesCOMPLETE

8. Testing Strategy

Unit Tests

Integration Tests

E2E Tests

Accessibility Tests

9. Success Metrics

MetricDefinitionTarget
Mean Time to Triage (MTTT)Time from vuln notification to VEX decision< 5 min
Mean Time to Explain (MTTE)Time from “why did this change?” to “Understood” click< 2 min
Triage Queue ThroughputVulns triaged per hour per analyst> 20
AI Recommendation Acceptance% of AI suggestions accepted without modification> 60%

10. References

Archived Advisories (Consolidated Here)

External References

12. 2026-02-26 Batch Delivery Update

This document is updated to reflect completed triage/risk/score parity work from:

Delivered coverage in this batch: