{% extends "base.html" %} {% block title %}Scan {{ job.scan_id }} · ai-protect{% endblock %} {% block autorefresh %} // Disable the global autorefresh on this page — we do our own AJAX polling // below (see #scan-poller) so the page doesn't lose scroll position or // flash the log every 3 seconds while the scan is running. window.AI_PROTECT_NO_AUTOREFRESH = true; {% endblock %} {% block content %} ← back to scan launcher
{% if job.status == 'running' %} Running {% elif job.status == 'done' %} {{ job.status }} {% elif job.status == 'failed' %} {{ job.status }} {% elif job.status == 'stopped' %} {{ job.status }} {% else %} {{ job.status }} {# Stop button placeholder for AJAX path: hidden but kept in DOM so a status flip back to 'running' (rare) can reveal it. #} {% endif %}

Scan {{ job.scan_id }}

app: {{ job.app_name }} stage: {{ job.stage }} adapter: {{ job.adapter or "all" }} pid: {{ job.pid }} {% if job.findings_after is not none %} findings: {{ job.findings_before }} → {{ job.findings_after }} (Δ {{ job.findings_after - job.findings_before }}) {% endif %}

Live log

{{ log_tail }}
{% if job.status == 'done' %}

Done

View findings for {{ job.app_name }} All findings Run another scan {% elif job.status == 'failed' %}

Failed

Exit code {{ job.exit_code }}. Inspect the log above; common causes: missing tool on PATH, manifest validation error, adapter crash.

Try again {% elif job.status == 'stopped' %}

Stopped

Scan was cancelled by the operator. Partial findings (if any) are in the store.

View findings for {{ job.app_name }} Run another scan {% endif %}
{% endblock %}