diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,10 @@
-## [_Unreleased_](https://github.com/freckle/stackctl/compare/v1.5.0.0...main)
+## [_Unreleased_](https://github.com/freckle/stackctl/compare/v1.5.0.1...main)
+
+## [v1.5.0.1](https://github.com/freckle/stackctl/compare/v1.5.0.0...v1.5.0.1)
+
+- Handle missing-or-empty specs directory more explicitly
+- Add warning for `Depends` pointing to non-existent spec
+- Fix formatting of required version in warning message
 
 ## [v1.5.0.0](https://github.com/freckle/stackctl/compare/v1.4.4.0...v1.5.0.0)
 
diff --git a/src/Stackctl/Config.hs b/src/Stackctl/Config.hs
--- a/src/Stackctl/Config.hs
+++ b/src/Stackctl/Config.hs
@@ -63,7 +63,8 @@
       :# ["error" .= Yaml.prettyPrintParseException ex]
   ConfigInvalid errs -> "Invalid configuration" :# ["errors" .= errs]
   ConfigVersionNotSatisfied rv v ->
-    "Incompatible Stackctl version" :# ["current" .= v, "required" .= show rv]
+    "Incompatible Stackctl version"
+      :# ["current" .= v, "required" .= show (requiredVersionToText rv)]
 
 loadConfigOrExit :: (MonadIO m, MonadLogger m) => m Config
 loadConfigOrExit = either die pure =<< loadConfig
diff --git a/src/Stackctl/Spec/Discover.hs b/src/Stackctl/Spec/Discover.hs
--- a/src/Stackctl/Spec/Discover.hs
+++ b/src/Stackctl/Spec/Discover.hs
@@ -8,6 +8,8 @@
 
 import Data.List.Extra (dropPrefix)
 import qualified Data.List.NonEmpty as NE
+import qualified Data.List.NonEmpty.Extra as NE
+import Data.Text.Metrics (levenshtein)
 import Stackctl.AWS
 import Stackctl.AWS.Scope
 import Stackctl.Config (HasConfig)
@@ -64,14 +66,29 @@
   withThreadContext context $ do
     checkForDuplicateStackNames specPaths
 
-    specs <-
-      sortStackSpecs
-        . filterStackSpecs filterOption
-        <$> traverse (readStackSpec dir) specPaths
+    mAllSpecs <- NE.nonEmpty <$> traverse (readStackSpec dir) specPaths
 
-    when (null specs) $ logWarn "No specs found"
-    specs <$ logDebug ("Discovered specs" :# ["matched" .= length specs])
+    case mAllSpecs of
+      Nothing -> do
+        []
+          <$ logWarn
+            ( "Missing or empty specification directory"
+                :# [ "directory" .= dir
+                   , "hint" .= ("Is this the correct directory?" :: Text)
+                   ]
+            )
+      Just allSpecs -> do
+        let
+          known = stackSpecStackName <$> allSpecs
+          specs =
+            sortStackSpecs
+              $ filterStackSpecs filterOption
+              $ NE.toList allSpecs
 
+        traverse_ (checkForUnknownDepends known) specs
+        when (null specs) $ logWarn "No specs matched filters"
+        specs <$ logDebug ("Discovered specs" :# ["matched" .= length specs])
+
 checkForDuplicateStackNames
   :: (MonadIO m, MonadLogger m) => [StackSpecPath] -> m ()
 checkForDuplicateStackNames =
@@ -93,6 +110,40 @@
            ]
 
     exitFailure
+
+-- | Warn if a 'StackSpec' depends on a name not in the given 'StackName's
+--
+-- The 'StackName's are built from all specs, but we only run this with specs
+-- that are filtered in.
+--
+-- NB. This function is written so it can easily be made into a fatal error
+-- (like 'checkForDuplicateStackNames'), but we only warn for now.
+checkForUnknownDepends
+  :: MonadLogger m => NonEmpty StackName -> StackSpec -> m ()
+checkForUnknownDepends known spec =
+  traverse_ reportUnknownDepends
+    $ NE.nonEmpty
+    $ filter (`notElem` known)
+    $ stackSpecDepends spec
+ where
+  reportUnknownDepends depends = do
+    for_ depends $ \depend -> do
+      let (nearest, _distance) =
+            NE.minimumBy1 (comparing snd)
+              $ (id &&& getDistance depend)
+              <$> known
+
+      logWarn
+        $ "Stack lists dependency that does not exist"
+        :# [ "dependency"
+              .= ( unStackName (stackSpecStackName spec)
+                    <> " -> "
+                    <> unStackName depend
+                 )
+           , "hint" .= ("Did you mean " <> unStackName nearest <> "?")
+           ]
+
+  getDistance = levenshtein `on` unStackName
 
 buildSpecPath
   :: (MonadReader env m, HasAwsScope env)
diff --git a/src/Stackctl/StackSpec.hs b/src/Stackctl/StackSpec.hs
--- a/src/Stackctl/StackSpec.hs
+++ b/src/Stackctl/StackSpec.hs
@@ -5,6 +5,7 @@
   , stackSpecSpecBody
   , stackSpecStackName
   , stackSpecStackDescription
+  , stackSpecDepends
   , stackSpecActions
   , stackSpecParameters
   , stackSpecCapabilities
diff --git a/stackctl.cabal b/stackctl.cabal
--- a/stackctl.cabal
+++ b/stackctl.cabal
@@ -1,6 +1,6 @@
 cabal-version:   1.18
 name:            stackctl
-version:         1.5.0.0
+version:         1.5.0.1
 license:         MIT
 license-file:    LICENSE
 copyright:       2022 Renaissance Learning Inc
@@ -115,6 +115,7 @@
         rio,
         semigroups,
         text,
+        text-metrics,
         time,
         transformers,
         typed-process,
