diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,14 @@
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
+## 0.5.1.0 - 2024-02-12
+
+### Added
+
+ - `Mountable` configuration format
+ - Constant booleans in `Condition` expressions
+ - `SubstitutionQueryResult` evaluation event
+
 ## 0.5.0.1 - 2023-06-28
 
  - Maintenance release
diff --git a/hercules-ci-api-agent.cabal b/hercules-ci-api-agent.cabal
--- a/hercules-ci-api-agent.cabal
+++ b/hercules-ci-api-agent.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.12
 name:               hercules-ci-api-agent
-version:            0.5.0.1
+version:            0.5.1.0
 synopsis:
   API definition for Hercules CI Agent to talk to hercules-ci.com or Hercules CI Enterprise
 
@@ -23,7 +23,6 @@
     Hercules.API.Agent
     Hercules.API.Agent.Build
     Hercules.API.Agent.Build.BuildEvent
-    Hercules.API.Agent.Build.BuildEvent.OutputInfo
     Hercules.API.Agent.Build.BuildEvent.Pushed
     Hercules.API.Agent.Build.BuildTask
     Hercules.API.Agent.Effect.EffectTask
@@ -38,6 +37,7 @@
     Hercules.API.Agent.Evaluate.EvaluateEvent.BuildRequired
     Hercules.API.Agent.Evaluate.EvaluateEvent.DerivationInfo
     Hercules.API.Agent.Evaluate.EvaluateEvent.InputDeclaration
+    Hercules.API.Agent.Evaluate.EvaluateEvent.SubstitutionQueryResult
     Hercules.API.Agent.Evaluate.EvaluateEvent.JobConfig
     Hercules.API.Agent.Evaluate.EvaluateEvent.Message
     Hercules.API.Agent.Evaluate.EvaluateEvent.OnPushHandlerEvent
@@ -54,6 +54,7 @@
     Hercules.API.Agent.LifeCycle.CreateAgentSession_V2
     Hercules.API.Agent.LifeCycle.ServiceInfo
     Hercules.API.Agent.LifeCycle.StartInfo
+    Hercules.API.Agent.OutputInfo
     Hercules.API.Agent.Socket.AgentPayload
     Hercules.API.Agent.Socket.Frame
     Hercules.API.Agent.Socket.ServicePayload
@@ -67,6 +68,7 @@
     Hercules.API.TaskStatus
     Hercules.Formats.CachixCache
     Hercules.Formats.Common
+    Hercules.Formats.Mountable
     Hercules.Formats.NixCache
     Hercules.Formats.Secret
 
@@ -130,6 +132,7 @@
     Hercules.API.Agent.LifeCycle.AgentInfoSpec
     Hercules.Formats.CachixCacheSpec
     Hercules.Formats.SecretSpec
+    Hercules.Formats.MountableSpec
     Spec
 
   hs-source-dirs:     test
diff --git a/src/Hercules/API/Agent/Build/BuildEvent.hs b/src/Hercules/API/Agent/Build/BuildEvent.hs
--- a/src/Hercules/API/Agent/Build/BuildEvent.hs
+++ b/src/Hercules/API/Agent/Build/BuildEvent.hs
@@ -2,11 +2,11 @@
 
 module Hercules.API.Agent.Build.BuildEvent where
 
-import Hercules.API.Agent.Build.BuildEvent.OutputInfo
-  ( OutputInfo,
-  )
 import Hercules.API.Agent.Build.BuildEvent.Pushed
   ( Pushed,
+  )
+import Hercules.API.Agent.OutputInfo
+  ( OutputInfo,
   )
 import Hercules.API.Prelude
 
diff --git a/src/Hercules/API/Agent/Build/BuildEvent/OutputInfo.hs b/src/Hercules/API/Agent/Build/BuildEvent/OutputInfo.hs
deleted file mode 100644
--- a/src/Hercules/API/Agent/Build/BuildEvent/OutputInfo.hs
+++ /dev/null
@@ -1,19 +0,0 @@
-{-# LANGUAGE DeriveAnyClass #-}
-
-module Hercules.API.Agent.Build.BuildEvent.OutputInfo where
-
-import Hercules.API.Prelude
-
-data OutputInfo = OutputInfo
-  { -- | store path ending in .drv
-    deriver :: Text,
-    -- | e.g. out, dev
-    name :: Text,
-    -- | store path
-    path :: Text,
-    -- | typically sha256:...
-    hash :: Text,
-    -- | nar size in bytes
-    size :: Integer
-  }
-  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
diff --git a/src/Hercules/API/Agent/Evaluate/EvaluateEvent.hs b/src/Hercules/API/Agent/Evaluate/EvaluateEvent.hs
--- a/src/Hercules/API/Agent/Evaluate/EvaluateEvent.hs
+++ b/src/Hercules/API/Agent/Evaluate/EvaluateEvent.hs
@@ -14,6 +14,7 @@
 import Hercules.API.Agent.Evaluate.EvaluateEvent.OnPushHandlerEvent (OnPushHandlerEvent)
 import Hercules.API.Agent.Evaluate.EvaluateEvent.OnScheduleHandlerEvent (OnScheduleHandlerEvent)
 import Hercules.API.Agent.Evaluate.EvaluateEvent.PushedAll (PushedAll)
+import Hercules.API.Agent.Evaluate.EvaluateEvent.SubstitutionQueryResult (SubstitutionQueryResult)
 import Hercules.API.Prelude
 
 data EvaluateEvent
@@ -25,6 +26,7 @@
   | DerivationInfo DerivationInfo
   | PushedAll PushedAll
   | BuildRequired BuildRequired
+  | SubstitutionQueryResult SubstitutionQueryResult
   | BuildRequest BuildRequest
   | JobConfig JobConfig
   | OnPushHandlerEvent OnPushHandlerEvent
diff --git a/src/Hercules/API/Agent/Evaluate/EvaluateEvent/SubstitutionQueryResult.hs b/src/Hercules/API/Agent/Evaluate/EvaluateEvent/SubstitutionQueryResult.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Agent/Evaluate/EvaluateEvent/SubstitutionQueryResult.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Agent.Evaluate.EvaluateEvent.SubstitutionQueryResult
+  ( SubstitutionQueryResult (..),
+  )
+where
+
+import Hercules.API.Agent.OutputInfo (OutputInfo)
+import Hercules.API.Prelude
+
+data SubstitutionQueryResult = SubstitutionQueryResult
+  { storeURI :: !Text,
+    -- | NB: does not necessarily match outputInfo.derivation
+    derivation :: !Text,
+    -- | NB: does not necessarily match outputInfo.name
+    outputName :: !Text,
+    -- | NB: does not necessarily match derivation and outputName
+    --
+    -- 'Nothing': not substitutable
+    -- 'Just': substitutable, and expect the following metadata
+    outputInfo :: !(Maybe OutputInfo)
+  }
+  deriving (Generic, Show, Eq, NFData, FromJSON, ToJSON)
diff --git a/src/Hercules/API/Agent/OutputInfo.hs b/src/Hercules/API/Agent/OutputInfo.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Agent/OutputInfo.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Agent.OutputInfo where
+
+import Hercules.API.Prelude
+
+-- | Produced by both build tasks and evaluation tasks
+data OutputInfo = OutputInfo
+  { -- | store path ending in .drv
+    deriver :: Text,
+    -- | e.g. out, dev
+    name :: Text,
+    -- | store path
+    path :: Text,
+    -- | typically sha256:...
+    hash :: Text,
+    -- | nar size in bytes
+    size :: Integer,
+    -- | output references in store path basename form
+    --
+    -- Maybe for backcompat; older agents have not reported the output references.
+    references :: Maybe [Text]
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
diff --git a/src/Hercules/API/Agent/Socket/Frame.hs b/src/Hercules/API/Agent/Socket/Frame.hs
--- a/src/Hercules/API/Agent/Socket/Frame.hs
+++ b/src/Hercules/API/Agent/Socket/Frame.hs
@@ -25,7 +25,7 @@
 mapOob _ (Ack a) = Ack a
 mapOob _ (Exception e) = Exception e
 
-removeOob :: Alternative f => Frame o a -> f (Frame Void a)
+removeOob :: (Alternative f) => Frame o a -> f (Frame Void a)
 removeOob (Msg a b) = pure $ Msg a b
 removeOob (Ack a) = pure $ Ack a
 removeOob Oob {} = empty
diff --git a/src/Hercules/Formats/CachixCache.hs b/src/Hercules/Formats/CachixCache.hs
--- a/src/Hercules/Formats/CachixCache.hs
+++ b/src/Hercules/Formats/CachixCache.hs
@@ -29,10 +29,10 @@
       ( "kind"
           .= String "CachixCache"
           <> "signingKeys"
-          .= signingKeys a
+            .= signingKeys a
           <> foldMap ("authToken" .=) (authToken a)
           <> "publicKeys"
-          .= publicKeys a
+            .= publicKeys a
       )
 
 instance FromJSON CachixCache where
diff --git a/src/Hercules/Formats/Mountable.hs b/src/Hercules/Formats/Mountable.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/Formats/Mountable.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.Formats.Mountable where
+
+import qualified Data.Aeson as A
+import Data.Text (Text)
+import GHC.Generics (Generic)
+import Hercules.Formats.Secret (Condition)
+import Prelude (Bool, Eq, Show)
+
+data Mountable = Mountable
+  { -- | A path on the host.
+    source :: !Text,
+    readOnly :: !Bool,
+    condition :: !Condition
+  }
+  deriving (Generic, Show, Eq, A.ToJSON, A.FromJSON)
diff --git a/src/Hercules/Formats/NixCache.hs b/src/Hercules/Formats/NixCache.hs
--- a/src/Hercules/Formats/NixCache.hs
+++ b/src/Hercules/Formats/NixCache.hs
@@ -30,11 +30,11 @@
       ( "kind"
           .= String "NixCache"
           <> "storeURI"
-          .= storeURI a
+            .= storeURI a
           <> "signingKeys"
-          .= signingKeys a
+            .= signingKeys a
           <> "publicKeys"
-          .= publicKeys a
+            .= publicKeys a
       )
 
 instance FromJSON NixCache where
diff --git a/src/Hercules/Formats/Secret.hs b/src/Hercules/Formats/Secret.hs
--- a/src/Hercules/Formats/Secret.hs
+++ b/src/Hercules/Formats/Secret.hs
@@ -21,6 +21,7 @@
   | IsTag
   | IsRepo Text
   | IsOwner Text
+  | Const Bool
   deriving (Generic, Eq, Read, Show)
 
 instance ToJSON Condition where
@@ -31,6 +32,7 @@
   toJSON (IsBranch a) = object ["isBranch" .= a]
   toJSON (IsRepo a) = object ["isRepo" .= a]
   toJSON (IsOwner a) = object ["isOwner" .= a]
+  toJSON (Const b) = Bool b
 
 instance FromJSON Condition where
   parseJSON (String "isTag") = pure IsTag
@@ -42,7 +44,8 @@
         Nothing -> fail $ "The field name in a Condition object must be one of " <> show (map fst (HM.toList taggedConditionParsers))
         Just p -> p v
       _ -> fail "A Condition object must contain a single field."
-  parseJSON _ = fail "Expected Object or String."
+  parseJSON (Bool b) = pure (Const b)
+  parseJSON _ = fail "Expected Object, String or true."
 
 taggedConditionParsers :: HM.HashMap Text (Value -> A.Parser Condition)
 taggedConditionParsers =
@@ -62,50 +65,6 @@
       ("isOwner", fmap IsOwner . parseJSON)
     ]
 
-{-
-
-This was awful:
-
-instance FromJSON Condition where
-  parseJSON (String "isTag") = pure IsTag
-  parseJSON (String "isDefaultBranch") = pure IsDefaultBranch
-  parseJSON j = do
-    l <- parseJSON j
-    case l of
-      [] -> fail "The empty list does not represent a Condition."
-      (jTag : args) -> do
-        tag <- parseJSON jTag
-        case tag :: Text of
-          "or" -> do
-            Or <$> traverse parseJSON args
-          "and" -> do
-            And <$> traverse parseJSON args
-          "isDefaultBranch" -> do
-            IsDefaultBranch <$ noParams tag args
-          "isTag" -> do
-            IsTag <$ noParams tag args
-          "isBranch" -> do
-            IsBranch <$> traverse parseJSON args
-          "isRepo" -> do
-            IsRepo <$> traverse parseJSON args
-          "isOwner" -> do
-            IsOwner <$> traverse parseJSON args
-          t -> do
-            fail $ "Unknown tag " <> show t <> " in Condition."
-    where
-      noParams _ [] = pure ()
-      noParams tag _ = fail $ "Condition with tag " <> show tag <> " does not take any parameters."
-
-instance ToJSON Condition where
-  toJSON (Or a) = toJSON (String "or" : map toJSON a)
-  toJSON (And a) = toJSON (String "and" : map toJSON a)
-  toJSON IsDefaultBranch = String "isDefaultBranch"
-  toJSON IsTag = String "isTag"
-  toJSON (IsBranch a) = toJSON (String "isBranch" : map toJSON a)
-  toJSON (IsRepo a) = toJSON (String "isRepo" : map toJSON a)
-  toJSON (IsOwner a) = toJSON (String "isOwner" : map toJSON a)
--}
-
 -- | Arbitrary secret like keys, tokens, passwords etc.
 data Secret = Secret
   { data_ :: Map Text Value,
@@ -123,10 +82,12 @@
 
 instance FromJSON Secret where
   parseJSON =
-    withKind "Secret" $
-      withVersions
+    withKind "Secret"
+      $ withVersions
         [ noVersion $ \o ->
             Secret
-              <$> o .: "data"
-              <*> o .:? "condition"
+              <$> o
+              .: "data"
+              <*> o
+              .:? "condition"
         ]
diff --git a/test/Hercules/API/Agent/LifeCycle/AgentInfoSpec.hs b/test/Hercules/API/Agent/LifeCycle/AgentInfoSpec.hs
--- a/test/Hercules/API/Agent/LifeCycle/AgentInfoSpec.hs
+++ b/test/Hercules/API/Agent/LifeCycle/AgentInfoSpec.hs
@@ -91,7 +91,7 @@
           ]
     }
 
-($=) :: A.ToJSON b => a -> b -> (a, A.Value)
+($=) :: (A.ToJSON b) => a -> b -> (a, A.Value)
 a $= b = (a, A.toJSON b)
 
 spec :: Spec
diff --git a/test/Hercules/Formats/MountableSpec.hs b/test/Hercules/Formats/MountableSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Hercules/Formats/MountableSpec.hs
@@ -0,0 +1,28 @@
+module Hercules.Formats.MountableSpec (spec) where
+
+import qualified AesonSupport as Aeson
+import Data.Aeson (eitherDecode)
+import Hercules.Formats.Mountable (Mountable (..))
+import Hercules.Formats.Secret (Condition (IsDefaultBranch, Or))
+import Hercules.Formats.SecretSpec (genCondition, genText)
+import Test.Hspec (Spec, describe, it, shouldBe)
+import Test.QuickCheck (Gen, arbitrary)
+import Prelude
+
+spec :: Spec
+spec = describe "Mountable" $ do
+  Aeson.checkLaws genMountable
+  it "Decodes example 1" $
+    eitherDecode
+      "{ \"source\": \"the source\", \"readOnly\": false, \"condition\": {\"or\": [\"isDefaultBranch\"]} }"
+      `shouldBe` Right
+        ( Mountable
+            { source = "the source",
+              readOnly = False,
+              condition = Or [IsDefaultBranch]
+            }
+        )
+
+genMountable :: Gen Mountable
+genMountable =
+  Mountable <$> genText <*> arbitrary <*> genCondition
diff --git a/test/Hercules/Formats/SecretSpec.hs b/test/Hercules/Formats/SecretSpec.hs
--- a/test/Hercules/Formats/SecretSpec.hs
+++ b/test/Hercules/Formats/SecretSpec.hs
@@ -64,7 +64,7 @@
     6
     ( Secret
         <$> liftArbitraryMap text (resize 100 genValue)
-        <*> frequency [(1, pure Nothing), (19, Just <$> genCondition)]
+        <*> frequency [(1, pure Nothing), (17, Just <$> genCondition)]
     )
 
 genCondition :: Gen Condition
@@ -76,13 +76,15 @@
       (1, pure IsTag),
       (1, IsBranch <$> text),
       (1, IsRepo <$> text),
-      (1, IsOwner <$> text)
+      (1, IsOwner <$> text),
+      (1, Hercules.Formats.Secret.Const <$> arbitrary)
     ]
 
-text :: Gen Text
+genText, text :: Gen Text
 text = TE.decodeUtf8 . TE.encodeUtf8 . T.pack <$> resize 4 arbitrary
+genText = text
 
-liftArbitraryMap :: Ord k => Gen k -> Gen a -> Gen (M.Map k a)
+liftArbitraryMap :: (Ord k) => Gen k -> Gen a -> Gen (M.Map k a)
 liftArbitraryMap k v = M.fromList <$> liftArbitrary ((,) <$> k <*> v)
 
 genValue :: Gen A.Value
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -7,6 +7,7 @@
 import qualified Hercules.API.Agent.Evaluate.EvaluateEvent.DerivationInfoSpec
 import qualified Hercules.API.Agent.LifeCycle.AgentInfoSpec
 import qualified Hercules.Formats.CachixCacheSpec
+import qualified Hercules.Formats.MountableSpec
 import qualified Hercules.Formats.SecretSpec
 import Test.Hspec
 
@@ -22,5 +23,7 @@
     Hercules.API.Agent.Evaluate.EvaluateEvent.AttributeEffectEventSpec.spec
   describe "Hercules.Formats.CachixCache" do
     Hercules.Formats.CachixCacheSpec.spec
+  describe "Hercules.Formats.Mountable" do
+    Hercules.Formats.MountableSpec.spec
   describe "Hercules.Formats.Secret" do
     Hercules.Formats.SecretSpec.spec
