diff --git a/cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs b/cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs
index 48141df39c3c21dd2878d9f4597b34323715d70d..c57ade0c3e35621380ab26637d77d9d4c623ed2e 100644
--- a/cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs
+++ b/cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE LambdaCase #-}
 
 module Distribution.Solver.Types.ProjectConfigPath
     (
@@ -11,6 +10,7 @@ module Distribution.Solver.Types.ProjectConfigPath
 
     -- * Messages
     , docProjectConfigPath
+    , docProjectConfigPaths
     , cyclicalImportMsg
     , docProjectConfigPathFailReason
 
@@ -56,13 +56,51 @@ instance Structured ProjectConfigPath
 --   imported by: B.config
 --   imported by: A.project
 -- @
--- >>> render . docProjectConfigPath $ ProjectConfigPath $ "D.config" :| ["C.config", "B.config", "A.project" ]
+-- >>> render . docProjectConfigPath $ ProjectConfigPath $ "D.config" :| ["C.config", "B.config", "A.project"]
 -- "D.config\n  imported by: C.config\n  imported by: B.config\n  imported by: A.project"
 docProjectConfigPath :: ProjectConfigPath -> Doc
 docProjectConfigPath (ProjectConfigPath (p :| [])) = text p
 docProjectConfigPath (ProjectConfigPath (p :| ps)) = vcat $
     text p : [ text " " <+> text "imported by:" <+> text l | l <- ps ]
 
+-- | Renders the paths as a list without showing which path imports another,
+-- like this;
+-- @
+-- - cabal.project
+-- - project-cabal/constraints.config
+-- - project-cabal/ghc-latest.config
+-- - project-cabal/ghc-options.config
+-- - project-cabal/pkgs.config
+-- - project-cabal/pkgs/benchmarks.config
+-- - project-cabal/pkgs/buildinfo.config
+-- - project-cabal/pkgs/cabal.config
+-- - project-cabal/pkgs/install.config
+-- - project-cabal/pkgs/integration-tests.config
+-- - project-cabal/pkgs/tests.config
+-- @
+--
+-- >>> :{
+--   do
+--     let ps =
+--              [ ProjectConfigPath ("cabal.project" :| [])
+--              , ProjectConfigPath ("project-cabal/constraints.config" :| ["cabal.project"])
+--              , ProjectConfigPath ("project-cabal/ghc-latest.config" :| ["cabal.project"])
+--              , ProjectConfigPath ("project-cabal/ghc-options.config" :| ["cabal.project"])
+--              , ProjectConfigPath ("project-cabal/pkgs.config" :| ["cabal.project"])
+--              , ProjectConfigPath ("project-cabal/pkgs/benchmarks.config" :| ["project-cabal/pkgs.config","cabal.project"])
+--              , ProjectConfigPath ("project-cabal/pkgs/buildinfo.config" :| ["project-cabal/pkgs.config","cabal.project"])
+--              , ProjectConfigPath ("project-cabal/pkgs/cabal.config" :| ["project-cabal/pkgs.config","cabal.project"])
+--              , ProjectConfigPath ("project-cabal/pkgs/install.config" :| ["project-cabal/pkgs.config","cabal.project"])
+--              , ProjectConfigPath ("project-cabal/pkgs/integration-tests.config" :| ["project-cabal/pkgs.config","cabal.project"])
+--              , ProjectConfigPath ("project-cabal/pkgs/tests.config" :| ["project-cabal/pkgs.config","cabal.project"])
+--              ]
+--     return . render $ docProjectConfigPaths ps
+-- :}
+-- "- cabal.project\n- project-cabal/constraints.config\n- project-cabal/ghc-latest.config\n- project-cabal/ghc-options.config\n- project-cabal/pkgs.config\n- project-cabal/pkgs/benchmarks.config\n- project-cabal/pkgs/buildinfo.config\n- project-cabal/pkgs/cabal.config\n- project-cabal/pkgs/install.config\n- project-cabal/pkgs/integration-tests.config\n- project-cabal/pkgs/tests.config"
+docProjectConfigPaths :: [ProjectConfigPath] -> Doc
+docProjectConfigPaths ps = vcat
+    [ text "-" <+> text p | ProjectConfigPath (p :| _) <- ps ]
+
 -- | A message for a cyclical import, assuming the head of the path is the
 -- duplicate.
 cyclicalImportMsg :: ProjectConfigPath -> Doc
diff --git a/cabal-install/src/Distribution/Client/ProjectConfig.hs b/cabal-install/src/Distribution/Client/ProjectConfig.hs
index 5d04f101c7dfa372dabb092cf73313ba7d1fe7a8..99dde932037b886c65320227a8dc923b461704a8 100644
--- a/cabal-install/src/Distribution/Client/ProjectConfig.hs
+++ b/cabal-install/src/Distribution/Client/ProjectConfig.hs
@@ -58,7 +58,7 @@ module Distribution.Client.ProjectConfig
   ) where
 
 import Distribution.Client.Compat.Prelude
-import Text.PrettyPrint (render)
+import Text.PrettyPrint (nest, render, text, vcat)
 import Prelude ()
 
 import Distribution.Client.Glob
@@ -882,10 +882,10 @@ renderBadPackageLocations (BadPackageLocations provenance bpls)
     renderErrors f = unlines (map f bpls)
 
     renderExplicit =
-      "When using configuration(s) from "
-        ++ intercalate ", " (render . docProjectConfigPath <$> mapMaybe getExplicit (Set.toList provenance))
-        ++ ", the following errors occurred:\n"
-        ++ renderErrors renderBadPackageLocation
+      "When using configuration from:\n"
+        ++ render (nest 2 . docProjectConfigPaths $ mapMaybe getExplicit (Set.toList provenance))
+        ++ "\nThe following errors occurred:\n"
+        ++ render (nest 2 $ vcat ((text "-" <+>) . text <$> map renderBadPackageLocation bpls))
 
     getExplicit (Explicit path) = Just path
     getExplicit Implicit = Nothing
diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal-missing-package.project b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal-missing-package.project
new file mode 100644
index 0000000000000000000000000000000000000000..136ebb028a26afd8740e8977713d2dc01a95885f
--- /dev/null
+++ b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal-missing-package.project
@@ -0,0 +1 @@
+import: missing/pkgs.config
diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out
index e14881e8581f8b4d45260e6d6ee3494244c7443f..7a6333d21bcc65d98dba10d2b2f638c8333ee982 100644
--- a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out
+++ b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out
@@ -129,3 +129,5 @@ After searching the rest of the dependency tree exhaustively, these were the goa
 Error: [Cabal-7090]
 Error parsing project file <ROOT>/bad-conditional.project:
 Cannot set compiler in a conditional clause of a cabal project file
+# checking that missing package message lists configuration provenance
+# cabal v2-build
diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs
index 651658c441ad18dec2005dbe82ef0657853e1bdc..f0ba4299c7afb47db73ea2bf424fe402e4a76321 100644
--- a/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs
+++ b/cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs
@@ -226,4 +226,15 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
   badIf <- fails $ cabal' "v2-build" [ "--project-file=bad-conditional.project" ]
   assertOutputContains "Cannot set compiler in a conditional clause of a cabal project file" badIf
 
+  log "checking that missing package message lists configuration provenance"
+  missing <- fails $ cabal' "v2-build" [ "--project-file=cabal-missing-package.project" ]
+  assertOutputContains
+    "When using configuration from: \
+    \  - cabal-missing-package.project \
+    \  - missing/pkgs.config \
+    \  - missing/pkgs/default.config \
+    \The following errors occurred: \
+    \  - The package location 'pkg-doesnt-exist' does not exist."
+    missing
+
   return ()
diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs.config b/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs.config
new file mode 100644
index 0000000000000000000000000000000000000000..afca189fce60e222c545e5ab7ae323c61fc500b2
--- /dev/null
+++ b/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs.config
@@ -0,0 +1 @@
+import: pkgs/default.config
diff --git a/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs/default.config b/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs/default.config
new file mode 100644
index 0000000000000000000000000000000000000000..fbdd530d3ed886174310831f6673d38bf20f7dc7
--- /dev/null
+++ b/cabal-testsuite/PackageTests/ConditionalAndImport/missing/pkgs/default.config
@@ -0,0 +1 @@
+packages: pkg-doesnt-exist
diff --git a/changelog.d/issue-9971 b/changelog.d/issue-9971
new file mode 100644
index 0000000000000000000000000000000000000000..9bfb2e4822f76cd6aeb7b092c27bb2e2426cbb99
--- /dev/null
+++ b/changelog.d/issue-9971
@@ -0,0 +1,6 @@
+synopsis: Renders project configuration provenance as a list of canonical paths
+packages: cabal-install cabal-install-solver
+prs: #9985
+issues: #9971
+
+description: Removes interleaved rendering of project imports.