From cbecab47fc18995368eb03aaa82e10114c1aaf2b Mon Sep 17 00:00:00 2001 From: Illya Klymov Date: Wed, 8 Oct 2025 10:39:34 +0300 Subject: [PATCH 01/10] Add latest flag loading to graphql request * fetch latest flag if variable is passed to graphql request Changelog: added EE: true --- .../graphql/fragments/vulnerability.fragment.graphql | 6 ++++++ .../graphql/queries/group_vulnerabilities.query.graphql | 1 + .../graphql/queries/instance_vulnerabilities.query.graphql | 1 + .../graphql/queries/project_vulnerabilities.query.graphql | 1 + 4 files changed, 9 insertions(+) diff --git a/ee/app/assets/javascripts/security_dashboard/graphql/fragments/vulnerability.fragment.graphql b/ee/app/assets/javascripts/security_dashboard/graphql/fragments/vulnerability.fragment.graphql index 2da03506a3d439..c8a842e8cfb769 100644 --- a/ee/app/assets/javascripts/security_dashboard/graphql/fragments/vulnerability.fragment.graphql +++ b/ee/app/assets/javascripts/security_dashboard/graphql/fragments/vulnerability.fragment.graphql @@ -78,4 +78,10 @@ fragment VulnerabilityFragment on Vulnerability { } reachability aiFixInProgress @client + latestFlag @include(if: $includeLatestFlag) { + id + status + description + confidenceScore + } } diff --git a/ee/app/assets/javascripts/security_dashboard/graphql/queries/group_vulnerabilities.query.graphql b/ee/app/assets/javascripts/security_dashboard/graphql/queries/group_vulnerabilities.query.graphql index f12f1af2500544..7ab761b0be8bb5 100644 --- a/ee/app/assets/javascripts/security_dashboard/graphql/queries/group_vulnerabilities.query.graphql +++ b/ee/app/assets/javascripts/security_dashboard/graphql/queries/group_vulnerabilities.query.graphql @@ -26,6 +26,7 @@ query groupVulnerabilities( $owaspTopTen: [VulnerabilityOwaspTop10!] $owaspTopTen2021: [VulnerabilityOwasp2021Top10!] $includeSeverityOverrides: Boolean = false + $includeLatestFlag: Boolean = false $reachability: ReachabilityType ) { group(fullPath: $fullPath) { diff --git a/ee/app/assets/javascripts/security_dashboard/graphql/queries/instance_vulnerabilities.query.graphql b/ee/app/assets/javascripts/security_dashboard/graphql/queries/instance_vulnerabilities.query.graphql index d152d76aabc028..54feb20039d9dd 100644 --- a/ee/app/assets/javascripts/security_dashboard/graphql/queries/instance_vulnerabilities.query.graphql +++ b/ee/app/assets/javascripts/security_dashboard/graphql/queries/instance_vulnerabilities.query.graphql @@ -23,6 +23,7 @@ query instanceVulnerabilities( $clusterAgentId: [ClustersAgentID!] $owaspTopTen: [VulnerabilityOwaspTop10!] $includeSeverityOverrides: Boolean = false + $includeLatestFlag: Boolean = false ) { vulnerabilities( before: $before diff --git a/ee/app/assets/javascripts/security_dashboard/graphql/queries/project_vulnerabilities.query.graphql b/ee/app/assets/javascripts/security_dashboard/graphql/queries/project_vulnerabilities.query.graphql index 17ba030f4b6666..c415dc431b3a1b 100644 --- a/ee/app/assets/javascripts/security_dashboard/graphql/queries/project_vulnerabilities.query.graphql +++ b/ee/app/assets/javascripts/security_dashboard/graphql/queries/project_vulnerabilities.query.graphql @@ -27,6 +27,7 @@ query projectVulnerabilities( $owaspTopTen: [VulnerabilityOwaspTop10!] $owaspTopTen2021: [VulnerabilityOwasp2021Top10!] $includeSeverityOverrides: Boolean = false + $includeLatestFlag: Boolean = false $reachability: ReachabilityType ) { project(fullPath: $fullPath) { -- GitLab From 7a4bfc9d7f79ee7046ef313b311f7cbc6208a2a6 Mon Sep 17 00:00:00 2001 From: Illya Klymov Date: Wed, 8 Oct 2025 10:40:45 +0300 Subject: [PATCH 02/10] Push frontend feature flag for AI SAST FP detection * add feature flag definition * publish to controllers EE: true --- .../shared/ai_possible_fp_badge.vue | 127 ++++++++++++++++++ .../security/vulnerabilities_controller.rb | 1 + .../security/vulnerabilities_controller.rb | 1 + .../vulnerability_report_controller.rb | 1 + .../security/vulnerabilities_controller.rb | 1 + .../wip/ai_experiment_sast_fp_detection.yml | 10 ++ 6 files changed, 141 insertions(+) create mode 100644 ee/app/assets/javascripts/security_dashboard/components/shared/ai_possible_fp_badge.vue create mode 100644 ee/config/feature_flags/wip/ai_experiment_sast_fp_detection.yml diff --git a/ee/app/assets/javascripts/security_dashboard/components/shared/ai_possible_fp_badge.vue b/ee/app/assets/javascripts/security_dashboard/components/shared/ai_possible_fp_badge.vue new file mode 100644 index 00000000000000..b9d3af12b5c736 --- /dev/null +++ b/ee/app/assets/javascripts/security_dashboard/components/shared/ai_possible_fp_badge.vue @@ -0,0 +1,127 @@ + + + diff --git a/ee/app/controllers/groups/security/vulnerabilities_controller.rb b/ee/app/controllers/groups/security/vulnerabilities_controller.rb index 020fd3c1e458d2..5a63ec96d0d4ca 100644 --- a/ee/app/controllers/groups/security/vulnerabilities_controller.rb +++ b/ee/app/controllers/groups/security/vulnerabilities_controller.rb @@ -20,6 +20,7 @@ class VulnerabilitiesController < Groups::ApplicationController push_frontend_ability(ability: :resolve_vulnerability_with_ai, resource: @group, user: current_user) push_frontend_feature_flag(:vulnerability_report_type_scanner_filter, @group, type: :beta) push_frontend_feature_flag(:security_policy_approval_warn_mode, @group, type: :wip) + push_frontend_feature_flag(:ai_experiment_sast_fp_detection, @group, type: :wip) push_frontend_ability(ability: :access_advanced_vulnerability_management, resource: @group, user: current_user) end diff --git a/ee/app/controllers/projects/security/vulnerabilities_controller.rb b/ee/app/controllers/projects/security/vulnerabilities_controller.rb index f148d5e8860c5e..0a453164365a54 100644 --- a/ee/app/controllers/projects/security/vulnerabilities_controller.rb +++ b/ee/app/controllers/projects/security/vulnerabilities_controller.rb @@ -17,6 +17,7 @@ class VulnerabilitiesController < Projects::ApplicationController push_frontend_feature_flag(:validity_checks, project) push_frontend_feature_flag(:secret_detection_validity_checks_refresh_token, project) push_frontend_feature_flag(:security_policy_approval_warn_mode, project) + push_frontend_feature_flag(:ai_experiment_sast_fp_detection, project) end alias_method :vulnerable, :project diff --git a/ee/app/controllers/projects/security/vulnerability_report_controller.rb b/ee/app/controllers/projects/security/vulnerability_report_controller.rb index 10de112ec0753f..0fffc04a77ad52 100644 --- a/ee/app/controllers/projects/security/vulnerability_report_controller.rb +++ b/ee/app/controllers/projects/security/vulnerability_report_controller.rb @@ -13,6 +13,7 @@ class VulnerabilityReportController < Projects::ApplicationController push_frontend_feature_flag(:validity_checks, @project, type: :wip) push_frontend_feature_flag(:vulnerability_report_type_scanner_filter, @project, type: :beta) push_frontend_feature_flag(:agentic_sast_vr_ui, @project, type: :wip) + push_frontend_feature_flag(:ai_experiment_sast_fp_detection, @project, type: :wip) push_frontend_feature_flag(:security_policy_approval_warn_mode, @project, type: :wip) push_frontend_ability(ability: :resolve_vulnerability_with_ai, resource: @project, user: current_user) push_frontend_ability(ability: :access_advanced_vulnerability_management, resource: @project, diff --git a/ee/app/controllers/security/vulnerabilities_controller.rb b/ee/app/controllers/security/vulnerabilities_controller.rb index 2f83a3037d2238..d6996a949a1b8f 100644 --- a/ee/app/controllers/security/vulnerabilities_controller.rb +++ b/ee/app/controllers/security/vulnerabilities_controller.rb @@ -16,6 +16,7 @@ class VulnerabilitiesController < ::Security::ApplicationController ) push_frontend_ability(ability: :resolve_vulnerability_with_ai, resource: vulnerable, user: current_user) + push_frontend_feature_flag(:ai_experiment_sast_fp_detection, current_user, type: :wip) end private diff --git a/ee/config/feature_flags/wip/ai_experiment_sast_fp_detection.yml b/ee/config/feature_flags/wip/ai_experiment_sast_fp_detection.yml new file mode 100644 index 00000000000000..3fe77304dd152a --- /dev/null +++ b/ee/config/feature_flags/wip/ai_experiment_sast_fp_detection.yml @@ -0,0 +1,10 @@ +--- +name: ai_experiment_sast_fp_detection +description: Enable the AI experiment for SAST false positive detection +feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/556855 +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/207477 +rollout_issue_url: +milestone: '18.5' +group: group::ai framework +type: wip +default_enabled: false -- GitLab From 2c5078f87108103c8c29c773537d6e2567b9f4af Mon Sep 17 00:00:00 2001 From: Illya Klymov Date: Wed, 8 Oct 2025 10:43:03 +0300 Subject: [PATCH 03/10] Add specs for possible FP badge component * verify expected behavior EE: true --- .../shared/ai_possible_fp_badge.vue | 2 +- .../javascripts/vulnerabilities/constants.js | 9 + .../shared/ai_possible_fp_badge_spec.js | 227 ++++++++++++++++++ 3 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 ee/spec/frontend/security_dashboard/components/shared/ai_possible_fp_badge_spec.js diff --git a/ee/app/assets/javascripts/security_dashboard/components/shared/ai_possible_fp_badge.vue b/ee/app/assets/javascripts/security_dashboard/components/shared/ai_possible_fp_badge.vue index b9d3af12b5c736..7d5b8c5f88220a 100644 --- a/ee/app/assets/javascripts/security_dashboard/components/shared/ai_possible_fp_badge.vue +++ b/ee/app/assets/javascripts/security_dashboard/components/shared/ai_possible_fp_badge.vue @@ -94,7 +94,7 @@ export default {