Here are **three tightly scoped UI micro-interactions** you can drop into the next front-end sprint. Each maps to a single Angular task and reinforces StellaOps’ auditability, low-noise VEX gating, and evidence provenance for both air-gapped and online users. --- # 1) Audit Trail “Why am I seeing this?” (per-row expandable reason) **Goal:** Make every verdict/action explainable at a glance. * **User flow:** In Tables (Findings, Components, Policies), each row shows a tiny “ⓘ Why?” chip. Clicking expands an inline panel with the explanation capsule (policy that fired, rule hash, data inputs, and the deterministic graph revision ID). * **Angular task:** * Add `ReasonCapsuleComponent` (standalone) with inputs: `policyName`, `ruleId`, `graphRevisionId`, `inputsDigest`, `timestamp`, `actor`. * Drop it into tables via `*ngTemplateOutlet` so no table refactor. * Keyboard accessible (Enter/Space toggles). * **Backend contract (read-only):** `GET /api/audit/reasons/:verdictId` → ```json { "policy":"Default VEX Merge", "ruleId":"vex.merge.R12", "graphRevisionId":"grv_2025-11-18T12:03Z_b3e1", "inputsDigest":"sha256:…", "actor":"Vexer", "ts":"2025-11-18T12:03:22Z" } ``` * **Acceptance criteria:** * Toggle persists open/closed per row in URL state (`?open=rid1,rid3`). * Copy-to-clipboard for `graphRevisionId`. * Works in offline bundle (served from local API). --- # 2) Low-noise VEX Gate (inline, gated action with 3 evidence tiers) **Goal:** Reduce false prompts and only block when evidence is meaningful. * **User flow:** On risky actions (promote image, approve import), the primary button morphs into a **VEX Gate**: a small dropdown right-aligned to the button label showing **Green/Amber/Red** status with the top blocking reason. Clicking opens a concise sheet (not a modal) with the minimal evidence set, and a single “Proceed anyway” path if policy allows. * **Angular task:** * Create `VexGateButtonDirective` that decorates existing `