{% 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

False Positive Review Queue

{% if candidates and candidates|length > 0 %} {% if ai_finding_prompts %}{% endif %} {% for row in candidates %} {% if ai_finding_prompts %} {% endif %} {% endfor %}
CVE Component Severity Confidence Signals Reason / AI RationaleAI PromptAction
{{ 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 %}
{% set fid = row.finding_id or row.cve_id %} {% if fid and fid in ai_finding_prompts %}
View
{{ ai_finding_prompts[fid] }}
{% else %}—{% 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 ai_component_results and ai_component_results|length > 0 %} {% set comp_prompt_map = {} %} {% for p in ai_component_prompts %}{% if comp_prompt_map.update({p.component: p.prompt}) %}{% endif %}{% endfor %}

Component Applicability Analysis

{{ ai_component_results|length }} components analysed. Components marked not_affected have all their findings flagged as likely FP.

{% if ai_component_prompts %}{% endif %} {% for row in ai_component_results %} {% if ai_component_prompts %} {% endif %} {% endfor %}
Component Version Verdict Confidence Rationale GuidanceAI Prompt
{{ row.component }} {{ row.version }} {{ row.verdict }} {{ row.confidence }} {{ row.rationale or '—' }} {{ row.guidance or '—' }} {% if row.fix_version and row.fix_version != 'Unknown' %}
Fix: {{ row.fix_version }} {% endif %} {% if row.workaround %}
Workaround: {{ row.workaround }} {% endif %}
{% set comp_key = row.component ~ ' ' ~ row.version %} {% if comp_key in comp_prompt_map %}
View
{{ comp_prompt_map[comp_key] }}
{% else %}—{% endif %}
{% elif 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 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 %}