diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index be19b1f674f44e452a4cabd272d2c70308a3864f..e76fd4433058334dcc5086445b22d1f3e1420a08 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -871,6 +871,13 @@ To verify that code and its specs are well-isolated from Rails, run the spec
 individually via `bin/rspec`. Don't use `bin/spring rspec` as it loads
 `spec_helper` automatically.
 
+#### Maintaining fast_spec_helper specs
+
+There is a utility script `scripts/run-fast-specs.sh` which can be used to run
+all specs which use `fast_spec_helper`, in various ways. This script is useful
+to help identify `fast_spec_helper` specs which have problems, such as not
+running successfully in isolation. See the script for more details.
+
 ### `subject` and `let` variables
 
 The GitLab RSpec suite has made extensive use of `let`(along with its strict, non-lazy
diff --git a/ee/spec/lib/gitlab/llm/chain/answers/streamed_json_spec.rb b/ee/spec/lib/gitlab/llm/chain/answers/streamed_json_spec.rb
index 7dfa14bab3857574df15872774572debb5e185bd..10a0a15942cf340bc1168a74c8c2c5921ece150b 100644
--- a/ee/spec/lib/gitlab/llm/chain/answers/streamed_json_spec.rb
+++ b/ee/spec/lib/gitlab/llm/chain/answers/streamed_json_spec.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+# require 'fast_spec_helper' -- this no longer runs under fast_spec_helper
+require 'spec_helper'
 
 RSpec.describe Gitlab::Llm::Chain::Answers::StreamedJson, feature_category: :duo_chat do
   describe "#next_chunk" do
diff --git a/ee/spec/lib/system_check/app/search_check_spec.rb b/ee/spec/lib/system_check/app/search_check_spec.rb
index 2e033b09ffb8ee385e6f383851af4f7cdc7d9080..b507e2597f014607cdf99283ce8af8362fb11e64 100644
--- a/ee/spec/lib/system_check/app/search_check_spec.rb
+++ b/ee/spec/lib/system_check/app/search_check_spec.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+# require 'fast_spec_helper' -- this no longer runs under fast_spec_helper
+require 'spec_helper'
 require 'rspec-parameterized'
 
 RSpec.describe SystemCheck::App::SearchCheck do
diff --git a/scripts/run-fast-specs.sh b/scripts/run-fast-specs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c46da331ef73f0272898c94e56b8fd2f75e50a36
--- /dev/null
+++ b/scripts/run-fast-specs.sh
@@ -0,0 +1,97 @@
+#!/usr/bin/env bash
+
+# shellcheck disable=SC2059
+
+BCyan='\033[1;36m'
+BRed='\033[1;31m'
+BGreen='\033[1;32m'
+BBlue='\033[1;34m'
+Color_Off='\033[0m'
+
+set -o errexit
+set -o pipefail
+trap onexit_err ERR
+
+# Exit handling
+function onexit_err() {
+  local exit_status=${1:-$?}
+  printf "\n❌❌❌ ${BRed}Run of fast_spec_helper specs failed!${Color_Off} ❌❌❌\n"
+  exit "${exit_status}"
+}
+
+function print_start_message {
+  trap onexit_err ERR
+
+  printf "${BCyan}\nStarting run of fast_spec_helper specs...${Color_Off}\n"
+}
+
+function run_fast_spec_helper_specs {
+  trap onexit_err ERR
+
+  printf "\n\n${BBlue}Running specs which use fast_spec_helper and also run fast...${Color_Off}\n\n"
+
+  # TIP: Add '--format=documentation --order=stable' when debugging flaky interaction between specs
+  bin/rspec --tag=~uses_fast_spec_helper_but_runs_slow "${fast_spec_helper_specs[@]}"
+}
+
+function run_fast_spec_helper_specs_which_are_slow {
+  trap onexit_err ERR
+
+  printf "\n\n${BBlue}Running specs which use fast_spec_helper but actually run slow...${Color_Off}\n\n"
+
+  # NOTE: fails_if_sidekiq_not_configured tag is used to skip specs which require special local config for sidekiq
+  bin/rspec --tag=uses_fast_spec_helper_but_runs_slow --tag=~fails_if_sidekiq_not_configured "${fast_spec_helper_specs[@]}"
+}
+
+function run_all_fast_spec_helper_specs_individually {
+  trap onexit_err ERR
+
+  printf "\n\n${BBlue}INDIVIDUALLY running all specs which use fast_spec_helper to ensure they run in isolation (this will be SLOW! Set SPEC_FILE_TO_START_AT to skip known-good spec files)...${Color_Off}\n\n"
+
+  # NOTE: Override `SPEC_FILE_TO_START_AT` to the relative path of a specific file in order to skip specs which are already known to be passing
+  SPEC_FILE_TO_START_AT="${SPEC_FILE_TO_START_AT:-${fast_spec_helper_specs[0]}}"
+
+  for spec_file in "${fast_spec_helper_specs[@]}"; do
+    if [ "${spec_file}" = "${SPEC_FILE_TO_START_AT}" ]; then
+      printf "${BBlue}Starting individual spec runs at SPEC_FILE_TO_START_AT: '${SPEC_FILE_TO_START_AT}'${Color_Off}\n\n"
+      START_RUNNING=true
+    fi
+
+    if [ -n "${START_RUNNING}" ]; then
+      printf "${BBlue}Running spec '${spec_file}' individually:${Color_Off}\n"
+      bin/rspec --tag=~fails_if_sidekiq_not_configured "$spec_file"
+    fi
+  done
+}
+
+function print_success_message {
+  trap onexit_err ERR
+
+  printf "\n✅✅✅ ${BGreen}All executed fast_spec_helper specs passed successfully!${Color_Off} ✅✅✅\n"
+}
+
+function main {
+  trap onexit_err ERR
+
+  # cd to gitlab root directory
+  cd "$(dirname "${BASH_SOURCE[0]}")"/..
+
+  # See https://github.com/koalaman/shellcheck/wiki/SC2207 for more context on this approach of creating an array
+  fast_spec_helper_specs=()
+  while IFS='' read -r line; do
+      fast_spec_helper_specs+=("$line")
+  done < <(git grep -l -E '^require .fast_spec_helper' -- '**/*_spec.rb')
+
+  print_start_message
+
+  if [ -n "${RUN_ALL_FAST_SPECS_INDIVIDUALLY}" ]; then
+    run_all_fast_spec_helper_specs_individually
+  else
+    run_fast_spec_helper_specs
+    run_fast_spec_helper_specs_which_are_slow
+  fi
+
+  print_success_message
+}
+
+main "$@"
diff --git a/spec/bin/sidekiq_cluster_spec.rb b/spec/bin/sidekiq_cluster_spec.rb
index 3379fee12632003e1d89496991011c58a158fd28..2e0c1f67a9520b67215c4645310608d33c5acda5 100644
--- a/spec/bin/sidekiq_cluster_spec.rb
+++ b/spec/bin/sidekiq_cluster_spec.rb
@@ -4,7 +4,7 @@
 require 'shellwords'
 require 'rspec-parameterized'
 
-RSpec.describe 'bin/sidekiq-cluster', :aggregate_failures do
+RSpec.describe 'bin/sidekiq-cluster', :uses_fast_spec_helper_but_runs_slow, :fails_if_sidekiq_not_configured, :aggregate_failures do
   using RSpec::Parameterized::TableSyntax
 
   let(:root) { File.expand_path('../..', __dir__) }
diff --git a/spec/commands/diagnostic_reports/uploader_smoke_spec.rb b/spec/commands/diagnostic_reports/uploader_smoke_spec.rb
index 1ec4eb407d8b6a242f0dc96107969093f8213fa6..e9d157bda08bcf454ce4e9a53b478d78231d0718 100644
--- a/spec/commands/diagnostic_reports/uploader_smoke_spec.rb
+++ b/spec/commands/diagnostic_reports/uploader_smoke_spec.rb
@@ -5,7 +5,7 @@
 
 # We need to capture pid from Process.spawn and then clean up by killing the process, which requires instance variables.
 # rubocop: disable RSpec/InstanceVariable
-RSpec.describe 'bin/diagnostic-reports-uploader' do
+RSpec.describe 'bin/diagnostic-reports-uploader', :uses_fast_spec_helper_but_runs_slow do
   # This is a smoke test for 'bin/diagnostic-reports-uploader'.
   # We intend to run this binary with `ruby bin/diagnostic-reports-uploader`, without preloading the entire Rails app.
   # Also, we use inline gemfile, to avoid pulling full Gemfile from the main app into memory.
diff --git a/spec/dot_gitlab_ci/rules_spec.rb b/spec/dot_gitlab_ci/rules_spec.rb
index 85a72fa32adf13740ce99903da434d111971cc2f..d5892b5a42acbb4fa2b74c8aa4d9f735b6cb0da6 100644
--- a/spec/dot_gitlab_ci/rules_spec.rb
+++ b/spec/dot_gitlab_ci/rules_spec.rb
@@ -1,6 +1,9 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+# NOTE: Do not remove the parentheses from this require statement!
+#       They are necessary so it doesn't match the regex in `scripts/run-fast-specs.sh`,
+#       and make the "fast" portion of that suite run slow.
+require('fast_spec_helper') # NOTE: Do not remove the parentheses from this require statement!
 
 PatternsList = Struct.new(:name, :patterns)
 
diff --git a/spec/haml_lint/linter/inline_javascript_spec.rb b/spec/haml_lint/linter/inline_javascript_spec.rb
index fb35bb68247383eb9c628198954bbefb03338937..9d00e3ab9d4a4b3adc593d35fedbeb9c95872813 100644
--- a/spec/haml_lint/linter/inline_javascript_spec.rb
+++ b/spec/haml_lint/linter/inline_javascript_spec.rb
@@ -7,7 +7,7 @@
 
 require_relative '../../../haml_lint/linter/inline_javascript'
 
-RSpec.describe HamlLint::Linter::InlineJavaScript do # rubocop:disable RSpec/FilePath
+RSpec.describe HamlLint::Linter::InlineJavaScript, :uses_fast_spec_helper_but_runs_slow do # rubocop:disable RSpec/FilePath
   using RSpec::Parameterized::TableSyntax
 
   include_context 'linter'
diff --git a/spec/lib/gitlab/ci/config/entry/include/rules_spec.rb b/spec/lib/gitlab/ci/config/entry/include/rules_spec.rb
index 503020e2202c010bdabcda05fcf7d461c79d23fb..c8e53082c93ce485a0a70da3fcaa10d24783b3b9 100644
--- a/spec/lib/gitlab/ci/config/entry/include/rules_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/include/rules_spec.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+# require 'fast_spec_helper' -- this no longer runs under fast_spec_helper
+require 'spec_helper'
 require_dependency 'active_model'
 
 RSpec.describe Gitlab::Ci::Config::Entry::Include::Rules, feature_category: :pipeline_composition do
diff --git a/spec/lib/gitlab/graphql/known_operations_spec.rb b/spec/lib/gitlab/graphql/known_operations_spec.rb
index acb85bc737b6ab26deb56dd44e2a9ccca0f87650..601cc10ef0323cbb83659c26100029955d3c0b7c 100644
--- a/spec/lib/gitlab/graphql/known_operations_spec.rb
+++ b/spec/lib/gitlab/graphql/known_operations_spec.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+# require 'fast_spec_helper' -- this no longer runs under fast_spec_helper
+require 'spec_helper'
 require 'rspec-parameterized'
 
 RSpec.describe Gitlab::Graphql::KnownOperations do
diff --git a/spec/lib/gitlab/i18n/pluralization_spec.rb b/spec/lib/gitlab/i18n/pluralization_spec.rb
index 6bfc500c8b89ad6f2d58479f3005f42623eeccd7..4aab6daa21e96be0fcd731e4380f44592b6f13e2 100644
--- a/spec/lib/gitlab/i18n/pluralization_spec.rb
+++ b/spec/lib/gitlab/i18n/pluralization_spec.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+# require 'fast_spec_helper' -- this no longer runs under fast_spec_helper
+require 'spec_helper'
 require 'rspec-parameterized'
 require 'rails/version'
 require 'gettext_i18n_rails'
diff --git a/spec/lib/gitlab/instrumentation/redis_cluster_validator_spec.rb b/spec/lib/gitlab/instrumentation/redis_cluster_validator_spec.rb
index ea5a32a25ff1cefc0687ffa21ac2b3ca3d71ab80..679006f00c3c42247b7a89adffabe2aba2f9a80d 100644
--- a/spec/lib/gitlab/instrumentation/redis_cluster_validator_spec.rb
+++ b/spec/lib/gitlab/instrumentation/redis_cluster_validator_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
-require 'support/helpers/rails_helpers'
+# require 'fast_spec_helper' -- this no longer runs under fast_spec_helper
+require 'spec_helper'
 require 'rspec-parameterized'
 
 RSpec.describe Gitlab::Instrumentation::RedisClusterValidator, feature_category: :scalability do
diff --git a/spec/lib/gitlab/pagination/offset_header_builder_spec.rb b/spec/lib/gitlab/pagination/offset_header_builder_spec.rb
index f43216702a848e5c6dc3f10684b9b4ed105ccc84..dc964ad502f0129cb2ba63b06dd83f5aa5b20cde 100644
--- a/spec/lib/gitlab/pagination/offset_header_builder_spec.rb
+++ b/spec/lib/gitlab/pagination/offset_header_builder_spec.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+# require 'fast_spec_helper' -- this no longer runs under fast_spec_helper
+require 'spec_helper'
 
 RSpec.describe Gitlab::Pagination::OffsetHeaderBuilder do
   let(:request) { double(url: 'http://localhost') }
diff --git a/spec/lib/remote_development/settings_spec.rb b/spec/lib/remote_development/settings_spec.rb
index 1d95f85bf719d9f769d5338d6db9f612630fe46f..ef11e716a4244b581d562321ad3075f172726c67 100644
--- a/spec/lib/remote_development/settings_spec.rb
+++ b/spec/lib/remote_development/settings_spec.rb
@@ -2,7 +2,7 @@
 
 require 'fast_spec_helper'
 
-RSpec.describe RemoteDevelopment::Settings, feature_category: :remote_development do
+RSpec.describe RemoteDevelopment::Settings, :rd_fast, feature_category: :remote_development do
   let(:response_hash) { { settings: { some_setting: 42 }, status: :success } }
   let(:get_settings_args) { { requested_setting_names: [:some_setting], options: { some_option: 42 } } }
 
diff --git a/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb b/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb
index e0c05379a9e0b3b59f0dd4acbb97db6c6d5dd440..0536d0e67d32b2662c612b452be512244a1b199b 100644
--- a/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb
+++ b/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+# require 'fast_spec_helper' -- this no longer runs under fast_spec_helper
+require 'spec_helper'
 
 RSpec.describe Sidebars::Concerns::SuperSidebarPanel, feature_category: :navigation do
   let(:menu_class_foo) { Class.new(Sidebars::Menu) }
diff --git a/spec/scripts/lib/glfm/update_example_snapshots_spec.rb b/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
index 82a398ea204a050b95cb60164dab42450179933e..41466995ead34e709e84539e174941c8d9fd29ad 100644
--- a/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
+++ b/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
@@ -28,7 +28,7 @@
 # Also, the textual content of the individual fixture file entries is also crafted to help
 # indicate which scenarios which they are covering.
 # rubocop:disable RSpec/MultipleMemoizedHelpers
-RSpec.describe Glfm::UpdateExampleSnapshots, '#process', feature_category: :team_planning do
+RSpec.describe Glfm::UpdateExampleSnapshots, '#process', :uses_fast_spec_helper_but_runs_slow, feature_category: :team_planning do
   subject { described_class.new }
 
   # GLFM input files
diff --git a/spec/scripts/lib/glfm/update_specification_spec.rb b/spec/scripts/lib/glfm/update_specification_spec.rb
index 6b9ba8e59be73f87ad6f51c6198cba88bd9761df..753623979f261d5062b0fd96efdcd566450d16a7 100644
--- a/spec/scripts/lib/glfm/update_specification_spec.rb
+++ b/spec/scripts/lib/glfm/update_specification_spec.rb
@@ -27,7 +27,7 @@
 # should run in sub-second time when the Spring pre-loader is used. This allows
 # logic which is not directly related to the slow sub-processes to be TDD'd with a
 # very rapid feedback cycle.
-RSpec.describe Glfm::UpdateSpecification, '#process', feature_category: :team_planning do
+RSpec.describe Glfm::UpdateSpecification, '#process', :uses_fast_spec_helper_but_runs_slow, feature_category: :team_planning do
   include NextInstanceOf
 
   subject { described_class.new }