diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 759d3aca66ffd281c8c4387a3a2e52925fa2b2a1_LmdpdGxhYi1jaS55bWw=..c569b1776e01882fbe786301a86b080f764e85b0_LmdpdGxhYi1jaS55bWw= 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -57,8 +57,40 @@
    stage: main
    image: ${BASE_IMAGES_MERCURIAL}/hg-current:${BASE_IMAGES_TAG}
 
-# stable, default and hg-git-default removed until we decide to support
-# hg-evolve 11.0. Check `hg annotate` on the present line for easy revert
+
+tests-hg-stable:
+   extends:
+     - .tests-no-lint
+   rules:
+     # only the hg-git compat job is relevant for pipeline triggered
+     # by upstream hg-git pipelines
+     - <<: *unless-hg-git-triggered
+     - when: on_success  # for expliciteness
+   stage: compat
+   image: ${BASE_IMAGES_MERCURIAL}/hg-stable:${BASE_IMAGES_TAG}
+
+tests-hg-default:
+   extends:
+     - .tests-no-lint
+     - .only_py_heptapod_default
+   allow_failure: true
+   stage: compat
+   image: ${BASE_IMAGES_MERCURIAL}/hg-default:${BASE_IMAGES_TAG}
+
+tests-hg-git-default:
+  rules:
+    - if: '$CI_COMMIT_HG_BRANCH == "default"'
+    # upstream hg-git can in theory trigger for any branch of py-heptapod
+    - if: '$HG_GIT_TRIGGERING_SHA'
+    - when: never
+  allow_failure: true
+  variables:
+    HEPTAPOD_CI_HG_GIT_UPDATE: "true"
+    HEPTAPOD_CI_HG_GIT_REVISION: $HG_GIT_TRIGGERING_SHA
+  extends:
+    - .tests-no-lint
+  stage: compat
+  image: ${BASE_IMAGES_MERCURIAL}/hg-stable:${BASE_IMAGES_TAG}
 
 hgitaly:
   rules: