diff --git a/hix.cabal b/hix.cabal
--- a/hix.cabal
+++ b/hix.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hix
-version:        0.9.0
+version:        0.9.1
 synopsis:       Haskell/Nix development build tools
 description:    See https://hackage.haskell.org/package/hix/docs/Hix.html
 category:       Build
@@ -99,6 +99,7 @@
       Hix.Managed.Cabal.Data.InstalledOverrides
       Hix.Managed.Cabal.Data.Packages
       Hix.Managed.Cabal.Data.Revision
+      Hix.Managed.Cabal.Data.SolvedId
       Hix.Managed.Cabal.Data.SolveResources
       Hix.Managed.Cabal.Data.SolverState
       Hix.Managed.Cabal.Data.SolveTarget
@@ -394,7 +395,7 @@
     , generic-lens ==2.2.*
     , generics-sop ==0.5.*
     , hedgehog >=1.1 && <1.5
-    , hix:hix ==0.9.0
+    , hix:hix ==0.9.1
     , http-client ==0.7.*
     , http-client-tls ==0.3.*
     , http-types ==0.12.*
@@ -556,7 +557,7 @@
     , extra ==1.7.*
     , hedgehog >=1.1 && <1.5
     , hix
-    , hix:testing ==0.9.0
+    , hix:testing ==0.9.1
     , incipit-base >=0.5 && <0.7
     , path ==0.9.*
     , path-io >=1.7 && <1.9
diff --git a/lib/Hix.hs b/lib/Hix.hs
--- a/lib/Hix.hs
+++ b/lib/Hix.hs
@@ -20,7 +20,7 @@
 import Hix.Preproc (preprocess)
 
 hixVersion :: Text
-hixVersion = "0.9.0"
+hixVersion = "0.9.1"
 
 runCommand :: Command -> M ()
 runCommand = \case
diff --git a/lib/Hix/Class/Map.hs b/lib/Hix/Class/Map.hs
--- a/lib/Hix/Class/Map.hs
+++ b/lib/Hix/Class/Map.hs
@@ -792,3 +792,10 @@
   Bool
 nMember k =
   Map.member k . nGet
+
+nNull ::
+  NMap map k v sort =>
+  map ->
+  Bool
+nNull =
+  null . nGet
diff --git a/lib/Hix/Console.hs b/lib/Hix/Console.hs
--- a/lib/Hix/Console.hs
+++ b/lib/Hix/Console.hs
@@ -49,6 +49,9 @@
 color n =
   sgis [show (30 + n)]
 
+bold :: Text -> Text
+bold = sgis ["1"]
+
 data ColorOffsets =
   ColorOffsets {
     black :: Int,
diff --git a/lib/Hix/Managed/Build.hs b/lib/Hix/Managed/Build.hs
--- a/lib/Hix/Managed/Build.hs
+++ b/lib/Hix/Managed/Build.hs
@@ -22,11 +22,13 @@
 import Hix.Managed.Build.Solve (solveMutation)
 import qualified Hix.Managed.Cabal.Changes
 import Hix.Managed.Cabal.Config (isNonReinstallableDep, isReinstallableId)
+import Hix.Managed.Cabal.Data.SolvedId (SolvedId (..))
 import Hix.Managed.Cabal.Data.SolverState (SolverState)
 import qualified Hix.Managed.Data.BuildConfig
 import Hix.Managed.Data.BuildConfig (BuildConfig)
 import qualified Hix.Managed.Data.EnvContext
 import Hix.Managed.Data.EnvContext (EnvContext)
+import Hix.Managed.Data.Initial (Initial (..))
 import Hix.Managed.Data.Mutable (MutableDep, addBuildVersions)
 import qualified Hix.Managed.Data.Mutation
 import Hix.Managed.Data.Mutation (BuildMutation (BuildMutation), DepMutation, MutationResult (..))
@@ -61,7 +63,7 @@
 logBuildInputs ::
   EnvName ->
   Text ->
-  [PackageId] ->
+  [SolvedId] ->
   M ()
 logBuildInputs env description overrides = do
   Log.info [exon|Building targets in #{Color.env env} with #{Color.package description}...|]
@@ -107,7 +109,7 @@
   Text ->
   Bool ->
   Versions ->
-  [PackageId] ->
+  [SolvedId] ->
   M (Overrides, BuildStatus)
 buildVersions builder context description allowRevisions versions overrideVersions = do
   logBuildInputs context.env description reinstallable
@@ -115,7 +117,7 @@
   logBuildResult description result
   pure (overrides, buildStatus result)
   where
-    reinstallable = filter isReinstallableId overrideVersions
+    reinstallable = filter (isReinstallableId . (.package)) overrideVersions
 
 buildConstraints ::
   EnvBuilder ->
@@ -152,7 +154,7 @@
 
 logMutationResult ::
   MutableDep ->
-  MutationResult s ->
+  MutationResult ->
   M ()
 logMutationResult package = \case
   MutationSuccess {candidate, changed = True} ->
@@ -167,10 +169,10 @@
 validateMutation ::
   EnvBuilder ->
   EnvContext ->
-  MutationHandlers a s ->
-  StageState a s ->
+  MutationHandlers a ->
+  StageState a SolverState ->
   DepMutation a ->
-  M (StageState a s)
+  M (StageState a SolverState)
 validateMutation envBuilder context handlers stageState mutation = do
   result <- processReinstallable
   logMutationResult mutation.package result
@@ -179,19 +181,19 @@
     processReinstallable =
       if isNonReinstallableDep mutation.package
       then pure MutationKeep
-      else handlers.process stageState.ext mutation build
+      else handlers.process (Initial stageState.ext) mutation build
 
     build = buildMutation envBuilder context stageState.state
 
 convergeMutations ::
   Pretty a =>
-  MutationHandlers a s ->
+  MutationHandlers a ->
   BuildConfig ->
   EnvBuilder ->
   EnvContext ->
-  StageState a s ->
+  StageState a SolverState ->
   [DepMutation a] ->
-  M (StageState a s)
+  M (StageState a SolverState)
 convergeMutations handlers conf builder context state0 =
   spin state0 {iterations = 0}
   where
@@ -235,16 +237,16 @@
 processQuery ::
   Pretty a =>
   (QueryDep -> M (Maybe (DepMutation a))) ->
-  MutationHandlers a s ->
+  MutationHandlers a ->
   BuildConfig ->
   StageContext ->
-  s ->
-  M (StageState a s)
-processQuery candidates handlers conf StageContext {env, builder, state, query = query} ext = do
+  Initial SolverState ->
+  M (StageState a SolverState)
+processQuery candidates handlers conf StageContext {env, builder, state, query = query} solverState = do
   mutations <- postprocess =<< reinstallableCandidates candidates query
   convergeMutations handlers conf builder env stageState mutations
   where
     postprocess | conf.toposortMutations = sortMutations
                 | otherwise = pure
-    stageState = initStageState state ext
+    stageState = initStageState state solverState
     CabalHandlers {sortMutations} = builder.cabal
diff --git a/lib/Hix/Managed/Build/Single.hs b/lib/Hix/Managed/Build/Single.hs
--- a/lib/Hix/Managed/Build/Single.hs
+++ b/lib/Hix/Managed/Build/Single.hs
@@ -8,6 +8,7 @@
 import Hix.Managed.Constraints (fromVersions)
 import qualified Hix.Managed.Data.EnvContext
 import Hix.Managed.Data.EnvContext (EnvContext)
+import Hix.Managed.Data.Initial (initial)
 import Hix.Managed.Data.Mutable (MutableVersions)
 import Hix.Managed.Data.StageState (BuildStatus (Failure))
 import Hix.Managed.Handlers.Build (EnvBuilder)
@@ -22,7 +23,7 @@
   Maybe Overrides ->
   M BuildStatus
 buildVersions builder context description versions prevOverrides =
-  buildConstraints builder context description False (fold prevOverrides) solver <&> \case
+  buildConstraints builder context description False (fold prevOverrides) (initial solver) <&> \case
     Just (_, _, status) -> status
     Nothing -> Failure
   where
diff --git a/lib/Hix/Managed/Build/Solve.hs b/lib/Hix/Managed/Build/Solve.hs
--- a/lib/Hix/Managed/Build/Solve.hs
+++ b/lib/Hix/Managed/Build/Solve.hs
@@ -1,6 +1,5 @@
 module Hix.Managed.Build.Solve where
 
-import Data.List (partition)
 import qualified Data.Set as Set
 import Distribution.PackageDescription (customFieldsPD)
 import Distribution.Pretty (pretty)
@@ -8,12 +7,14 @@
 import Text.PrettyPrint (hang, ($$), (<+>))
 
 import Hix.Class.Map (nRestrictKeys)
+import Hix.Console (bold)
 import Hix.Data.Monad (M)
 import Hix.Data.PackageId (PackageId)
 import Hix.Data.Version (packageIdVersions)
 import qualified Hix.Log as Log
 import qualified Hix.Managed.Cabal.Changes
 import Hix.Managed.Cabal.Changes (SolverChanges (SolverChanges), SolverPlan (SolverPlan))
+import Hix.Managed.Cabal.Data.SolvedId (SolvedId (..), revisedId, unrevisedId)
 import qualified Hix.Managed.Cabal.Data.SolverState
 import Hix.Managed.Cabal.Data.SolverState (SolverState)
 import qualified Hix.Managed.Data.EnvContext
@@ -26,7 +27,7 @@
 
 logNonReinstallable :: NonEmpty PackageId -> M ()
 logNonReinstallable ids =
-  Log.verbose [exon|NOTE: Cabal solver suggested new versions for non-reinstallable packages: #{showPL ids}|]
+  Log.verbose [exon|#{bold "Note"}: Cabal solver suggested new versions for non-reinstallable packages: #{showPL ids}|]
 
 -- | Forcing revisions means that any package that has a revision in the Hackage snapshot will be treated as an
 -- override, i.e. it will be built from Hackage despite having the same version as the one installed in nixpkgs.
@@ -43,16 +44,21 @@
 checkRevision ::
   Bool ->
   CabalHandlers ->
+  Set PackageId ->
   PackageId ->
-  Either PackageId PackageId
-checkRevision forceRevisions cabal package
+  Either SolvedId SolvedId
+checkRevision forceRevisions cabal prevRevisions package
+  | Set.member package prevRevisions
+  = Right revision
   | forceRevisions
   , Just packageDesc <- cabal.sourcePackage package
   , any isRevision packageDesc.customFieldsPD
-  = Right package
+  = Right revision
   | otherwise
-  = Left package
+  = Left (unrevisedId package)
   where
+    revision = revisedId package
+
     isRevision = \case
       ("x-revision", rev) | rev /= "0" -> True
       _ -> False
@@ -67,20 +73,22 @@
 processSolverPlan forceRevisions cabal deps prevRevisions SolverPlan {..} = do
   Log.debugP $
     hang "New project deps from solver:" 2 (pretty projectDeps) $$
-    "Forced revisions:" <+> prettyL forcedRevisions $$
-    "Reused revisions:" <+> prettyL reusedRevisions
+    "Revisions:" <+> prettyL revisions
   traverse_ logNonReinstallable nonReinstallable
   pure SolverChanges {versions, overrides}
   where
     projectDeps = nRestrictKeys mutablePIds versions
-    versions = packageIdVersions (overrides ++ installed)
-    overrides = changes ++ forcedRevisions ++ reusedRevisions
+
+    versions = packageIdVersions ((.package) <$> (overrides ++ installed))
+
+    overrides = (unrevisedId <$> changes) ++ revisions
+
     -- If a package has been selected for revision during a prior build, add it to the overrides despite its matching
     -- version.
     -- This simply ensures that the revision procedure can be skipped in this build, since the same version will likely
     -- cause the same dependency bounds error that triggered the revision.
-    (reusedRevisions, installed) = partition (flip Set.member prevRevisions) noForcedRevisions
-    (noForcedRevisions, forcedRevisions) = partitionEithers (checkRevision forceRevisions cabal <$> matching)
+    (installed, revisions) = partitionEithers (checkRevision forceRevisions cabal prevRevisions <$> matching)
+
     mutablePIds = Set.fromList (depName <$> Set.toList deps.mutable)
 
 -- TODO probably best to store the revisions in the SolverState
diff --git a/lib/Hix/Managed/Build/SolverPackages.hs b/lib/Hix/Managed/Build/SolverPackages.hs
--- a/lib/Hix/Managed/Build/SolverPackages.hs
+++ b/lib/Hix/Managed/Build/SolverPackages.hs
@@ -15,6 +15,7 @@
 import Hix.Managed.Data.StageState (BuildResult (..))
 import Hix.Monad (appContext, eitherFatal)
 import Hix.Pretty (showP)
+import Hix.Class.Map (nNull)
 
 badOutput :: Text -> Text
 badOutput output = [exon|The output of building the solver package set is not a single valid store path: #{output}|]
@@ -49,9 +50,12 @@
     leftA cleanBuild =<< previousBuild
   where
     cleanBuild err = do
-      Log.verbose "Build with previous solver overrides failed"
+      Log.info
+        if nNull storedOverrides
+        then "Vanilla package set doesn't build. Computing overrides..."
+        else "Build with previous solver overrides failed. Recomputing overrides..."
       Log.debug err
-      appContext "computing the overrides for the solver package set" do
+      appContext "computing new overrides for the solver package set" do
         solverResult =<< runStateT (build (suggestJailbreakAndLatestVersion resources)) (mempty, mempty)
 
     previousBuild = do
diff --git a/lib/Hix/Managed/Build/Target.hs b/lib/Hix/Managed/Build/Target.hs
--- a/lib/Hix/Managed/Build/Target.hs
+++ b/lib/Hix/Managed/Build/Target.hs
@@ -19,6 +19,7 @@
   )
 import Hix.Managed.Build.NixOutput.Analysis (FailureReason (..))
 import Hix.Managed.Build.NixProcess (nixBuild)
+import Hix.Managed.Cabal.Data.SolvedId (SolvedId)
 import Hix.Managed.Data.BuildConfig (BuildConfig)
 import Hix.Managed.Data.StageState (BuildResult (..), buildUnsuccessful)
 import Hix.Managed.Data.Targets (Targets, firstMTargets)
@@ -132,7 +133,7 @@
   EnvBuilderResources ->
   Bool ->
   Versions ->
-  [PackageId] ->
+  [SolvedId] ->
   M (BuildResult, Overrides)
 buildTargets builder allowRevisions _ overrideVersions = do
   overrides <- packageOverrides builder.global.hackage builder.localUnavailable overrideVersions
diff --git a/lib/Hix/Managed/Cabal/Changes.hs b/lib/Hix/Managed/Cabal/Changes.hs
--- a/lib/Hix/Managed/Cabal/Changes.hs
+++ b/lib/Hix/Managed/Cabal/Changes.hs
@@ -10,6 +10,7 @@
 import Distribution.Solver.Types.SourcePackage (SourcePackage (..))
 import Text.PrettyPrint (hang, ($+$))
 
+import Hix.Managed.Cabal.Data.SolvedId (SolvedId)
 import qualified Hix.Data.PackageId as PackageId
 import Hix.Data.PackageId (PackageId)
 import Hix.Data.Version (Versions)
@@ -56,14 +57,10 @@
 data SolverChanges =
   SolverChanges {
     versions :: Versions,
-    overrides :: [PackageId]
-    --   ,
-    -- projectDeps :: Versions
+    overrides :: [SolvedId]
   }
   deriving stock (Eq, Show, Generic)
 
 instance Pretty SolverChanges where
   pretty SolverChanges {..} =
     hang "overrides:" 2 (prettyL overrides)
-    -- $+$
-    -- hang "projectDeps:" 2 (pretty projectDeps)
diff --git a/lib/Hix/Managed/Cabal/Data/SolvedId.hs b/lib/Hix/Managed/Cabal/Data/SolvedId.hs
new file mode 100644
--- /dev/null
+++ b/lib/Hix/Managed/Cabal/Data/SolvedId.hs
@@ -0,0 +1,28 @@
+module Hix.Managed.Cabal.Data.SolvedId where
+
+import Distribution.Pretty (Pretty (..))
+import Text.PrettyPrint (brackets, (<+>))
+
+import Hix.Data.Overrides (IsRevision (..))
+import Hix.Data.PackageId (PackageId)
+
+data SolvedId =
+  SolvedId {
+    package :: PackageId,
+    revision :: Maybe IsRevision
+  }
+  deriving stock (Eq, Show)
+
+instance Pretty SolvedId where
+  pretty SolvedId {..} =
+    pretty package <+> foldMap renderRevision revision
+    where
+      renderRevision = \case
+        IsRevision -> brackets "rev"
+        IsNotRevision -> ""
+
+revisedId :: PackageId -> SolvedId
+revisedId package = SolvedId {package, revision = Just IsRevision}
+
+unrevisedId :: PackageId -> SolvedId
+unrevisedId package = SolvedId {package, revision = Nothing}
diff --git a/lib/Hix/Managed/Cabal/Data/SolverState.hs b/lib/Hix/Managed/Cabal/Data/SolverState.hs
--- a/lib/Hix/Managed/Cabal/Data/SolverState.hs
+++ b/lib/Hix/Managed/Cabal/Data/SolverState.hs
@@ -17,6 +17,7 @@
 import Hix.Managed.Data.Constraints (EnvConstraints)
 import qualified Hix.Managed.Data.EnvContext
 import Hix.Managed.Data.EnvContext (EnvDeps)
+import Hix.Managed.Data.Initial (Initial (..))
 import Hix.Managed.Data.Mutable (MutableDep, depName)
 
 data SolverFlags =
@@ -64,9 +65,9 @@
   EnvDeps ->
   EnvConstraints ->
   SolverFlags ->
-  SolverState
+  Initial SolverState
 solverState user deps modeConstraints flags =
-  UnsafeSolverState constraints flags
+  Initial (UnsafeSolverState constraints flags)
   where
     constraints =
       modeConstraints <>
diff --git a/lib/Hix/Managed/Data/Initial.hs b/lib/Hix/Managed/Data/Initial.hs
--- a/lib/Hix/Managed/Data/Initial.hs
+++ b/lib/Hix/Managed/Data/Initial.hs
@@ -12,3 +12,6 @@
 
 instance Pretty a => Pretty (Initial a) where
   pretty (Initial a) = pretty a
+
+initial :: Initial a -> a
+initial = coerce
diff --git a/lib/Hix/Managed/Data/Mutation.hs b/lib/Hix/Managed/Data/Mutation.hs
--- a/lib/Hix/Managed/Data/Mutation.hs
+++ b/lib/Hix/Managed/Data/Mutation.hs
@@ -35,12 +35,12 @@
   }
   deriving stock (Generic)
 
-data MutationResult s =
+data MutationResult =
   MutationSuccess {
     candidate :: MutableId,
     changed :: Bool,
     state :: MutationState,
-    ext :: s
+    solverState :: SolverState
   }
   |
   MutationKeep
diff --git a/lib/Hix/Managed/Data/StageState.hs b/lib/Hix/Managed/Data/StageState.hs
--- a/lib/Hix/Managed/Data/StageState.hs
+++ b/lib/Hix/Managed/Data/StageState.hs
@@ -5,7 +5,7 @@
 
 import Hix.Data.Error (Error)
 import Hix.Data.PackageId (PackageId)
-import Hix.Managed.Data.Initial (Initial (Initial))
+import Hix.Managed.Data.Initial (Initial (..))
 import Hix.Managed.Data.Mutable (MutableDep)
 import qualified Hix.Managed.Data.MutableId
 import Hix.Managed.Data.MutableId (MutableId (MutableId))
@@ -99,6 +99,6 @@
   }
   deriving stock (Eq, Show)
 
-initStageState :: Initial MutationState -> s -> StageState a s
-initStageState (Initial state) ext =
-  StageState {success = [], failed = [], iterations = 0, ..}
+initStageState :: Initial MutationState -> Initial s -> StageState a s
+initStageState (Initial state) (Initial ext) =
+  StageState {success = [], failed = [], iterations = 0, state, ..}
diff --git a/lib/Hix/Managed/Handlers/Build.hs b/lib/Hix/Managed/Handlers/Build.hs
--- a/lib/Hix/Managed/Handlers/Build.hs
+++ b/lib/Hix/Managed/Handlers/Build.hs
@@ -4,16 +4,16 @@
 
 import Hix.Data.Monad (M)
 import Hix.Data.Overrides (Overrides)
-import Hix.Data.PackageId (PackageId)
 import Hix.Data.PackageName (LocalPackage)
 import Hix.Data.Version (Versions)
 import Hix.Managed.Cabal.Changes (SolverPlan)
 import Hix.Managed.Cabal.Data.Config (GhcDb (..))
 import Hix.Managed.Cabal.Data.InstalledOverrides (InstalledOverrides)
+import Hix.Managed.Cabal.Data.SolvedId (SolvedId)
 import Hix.Managed.Data.Constraints (EnvConstraints)
 import Hix.Managed.Data.EnvContext (EnvContext (..))
 import Hix.Managed.Data.EnvState (EnvState)
-import Hix.Managed.Data.Initial (Initial (..))
+import Hix.Managed.Data.Initial (Initial, initial)
 import Hix.Managed.Data.ManagedPackage (ProjectPackages)
 import Hix.Managed.Data.StageState (BuildFailure (UnknownFailure), BuildResult (BuildFailure))
 import qualified Hix.Managed.Handlers.AvailableVersions as AvailableVersions
@@ -41,7 +41,7 @@
   EnvBuilder {
     state :: EnvState,
     cabal :: CabalHandlers,
-    buildTargets :: Bool -> Versions -> [PackageId] -> M (BuildResult, Overrides)
+    buildTargets :: Bool -> Versions -> [SolvedId] -> M (BuildResult, Overrides)
   }
 
 data Builder =
@@ -61,23 +61,23 @@
   }
 
 testBuilder ::
-  (Bool -> Versions -> [PackageId] -> M (BuildResult, Overrides)) ->
+  (Bool -> Versions -> [SolvedId] -> M (BuildResult, Overrides)) ->
   (Builder -> M a) ->
   M a
 testBuilder buildTargets use =
   use Builder {
-    withEnvBuilder = \ EnvBuilderContext {initCabal, env = EnvContext {ghc}, initialState = Initial state} useE -> do
+    withEnvBuilder = \ EnvBuilderContext {initCabal, env = EnvContext {ghc}, initialState} useE -> do
       ghcDb <- noteClient "Test builder needs an explicit GHC DB" ghc
       (cabal, _) <- initCabal.run mempty ghcDb
-      useE EnvBuilder {..} (Initial state)
+      useE EnvBuilder {state = initial initialState, ..} initialState
   }
 
-versionsBuilder :: SourceHashHandlers -> (Versions -> M BuildResult) -> (Builder -> M a) -> M a
+versionsBuilder :: SourceHashHandlers -> (Versions -> M (BuildResult, Overrides)) -> (Builder -> M a) -> M a
 versionsBuilder hackage build =
   testBuilder \ _ versions overrideVersions -> do
     overrides <- packageOverrides hackage mempty overrideVersions
-    status <- build versions
-    pure (status, overrides)
+    (status, revisions) <- build versions
+    pure (status, revisions <> overrides)
 
 handlersNull :: BuildHandlers
 handlersNull =
diff --git a/lib/Hix/Managed/Handlers/Build/Prod.hs b/lib/Hix/Managed/Handlers/Build/Prod.hs
--- a/lib/Hix/Managed/Handlers/Build/Prod.hs
+++ b/lib/Hix/Managed/Handlers/Build/Prod.hs
@@ -16,11 +16,12 @@
 import Hix.Managed.Build.SolverPackages (solverGhc)
 import Hix.Managed.Build.Target (BuilderResources (..), EnvBuilderResources (..), buildTargets)
 import qualified Hix.Managed.Cabal.Data.Config as CabalConfig
-import Hix.Managed.Cabal.Data.Config (CabalConfig (..), HackagePurpose (ForVersions), allHackages)
+import Hix.Managed.Cabal.Data.Config (CabalConfig (..), GhcDb, HackagePurpose (ForVersions), allHackages)
 import Hix.Managed.Cabal.Data.InstalledOverrides (InstalledOverrides (..))
 import Hix.Managed.Data.BuildConfig (BuildConfig)
 import Hix.Managed.Data.EnvContext (EnvContext (..))
 import Hix.Managed.Data.EnvState (EnvState (..))
+import qualified Hix.Managed.Data.Initial as Initial
 import Hix.Managed.Data.Initial (Initial (..))
 import Hix.Managed.Data.ManagedPackage (ProjectPackages)
 import Hix.Managed.Handlers.AvailableVersions (AvailableVersionsHandlers)
@@ -53,8 +54,8 @@
         use tmpRoot
     \ (err :: IOError) -> throwM (Fatal (show err))
 
-storeSolverOverrides :: Overrides -> Initial EnvState -> EnvState
-storeSolverOverrides new (Initial EnvState {..}) =
+storeSolverOverrides :: Overrides -> EnvState -> EnvState
+storeSolverOverrides new EnvState {..} =
   EnvState {solver = new, ..}
 
 -- | Determine the set of package IDs that should not be treated as installed in the solver package set when Cabal
@@ -84,18 +85,28 @@
     Jailbreak -> Nothing
     Local -> Nothing
 
+withSolverOverrides ::
+  GhcDb ->
+  EnvState ->
+  BuilderResources ->
+  EnvBuilderContext ->
+  (EnvBuilder -> Initial EnvState -> M a) ->
+  M a
+withSolverOverrides ghc state global EnvBuilderContext {initCabal, env = EnvContext {env, targets}} use = do
+  (cabal, localUnavailable) <- initCabal.run (installedOverrides state) ghc
+  use EnvBuilder {buildTargets = buildTargets EnvBuilderResources {..}, ..} (Initial state)
+
 withEnvBuilder ::
   ∀ a .
   BuilderResources ->
   EnvBuilderContext ->
   (EnvBuilder -> Initial EnvState -> M a) ->
   M a
-withEnvBuilder global EnvBuilderContext {initCabal, env = EnvContext {env, targets, ghc}, initialState} use = do
-  (resolvedGhc, solverOverrides) <- solverGhc global env ((.solver) <$> initialState) ghc
-  let state = maybe (.value) storeSolverOverrides solverOverrides initialState
-  (cabal, localUnavailable) <- initCabal.run (installedOverrides state) resolvedGhc
+withEnvBuilder global context@EnvBuilderContext {env = EnvContext {env, ghc}, initialState} use = do
   writeInitialEnvState global.stateFile global.root env initialState
-  use EnvBuilder {buildTargets = buildTargets EnvBuilderResources {..}, ..} (Initial state)
+  (resolvedGhc, solverOverrides) <- solverGhc global env ((.solver) <$> initialState) ghc
+  let state = maybe id storeSolverOverrides solverOverrides (Initial.initial initialState)
+  withSolverOverrides resolvedGhc state global context use
 
 withBuilder ::
   SourceHashHandlers ->
diff --git a/lib/Hix/Managed/Handlers/Build/Test.hs b/lib/Hix/Managed/Handlers/Build/Test.hs
--- a/lib/Hix/Managed/Handlers/Build/Test.hs
+++ b/lib/Hix/Managed/Handlers/Build/Test.hs
@@ -5,6 +5,7 @@
 
 import Hix.Data.Monad (M)
 import Hix.Data.NixExpr (Expr)
+import Hix.Data.Overrides (Overrides)
 import qualified Hix.Data.PackageId
 import Hix.Data.PackageId (PackageId)
 import Hix.Data.PackageName (PackageName)
@@ -28,7 +29,7 @@
 handlersUnitTest ::
   MonadIO m =>
   GhcPackages ->
-  (Versions -> M BuildResult) ->
+  (Versions -> M (BuildResult, Overrides)) ->
   m (BuildHandlers, IORef [Expr], IORef [FailedMutation])
 handlersUnitTest ghcPackages builder = do
   (stateFile, stateFileRef) <- StateFile.handlersUnitTest
diff --git a/lib/Hix/Managed/Handlers/Mutation.hs b/lib/Hix/Managed/Handlers/Mutation.hs
--- a/lib/Hix/Managed/Handlers/Mutation.hs
+++ b/lib/Hix/Managed/Handlers/Mutation.hs
@@ -1,14 +1,16 @@
 module Hix.Managed.Handlers.Mutation where
 
 import Hix.Data.Monad (M)
+import Hix.Managed.Cabal.Data.SolverState (SolverState)
+import Hix.Managed.Data.Initial (Initial)
 import Hix.Managed.Data.Mutation (BuildMutation, DepMutation, MutationResult)
 import Hix.Managed.Data.MutationState (MutationState)
 
-data MutationHandlers a s =
+data MutationHandlers a =
   MutationHandlers {
     process ::
-      s ->
+      Initial SolverState ->
       DepMutation a ->
       (BuildMutation -> M (Maybe MutationState)) ->
-      M (MutationResult s)
+      M MutationResult
   }
diff --git a/lib/Hix/Managed/Handlers/Mutation/Bump.hs b/lib/Hix/Managed/Handlers/Mutation/Bump.hs
--- a/lib/Hix/Managed/Handlers/Mutation/Bump.hs
+++ b/lib/Hix/Managed/Handlers/Mutation/Bump.hs
@@ -12,6 +12,7 @@
 import Hix.Managed.Data.Bump (Bump (Bump))
 import qualified Hix.Managed.Data.Constraints
 import Hix.Managed.Data.Constraints (MutationConstraints (MutationConstraints))
+import Hix.Managed.Data.Initial (Initial, initial)
 import Hix.Managed.Data.MutableId (MutableId)
 import qualified Hix.Managed.Data.Mutation
 import Hix.Managed.Data.Mutation (
@@ -33,18 +34,18 @@
 
 -- TODO Avoid building unchanged candidates after the first build of the same set of deps.
 processMutationBump ::
-  SolverState ->
+  Initial SolverState ->
   DepMutation Bump ->
   (BuildMutation -> M (Maybe MutationState)) ->
-  M (MutationResult SolverState)
-processMutationBump solver DepMutation {package, mutation = Bump {version, changed}} build =
+  M MutationResult
+processMutationBump solverState DepMutation {package, mutation = Bump {version, changed}} build =
   builder version <&> \case
-    Just (candidate, ext, state) ->
-      MutationSuccess {candidate, changed, state, ext}
+    Just (candidate, solverResult, state) ->
+      MutationSuccess {candidate, changed, state, solverState = solverResult}
     Nothing ->
       MutationFailed
   where
-    builder = buildCandidate build updateBound updateConstraintsBump solver package
+    builder = buildCandidate build updateBound updateConstraintsBump (initial solverState) package
 
-handlersBump :: MutationHandlers Bump SolverState
+handlersBump :: MutationHandlers Bump
 handlersBump = MutationHandlers {process = processMutationBump}
diff --git a/lib/Hix/Managed/Handlers/Mutation/Lower.hs b/lib/Hix/Managed/Handlers/Mutation/Lower.hs
--- a/lib/Hix/Managed/Handlers/Mutation/Lower.hs
+++ b/lib/Hix/Managed/Handlers/Mutation/Lower.hs
@@ -16,6 +16,7 @@
 import qualified Hix.Managed.Data.BuildConfig
 import Hix.Managed.Data.BuildConfig (BuildConfig)
 import Hix.Managed.Data.Constraints (MutationConstraints)
+import Hix.Managed.Data.Initial (Initial, initial)
 import qualified Hix.Managed.Data.Lower
 import Hix.Managed.Data.Lower (Lower (Lower))
 import Hix.Managed.Data.MutableId (MutableId)
@@ -36,14 +37,14 @@
   BuildConfig ->
   LowerMode ->
   (Bool -> MutableId -> PackageId -> MutationConstraints -> MutationConstraints) ->
-  SolverState ->
+  Initial SolverState ->
   DepMutation Lower ->
   (BuildMutation -> M (Maybe MutationState)) ->
-  M (MutationResult SolverState)
-processMutationLower conf mode update solver DepMutation {package, retract, mutation = Lower {majors}} build = do
+  M MutationResult
+processMutationLower conf mode update solverInit DepMutation {package, retract, mutation = Lower {majors}} build = do
   foldM buildMajor (Right 0, Nothing) majors <&> \case
-    (_, Just (candidate, ext, state)) ->
-      MutationSuccess {candidate, changed = True, state, ext}
+    (_, Just (candidate, solverResult, state)) ->
+      MutationSuccess {candidate, changed = True, state, solverState = solverResult}
     (_, Nothing) ->
       mode.noSuccess
   where
@@ -72,12 +73,12 @@
           Just result -> (Left 0, Just result)
           Nothing -> (bimap (+ 1) (+ 1) failed, prev)
 
-    builder = buildCandidate build withLower (update retract) solver package
+    builder = buildCandidate build withLower (update retract) (initial solverInit) package
 
 handlersLower ::
   BuildConfig ->
   LowerMode ->
   (Bool -> MutableId -> PackageId -> MutationConstraints -> MutationConstraints) ->
-  MutationHandlers Lower SolverState
+  MutationHandlers Lower
 handlersLower conf mode updatePackageParams =
   MutationHandlers {process = processMutationLower conf mode updatePackageParams}
diff --git a/lib/Hix/Managed/Lower/Data/LowerMode.hs b/lib/Hix/Managed/Lower/Data/LowerMode.hs
--- a/lib/Hix/Managed/Lower/Data/LowerMode.hs
+++ b/lib/Hix/Managed/Lower/Data/LowerMode.hs
@@ -1,12 +1,11 @@
 module Hix.Managed.Lower.Data.LowerMode where
 
-import Hix.Managed.Cabal.Data.SolverState (SolverState)
 import Hix.Managed.Data.Mutation (MutationResult (MutationFailed, MutationKeep))
 
 data LowerMode =
   LowerMode {
     firstSuccess :: Bool,
-    noSuccess :: MutationResult SolverState
+    noSuccess :: MutationResult
   }
   deriving stock (Eq, Show, Generic)
 
diff --git a/lib/Hix/Managed/Lower/Stabilize.hs b/lib/Hix/Managed/Lower/Stabilize.hs
--- a/lib/Hix/Managed/Lower/Stabilize.hs
+++ b/lib/Hix/Managed/Lower/Stabilize.hs
@@ -16,7 +16,7 @@
 import qualified Hix.Managed.Data.Constraints
 import Hix.Managed.Data.Constraints (MutationConstraints (MutationConstraints))
 import qualified Hix.Managed.Data.EnvContext
-import Hix.Managed.Data.Initial (Initial (Initial))
+import Hix.Managed.Data.Initial (Initial (..))
 import Hix.Managed.Data.Mutable (MutableDep, depName)
 import qualified Hix.Managed.Data.MutableId
 import Hix.Managed.Data.MutableId (MutableId)
@@ -98,7 +98,7 @@
   BuildConfig ->
   Flow ()
 stabilizeStage handlers conf =
-  runStage_ "stabilize"  (lowerStabilize handlers conf)
+  runStage_ "stabilize" (lowerStabilize handlers conf)
 
 stabilizeIfPossible ::
   BuildHandlers ->
@@ -111,8 +111,8 @@
 
 validateCurrent :: Flow BuildStatus
 validateCurrent =
-  execStatelessStage "stabilize-current" \
-    StageContext {env, state = Initial MutationState {versions, overrides}, builder} ->
+  execStatelessStage "stabilize-current"
+    \ StageContext {env, state = Initial MutationState {versions, overrides}, builder} ->
       buildVersions builder env "current lower bounds" versions (Just overrides) <&> \case
         Success -> StageNoAction (Just "Env builds successfully with the current bounds.")
         Failure -> StageFailure (FailedPrecondition ["Env does not build successfully with the current bounds."])
diff --git a/lib/Hix/Managed/Overrides.hs b/lib/Hix/Managed/Overrides.hs
--- a/lib/Hix/Managed/Overrides.hs
+++ b/lib/Hix/Managed/Overrides.hs
@@ -9,6 +9,7 @@
 import qualified Hix.Managed.Handlers.SourceHash
 import Hix.Managed.Handlers.SourceHash (SourceHashHandlers)
 import Hix.Monad (fatalError)
+import Hix.Managed.Cabal.Data.SolvedId (SolvedId (..))
 
 -- | Fetch an override's hash from the given sources, which is the set of configured Hackages in production.
 -- If the package wasn't found anywhere, and it is part of the local build, assume that it hasn't been published yet and
@@ -44,9 +45,9 @@
 packageOverrides ::
   SourceHashHandlers ->
   Set LocalPackage ->
-  [PackageId] ->
+  [SolvedId] ->
   M Overrides
 packageOverrides handlers localUnavailable versions =
-  nForAssoc versions \ package -> do
-    o <- packageOverrideRegular handlers localUnavailable package
+  nForAssoc versions \ SolvedId {..} -> do
+    o <- packageOverride revision handlers localUnavailable package
     pure (package.name, o)
diff --git a/lib/Hix/Managed/StageContext.hs b/lib/Hix/Managed/StageContext.hs
--- a/lib/Hix/Managed/StageContext.hs
+++ b/lib/Hix/Managed/StageContext.hs
@@ -4,7 +4,7 @@
 import Hix.Managed.Data.EnvRequest (EnvRequest (..))
 import qualified Hix.Managed.Data.EnvState
 import Hix.Managed.Data.EnvState (EnvState (EnvState))
-import Hix.Managed.Data.Initial (Initial (Initial))
+import Hix.Managed.Data.Initial (Initial (..))
 import qualified Hix.Managed.Data.MutationState
 import Hix.Managed.Data.MutationState (MutationState (MutationState))
 import Hix.Managed.Data.Query (Query (Query))
diff --git a/lib/Hix/Managed/StageState.hs b/lib/Hix/Managed/StageState.hs
--- a/lib/Hix/Managed/StageState.hs
+++ b/lib/Hix/Managed/StageState.hs
@@ -2,22 +2,23 @@
 
 import qualified Data.Map.Strict as Map
 
+import Hix.Managed.Cabal.Data.SolverState (SolverState)
 import qualified Hix.Managed.Data.MutableId
 import qualified Hix.Managed.Data.Mutation
 import Hix.Managed.Data.Mutation (DepMutation, MutationResult (..))
 import Hix.Managed.Data.StageState (BuildSuccess (CandidateBuilt, Unmodified), StageState (..))
 
 updateStageState ::
-  StageState a s ->
+  StageState a SolverState ->
   DepMutation a ->
-  MutationResult s ->
-  StageState a s
+  MutationResult ->
+  StageState a SolverState
 updateStageState old mutation = \case
   MutationSuccess {..} ->
     old {
       success = Map.insert candidate.name buildSuccess old.success,
       state,
-      ext
+      ext = solverState
     }
     where
       buildSuccess | changed = CandidateBuilt candidate
diff --git a/lib/Hix/Monad.hs b/lib/Hix/Monad.hs
--- a/lib/Hix/Monad.hs
+++ b/lib/Hix/Monad.hs
@@ -295,7 +295,7 @@
   t M a ->
   t M a
 appContextT =
-  appContextAtT LogVerbose LogInfo
+  appContextAtT LogVerbose LogError
 
 appContextAt :: LogLevel -> LogLevel -> Text -> M a -> M a
 appContextAt logLevel level description ma =
@@ -303,7 +303,7 @@
     appContextAtT logLevel level description (IdentityT ma)
 
 appContext :: Text -> M a -> M a
-appContext = appContextAt LogVerbose LogInfo
+appContext = appContextAt LogVerbose LogError
 
 appContextVerbose :: Text -> M a -> M a
 appContextVerbose desc ma = do
diff --git a/test/Hix/Test/Managed/Bump/MutationTest.hs b/test/Hix/Test/Managed/Bump/MutationTest.hs
--- a/test/Hix/Test/Managed/Bump/MutationTest.hs
+++ b/test/Hix/Test/Managed/Bump/MutationTest.hs
@@ -1,18 +1,18 @@
 module Hix.Test.Managed.Bump.MutationTest where
 
 import qualified Data.Text as Text
-import Distribution.Types.PackageDescription (customFieldsPD, emptyPackageDescription)
 import Exon (exon)
 import Test.Tasty (TestTree, testGroup)
 
 import Hix.Class.Map ((!!))
 import Hix.Data.Error (ErrorMessage (Fatal))
 import Hix.Data.Options (ProjectOptions (..))
-import Hix.Data.Version (Versions)
+import Hix.Data.Overrides (IsRevision (..), Override (..), Overrides)
+import Hix.Data.Version (SourceHash (..), Versions)
 import Hix.Managed.Bump.Optimize (bumpOptimizeMain)
 import qualified Hix.Managed.Cabal.Data.Packages
 import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages), InstalledPackages)
-import Hix.Managed.Cabal.Data.SourcePackage (SourcePackageId (description), SourcePackages)
+import Hix.Managed.Cabal.Data.SourcePackage (SourcePackages)
 import Hix.Managed.Data.ManagedPackage (ProjectPackages, managedPackages)
 import qualified Hix.Managed.Data.ProjectStateProto
 import Hix.Managed.Data.ProjectStateProto (ProjectStateProto (ProjectStateProto))
@@ -22,7 +22,7 @@
 import Hix.Pretty (showP)
 import Hix.Test.Hedgehog (eqLines, listEqTail)
 import qualified Hix.Test.Managed.Run
-import Hix.Test.Managed.Run (Result (Result), TestParams (..), bumpTest, nosortOptions, testParams)
+import Hix.Test.Managed.Run (Result (Result), TestParams (..), bumpTest, nosortOptions, testParams, withoutRevisions)
 import Hix.Test.Utils (UnitTest, unitTest)
 
 packages :: ProjectPackages
@@ -37,6 +37,7 @@
       "direct5",
       "direct6",
       "direct7",
+      "direct8",
       "local1",
       "local2 <0.9",
       "local3 <0.9",
@@ -60,6 +61,7 @@
     ("direct5-1.0.1", []),
     ("direct6-1.0.1", []),
     ("direct7-1.0.1", ["transitive1-1.0.1"]),
+    ("direct8-1.0.1", []),
     ("transitive1-1.0.1", ["direct6-1.0.1"])
   ]
 
@@ -103,10 +105,11 @@
     ("direct7", [
       ([1, 0, 1], ["transitive1 <1.1"])
     ]),
+    ("direct8", [
+      ([1, 0, 1], [])
+    ]),
     ("transitive1", [
-      ([1, 0, 1], ["direct6 <1.2"] {
-        description = Just (emptyPackageDescription {customFieldsPD = [("x-revision", "2")]})
-      })
+      ([1, 0, 1], ["direct6 <1.2"])
     ]),
     ("local2", [
       ([0, 8, 0], []),
@@ -126,14 +129,14 @@
 ghcPackages :: GhcPackages
 ghcPackages = GhcPackages {installed, available}
 
-build :: Versions -> M BuildStatus
+build :: Versions -> M (BuildStatus, Overrides)
 build = \case
   versions
     | Just [0, 9, 0] <- versions !! "local2"
-    -> pure Failure
+    -> failure
   versions
     | Just [0, 9, 0] <- versions !! "local3"
-    -> pure Failure
+    -> failure
   [
     ("base", [4, 12, 0, 0]),
     ("direct1", [1, 2, 1]),
@@ -143,12 +146,20 @@
     ("direct5", [1, 1, 1]),
     ("direct6", [1, 0, 1]),
     ("direct7", [1, 0, 1]),
+    ("direct8", [1, 0, 1]),
     ("local2", [0, 8, 0]),
     ("local3", [0, 8, 0]),
     ("local4", [0, 8, 0]),
     ("local5", [1, 0]),
     ("transitive1", [1, 0, 1])
-    ] -> pure Success
+    ] -> pure (Success, [
+      ("direct8", Override {
+        version = [1, 0, 1],
+        hash = SourceHash "direct8-1.0.1",
+        repo = Nothing,
+        revision = Just IsRevision
+      })
+    ])
 
   [
     ("base", [4, 12, 0, 0]),
@@ -159,12 +170,13 @@
     ("direct5", [1, 1, 1]),
     ("direct6", [1, 0, 1]),
     ("direct7", [1, 0, 1]),
+    ("direct8", [1, 0, 1]),
     ("local2", [0, 8, 0]),
     ("local3", [0, 8, 0]),
     ("local4", [0, 8, 0]),
     ("local5", [1, 0]),
     ("transitive1", [1, 0, 1])
-    ] -> pure Failure
+    ] -> failure
 
   [
     ("base", [4, 12, 0, 0]),
@@ -175,12 +187,13 @@
     ("direct5", [1, 1, 1]),
     ("direct6", [1, 0, 1]),
     ("direct7", [1, 0, 1]),
+    ("direct8", [1, 0, 1]),
     ("local2", [0, 8, 0]),
     ("local3", [0, 8, 0]),
     ("local4", [0, 8, 0]),
     ("local5", [1, 0]),
     ("transitive1", [1, 0, 1])
-    ] -> pure Success
+    ] -> success
 
   [
     ("base", [4, 12, 0, 0]),
@@ -191,12 +204,13 @@
     ("direct5", [1, 2, 1]),
     ("direct6", [1, 0, 1]),
     ("direct7", [1, 0, 1]),
+    ("direct8", [1, 0, 1]),
     ("local2", [0, 8, 0]),
     ("local3", [0, 8, 0]),
     ("local4", [0, 8, 0]),
     ("local5", [1, 0]),
     ("transitive1", [1, 0, 1])
-    ] -> pure Success
+    ] -> success
 
   [
     ("base", [4, 12, 0, 0]),
@@ -207,12 +221,13 @@
     ("direct5", [1, 2, 1]),
     ("direct6", [1, 1, 1]),
     ("direct7", [1, 0, 1]),
+    ("direct8", [1, 0, 1]),
     ("local2", [0, 8, 0]),
     ("local3", [0, 8, 0]),
     ("local4", [0, 8, 0]),
     ("local5", [1, 0]),
     ("transitive1", [1, 0, 1])
-    ] -> pure Success
+    ] -> success
 
   [
     ("base", [4, 12, 0, 0]),
@@ -223,12 +238,13 @@
     ("direct5", [1, 2, 1]),
     ("direct6", [1, 1, 1]),
     ("direct7", [1, 0, 1]),
+    ("direct8", [1, 0, 1]),
     ("local2", [0, 8, 0]),
     ("local3", [0, 8, 0]),
     ("local4", [0, 8, 0]),
     ("local5", [1, 0]),
     ("transitive1", [1, 0, 1])
-    ] -> pure Success
+    ] -> success
 
   [
     ("base", [4, 12, 0, 0]),
@@ -239,12 +255,13 @@
     ("direct5", [1, 2, 1]),
     ("direct6", [1, 1, 1]),
     ("direct7", [1, 0, 1]),
+    ("direct8", [1, 0, 1]),
     ("local2", [0, 8, 0]),
     ("local3", [0, 8, 0]),
     ("local4", [0, 10, 0]),
     ("local5", [1, 0]),
     ("transitive1", [1, 0, 1])
-    ] -> pure Success
+    ] -> success
 
 --   -- second iteration
   [
@@ -256,15 +273,20 @@
     ("direct5", [1, 2, 1]),
     ("direct6", [1, 1, 1]),
     ("direct7", [1, 0, 1]),
+    ("direct8", [1, 0, 1]),
     ("local2", [0, 8, 0]),
     ("local3", [0, 8, 0]),
     ("local4", [0, 10, 0]),
     ("local5", [1, 0]),
     ("transitive1", [1, 0, 1])
-    ] -> pure Failure
+    ] -> failure
 
   versions -> throwM (Fatal [exon|Unexpected build plan: #{showP versions}|])
+  where
+    success = pure (Success, mempty)
 
+    failure = pure (Failure, mempty)
+
 state :: ProjectStateProto
 state =
   ProjectStateProto {
@@ -322,6 +344,10 @@
         lower = null;
         upper = "1.1";
       };
+      direct8 = {
+        lower = null;
+        upper = "1.1";
+      };
       local1 = {
         lower = null;
         upper = null;
@@ -358,6 +384,7 @@
       direct5 = "1.2.1";
       direct6 = "1.1.1";
       direct7 = "1.0.1";
+      direct8 = "1.0.1";
       local2 = "0.8.0";
       local3 = "0.8.0";
       local4 = "0.10.0";
@@ -395,6 +422,11 @@
         version = "1.0.1";
         hash = "direct7-1.0.1";
       };
+      direct8 = {
+        version = "1.0.1";
+        hash = "direct8-1.0.1";
+        revision = true;
+      };
       local2 = {
         version = "0.8.0";
         hash = "local2-0.8.0";
@@ -440,6 +472,7 @@
     📦 [34mdirect5[0m   1.2.1      ↕ [no bounds] -> <[32m1.3[0m
     📦 [34mdirect6[0m   1.1.1      ↕ <[31m1.1[0m -> <[32m1.2[0m
     📦 [34mdirect7[0m   1.0.1      ↕ [no bounds] -> <[32m1.1[0m
+    📦 [34mdirect8[0m   1.0.1      ↕ [no bounds] -> <[32m1.1[0m
     📦 [34mlocal2[0m    0.8.0      ↕ <0.9
     📦 [34mlocal3[0m    0.8.0      ↕ <0.9
     📦 [34mlocal4[0m    0.10.0     ↕ <[31m0.9[0m -> <[32m0.11[0m
@@ -480,6 +513,21 @@
 --   It has a dependency on @direct4@ with an upper bound of <1.2, which would prevent it from being selected by the
 --   solver if we didn't use @AllowNewer@.
 --
+-- - @direct6@ is a direct dependency of the project, and a direct dependency of @transitive1@.
+--   @transitive1@ is a direct dependency of @direct7@, and therefore @direct6@ is a transitive dependency of both
+--   @direct7@ and the project.
+--   While @direct7@ and @transitive1@ both have their latest versions installed, the installed version of @transitive1@
+--   has a dependency on @direct6-1.0.1@ (since installed versions don't have range deps, and need the precise package
+--   ID of dependencies with which they were installed).
+--   When @direct6@ is then bumped regularly to the latest version, both @transitive1@ and @direct7@ are overridden as
+--   well by the solver.
+--
+-- - The installed version of @direct8@ is simulated to have incompatible bounds, which is indicated by the fact that
+--   'build' returns a revision override for it in the first build.
+--   In later builds, the solver configures an override for @direct8@ initially, since revisions are persisted across
+--   mutations in @SolverState@.
+--   In the final state file, the override for @direct8@ includes the flag @revision = true@.
+--
 -- - @local2@ is in a different env, so it will be treated as a mutable dependency despite being a local package.
 --   It also has no installed version, since it wasn't available on Hackage (yet) at the time of the nixpkgs snapshot
 --   and therefore isn't present in nix;
@@ -598,7 +646,7 @@
     params = (testParams False packages_upToDate) {
       ghcPackages = ghcPackages_upToDate,
       state = state_upToDate,
-      build = build_upToDate
+      build = withoutRevisions build_upToDate
     }
 
 test_bumpMutation :: TestTree
diff --git a/test/Hix/Test/Managed/LowerAuto/MutationOptimizeTest.hs b/test/Hix/Test/Managed/LowerAuto/MutationOptimizeTest.hs
--- a/test/Hix/Test/Managed/LowerAuto/MutationOptimizeTest.hs
+++ b/test/Hix/Test/Managed/LowerAuto/MutationOptimizeTest.hs
@@ -5,6 +5,7 @@
 
 import Hix.Class.Map (nGen, (!!))
 import Hix.Data.Error (ErrorMessage (Fatal))
+import Hix.Data.Overrides (Overrides)
 import Hix.Data.Version (Versions)
 import qualified Hix.Managed.Cabal.Data.Packages
 import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages), InstalledPackages)
@@ -19,7 +20,7 @@
 import Hix.NixExpr (renderRootExpr)
 import Hix.Pretty (showP)
 import Hix.Test.Hedgehog (eqLines)
-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams)
+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams, withoutRevisions)
 import Hix.Test.Utils (UnitTest, unitTest)
 
 packages :: ProjectPackages
@@ -94,8 +95,8 @@
 ghcPackages :: GhcPackages
 ghcPackages = GhcPackages {installed, available}
 
-buildVersionsBasic :: Versions -> M BuildStatus
-buildVersionsBasic = \case
+buildVersionsBasic :: Versions -> M (BuildStatus, Overrides)
+buildVersionsBasic = withoutRevisions \case
   versions
     | Just v <- versions !! "direct2"
     , v <= [1, 0]
@@ -337,7 +338,7 @@
       (testParams False packages) {
         ghcPackages,
         state = initialState,
-        build = buildVersionsReset
+        build = withoutRevisions buildVersionsReset
       }
 
 test_lowerAutoMutationOptimize :: TestTree
diff --git a/test/Hix/Test/Managed/LowerAuto/MutationStabilizeTest.hs b/test/Hix/Test/Managed/LowerAuto/MutationStabilizeTest.hs
--- a/test/Hix/Test/Managed/LowerAuto/MutationStabilizeTest.hs
+++ b/test/Hix/Test/Managed/LowerAuto/MutationStabilizeTest.hs
@@ -4,6 +4,7 @@
 
 import Hix.Class.Map (nGen, (!!))
 import Hix.Data.Error (ErrorMessage (Fatal))
+import Hix.Data.Overrides (Overrides)
 import Hix.Data.Version (Versions)
 import qualified Hix.Managed.Cabal.Data.Packages
 import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages), InstalledPackages)
@@ -18,7 +19,7 @@
 import Hix.NixExpr (renderRootExpr)
 import Hix.Pretty (showP)
 import Hix.Test.Hedgehog (eqLines)
-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams)
+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams, withoutRevisions)
 import Hix.Test.Utils (UnitTest)
 
 packages :: ProjectPackages
@@ -96,8 +97,8 @@
         fromString [exon|direct#{show num}-1.0|]
       )
 
-build :: Versions -> M BuildStatus
-build = \case
+build :: Versions -> M (BuildStatus, Overrides)
+build = withoutRevisions \case
   versions
     | Just v <- versions !! "direct2"
     , v <= [1, 0]
diff --git a/test/Hix/Test/Managed/LowerInit/MutationTest.hs b/test/Hix/Test/Managed/LowerInit/MutationTest.hs
--- a/test/Hix/Test/Managed/LowerInit/MutationTest.hs
+++ b/test/Hix/Test/Managed/LowerInit/MutationTest.hs
@@ -6,6 +6,7 @@
 import Hix.Class.Map ((!!))
 import Hix.Data.Error (ErrorMessage (Fatal))
 import Hix.Data.Options (ProjectOptions (..))
+import Hix.Data.Overrides (Overrides)
 import Hix.Data.Version (Versions)
 import qualified Hix.Managed.Cabal.Changes
 import Hix.Managed.Cabal.Changes (SolverPlan (SolverPlan))
@@ -23,7 +24,7 @@
 import Hix.NixExpr (renderRootExpr)
 import Hix.Pretty (showP)
 import Hix.Test.Hedgehog (eqLines, listEqTail, listEqZip)
-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, nosortOptions, testParams)
+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, nosortOptions, testParams, withoutRevisions)
 import Hix.Test.Utils (UnitTest)
 
 packages :: ProjectPackages
@@ -119,8 +120,8 @@
     resolving = False
   }
 
-build :: Versions -> M BuildStatus
-build = \case
+build :: Versions -> M (BuildStatus, Overrides)
+build = withoutRevisions \case
   versions
     | Just [1, 0, n] <- versions !! "direct1"
     , n /= 5
diff --git a/test/Hix/Test/Managed/LowerOptimize/CandidatesTest.hs b/test/Hix/Test/Managed/LowerOptimize/CandidatesTest.hs
--- a/test/Hix/Test/Managed/LowerOptimize/CandidatesTest.hs
+++ b/test/Hix/Test/Managed/LowerOptimize/CandidatesTest.hs
@@ -10,6 +10,7 @@
 import qualified Hix.Managed.Cabal.Data.SolverState
 import Hix.Managed.Cabal.Data.SolverState (SolverState (SolverState), solverState, updateSolverState)
 import Hix.Managed.Data.Constraints (MutationConstraints (MutationConstraints, mutation))
+import Hix.Managed.Data.Initial (initial)
 import Hix.Managed.Data.Mutable (MutableDep)
 import qualified Hix.Managed.Data.MutableId
 import Hix.Managed.Data.MutableId (MutableId (MutableId))
@@ -79,10 +80,12 @@
     for majors \ mut ->
       processMutationLower def lowerOptimizeMode lowerOptimizeUpdate initialState mut (build buildRef)
   mutationResults <- evalEither result
-  Just (MutationSuccess candidate True mstate (updateSolverState (const newConstraints) initialState)) === mutationResults
+  Just target === mutationResults
   triedVersions <- liftIO (readIORef buildRef)
   (Just <$> targets) === triedVersions
   where
+    target = MutationSuccess candidate True mstate (updateSolverState (const newConstraints) (initial initialState))
+
     dep = simpleQueryDep mutable [[2, 4]]
 
     mstate =
diff --git a/test/Hix/Test/Managed/LowerOptimize/MutationTest.hs b/test/Hix/Test/Managed/LowerOptimize/MutationTest.hs
--- a/test/Hix/Test/Managed/LowerOptimize/MutationTest.hs
+++ b/test/Hix/Test/Managed/LowerOptimize/MutationTest.hs
@@ -3,6 +3,7 @@
 import Exon (exon)
 
 import Hix.Data.Error (ErrorMessage (Fatal))
+import Hix.Data.Overrides (Overrides)
 import Hix.Data.Version (Versions)
 import qualified Hix.Managed.Cabal.Data.Packages
 import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages))
@@ -17,7 +18,7 @@
 import Hix.NixExpr (renderRootExpr)
 import Hix.Pretty (showP)
 import Hix.Test.Hedgehog (eqLines)
-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams)
+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams, withoutRevisions)
 import Hix.Test.Utils (UnitTest)
 
 packages :: ProjectPackages
@@ -78,8 +79,8 @@
     resolving = False
   }
 
-build :: Versions -> M BuildStatus
-build = \case
+build :: Versions -> M (BuildStatus, Overrides)
+build = withoutRevisions \case
   [("direct1", [1, 9, 1]), ("direct2", [2, 0, 1]), ("transitive1", [1, 0, 1])] -> pure Success
   [("direct1", [1, 8, 1]), ("direct2", [2, 0, 1]), ("transitive1", [1, 0, 1])] -> pure Success
   [("direct1", [1, 8, 1]), ("direct2", [1, 9, 1]), ("transitive1", [1, 0, 1])] -> pure Failure
diff --git a/test/Hix/Test/Managed/LowerOptimize/OrderTest.hs b/test/Hix/Test/Managed/LowerOptimize/OrderTest.hs
--- a/test/Hix/Test/Managed/LowerOptimize/OrderTest.hs
+++ b/test/Hix/Test/Managed/LowerOptimize/OrderTest.hs
@@ -1,6 +1,7 @@
 module Hix.Test.Managed.LowerOptimize.OrderTest where
 
 import Hix.Data.Monad (M)
+import Hix.Data.Overrides (Overrides)
 import Hix.Data.Version (Versions)
 import Hix.Managed.Cabal.Changes (SolverPlan (..))
 import qualified Hix.Managed.Cabal.Data.Packages
@@ -73,8 +74,8 @@
     resolving = False
   }
 
-build :: Versions -> M BuildStatus
-build _ = pure Success
+build :: Versions -> M (BuildStatus, Overrides)
+build _ = pure (Success, mempty)
 
 cabalTarget :: [(EnvConstraints, Maybe SolverPlan)]
 cabalTarget =
diff --git a/test/Hix/Test/Managed/LowerStabilize/MutationTest.hs b/test/Hix/Test/Managed/LowerStabilize/MutationTest.hs
--- a/test/Hix/Test/Managed/LowerStabilize/MutationTest.hs
+++ b/test/Hix/Test/Managed/LowerStabilize/MutationTest.hs
@@ -3,6 +3,7 @@
 import Exon (exon)
 
 import Hix.Data.Error (ErrorMessage (Fatal))
+import Hix.Data.Overrides (Overrides)
 import Hix.Data.Version (Versions)
 import qualified Hix.Managed.Cabal.Data.Packages
 import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages))
@@ -16,7 +17,7 @@
 import Hix.NixExpr (renderRootExpr)
 import Hix.Pretty (showP)
 import Hix.Test.Hedgehog (eqLines)
-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams)
+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams, withoutRevisions)
 import Hix.Test.Utils (UnitTest)
 
 available :: SourcePackages
@@ -72,8 +73,8 @@
     resolving = False
   }
 
-build :: Versions -> M BuildStatus
-build = \case
+build :: Versions -> M (BuildStatus, Overrides)
+build = withoutRevisions \case
   [("direct1", [2, 0, 1]), ("direct2", [2, 0, 1])] -> pure Success
   [("direct1", [1, 8, 1]), ("direct2", [1, 8, 1])] -> pure Failure
   [("direct1", [1, 8, 1]), ("direct2", [2, 0, 1])] -> pure Failure
diff --git a/testing/Hix/Test/Managed/Run.hs b/testing/Hix/Test/Managed/Run.hs
--- a/testing/Hix/Test/Managed/Run.hs
+++ b/testing/Hix/Test/Managed/Run.hs
@@ -9,6 +9,7 @@
 import Hix.Data.NixExpr (Expr)
 import qualified Hix.Data.Options as ProjectOptions
 import Hix.Data.Options (ProjectOptions)
+import Hix.Data.Overrides (Overrides)
 import Hix.Data.PackageName (LocalPackage)
 import Hix.Data.Version (Versions)
 import Hix.Managed.Cabal.Changes (SolverPlan)
@@ -45,7 +46,7 @@
     ghcPackages :: GhcPackages,
     state :: ProjectStateProto,
     projectOptions :: ProjectOptions,
-    build :: Versions -> M BuildStatus
+    build :: Versions -> M (BuildStatus, Overrides)
   }
 
 nosortOptions :: ProjectOptions
@@ -65,9 +66,17 @@
     ghcPackages = GhcPackages {installed = [], available = []},
     state = def,
     projectOptions = nosortOptions,
-    build = const (pure Failure)
+    build = const (pure (Failure, mempty))
   }
 
+withoutRevisions ::
+  (Versions -> M BuildStatus) ->
+  Versions ->
+  M (BuildStatus, Overrides)
+withoutRevisions build versions = do
+  status <- build versions
+  pure (status, mempty)
+
 data Result a =
   Result {
     stateFile :: Expr,
@@ -100,7 +109,7 @@
 managedTest' defaultEnvName params main =
   withFrozenCallStack do
     (handlers0, stateFileRef, _) <-
-      BuildHandlers.handlersUnitTest params.ghcPackages (fmap resultFromStatus . params.build)
+      BuildHandlers.handlersUnitTest params.ghcPackages (fmap (first resultFromStatus) . params.build)
     (cabalRef, handlers1) <-
       if params.cabalLog
       then first Just <$> BuildHandlers.logCabal handlers0
