{% extends "base.html" %} {% from "scans/_result_render.html" import ri %} {% block title %}{{ scan.target }} — Summary{% endblock %} {# Compact severity chips (letter + count) for tiles and jump-nav chips. #} {% macro sev_pips(sev) %} {%- for lvl in ['critical','high','medium','low'] -%} {%- if sev[lvl] -%}{{ lvl[0]|upper }}{{ sev[lvl] }}{%- endif -%} {%- endfor -%} {% endmacro %} {# Full labelled severity breakdown for the Findings section header. #} {% macro sev_bar(sev) %} {%- for lvl in ['critical','high','medium','low','info'] -%} {%- if sev[lvl] -%} {{ sev[lvl] }} {{ lvl }} {%- endif -%} {%- endfor -%} {% endmacro %} {% block content %}
TYPE {{ scan.scan_type or '—' }}
RESULTS {{ scan.result_count }}
CATEGORIES {{ categories|length }}
ANOMALIES {{ anomaly_count }}
RISK SCORE
{{ "%.0f"|format(scan.shadow_score or 0) }}/100
THREAT LEVEL {{ (scan.threat_level or 'unknown').upper() }}
{% if attribution %} {# ── OPSEC Attribution Surface — the flagship "what did this scan leak?" panel ── #}
◈ OPSEC · Attribution Surface {{ attribution.grade }} what this scan leaked about your infrastructure
{{ attribution.total_requests }}Requests egressed
{{ attribution.proxied_pct }}%Proxied ({{ attribution.proxied }}/{{ attribution.total_requests }})
{{ attribution.direct }}Direct from your IP
{{ attribution.impersonated }}JA3-impersonated
{{ attribution.waf_blocks }}WAF challenges
{{ attribution.backoffs }}Adaptive backoffs
{% set mbo = attribution.modules_by_opsec or {} %} stealth-guaranteed · {{ (mbo.stealth_guaranteed or [])|length }} proxied · {{ (mbo.proxied or [])|length }} attributable · {{ (mbo.attributable or [])|length }} {% for prof, n in (attribution.ja3_profiles or {}).items() %} JA3: {{ prof }} ×{{ n }} {% endfor %} {% for name, n in (attribution.block_names or {}).items() %} blocked: {{ name }} ×{{ n }} {% endfor %}
{% endif %} {% if categories %} {% set cap = 12 %}
{% for cat in categories %}
{{ cat.icon }} {{ cat.count }}
{{ cat.label }} {% if cat.severity %} {{ sev_pips(cat.severity) }} {% else %} {% if cat.anomaly_count %}⚠ {{ cat.anomaly_count }} anomal{{ 'ies' if cat.anomaly_count != 1 else 'y' }}{% else %}no anomalies{% endif %} {% endif %}
{% endfor %}
{% for cat in categories %}
{{ cat.icon }} {{ cat.label }} {{ cat.count }} result{{ 's' if cat.count != 1 }} {% if cat.severity %} {{ sev_bar(cat.severity) }} {% elif cat.anomaly_count %} ⚠ {{ cat.anomaly_count }} anomal{{ 'ies' if cat.anomaly_count != 1 else 'y' }} {% endif %}
{% for result in cat.entries %}
{% if result.severity %}{{ result.severity }}{% endif %} {{ result.result_type.replace('_', ' ') }} [{{ result.module }}] {% if result.is_anomaly %}⚠ ANOMALY{% endif %} {% if result.source %}⚡ {{ result.source }}{% endif %}
{{ ri(result) }}
{% endfor %}
{% if cat.count > cap %}
{% endif %}
{% endfor %} {% else %}

{% if is_live %}Scan in progress — results incoming...{% else %}No results yet.{% endif %}

{% endif %} {% endblock %} {% block scripts %} {% endblock %}