diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,7 @@
 Changelog for Shake (* = breaking change)
 
+0.19.6, released 2021-09-07
+    #810, don't hash files in &%> if you don't have to
 0.19.5, released 2021-07-04
     #807, fix space leak in Database module
     #796, fix a bug with newCache dependencies
diff --git a/shake.cabal b/shake.cabal
--- a/shake.cabal
+++ b/shake.cabal
@@ -1,7 +1,7 @@
 cabal-version:      1.18
 build-type:         Simple
 name:               shake
-version:            0.19.5
+version:            0.19.6
 license:            BSD3
 license-file:       LICENSE
 category:           Development, Shake
diff --git a/src/Development/Shake/Internal/Core/Action.hs b/src/Development/Shake/Internal/Core/Action.hs
--- a/src/Development/Shake/Internal/Core/Action.hs
+++ b/src/Development/Shake/Internal/Core/Action.hs
@@ -99,15 +99,20 @@
     pure res
 
 -- | If an exception is raised by the 'Action', perform some 'IO' then reraise the exception.
+--   This function is implemented using 'actionBracket'.
 actionOnException :: Action a -> IO b -> Action a
 actionOnException act free = actionBracketEx False (pure ()) (const free) (const act)
 
 -- | After an 'Action', perform some 'IO', even if there is an exception.
+--   This function is implemented using 'actionBracket'.
 actionFinally :: Action a -> IO b -> Action a
 actionFinally act free = actionBracket (pure ()) (const free) (const act)
 
--- | Like `bracket`, but where the inner operation is of type 'Action'. Usually used as
+-- | Like 'bracket', but where the inner operation is of type 'Action'. Usually used as
 --   @'actionBracket' alloc free use@.
+--
+--   The @free@ action will be run masked. The cost of 'actionBracket' is _O(n log n)_
+--   in the number of simultaneous 'actionBracket' calls active in the program.
 actionBracket :: IO a -> (a -> IO b) -> (a -> Action c) -> Action c
 actionBracket = actionBracketEx True
 
diff --git a/src/Development/Shake/Internal/Rules/Files.hs b/src/Development/Shake/Internal/Rules/Files.hs
--- a/src/Development/Shake/Internal/Rules/Files.hs
+++ b/src/Development/Shake/Internal/Rules/Files.hs
@@ -119,7 +119,9 @@
             case v of
                 Just v -> case filesEqualValue opts old v of
                     NotEqual -> rebuild
-                    EqualCheap -> pure $ RunResult ChangedNothing (fromJust o) v
+                    -- See #810, important we pass old (which can be cheaply evaluated)
+                    -- and not v, which might have some lazily-evaluated file hashes in
+                    EqualCheap -> pure $ RunResult ChangedNothing (fromJust o) old
                     EqualExpensive -> pure $ RunResult ChangedStore (runBuilder $ putEx $ Result ver v) v
                 Nothing -> rebuild
         _ -> rebuild
