{% extends "base.html" %} {% block title %}{{ run.skill_name }} — secfoo{% endblock %} {% block content %} ← Back to project

{{ run.skill_name }}

{% if blocked %}Blocked {% else %}{{ run.status }}{% endif %}

{{ run.project_display_name or 'Project' }} · {{ run.agent_id }} · started {{ run.started_at | fmt_time }}

Progress

{% if elapsed is not none %} {{ (elapsed // 60) | int }}m {{ '%02d' % ((elapsed % 60) | int) }}s {% endif %}
    {% for step in steps %}
  1. {{ step.label }} {% if step.state == 'live' %}in progress{% else %}{{ step.detail }}{% endif %}
  2. {% endfor %}
{% if is_active %}

Updates live. The report appears here when the agent finishes.

{% endif %}

Run receipt

agent{{ run.agent_id }}
skill{{ run.skill_id }}
confluence pages{{ run.confluence_urls | length }}
duration{{ run.duration_seconds | fmt_duration }}
exit code{{ run.exit_code if run.exit_code is not none else '-' }}
tokens in / out{{ run.input_tokens | fmt_tokens }} / {{ run.output_tokens | fmt_tokens }}
findings C/H/M/L{{ run.critical_count }} / {{ run.high_count }} / {{ run.medium_count }} / {{ run.low_count }}
AI cost{% if run.cost_usd is none and run.status not in ('running', 'pending') %}not reported{% else %}{{ run.cost_usd | fmt_cost }}{% endif %}
{% if run.confluence_urls %} {% endif %}
{% if run.prompt_path %}Prompt sent to agent{% endif %} {% if report_html %}Raw report{% endif %}
{% if blocked %}

{{ blocked.title }}

{{ blocked.explanation }}

{% if blocked.fix %}
How to fix
{{ blocked.fix }}
{% endif %} {% if run.stderr_excerpt %}
Error output from the agent
{{ run.stderr_excerpt }}
{% endif %} {% if run.assessment_id %} Try again {% endif %}
{% endif %} {% if report_html %}
{{ report_html | safe }}
{% elif not blocked and not is_active %}

No report content available.

{% endif %} {% if mermaid_available %} {# Vendored locally rather than loaded from a CDN: this is a security tool whose reports are often reviewed on airgapped or restricted networks, and a report viewer that phones out to a third-party host is its own finding. The asset is optional (see web/app.py::mermaid_bundle_available) -- without it, diagrams stay readable as Mermaid source instead of breaking. #} {# mermaid@11's dist/mermaid.min.js is an IIFE that assigns globalThis.mermaid -- NOT an ES module, so it must be loaded as a classic script rather than imported. #} {% endif %} {% endblock %}