         version (thing->version thing)
         _       (assert version)
         handle  (thing->handle config :else version)]
-    (for [d     (.listFiles handle)
-          :when (.isDirectory d)]
-      (->T :namespace version (.getName d)))))
+    (if (.isDirectory handle)
+      (for [d     (.listFiles handle)
+            :when (.isDirectory d)]
+        (->T :namespace version (.getName d)))
+      (throw-e "No such version "
+               (:uri thing)))))
 
 (defmethod api/list-defs :filesystem [config thing]
   (let [thing     (ensure-thing thing)

        handle (thing->meta-handle config thing)]
    (when (.exists handle) ;; guard against missing files
      (-> handle
        slurp
        (string/replace #"#<.*?>" "nil") ;; FIXME: Hack to ignore unreadable #<>s
        edn/read-string))))

(defmethod api/read-related :filesystem [config thing]
  ;; FIXME: This assumes the old Grimoire 0.3.X related file format,

        currentv (thing->version thing)               ; version handle
        current  (normalize-version (:name currentv)) ; version string
        added    (-> config
                    (api/read-meta thing)
                    (get :added "0.0.0")
                    normalize-version)               ; version string
        versions (->> (:parent currentv)
                    (api/list-versions config))
        unv-path (thing->relative-path :version thing)]
    (for [v     versions
          :when (<= 0 (semver/version-compare (:name v) added))
