                                                      :rest []}}}}}}}]]
     (repeatedly #(println
                   (let [spec (first (shuffle specs))]
-                    (morph (time (generate spec model))))))))
+                    (let [result (morph (time (binding [babel.generate/truncate? true]
+                                                (wait wait-ms-for-generation (fn [] (generate spec model))))))]
+                      (or (and (not (empty? result)) result)
+                          "TIMEOUT.")))))))
+
 (defn nextcamp []
   (let [parse (-> "the small dogs you see" parse first)]
     (pprint (u/get-in parse [:synsem :sem]))))

   [babel.directory :refer [models]] ;; this is needed even though there are no references to directory in here.
   [babel.generate :as g :refer [frontier generate get-lexemes]]
   [babel.english :as english :refer [model morph morph-ps]]
   #?(:cljs [babel.logjs :as log])
   #?(:clj [clojure.tools.logging :as log])
   #?(:clj [clojure.repl :refer [doc]])

                   :subcat []
                   :sem {:aspect :simple
                         :tense :present}}}]]
    (repeatedly
     #(println
       (let [spec (first (shuffle specs))]
         (morph (binding [babel.generate/println? false
                          babel.generate/truncate? true]
                  (generate spec model))
                :show-notes false))))))

(def ^:dynamic wait-ms-for-generation 10000)

(declare wait)

(defn basecamp []
  ;; TODO: improve performance by using {:mod {:first {:obj :modified}}.
  (let [specs
