{% extends "base.html" %} {% block title %}False Positive Analysis — {{ project_filter or folder_name or recipe_name }}{% endblock %} {% block content %}
{{ summary.total_open_findings if summary else 0 }}
Open Findings
{{ summary.fp_candidates_found if summary else 0 }}
FP Candidates
{{ summary.mechanical_detections if summary else 0 }}
Mechanical Detections
{{ summary.ai_detections if summary else 0 }}
AI Detections
{% if ai_component_prompts and ai_component_prompts|length > 0 %}

Component Applicability Prompts

{{ ai_component_prompts|length }} component prompts. Start here — if the LLM says not_affected, all findings on that component are likely FP.

{% for p in ai_component_prompts %}
{{ p.component }}
{{ p.prompt }}
{% endfor %}
{% endif %} {% if ai_triage_prompts and ai_triage_prompts|length > 0 %}

Per-Finding Applicability Prompts

{{ ai_triage_prompts|length }} finding prompts. Only needed for findings on components not already ruled out above.

{% for p in ai_triage_prompts[:20] %}
{{ p.finding_id }} — {{ p.component }}
{{ p.prompt }}
{% endfor %} {% if ai_triage_prompts|length > 20 %}

Showing first 20 of {{ ai_triage_prompts|length }}. Full set in the _prompts.md file.

{% endif %}
{% endif %}

False Positive Review Queue

{% if candidates and candidates|length > 0 %} {% for row in candidates %} {% endfor %}
CVE Component Severity Confidence Signals Reason / AI Rationale Action
{{ row.cve_id or row.finding_id or '—' }} {{ row.component_name or '—' }} {{ row.component_version or '' }} {{ row.severity or 'UNKNOWN' }} {{ row.fp_confidence or '—' }} {% if row.fp_signals %} {% for sig in row.fp_signals.split(',') if row.fp_signals is string %} {{ sig.strip() }} {% endfor %} {% if row.fp_signals is not string %} {% for sig in row.fp_signals %} {{ sig }} {% endfor %} {% endif %} {% endif %} {{ row.primary_reason or '—' }} {% if row.ai_rationale %}
AI details
Verdict: {{ row.ai_verdict }}
{{ row.ai_rationale }}
{% endif %}
{{ row.recommended_action or 'Review' }}
{% else %}

No false positive candidates detected. {% if not summary or summary.ai_detections == 0 %}Try running with --ai for AI-based applicability analysis.{% endif %}

{% endif %}
{% if summary and summary.by_signal_type %}

Detection by Signal Type

{% for sig, count in summary.by_signal_type.items() %} {% endfor %}
SignalCount
{{ sig }}{{ count }}
{% endif %} {% endblock %}