{% 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 %} {% 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 %} {% 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.
{# tp_gate / vex_override are Triage-Prioritization-only (show_tp_gate); top / triage above are shared with Config Analysis Triage. #} {% if show_tp_gate %}
{% endif %} {# ── SP2: destructive VEX-write apply (autotriage) — TP-only ── #} {% 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_standalone or show_detected_after 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 %} {% if show_standalone %}
{% endif %} {% if show_detected_after %}
{% endif %} {% if show_scan_filters %}
{% set cur_st = state.get('scan_types', '') %}
{% set cur_ss = state.get('scan_statuses', '') %}
{% endif %}
{% 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 %}