            (last-mtime (nth 0 build-info))
            (last-recipe (nth 2 build-info)))
       (or (null build-info)
+          (member local-repo straight--live-modified-repos)
           ;; Rebuild if relevant parts of the recipe have changed.
           (cl-dolist (keyword straight--build-keywords nil)
             (unless (equal (plist-get recipe keyword)
                            (plist-get last-recipe keyword))
               (cl-return t)))
+          ;; Somebody deleted the build directory...
+          (not (file-exists-p (straight--build-dir package)))
           (progn
+            ;; Don't look at mtimes unless we're told to. Otherwise,
+            ;; rely on live modification checking/user attention.
+            (unless (eq straight-check-for-modifications 'at-startup)
+              (cl-return-from straight--package-might-be-modified-p))
             ;; This method should always be called from a transaction.
             ;; We'll get an error from `straight--transaction-exec' if
             ;; that's somehow not the case.


(defun straight--load-build-cache ()
  "Load data from build-cache.el into memory.
This sets the variables `straight--build-cache' and
`straight--eagerly-checked-packages'. If the build cache is
malformed, don't signal an error, but set these variables to
empty values (all packages will be rebuilt, with no caching)."
  ;; Start by clearing the build cache. If the one on disk is
  ;; malformed (or outdated), these values will be use.
  (setq straight--build-cache (make-hash-table :test #'equal))


;;;;; Paths

(defun straight--path-prefix-p (prefix-path full-path)
  "Return non-nil if PREFIX-PATH is a prefix of FULL-PATH.
This takes into account case insensitivity on macOS."
  (string-prefix-p prefix-path full-path (eq system-type 'darwin)))

(defun straight--emacs-dir (&rest segments)
  "Get a subdirectory of the `user-emacs-directory'.
The SEGMENTS are path segments which are concatenated with
