Repository: NextCenturyCorporation/MCS (language: python)

Issue:
MCS-1988 Added Eval 7 novel objects to schema doc.
Run `make html` in the `docs/` folder to see the generated page.


Discussion / hints:

Fix patch:
diff --git a/docs/source/schema.rst b/docs/source/schema.rst
index 6f9d69d9..bcb8c632 100644
--- a/docs/source/schema.rst
+++ b/docs/source/schema.rst
@@ -784,6 +784,15 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.9,y=0.36,z=0.42
       - Right
       - Toy car
+    * - `"car_6"`
+      - car
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.06,y=0.58,z=0.54
+      - Right
+      - Toy old-fashioned car
     * - `"cart_2"`
       - cart
       - 0.5
@@ -856,6 +865,24 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.195,y=0.036,z=0.134
       - Forward
       - Suitcase
+    * - `"case_8"`
+      - case
+      - 5
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.52,y=0.6,z=0.54
+      - Forward
+      - 
+    * - `"case_9"`
+      - case
+      - 5
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.18,y=0.44,z=0.4
+      - Forward
+      - 
     * - `"crate_1"`
       - crate
       - 5
@@ -892,6 +919,24 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.76,y=0.74,z=0.88
       - Forward
       - Cuboid wooden crate
+    * - `"crate_5"`
+      - crate
+      - 5
+      - X
+      - X
+      - :ref:`wood <Wood Materials>`
+      - x=0.82,y=1.44,z=0.82
+      - Forward
+      - Cuboid wooden crate
+    * - `"crate_6"`
+      - crate
+      - 5
+      - X
+      - X
+      - :ref:`wood <Wood Materials>`
+      - x=0.9,y=1.68,z=1.06
+      - Forward
+      - Cuboid wooden crate
     * - `"crayon_black"`
       - crayon
       - 0.125
@@ -1009,6 +1054,15 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.224,y=0.176,z=0.06
       - Right
       - Toy duck on wheels
+    * - `"firetruck"`
+      - firetruck
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.2,y=0.4,z=0.54
+      - Right
+      - Toy firetruck
     * - `"jeep"`
       - jeep
       - 0.5
@@ -1017,7 +1071,7 @@ All of the following object types have the `pickupable` attribute by default.
       - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
       - x=0.06,y=0.057,z=0.098
       - Forward
-      - Toy car
+      - Toy jeep
     * - `"military_case_1"`
       - case
       - 5
@@ -1054,6 +1108,33 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.86,y=0.32,z=0.68
       - Forward
       - 
+    * - `"military_case_5"`
+      - case
+      - 5
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=1.3,y=1.1,z=1.04
+      - Forward
+      - 
+    * - `"military_case_6"`
+      - case
+      - 5
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.7,y=0.76,z=0.72
+      - Forward
+      - 
+    * - `"military_truck"`
+      - truck
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.36,y=0.6,z=0.58
+      - Forward
+      - Toy military truck
     * - `"pacifier"`
       - pacifier
       - 0.5
@@ -1108,6 +1189,24 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.07,y=0.06,z=0.15
       - Forward
       - Toy racecar
+    * - `"racecar_2"`
+      - car
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.3,y=0.5,z=0.58
+      - Forward
+      - Toy racecar
+    * - `"racecar_3"`
+      - car
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.0,y=0.52,z=0.5
+      - Forward
+      - Toy racecar
     * - `"road_scraper"`
       - road_scraper
       - 0.5
@@ -1171,7 +1270,7 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.065,y=0.067,z=0.17
       - Forward
       - Toy tank
-    * - `"tank_2"`
+    * - `"tank_3"`
       - tank
       - 0.5
       - 
@@ -1180,6 +1279,24 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.21,y=0.12,z=0.094
       - Right
       - Toy tank
+    * - `"taxi"`
+      - taxi
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.2,y=0.8,z=0.5
+      - Right
+      - Toy three-wheeled taxi
+    * - `"toddler_ride_on_car"`
+      - car
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.14,y=1.24,z=0.66
+      - Right
+      - Toy toddler ride-on car
     * - `"toolbox_1"`
       - toolbox
       - 5
@@ -1234,6 +1351,24 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.22,y=0.108,z=0.192
       - Forward
       - Toolbox
+    * - `"toolbox_7"`
+      - toolbox
+      - 5
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.21,y=0.14,z=0.154
+      - Forward
+      - Toolbox
+    * - `"toolbox_8"`
+      - toolbox
+      - 5
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.134,y=0.14,z=0.12
+      - Forward
+      - Toolbox
     * - `"train_1"`
       - train
       - 0.5
@@ -1261,6 +1396,33 @@ All of the following object types have the `pickupable` attribute by default.
       - x=0.4,y=0.26,z=0.22
       - Right
       - Toy train
+    * - `"train_4"`
+      - train
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.54,y=0.94,z=0.86
+      - Right
+      - Toy train
+    * - `"train_5"`
+      - train
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.2,y=1.04,z=0.7
+      - Right
+      - Toy train
+    * - `"train_6"`
+      - train
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.8,y=1.16,z=0.74
+      - Right
+      - Toy train
     * - `"trike"`
       - trike
       - 0.5
@@ -1502,6 +1664,42 @@ Furniture Objects
       - :ref:`wood <Wood Materials>`
       - x=2,y=2.2,z=3.2
       - 
+    * - `"bed_13"`
+      - bed
+      - 50
+      - 
+      - X
+      - 
+      - :ref:`wood <Wood Materials>`
+      - x=2,y=2.2,z=3.5
+      - 
+    * - `"bed_14"`
+      - bed
+      - 50
+      - 
+      - X
+      - 
+      - :ref:`wood <Wood Materials>`
+      - x=2,y=2.2,z=3.5
+      - 
+    * - `"bed_15"`
+      - bed
+      - 50
+      - 
+      - X
+      - 
+      - :ref:`wood <Wood Materials>`
+      - x=1.4,y=3,z=2.4
+      - Bunk bed
+    * - `"bed_16"`
+      - bed
+      - 50
+      - 
+      - X
+      - 
+      - :ref:`wood <Wood Materials>`
+      - x=1.4,y=3,z=2.4
+      - Elevated bed with desk underneath
     * - `"bookcase_1_shelf"`
       - bookcase
       - 10
@@ -1574,6 +1772,24 @@ Furniture Objects
       - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
       - x=1,y=2.5,z=0.5
       - 
+    * - `"bookcase_duplex_2_4"`
+      - bookcase
+      - 30
+      - 
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=2,y=2,z=0.5
+      - 2 shelves on left, 4 shelves on right
+    * - `"bookcase_duplex_4_2"`
+      - bookcase
+      - 30
+      - 
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=2,y=2,z=0.5
+      - 4 shelves on left, 2 shelves on right
     * - `"cart_1"`
       - cart
       - 4
@@ -1727,6 +1943,24 @@ Furniture Objects
       - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
       - x=0.5,y=0.92,z=0.5
       - 
+    * - `"chair_17"`
+      - chair
+      - 5
+      - X
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.45,y=0.85,z=0.45
+      - 
+    * - `"chair_18"`
+      - chair
+      - 5
+      - X
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.45,y=1.1,z=0.5
+      - 
     * - `"changing_table"`
       - changing table
       - 100
@@ -1817,6 +2051,33 @@ Furniture Objects
       - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
       - x=0.84,y=0.41,z=0.68
       - Chest with trapezoidal lid
+    * - `"chest_10"`
+      - chest
+      - 15
+      - 
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.37,y=0.39,z=0.38
+      - Chest with curved lid
+    * - `"chest_11"`
+      - chest
+      - 15
+      - 
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.74,y=0.76,z=0.66
+      - Chest with flat lid
+    * - `"circular_container"`
+      - container
+      - 5
+      - 
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.25,y=0.42,z=0.36
+      - 
     * - `"crib"`
       - crib
       - 25
@@ -1862,6 +2123,87 @@ Furniture Objects
       - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
       - x=1,y=2,z=1
       - Square desk with 3 sides on bottom and top
+    * - `"desk_5"`
+      - desk
+      - 30
+      - 
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=2,y=1,z=0.5
+      - Rectangular desk with 2 shelves on the left
+    * - `"desk_6"`
+      - desk
+      - 30
+      - 
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=2,y=1,z=0.5
+      - Rectangular desk with 2 shelves on the right
+    * - `"desk_7"`
+      - desk
+      - 20
+      - 
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.17,y=0.93,z=0.56
+      - Can see through underneath the desk
+    * - `"desk_8"`
+      - desk
+      - 20
+      - 
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.15,y=0.82,z=0.55
+      - Can see through underneath the desk
+    * - `"desk_9"`
+      - desk
+      - 20
+      - 
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.85,y=0.95,z=0.58
+      - Can see through underneath the desk
+    * - `"desk_10"`
+      - desk
+      - 20
+      - 
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.7,y=1,z=0.93
+      - Can see through underneath the desk
+    * - `"folding_chair"`
+      - chair
+      - 5
+      - X
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.48,y=0.86,z=0.56
+      - 
+    * - `"hamper"`
+      - hamper
+      - 5
+      - 
+      - X
+      - X
+      - none
+      - x=0.5,y=0.66,z=0.4
+      - Short laundry hamper with a brown wicker texture
+    * - `"high_chair"`
+      - chair
+      - 5
+      - X
+      - X
+      - 
+      - :ref:`wood <Wood Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.64,y=0.84,z=0.8
+      - 
     * - `"shelf_1"`
       - shelf
       - 10
@@ -1961,6 +2303,15 @@ Furniture Objects
       - :ref:`sofa_9 <Sofa 9 Materials>`
       - x=2.54,y=1.62,z=1.52
       - 
+    * - `"sofa_10"`
+      - sofa
+      - 100
+      - 
+      - X
+      - 
+      - :ref:`sofa_thorkea <Sofa THORKEA Materials>`
+      - x=1.75,y=0.72,z=0.82
+      - 
     * - `"sofa_11"`
       - sofa
       - 100
@@ -2060,6 +2411,15 @@ Furniture Objects
       - :ref:`sofa_9 <Sofa 9 Materials>`
       - x=1.38,y=1.46,z=1.36
       - 
+    * - `"sofa_chair_10"`
+      - sofa chair
+      - 50
+      - 
+      - X
+      - 
+      - :ref:`armchair_thorkea <Armchair THORKEA Materials>`
+      - x=0.96,y=0.89,z=0.76
+      - 
     * - `"table_1"`
       - table
       - 10
@@ -2231,6 +2591,24 @@ Furniture Objects
       - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
       - x=1.431,y=0.652,z=0.695
       - Short oval table
+    * - `"table_23"`
+      - table
+      - 10
+      - X
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.24,y=0.64,z=0.79
+      - Short rectangular table
+    * - `"table_24"`
+      - table
+      - 10
+      - X
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.63,y=0.4,z=0.6
+      - Short rectangular table
     * - `"table_25"`
       - table
       - 5
@@ -2299,85 +2677,201 @@ All the tools have the `tool` shape, `metal` salient material, `moveable` and `r
       - Base Size
       - Details
 
+    * - `"tool_big_0_50_x_33_00"`
+      - 3
+      - x=0.5,y=0.3,z=33
+      - Rectangular (symmetric) tool, too big to be used successfully
+    * - `"tool_big_0_50_x_36_00"`
+      - 3
+      - x=0.5,y=0.3,z=36
+      - Rectangular (symmetric) tool, too big to be used successfully
+    * - `"tool_big_0_50_x_39_00"`
+      - 3
+      - x=0.5,y=0.3,z=39
+      - Rectangular (symmetric) tool, too big to be used successfully
+    * - `"tool_big_0_75_x_33_00"`
+      - 3
+      - x=0.75,y=0.3,z=33
+      - Rectangular (symmetric) tool, too big to be used successfully
+    * - `"tool_big_0_75_x_36_00"`
+      - 3
+      - x=0.75,y=0.3,z=36
+      - Rectangular (symmetric) tool, too big to be used successfully
+    * - `"tool_big_0_75_x_39_00"`
+      - 3
+      - x=0.75,y=0.3,z=39
+      - Rectangular (symmetric) tool, too big to be used successfully
+    * - `"tool_big_1_00_x_33_00"`
+      - 3
+      - x=1.0,y=0.3,z=33
+      - Rectangular (symmetric) tool, too big to be used successfully
+    * - `"tool_big_1_00_x_36_00"`
+      - 3
+      - x=1.0,y=0.3,z=36
+      - Rectangular (symmetric) tool, too big to be used successfully
+    * - `"tool_big_1_00_x_39_00"`
+      - 3
+      - x=1.0,y=0.3,z=39
+      - Rectangular (symmetric) tool, too big to be used successfully
+
     * - `"tool_hooked_0_50_x_4_00"`
       - 3
-      - x=0.5,y=0.3,z=4
-      - Hooked (asymmetric) tool
+      - x=1.5,y=0.3,z=4
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_50_x_5_00"`
       - 3.25
-      - x=0.5,y=0.3,z=5
-      - Hooked (asymmetric) tool
+      - x=1.5,y=0.3,z=5
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_50_x_6_00"`
       - 3.5
-      - x=0.5,y=0.3,z=6
-      - Hooked (asymmetric) tool
+      - x=1.5,y=0.3,z=6
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_50_x_7_00"`
       - 3.75
-      - x=0.5,y=0.3,z=7
-      - Hooked (asymmetric) tool
+      - x=1.5,y=0.3,z=7
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_50_x_8_00"`
       - 4
-      - x=0.5,y=0.3,z=8
-      - Hooked (asymmetric) tool
+      - x=1.5,y=0.3,z=8
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_50_x_9_00"`
       - 4.25
-      - x=0.5,y=0.3,z=9
-      - Hooked (asymmetric) tool
+      - x=1.5,y=0.3,z=9
+      - L-shaped (asymmetric) tool with two unequal sides
 
     * - `"tool_hooked_0_75_x_4_00"`
       - 3.33
-      - x=0.75,y=0.3,z=4
-      - Hooked (asymmetric) tool
+      - x=2.25,y=0.3,z=4
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_75_x_5_00"`
       - 3.66
-      - x=0.75,y=0.3,z=5
-      - Hooked (asymmetric) tool
+      - x=2.25,y=0.3,z=5
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_75_x_6_00"`
       - 4
-      - x=0.75,y=0.3,z=6
-      - Hooked (asymmetric) tool
+      - x=2.25,y=0.3,z=6
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_75_x_7_00"`
       - 4.33
-      - x=0.75,y=0.3,z=7
-      - Hooked (asymmetric) tool
+      - x=2.25,y=0.3,z=7
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_75_x_8_00"`
       - 4.66
-      - x=0.75,y=0.3,z=8
-      - Hooked (asymmetric) tool
+      - x=2.25,y=0.3,z=8
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_0_75_x_9_00"`
       - 5
-      - x=0.75,y=0.3,z=9
-      - Hooked (asymmetric) tool
+      - x=2.25,y=0.3,z=9
+      - L-shaped (asymmetric) tool with two unequal sides
 
     * - `"tool_hooked_1_00_x_4_00"`
       - 4
-      - x=1,y=0.3,z=4
-      - Hooked (asymmetric) tool
+      - x=3,y=0.3,z=4
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_1_00_x_5_00"`
       - 4.5
-      - x=1,y=0.3,z=5
-      - Hooked (asymmetric) tool
+      - x=3,y=0.3,z=5
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_1_00_x_6_00"`
       - 5
-      - x=1,y=0.3,z=6
-      - Hooked (asymmetric) tool
+      - x=3,y=0.3,z=6
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_1_00_x_7_00"`
       - 5.5
-      - x=1,y=0.3,z=7
-      - Hooked (asymmetric) tool
+      - x=3,y=0.3,z=7
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_1_00_x_8_00"`
       - 6
-      - x=1,y=0.3,z=8
-      - Hooked (asymmetric) tool
+      - x=3,y=0.3,z=8
+      - L-shaped (asymmetric) tool with two unequal sides
     * - `"tool_hooked_1_00_x_9_00"`
       - 6.5
-      - x=1,y=0.3,z=9
-      - Hooked (asymmetric) tool
+      - x=3,y=0.3,z=9
+      - L-shaped (asymmetric) tool with two unequal sides
+
+    * - `"tool_isosceles_0_50_x_4_00"`
+      - 3
+      - x=4,y=0.3,z=4
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_50_x_5_00"`
+      - 3.25
+      - x=5,y=0.3,z=5
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_50_x_6_00"`
+      - 3.5
+      - x=6,y=0.3,z=6
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_50_x_7_00"`
+      - 3.75
+      - x=7,y=0.3,z=7
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_50_x_8_00"`
+      - 4
+      - x=8,y=0.3,z=8
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_50_x_9_00"`
+      - 4.25
+      - x=9,y=0.3,z=9
+      - L-shaped (asymmetric) tool with two equal sides
+
+    * - `"tool_isosceles_0_75_x_4_00"`
+      - 3.33
+      - x=4,y=0.3,z=4
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_75_x_5_00"`
+      - 3.66
+      - x=5,y=0.3,z=5
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_75_x_6_00"`
+      - 4
+      - x=6,y=0.3,z=6
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_75_x_7_00"`
+      - 4.33
+      - x=7,y=0.3,z=7
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_75_x_8_00"`
+      - 4.66
+      - x=8,y=0.3,z=8
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_0_75_x_9_00"`
+      - 5
+      - x=9,y=0.3,z=9
+      - L-shaped (asymmetric) tool with two equal sides
+
+    * - `"tool_isosceles_1_00_x_4_00"`
+      - 4
+      - x=4,y=0.3,z=4
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_1_00_x_5_00"`
+      - 4.5
+      - x=5,y=0.3,z=5
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_1_00_x_6_00"`
+      - 5
+      - x=6,y=0.3,z=6
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_1_00_x_7_00"`
+      - 5.5
+      - x=7,y=0.3,z=7
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_1_00_x_8_00"`
+      - 6
+      - x=8,y=0.3,z=8
+      - L-shaped (asymmetric) tool with two equal sides
+    * - `"tool_isosceles_1_00_x_9_00"`
+      - 6.5
+      - x=9,y=0.3,z=9
+      - L-shaped (asymmetric) tool with two equal sides
 
     * - `"tool_rect_0_50_x_1_00"`
       - 5
       - x=0.5,y=0.3,z=1
-      - Rectangular (symmetric) tool, too small
+      - Rectangular (symmetric) tool, too small to be used successfully
+    * - `"tool_rect_0_50_x_3_00"`
+      - 3
+      - x=0.5,y=0.3,z=3
+      - Rectangular (symmetric) tool, used in the secondary tool task
     * - `"tool_rect_0_50_x_4_00"`
       - 3
       - x=0.5,y=0.3,z=4
@@ -2406,36 +2900,40 @@ All the tools have the `tool` shape, `metal` salient material, `moveable` and `r
     * - `"tool_rect_0_63_x_1_00"`
       - 5
       - x=0.63,y=0.3,z=1
-      - Rectangular (symmetric) tool, too small
+      - Rectangular (symmetric) tool, too small to be used successfully
     * - `"tool_rect_0_63_x_4_00"`
       - 3
       - x=0.63,y=0.3,z=4
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_63_x_5_00"`
       - 3.25
       - x=0.63,y=0.3,z=5
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_63_x_6_00"`
       - 3.5
       - x=0.63,y=0.3,z=6
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_63_x_7_00"`
       - 3.75
       - x=0.63,y=0.3,z=7
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_63_x_8_00"`
       - 4
       - x=0.63,y=0.3,z=8
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_63_x_9_00"`
       - 4.25
       - x=0.63,y=0.3,z=9
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
 
     * - `"tool_rect_0_75_x_1_00"`
       - 5
       - x=0.75,y=0.3,z=1
-      - Rectangular (symmetric) tool, too small
+      - Rectangular (symmetric) tool, too small to be used successfully
+    * - `"tool_rect_0_75_x_3_00"`
+      - 3.33
+      - x=0.75,y=0.3,z=3
+      - Rectangular (symmetric) tool, used in the secondary tool task
     * - `"tool_rect_0_75_x_4_00"`
       - 3.33
       - x=0.75,y=0.3,z=4
@@ -2464,36 +2962,40 @@ All the tools have the `tool` shape, `metal` salient material, `moveable` and `r
     * - `"tool_rect_0_88_x_1_00"`
       - 5
       - x=0.88,y=0.3,z=1
-      - Rectangular (symmetric) tool, too small
+      - Rectangular (symmetric) tool, too small to be used successfully
     * - `"tool_rect_0_88_x_4_00"`
       - 3.33
       - x=0.88,y=0.3,z=4
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_88_x_5_00"`
       - 3.66
       - x=0.88,y=0.3,z=5
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_88_x_6_00"`
       - 4
       - x=0.88,y=0.3,z=6
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_88_x_7_00"`
       - 4.33
       - x=0.88,y=0.3,z=7
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_88_x_8_00"`
       - 4.66
       - x=0.88,y=0.3,z=8
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_0_88_x_9_00"`
       - 5
       - x=0.88,y=0.3,z=9
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
 
     * - `"tool_rect_1_00_x_1_00"`
       - 5
       - x=1,y=0.3,z=1
-      - Rectangular (symmetric) tool, too small
+      - Rectangular (symmetric) tool, too small to be used successfully
+    * - `"tool_rect_1_00_x_3_00"`
+      - 4
+      - x=1,y=0.3,z=4
+      - Rectangular (symmetric) tool, used in the secondary tool task
     * - `"tool_rect_1_00_x_4_00"`
       - 4
       - x=1,y=0.3,z=4
@@ -2522,31 +3024,31 @@ All the tools have the `tool` shape, `metal` salient material, `moveable` and `r
     * - `"tool_rect_1_13_x_1_00"`
       - 5
       - x=1.13,y=0.3,z=1
-      - Rectangular (symmetric) tool, too small
+      - Rectangular (symmetric) tool, too small to be used successfully
     * - `"tool_rect_1_13_x_4_00"`
       - 4
       - x=1.13,y=0.3,z=4
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_1_13_x_5_00"`
       - 4.5
       - x=1.13,y=0.3,z=5
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_1_13_x_6_00"`
       - 5
       - x=1.13,y=0.3,z=6
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_1_13_x_7_00"`
       - 5.5
       - x=1.13,y=0.3,z=7
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_1_13_x_8_00"`
       - 6
       - x=1.13,y=0.3,z=8
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
     * - `"tool_rect_1_13_x_9_00"`
       - 6.5
       - x=1.13,y=0.3,z=9
-      - Rectangular (symmetric) tool
+      - Rectangular (symmetric) tool, used in Eval 6 as a novel width
 
 Agents
 ******
@@ -2577,6 +3079,12 @@ These agents are used in scenes for the interactive tasks.
     * - `"agent_female_06"`
       - 70
       - x=0.5,y=1.6,z=0.5
+    * - `"agent_female_07"`
+      - 70
+      - x=0.5,y=1.6,z=0.5
+    * - `"agent_female_08"`
+      - 70
+      - x=0.5,y=1.6,z=0.5
     * - `"agent_male_01"`
       - 80
       - x=0.5,y=1.6,z=0.5
@@ -2589,6 +3097,12 @@ These agents are used in scenes for the interactive tasks.
     * - `"agent_male_04"`
       - 80
       - x=0.5,y=1.6,z=0.5
+    * - `"agent_male_05"`
+      - 80
+      - x=0.5,y=1.6,z=0.5
+    * - `"agent_male_06"`
+      - 80
+      - x=0.5,y=1.6,z=0.5
     * - `"agent_male_07"`
       - 80
       - x=0.5,y=1.6,z=0.5
@@ -2596,6 +3110,84 @@ These agents are used in scenes for the interactive tasks.
       - 80
       - x=0.5,y=1.6,z=0.5
 
+Blobs
+*****
+
+These blobs are used in scenes for the passive agent tasks, as well as some scenes for the interactive tasks. Each blob type also has a variant type with a nose-like protrusion ending in `_nose` (for example, `blob_01` and `blob_01_nose`).
+
+.. list-table::
+    :header-rows: 1
+
+    * - Object Type
+      - Base Size
+      - Standing Y Position
+    * - `"blob_01"`
+      - x=0.26,y=0.8,z=0.36
+      - 0.4
+    * - `"blob_02"`
+      - x=0.33,y=0.78,z=0.33
+      - 0.39
+    * - `"blob_03"`
+      - x=0.25,y=0.69,z=0.25
+      - 0.345
+    * - `"blob_04"`
+      - x=0.3,y=0.53,z=0.3
+      - 0.225
+    * - `"blob_05"`
+      - x=0.38,y=0.56,z=0.38
+      - 0.24
+    * - `"blob_06"`
+      - x=0.52,y=0.5,z=0.54
+      - 0.25
+    * - `"blob_07"`
+      - x=0.25,y=0.55,z=0.25
+      - 0.245
+    * - `"blob_08"`
+      - x=0.27,y=0.62,z=0.15
+      - 0.31
+    * - `"blob_09"`
+      - x=0.33,y=0.78,z=0.44
+      - 0.39
+    * - `"blob_10"`
+      - x=0.24,y=0.5,z=0.2
+      - 0.25
+    * - `"blob_11"`
+      - x=0.35,y=0.58,z=0.35
+      - 0.29
+    * - `"blob_12"`
+      - x=0.3,y=0.48,z=0.3
+      - 0.24
+    * - `"blob_13"`
+      - x=0.32,y=0.71,z=0.3
+      - 0.37
+    * - `"blob_14"`
+      - x=0.52,y=0.55,z=0.3
+      - 0.42
+    * - `"blob_15"`
+      - x=0.32,y=0.41,z=0.58
+      - 0.17
+    * - `"blob_16"`
+      - x=0.46,y=0.52,z=0.54
+      - 0.27
+    * - `"blob_17"`
+      - x=0.32,y=0.78,z=0.41
+      - 0.385
+    * - `"blob_18"`
+      - x=0.32,y=0.79,z=0.39
+      - 0.37
+    * - `"blob_19"`
+      - x=0.39,y=0.8,z=0.39
+      - 0.45
+    * - `"blob_20"`
+      - x=0.21,y=0.61,z=0.27
+      - 0.26
+    * - `"blob_21"`
+      - x=0.21,y=0.72,z=0.36
+      - 0.265
+    * - `"blob_22"`
+      - x=0.19,y=0.73,z=0.37
+      - 0.265
+
 Primitive Objects
 *****************
 
@@ -2680,6 +3272,18 @@ The following objects have a default mass of 1 and no material restrictions. You
     * - `"rollable_8"`
       - (x=1,y=1,z=1)
       - 0
+    * - `"rollable_9"`
+      - (x=1,y=1,z=1)
+      - 0
+    * - `"rollable_10"`
+      - (x=1,y=1,z=1)
+      - 0
+    * - `"rollable_11"`
+      - (x=1,y=1,z=1)
+      - 0
+    * - `"rollable_12"`
+      - (x=1,y=1,z=1)
+      - 0
     * - `"tie_fighter"`
       - (x=1,y=1,z=1)
       - 0
@@ -3073,10 +3677,14 @@ Specific textures for `sofa_4`, `sofa_5`, `sofa_6`, AND `sofa_7` only.
 Tool Materials
 **************
 
-- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_13"` (grey)
+- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_11"` (black)
+- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_13"` (grey, default)
 - `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_15"` (brown)
+- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_23"` (grey)
 - `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_34"` (pink)
 - `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_36"` (green)
+- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_40"` (blue)
+- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_42"` (brown)
 
 Wall Materials
 **************
@@ -3215,8 +3823,8 @@ Chest Options
 .. list-table::
     :header-rows: 1
 
-    * - Chest Option (Female 5-6)
-      - Chest Option (Male 7-8)
+    * - Chest Option (Female 5-8)
+      - Chest Option (Male 5-8)
       - Description
     * - 0
       -
@@ -3327,8 +3935,8 @@ Feet Options
 .. list-table::
     :header-rows: 1
 
-    * - Feet Option (Female 5-6)
-      - Feet Option (Male 7-8)
+    * - Feet Option (Female 5-8)
+      - Feet Option (Male 5-8)
       - Description
     * - 0
       - 0
@@ -3402,8 +4010,8 @@ Hair Material Options
     :header-rows: 1
 
     * - Hair Options
-      - Hair Material Options (Female 5-6)
-      - Hair Material Options (Male 7-8)
+      - Hair Material Options (Female 5-8)
+      - Hair Material Options (Male 5-8)
     * - 0
       - 0 (yellow), 1 (brown), 2 (black), or 3 (red)
       - 0 (yellow), 1 (brown), 2 (black), or 3 (yellow highlights)
@@ -3476,8 +4084,8 @@ Legs Options
 .. list-table::
     :header-rows: 1
 
-    * - Legs Option (Female 5-6)
-      - Legs Option (Male 7-8)
+    * - Legs Option (Female 5-8)
+      - Legs Option (Male 5-8)
       - Description
     * - 0
       - 1
diff --git a/webenabled/README.md b/webenabled/README.md
index e597f1ff..3e7bbceb 100644
--- a/webenabled/README.md
+++ b/webenabled/README.md
@@ -4,13 +4,10 @@
 
 First, "git clone" this repository. Then run the following commands from this folder to setup your python environment:
 
-_(TODO: Remove the 4th line once 0.7.0 is released)_
-
 ```
 python3 -m venv --prompt webenabled venv
 source venv/bin/activate
 python -m pip install --upgrade pip setuptools wheel
-python -m pip install -e ../
 python -m pip install -r requirements.txt
 ```
 
@@ -29,9 +26,9 @@ scene files will appear on the web page
 
 First, run `cache_addressables` to cache all addressable assets and prevent possible timeout issues. You should do this each time you reboot your machine.
 
-For development, run `python mcsweb.py` to start the flask server with host `0.0.0.0` (so the page will be accessable from any machine on the network) and port `8080`.
+Then, run `python mcsweb.py` to start the flask server with host `0.0.0.0` (so the page will be accessable from any machine on the network) and port `8080`.
 
-For production, use a WSGI server (not sure what to put here....)
+Alternatively, run `python mcsweb.py` to see all of the available options. The `--debug` flag is very helpful for development.
 
 ## Use 
 
diff --git a/webenabled/mcs_interface.py b/webenabled/mcs_interface.py
index 42f924ef..b6336fd5 100644
--- a/webenabled/mcs_interface.py
+++ b/webenabled/mcs_interface.py
@@ -1,6 +1,7 @@
 import datetime
 import glob
 import json
+import logging
 import os
 import sys
 import time
@@ -35,9 +36,9 @@
 def convert_key_to_action(key: str, logger):
     for action in mcs.Action:
         if key.lower() == action.key:
-            logger.info(f"Converting '{key}' into {action.value}")
+            logger.debug(f"Converting '{key}' into {action.value}")
             return action.value
-    logger.info(f"Unable to convert '{key}'. Returning Pass...")
+    logger.debug(f"Unable to convert '{key}'. Returning Pass...")
     return "Pass"
 
 
@@ -52,7 +53,7 @@ class MCSInterface:
 
     def __init__(self, user: str):
         self.logger = current_app.logger
-        self.logger.info(f'MCS interface directory: {TMP_DIR_FULL_PATH}')
+        self.logger.debug(f'MCS interface directory: {TMP_DIR_FULL_PATH}')
         self.step_number = 0
         self.scene_id = None
         self.scene_filename = None
@@ -91,7 +92,11 @@ def get_latest_step_output(self):
     def start_mcs(self):
         # Start the unity controller.  (the function is in a different
         # file so we can pickle / store MCSInterface in the session)
-        self.pid = start_subprocess(self.command_out_dir, self.step_output_dir)
+        self.pid = start_subprocess(
+            self.command_out_dir,
+            self.step_output_dir,
+            self.logger.isEnabledFor(logging.DEBUG)
+        )
 
         # Read in the image
         images, _ = self.get_images_and_step_output(startup=True)
@@ -218,7 +223,7 @@ def get_images_and_step_output(self, startup=False, init_scene=False):
             timenow = time.time()
             elapsed = (timenow - timestart)
             if (startup and elapsed > UNITY_STARTUP_WAIT_TIMEOUT):
-                self.logger.info(
+                self.logger.debug(
                     "Display blank image on default when starting up.")
                 self.img_name = self.blank_path
                 return [self.img_name], self.step_output
@@ -230,7 +235,7 @@ def get_images_and_step_output(self, startup=False, init_scene=False):
                 if (quick_error_check):
                     log_message = "Error returned from MCS controller."
 
-                self.logger.info(log_message)
+                self.logger.warn(log_message)
 
                 list_of_error_files = glob.glob(
                     self.step_output_dir + "/error_*.json")
@@ -363,18 +368,18 @@ def get_goal_info(self, scene_filename):
 
     def get_task_desc(self, scene_filename):
         """Get task description based on filename from mcs_task_desc.py"""
-        self.logger.info(
+        self.logger.debug(
             f"Attempt to get task description based"
             f"on scene_filename: {scene_filename}")
         scene_type = scene_filename.split('/')[-1].split('0')[0][:-1].upper()
 
         for description in TaskDescription:
             if (description.name == scene_type):
-                self.logger.info(
+                self.logger.debug(
                     f"Scene type identified: {description.name}")
                 return description.value
 
-        self.logger.info("Scene type not found, returning 'N/A'")
+        self.logger.warn("Scene type not found, returning 'N/A'")
         return "N/A"
 
     def get_controller_pid(self):
diff --git a/webenabled/mcsweb.py b/webenabled/mcsweb.py
index 34657e0e..b5f23cfe 100644
--- a/webenabled/mcsweb.py
+++ b/webenabled/mcsweb.py
@@ -1,9 +1,11 @@
+import argparse
 import logging
 import random
 import string
 
 import psutil
 import typeguard
+import waitress
 
 
 # Override the typechecked decorator used in machine_common_sense to do nothing
@@ -74,22 +76,22 @@ def get_mcs_interface(request, label, on_exit=False):
 
     # If old user, get stored mcs interface
     if uniq_id_str is not None:
-        app.logger.info(f"{label}: existing user: {uniq_id_str}")
+        app.logger.debug(f"{label}: existing user: {uniq_id_str}")
         mcs_interface = session.get(uniq_id_str)
         if mcs_interface is not None:
             controller_alive = mcs_interface.is_controller_alive()
             if controller_alive:
                 return mcs_interface, uniq_id_str
-            app.logger.info("MCS controller is unavailable")
+            app.logger.debug("MCS controller is unavailable")
         else:
-            app.logger.info("MCS interface is unavailable")
+            app.logger.debug("MCS interface is unavailable")
 
     # skip for exit_unity route, since in that case, we don't
     # need to start a new interface/controller if one isn't found
     if (on_exit is False):
         letters = string.ascii_lowercase
         uniq_id_str = ''.join(random.choice(letters) for i in range(10))
-        app.logger.info(f"{label}: new user: {uniq_id_str}")
+        app.logger.debug(f"{label}: new user: {uniq_id_str}")
 
         # Don't recognize, create new mcs interface
         mcs_interface = MCSInterface(uniq_id_str)
@@ -101,8 +103,8 @@ def get_mcs_interface(request, label, on_exit=False):
 
 @app.route('/mcs')
 def show_mcs_page():
-    app.logger.info("=" * 30)
-    app.logger.info(
+    app.logger.debug("=" * 30)
+    app.logger.debug(
         "Initialize page before checking for "
         "controller and existing user session...")
     rendered_template = render_template(
@@ -116,7 +118,7 @@ def show_mcs_page():
 
 @app.route('/load_controller', methods=["POST"])
 def handle_load_controller():
-    app.logger.info("=" * 30)
+    app.logger.debug("=" * 30)
     mcs_interface, uniq_id_str = get_mcs_interface(request, "Load page")
     if mcs_interface is None:
         app.logger.warn("Cannot load MCS interface")
@@ -135,7 +137,7 @@ def handle_load_controller():
 
 @app.route("/keypress", methods=["POST"])
 def handle_keypress():
-    app.logger.info("=" * 30)
+    app.logger.debug("=" * 30)
     mcs_interface, _ = get_mcs_interface(request, "Key press")
     if mcs_interface is None:
         app.logger.warn("Cannot load MCS interface")
@@ -151,12 +153,12 @@ def handle_keypress():
     img = images[0]
     step_number = mcs_interface.step_number
     if key:
-        app.logger.info(
+        app.logger.debug(
             f"Key press: '{key}', action string: {action_string}, "
             f"step: {step_number}, img: {img}, output: {step_output}"
         )
     else:
-        app.logger.info(
+        app.logger.debug(
             f"Action: '{action}', "
             f"step: {step_number}, img: {img}, output: {step_output}"
         )
@@ -172,7 +174,7 @@ def handle_keypress():
 
 @app.route("/exit_unity", methods=["POST"])
 def exit_unity():
-    app.logger.info("=" * 30)
+    app.logger.debug("=" * 30)
     mcs_interface, unique_id = get_mcs_interface(
         request, "Exit Unity", on_exit=True)
     if mcs_interface is None:
@@ -188,26 +190,26 @@ def exit_unity():
 
     controller_pid = mcs_interface.get_controller_pid()
 
-    app.logger.info(
+    app.logger.debug(
         "Attempting to clean up processes after browser has been closed.")
 
     for p in psutil.process_iter(['pid']):
         if p.info['pid'] == controller_pid:
             children = p.children(recursive=True)
             for c_process in children:
-                app.logger.info(
+                app.logger.debug(
                     f"Found child process of controller: {c_process}, "
                     f"will attempt to end.")
                 c_process.kill()
 
-            app.logger.info(
+            app.logger.debug(
                 f"Found controller process: {p}, will attempt to end.")
             p.kill()
 
     if (unique_id is None):
         unique_id = request.cookies.get("uniq_id")
 
-    app.logger.info(
+    app.logger.debug(
         f"Clear user session for: {unique_id}")
     del session[unique_id]
 
@@ -222,7 +224,7 @@ def exit_unity():
 
 @app.route("/scene_selection", methods=["POST"])
 def handle_scene_selection():
-    app.logger.info("=" * 30)
+    app.logger.debug("=" * 30)
     mcs_interface, _ = get_mcs_interface(request, "Start scene")
     if mcs_interface is None:
         app.logger.warn("Cannot load MCS interface")
@@ -233,7 +235,7 @@ def handle_scene_selection():
     load_output = mcs_interface.load_scene("scenes/" + scene_filename)
     images, step_output, action_list, goal_info, task_desc = load_output
     img = convert_image_path(images[0])
-    app.logger.info(f"Start scene: {scene_filename}, output: {img}")
+    app.logger.debug(f"Start scene: {scene_filename}, output: {img}")
     resp = jsonify(
         last_action="Initialize",
         action_list=action_list,
@@ -249,4 +251,44 @@ def handle_scene_selection():
 
 
 if __name__ == "__main__":
-    app.run(host='0.0.0.0', port=8080, debug=True)
+    parser = argparse.ArgumentParser(description=(
+        'Machine Common Sense Web Interface'
+    ))
+    parser.add_argument(
+        '--host',
+        type=str,
+        default='0.0.0.0',
+        help='Host'
+    )
+    parser.add_argument(
+        '--port',
+        type=int,
+        default=8080,
+        help='Port'
+    )
+    parser.add_argument(
+        '--dev',
+        default=False,
+        action='store_true',
+        help='Development server'
+    )
+    parser.add_argument(
+        '--debug',
+        default=False,
+        action='store_true',
+        help='Debug logging'
+    )
+    args = parser.parse_args()
+    app.logger.info(
+        f'Starting MCS web interface: host={args.host} port={args.port} '
+        f'dev={args.dev} debug={args.debug}'
+    )
+
+    if args.dev:
+        app.run(host=args.host, port=args.port, debug=True)
+    else:
+        waitress.serve(app, host=args.host, port=args.port)
+        waitress_logger = logging.getLogger('waitress')
+        waitress_logger.setLevel(logging.DEBUG if args.debug else logging.INFO)
+
+    app.logger.setLevel(logging.DEBUG if args.debug else logging.INFO)
diff --git a/webenabled/requirements.txt b/webenabled/requirements.txt
index e275b75c..f2205efd 100644
--- a/webenabled/requirements.txt
+++ b/webenabled/requirements.txt
@@ -8,3 +8,4 @@ isort==5.11.5; python_version<"3.8"
 isort==5.12.0; python_version>="3.8"
 psutil==5.9.5
 pytest==7.3.0
+waitress==2.1.2
diff --git a/webenabled/run_scene_with_dir.py b/webenabled/run_scene_with_dir.py
index e2b2b1a1..abe9eba5 100644
--- a/webenabled/run_scene_with_dir.py
+++ b/webenabled/run_scene_with_dir.py
@@ -40,7 +40,7 @@ def __init__(self, command_in_dir, output_dir):
         self.step_number = 0
 
     def run_loop(self):
-        logger.info(
+        logger.debug(
             f"Starting controller: watching command directory "
             f"{self.command_in_dir[(self.command_in_dir.rfind('/') + 1):]}"
             f", writing to output directory "
@@ -109,7 +109,7 @@ def load_command_file(self, command_text_file):
                 self.step_and_save(command)
 
     def load_scene(self):
-        logger.info(f"Loading file {self.scene_file}")
+        logger.debug(f"Loading file {self.scene_file}")
 
         if not exists(self.scene_file):
             logger.warn(f"Missing file {self.scene_file}")
@@ -125,7 +125,7 @@ def load_scene(self):
             logger.exception(f"Error loading file {self.scene_file}")
 
     def step_and_save(self, command):
-        logger.info(f"Executing command {command}")
+        logger.debug(f"Executing command {command}")
         try:
             output: StepMetadata = self.controller.step(command)
             if output is not None:
@@ -169,7 +169,7 @@ def log_error(self, error):
                 f"Error saving error output to file {error_output_file}")
 
     def save_output_info(self, output: StepMetadata):
-        logger.info(f"Saving output info at step {output.step_number}")
+        logger.debug(f"Saving output info at step {output.step_number}")
 
         output_to_save_dict = {
             'step_number': output.step_number,
@@ -188,7 +188,7 @@ def save_output_info(self, output: StepMetadata):
                 f'{self.output_dir}/step_output_{scene_id}_step_'
                 f'{output.step_number}.json'
             )
-            logger.info(
+            logger.debug(
                 f"Saved json file on step {output.step_number} to "
                 f"{output_path}"
             )
@@ -200,7 +200,7 @@ def save_output_info(self, output: StepMetadata):
                 f"Error saving output info on step {output.step_number}")
 
     def save_output_image(self, output: StepMetadata):
-        logger.info(f"Saving output image at step {output.step_number}")
+        logger.debug(f"Saving output image at step {output.step_number}")
         scene_id = self.scene_file[
             (self.scene_file.rfind('/') + 1):(self.scene_file.rfind('.'))
         ]
@@ -211,7 +211,7 @@ def save_output_image(self, output: StepMetadata):
                     f'{self.output_dir}/rgb_{scene_id}_step_'
                     f'{output.step_number}.png'
                 )
-                logger.info(
+                logger.debug(
                     f"Saved RGB image on step {output.step_number} to "
                     f"{img_path}"
                 )
@@ -236,13 +236,13 @@ def convert_file_path(self, path: str) -> str:
     # ----------------------------------
     def on_created(self, event):
         path = self.convert_file_path(event.src_path)
-        logger.info(f"File creation: {path}")
+        logger.debug(f"File creation: {path}")
         self.load_command_file(path)
         os.unlink(event.src_path)
 
     def on_modified(self, event):
         path = self.convert_file_path(event.src_path)
-        logger.info(f"File modified: {path}")
+        logger.debug(f"File modified: {path}")
         self.load_command_file(path)
         os.unlink(event.src_path)
 
@@ -264,6 +264,11 @@ def parse_args():
     parser.add_argument(
         '--mcs_output_dir',
         help='MCS directory that images will appear in')
+    parser.add_argument(
+        '--debug',
+        default=False,
+        action='store_true',
+        help='Debug logging')
     return parser.parse_args()
 
 
@@ -272,6 +277,7 @@ def parse_args():
     # scene_file = args.mcs_scene_json_file
     command_in_dir = args.mcs_command_in_dir
     output_dir = args.mcs_output_dir
+    logger.setLevel(logging.DEBUG if args.debug else logging.INFO)
 
     run_scene = RunSceneWithDir(command_in_dir, output_dir)
     run_scene.run_loop()
diff --git a/webenabled/subprocess_runner.py b/webenabled/subprocess_runner.py
index 532624bf..85d30d3b 100644
--- a/webenabled/subprocess_runner.py
+++ b/webenabled/subprocess_runner.py
@@ -11,14 +11,15 @@
 from flask import current_app
 
 
-def start_subprocess(command_dir, output_dir):
+def start_subprocess(command_dir, output_dir, debug):
     logger = current_app.logger
-    proc = subprocess.Popen(
-        ["python3", "run_scene_with_dir.py",
-         "--mcs_command_in_dir", command_dir,
-         "--mcs_output_dir", output_dir])
+    proc = subprocess.Popen([
+        "python3", "run_scene_with_dir.py",
+        "--mcs_command_in_dir", command_dir,
+        "--mcs_output_dir", output_dir
+    ] + (["--debug"] if debug else []))
     pid_str = str(proc.pid)
-    logger.info(
+    logger.debug(
         f"Running script to start the MCS Controller with command directory "
         f"{command_dir[(command_dir.rfind('/') + 1):]}"
         f" and output directory "


Test patch:
diff --git a/integration_tests/data/107.lava.oracle.outputs.json b/integration_tests/data/107.lava.oracle.outputs.json
index 48215f96..18487ae9 100644
--- a/integration_tests/data/107.lava.oracle.outputs.json
+++ b/integration_tests/data/107.lava.oracle.outputs.json
@@ -166,7 +166,7 @@
         ],
         "objects_count": 0,
         "position_x": 0.0,
-        "position_z": 0.5,
+        "position_z": 0.51,
         "return_status": "SUCCESSFUL",
         "reward": -100.005,
         "rotation_y": 0.0,
diff --git a/integration_tests/data/119.lava_end_scene.oracle.outputs.json b/integration_tests/data/119.lava_end_scene.oracle.outputs.json
index e7ea873f..14d1a8fe 100644
--- a/integration_tests/data/119.lava_end_scene.oracle.outputs.json
+++ b/integration_tests/data/119.lava_end_scene.oracle.outputs.json
@@ -76,7 +76,7 @@
         "lava": [[-0.5, 0.5, 0.5, 1.5], [0.5, -0.5, 1.5, 0.5]],
         "objects_count": 0,
         "position_x": 0.0,
-        "position_z": 0.5,
+        "position_z": 0.51,
         "return_status": "SUCCESSFUL",
         "reward": -100.005,
         "rotation_y": 0.0,