{# Exploitability Evidence family — shared kind-aware verdict card macro. The single source of card structure for BOTH the console (internal) and briefing (external) templates. Both do: {% import "_exploitability_macros.html" as exp with context %} {% for card in cards %}{{ exp.verdict_card(card, mode) }}{% endfor %} so the card is byte-identical across modes — only the redaction-guarded blocks differ. The transform already STRIPPED external secrets (inline_excerpt / cost_actuals / raw_confidence / tier_provenance); this macro only needs `{% if c.inline_excerpt %}` / `{% if mode == 'internal' %}` guards so it never reaches around the transform's redaction. Display labels are owned HERE (the transform deliberately emits no label strings — a transform test asserts their absence). The map is keyed on verdict.kind (the contract enum), NOT the platform_status. Spec: docs/superpowers/specs/2026-06-20-exploitability-report-design.md §3.2 (element order + conditional sections), §3.3 (audience modes), §6. #} {# kind -> customer-facing badge label (spec §3.2). #} {% set kind_labels = { "AFFECTED": "EXPLOITABLE", "NOT_AFFECTED": "NOT AFFECTED", "INCONCLUSIVE": "INCONCLUSIVE (IN TRIAGE)", "UNDER_INVESTIGATION": "UNDER INVESTIGATION (IN TRIAGE)", "VERIFIER_FAILED": "VERIFIER ERRORED", } %} {# ------------------------------------------------------------------ chip_row(enrichment) — header chips: CVSS · EPSS · KEV/VcKEV · severity. ------------------------------------------------------------------ #} {% macro chip_row(enrichment) -%} {% set e = enrichment or {} %} {# Use .get() so a sparse enrichment (thin dataset: keys absent) yields None, not Jinja Undefined — `Undefined is not none` is TRUE and would reach |float and crash. Severity CSS classes are uppercase (.exp-sev-CRITICAL), so the class is |upper'd while the chip text shows the raw value. #}
none — re-run the verifier to produce a VEX.
{% else %}{{ pv.statement }}
{% endif %} {% if pv.evidence_citation_ids %}{% endif %}{{ v.reason_summary }}
{% endif %} {% elif kind == 'NOT_AFFECTED' %} {% if v.platform_justification %}{{ v.reason_summary }}
{% endif %} {% elif kind == 'INCONCLUSIVE' %} {% if v.reason_summary %}{{ v.reason_summary }}
{% endif %} {% if v.what_would_resolve_it %}{{ v.reason_summary }}
{% endif %} {% if v.blocked_by %}{{ v.details }}
{% endif %} {% else %} {% if v.reason_summary %}{{ v.reason_summary }}
{% endif %} {% endif %}No citations on this record.
{% endif %} {% for c in primary %}{{ c.inline_excerpt }}
{% endif %}
{{ ev.evidence_summary }}
{% endif %} {% set xp = ev.exploit_proof %} {% if xp %}{{ t.cve_description }}
{% endif %} {{ chip_row(e) }}No VEX applied from these results yet.
{% endif %}{{ v.reason_summary }}
{% endif %} {# Audit trail — citations demoted behind a disclosure. Internal keeps inline_excerpt; external was re-stripped by the transform. #} {% set citations = card.citations or [] %} {% if citations %}{{ c.inline_excerpt }}{% endif %}
| CVE | Component | Severity | Flags | Fix in |
|---|---|---|---|---|
| {{ t.cve_id }}{% if t.cve_description %} {{ t.cve_description }} {% endif %} |
{{ t.component_name }}{% if t.component_version %} {{ t.component_version }}{% endif %} | {% if e.severity %}{{ e.severity }}{% endif %} | {% if e.kev %}CISA KEV{% endif %}{% if e.vckev %}VulnCheck KEV{% endif %} | {{ rem.fix_version | default('—') }} |
{{ s.headline }}
{% endif %}