{% extends "base.html" %} {% block title %}Workflow Summary{% endblock %} {% block content %}

Workflow Summary

{% if workflow_meta and workflow_meta.start_time %}
Started: {{ workflow_meta.start_time }}
{% endif %}
{{ kpis.total_findings_triaged | default(0) }}
Findings Triaged
{{ kpis.vex_applied | default(0) }}
VEX Applied
{{ kpis.tickets_created | default(0) }}
Tickets Created
{{ kpis.notifications_sent | default(0) }}
Notifications
{% set dur = kpis.total_duration_sec | default(0) %} {% if dur >= 60 %}
{{ (dur / 60) | round(1) }}m
{% else %}
{{ dur | round(0) | int }}s
{% endif %}
Duration

Timeline

{% for tl in timeline %}
{{ tl.label or tl.step }} {% if tl.duration_from_prev_sec and tl.duration_from_prev_sec > 0 %} +{{ tl.duration_from_prev_sec | round(1) }}s {% endif %} {% if tl.timestamp %}
{{ tl.timestamp }}
{% endif %}
{% endfor %}

Step Details

{% for step in steps %}

{{ step.label or step.step }} {{ step.step }}

{% if step.step_type == "triage" %} {% set ts = step.detail.triage_summary if step.detail.triage_summary else {} %} {% set cr = step.detail.change_report if step.detail.change_report else {} %} {% set vx = step.detail.vex_applied if step.detail.vex_applied else {} %}

{{ ts.total_recommendations | default(0) }} findings triaged {% if cr.new_recommendations %} · {{ cr.new_recommendations }} new recommendations{% endif %}

{% if vx.applied_count %}

VEX {{ vx.applied_count }} statements applied

{% endif %} {% elif step.step_type == "tickets" %} {% set tickets = step.detail.tickets_created if step.detail.tickets_created is iterable and step.detail.tickets_created is not string and step.detail.tickets_created else [] %} {% set count = step.detail.tickets_count | default(0) %} {% if tickets %} {% for t in tickets %} {% endfor %}
ComponentTicket
{{ t.component | default("—") }} {{ t.ticket_key | default(t.key | default("—")) }}
{% elif count %}

{{ count }} ticket{{ "s" if count != 1 }} created.

{% else %}

No tickets created.

{% endif %} {% elif step.step_type == "notification" %} {% if step.detail.success %} Sent {% else %} Failed {% endif %} {% if step.detail.channel %} {{ step.detail.channel }} {% endif %} {# Slack-style: full message with mrkdwn rendering #} {% if step.detail.message %}
{{ step.detail.message | slack_mrkdwn }}
{% endif %} {# Email-style: subject + recipients + body preview #} {% if step.detail.subject %}

Subject: {{ step.detail.subject }}

{% if step.detail.recipients %}

To: {{ step.detail.recipients | join(', ') }}

{% endif %} {% if step.detail.body_preview %}
{{ step.detail.body_preview | slack_mrkdwn }}
{% endif %}
{% endif %} {% elif step.step_type == "recipe_run" %} {% if step.detail.recipe %}

Recipe: {{ step.detail.recipe }}

{% endif %} {% if step.detail.output_files %}
{{ step.detail.output_files | length }} output file{{ "s" if step.detail.output_files | length != 1 }}
    {% for f in step.detail.output_files %}
  • {{ f.split("/") | last }}
  • {% endfor %}
{% endif %} {% else %} {# Unknown step — render raw JSON #}
{{ step.raw_data | tojson(indent=2) }}
{% endif %}
{% endfor %}
{% endblock %}