{# Exploitability Report — EXTERNAL (Briefing) variant. Extends _briefing_shell.html (the shell OWNS the document wrapper + render-mode gate). This child fills blocks only. CUTOVER GUARD: a v2 dataset (spec 2026-06-23 §5) yields the bucketed view model {subject, summary, buckets, bucket_counts, record_count}; the §0-§7 IA below renders under {% if buckets %}. A legacy v1 dataset yields {cover, coverage, cards}; the {% else %} branch keeps rendering it verbatim until the §10 cutover. Shares _exploitability_macros.html + _exploitability_style.html with the console variant. No charts, no CDN, no JS. #} {% extends "_briefing_shell.html" %} {# Defensive defaults (both shapes). #} {% set cover = cover | default({}) %} {% if cover is not mapping %}{% set cover = {} %}{% endif %} {% set cards = cards | default([]) %} {% if cards is mapping or cards is string or cards is not iterable %}{% set cards = [] %}{% endif %} {% set subject = subject | default({}) %} {% if subject is not mapping %}{% set subject = {} %}{% endif %} {% set buckets = buckets | default(None) %} {% set mode = mode | default('external') %} {% block title %}Exploitability Report{% if buckets %}{% if subject.scope_descriptor %} — {{ subject.scope_descriptor }}{% endif %}{% elif cover.subject %} — {{ cover.subject }}{% endif %} - Finite State Report{% endblock %} {% block head_extra %} {% include "_exploitability_style.html" %} {% endblock %} {# §0 Identity header — v2 overrides the shell's generic chrome (which would otherwise show "Scope: Portfolio · 0 records"); v1 falls back to the default. #} {% block briefing_header %} {% if buckets %} {% include "_default_logo.html" %} {{ subject.scope_descriptor | default('Exploitability Report') }} {% if subject.project_name %}{{ subject.project_name }}{% endif %} {% if subject.version_label %}·{{ subject.version_label }}{% endif %} {% if subject.folders %}·{{ subject.folders | map(attribute='name') | join(', ') }}{% endif %} {% if subject.platform %}·{{ subject.platform }}{% endif %} {% if record_count is not none %}·{{ record_count }} findings{% endif %} {% if subject.generated_at %}·Prepared {{ subject.generated_at }}{% endif %} {% if subject.report_id %}·{{ subject.report_id }}{% endif %} {% else %} {{ super() }} {% endif %} {% endblock %} {% block hero %}
Exploitability Evidence

Exploitability Report

{% if buckets %}

{{ subject.scope_descriptor | default('') }}{% if subject.platform %} — {{ subject.platform }}{% endif %}

{% else %}

Verified {{ cover.N | default(0) }} of {{ cover.M | default(0) }} findings in {{ cover.scope_label | default('scope') }}; the remaining {{ (cover.M | default(0)) - (cover.N | default(0)) }} are untested, not cleared.

Shareable briefing · Catalog {{ cover.catalog_version | default('—') }} · Agent {{ cover.agent_version | default('—') }} · Generated {{ cover.generated_at | default(generated_at) | default('—') }}

{% endif %}
{% endblock %} {% block sections %} {% if render_mode == 'fragment' %}{% include "_exploitability_style.html" %}{% endif %} {% import "_exploitability_macros.html" as exp with context %} {% if buckets %} {# §1 Decision summary. #} {{ exp.decision_summary(summary, bucket_counts) }} {# §2 Must-fix · §3 Cleared · §4 Inconclusive · §5b Could-not-assess. #} {{ exp.card_section(buckets, 'exploitable', 'Must-fix — proven exploitable', mode) }} {{ exp.card_section(buckets, 'not_affected', 'Proven not exploitable', mode) }} {{ exp.card_section(buckets, 'inconclusive', 'Tested, inconclusive', mode) }} {{ exp.card_section(buckets, 'verifier_failed', 'Could not be assessed', mode) }} {# §5 Affected by version — compact table, not cards. #} {% set ver = buckets.get('affected_by_version') or [] %} {% if ver %}

Affected by version {{ ver | length }}

These were not individually pen-tested — the on-device version predates the upstream fix. Remediate by the upgrade in the decision summary above.

{{ exp.version_table(ver) }}
{% endif %} {# §6 Method & honesty notes. #}
How to read this.
{% else %} {% if cards %} {% for card in cards %}{{ exp.verdict_card(card, mode) }}{% endfor %} {% else %}

No verdict records in scope.

{% endif %} {% endif %} {% endblock %} {% block methodology %} {% if not buckets %}
What the verifier does. The CVE Evidence Verifier attempts to prove whether each finding is actually exploitable in the built artifact — running static dataflow, symbol scans, and dynamic traces under emulation — and seals every verdict with a replayable evidence bundle. Each card above can be reproduced byte-for-byte with replay_pen_test <bundle_id>.
{% endif %} {% endblock %}