{% if render_mode != 'fragment' %} {% if domain %}{% endif %} Workflow Summary - Finite State Report {% include "_design_system.html" %} {% include "_console_shell.html" %} {% endif %} {# NOTE: This {% if render_mode != 'fragment' %} {% endif %} {% import "_console_macros.html" as fs with context %} {% if render_mode != 'fragment' %} {{ fs.topbar( crumbs=["Finite State", "Workflow Summary"], meta=[ {"label": "Domain", "value": domain or "—"}, {"label": "Started", "value": (workflow_meta.start_time if workflow_meta else None) or "—"}, ], controls=[], ) }} {% endif %} {# Single-column — no
wrapper. See findings_by_project.html for the rationale (avoids the 220px sidebar gutter from the .layout grid). #}

Workflow Summary

{% if workflow_meta and workflow_meta.start_time %}

Started {{ workflow_meta.start_time }}

{% endif %}
{{ fs.kpi_cell("Findings Triaged", kpis.total_findings_triaged | default(0)) }} {{ fs.kpi_cell("VEX Applied", kpis.vex_applied | default(0)) }} {{ fs.kpi_cell("Tickets Created", kpis.tickets_created | default(0)) }} {{ fs.kpi_cell("Notifications", kpis.notifications_sent | default(0)) }} {% set dur = kpis.total_duration_sec | default(0) %} {% if dur >= 60 %} {{ fs.kpi_cell("Duration", ((dur / 60) | round(1)) ~ "m") }} {% else %} {{ fs.kpi_cell("Duration", ((dur | round(0)) | int) ~ "s") }} {% endif %}
{{ fs.panel_head("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 %}
{{ fs.panel_head("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 %} {% if step.detail.message %}
{{ step.detail.message | slack_mrkdwn }}
{% endif %} {% if step.detail.subject %}

Subject: {{ step.detail.subject }}

{% if step.detail.recipients %}

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

{% endif %} {% if step.detail.body_preview %} {% 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 %}
{{ step.raw_data | tojson(indent=2) }}
{% endif %}
{% endfor %}
{% if render_mode != 'fragment' %} {{ fs.status_bar(items=[ "Recipe: Workflow Summary", "Generated: " ~ (generated_at or "—"), ], version='fs-report ' ~ (fs_report_version | default('dev'))) }} {% endif %} {% if render_mode != 'fragment' %} {% endif %}