{% extends "base.html" %} {% from "_macros.html" import findings_badges %} {% set verdict_projects = projects | selectattr("design_verdict") | list %} {% block title %}{{ skill.nav_label }} — secfoo{% endblock %} {% block content %} Activity

{{ skill.name }}

{{ skill.description }}

{% if dash %} {% include "activities/architecture_dashboard.html" %} {% endif %} {% if tm_dash %} {% include "activities/threat_modeling_dashboard.html" %} {% endif %} {% if sca_dash %} {% include "activities/sca_dashboard.html" %} {% endif %} {% if sast_dash %} {% include "activities/sast_dashboard.html" %} {% endif %} {% if secret_dash %} {% include "activities/secret_scanning_dashboard.html" %} {% endif %} {% if not tm_dash and not dash and not sca_dash and not sast_dash and not secret_dash %} {# All three program dashboards above already cover coverage, findings, and trust-boundary counts with more specific tiles -- this generic block would just duplicate them. #}
{{ projects | length }} Projects covered
{{ run_count }} Runs
{{ severity.total }} Total findings
{{ severity.critical + severity.high }} Critical + High
{% if verdict_projects %}
{{ verdict_projects | rejectattr("design_verdict", "in", ["Sound"]) | list | length }}/{{ verdict_projects | length }} Projects not cleanly Sound
{{ projects | sum(attribute="boundary_count") }} Trust boundaries identified
{% endif %}
{% endif %} {% if verdict_projects %}

Design verdicts

From each project's most recent successful review.

{% for p in verdict_projects %} {{ p.project_display_name }}: {{ p.design_verdict }} {% endfor %}
{% endif %} {% if not dash and not sca_dash and not sast_dash and not secret_dash %} {# Security Architecture Review's and SCA's own program dashboards above already have their own severity/disposition breakdowns -- a raw severity-count bar here would just be a second, less specific cut of the same findings. #}

Findings by severity

{% for row in severity_rows %}
{{ row.label }}
{{ row.count }}
{% endfor %}
{% endif %} {% if diagrams_available and skill.id != "threat-modeling" %}

Architecture diagram

Data flow diagram from the selected project's most recent successful review.

{% if diagram_projects | length > 1 %}
{% endif %} {% if selected_diagram_project %} {{ selected_diagram_project.project_display_name }} {% if selected_diagram_project.design_verdict %} {{ selected_diagram_project.design_verdict }} {% endif %} {% if mermaid_available %}
{{ selected_diagram_project.diagram_source }}
{% else %}
{{ selected_diagram_project.diagram_source }}
{% endif %}
{% endif %} {% if not mermaid_available %}
Showing raw diagram source. Run secfoo vendor mermaid to render these as pictures.
{% endif %} {% endif %}

By project

{% if projects %}
{% if verdict_projects %}{% endif %} {% for p in projects %} {% if verdict_projects %}{% endif %} {% endfor %}
ProjectRunsLatestStatusBoundariesFindings
{{ p.project_display_name }}
{{ p.project_kind }}
{{ p.run_count }} {{ p.latest_started_at | fmt_time }} {{ p.latest_status }}{{ p.boundary_count or "-" }}{{ findings_badges(p) }} {% if p.latest_assessment_id %} Assessment {% endif %}
{% else %}
No project has been scanned with this activity yet. Start one from an assessment's Run Assessment page, or run secfoo run --skill {{ skill.id }}.
{% endif %} {% if diagrams_available and skill.id != "threat-modeling" and mermaid_available %} {# Same loader as run_detail.html -- see that template for why it's vendored locally (strict CSP-friendly, works offline) and loaded as a classic script rather than an ES module import (the bundle is an IIFE that assigns globalThis.mermaid, not an ES module). #} {% endif %} {% endblock %}