diff --git a/docs/cloverage/the_great_game/merchants/merchant_utils.clj.html b/docs/cloverage/the_great_game/merchants/merchant_utils.clj.html
index 70cd0f3..8774b44 100644
--- a/docs/cloverage/the_great_game/merchants/merchant_utils.clj.html
+++ b/docs/cloverage/the_great_game/merchants/merchant_utils.clj.html
@@ -64,13 +64,13 @@
 <span class="not-tracked" title="0 out of 0 forms covered">
                 020&nbsp;&nbsp;&nbsp;&nbsp;[merchant&nbsp;world]
                 </span><br/>
-<span class="partial" title="3 out of 4 forms covered">
+<span class="covered" title="4 out of 4 forms covered">
                 021&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[m&nbsp;(cond
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
                 022&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keyword?&nbsp;merchant)
                 </span><br/>
-<span class="not-covered" title="0 out of 5 forms covered">
+<span class="covered" title="5 out of 5 forms covered">
                 023&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:merchants&nbsp;merchant)
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
@@ -79,8 +79,8 @@
 <span class="covered" title="1 out of 1 forms covered">
                 025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merchant)
                 </span><br/>
-<span class="covered" title="3 out of 3 forms covered">
-                026&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cargo&nbsp;(:stock&nbsp;m)]
+<span class="covered" title="8 out of 8 forms covered">
+                026&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cargo&nbsp;(or&nbsp;(:stock&nbsp;m)&nbsp;{})]
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
                 027&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(reduce
@@ -94,7 +94,7 @@
 <span class="covered" title="3 out of 3 forms covered">
                 030&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map
                 </span><br/>
-<span class="not-covered" title="0 out of 12 forms covered">
+<span class="covered" title="12 out of 12 forms covered">
                 031&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#(*&nbsp;(cargo&nbsp;%)&nbsp;(-&gt;&nbsp;world&nbsp;:commodities&nbsp;%&nbsp;:weight))
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
@@ -124,7 +124,7 @@
 <span class="covered" title="3 out of 3 forms covered">
                 040&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keyword?&nbsp;merchant)
                 </span><br/>
-<span class="not-covered" title="0 out of 5 forms covered">
+<span class="covered" title="5 out of 5 forms covered">
                 041&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:merchants&nbsp;merchant)
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
@@ -133,152 +133,194 @@
 <span class="covered" title="1 out of 1 forms covered">
                 043&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merchant)]
                 </span><br/>
-<span class="covered" title="2 out of 2 forms covered">
-                044&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(quot
+<span class="covered" title="3 out of 3 forms covered">
+                044&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(max
                 </span><br/>
-<span class="covered" title="9 out of 9 forms covered">
-                045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&nbsp;(:capacity&nbsp;m)&nbsp;(burden&nbsp;m&nbsp;world))
+<span class="not-tracked" title="0 out of 0 forms covered">
+                045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
+                </span><br/>
+<span class="covered" title="2 out of 2 forms covered">
+                046&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(quot
+                </span><br/>
+<span class="partial" title="13 out of 14 forms covered">
+                047&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&nbsp;(or&nbsp;(:capacity&nbsp;m)&nbsp;0)&nbsp;(burden&nbsp;m&nbsp;world))
                 </span><br/>
 <span class="covered" title="7 out of 7 forms covered">
-                046&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:commodities&nbsp;commodity&nbsp;:weight))))
+                048&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:commodities&nbsp;commodity&nbsp;:weight)))))
                 </span><br/>
 <span class="blank" title="0 out of 0 forms covered">
-                047&nbsp;&nbsp;
+                049&nbsp;&nbsp;
                 </span><br/>
 <span class="covered" title="1 out of 1 forms covered">
-                048&nbsp;&nbsp;(defn&nbsp;can-afford
+                050&nbsp;&nbsp;(defn&nbsp;can-afford
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                049&nbsp;&nbsp;&nbsp;&nbsp;&quot;Return&nbsp;the&nbsp;number&nbsp;of&nbsp;units&nbsp;of&nbsp;this&nbsp;`commodity`&nbsp;which&nbsp;this&nbsp;`merchant`
+                051&nbsp;&nbsp;&nbsp;&nbsp;&quot;Return&nbsp;the&nbsp;number&nbsp;of&nbsp;units&nbsp;of&nbsp;this&nbsp;`commodity`&nbsp;which&nbsp;this&nbsp;`merchant`
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                050&nbsp;&nbsp;&nbsp;&nbsp;can&nbsp;afford&nbsp;to&nbsp;buy&nbsp;in&nbsp;this&nbsp;`world`.&quot;
+                052&nbsp;&nbsp;&nbsp;&nbsp;can&nbsp;afford&nbsp;to&nbsp;buy&nbsp;in&nbsp;this&nbsp;`world`.&quot;
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                051&nbsp;&nbsp;&nbsp;&nbsp;[merchant&nbsp;world&nbsp;commodity]
+                053&nbsp;&nbsp;&nbsp;&nbsp;[merchant&nbsp;world&nbsp;commodity]
                 </span><br/>
 <span class="partial" title="3 out of 4 forms covered">
-                052&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[m&nbsp;(cond
+                054&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[m&nbsp;(cond
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
-                053&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keyword?&nbsp;merchant)
+                055&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keyword?&nbsp;merchant)
                 </span><br/>
-<span class="not-covered" title="0 out of 5 forms covered">
-                054&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:merchants&nbsp;merchant)
+<span class="covered" title="5 out of 5 forms covered">
+                056&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:merchants&nbsp;merchant)
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
-                055&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map?&nbsp;merchant)
+                057&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map?&nbsp;merchant)
                 </span><br/>
 <span class="covered" title="1 out of 1 forms covered">
-                056&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merchant)
+                058&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merchant)
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
-                057&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;(:location&nbsp;m)]
+                059&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;(:location&nbsp;m)]
+                </span><br/>
+<span class="covered" title="3 out of 3 forms covered">
+                060&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
+                </span><br/>
+<span class="covered" title="3 out of 3 forms covered">
+                061&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(nil?&nbsp;m)
+                </span><br/>
+<span class="covered" title="3 out of 3 forms covered">
+                062&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(throw&nbsp;(Exception.&nbsp;&quot;No&nbsp;merchant?&quot;))
+                </span><br/>
+<span class="covered" title="14 out of 14 forms covered">
+                063&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(or&nbsp;(nil?&nbsp;l)&nbsp;(nil?&nbsp;(-&gt;&nbsp;world&nbsp;:cities&nbsp;l)))
+                </span><br/>
+<span class="covered" title="6 out of 6 forms covered">
+                064&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(throw&nbsp;(Exception.&nbsp;(str&nbsp;&quot;No&nbsp;known&nbsp;location&nbsp;for&nbsp;merchant&nbsp;&quot;&nbsp;m)))
+                </span><br/>
+<span class="not-tracked" title="0 out of 0 forms covered">
+                065&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:else
                 </span><br/>
 <span class="covered" title="2 out of 2 forms covered">
-                058&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(quot
+                066&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(quot
                 </span><br/>
 <span class="covered" title="3 out of 3 forms covered">
-                059&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(:cash&nbsp;m)
+                067&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(:cash&nbsp;m)
                 </span><br/>
 <span class="covered" title="9 out of 9 forms covered">
-                060&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:cities&nbsp;l&nbsp;:prices&nbsp;commodity))))
+                068&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:cities&nbsp;l&nbsp;:prices&nbsp;commodity)))))
                 </span><br/>
 <span class="blank" title="0 out of 0 forms covered">
-                061&nbsp;&nbsp;
+                069&nbsp;&nbsp;
                 </span><br/>
 <span class="covered" title="1 out of 1 forms covered">
-                062&nbsp;&nbsp;(defn&nbsp;add-stock
+                070&nbsp;&nbsp;(defn&nbsp;add-stock
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                063&nbsp;&nbsp;&nbsp;&nbsp;&quot;Where&nbsp;`a`&nbsp;and&nbsp;`b`&nbsp;are&nbsp;both&nbsp;maps&nbsp;all&nbsp;of&nbsp;whose&nbsp;values&nbsp;are&nbsp;numbers,&nbsp;return
+                071&nbsp;&nbsp;&nbsp;&nbsp;&quot;Where&nbsp;`a`&nbsp;and&nbsp;`b`&nbsp;are&nbsp;both&nbsp;maps&nbsp;all&nbsp;of&nbsp;whose&nbsp;values&nbsp;are&nbsp;numbers,&nbsp;return
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                064&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;map&nbsp;whose&nbsp;keys&nbsp;are&nbsp;a&nbsp;union&nbsp;of&nbsp;the&nbsp;keys&nbsp;of&nbsp;`a`&nbsp;and&nbsp;`b`&nbsp;and&nbsp;whose&nbsp;values
+                072&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;map&nbsp;whose&nbsp;keys&nbsp;are&nbsp;a&nbsp;union&nbsp;of&nbsp;the&nbsp;keys&nbsp;of&nbsp;`a`&nbsp;and&nbsp;`b`&nbsp;and&nbsp;whose&nbsp;values
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                065&nbsp;&nbsp;&nbsp;&nbsp;are&nbsp;the&nbsp;sums&nbsp;of&nbsp;their&nbsp;respective&nbsp;values.&quot;
+                073&nbsp;&nbsp;&nbsp;&nbsp;are&nbsp;the&nbsp;sums&nbsp;of&nbsp;their&nbsp;respective&nbsp;values.&quot;
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                066&nbsp;&nbsp;&nbsp;&nbsp;[a&nbsp;b]
+                074&nbsp;&nbsp;&nbsp;&nbsp;[a&nbsp;b]
                 </span><br/>
-<span class="not-covered" title="0 out of 2 forms covered">
-                067&nbsp;&nbsp;&nbsp;&nbsp;(reduce
+<span class="covered" title="2 out of 2 forms covered">
+                075&nbsp;&nbsp;&nbsp;&nbsp;(reduce
                 </span><br/>
-<span class="not-covered" title="0 out of 1 forms covered">
-                068&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merge
+<span class="covered" title="1 out of 1 forms covered">
+                076&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merge
                 </span><br/>
-<span class="not-covered" title="0 out of 1 forms covered">
-                069&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a
+<span class="covered" title="1 out of 1 forms covered">
+                077&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a
                 </span><br/>
-<span class="not-covered" title="0 out of 3 forms covered">
-                070&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map
+<span class="covered" title="3 out of 3 forms covered">
+                078&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map
                 </span><br/>
-<span class="not-covered" title="0 out of 21 forms covered">
-                071&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#(hash-map&nbsp;%&nbsp;(+&nbsp;(or&nbsp;(a&nbsp;%)&nbsp;0)&nbsp;(or&nbsp;(b&nbsp;%)&nbsp;0)))
+<span class="partial" title="20 out of 21 forms covered">
+                079&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#(hash-map&nbsp;%&nbsp;(+&nbsp;(or&nbsp;(a&nbsp;%)&nbsp;0)&nbsp;(or&nbsp;(b&nbsp;%)&nbsp;0)))
                 </span><br/>
-<span class="not-covered" title="0 out of 3 forms covered">
-                072&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keys&nbsp;b))))
+<span class="covered" title="3 out of 3 forms covered">
+                080&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keys&nbsp;b))))
                 </span><br/>
 <span class="blank" title="0 out of 0 forms covered">
-                073&nbsp;&nbsp;
+                081&nbsp;&nbsp;
                 </span><br/>
 <span class="covered" title="1 out of 1 forms covered">
-                074&nbsp;&nbsp;(defn&nbsp;add-known-prices
+                082&nbsp;&nbsp;(defn&nbsp;add-known-prices
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                075&nbsp;&nbsp;&nbsp;&nbsp;&quot;Add&nbsp;the&nbsp;current&nbsp;prices&nbsp;at&nbsp;this&nbsp;`merchant`&#x27;s&nbsp;location&nbsp;in&nbsp;the&nbsp;`world`
+                083&nbsp;&nbsp;&nbsp;&nbsp;&quot;Add&nbsp;the&nbsp;current&nbsp;prices&nbsp;at&nbsp;this&nbsp;`merchant`&#x27;s&nbsp;location&nbsp;in&nbsp;the&nbsp;`world`
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                076&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;a&nbsp;new&nbsp;cacke&nbsp;of&nbsp;known&nbsp;prices,&nbsp;and&nbsp;return&nbsp;it.&quot;
+                084&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;a&nbsp;new&nbsp;cache&nbsp;of&nbsp;known&nbsp;prices,&nbsp;and&nbsp;return&nbsp;it.&quot;
                 </span><br/>
 <span class="not-tracked" title="0 out of 0 forms covered">
-                077&nbsp;&nbsp;&nbsp;&nbsp;[merchant&nbsp;world]
+                085&nbsp;&nbsp;&nbsp;&nbsp;[merchant&nbsp;world]
                 </span><br/>
 <span class="not-covered" title="0 out of 4 forms covered">
-                078&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[m&nbsp;(cond
+                086&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[m&nbsp;(cond
                 </span><br/>
 <span class="not-covered" title="0 out of 3 forms covered">
-                079&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keyword?&nbsp;merchant)
+                087&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keyword?&nbsp;merchant)
                 </span><br/>
 <span class="not-covered" title="0 out of 5 forms covered">
-                080&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:merchants&nbsp;merchant)
+                088&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:merchants&nbsp;merchant)
                 </span><br/>
 <span class="not-covered" title="0 out of 3 forms covered">
-                081&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map?&nbsp;merchant)
+                089&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map?&nbsp;merchant)
                 </span><br/>
 <span class="not-covered" title="0 out of 1 forms covered">
-                082&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merchant)
+                090&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merchant)
+                </span><br/>
+<span class="not-covered" title="0 out of 8 forms covered">
+                091&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;(or&nbsp;(:known-prices&nbsp;m)&nbsp;{})
                 </span><br/>
 <span class="not-covered" title="0 out of 3 forms covered">
-                083&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;(:known-prices&nbsp;m)
+                092&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;(:location&nbsp;m)
                 </span><br/>
-<span class="not-covered" title="0 out of 3 forms covered">
-                084&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;(:location&nbsp;m)
-                </span><br/>
-<span class="not-covered" title="0 out of 3 forms covered">
-                085&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;(:date&nbsp;world)
+<span class="not-covered" title="0 out of 8 forms covered">
+                093&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;(or&nbsp;(:date&nbsp;world)&nbsp;0)
                 </span><br/>
 <span class="not-covered" title="0 out of 7 forms covered">
-                086&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;(-&gt;&nbsp;world&nbsp;:cities&nbsp;l&nbsp;:prices)]
-                </span><br/>
-<span class="not-covered" title="0 out of 2 forms covered">
-                087&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(reduce
-                </span><br/>
-<span class="not-covered" title="0 out of 1 forms covered">
-                088&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merge
-                </span><br/>
-<span class="not-covered" title="0 out of 1 forms covered">
-                089&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k
+                094&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;(-&gt;&nbsp;world&nbsp;:cities&nbsp;l&nbsp;:prices)]
                 </span><br/>
 <span class="not-covered" title="0 out of 3 forms covered">
-                090&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map
+                095&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
+                </span><br/>
+<span class="not-covered" title="0 out of 3 forms covered">
+                096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(nil?&nbsp;m)
+                </span><br/>
+<span class="not-covered" title="0 out of 3 forms covered">
+                097&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(throw&nbsp;(Exception.&nbsp;&quot;No&nbsp;merchant?&quot;))
+                </span><br/>
+<span class="not-covered" title="0 out of 14 forms covered">
+                098&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(or&nbsp;(nil?&nbsp;l)&nbsp;(nil?&nbsp;(-&gt;&nbsp;world&nbsp;:cities&nbsp;l)))
+                </span><br/>
+<span class="not-covered" title="0 out of 6 forms covered">
+                099&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(throw&nbsp;(Exception.&nbsp;(str&nbsp;&quot;No&nbsp;known&nbsp;location&nbsp;for&nbsp;merchant&nbsp;&quot;&nbsp;m)))
+                </span><br/>
+<span class="not-tracked" title="0 out of 0 forms covered">
+                100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:else
+                </span><br/>
+<span class="not-covered" title="0 out of 2 forms covered">
+                101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(reduce
+                </span><br/>
+<span class="not-covered" title="0 out of 1 forms covered">
+                102&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merge
+                </span><br/>
+<span class="not-covered" title="0 out of 1 forms covered">
+                103&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k
+                </span><br/>
+<span class="not-covered" title="0 out of 3 forms covered">
+                104&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(map
                 </span><br/>
 <span class="not-covered" title="0 out of 17 forms covered">
-                091&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#(hash-map&nbsp;%&nbsp;(apply&nbsp;vector&nbsp;cons&nbsp;{:price&nbsp;(p&nbsp;%)&nbsp;:date&nbsp;d}&nbsp;(k&nbsp;%)))
+                105&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#(hash-map&nbsp;%&nbsp;(apply&nbsp;vector&nbsp;cons&nbsp;{:price&nbsp;(p&nbsp;%)&nbsp;:date&nbsp;d}&nbsp;(k&nbsp;%)))
                 </span><br/>
 <span class="not-covered" title="0 out of 5 forms covered">
-                092&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:commodities&nbsp;keys)))))
+                106&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-&gt;&nbsp;world&nbsp;:commodities&nbsp;keys))))))
                 </span><br/>
  </body>
 </html>
diff --git a/docs/index.html b/docs/index.html
index 35656b5..044b871 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -6,8 +6,8 @@
   <body>
     <h1>The Great Game: Dcocumentation</h1>
     <ul>
-      <li><a href="cloverage">Test coverage</a></li>
-      <li><a href="codox">Primary documentaion</a></li>
+      <li><a href="cloverage/index.html">Test coverage</a></li>
+      <li><a href="codox/index.html">Primary documentaion</a></li>
     </ul>
   </body>
 </html>
diff --git a/project.clj b/project.clj
index ff35841..67a2163 100644
--- a/project.clj
+++ b/project.clj
@@ -4,6 +4,7 @@
                      :doc/format :markdown}
           :output-path "docs/codox"
           :source-uri "https://github.com/simon-brooke/the-great-game/blob/master/{filepath}#L{line}"}
+  :cucumber-feature-paths ["test/features/"]
   :dependencies [[org.clojure/clojure "1.8.0"]
                  [environ "1.1.0"]
                  [com.taoensso/timbre "4.10.0"]]
@@ -11,7 +12,9 @@
   :license {:name "GNU General Public License,version 2.0 or (at your option) any later version"
             :url "https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html"}
   :plugins [[lein-cloverage "1.1.1"]
-            [lein-codox "0.10.7"]]
+            [lein-codox "0.10.7"]
+            [lein-cucumber "1.0.2"]
+            [lein-gorilla "0.4.0"]]
 
   :release-tasks [["vcs" "assert-committed"]
                   ["change" "version" "leiningen.release/bump-version" "release"]
diff --git a/src/the_great_game/core.clj b/src/the_great_game/core.clj
deleted file mode 100644
index 7a102ed..0000000
--- a/src/the_great_game/core.clj
+++ /dev/null
@@ -1,6 +0,0 @@
-(ns the-great-game.core)
-
-(defn foo
-  "I don't do a whole lot."
-  [x]
-  (println x "Hello, World!"))
diff --git a/src/the_great_game/merchants/merchant_utils.clj b/src/the_great_game/merchants/merchant_utils.clj
index b8cd969..9cfb5b4 100644
--- a/src/the_great_game/merchants/merchant_utils.clj
+++ b/src/the_great_game/merchants/merchant_utils.clj
@@ -23,7 +23,7 @@
             (-> world :merchants merchant)
             (map? merchant)
             merchant)
-        cargo (:stock m)]
+        cargo (or (:stock m) {})]
     (reduce
       +
       0
@@ -41,9 +41,11 @@
             (-> world :merchants merchant)
             (map? merchant)
             merchant)]
-    (quot
-      (- (:capacity m) (burden m world))
-      (-> world :commodities commodity :weight))))
+    (max
+      0
+      (quot
+        (- (or (:capacity m) 0) (burden m world))
+        (-> world :commodities commodity :weight)))))
 
 (defn can-afford
   "Return the number of units of this `commodity` which this `merchant`
@@ -55,9 +57,15 @@
             (map? merchant)
             merchant)
         l (:location m)]
-    (quot
-      (:cash m)
-      (-> world :cities l :prices commodity))))
+    (cond
+      (nil? m)
+      (throw (Exception. "No merchant?"))
+      (or (nil? l) (nil? (-> world :cities l)))
+      (throw (Exception. (str "No known location for merchant " m)))
+      :else
+      (quot
+        (:cash m)
+        (-> world :cities l :prices commodity)))))
 
 (defn add-stock
   "Where `a` and `b` are both maps all of whose values are numbers, return
@@ -73,20 +81,26 @@
 
 (defn add-known-prices
   "Add the current prices at this `merchant`'s location in the `world`
-  to a new cacke of known prices, and return it."
+  to a new cache of known prices, and return it."
   [merchant world]
   (let [m (cond
             (keyword? merchant)
             (-> world :merchants merchant)
             (map? merchant)
             merchant)
-        k (:known-prices m)
+        k (or (:known-prices m) {})
         l (:location m)
-        d (:date world)
+        d (or (:date world) 0)
         p (-> world :cities l :prices)]
-    (reduce
-      merge
-      k
-      (map
-        #(hash-map % (apply vector cons {:price (p %) :date d} (k %)))
-        (-> world :commodities keys)))))
+    (cond
+      (nil? m)
+      (throw (Exception. "No merchant?"))
+      (or (nil? l) (nil? (-> world :cities l)))
+      (throw (Exception. (str "No known location for merchant " m)))
+      :else
+      (reduce
+        merge
+        k
+        (map
+          #(hash-map % (apply vector cons {:price (p %) :date d} (k %)))
+          (-> world :commodities keys))))))
diff --git a/test/the_great_game/merchants/markets_test.clj b/test/the_great_game/merchants/markets_test.clj
index bc3f515..7cacd30 100644
--- a/test/the_great_game/merchants/markets_test.clj
+++ b/test/the_great_game/merchants/markets_test.clj
@@ -79,8 +79,31 @@
           (-> actual :cities :falkirk :stock :iron)
           17)
         "Stock should be topped up by the difference between the supply and
-        the demand amount."))
+        the demand amount."))))
 
-    )
-
-  )
+(deftest run-test
+  (let [world (deep-merge
+                default-world
+                {:cities
+                 {:aberdeen
+                  {:stock {:fish 5}
+                   :supplies {:fish 12}
+                   :prices {:fish 1.1}}
+                  :falkirk
+                  {:stock {:iron 10}
+                   :demands {:iron 5}
+                   :supplies {:iron 12}
+                   :prices {:iron 1.1}}}})
+        actual (run world)]
+    (is
+      (=
+        (-> actual :cities :aberdeen :stock :fish)
+        (+ (-> world :cities :aberdeen :supplies :fish)
+           (-> world :cities :aberdeen :stock :fish)))
+      "If stock is not empty and price is above cost, stock should be topped up by supply amount.")
+    (is
+      (=
+        (-> actual :cities :falkirk :stock :iron)
+        17)
+      "Stock should be topped up by the difference between the supply and
+      the demand amount.")))
diff --git a/test/the_great_game/merchants/merchant_utils_test.clj b/test/the_great_game/merchants/merchant_utils_test.clj
index 2f9071e..086c691 100644
--- a/test/the_great_game/merchants/merchant_utils_test.clj
+++ b/test/the_great_game/merchants/merchant_utils_test.clj
@@ -22,3 +22,106 @@
             expected 1.7] ;;
         (is (= actual expected) "if information select the most recent")))))
 
+(deftest burden-test
+  (testing "Burden of merchant"
+    (let [world (deep-merge
+                  default-world
+                  {:merchants
+                   {:archie
+                    {:stock
+                     {:iron 1}}
+                    :belinda
+                    {:stock
+                     {:fish 2}}
+                    :callum
+                    {:stock
+                     {:iron 1
+                      :fish 1}}}})]
+      (let [actual (burden :archie world)
+            expected (-> world :commodities :iron :weight)]
+        (is (= actual expected)))
+      (let [actual (burden :belinda world)
+            expected (* 2 (-> world :commodities :fish :weight))]
+        (is (= actual expected)))
+      (let [actual (burden :callum world)
+            expected (+
+                       (-> world :commodities :iron :weight)
+                       (-> world :commodities :fish :weight))]
+        (is (= actual expected)))
+      (let [actual (burden {} world)
+            expected 0]
+        (is (= actual expected)))
+      (let [actual (burden (-> world :merchants :deidre) world)
+            expected 0]
+        (is (= actual expected))))))
+
+(deftest can-carry-test
+  (testing "What merchants can carry"
+    (let [world (deep-merge
+                  default-world
+                  {:merchants
+                   {:archie
+                    {:cash 5
+                     :stock
+                     {:iron 1}}
+                    :belinda
+                    {:stock
+                     {:fish 2}}
+                    :callum
+                    {:stock
+                     {:iron 1
+                      :fish 1}}}})]
+      (let [actual (can-carry :archie world :fish)
+            expected 0]
+        (is (= actual expected)))
+      (let [actual (can-carry :belinda world :fish)
+            expected 8]
+        (is (= actual expected)))
+      (let [actual (can-carry (-> world :merchants :archie) world :fish)
+            expected 0]
+        (is (= actual expected)))
+      (let [actual (can-carry {:stock {:fish 7} :capacity 10} world :fish)
+            expected 3]
+        (is (= actual expected))))))
+
+
+(deftest affordability-test
+  (testing "What merchants can afford to purchase"
+    (let [world (deep-merge
+                  default-world
+                  {:merchants
+                   {:archie
+                    {:cash 5
+                     :stock
+                     {:iron 1}}
+                    :belinda
+                    {:stock
+                     {:fish 2}}
+                    :callum
+                    {:stock
+                     {:iron 1
+                      :fish 1}}}})]
+      (let [actual (can-afford :archie world :fish)
+            expected 5]
+        (is (= actual expected)))
+      (let [actual (can-afford :belinda world :fish)
+            expected 100]
+        (is (= actual expected)))
+      (let [actual (can-afford (-> world :merchants :archie) world :fish)
+            expected 5]
+        (is (= actual expected)))
+      (let [actual (can-afford {:cash 3 :location :buckie} world :fish)
+            expected 3]
+        (is (= actual expected)))
+      (is (thrown-with-msg?
+            Exception
+            #"No merchant?"
+            (can-afford :no-one world :fish)))
+      (is (thrown-with-msg?
+            Exception
+            #"No known location for merchant.*"
+            (can-afford {:cash 3} world :fish))))))
+
+(deftest add-stock-test
+  (let [actual (add-stock {:iron 2 :fish 5} {:fish 3 :whisky 7})
+        expected {:iron 2 :fish 8 :whisky 7}]))