diff --git a/.gitlab-ci-pages.yml b/.gitlab-ci-pages.yml
index b516d8709c79dab3de0a38464aa8aab176df62cd..79662cadfe499e33add554dcb7d2e54675ef25a2 100644
--- a/.gitlab-ci-pages.yml
+++ b/.gitlab-ci-pages.yml
@@ -4,6 +4,7 @@ include:
     file: .gitlab-ci-base.yml
 
 pages:
+  stage: build
   extends: .onion-mkdocs-clone
   after_script:
     - $ONION_MKDOCS_LOCATION/scripts/onion-mkdocs-provision-build
diff --git a/.gitlab-ci-slides.yml b/.gitlab-ci-slides.yml
index 50527919dcadb8a11443d691e8f5081f94183480..3ed5cce10544536e10db8a022be77c2daf23d7cc 100644
--- a/.gitlab-ci-slides.yml
+++ b/.gitlab-ci-slides.yml
@@ -1,5 +1,6 @@
 slides:
   image: debian:bookworm
+  stage: build
   script:
     - apt-get update
     - apt-get install -y git
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ab0e3e8c49232b5be06f277a3415b618ecf757e7..343f9717ea8fb0a0b3d96e8af4c3931262f20e0b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,7 +3,12 @@ include:
   - local: '.gitlab-ci-pages.yml'
   - local: '.gitlab-ci-slides.yml'
 
+#
+# Python
+#
+
 python:
+  stage: build
   image: debian:bookworm
   script:
     - apt-get update
@@ -19,7 +24,12 @@ python:
   #only:
   #  - main
 
+#
+# Debian
+#
+
 debian:
+  stage: build
   # Using bookworm support due to the pybuild-plugin-pyproject package
   #image: debian:bookworm
   #image: debian:bookworm-backports
@@ -42,8 +52,13 @@ debian:
   #only:
   #  - main
 
+#
+# Configuration
+#
+
 configs:
   image: debian:bookworm
+  stage: build
   script:
     - apt-get update
     - apt-get install -y git
@@ -59,8 +74,13 @@ configs:
   #only:
   #  - main
 
+#
+# Documentation
+#
+
 #manpage:
 #  image: debian:bookworm
+#  stage: build
 #  script:
 #    - apt-get update
 #    - apt-get install -y git
@@ -76,6 +96,30 @@ configs:
 #  only:
 #    - main
 
+#
+# Prometheus
+# Thanks https://gitlab.torproject.org/tpo/tpa/prometheus-alerts
+#
+
+pint:
+  stage: test
+  image: ghcr.io/cloudflare/pint
+  script:
+    - pint lint configs/prometheus/*rules*
+
+promtool:
+  stage: test
+  image:
+    name: quay.io/prometheus/prometheus
+    entrypoint: [""]
+  script:
+    - promtool check config configs/prometheus/prometheus.yml
+    - promtool test rules configs/prometheus/test.yml
+
+#
+# Release
+#
+
 release:
   image: registry.gitlab.com/gitlab-org/release-cli:latest
   stage: .post
diff --git a/configs/prometheus/test.yml b/configs/prometheus/test.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5076840cc5a98a5547760b13ed0b20dffcab1f2f
--- /dev/null
+++ b/configs/prometheus/test.yml
@@ -0,0 +1,22 @@
+---
+# Sample Prometheus test rule file to be used with Docker Compose.
+#
+# Copyright (C) 2025 The Tor Project, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation, either version 3 of the License,
+# or any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+rule_files:
+  - prometeus-rules.yml
+
+tests: