diff --git a/templates/gitlab-ci-helm.yml b/templates/gitlab-ci-helm.yml
index 90dc8d91ffdc691924a1345fff54212658eb91eb..842d5b821b8354b2e518ec2b1c12e368fd150a23 100644
--- a/templates/gitlab-ci-helm.yml
+++ b/templates/gitlab-ci-helm.yml
@@ -13,14 +13,33 @@
 # program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth 
 # Floor, Boston, MA  02110-1301, USA.
 # =========================================================================================
-# default workflow rules
+# default workflow rules: Merge Request pipelines
 workflow:
   rules:
-    # exclude merge requests
-    - if: $CI_MERGE_REQUEST_ID
+    # prevent branch pipeline when an MR is open (prefer MR pipeline)
+    - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
       when: never
     - when: always
 
+# test job prototype: implement adaptive pipeline rules
+.test-policy:
+  rules:
+    # on tag: auto & failing
+    - if: $CI_COMMIT_TAG
+    # on ADAPTIVE_PIPELINE_DISABLED: auto & failing
+    - if: '$ADAPTIVE_PIPELINE_DISABLED == "true"'
+    # on production or integration branch(es): auto & failing
+    - if: '$CI_COMMIT_REF_NAME =~ $PROD_REF || $CI_COMMIT_REF_NAME =~ $INTEG_REF'
+    # early stage (dev branch, no MR): manual & non-failing
+    - if: '$CI_MERGE_REQUEST_ID == null && $CI_OPEN_MERGE_REQUESTS == null'
+      when: manual
+      allow_failure: true
+    # Draft MR: auto & non-failing
+    - if: '$CI_MERGE_REQUEST_TITLE =~ /^Draft:.*/'
+      allow_failure: true
+    # else (Ready MR): auto & failing
+    - when: on_success
+
 variables:
   # variabilized tracking image
   TBC_TRACKING_IMAGE: "$CI_REGISTRY/to-be-continuous/tools/tracking:master"
@@ -508,7 +527,6 @@ stages:
 # ==================================================
 # Stage: check
 # ==================================================
-
 # lint-job is used to check the syntax of the Helm Chart for best practices.
 helm-lint:
   extends: .helm-base
@@ -535,8 +553,9 @@ helm-values-common-lint:
   rules:
     - if: '$HELM_YAMLLINT_DISABLED == "true"'
       when: never
-    - if: '$HELM_COMMON_VALUES'
-
+    - if: '$HELM_COMMON_VALUES == null || $HELM_COMMON_VALUES == ""'
+      when: never
+    - !reference [.test-policy, rules]
 
 helm-values-review-lint:
   extends: .helm-values-lint
@@ -546,8 +565,12 @@ helm-values-review-lint:
   rules:
     - if: '$HELM_YAMLLINT_DISABLED == "true"'
       when: never
+    - if: '$HELM_REVIEW_VALUES == null || $HELM_REVIEW_VALUES == ""'
+      when: never
     # only on non-production, non-integration branches
-    - if: '$HELM_REVIEW_VALUES && $CI_COMMIT_REF_NAME !~ $PROD_REF && $CI_COMMIT_REF_NAME !~ $INTEG_REF'
+    - if: '$CI_COMMIT_REF_NAME =~ $PROD_REF || $CI_COMMIT_REF_NAME =~ $INTEG_REF'
+      when: never
+    - !reference [.test-policy, rules]
 
 helm-values-integration-lint:
   extends: .helm-values-lint
@@ -557,8 +580,12 @@ helm-values-integration-lint:
   rules:
     - if: '$HELM_YAMLLINT_DISABLED == "true"'
       when: never
-    # only on integration branch(es)
-    - if: '$HELM_INTEG_VALUES && $CI_COMMIT_REF_NAME =~ $INTEG_REF'
+    - if: '$HELM_INTEG_VALUES == null || $HELM_INTEG_VALUES == ""'
+      when: never
+    # only on non-production branches
+    - if: '$CI_COMMIT_REF_NAME =~ $PROD_REF'
+      when: never
+    - !reference [.test-policy, rules]
 
 helm-values-staging-lint:
   extends: .helm-values-lint
@@ -568,8 +595,9 @@ helm-values-staging-lint:
   rules:
     - if: '$HELM_YAMLLINT_DISABLED == "true"'
       when: never
-    # only on production branch(es)
-    - if: '$HELM_STAGING_VALUES && $CI_COMMIT_REF_NAME =~ $PROD_REF'
+    - if: '$HELM_STAGING_VALUES == null || $HELM_STAGING_VALUES == ""'
+      when: never
+    - !reference [.test-policy, rules]
 
 helm-values-prod-lint:
   extends: .helm-values-lint
@@ -579,8 +607,9 @@ helm-values-prod-lint:
   rules:
     - if: '$HELM_YAMLLINT_DISABLED == "true"'
       when: never
-    # only on production branch(es)
-    - if: '$HELM_PROD_VALUES && $CI_COMMIT_REF_NAME =~ $PROD_REF'
+    - if: '$HELM_PROD_VALUES == null || $HELM_PROD_VALUES == ""'
+      when: never
+    - !reference [.test-policy, rules]
 
 helm-review-score:
   extends: .helm-score
@@ -593,11 +622,12 @@ helm-review-score:
     # exclude when $HELM_KUBE_SCORE_DISABLED is set
     - if: '$HELM_KUBE_SCORE_DISABLED == "true"'
       when: never
-    # else: only on non-production, non-integration branches + allow failure
-    - if: $HELM_REVIEW_VALUES && $CI_COMMIT_REF_NAME !~ $PROD_REF && $CI_COMMIT_REF_NAME !~ $INTEG_REF
-      exists:
-        - "**/Chart.yaml"
-      allow_failure: true
+    - if: '$HELM_REVIEW_VALUES == null || $HELM_REVIEW_VALUES == ""'
+      when: never
+    # only on non-production, non-integration branches
+    - if: '$CI_COMMIT_REF_NAME =~ $PROD_REF || $CI_COMMIT_REF_NAME =~ $INTEG_REF'
+      when: never
+    - !reference [.test-policy, rules]
 
 helm-integration-score:
   extends: .helm-score
@@ -610,11 +640,12 @@ helm-integration-score:
     # exclude when $K8S_SCORE_DISABLED is set
     - if: '$HELM_KUBE_SCORE_DISABLED == "true"'
       when: never
-    # else: only on integration branch(es) + allow failure
-    - if: $HELM_INTEG_VALUES && $CI_COMMIT_REF_NAME =~ $INTEG_REF
-      exists:
-        - "**/Chart.yaml"
-      allow_failure: true
+    - if: '$HELM_INTEG_VALUES == null || $HELM_INTEG_VALUES == ""'
+      when: never
+    # only on non-production branches
+    - if: '$CI_COMMIT_REF_NAME =~ $PROD_REF'
+      when: never
+    - !reference [.test-policy, rules]
 
 helm-staging-score:
   extends: .helm-score
@@ -627,11 +658,9 @@ helm-staging-score:
     # exclude when $K8S_SCORE_DISABLED is set
     - if: '$HELM_KUBE_SCORE_DISABLED == "true"'
       when: never
-    # else: only on production branch(es) + allow failure
-    - if: $HELM_STAGING_VALUES && $CI_COMMIT_REF_NAME =~ $PROD_REF
-      exists:
-        - "**/Chart.yaml"
-      allow_failure: true
+    - if: '$HELM_STAGING_VALUES == null || $HELM_STAGING_VALUES == ""'
+      when: never
+    - !reference [.test-policy, rules]
 
 helm-prod-score:
   extends: .helm-score
@@ -644,11 +673,9 @@ helm-prod-score:
     # exclude when $K8S_SCORE_DISABLED is set
     - if: '$HELM_KUBE_SCORE_DISABLED == "true"'
       when: never
-    # else: only on production branch(es) + allow failure
-    - if: $HELM_PROD_VALUES && $CI_COMMIT_REF_NAME =~ $PROD_REF
-      exists:
-        - "**/Chart.yaml"
-      allow_failure: true
+    - if: '$HELM_PROD_VALUES == null || $HELM_PROD_VALUES == ""'
+      when: never
+    - !reference [.test-policy, rules]
 
 # ==================================================
 # Stage: package-build
@@ -803,11 +830,9 @@ helm-publish:
   script:
     - test "$environment_type" "$environment_name" "${ENV_NAMESPACE:-${KUBE_NAMESPACE}}"
 
-
 # ==================================================
 # Stage: review
 # ==================================================
-
 # deploy to review env (only for feature branches)
 # enabled by default, disable this job by setting $HELM_REVIEW_DISABLED
 helm-review:
@@ -824,7 +849,7 @@ helm-review:
     on_stop: helm-cleanup-review
   resource_group: review/$CI_COMMIT_REF_NAME
   rules:
-    # exclude merge requests, tags and on $HELM_REVIEW_DISABLED set
+    # exclude tags and on $HELM_REVIEW_DISABLED set
     - if: '$HELM_REVIEW_DISABLED == "true" || $CI_COMMIT_TAG'
       when: never
     # only on non-production, non-integration branches
@@ -843,7 +868,7 @@ helm-cleanup-review:
     action: stop
   resource_group: review/$CI_COMMIT_REF_NAME
   rules:
-    # exclude merge requests, tags and on $HELM_REVIEW_DISABLED set
+    # exclude tags and on $HELM_REVIEW_DISABLED set
     - if: '$HELM_REVIEW_DISABLED == "true" || $CI_COMMIT_TAG'
       when: never
     # only on non-production, non-integration branches
@@ -860,16 +885,21 @@ helm-test-review:
     ENV_KUBE_CONFIG: "$HELM_REVIEW_KUBE_CONFIG"
     ENV_NAMESPACE: "$HELM_REVIEW_NAMESPACE"
   rules:
-    # exclude merge requests, tags and on $HELM_REVIEW_DISABLED set
-    - if: '$HELM_REVIEW_DISABLED == "true" || $CI_COMMIT_TAG'
+    - if: $CI_COMMIT_TAG
       when: never
-    # only on non-production, non-integration branches
-    - if: '$CI_COMMIT_REF_NAME !~ $PROD_REF && $CI_COMMIT_REF_NAME !~ $INTEG_REF && $HELM_TEST_ENABLED == "true"'
+    - if: '$HELM_TEST_ENABLED != "true"'
+      when: never
+    - if: '$HELM_REVIEW_DISABLED == "true"'
+      when: never
+    # exclude on production or integration branch(es)
+    - if: '$CI_COMMIT_REF_NAME =~ $PROD_REF || $CI_COMMIT_REF_NAME =~ $INTEG_REF'
+      when: never
+    # then use common test jobs policy
+    - !reference [.test-policy, rules]
 
 # ==================================================
 # Stage: integration
 # ==================================================
-
 # deploy to integration env (only for integration branches)
 # enabled by default, disable this job by setting $HELM_INTEG_DISABLED
 helm-integration:
@@ -923,16 +953,21 @@ helm-test-integration:
     ENV_NAMESPACE: "$HELM_INTEG_NAMESPACE"
     ENV_VALUES: "$HELM_INTEG_VALUES"
   rules:
-    # exclude merge requests and on $HELM_INTEG_DISABLED set
+    - if: $CI_COMMIT_TAG
+      when: never
+    - if: '$HELM_TEST_ENABLED != "true"'
+      when: never
     - if: '$HELM_INTEG_DISABLED == "true"'
       when: never
-    # only on integration branch(es)
-    - if: '$CI_COMMIT_REF_NAME =~ $INTEG_REF && $HELM_TEST_ENABLED == "true"'
+    # exclude on non-integration branch
+    - if: '$CI_COMMIT_REF_NAME !~ $INTEG_REF'
+      when: never
+    # then use common test jobs policy
+    - !reference [.test-policy, rules]
 
 # ==================================================
 # Stage: staging
 # ==================================================
-
 helm-staging:
   extends: .helm-deploy
   variables:
@@ -974,7 +1009,6 @@ helm-cleanup-staging:
       when: manual
       allow_failure: true
 
-
 helm-test-staging:
   extends: .helm-test
   variables:
@@ -983,15 +1017,21 @@ helm-test-staging:
     ENV_NAMESPACE: "$HELM_STAGING_NAMESPACE"
     ENV_VALUES: "$HELM_STAGING_VALUES"
   rules:
-    # exclude merge requests and on $HELM_STAGING_DISABLED set
+    - if: $CI_COMMIT_TAG
+      when: never
+    - if: '$HELM_TEST_ENABLED != "true"'
+      when: never
     - if: '$HELM_STAGING_DISABLED == "true"'
       when: never
-    # only on production branch(es)
-    - if: '$CI_COMMIT_REF_NAME =~ $PROD_REF && $HELM_TEST_ENABLED == "true" '
+    # exclude on non-production branch
+    - if: '$CI_COMMIT_REF_NAME !~ $PROD_REF'
+      when: never
+    # then use common test jobs policy
+    - !reference [.test-policy, rules]
+
 # ==================================================
 # Stage: production
 # ==================================================
-
 helm-production:
   extends: .helm-deploy
   stage: production