Direct Upload Support for SARIF Reports
## Overview
Enable direct upload of SARIF 2.1.0 reports as a first-class artifact format in GitLab, moving toward standardized security report handling alongside CycloneDX SBOMs.
## Spike Outcomes
The spike ([!225747](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/225747)) validated that SARIF uploads are feasible. Key findings:
- SARIF 2.1.0 schema is compatible with our security scanning workflow
- Parser and validator foundation established ([!227875](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/227875))
- PoC demonstrates successful integration with existing vulnerability correlation
## Core Questions
- Details field mapping: How to handle SARIF's generic details field vs. our structured data
- Identifier stability: Ensure SARIF identifiers remain stable and ordered for deduplication
- Suppression handling: Reconcile SARIF suppression model with our vulnerability_flags approach
- Severity alignment: Map SARIF severity levels to our vulnerability severity scale
## Next Steps
### Completed
* %18.11 ~database ~backend Register sarif as a new artifact and report type, add `plan_limits` migration, CI YAML entry, JSON schema validator, SARIF 2.1.0 parser:
* !227968 - artifact type registration + plan_limits migration
* !227970 - schema validator, location class, parser, parser registry, ingestion wiring, vulnerability dashboard and pipeline security tab
* %18.11 ~"feature flag" ~documentation https://gitlab.com/gitlab-org/gitlab/-/merge_requests/230156+
* %"19.0" ~frontend ~backend MR security diff widget
* SARIF findings do not appear in the MR widget. Requires five changes: add `sarif` to `ALLOWED_REPORT_TYPES`, add `sarif` to `EE_REPORT_FILE_TYPES`, add `MergeRequest#has_sarif_reports?` + `#compare_sarif_reports`, a new route, and a controller action.
### In progress
* %"19.0" ~backend https://gitlab.com/gitlab-org/gitlab/-/merge_requests/230137+
* ~backend Security Policies
* approval/scan result policies work automatically. Pipeline execution policy enforcement has a gap: `PolicyRuleEvaluationService#extract_scanners` falls back to `PIPELINE_SCAN_TYPES` for "all scanners" rules, which excludes `sarif`. Fix: change that fallback to `ApprovalProjectRule::SUPPORTED_SCANNERS`. Owned by ~"group::security policies".
* ~backend Vulnerability Management Policy
* no_longer_detected rules work at runtime but the policy rule JSON schema (`vulnerability_management_policy_rule_content.json`) doesn't list sarif in the scanners enum, so explicit scanners: [sarif] policies fail validation. One-line fix.
* ~documentation SARIF Artifact upload compatibility and field mappings
### Non-blocking follow-up
* ~frontend ~backend Ingestion health visibility
* SARIF findings without a stable physical location are silently dropped. When a significant proportion is filtered out, the scan should surface a warning in the scanner status / Profiles UX view rather than silently succeeding. Extend the existing Security::Scan status model rather than new UX surface (SRM Profiles UX).
* ~backend Vulnerability correlation/deduplication alignment
* cross-report-type deduplication with existing SAST/secret-detection findings. See (see https://gitlab.com/gitlab-org/gitlab/-/work_items/592410+)
issue