diff --git a/super-user-spark.cabal b/super-user-spark.cabal
--- a/super-user-spark.cabal
+++ b/super-user-spark.cabal
@@ -1,5 +1,5 @@
 name:                super-user-spark
-version:             0.4.0.1
+version:             0.4.0.2
 license:             MIT
 license-file:        LICENSE
 description:         Configure your dotfile deployment with a DSL.
@@ -119,8 +119,8 @@
   build-depends:    
         base                  >= 4.9   && < 5
       , super-user-spark
-      , hspec                 >= 2.2   && < 2.5
-      , hspec-core            >= 2.2   && < 2.5
+      , hspec
+      , hspec-core
       , QuickCheck
       , aeson                 
       , aeson-pretty          
diff --git a/test/SuperUserSpark/Bake/Gen.hs b/test/SuperUserSpark/Bake/Gen.hs
--- a/test/SuperUserSpark/Bake/Gen.hs
+++ b/test/SuperUserSpark/Bake/Gen.hs
@@ -10,25 +10,29 @@
 instance GenUnchecked BakeAssignment
 
 instance GenValid BakeAssignment where
-    genValid = BakeAssignment <$> genValid <*> genValid
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked BakeCardReference
 
-instance GenValid BakeCardReference
+instance GenValid BakeCardReference where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked BakeSettings
 
 instance GenValid BakeSettings where
-    genValid = BakeSettings <$> genValid <*> genValid <*> genValid
-
-instance GenUnchecked BakeError
-
-instance GenValid BakeError
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked AbsP
 
-instance GenValid AbsP
+instance GenValid AbsP where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked ID
 
-instance GenValid ID
+instance GenValid ID where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
diff --git a/test/SuperUserSpark/BakeSpec.hs b/test/SuperUserSpark/BakeSpec.hs
--- a/test/SuperUserSpark/BakeSpec.hs
+++ b/test/SuperUserSpark/BakeSpec.hs
@@ -33,8 +33,6 @@
         genValidSpec @BakeCardReference
         eqSpec @BakeSettings
         genValidSpec @BakeSettings
-        eqSpec @BakeError
-        genValidSpec @BakeError
         eqSpec @BakedDeployment
         genValidSpec @BakedDeployment
         jsonSpecOnValid @BakedDeployment
@@ -134,9 +132,6 @@
                             (Right $ AbsP $ sandbox </> from)
         describe "defaultBakeSettings" $
             it "is valid" $ isValid defaultBakeSettings
-        describe "formatBakeError" $ do
-            it "only ever produces valid strings" $
-                producesValid formatBakeError
         describe "complete" $ do
             it "only ever produces a valid filepath" $ validIfSucceeds2 complete
             it
diff --git a/test/SuperUserSpark/Check/Gen.hs b/test/SuperUserSpark/Check/Gen.hs
--- a/test/SuperUserSpark/Check/Gen.hs
+++ b/test/SuperUserSpark/Check/Gen.hs
@@ -13,57 +13,35 @@
 instance GenUnchecked CheckAssignment
 
 instance GenValid CheckAssignment where
-    genValid = CheckAssignment <$> genValid <*> genValid
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked CheckSettings
 
 instance GenValid CheckSettings where
-    genValid = CheckSettings <$> genValid
-
-instance GenUnchecked CheckError
-
-instance GenValid CheckError
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
-instance GenUnchecked CheckResult where
-    genUnchecked =
-        oneof
-            [ pure AlreadyDone
-            , Ready <$> genUnchecked
-            , Dirty <$> genUnchecked <*> genUnchecked <*> genUnchecked
-            , Impossible <$> genUnchecked
-            ]
+instance GenUnchecked CheckResult
 
 instance GenValid CheckResult where
-    genValid =
-        oneof
-            [ pure AlreadyDone
-            , Ready <$> genValid
-            , Dirty <$> genValid <*> genValid <*> genValid
-            , Impossible <$> genValid
-            ]
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked Instruction
 
 instance GenValid Instruction where
-    genValid =
-        oneof
-            [ CopyFile <$> genValid <*> genValid
-            , CopyDir <$> genValid <*> genValid
-            , LinkFile <$> genValid <*> genValid
-            , LinkDir <$> genValid <*> genValid
-            ]
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked CleanupInstruction
 
-instance GenValid CleanupInstruction
+instance GenValid CleanupInstruction where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
-instance GenUnchecked DeploymentCheckResult where
-    genUnchecked =
-        oneof
-            [ pure DeploymentDone
-            , ReadyToDeploy <$> genUnchecked
-            , DirtySituation <$> genUnchecked <*> genUnchecked <*> genUnchecked
-            , ImpossibleDeployment <$> genUnchecked
-            ]
+instance GenUnchecked DeploymentCheckResult
 
-instance GenValid DeploymentCheckResult
+instance GenValid DeploymentCheckResult where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
diff --git a/test/SuperUserSpark/CheckSpec.hs b/test/SuperUserSpark/CheckSpec.hs
--- a/test/SuperUserSpark/CheckSpec.hs
+++ b/test/SuperUserSpark/CheckSpec.hs
@@ -47,8 +47,6 @@
 checkSpec :: Spec
 checkSpec =
     parallel $ do
-        describe "formatCheckError" $
-            it "always produces valid strings" $ producesValid formatCheckError
         checkSingleSpec
         checkDeploymentSpec
         describe "formatDeploymentChecks" $
diff --git a/test/SuperUserSpark/Compiler/Gen.hs b/test/SuperUserSpark/Compiler/Gen.hs
--- a/test/SuperUserSpark/Compiler/Gen.hs
+++ b/test/SuperUserSpark/Compiler/Gen.hs
@@ -6,51 +6,48 @@
 
 import SuperUserSpark.Compiler.Types
 import SuperUserSpark.Language.Gen ()
+import SuperUserSpark.Parser.Gen ()
 import SuperUserSpark.PreCompiler.Gen ()
 
 instance GenUnchecked CompileAssignment
 
 instance GenValid CompileAssignment where
-    genValid = CompileAssignment <$> genValid <*> genValid <*> genValid
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked StrongCardFileReference
 
-instance GenValid StrongCardFileReference
+instance GenValid StrongCardFileReference where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked CompileSettings
 
 instance GenValid CompileSettings where
-    genValid = CompileSettings <$> genValid <*> genValid
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
-instance GenUnchecked a =>
-         GenUnchecked (Deployment a) where
-    genUnchecked = Deployment <$> genUnchecked <*> genUnchecked
+instance GenUnchecked a => GenUnchecked (Deployment a) where
+  genUnchecked = Deployment <$> genUnchecked <*> genUnchecked
 
-instance GenValid a =>
-         GenValid (Deployment a) where
-    genValid = Deployment <$> genValid <*> genValid
+instance GenValid a => GenValid (Deployment a) where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
-instance GenUnchecked a =>
-         GenUnchecked (DeploymentDirections a)
+instance GenUnchecked a => GenUnchecked (DeploymentDirections a)
 
-instance GenValid a =>
-         GenValid (DeploymentDirections a) where
-    genValid = Directions <$> genValid <*> genValid
+instance GenValid a => GenValid (DeploymentDirections a) where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked PrefixPart
 
-instance GenValid PrefixPart
+instance GenValid PrefixPart where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked CompilerState
 
-instance GenValid CompilerState
-
-instance GenUnchecked CompileError where
-    genUnchecked =
-        oneof
-            [ PreCompileErrors <$> genUnchecked
-            , DuringCompilationError <$> genUnchecked
-            ]
-    shrinkUnchecked _ = []
-
-instance GenValid CompileError
+instance GenValid CompilerState where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
diff --git a/test/SuperUserSpark/CompilerSpec.hs b/test/SuperUserSpark/CompilerSpec.hs
--- a/test/SuperUserSpark/CompilerSpec.hs
+++ b/test/SuperUserSpark/CompilerSpec.hs
@@ -27,7 +27,6 @@
 spec = do
     parallel $ do
         instanceSpec
-        compileSpec
         singleCompileDecSpec
         precompileSpec
         compileUnitSpec
@@ -214,13 +213,7 @@
         genValidSpec @PrefixPart
         eqSpec @CompilerState
         genValidSpec @CompilerState
-        eqSpec @CompileError
-        genValidSpec @CompileError
 
-compileSpec :: Spec
-compileSpec = do
-    describe "formatCompileError" $
-        it "only produces valid strings" $ producesValid formatCompileError
 
 singleCompileDecSpec :: Spec
 singleCompileDecSpec =
diff --git a/test/SuperUserSpark/Deployer/Gen.hs b/test/SuperUserSpark/Deployer/Gen.hs
--- a/test/SuperUserSpark/Deployer/Gen.hs
+++ b/test/SuperUserSpark/Deployer/Gen.hs
@@ -10,21 +10,17 @@
 instance GenUnchecked DeployAssignment
 
 instance GenValid DeployAssignment where
-    genValid = DeployAssignment <$> genValid <*> genValid
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked DeploySettings
 
 instance GenValid DeploySettings where
-    genValid =
-        DeploySettings <$> genValid <*> genValid <*> genValid <*> genValid
-
-
-instance GenUnchecked DeployError
-
-instance GenValid DeployError
-
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked PreDeployment
 
-instance GenValid PreDeployment
-
+instance GenValid PreDeployment where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
diff --git a/test/SuperUserSpark/DeployerSpec.hs b/test/SuperUserSpark/DeployerSpec.hs
--- a/test/SuperUserSpark/DeployerSpec.hs
+++ b/test/SuperUserSpark/DeployerSpec.hs
@@ -33,8 +33,6 @@
         genValidSpec @DeployAssignment
         eqSpec @DeploySettings
         genValidSpec @DeploySettings
-        eqSpec @DeployError
-        genValidSpec @DeployError
         eqSpec @PreDeployment
         genValidSpec @PreDeployment
 
@@ -43,9 +41,6 @@
     parallel $ do
         describe "defaultDeploySettings" $
             it "is valid" $ isValid defaultDeploySettings
-        describe "formatDeployError" $ do
-            it "only ever produces valid strings" $
-                producesValid formatDeployError
 
 cleanSpec :: Spec
 cleanSpec = do
diff --git a/test/SuperUserSpark/Diagnose/Gen.hs b/test/SuperUserSpark/Diagnose/Gen.hs
--- a/test/SuperUserSpark/Diagnose/Gen.hs
+++ b/test/SuperUserSpark/Diagnose/Gen.hs
@@ -5,33 +5,36 @@
 import TestImport
 
 import SuperUserSpark.Bake.Gen ()
-import SuperUserSpark.Diagnose.Types
 import SuperUserSpark.Compiler.Gen ()
+import SuperUserSpark.Diagnose.Types
 import SuperUserSpark.Language.Gen ()
 
 instance GenUnchecked DiagnoseAssignment
 
 instance GenValid DiagnoseAssignment where
-    genValid = DiagnoseAssignment <$> genValid <*> genValid
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked DiagnoseSettings
 
 instance GenValid DiagnoseSettings where
-    genValid = DiagnoseSettings <$> genValid
-
-instance GenUnchecked DiagnoseError
-
-instance GenValid DiagnoseError
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked HashDigest
 
-instance GenValid HashDigest
+instance GenValid HashDigest where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked Diagnostics
 
-instance GenValid Diagnostics
+instance GenValid Diagnostics where
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
 
 instance GenUnchecked DiagnosedFp
 
 instance GenValid DiagnosedFp where
-    genValid = D <$> genValid <*> genValid <*> genValid
+  genValid = genValidStructurallyWithoutExtraChecking
+  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering
diff --git a/test/SuperUserSpark/DiagnoseSpec.hs b/test/SuperUserSpark/DiagnoseSpec.hs
--- a/test/SuperUserSpark/DiagnoseSpec.hs
+++ b/test/SuperUserSpark/DiagnoseSpec.hs
@@ -47,8 +47,6 @@
 
 diagnoseSpec :: Spec
 diagnoseSpec = do
-    describe "formatDiagnoseError" $
-        it "always produces valid strings" $ producesValid formatDiagnoseError
     sandbox <- runIO $ resolveDir' "test_sandbox"
     let setup = ensureDir sandbox
     let teardown = removeDirRecur sandbox
@@ -87,7 +85,7 @@
                                         , unwords
                                               [ "stripped:"
                                               , show $
-                                                (stripDir sandbox $ unAbsP a :: Maybe (Path Rel File))
+                                                (stripProperPrefix sandbox $ unAbsP a :: Maybe (Path Rel File))
                                               ]
                                         , unwords ["expected:", show b]
                                         , unwords ["real:", show r]
