diff --git a/ee/app/services/security/security_orchestration_policies/validate_policy_service.rb b/ee/app/services/security/security_orchestration_policies/validate_policy_service.rb
index 302bdd4b92345dcc6773fbf9f407685346e15d25..bf1d4360e730d21e5c7ff8ad7b449d3146145dc9 100644
--- a/ee/app/services/security/security_orchestration_policies/validate_policy_service.rb
+++ b/ee/app/services/security/security_orchestration_policies/validate_policy_service.rb
@@ -24,20 +24,13 @@ def execute
         return error_with_title(s_('SecurityOrchestration|Invalid Compliance Framework ID(s)'), field: :compliance_frameworks) if invalid_compliance_framework_ids?
 
         return error_with_title(s_('SecurityOrchestration|Required approvals exceed eligible approvers.'), title: s_('SecurityOrchestration|Logic error'), field: :approvers_ids) if required_approvals_exceed_eligible_approvers?
-
-        if should_validate_cadence? && invalid_cadence?
-          return error_with_title(s_('SecurityOrchestration|Cadence is invalid'), field: :cadence)
-        end
+        return error_with_title(s_('SecurityOrchestration|Cadence is invalid'), field: :cadence) if invalid_cadence?
 
         success
       end
 
       private
 
-      def should_validate_cadence?
-        container.present? && Feature.enabled?(:scan_execution_policy_cadence_validation, container)
-      end
-
       def error_with_title(message, field: DEFAULT_VALIDATION_ERROR_FIELD, title: nil, level: :error)
         pass_back = {
           details: [message],
diff --git a/ee/app/workers/security/orchestration_policy_rule_schedule_namespace_worker.rb b/ee/app/workers/security/orchestration_policy_rule_schedule_namespace_worker.rb
index 3f4de18236a7dec5ee754e33a8fe4d4dd73fedf3..3ce168d7651279996f843c3f995d58aea8b6b0de 100644
--- a/ee/app/workers/security/orchestration_policy_rule_schedule_namespace_worker.rb
+++ b/ee/app/workers/security/orchestration_policy_rule_schedule_namespace_worker.rb
@@ -19,6 +19,13 @@ def perform(rule_schedule_id)
       security_orchestration_policy_configuration = schedule.security_orchestration_policy_configuration
       return unless should_run?(security_orchestration_policy_configuration, schedule)
 
+      namespace = security_orchestration_policy_configuration.namespace
+
+      unless valid_cadence?(schedule.cron)
+        log_invalid_cadence_error(namespace.id, schedule.cron)
+        return
+      end
+
       if Feature.enabled?(:batched_scan_execution_scheduled_pipelines, security_orchestration_policy_configuration.namespace)
         return perform_in_batches_with_delay(schedule, security_orchestration_policy_configuration)
       end
@@ -28,10 +35,6 @@ def perform(rule_schedule_id)
       projects_in_batches(security_orchestration_policy_configuration).each do |projects|
         bots_by_project_id = security_policy_bot_ids_by_project_ids(projects)
         projects.each do |project|
-          if Feature.enabled?(:scan_execution_policy_cadence_validation, project) && !valid_cadence?(schedule.cron)
-            next log_invalid_cadence_error(project.id, schedule.cron)
-          end
-
           user_id = bots_by_project_id[project.id]
           next prepare_security_policy_bot_user(project) unless user_id
 
@@ -118,5 +121,12 @@ def projects_in_batches(configuration, batch_size = BATCH_SIZE)
         .select(:id)
         .find_in_batches(batch_size: batch_size) # rubocop: disable CodeReuse/ActiveRecord -- A custom batch size is needed because querying too many bot users at once is too expensive
     end
+
+    def log_invalid_cadence_error(namespace_id, cadence)
+      Gitlab::AppJsonLogger.info(event: 'scheduled_scan_execution_policy_validation',
+        message: 'Invalid cadence',
+        namespace_id: namespace_id,
+        cadence: cadence)
+    end
   end
 end
diff --git a/ee/app/workers/security/orchestration_policy_rule_schedule_worker.rb b/ee/app/workers/security/orchestration_policy_rule_schedule_worker.rb
index 4b31e3f66a2cd32ac88340015a4dd663dddf33e8..f723b4e0826c65622f44f23fb5e733d6afaad24a 100644
--- a/ee/app/workers/security/orchestration_policy_rule_schedule_worker.rb
+++ b/ee/app/workers/security/orchestration_policy_rule_schedule_worker.rb
@@ -35,7 +35,7 @@ def schedule_rules(schedule)
 
       user = project.security_policy_bot
 
-      if Feature.enabled?(:scan_execution_policy_cadence_validation, project) && !valid_cadence?(schedule.cron)
+      unless valid_cadence?(schedule.cron)
         log_invalid_cadence_error(project.id, schedule.cron)
         return
       end
diff --git a/ee/config/feature_flags/beta/scan_execution_policy_cadence_validation.yml b/ee/config/feature_flags/beta/scan_execution_policy_cadence_validation.yml
deleted file mode 100644
index da9da70b4477e3e7348de3e24ff55bc4f6071504..0000000000000000000000000000000000000000
--- a/ee/config/feature_flags/beta/scan_execution_policy_cadence_validation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: scan_execution_policy_cadence_validation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147576
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/451859
-milestone: '16.11'
-type: beta
-group: group::security policies
-default_enabled: true
diff --git a/ee/spec/services/security/security_orchestration_policies/validate_policy_service_spec.rb b/ee/spec/services/security/security_orchestration_policies/validate_policy_service_spec.rb
index d051442e86196297ad0b602688ee07da7ac6a462..3dca9b4bab1e89334266df0c7ff541f7c217ab51 100644
--- a/ee/spec/services/security/security_orchestration_policies/validate_policy_service_spec.rb
+++ b/ee/spec/services/security/security_orchestration_policies/validate_policy_service_spec.rb
@@ -497,14 +497,6 @@
 
           it { expect(result[:status]).to eq(:error) }
           it { expect(result[:details]).to match_array(['Cadence is invalid']) }
-
-          context 'when the feature flag scan_execution_policy_cadence_validation is disabled' do
-            before do
-              stub_feature_flags(scan_execution_policy_cadence_validation: false)
-            end
-
-            it { expect(result[:status]).to eq(:success) }
-          end
         end
       end
     end
@@ -573,18 +565,7 @@
       it_behaves_like 'checks if branches are provided in rule'
       it_behaves_like 'checks if timezone is valid'
       it_behaves_like 'checks if vulnerability_age is valid'
-
-      context 'when cadence is valid' do
-        let(:cadence) { '0 0 * * *' }
-
-        it { expect(result[:status]).to eq(:success) }
-      end
-
-      context 'when cadence is invalid' do
-        let(:cadence) { '* * * * *' }
-
-        it { expect(result[:status]).to eq(:success) }
-      end
+      it_behaves_like 'checks if cadence is valid'
     end
 
     context 'when project is provided' do
diff --git a/ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb b/ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb
index 8db21773a1c0ecc232f4d0975b189afeb0e18cf5..f6a7aea1e12e33b4548677b4234faf8608cb062a 100644
--- a/ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb
+++ b/ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb
@@ -158,13 +158,11 @@
         end
 
         it 'logs the error' do
-          [project_1, project_2].each do |project|
-            expect(::Gitlab::AppJsonLogger).to receive(:info).once.with(
-              event: 'scheduled_scan_execution_policy_validation',
-              message: 'Invalid cadence',
-              project_id: project.id,
-              cadence: schedule.cron).and_call_original
-          end
+          expect(::Gitlab::AppJsonLogger).to receive(:info).once.with(
+            event: 'scheduled_scan_execution_policy_validation',
+            message: 'Invalid cadence',
+            namespace_id: namespace.id,
+            cadence: schedule.cron).and_call_original
 
           worker.perform(schedule_id)
         end