diff --git a/.gitlab-ci.dhall b/.gitlab-ci.dhall
deleted file mode 100644
index 2e8b36a6c276aa1ab4b19bc6bcaeb279152e39ef..0000000000000000000000000000000000000000
--- a/.gitlab-ci.dhall
+++ /dev/null
@@ -1,26 +0,0 @@
-let Prelude =
-        env:DHALL_PRELUDE
-      ? https://raw.githubusercontent.com/dhall-lang/dhall-lang/v20.1.0/Prelude/package.dhall
-          sha256:26b0ef498663d269e4dc6a82b0ee289ec565d683ef4c00d0ebdd25333a5a3c98
-
-let H = ./horizon-spec.dhall
-
-let Step = { script : List Text }
-
-let toStep
-    : ∀(id : Text) → ∀(prefix : Text) → ∀(x : Text) → H.Attr Step
-    = λ(id : Text) →
-      λ(prefix : Text) →
-      λ(x : Text) →
-        { mapKey = id, mapValue.script = [ "nix build -L .#${prefix}.${x}" ] }
-
-let input = Prelude.Map.keys Text H.HaskellPackage.Type (./horizon.dhall).packages
-
-let packages =
-      Prelude.List.map
-        Text
-        (H.Attr Step)
-        (λ(x : Text) → toStep "Package ${x}" "packages.x86_64-linux" x)
-        (input : List Text)
-
-in  packages
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 46f22a0ae677a42b3cf6021534ab3f89b10e11b8..768515efe582ff22dccd5ac83828479dc2495db8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,19 +1,15 @@
 stages:
 - generate
-- eval
 - check
+- impure
 
 generate-flake-ci:
   stage: generate
-  script: nix run ".#horizon-gen-gitlab-ci" > flake-ci.yml
+  script: nix run "git+https://gitlab.homotopic.tech/haskell/flake-to-gitlab-ci" > flake-ci.yml
   artifacts:
     paths:
       - flake-ci.yml
 
-eval-flake:
-  stage: eval
-  script: nix flake show
-
 flake-ci:
   stage: check
   trigger:
@@ -21,3 +17,12 @@ flake-ci:
       - artifact: flake-ci.yml
         job: generate-flake-ci
     strategy: depend
+
+impure-tests:
+  stage: impure
+  rules:
+  - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+    when: manual
+    allow_failure: true
+  script:
+  - nix run .#run-impure-tests
diff --git a/flake.lock b/flake.lock
index 7ec8c7800bf62acab1743370778d4aa80260156f..b7c767adfe9984b1ee6109b9000b0b69b4d3d618 100644
--- a/flake.lock
+++ b/flake.lock
@@ -67,11 +67,11 @@
         "nixpkgs": "nixpkgs"
       },
       "locked": {
-        "lastModified": 1655192403,
-        "narHash": "sha256-XyKDvRGDh8VXA6zN8DUTnDaTMrk0MxMKg70MaAX1A2Y=",
+        "lastModified": 1669815989,
+        "narHash": "sha256-yDE8uxa/O633VeRBlJKSY5q9JtzoBoMANvgupdI42YI=",
         "ref": "refs/heads/master",
-        "rev": "a7ae54afdc4c05a5aabf202d5a76d02705eb6147",
-        "revCount": 28,
+        "rev": "5b97bd76dd6756dfc29a32d25a5c78c0522bac10",
+        "revCount": 39,
         "type": "git",
         "url": "https://gitlab.homotopic.tech/nix/lint-utils"
       },
diff --git a/flake.nix b/flake.nix
index bc3b44baf694df63767b77824707d0cf2032f1d0..91cfe5492365ff361dd264a6f640e0ebc529fa99 100644
--- a/flake.nix
+++ b/flake.nix
@@ -25,6 +25,7 @@
     in
     with pkgs.lib;
     with pkgs.writers;
+    with lint-utils.writers.${system};
     let
 
       horizon-gen-nix-app = get-flake horizon-gen-nix;
@@ -52,6 +53,23 @@
 
       horizon-gen-gitlab-ci = writeBashBin "gen-gitlab-ci" "${pkgs.dhall-json}/bin/dhall-to-yaml --file .gitlab-ci.dhall";
 
+      run-impure-tests = writePorcelainOrDieBin {
+        name = "run-impure-tests";
+        src = ./.;
+        command = ''
+          export PATH=$PATH:${pkgs.nix-prefetch-git}/bin:${pkgs.cabal-install}/bin
+          cabal update
+          rm pkgs -rf && nix run .#horizon-gen-nix make-package-set;
+          nixpkgs-fmt pkgs/*
+        '';
+        advice = "Try removing the offending packages from pkgs/ and running nix run .#horizon-gen-nix make-package-set";
+      };
+
+      run-impure-tests-app = {
+        type = "app";
+        program = "${run-impure-tests}/bin/run-impure-tests";
+      };
+
     in
     {
 
@@ -64,11 +82,12 @@
           program = "${horizon-gen-gitlab-ci}/bin/gen-gitlab-ci";
         };
 
+        run-impure-tests = run-impure-tests-app;
       };
 
       checks = {
-        dhall-format = lint-utils.outputs.linters.${system}.dhall-format ./.;
-        nixpkgs-fmt = lint-utils.outputs.linters.${system}.nixpkgs-fmt ./.;
+        dhall-format = lint-utils.outputs.linters.${system}.dhall-format { src = ./. };
+        nixpkgs-fmt = lint-utils.outputs.linters.${system}.nixpkgs-fmt { src = ./. };
       };
 
       inherit legacyPackages;
diff --git a/horizon-spec.dhall b/horizon-spec.dhall
deleted file mode 100644
index 7a3627deadc7ee259edd2fca6a5a9300af2438ed..0000000000000000000000000000000000000000
--- a/horizon-spec.dhall
+++ /dev/null
@@ -1,2 +0,0 @@
-https://gitlab.homotopic.tech/horizon/horizon-spec/-/raw/0.2.1/dhall/package.dhall
-  sha256:cfa9ee0679c61d8ac9daef43581b8edd61219afbbea9b74627057e33fe5d1abb
diff --git a/horizon.dhall b/horizon.dhall
index 421c8b9def5be4920aee2c748551a3e36fe6713b..e3b7fa19a0c2a99a71adbd6d4d6551fac90a9d44 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -1,4 +1,5 @@
-let H = ./horizon-spec.dhall
+let H = https://gitlab.homotopic.tech/horizon/horizon-spec/-/raw/0.2.1/dhall/package.dhall
+  sha256:cfa9ee0679c61d8ac9daef43581b8edd61219afbbea9b74627057e33fe5d1abb
 
 let callHorizonAdopted
     : H.Name → H.Revision → H.Attr H.HaskellPackage.Type