{% include "components/_scope_dropdowns.html" %}

{% if workflow_title %}{{ workflow_title }}{% else %}Run Recipes{% endif %}

{{ recipe_names | join(', ') }}

Scope
{% if show_cve and show_version_fields %}
CVE and Version Comparison recipes require the fields below. Leave empty to skip those recipes.
{% endif %} {# For comparison (meta-compare) runs, scope is baked into the axis. The L/R-override fields below are the real scope control. Hide the generic project/folder/version pickers to avoid confusion. #} {% if not show_left_right_override %}
{% if show_project_required %} Required for Remediation Package {% endif %}
{% if show_current_version_only %}
{% endif %} {# Products only FIRST: it picks the population, and Standalone then decides whether each row carries its dependencies. #} {% if show_product_only %}
{# One engine config serves every recipe in the launch, so say that here — a batch containing a non-portfolio recipe is narrowed too. #} Narrows the whole run{% if recipe_names | length > 1 %}, including the other {{ recipe_names | length - 1 }} report(s) in this launch{% endif %}. {% endif %} {% if show_standalone %}
{% endif %} {% endif %} {# Period + Custom date range — only operational recipes whose pipeline trims by date (show_period). This also hides them for meta-compare runs (comparisons aren't period recipes; the engine ignores --period for them — report_engine._process_axis_compound). #} {% if show_period %}
to
Set both to use a custom range (overrides Period).
{% endif %} {% if show_component %}
Contains match — partial names work {# B11 #24: dropped the circular "Recommended for …" hint; those recipes set requires_component (B4) so show the accurate Required marker instead (mirrors the card-config back). #} {% if requires_component %} Required to run this report {% endif %}
{% endif %} {% if show_cve %}
{% endif %} {% if show_finding_types %}
{% set current_ft = state.get('finding_types', 'cve') %}
{% endif %} {# PR3.3a: Left/Right scope-ref override for comparison (meta-compare) runs. Rendered only when show_left_right_override is True (axis-bearing CompoundRecipe). Pre-filled with baked axis defaults; user may override for this run only. Submitted values are run-only and never persisted (Decision 11). #} {% if show_left_right_override %}
Overrides the saved Left scope for this run only. Leave as-is to use the saved default.
Overrides the saved Right scope for this run only. Leave as-is to use the saved default.
{% endif %} {% if show_version_fields %} {# Comparison mode toggle — see _card_config.html for the rationale. Initial state derives from whether a saved pair exists; the toggle has no name= (pure UX over the empty-vs-set-pair semantics). #} {% set _vc_pair = state.get('baseline_version') and state.get('current_version') %}
On: compare every version of the scoped project (latest vs previous) — the pickers below stay inactive. Off: pick a specific baseline + current pair (works across projects too). {# B11 #19a: pickers stay VISIBLE (dimmed + inert) when All-versions is on, so they're discoverable (was `hidden`). #}
{% endif %} {# Opens for a triage recipe OR any autotriage-capable one: the VEX-apply control below is inside this block, so gating on show_triage alone made show_vex_apply dead for Reachability VEX Coverage (in AUTOTRIAGE_RECIPES, not TRIAGE_TAB_RECIPES). #} {% if show_triage or show_vex_apply %} {# Top N / Triage N are TP + Config Analysis Triage only — RVC never truncates, so don't offer it a row cap it ignores. #} {% if show_triage %}
Limit output to the top N findings by score. Leave empty or 0 to show all.
Generate VEX recommendations for only the top N findings. Full list is still shown.
{% endif %} {# tp_gate is Triage-Prioritization-only (show_tp_gate); top / triage above are shared with Config Analysis Triage. vex_override is gated separately below — it is meaningful wherever autotriage is. #} {% if show_tp_gate %}
{% endif %} {# Reachable wherever autotriage is, not just for Triage Prioritization. For Reachability VEX Coverage this is the ONLY way to act on the needs-review class the report reports: those gaps carry a status a person set, so the applier skips them unless --vex-override. #} {% if show_tp_gate or show_vex_apply %}
{% endif %} {# ── SP2: destructive VEX-write apply (autotriage) — every recipe in AUTOTRIAGE_RECIPES (TP, False Positive Analysis, Reachability VEX Coverage). Gate on show_vex_apply, never show_triage. ── #} {% if show_vex_apply %}
{% set cur_as = state.get('autotriage_status', '') %}
Empty = apply all recommended statuses.
Auto-apply writes VEX statuses to the platform when this report runs. Use Dry run first to preview; you'll confirm before any real write. (VEX override, above, only affects in-report recommendations.) {% endif %} {% endif %} {% if show_license %}
{% endif %} {% if show_open_only %}
{% endif %} {% if show_baseline_date %}
{% endif %} {% if show_detailed %}
{% endif %}
{% if show_ai %}
AI Settings
{# Deployment context reaches the LLM for 4 of the 5 AI recipes — NOT Component Remediation Package (show_deployment_context). #} {% if show_deployment_context %}
Deployment Context
{{ state.get('deployment_notes', '') | length }}/500
{# SP3: AI deployment context file #}
{{ state.get('context_file','').rsplit('/', 1)[-1] or 'none' }}
{% endif %} {# Threat context — Component-Remediation-Package-only (show_threat_context); relocated here from the Scope section to match the card AI tab. #} {% if show_threat_context %}
{% endif %}
{% endif %} {# SP3: scoring file — gated to its consumers (TP / Scan Quality / Config Analysis Triage) #} {% if show_scoring %}
Scoring file
{# B11 #18: label/hint per consumer. #} {% if scoring_is_staleness %} {% elif scoring_is_triage %} {% else %}{% endif %}
{{ state.get('scoring_file','').rsplit('/', 1)[-1] or 'none' }}
{% if scoring_is_staleness %}Scan-age staleness thresholds (days), e.g. staleness_thresholds: {fresh: 30, aging: 90, stale: 365}. {% elif scoring_is_triage %}Triage scoring weights — reachability / exploitability / EPSS / CVSS and gate cutoffs. {% else %}Custom scoring weights / staleness thresholds.{% endif %}
{% endif %} {# Filters — hide the whole section when no child filter is consumed by the selected recipe(s) (Round-1 M1-11). #} {% if show_component_match or show_component_version or show_detected_after or show_min_severity or show_scan_filters %}
Filters {% if show_component_match %}
{% endif %} {% if show_component_version %}
{# B11 #28: version RANGE, not a single version. #} Exact version or a range — 1.2.11, <2.0, >=1.0,<2.0.
{% endif %} {# Products only / Standalone moved up into Scope — they choose which projects the report covers, so they belong with the pickers. #} {% if show_detected_after %}
{% endif %} {% if show_min_severity %}
{% set cur_ms = state.get('min_severity', '')|lower %} Audit only findings at or above this severity. Any floor excludes none/info — leave on All severities to cover everything.
{% endif %} {% if show_scan_filters %}
{% set cur_st = state.get('scan_types', '') %}
{% set cur_ss = state.get('scan_statuses', '') %}
{% endif %}
{% endif %} {# Human Readable SBOM only (show_sbom_options / SBOM_OPTION_RECIPES). Its own section rather than a tail on Filters: two of the three toggle COLUMNS rather than filtering anything, and for this recipe the Filters section carries no other control, so its heading would have been the only label on the page for a group it does not describe. #} {% if show_sbom_options %}
SBOM options
Off by default — file entries are SAST placeholders with no license or supplier data.
Per-component violation and warning counts. On by default.
Total findings plus the Critical/High/Medium/Low breakdown. On by default.
{% endif %}
Advanced Options
Examples: 4h, 2d, 30m, 1h30m, or bare number (hours)
{# "Save as this report's default" — single-recipe modals only. Persists the form via POST /api/cc/card-config so configuring a recipe off-card (run bar / palette) graduates it exactly like configuring it on the card. Defaults checked when the recipe is needs-setup. data-requires-cve lets the JS validate the required card input before launch. Hidden for multi-recipe modals. #} {% if recipe_names | length == 1 %}
{% endif %}