about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-03 18:40:44 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-03 18:40:44 -0700
commita11d9c4a3375906bf8ae1117c6043776d2f08d17 (patch)
tree8667dc63b54aaf0853038f1e880e3ed314139fde
parent249a5672e41f603c8d705f69f2939a25a45685ff (diff)
downloadmu-a11d9c4a3375906bf8ae1117c6043776d2f08d17.tar.gz
1247
-rw-r--r--cpp/.traces/array-from-args32
-rw-r--r--cpp/.traces/array_length2
-rw-r--r--cpp/.traces/buffer-append-works156
-rw-r--r--cpp/.traces/channel80
-rw-r--r--cpp/.traces/channel-initialization24
-rw-r--r--cpp/.traces/channel-new-empty-not-full50
-rw-r--r--cpp/.traces/channel-read-increments-full84
-rw-r--r--cpp/.traces/channel-read-not-full110
-rw-r--r--cpp/.traces/channel-wrap148
-rw-r--r--cpp/.traces/channel-write-full86
-rw-r--r--cpp/.traces/channel-write-increments-free60
-rw-r--r--cpp/.traces/channel-write-not-empty86
-rw-r--r--cpp/.traces/check_string_in_memory4
-rw-r--r--cpp/.traces/check_trace4
-rw-r--r--cpp/.traces/check_trace_instruction4
-rw-r--r--cpp/.traces/check_trace_negative4
-rw-r--r--cpp/.traces/clear-line-erases-printed-characters146
-rw-r--r--cpp/.traces/closure18
-rw-r--r--cpp/.traces/convert_names_transforms_container_elements4
-rw-r--r--cpp/.traces/deref_sidesteps_default_space_in_get2
-rw-r--r--cpp/.traces/deref_sidesteps_default_space_in_index2
-rw-r--r--cpp/.traces/first_scenario_in_mu4
-rw-r--r--cpp/.traces/get2
-rw-r--r--cpp/.traces/get_address2
-rw-r--r--cpp/.traces/get_address_indirect2
-rw-r--r--cpp/.traces/get_handles_nested_container_elements2
-rw-r--r--cpp/.traces/get_indirect2
-rw-r--r--cpp/.traces/include_nonderef_properties2
-rw-r--r--cpp/.traces/index2
-rw-r--r--cpp/.traces/index_address2
-rw-r--r--cpp/.traces/index_direct_offset2
-rw-r--r--cpp/.traces/index_indirect2
-rw-r--r--cpp/.traces/ingredient4
-rw-r--r--cpp/.traces/integer-to-decimal-digit-negative90
-rw-r--r--cpp/.traces/integer-to-decimal-digit-positive120
-rw-r--r--cpp/.traces/integer-to-decimal-digit-zero12
-rw-r--r--cpp/.traces/interpolate-at-end74
-rw-r--r--cpp/.traces/interpolate-at-start78
-rw-r--r--cpp/.traces/interpolate-works62
-rw-r--r--cpp/.traces/maybe_convert2
-rw-r--r--cpp/.traces/maybe_convert_fail2
-rw-r--r--cpp/.traces/maybe_convert_named2
-rw-r--r--cpp/.traces/memory_check2
-rw-r--r--cpp/.traces/memory_check_multiple2
-rw-r--r--cpp/.traces/memory_check_string2
-rw-r--r--cpp/.traces/memory_check_string_length2
-rw-r--r--cpp/.traces/new4
-rw-r--r--cpp/.traces/new_array4
-rw-r--r--cpp/.traces/new_concurrent6
-rw-r--r--cpp/.traces/new_overflow4
-rw-r--r--cpp/.traces/new_string4
-rw-r--r--cpp/.traces/next_ingredient2
-rw-r--r--cpp/.traces/next_ingredient_missing2
-rw-r--r--cpp/.traces/print-character-at-top-left68
-rw-r--r--cpp/.traces/reply4
-rw-r--r--cpp/.traces/reply_container4
-rw-r--r--cpp/.traces/reply_same_as_ingredient6
-rw-r--r--cpp/.traces/rewind_ingredients8
-rw-r--r--cpp/.traces/run2
-rw-r--r--cpp/.traces/run_multiple4
-rw-r--r--cpp/.traces/scenario_block4
-rw-r--r--cpp/.traces/scenario_check_memory_and_trace8
-rw-r--r--cpp/.traces/scenario_multiple_blocks8
-rw-r--r--cpp/.traces/scenario_with_comment_in_mu4
-rw-r--r--cpp/.traces/scenario_with_multiple_comments_in_mu4
-rw-r--r--cpp/.traces/scheduler2
-rw-r--r--cpp/.traces/scheduler_interleaves_routines2
-rw-r--r--cpp/.traces/string-append-174
-rw-r--r--cpp/.traces/string-equal-common-lengths-but-distinct34
-rw-r--r--cpp/.traces/string-equal-distinct-lengths26
-rw-r--r--cpp/.traces/string-equal-identical34
-rw-r--r--cpp/.traces/string-equal-reflexive32
-rw-r--r--cpp/.traces/string-equal-with-empty22
-rw-r--r--cpp/.traces/trace_check_passes_silently4
-rw-r--r--cpp/.traces/trace_check_warns_on_failure2
-rw-r--r--cpp/.traces/trace_check_warns_on_failure_in_later_line4
-rw-r--r--cpp/.traces/trace_negative_check_passes_silently2
-rw-r--r--cpp/.traces/trace_negative_check_warns_on_any_unexpected_line4
-rw-r--r--cpp/.traces/trace_negative_check_warns_on_failure4
-rw-r--r--cpp/.traces/wait_for_location4
-rw-r--r--cpp/027debug.cc10
81 files changed, 1002 insertions, 992 deletions
diff --git a/cpp/.traces/array-from-args b/cpp/.traces/array-from-args
index d033bb80..a9d4341f 100644
--- a/cpp/.traces/array-from-args
+++ b/cpp/.traces/array-from-args
@@ -24,7 +24,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: array-from-args
 run/0: instruction array-from-args/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:array:location <- init-array 0:literal, 1:literal, 2:literal
     2:array:location <- copy 1:address:array:location/deref
   ", value: 0, type: 0, properties: ["
@@ -45,7 +45,7 @@ after-brace/0: copy ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"location"]} <- init-array/114 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}, {name: "2", value: 2, type: 0, properties: ["2": "literal"]}
 run/0: instruction init-array/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-array/1
@@ -53,7 +53,7 @@ run/0: {name: "capacity", value: 1, type: 1, properties: ["capacity": "integer"]
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 1002
 run/0: instruction init-array/3
-run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 0
 mem/0: storing 0 in location 1003
 mem/0: storing 1 in location 1004
@@ -74,7 +74,7 @@ run/0: loop/10 {name: "", value: -4, type: , properties: ["": ]}
 run/0: ingredient 0 is -4
 run/0: jumping to instruction 3
 run/0: instruction init-array/3
-run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 1
 mem/0: storing 1 in location 1003
 mem/0: storing 1 in location 1004
@@ -95,7 +95,7 @@ run/0: loop/10 {name: "", value: -4, type: , properties: ["": ]}
 run/0: ingredient 0 is -4
 run/0: jumping to instruction 3
 run/0: instruction init-array/3
-run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: storing 2 in location 1003
 mem/0: storing 1 in location 1004
@@ -116,7 +116,7 @@ run/0: loop/10 {name: "", value: -4, type: , properties: ["": ]}
 run/0: ingredient 0 is -4
 run/0: jumping to instruction 3
 run/0: instruction init-array/3
-run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1004
 run/0: instruction init-array/4
 run/0: break-unless/12 {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
@@ -125,13 +125,13 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction init-array/8
-run/0: {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 1, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 1, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1002 is 3
 mem/0: array size is 3
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1005
 run/0: instruction init-array/9
-run/0: rewind-ingredients/30 
+run/0: rewind-ingredients/31 
 run/0: instruction init-array/10
 run/0: {name: "i", value: 5, type: 1, properties: ["i": "integer"]} <- copy/1 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
@@ -150,7 +150,7 @@ mem/0: location 1007 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction init-array/14
-run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 0
 mem/0: storing 0 in location 1003
 mem/0: storing 1 in location 1004
@@ -159,7 +159,7 @@ run/0: assert/19 {name: "exists?", value: 3, type: 3, properties: ["exists?": "b
 run/0: ingredient 0 is exists?
 mem/0: location 1004 is 1
 run/0: instruction init-array/16
-run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address/26 {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
+run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address/27 {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1005 is 1031
 run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
@@ -198,7 +198,7 @@ mem/0: location 1007 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction init-array/14
-run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 1
 mem/0: storing 1 in location 1003
 mem/0: storing 1 in location 1004
@@ -207,7 +207,7 @@ run/0: assert/19 {name: "exists?", value: 3, type: 3, properties: ["exists?": "b
 run/0: ingredient 0 is exists?
 mem/0: location 1004 is 1
 run/0: instruction init-array/16
-run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address/26 {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
+run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address/27 {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1005 is 1031
 run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
@@ -246,7 +246,7 @@ mem/0: location 1007 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction init-array/14
-run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}, {name: "exists?", value: 3, type: 3, properties: ["exists?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: storing 2 in location 1003
 mem/0: storing 1 in location 1004
@@ -255,7 +255,7 @@ run/0: assert/19 {name: "exists?", value: 3, type: 3, properties: ["exists?": "b
 run/0: ingredient 0 is exists?
 mem/0: location 1004 is 1
 run/0: instruction init-array/16
-run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address/26 {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
+run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address/27 {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1005 is 1031
 run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
@@ -295,7 +295,7 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 20
 run/0: instruction init-array/21
-run/0: reply/32 {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location"]}
+run/0: reply/33 {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location"]}
 mem/0: location 1005 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -312,7 +312,7 @@ mem/0: storing 0 in location 3
 mem/0: storing 1 in location 4
 mem/0: storing 2 in location 5
 run/0: instruction array-from-args/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 3  # array length
     3 <- 0
     4 <- 1
diff --git a/cpp/.traces/array_length b/cpp/.traces/array_length
index f78e0e12..514e67b5 100644
--- a/cpp/.traces/array_length
+++ b/cpp/.traces/array_length
@@ -38,5 +38,5 @@ run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 16
 mem/0: storing 16 in location 4
 run/0: instruction main/4
-run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- length/27 {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}
+run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- length/28 {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}
 mem/0: storing 3 in location 5
diff --git a/cpp/.traces/buffer-append-works b/cpp/.traces/buffer-append-works
index e24f3b69..1e974f80 100644
--- a/cpp/.traces/buffer-append-works
+++ b/cpp/.traces/buffer-append-works
@@ -116,7 +116,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: buffer-append-works
 run/0: instruction buffer-append-works/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     default-space:address:array:location <- new location:type, 30:literal
     x:address:buffer <- init-buffer 3:literal
     s1:address:array:character <- get x:address:buffer/deref, data:offset
@@ -270,21 +270,21 @@ after-brace/0: equal ...
 after-brace/0: get ...
 after-brace/0: copy ...
 run/0: instruction run1001/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction run1001/1
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- init-buffer/101 {name: "3", value: 3, type: 0, properties: ["3": "literal"]}
 run/0: instruction init-buffer/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1031
 run/0: instruction init-buffer/1
-run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new/41 {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
+run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new/42 {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
 mem/0: new alloc: 1062
 mem/0: storing 1062 in location 1033
 run/0: instruction init-buffer/2
-run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1033 is 1062
 run/0: ingredient 1 is length
@@ -297,7 +297,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1034 is 1062
 mem/0: storing 0 in location 1062
 run/0: instruction init-buffer/4
-run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address/24 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address/25 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1033 is 1062
 run/0: ingredient 1 is data
@@ -305,23 +305,23 @@ run/0: address to copy is 1063
 run/0: product 0 is 1063
 mem/0: storing 1063 in location 1035
 run/0: instruction init-buffer/5
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: storing 3 in location 1036
 run/0: instruction init-buffer/6
-run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1036 is 3
 mem/0: array size is 3
 mem/0: new alloc: 1064
 mem/0: location 1035 is 1063
 mem/0: storing 1064 in location 1063
 run/0: instruction init-buffer/7
-run/0: reply/32 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
 mem/0: location 1033 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1002
 run/0: instruction run1001/2
-run/0: {name: "s1", value: 2, type: 2-5-4, properties: ["s1": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s1", value: 2, type: 2-5-4, properties: ["s1": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1002 is 1062
 run/0: ingredient 1 is data
@@ -334,30 +334,30 @@ run/0: instruction run1001/3
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append/104 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "97", value: 97, type: 0, properties: ["97": "literal"]}
 mem/0: location 1002 is 1062
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1068
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1070
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 97
 mem/0: storing 97 in location 1071
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1070 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1099
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1101
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1101 is 1062
 run/0: ingredient 1 is length
@@ -367,7 +367,7 @@ mem/0: location 1062 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1102
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1101 is 1062
 run/0: ingredient 1 is data
@@ -377,7 +377,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1103
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1103 is 1064
 mem/0: storing 3 in location 1104
 run/0: instruction buffer-full?/5
@@ -389,7 +389,7 @@ mem/0: location 1104 is 3
 run/0: product 0 is 0
 mem/0: storing 0 in location 1105
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1105 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1072
@@ -400,7 +400,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1070 is 1062
 run/0: ingredient 1 is length
@@ -408,7 +408,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1073
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1070 is 1062
 run/0: ingredient 1 is data
@@ -418,7 +418,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1074
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1074 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -443,7 +443,7 @@ run/0: product 0 is 1
 mem/0: location 1073 is 1062
 mem/0: storing 1 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1070 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1002
@@ -451,30 +451,30 @@ run/0: instruction run1001/4
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append/104 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "98", value: 98, type: 0, properties: ["98": "literal"]}
 mem/0: location 1002 is 1062
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1130
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1132
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 98
 mem/0: storing 98 in location 1133
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1132 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1161
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1163
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1163 is 1062
 run/0: ingredient 1 is length
@@ -484,7 +484,7 @@ mem/0: location 1062 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 1164
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1163 is 1062
 run/0: ingredient 1 is data
@@ -494,7 +494,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1165
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1165 is 1064
 mem/0: storing 3 in location 1166
 run/0: instruction buffer-full?/5
@@ -506,7 +506,7 @@ mem/0: location 1166 is 3
 run/0: product 0 is 0
 mem/0: storing 0 in location 1167
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1167 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1134
@@ -517,7 +517,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1132 is 1062
 run/0: ingredient 1 is length
@@ -525,7 +525,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1135
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1132 is 1062
 run/0: ingredient 1 is data
@@ -535,7 +535,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1136
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1136 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -560,7 +560,7 @@ run/0: product 0 is 2
 mem/0: location 1135 is 1062
 mem/0: storing 2 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1132 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1002
@@ -568,30 +568,30 @@ run/0: instruction run1001/5
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append/104 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "99", value: 99, type: 0, properties: ["99": "literal"]}
 mem/0: location 1002 is 1062
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1192
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1194
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 99
 mem/0: storing 99 in location 1195
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1194 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1223
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1225
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1225 is 1062
 run/0: ingredient 1 is length
@@ -601,7 +601,7 @@ mem/0: location 1062 is 2
 run/0: product 0 is 2
 mem/0: storing 2 in location 1226
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1225 is 1062
 run/0: ingredient 1 is data
@@ -611,7 +611,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1227
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1227 is 1064
 mem/0: storing 3 in location 1228
 run/0: instruction buffer-full?/5
@@ -623,7 +623,7 @@ mem/0: location 1228 is 3
 run/0: product 0 is 0
 mem/0: storing 0 in location 1229
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1229 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1196
@@ -634,7 +634,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1194 is 1062
 run/0: ingredient 1 is length
@@ -642,7 +642,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1197
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1194 is 1062
 run/0: ingredient 1 is data
@@ -652,7 +652,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1198
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1198 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -677,12 +677,12 @@ run/0: product 0 is 3
 mem/0: location 1197 is 1062
 mem/0: storing 3 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1194 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1002
 run/0: instruction run1001/6
-run/0: {name: "s2", value: 3, type: 2-5-4, properties: ["s2": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s2", value: 3, type: 2-5-4, properties: ["s2": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1002 is 1062
 run/0: ingredient 1 is data
@@ -715,30 +715,30 @@ run/0: instruction run1001/10
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append/104 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "100", value: 100, type: 0, properties: ["100": "literal"]}
 mem/0: location 1002 is 1062
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1254
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1256
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 100
 mem/0: storing 100 in location 1257
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1256 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1285
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1287
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1287 is 1062
 run/0: ingredient 1 is length
@@ -748,7 +748,7 @@ mem/0: location 1062 is 3
 run/0: product 0 is 3
 mem/0: storing 3 in location 1288
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1287 is 1062
 run/0: ingredient 1 is data
@@ -758,7 +758,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1289
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1289 is 1064
 mem/0: storing 3 in location 1290
 run/0: instruction buffer-full?/5
@@ -770,7 +770,7 @@ mem/0: location 1290 is 3
 run/0: product 0 is 1
 mem/0: storing 1 in location 1291
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1291 is 1
 run/0: result 0 is 1
 mem/0: storing 1 in location 1258
@@ -783,15 +783,15 @@ run/0: instruction buffer-append/6
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- grow-buffer/102 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1256 is 1062
 run/0: instruction grow-buffer/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1316
 run/0: instruction grow-buffer/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1318
 run/0: instruction grow-buffer/2
-run/0: {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1318 is 1062
 run/0: ingredient 1 is data
@@ -799,7 +799,7 @@ run/0: address to copy is 1063
 run/0: product 0 is 1063
 mem/0: storing 1063 in location 1319
 run/0: instruction grow-buffer/3
-run/0: {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]} <- length/27 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}
+run/0: {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]} <- length/28 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}
 mem/0: location 1319 is 1063
 mem/0: location 1063 is 1064
 mem/0: storing 3 in location 1320
@@ -818,7 +818,7 @@ mem/0: location 1319 is 1063
 mem/0: location 1063 is 1064
 mem/0: storing 1064 in location 1322
 run/0: instruction grow-buffer/6
-run/0: {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": ]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "newlen", value: 4, type: 1, properties: ["newlen": "integer"]}
+run/0: {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": ]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "newlen", value: 4, type: 1, properties: ["newlen": "integer"]}
 mem/0: location 1321 is 6
 mem/0: array size is 6
 mem/0: new alloc: 1347
@@ -842,7 +842,7 @@ mem/0: location 1324 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction grow-buffer/11
-run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/25 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/26 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}
 mem/0: location 1322 is 1064
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -853,7 +853,7 @@ mem/0: location 1065 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1325
 run/0: instruction grow-buffer/12
-run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is x
 mem/0: location 1319 is 1063
 mem/0: location 1063 is 1347
@@ -893,7 +893,7 @@ mem/0: location 1324 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction grow-buffer/11
-run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/25 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/26 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}
 mem/0: location 1322 is 1064
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -904,7 +904,7 @@ mem/0: location 1066 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1325
 run/0: instruction grow-buffer/12
-run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is x
 mem/0: location 1319 is 1063
 mem/0: location 1063 is 1347
@@ -944,7 +944,7 @@ mem/0: location 1324 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction grow-buffer/11
-run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/25 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/26 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}
 mem/0: location 1322 is 1064
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -955,7 +955,7 @@ mem/0: location 1067 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1325
 run/0: instruction grow-buffer/12
-run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is x
 mem/0: location 1319 is 1063
 mem/0: location 1063 is 1347
@@ -996,12 +996,12 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 16
 run/0: instruction grow-buffer/17
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1318 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1256
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1256 is 1062
 run/0: ingredient 1 is length
@@ -1009,7 +1009,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1259
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1256 is 1062
 run/0: ingredient 1 is data
@@ -1019,7 +1019,7 @@ mem/0: location 1063 is 1347
 run/0: product 0 is 1347
 mem/0: storing 1347 in location 1260
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1260 is 1347
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -1044,12 +1044,12 @@ run/0: product 0 is 4
 mem/0: location 1259 is 1062
 mem/0: storing 4 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1256 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1002
 run/0: instruction run1001/11
-run/0: {name: "s3", value: 4, type: 2-5-4, properties: ["s3": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s3", value: 4, type: 2-5-4, properties: ["s3": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1002 is 1062
 run/0: ingredient 1 is data
@@ -1067,7 +1067,7 @@ mem/0: location 1005 is 1347
 run/0: product 0 is 0
 mem/0: storing 0 in location 10
 run/0: instruction run1001/13
-run/0: {name: "11", value: 11, type: 1, properties: ["11": "integer", "raw": ]} <- get/23 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "11", value: 11, type: 1, properties: ["11": "integer", "raw": ]} <- get/24 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1002 is 1062
 run/0: ingredient 1 is length
@@ -1095,7 +1095,7 @@ mem/0: storing 100 in location 16
 mem/0: storing 0 in location 17
 mem/0: storing 0 in location 18
 run/0: instruction buffer-append-works/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     # before +buffer-filled
     1 <- 1   # no change in data pointer
     2 <- 3   # size of data
diff --git a/cpp/.traces/channel b/cpp/.traces/channel
index 59294c41..4af4241c 100644
--- a/cpp/.traces/channel
+++ b/cpp/.traces/channel
@@ -20,7 +20,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel
 run/0: instruction channel/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:channel <- init-channel 3:literal/capacity
     1:address:channel <- write 1:address:channel, 34:literal
     2:integer, 1:address:channel <- read 1:address:channel
@@ -47,15 +47,15 @@ after-brace/0: read ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "3", value: 3, type: 0, properties: ["3": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -68,7 +68,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -81,7 +81,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: storing 3 in location 1005
 run/0: instruction init-channel/7
@@ -92,7 +92,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 4
 mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -100,14 +100,14 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -115,30 +115,30 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write/109 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction write/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1039
 run/0: instruction write/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1041
 run/0: instruction write/2
-run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/29 
+run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/30 
 run/0: product 0 is 34
 mem/0: storing 34 in location 1042
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full?/110 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1041 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
@@ -158,15 +158,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
@@ -176,11 +176,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1104 is 1034
 mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1105 is 4
 run/0: result 0 is 4
 mem/0: storing 4 in location 1074
@@ -199,7 +199,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
@@ -217,7 +217,7 @@ mem/0: location 1073 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1077 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1043
@@ -228,7 +228,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is data
@@ -238,7 +238,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1045
 run/0: instruction write/10
-run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
@@ -246,7 +246,7 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1046
 run/0: instruction write/11
-run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
 mem/0: location 1045 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
@@ -271,7 +271,7 @@ run/0: product 0 is 1
 mem/0: location 1046 is 1032
 mem/0: storing 1 in location 1032
 run/0: instruction write/15
-run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1045 is 1034
 mem/0: storing 4 in location 1048
 run/0: instruction write/16
@@ -290,7 +290,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
-run/0: reply/32 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1041 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -298,26 +298,26 @@ run/0: instruction run1001/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read/111 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction read/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1132
 run/0: instruction read/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1134
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty?/112 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1134 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1163
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1165
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-full
@@ -327,7 +327,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1166
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-free
@@ -345,7 +345,7 @@ mem/0: location 1167 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1168
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1168 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1135
@@ -356,7 +356,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
-run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1134 is 1031
 run/0: ingredient 1 is first-full
@@ -364,7 +364,7 @@ run/0: address to copy is 1031
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1137
 run/0: instruction read/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1134 is 1031
 run/0: ingredient 1 is data
@@ -374,7 +374,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1138
 run/0: instruction read/10
-run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/25 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
+run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1138 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
@@ -395,7 +395,7 @@ run/0: product 0 is 1
 mem/0: location 1137 is 1031
 mem/0: storing 1 in location 1031
 run/0: instruction read/13
-run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1138 is 1034
 mem/0: storing 4 in location 1140
 run/0: instruction read/14
@@ -414,7 +414,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 17
 run/0: instruction read/18
-run/0: reply/32 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1139 is 34
 mem/0: location 1134 is 1031
 run/0: result 0 is 34
@@ -422,7 +422,7 @@ mem/0: storing 34 in location 2
 run/0: result 1 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction channel/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 34
   ", value: 0, type: 0, properties: ["
     2 <- 34
diff --git a/cpp/.traces/channel-initialization b/cpp/.traces/channel-initialization
index 256d270c..87f54f41 100644
--- a/cpp/.traces/channel-initialization
+++ b/cpp/.traces/channel-initialization
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel-initialization
 run/0: instruction channel-initialization/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:channel <- init-channel 3:literal/capacity
     2:integer <- get 1:address:channel/deref, first-full:offset
     3:integer <- get 1:address:channel/deref, first-free:offset
@@ -51,15 +51,15 @@ after-brace/0: get ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "3", value: 3, type: 0, properties: ["3": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -72,7 +72,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -85,7 +85,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: storing 3 in location 1005
 run/0: instruction init-channel/7
@@ -96,7 +96,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 4
 mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -104,19 +104,19 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction run1001/1
-run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-full
@@ -126,7 +126,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 2
 run/0: instruction run1001/2
-run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
@@ -136,7 +136,7 @@ mem/0: location 1032 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 3
 run/0: instruction channel-initialization/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 0  # first-full
     3 <- 0  # first-free
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/channel-new-empty-not-full b/cpp/.traces/channel-new-empty-not-full
index 91ff45d3..dbf18483 100644
--- a/cpp/.traces/channel-new-empty-not-full
+++ b/cpp/.traces/channel-new-empty-not-full
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel-new-empty-not-full
 run/0: instruction channel-new-empty-not-full/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:channel <- init-channel 3:literal/capacity
     2:integer <- channel-empty? 1:address:channel
     3:integer <- channel-full? 1:address:channel
@@ -47,15 +47,15 @@ after-brace/0: channel-full? ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "3", value: 3, type: 0, properties: ["3": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -68,7 +68,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -81,7 +81,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: storing 3 in location 1005
 run/0: instruction init-channel/7
@@ -92,7 +92,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 4
 mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -100,14 +100,14 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -115,15 +115,15 @@ run/0: instruction run1001/1
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- channel-empty?/112 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1039
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1041
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-full
@@ -133,7 +133,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1042
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
@@ -151,7 +151,7 @@ mem/0: location 1043 is 0
 run/0: product 0 is 1
 mem/0: storing 1 in location 1044
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1044 is 1
 run/0: result 0 is 1
 mem/0: storing 1 in location 2
@@ -159,15 +159,15 @@ run/0: instruction run1001/2
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- channel-full?/110 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
@@ -187,15 +187,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
@@ -205,11 +205,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1104 is 1034
 mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1105 is 4
 run/0: result 0 is 4
 mem/0: storing 4 in location 1074
@@ -228,7 +228,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
@@ -246,12 +246,12 @@ mem/0: location 1073 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1077 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
 run/0: instruction channel-new-empty-not-full/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 1  # empty?
     3 <- 0  # full?
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/channel-read-increments-full b/cpp/.traces/channel-read-increments-full
index 45a2a88a..9d8de61f 100644
--- a/cpp/.traces/channel-read-increments-full
+++ b/cpp/.traces/channel-read-increments-full
@@ -26,7 +26,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel-read-increments-full
 run/0: instruction channel-read-increments-full/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:channel <- init-channel 3:literal/capacity
     1:address:channel <- write 1:address:channel, 34:literal
     _, 1:address:channel <- read 1:address:channel
@@ -69,15 +69,15 @@ after-brace/0: get ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "3", value: 3, type: 0, properties: ["3": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -90,7 +90,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -103,7 +103,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: storing 3 in location 1005
 run/0: instruction init-channel/7
@@ -114,7 +114,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 4
 mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -122,14 +122,14 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -137,30 +137,30 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write/109 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction write/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1039
 run/0: instruction write/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1041
 run/0: instruction write/2
-run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/29 
+run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/30 
 run/0: product 0 is 34
 mem/0: storing 34 in location 1042
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full?/110 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1041 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
@@ -180,15 +180,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
@@ -198,11 +198,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1104 is 1034
 mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1105 is 4
 run/0: result 0 is 4
 mem/0: storing 4 in location 1074
@@ -221,7 +221,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
@@ -239,7 +239,7 @@ mem/0: location 1073 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1077 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1043
@@ -250,7 +250,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is data
@@ -260,7 +260,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1045
 run/0: instruction write/10
-run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
@@ -268,7 +268,7 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1046
 run/0: instruction write/11
-run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
 mem/0: location 1045 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
@@ -293,7 +293,7 @@ run/0: product 0 is 1
 mem/0: location 1046 is 1032
 mem/0: storing 1 in location 1032
 run/0: instruction write/15
-run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1045 is 1034
 mem/0: storing 4 in location 1048
 run/0: instruction write/16
@@ -312,7 +312,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
-run/0: reply/32 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1041 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -320,26 +320,26 @@ run/0: instruction run1001/2
 run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read/111 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction read/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1132
 run/0: instruction read/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1134
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty?/112 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1134 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1163
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1165
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-full
@@ -349,7 +349,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1166
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-free
@@ -367,7 +367,7 @@ mem/0: location 1167 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1168
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1168 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1135
@@ -378,7 +378,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
-run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1134 is 1031
 run/0: ingredient 1 is first-full
@@ -386,7 +386,7 @@ run/0: address to copy is 1031
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1137
 run/0: instruction read/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1134 is 1031
 run/0: ingredient 1 is data
@@ -396,7 +396,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1138
 run/0: instruction read/10
-run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/25 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
+run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1138 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
@@ -417,7 +417,7 @@ run/0: product 0 is 1
 mem/0: location 1137 is 1031
 mem/0: storing 1 in location 1031
 run/0: instruction read/13
-run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1138 is 1034
 mem/0: storing 4 in location 1140
 run/0: instruction read/14
@@ -436,14 +436,14 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 17
 run/0: instruction read/18
-run/0: reply/32 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1139 is 34
 mem/0: location 1134 is 1031
 run/0: result 0 is 34
 run/0: result 1 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction run1001/3
-run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-full
@@ -453,7 +453,7 @@ mem/0: location 1031 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 2
 run/0: instruction run1001/4
-run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
@@ -463,7 +463,7 @@ mem/0: location 1032 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 3
 run/0: instruction channel-read-increments-full/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 1  # first-full
     3 <- 1  # first-free
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/channel-read-not-full b/cpp/.traces/channel-read-not-full
index 69379ea9..f17dd812 100644
--- a/cpp/.traces/channel-read-not-full
+++ b/cpp/.traces/channel-read-not-full
@@ -26,7 +26,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel-read-not-full
 run/0: instruction channel-read-not-full/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:channel <- init-channel 1:literal/capacity
     1:address:channel <- write 1:address:channel, 34:literal
     _, 1:address:channel <- read 1:address:channel
@@ -65,15 +65,15 @@ after-brace/0: channel-full? ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "1", value: 1, type: 0, properties: ["1": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -86,7 +86,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -99,7 +99,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 1
 mem/0: storing 1 in location 1005
 run/0: instruction init-channel/7
@@ -110,7 +110,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 2
 mem/0: storing 2 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -118,14 +118,14 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 2
 mem/0: array size is 2
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -133,30 +133,30 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write/109 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction write/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1037
 run/0: instruction write/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1039
 run/0: instruction write/2
-run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/29 
+run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/30 
 run/0: product 0 is 34
 mem/0: storing 34 in location 1040
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full?/110 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1039 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1068
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1070
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-free
@@ -176,15 +176,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1070 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1099
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1101
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1101 is 1031
 run/0: ingredient 1 is data
@@ -194,11 +194,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1102
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1102 is 1034
 mem/0: storing 2 in location 1103
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1103 is 2
 run/0: result 0 is 2
 mem/0: storing 2 in location 1072
@@ -217,7 +217,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-full
@@ -235,7 +235,7 @@ mem/0: location 1071 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1075 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1041
@@ -246,7 +246,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is data
@@ -256,7 +256,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1043
 run/0: instruction write/10
-run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is first-free
@@ -264,7 +264,7 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1044
 run/0: instruction write/11
-run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
 mem/0: location 1043 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
@@ -289,7 +289,7 @@ run/0: product 0 is 1
 mem/0: location 1044 is 1032
 mem/0: storing 1 in location 1032
 run/0: instruction write/15
-run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1043 is 1034
 mem/0: storing 2 in location 1046
 run/0: instruction write/16
@@ -308,7 +308,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
-run/0: reply/32 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1039 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -316,26 +316,26 @@ run/0: instruction run1001/2
 run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read/111 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction read/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1130
 run/0: instruction read/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1132
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty?/112 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1132 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1161
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1163
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-full
@@ -345,7 +345,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1164
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-free
@@ -363,7 +363,7 @@ mem/0: location 1165 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1166
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1166 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1133
@@ -374,7 +374,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
-run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1132 is 1031
 run/0: ingredient 1 is first-full
@@ -382,7 +382,7 @@ run/0: address to copy is 1031
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1135
 run/0: instruction read/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1132 is 1031
 run/0: ingredient 1 is data
@@ -392,7 +392,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1136
 run/0: instruction read/10
-run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/25 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
+run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1136 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
@@ -413,7 +413,7 @@ run/0: product 0 is 1
 mem/0: location 1135 is 1031
 mem/0: storing 1 in location 1031
 run/0: instruction read/13
-run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1136 is 1034
 mem/0: storing 2 in location 1138
 run/0: instruction read/14
@@ -432,7 +432,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 17
 run/0: instruction read/18
-run/0: reply/32 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1137 is 34
 mem/0: location 1132 is 1031
 run/0: result 0 is 34
@@ -442,15 +442,15 @@ run/0: instruction run1001/3
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- channel-empty?/112 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1192
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1194
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1194 is 1031
 run/0: ingredient 1 is first-full
@@ -460,7 +460,7 @@ mem/0: location 1031 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 1195
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1194 is 1031
 run/0: ingredient 1 is first-free
@@ -478,7 +478,7 @@ mem/0: location 1196 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 1197
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1197 is 1
 run/0: result 0 is 1
 mem/0: storing 1 in location 2
@@ -486,15 +486,15 @@ run/0: instruction run1001/4
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- channel-full?/110 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1223
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1225
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1225 is 1031
 run/0: ingredient 1 is first-free
@@ -514,15 +514,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1225 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1254
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1256
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1256 is 1031
 run/0: ingredient 1 is data
@@ -532,11 +532,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1257
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1257 is 1034
 mem/0: storing 2 in location 1258
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1258 is 2
 run/0: result 0 is 2
 mem/0: storing 2 in location 1227
@@ -558,7 +558,7 @@ run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- copy/
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 1226
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1225 is 1031
 run/0: ingredient 1 is first-full
@@ -576,12 +576,12 @@ mem/0: location 1226 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1230
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1230 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
 run/0: instruction channel-read-not-full/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 1  # empty?
     3 <- 0  # full?
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/channel-wrap b/cpp/.traces/channel-wrap
index 04a7cd13..dc636db0 100644
--- a/cpp/.traces/channel-wrap
+++ b/cpp/.traces/channel-wrap
@@ -48,7 +48,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel-wrap
 run/0: instruction channel-wrap/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     # channel with just 1 slot
     1:address:channel <- init-channel 1:literal/capacity
     # write and read a value
@@ -131,15 +131,15 @@ after-brace/0: get ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "1", value: 1, type: 0, properties: ["1": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -152,7 +152,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -165,7 +165,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 1
 mem/0: storing 1 in location 1005
 run/0: instruction init-channel/7
@@ -176,7 +176,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 2
 mem/0: storing 2 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -184,14 +184,14 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 2
 mem/0: array size is 2
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -199,30 +199,30 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write/109 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction write/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1037
 run/0: instruction write/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1039
 run/0: instruction write/2
-run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/29 
+run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/30 
 run/0: product 0 is 34
 mem/0: storing 34 in location 1040
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full?/110 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1039 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1068
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1070
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-free
@@ -242,15 +242,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1070 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1099
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1101
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1101 is 1031
 run/0: ingredient 1 is data
@@ -260,11 +260,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1102
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1102 is 1034
 mem/0: storing 2 in location 1103
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1103 is 2
 run/0: result 0 is 2
 mem/0: storing 2 in location 1072
@@ -283,7 +283,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-full
@@ -301,7 +301,7 @@ mem/0: location 1071 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1075 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1041
@@ -312,7 +312,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is data
@@ -322,7 +322,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1043
 run/0: instruction write/10
-run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is first-free
@@ -330,7 +330,7 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1044
 run/0: instruction write/11
-run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
 mem/0: location 1043 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
@@ -355,7 +355,7 @@ run/0: product 0 is 1
 mem/0: location 1044 is 1032
 mem/0: storing 1 in location 1032
 run/0: instruction write/15
-run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1043 is 1034
 mem/0: storing 2 in location 1046
 run/0: instruction write/16
@@ -374,7 +374,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
-run/0: reply/32 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1039 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -382,26 +382,26 @@ run/0: instruction run1001/2
 run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read/111 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction read/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1130
 run/0: instruction read/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1132
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty?/112 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1132 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1161
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1163
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-full
@@ -411,7 +411,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1164
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-free
@@ -429,7 +429,7 @@ mem/0: location 1165 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1166
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1166 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1133
@@ -440,7 +440,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
-run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1132 is 1031
 run/0: ingredient 1 is first-full
@@ -448,7 +448,7 @@ run/0: address to copy is 1031
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1135
 run/0: instruction read/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1132 is 1031
 run/0: ingredient 1 is data
@@ -458,7 +458,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1136
 run/0: instruction read/10
-run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/25 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
+run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1136 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
@@ -479,7 +479,7 @@ run/0: product 0 is 1
 mem/0: location 1135 is 1031
 mem/0: storing 1 in location 1031
 run/0: instruction read/13
-run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1136 is 1034
 mem/0: storing 2 in location 1138
 run/0: instruction read/14
@@ -498,14 +498,14 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 17
 run/0: instruction read/18
-run/0: reply/32 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1137 is 34
 mem/0: location 1132 is 1031
 run/0: result 0 is 34
 run/0: result 1 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction run1001/3
-run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
@@ -515,7 +515,7 @@ mem/0: location 1032 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 2
 run/0: instruction run1001/4
-run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
@@ -528,30 +528,30 @@ run/0: instruction run1001/5
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write/109 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction write/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1192
 run/0: instruction write/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1194
 run/0: instruction write/2
-run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/29 
+run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/30 
 run/0: product 0 is 34
 mem/0: storing 34 in location 1195
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full?/110 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1194 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1223
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1225
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1225 is 1031
 run/0: ingredient 1 is first-free
@@ -571,15 +571,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1225 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1254
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1256
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1256 is 1031
 run/0: ingredient 1 is data
@@ -589,11 +589,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1257
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1257 is 1034
 mem/0: storing 2 in location 1258
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1258 is 2
 run/0: result 0 is 2
 mem/0: storing 2 in location 1227
@@ -615,7 +615,7 @@ run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- copy/
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 1226
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1225 is 1031
 run/0: ingredient 1 is first-full
@@ -633,7 +633,7 @@ mem/0: location 1226 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1230
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1230 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1196
@@ -644,7 +644,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1194 is 1031
 run/0: ingredient 1 is data
@@ -654,7 +654,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1198
 run/0: instruction write/10
-run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1194 is 1031
 run/0: ingredient 1 is first-free
@@ -662,7 +662,7 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1199
 run/0: instruction write/11
-run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
 mem/0: location 1198 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
@@ -687,7 +687,7 @@ run/0: product 0 is 2
 mem/0: location 1199 is 1032
 mem/0: storing 2 in location 1032
 run/0: instruction write/15
-run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1198 is 1034
 mem/0: storing 2 in location 1201
 run/0: instruction write/16
@@ -710,12 +710,12 @@ run/0: ingredient 0 is 0
 mem/0: location 1199 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction write/20
-run/0: reply/32 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1194 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction run1001/6
-run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
@@ -728,26 +728,26 @@ run/0: instruction run1001/7
 run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read/111 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction read/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1285
 run/0: instruction read/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1287
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty?/112 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1287 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1316
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1318
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1318 is 1031
 run/0: ingredient 1 is first-full
@@ -757,7 +757,7 @@ mem/0: location 1031 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 1319
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1318 is 1031
 run/0: ingredient 1 is first-free
@@ -775,7 +775,7 @@ mem/0: location 1320 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1321
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1321 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1288
@@ -786,7 +786,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
-run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1287 is 1031
 run/0: ingredient 1 is first-full
@@ -794,7 +794,7 @@ run/0: address to copy is 1031
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1290
 run/0: instruction read/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1287 is 1031
 run/0: ingredient 1 is data
@@ -804,7 +804,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1291
 run/0: instruction read/10
-run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/25 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
+run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1291 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
@@ -825,7 +825,7 @@ run/0: product 0 is 2
 mem/0: location 1290 is 1031
 mem/0: storing 2 in location 1031
 run/0: instruction read/13
-run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1291 is 1034
 mem/0: storing 2 in location 1293
 run/0: instruction read/14
@@ -848,14 +848,14 @@ run/0: ingredient 0 is 0
 mem/0: location 1290 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction read/18
-run/0: reply/32 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1292 is 34
 mem/0: location 1287 is 1031
 run/0: result 0 is 34
 run/0: result 1 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction run1001/8
-run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-full
@@ -865,7 +865,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 5
 run/0: instruction channel-wrap/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 1  # first-free after first write
     3 <- 1  # first-full after first read
     4 <- 0  # first-free after second write, wrapped
diff --git a/cpp/.traces/channel-write-full b/cpp/.traces/channel-write-full
index 1487727c..2f602df1 100644
--- a/cpp/.traces/channel-write-full
+++ b/cpp/.traces/channel-write-full
@@ -24,7 +24,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel-write-full
 run/0: instruction channel-write-full/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:channel <- init-channel 1:literal/capacity
     1:address:channel <- write 1:address:channel, 34:literal
     2:integer <- channel-empty? 1:address:channel
@@ -56,15 +56,15 @@ after-brace/0: channel-full? ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "1", value: 1, type: 0, properties: ["1": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -77,7 +77,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -90,7 +90,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 1
 mem/0: storing 1 in location 1005
 run/0: instruction init-channel/7
@@ -101,7 +101,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 2
 mem/0: storing 2 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -109,14 +109,14 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 2
 mem/0: array size is 2
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -124,30 +124,30 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write/109 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction write/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1037
 run/0: instruction write/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1039
 run/0: instruction write/2
-run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/29 
+run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/30 
 run/0: product 0 is 34
 mem/0: storing 34 in location 1040
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full?/110 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1039 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1068
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1070
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-free
@@ -167,15 +167,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1070 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1099
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1101
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1101 is 1031
 run/0: ingredient 1 is data
@@ -185,11 +185,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1102
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1102 is 1034
 mem/0: storing 2 in location 1103
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1103 is 2
 run/0: result 0 is 2
 mem/0: storing 2 in location 1072
@@ -208,7 +208,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-full
@@ -226,7 +226,7 @@ mem/0: location 1071 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1075 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1041
@@ -237,7 +237,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is data
@@ -247,7 +247,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1043
 run/0: instruction write/10
-run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is first-free
@@ -255,7 +255,7 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1044
 run/0: instruction write/11
-run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
 mem/0: location 1043 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
@@ -280,7 +280,7 @@ run/0: product 0 is 1
 mem/0: location 1044 is 1032
 mem/0: storing 1 in location 1032
 run/0: instruction write/15
-run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1043 is 1034
 mem/0: storing 2 in location 1046
 run/0: instruction write/16
@@ -299,7 +299,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
-run/0: reply/32 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1039 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -307,15 +307,15 @@ run/0: instruction run1001/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- channel-empty?/112 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1130
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1132
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1132 is 1031
 run/0: ingredient 1 is first-full
@@ -325,7 +325,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1133
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1132 is 1031
 run/0: ingredient 1 is first-free
@@ -343,7 +343,7 @@ mem/0: location 1134 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1135
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1135 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 2
@@ -351,15 +351,15 @@ run/0: instruction run1001/3
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- channel-full?/110 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1161
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1163
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-free
@@ -379,15 +379,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1163 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1192
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1194
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1194 is 1031
 run/0: ingredient 1 is data
@@ -397,11 +397,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1195
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1195 is 1034
 mem/0: storing 2 in location 1196
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1196 is 2
 run/0: result 0 is 2
 mem/0: storing 2 in location 1165
@@ -423,7 +423,7 @@ run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- copy/
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 1164
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-full
@@ -441,12 +441,12 @@ mem/0: location 1164 is 0
 run/0: product 0 is 1
 mem/0: storing 1 in location 1168
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1168 is 1
 run/0: result 0 is 1
 mem/0: storing 1 in location 3
 run/0: instruction channel-write-full/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 0  # empty?
     3 <- 1  # full?
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/channel-write-increments-free b/cpp/.traces/channel-write-increments-free
index 1f9ae970..083e3503 100644
--- a/cpp/.traces/channel-write-increments-free
+++ b/cpp/.traces/channel-write-increments-free
@@ -24,7 +24,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel-write-increments-free
 run/0: instruction channel-write-increments-free/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:channel <- init-channel 3:literal/capacity
     1:address:channel <- write 1:address:channel, 34:literal
     2:integer <- get 1:address:channel/deref, first-full:offset
@@ -60,15 +60,15 @@ after-brace/0: get ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "3", value: 3, type: 0, properties: ["3": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -81,7 +81,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -94,7 +94,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: storing 3 in location 1005
 run/0: instruction init-channel/7
@@ -105,7 +105,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 4
 mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -113,14 +113,14 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -128,30 +128,30 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write/109 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction write/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1039
 run/0: instruction write/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1041
 run/0: instruction write/2
-run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/29 
+run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/30 
 run/0: product 0 is 34
 mem/0: storing 34 in location 1042
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full?/110 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1041 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
@@ -171,15 +171,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
@@ -189,11 +189,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1104 is 1034
 mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1105 is 4
 run/0: result 0 is 4
 mem/0: storing 4 in location 1074
@@ -212,7 +212,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
@@ -230,7 +230,7 @@ mem/0: location 1073 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1077 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1043
@@ -241,7 +241,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is data
@@ -251,7 +251,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1045
 run/0: instruction write/10
-run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
@@ -259,7 +259,7 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1046
 run/0: instruction write/11
-run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
 mem/0: location 1045 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
@@ -284,7 +284,7 @@ run/0: product 0 is 1
 mem/0: location 1046 is 1032
 mem/0: storing 1 in location 1032
 run/0: instruction write/15
-run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1045 is 1034
 mem/0: storing 4 in location 1048
 run/0: instruction write/16
@@ -303,12 +303,12 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
-run/0: reply/32 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1041 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction run1001/2
-run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-full
@@ -318,7 +318,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 2
 run/0: instruction run1001/3
-run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get/23 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get/24 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
@@ -328,7 +328,7 @@ mem/0: location 1032 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 3
 run/0: instruction channel-write-increments-free/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 0  # first-full
     3 <- 1  # first-free
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/channel-write-not-empty b/cpp/.traces/channel-write-not-empty
index e4758cd3..4ddf4687 100644
--- a/cpp/.traces/channel-write-not-empty
+++ b/cpp/.traces/channel-write-not-empty
@@ -24,7 +24,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: channel-write-not-empty
 run/0: instruction channel-write-not-empty/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:channel <- init-channel 3:literal/capacity
     1:address:channel <- write 1:address:channel, 34:literal
     2:integer <- channel-empty? 1:address:channel
@@ -56,15 +56,15 @@ after-brace/0: channel-full? ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- init-channel/108 {name: "3", value: 3, type: 0, properties: ["3": "literal", "capacity": ]}
 run/0: instruction init-channel/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
-run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/41 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
+run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new/42 {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
-run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
@@ -77,7 +77,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1003 is 1031
 mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
-run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
@@ -90,7 +90,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1004 is 1032
 mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: storing 3 in location 1005
 run/0: instruction init-channel/7
@@ -101,7 +101,7 @@ run/0: ingredient 1 is 1
 run/0: product 0 is 4
 mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/24 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address/25 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -109,14 +109,14 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
-run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
 mem/0: new alloc: 1034
 mem/0: location 1006 is 1033
 mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
-run/0: reply/32 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -124,30 +124,30 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write/109 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction write/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1039
 run/0: instruction write/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1041
 run/0: instruction write/2
-run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/29 
+run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient/30 
 run/0: product 0 is 34
 mem/0: storing 34 in location 1042
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full?/110 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1041 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
@@ -167,15 +167,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
@@ -185,11 +185,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1104 is 1034
 mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1105 is 4
 run/0: result 0 is 4
 mem/0: storing 4 in location 1074
@@ -208,7 +208,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
@@ -226,7 +226,7 @@ mem/0: location 1073 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1077 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1043
@@ -237,7 +237,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
-run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is data
@@ -247,7 +247,7 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1045
 run/0: instruction write/10
-run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
@@ -255,7 +255,7 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1046
 run/0: instruction write/11
-run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
 mem/0: location 1045 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
@@ -280,7 +280,7 @@ run/0: product 0 is 1
 mem/0: location 1046 is 1032
 mem/0: storing 1 in location 1032
 run/0: instruction write/15
-run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/27 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
+run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
 mem/0: location 1045 is 1034
 mem/0: storing 4 in location 1048
 run/0: instruction write/16
@@ -299,7 +299,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
-run/0: reply/32 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
 mem/0: location 1041 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -307,15 +307,15 @@ run/0: instruction run1001/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- channel-empty?/112 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction channel-empty?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1132
 run/0: instruction channel-empty?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1134
 run/0: instruction channel-empty?/2
-run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1134 is 1031
 run/0: ingredient 1 is first-full
@@ -325,7 +325,7 @@ mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1135
 run/0: instruction channel-empty?/3
-run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1134 is 1031
 run/0: ingredient 1 is first-free
@@ -343,7 +343,7 @@ mem/0: location 1136 is 1
 run/0: product 0 is 0
 mem/0: storing 0 in location 1137
 run/0: instruction channel-empty?/5
-run/0: reply/32 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1137 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 2
@@ -351,15 +351,15 @@ run/0: instruction run1001/3
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- channel-full?/110 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
 mem/0: location 1 is 1031
 run/0: instruction channel-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1163
 run/0: instruction channel-full?/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1165
 run/0: instruction channel-full?/2
-run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
+run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-free
@@ -379,15 +379,15 @@ run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity/113 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
 mem/0: location 1165 is 1031
 run/0: instruction channel-capacity/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1194
 run/0: instruction channel-capacity/1
-run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/29 
+run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1196
 run/0: instruction channel-capacity/2
-run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
+run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1196 is 1031
 run/0: ingredient 1 is data
@@ -397,11 +397,11 @@ mem/0: location 1033 is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1197
 run/0: instruction channel-capacity/3
-run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/27 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
+run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length/28 {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
 mem/0: location 1197 is 1034
 mem/0: storing 4 in location 1198
 run/0: instruction channel-capacity/4
-run/0: reply/32 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
+run/0: reply/33 {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
 mem/0: location 1198 is 4
 run/0: result 0 is 4
 mem/0: storing 4 in location 1167
@@ -420,7 +420,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
-run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/23 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
+run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
 mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-full
@@ -438,12 +438,12 @@ mem/0: location 1166 is 2
 run/0: product 0 is 0
 mem/0: storing 0 in location 1170
 run/0: instruction channel-full?/12
-run/0: reply/32 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1170 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
 run/0: instruction channel-write-not-empty/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 0  # empty?
     3 <- 0  # full?
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/check_string_in_memory b/cpp/.traces/check_string_in_memory
index bffcabc6..5ebd7a8d 100644
--- a/cpp/.traces/check_string_in_memory
+++ b/cpp/.traces/check_string_in_memory
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: check_string_in_memory
 run/0: instruction check_string_in_memory/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- copy 3:literal
     2:character <- copy 97:literal  # 'a'
     3:character <- copy 98:literal  # 'b'
@@ -67,7 +67,7 @@ run/0: {name: "4", value: 4, type: 4, properties: ["4": "character"]} <- copy/1
 run/0: ingredient 0 is 99
 mem/0: storing 99 in location 4
 run/0: instruction check_string_in_memory/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1:string <- [abc]
   ", value: 0, type: 0, properties: ["
     1:string <- [abc]
diff --git a/cpp/.traces/check_trace b/cpp/.traces/check_trace
index e6f6c360..bdea161d 100644
--- a/cpp/.traces/check_trace
+++ b/cpp/.traces/check_trace
@@ -16,7 +16,7 @@ after-brace/0: trace-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: check_trace
 run/0: instruction check_trace/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- add 2:literal, 2:literal
   ", value: 0, type: 0, properties: ["
     1:integer <- add 2:literal, 2:literal
@@ -34,7 +34,7 @@ run/0: ingredient 1 is 2
 run/0: product 0 is 4
 mem/0: storing 4 in location 1
 run/0: instruction check_trace/1
-run/0: trace-should-contain/44 {name: "
+run/0: trace-should-contain/45 {name: "
     mem: storing 4 in location 1
   ", value: 0, type: 0, properties: ["
     mem: storing 4 in location 1
diff --git a/cpp/.traces/check_trace_instruction b/cpp/.traces/check_trace_instruction
index ef94da20..95e712ff 100644
--- a/cpp/.traces/check_trace_instruction
+++ b/cpp/.traces/check_trace_instruction
@@ -16,7 +16,7 @@ after-brace/0: trace-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: check_trace_instruction
 run/0: instruction check_trace_instruction/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     trace [foo], [aaa]
   ", value: 0, type: 0, properties: ["
     trace [foo], [aaa]
@@ -30,7 +30,7 @@ run/0: instruction run1001/0
 run/0: trace/18 {name: "foo", value: 0, type: 0, properties: ["foo": "literal-string"]}, {name: "aaa", value: 0, type: 0, properties: ["aaa": "literal-string"]}
 foo/0: aaa
 run/0: instruction check_trace_instruction/1
-run/0: trace-should-contain/44 {name: "
+run/0: trace-should-contain/45 {name: "
     foo: aaa
   ", value: 0, type: 0, properties: ["
     foo: aaa
diff --git a/cpp/.traces/check_trace_negative b/cpp/.traces/check_trace_negative
index 1912420a..ca979241 100644
--- a/cpp/.traces/check_trace_negative
+++ b/cpp/.traces/check_trace_negative
@@ -16,7 +16,7 @@ after-brace/0: trace-should-not-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: check_trace_negative
 run/0: instruction check_trace_negative/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- add 2:literal, 2:literal
   ", value: 0, type: 0, properties: ["
     1:integer <- add 2:literal, 2:literal
@@ -34,7 +34,7 @@ run/0: ingredient 1 is 2
 run/0: product 0 is 4
 mem/0: storing 4 in location 1
 run/0: instruction check_trace_negative/1
-run/0: trace-should-not-contain/45 {name: "
+run/0: trace-should-not-contain/46 {name: "
     mem: storing 5 in location 1
   ", value: 0, type: 0, properties: ["
     mem: storing 5 in location 1
diff --git a/cpp/.traces/clear-line-erases-printed-characters b/cpp/.traces/clear-line-erases-printed-characters
index 25eb1b97..33dbbe49 100644
--- a/cpp/.traces/clear-line-erases-printed-characters
+++ b/cpp/.traces/clear-line-erases-printed-characters
@@ -46,7 +46,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: clear-line-erases-printed-characters
 run/0: instruction clear-line-erases-printed-characters/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
 #?     $start-tracing #? 3
     1:address:screen <- init-fake-screen 3:literal/width, 2:literal/height
     # print a character
@@ -103,15 +103,15 @@ after-brace/0: copy ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]} <- init-fake-screen/115 {name: "3", value: 3, type: 0, properties: ["3": "literal", "width": ]}, {name: "2", value: 2, type: 0, properties: ["2": "literal", "height": ]}
 run/0: instruction init-fake-screen/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal", "capacity": ]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal", "capacity": ]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-fake-screen/1
-run/0: {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]} <- new/41 {name: "screen", value: 11, type: 0, properties: ["screen": "type"]}
+run/0: {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]} <- new/42 {name: "screen", value: 11, type: 0, properties: ["screen": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-fake-screen/2
-run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is num-columns
@@ -119,12 +119,12 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1003
 run/0: instruction init-fake-screen/3
-run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer", "deref": ]} <- next-ingredient/29 
+run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer", "deref": ]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: location 1003 is 1032
 mem/0: storing 3 in location 1032
 run/0: instruction init-fake-screen/4
-run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-rows", value: 0, type: 0, properties: ["num-rows": "offset"]}
+run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-rows", value: 0, type: 0, properties: ["num-rows": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is num-rows
@@ -132,12 +132,12 @@ run/0: address to copy is 1031
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1004
 run/0: instruction init-fake-screen/5
-run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer", "deref": ]} <- next-ingredient/29 
+run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer", "deref": ]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: location 1004 is 1031
 mem/0: storing 2 in location 1031
 run/0: instruction init-fake-screen/6
-run/0: {name: "row", value: 4, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: {name: "row", value: 4, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is cursor-row
@@ -150,7 +150,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1005 is 1033
 mem/0: storing 0 in location 1033
 run/0: instruction init-fake-screen/8
-run/0: {name: "column", value: 5, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 5, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is cursor-column
@@ -174,7 +174,7 @@ run/0: ingredient 1 is 2
 run/0: product 0 is 6
 mem/0: storing 6 in location 1007
 run/0: instruction init-fake-screen/11
-run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -182,7 +182,7 @@ run/0: address to copy is 1035
 run/0: product 0 is 1035
 mem/0: storing 1035 in location 1008
 run/0: instruction init-fake-screen/12
-run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character", "deref": ]} <- new/41 {name: "character", value: 0, type: 0, properties: ["character": "literal"]}, {name: "bufsize", value: 6, type: 1, properties: ["bufsize": "integer"]}
+run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character", "deref": ]} <- new/42 {name: "character", value: 0, type: 0, properties: ["character": "literal"]}, {name: "bufsize", value: 6, type: 1, properties: ["bufsize": "integer"]}
 mem/0: location 1007 is 6
 mem/0: array size is 6
 mem/0: new alloc: 1036
@@ -192,11 +192,11 @@ run/0: instruction init-fake-screen/13
 run/0: clear-screen/116 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]}
 mem/0: location 1002 is 1031
 run/0: instruction clear-screen/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1043
 run/0: instruction clear-screen/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1045
 run/0: instruction clear-screen/3
@@ -205,7 +205,7 @@ mem/0: location 1045 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction clear-screen/4
-run/0: {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1045 is 1031
 run/0: ingredient 1 is data
@@ -215,7 +215,7 @@ mem/0: location 1035 is 1036
 run/0: product 0 is 1036
 mem/0: storing 1036 in location 1046
 run/0: instruction clear-screen/5
-run/0: {name: "max", value: 3, type: 1, properties: ["max": "integer"]} <- length/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
+run/0: {name: "max", value: 3, type: 1, properties: ["max": "integer"]} <- length/28 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
 mem/0: location 1046 is 1036
 mem/0: storing 6 in location 1047
 run/0: instruction clear-screen/6
@@ -236,7 +236,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -274,7 +274,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -312,7 +312,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -350,7 +350,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -388,7 +388,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -426,7 +426,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -465,10 +465,10 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 14
 run/0: instruction clear-screen/15
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1045 is 1031
 run/0: instruction init-fake-screen/14
-run/0: reply/32 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -476,15 +476,15 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]} <- print-character/117 {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]}, {name: "97", value: 97, type: 0, properties: ["97": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction print-character/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1074
 run/0: instruction print-character/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1076
 run/0: instruction print-character/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 97
 mem/0: storing 97 in location 1077
 run/0: instruction print-character/4
@@ -493,7 +493,7 @@ mem/0: location 1076 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction print-character/5
-run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1076 is 1031
 run/0: ingredient 1 is cursor-row
@@ -501,7 +501,7 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1078
 run/0: instruction print-character/6
-run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1076 is 1031
 run/0: ingredient 1 is cursor-column
@@ -509,7 +509,7 @@ run/0: address to copy is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1079
 run/0: instruction print-character/7
-run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1076 is 1031
 run/0: ingredient 1 is num-columns
@@ -538,7 +538,7 @@ mem/0: location 1034 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1081
 run/0: instruction print-character/10
-run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1076 is 1031
 run/0: ingredient 1 is data
@@ -548,7 +548,7 @@ mem/0: location 1035 is 1036
 run/0: product 0 is 1036
 mem/0: storing 1036 in location 1082
 run/0: instruction print-character/11
-run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/26 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/27 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1082 is 1036
 run/0: ingredient 1 is {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
@@ -586,7 +586,7 @@ run/0: product 0 is 1
 mem/0: location 1079 is 1034
 mem/0: storing 1 in location 1034
 run/0: instruction print-character/18
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1076 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -594,19 +594,19 @@ run/0: instruction run1001/2
 run/0: {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]} <- move-cursor/120 {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]}, {name: "0", value: 0, type: 0, properties: ["0": "literal", "row": ]}, {name: "0", value: 0, type: 0, properties: ["0": "literal", "column": ]}
 mem/0: location 1 is 1031
 run/0: instruction move-cursor/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1105
 run/0: instruction move-cursor/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1107
 run/0: instruction move-cursor/2
-run/0: {name: "new-row", value: 2, type: 1, properties: ["new-row": "integer"]} <- next-ingredient/29 
+run/0: {name: "new-row", value: 2, type: 1, properties: ["new-row": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 0
 mem/0: storing 0 in location 1108
 run/0: instruction move-cursor/3
-run/0: {name: "new-column", value: 3, type: 1, properties: ["new-column": "integer"]} <- next-ingredient/29 
+run/0: {name: "new-column", value: 3, type: 1, properties: ["new-column": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 0
 mem/0: storing 0 in location 1109
 run/0: instruction move-cursor/5
@@ -615,7 +615,7 @@ mem/0: location 1107 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction move-cursor/6
-run/0: {name: "row", value: 4, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: {name: "row", value: 4, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1107 is 1031
 run/0: ingredient 1 is cursor-row
@@ -629,7 +629,7 @@ mem/0: location 1108 is 0
 mem/0: location 1110 is 1033
 mem/0: storing 0 in location 1033
 run/0: instruction move-cursor/8
-run/0: {name: "column", value: 5, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 5, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1107 is 1031
 run/0: ingredient 1 is cursor-column
@@ -643,7 +643,7 @@ mem/0: location 1109 is 0
 mem/0: location 1111 is 1034
 mem/0: storing 0 in location 1034
 run/0: instruction move-cursor/10
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1107 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -651,11 +651,11 @@ run/0: instruction run1001/3
 run/0: {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]} <- clear-line/118 {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]}
 mem/0: location 1 is 1031
 run/0: instruction clear-line/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1136
 run/0: instruction clear-line/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1138
 run/0: instruction clear-line/3
@@ -664,7 +664,7 @@ mem/0: location 1138 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction clear-line/4
-run/0: {name: "n", value: 2, type: 1, properties: ["n": "integer"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: {name: "n", value: 2, type: 1, properties: ["n": "integer"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1138 is 1031
 run/0: ingredient 1 is num-columns
@@ -674,7 +674,7 @@ mem/0: location 1032 is 3
 run/0: product 0 is 3
 mem/0: storing 3 in location 1139
 run/0: instruction clear-line/5
-run/0: {name: "column", value: 3, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 3, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1138 is 1031
 run/0: ingredient 1 is cursor-column
@@ -705,15 +705,15 @@ run/0: instruction clear-line/10
 run/0: print-character/117 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
 mem/0: location 1138 is 1031
 run/0: instruction print-character/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1167
 run/0: instruction print-character/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1169
 run/0: instruction print-character/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 0
 mem/0: storing 0 in location 1170
 run/0: instruction print-character/4
@@ -722,7 +722,7 @@ mem/0: location 1169 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction print-character/5
-run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1169 is 1031
 run/0: ingredient 1 is cursor-row
@@ -730,7 +730,7 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1171
 run/0: instruction print-character/6
-run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1169 is 1031
 run/0: ingredient 1 is cursor-column
@@ -738,7 +738,7 @@ run/0: address to copy is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1172
 run/0: instruction print-character/7
-run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1169 is 1031
 run/0: ingredient 1 is num-columns
@@ -767,7 +767,7 @@ mem/0: location 1034 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1174
 run/0: instruction print-character/10
-run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1169 is 1031
 run/0: ingredient 1 is data
@@ -777,7 +777,7 @@ mem/0: location 1035 is 1036
 run/0: product 0 is 1036
 mem/0: storing 1036 in location 1175
 run/0: instruction print-character/11
-run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/26 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/27 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1175 is 1036
 run/0: ingredient 1 is {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
@@ -815,7 +815,7 @@ run/0: product 0 is 1
 mem/0: location 1172 is 1034
 mem/0: storing 1 in location 1034
 run/0: instruction print-character/18
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1169 is 1031
 run/0: instruction clear-line/11
 run/0: loop/10 {name: "", value: -4, type: , properties: ["": ]}
@@ -839,15 +839,15 @@ run/0: instruction clear-line/10
 run/0: print-character/117 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
 mem/0: location 1138 is 1031
 run/0: instruction print-character/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1198
 run/0: instruction print-character/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1200
 run/0: instruction print-character/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 0
 mem/0: storing 0 in location 1201
 run/0: instruction print-character/4
@@ -856,7 +856,7 @@ mem/0: location 1200 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction print-character/5
-run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1200 is 1031
 run/0: ingredient 1 is cursor-row
@@ -864,7 +864,7 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1202
 run/0: instruction print-character/6
-run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1200 is 1031
 run/0: ingredient 1 is cursor-column
@@ -872,7 +872,7 @@ run/0: address to copy is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1203
 run/0: instruction print-character/7
-run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1200 is 1031
 run/0: ingredient 1 is num-columns
@@ -901,7 +901,7 @@ mem/0: location 1034 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 1205
 run/0: instruction print-character/10
-run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1200 is 1031
 run/0: ingredient 1 is data
@@ -911,7 +911,7 @@ mem/0: location 1035 is 1036
 run/0: product 0 is 1036
 mem/0: storing 1036 in location 1206
 run/0: instruction print-character/11
-run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/26 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/27 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1206 is 1036
 run/0: ingredient 1 is {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
@@ -949,7 +949,7 @@ run/0: product 0 is 2
 mem/0: location 1203 is 1034
 mem/0: storing 2 in location 1034
 run/0: instruction print-character/18
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1200 is 1031
 run/0: instruction clear-line/11
 run/0: loop/10 {name: "", value: -4, type: , properties: ["": ]}
@@ -973,15 +973,15 @@ run/0: instruction clear-line/10
 run/0: print-character/117 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
 mem/0: location 1138 is 1031
 run/0: instruction print-character/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1229
 run/0: instruction print-character/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1231
 run/0: instruction print-character/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 0
 mem/0: storing 0 in location 1232
 run/0: instruction print-character/4
@@ -990,7 +990,7 @@ mem/0: location 1231 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction print-character/5
-run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1231 is 1031
 run/0: ingredient 1 is cursor-row
@@ -998,7 +998,7 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1233
 run/0: instruction print-character/6
-run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1231 is 1031
 run/0: ingredient 1 is cursor-column
@@ -1006,7 +1006,7 @@ run/0: address to copy is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1234
 run/0: instruction print-character/7
-run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1231 is 1031
 run/0: ingredient 1 is num-columns
@@ -1035,7 +1035,7 @@ mem/0: location 1034 is 2
 run/0: product 0 is 2
 mem/0: storing 2 in location 1236
 run/0: instruction print-character/10
-run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1231 is 1031
 run/0: ingredient 1 is data
@@ -1045,7 +1045,7 @@ mem/0: location 1035 is 1036
 run/0: product 0 is 1036
 mem/0: storing 1036 in location 1237
 run/0: instruction print-character/11
-run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/26 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/27 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1237 is 1036
 run/0: ingredient 1 is {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
@@ -1083,7 +1083,7 @@ run/0: product 0 is 3
 mem/0: location 1234 is 1034
 mem/0: storing 3 in location 1034
 run/0: instruction print-character/18
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1231 is 1031
 run/0: instruction clear-line/11
 run/0: loop/10 {name: "", value: -4, type: , properties: ["": ]}
@@ -1111,12 +1111,12 @@ mem/0: location 1141 is 0
 mem/0: location 1140 is 1034
 mem/0: storing 0 in location 1034
 run/0: instruction clear-line/14
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1138 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction run1001/4
-run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character"]} <- get/23 {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character"]} <- get/24 {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is data
@@ -1144,7 +1144,7 @@ mem/0: storing 0 in location 7
 mem/0: storing 0 in location 8
 mem/0: storing 0 in location 9
 run/0: instruction clear-line-erases-printed-characters/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     3 <- 6  # width*height
     4 <- 0
     5 <- 0
diff --git a/cpp/.traces/closure b/cpp/.traces/closure
index 3ee1eb17..fdec57d7 100644
--- a/cpp/.traces/closure
+++ b/cpp/.traces/closure
@@ -63,13 +63,13 @@ after-brace/0: reply ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction main/1
 run/0: {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]} <- init-counter/1001 
 run/0: instruction init-counter/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1031
 run/0: instruction init-counter/1
@@ -81,18 +81,18 @@ run/0: {name: "y", value: 2, type: 1, properties: ["y": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 3
 mem/0: storing 3 in location 1034
 run/0: instruction init-counter/3
-run/0: reply/32 {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
+run/0: reply/33 {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction main/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer", "raw": ]} <- increment-counter/1002 {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
 mem/0: location 1002 is 1031
 run/0: instruction increment-counter/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "space", value: 0, type: 0, properties: ["space": "literal"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "space", value: 0, type: 0, properties: ["space": "literal"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1062
 run/0: instruction increment-counter/1
-run/0: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "init-counter"]} <- next-ingredient/29 
+run/0: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "init-counter"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1063
 run/0: instruction increment-counter/2
@@ -107,7 +107,7 @@ run/0: {name: "y", value: 1, type: 1, properties: ["y": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 234
 mem/0: storing 234 in location 1064
 run/0: instruction increment-counter/4
-run/0: reply/32 {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]}
+run/0: reply/33 {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]}
 mem/0: location 1034 is 4
 run/0: result 0 is 4
 mem/0: storing 4 in location 2
@@ -115,11 +115,11 @@ run/0: instruction main/3
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer", "raw": ]} <- increment-counter/1002 {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
 mem/0: location 1002 is 1031
 run/0: instruction increment-counter/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "space", value: 0, type: 0, properties: ["space": "literal"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "space", value: 0, type: 0, properties: ["space": "literal"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1093
 run/0: instruction increment-counter/1
-run/0: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "init-counter"]} <- next-ingredient/29 
+run/0: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "init-counter"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1094
 run/0: instruction increment-counter/2
@@ -134,7 +134,7 @@ run/0: {name: "y", value: 1, type: 1, properties: ["y": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 234
 mem/0: storing 234 in location 1095
 run/0: instruction increment-counter/4
-run/0: reply/32 {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]}
+run/0: reply/33 {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]}
 mem/0: location 1034 is 5
 run/0: result 0 is 5
 mem/0: storing 5 in location 3
diff --git a/cpp/.traces/convert_names_transforms_container_elements b/cpp/.traces/convert_names_transforms_container_elements
index ec1ba6a8..4232571c 100644
--- a/cpp/.traces/convert_names_transforms_container_elements
+++ b/cpp/.traces/convert_names_transforms_container_elements
@@ -16,7 +16,7 @@ after-brace/0: get ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: {name: "a", value: 1, type: 1, properties: ["a": "integer"]} <- get/23 {name: "0", value: 0, type: 6, properties: ["0": "point"]}, {name: "y", value: 1, type: 0, properties: ["y": "offset"]}
+run/0: {name: "a", value: 1, type: 1, properties: ["a": "integer"]} <- get/24 {name: "0", value: 0, type: 6, properties: ["0": "point"]}, {name: "y", value: 1, type: 0, properties: ["y": "offset"]}
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is y
 run/0: address to copy is 1
@@ -25,7 +25,7 @@ mem/0: location 1 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1
 run/0: instruction main/1
-run/0: {name: "b", value: 2, type: 1, properties: ["b": "integer"]} <- get/23 {name: "0", value: 0, type: 6, properties: ["0": "point"]}, {name: "x", value: 0, type: 0, properties: ["x": "offset"]}
+run/0: {name: "b", value: 2, type: 1, properties: ["b": "integer"]} <- get/24 {name: "0", value: 0, type: 6, properties: ["0": "point"]}, {name: "x", value: 0, type: 0, properties: ["x": "offset"]}
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is x
 run/0: address to copy is 0
diff --git a/cpp/.traces/deref_sidesteps_default_space_in_get b/cpp/.traces/deref_sidesteps_default_space_in_get
index 3493fccd..c4349bca 100644
--- a/cpp/.traces/deref_sidesteps_default_space_in_get
+++ b/cpp/.traces/deref_sidesteps_default_space_in_get
@@ -46,7 +46,7 @@ run/0: {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point"]} <-
 run/0: ingredient 0 is 12
 mem/0: storing 12 in location 1002
 run/0: instruction main/5
-run/0: {name: "9", value: 9, type: 1, properties: ["9": "integer", "raw": ]} <- get/23 {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "offset"]}
+run/0: {name: "9", value: 9, type: 1, properties: ["9": "integer", "raw": ]} <- get/24 {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1002 is 12
 run/0: ingredient 1 is 1
diff --git a/cpp/.traces/deref_sidesteps_default_space_in_index b/cpp/.traces/deref_sidesteps_default_space_in_index
index a33f3bfe..b18fd64d 100644
--- a/cpp/.traces/deref_sidesteps_default_space_in_index
+++ b/cpp/.traces/deref_sidesteps_default_space_in_index
@@ -54,7 +54,7 @@ run/0: {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"i
 run/0: ingredient 0 is 12
 mem/0: storing 12 in location 1002
 run/0: instruction main/6
-run/0: {name: "9", value: 9, type: 1, properties: ["9": "integer", "raw": ]} <- index/25 {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: {name: "9", value: 9, type: 1, properties: ["9": "integer", "raw": ]} <- index/26 {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"integer", "deref": ]}
 mem/0: location 1002 is 12
 run/0: ingredient 1 is {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
diff --git a/cpp/.traces/first_scenario_in_mu b/cpp/.traces/first_scenario_in_mu
index 46162d13..48ac75b5 100644
--- a/cpp/.traces/first_scenario_in_mu
+++ b/cpp/.traces/first_scenario_in_mu
@@ -16,7 +16,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: first_scenario_in_mu
 run/0: instruction first_scenario_in_mu/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- add 2:literal, 2:literal
   ", value: 0, type: 0, properties: ["
     1:integer <- add 2:literal, 2:literal
@@ -34,7 +34,7 @@ run/0: ingredient 1 is 2
 run/0: product 0 is 4
 mem/0: storing 4 in location 1
 run/0: instruction first_scenario_in_mu/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 4
   ", value: 0, type: 0, properties: ["
     1 <- 4
diff --git a/cpp/.traces/get b/cpp/.traces/get
index c8bf9521..50aab6f2 100644
--- a/cpp/.traces/get
+++ b/cpp/.traces/get
@@ -23,7 +23,7 @@ run/0: {name: "13", value: 13, type: 1, properties: ["13": "integer"]} <- copy/1
 run/0: ingredient 0 is 35
 mem/0: storing 35 in location 13
 run/0: instruction main/2
-run/0: {name: "15", value: 15, type: 1, properties: ["15": "integer"]} <- get/23 {name: "12", value: 12, type: 6, properties: ["12": "point"]}, {name: "1", value: 1, type: 0, properties: ["1": "offset"]}
+run/0: {name: "15", value: 15, type: 1, properties: ["15": "integer"]} <- get/24 {name: "12", value: 12, type: 6, properties: ["12": "point"]}, {name: "1", value: 1, type: 0, properties: ["1": "offset"]}
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 run/0: address to copy is 13
diff --git a/cpp/.traces/get_address b/cpp/.traces/get_address
index 22702857..7182ed20 100644
--- a/cpp/.traces/get_address
+++ b/cpp/.traces/get_address
@@ -23,7 +23,7 @@ run/0: {name: "13", value: 13, type: 1, properties: ["13": "integer"]} <- copy/1
 run/0: ingredient 0 is 35
 mem/0: storing 35 in location 13
 run/0: instruction main/2
-run/0: {name: "15", value: 15, type: 2-1, properties: ["15": "address":"integer"]} <- get-address/24 {name: "12", value: 12, type: 6, properties: ["12": "point"]}, {name: "1", value: 1, type: 0, properties: ["1": "offset"]}
+run/0: {name: "15", value: 15, type: 2-1, properties: ["15": "address":"integer"]} <- get-address/25 {name: "12", value: 12, type: 6, properties: ["12": "point"]}, {name: "1", value: 1, type: 0, properties: ["1": "offset"]}
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 run/0: address to copy is 13
diff --git a/cpp/.traces/get_address_indirect b/cpp/.traces/get_address_indirect
index d986b280..e8c3c850 100644
--- a/cpp/.traces/get_address_indirect
+++ b/cpp/.traces/get_address_indirect
@@ -31,7 +31,7 @@ run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 35
 mem/0: storing 35 in location 3
 run/0: instruction main/3
-run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get-address/24 {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point", "deref": ]}, {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
+run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get-address/25 {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point", "deref": ]}, {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 2
 run/0: ingredient 1 is 0
diff --git a/cpp/.traces/get_handles_nested_container_elements b/cpp/.traces/get_handles_nested_container_elements
index 963b25c1..6ff45ce2 100644
--- a/cpp/.traces/get_handles_nested_container_elements
+++ b/cpp/.traces/get_handles_nested_container_elements
@@ -31,7 +31,7 @@ run/0: {name: "14", value: 14, type: 1, properties: ["14": "integer"]} <- copy/1
 run/0: ingredient 0 is 36
 mem/0: storing 36 in location 14
 run/0: instruction main/3
-run/0: {name: "15", value: 15, type: 1, properties: ["15": "integer"]} <- get/23 {name: "12", value: 12, type: 7, properties: ["12": "point-integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "offset"]}
+run/0: {name: "15", value: 15, type: 1, properties: ["15": "integer"]} <- get/24 {name: "12", value: 12, type: 7, properties: ["12": "point-integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "offset"]}
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 run/0: address to copy is 14
diff --git a/cpp/.traces/get_indirect b/cpp/.traces/get_indirect
index 62c2cdaa..3d176c0c 100644
--- a/cpp/.traces/get_indirect
+++ b/cpp/.traces/get_indirect
@@ -31,7 +31,7 @@ run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 35
 mem/0: storing 35 in location 3
 run/0: instruction main/3
-run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get/23 {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point", "deref": ]}, {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
+run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get/24 {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point", "deref": ]}, {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 2
 run/0: ingredient 1 is 0
diff --git a/cpp/.traces/include_nonderef_properties b/cpp/.traces/include_nonderef_properties
index aa4d3c6b..d7eacc1a 100644
--- a/cpp/.traces/include_nonderef_properties
+++ b/cpp/.traces/include_nonderef_properties
@@ -31,7 +31,7 @@ run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 35
 mem/0: storing 35 in location 3
 run/0: instruction main/3
-run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get/23 {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point", "deref": , "foo": ]}, {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
+run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get/24 {name: "1", value: 1, type: 2-6, properties: ["1": "address":"point", "deref": , "foo": ]}, {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 2
 run/0: ingredient 1 is 0
diff --git a/cpp/.traces/index b/cpp/.traces/index
index 4ba27c97..9653e872 100644
--- a/cpp/.traces/index
+++ b/cpp/.traces/index
@@ -39,7 +39,7 @@ run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 16
 mem/0: storing 16 in location 4
 run/0: instruction main/4
-run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- index/25 {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}, {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- index/26 {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}, {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}
 run/0: ingredient 1 is {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: address to copy is 2
diff --git a/cpp/.traces/index_address b/cpp/.traces/index_address
index 1aaf7fbe..c203603f 100644
--- a/cpp/.traces/index_address
+++ b/cpp/.traces/index_address
@@ -39,7 +39,7 @@ run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 16
 mem/0: storing 16 in location 4
 run/0: instruction main/4
-run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- index-address/26 {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}, {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- index-address/27 {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}, {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: address to copy is 2
diff --git a/cpp/.traces/index_direct_offset b/cpp/.traces/index_direct_offset
index fa0a134a..a20a3d67 100644
--- a/cpp/.traces/index_direct_offset
+++ b/cpp/.traces/index_direct_offset
@@ -47,7 +47,7 @@ run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 5
 run/0: instruction main/5
-run/0: {name: "6", value: 6, type: 1, properties: ["6": "integer"]} <- index/25 {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}, {name: "5", value: 5, type: 1, properties: ["5": "integer"]}
+run/0: {name: "6", value: 6, type: 1, properties: ["6": "integer"]} <- index/26 {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}, {name: "5", value: 5, type: 1, properties: ["5": "integer"]}
 run/0: ingredient 0 is {name: "1", value: 1, type: 5-1, properties: ["1": "array":"integer"]}
 run/0: ingredient 1 is {name: "5", value: 5, type: 1, properties: ["5": "integer"]}
 mem/0: location 5 is 0
diff --git a/cpp/.traces/index_indirect b/cpp/.traces/index_indirect
index e610d675..16489d15 100644
--- a/cpp/.traces/index_indirect
+++ b/cpp/.traces/index_indirect
@@ -47,7 +47,7 @@ run/0: {name: "5", value: 5, type: 2-5-1, properties: ["5": "address":"array":"i
 run/0: ingredient 0 is 1
 mem/0: storing 1 in location 5
 run/0: instruction main/5
-run/0: {name: "6", value: 6, type: 1, properties: ["6": "integer"]} <- index/25 {name: "5", value: 5, type: 2-5-1, properties: ["5": "address":"array":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: {name: "6", value: 6, type: 1, properties: ["6": "integer"]} <- index/26 {name: "5", value: 5, type: 2-5-1, properties: ["5": "address":"array":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is {name: "5", value: 5, type: 2-5-1, properties: ["5": "address":"array":"integer", "deref": ]}
 mem/0: location 5 is 1
 run/0: ingredient 1 is {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
diff --git a/cpp/.traces/ingredient b/cpp/.traces/ingredient
index a2c3f5aa..e2bc1da4 100644
--- a/cpp/.traces/ingredient
+++ b/cpp/.traces/ingredient
@@ -17,9 +17,9 @@ schedule/0: main
 run/0: instruction main/0
 run/0: f/1001 {name: "1", value: 1, type: 0, properties: ["1": "literal"]}, {name: "2", value: 2, type: 0, properties: ["2": "literal"]}
 run/0: instruction f/0
-run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- ingredient/31 {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- ingredient/32 {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: product 0 is 2
 mem/0: storing 2 in location 12
 run/0: instruction f/1
-run/0: {name: "13", value: 13, type: 1, properties: ["13": "integer"]}, {name: "1", value: 1, type: 3, properties: ["1": "boolean"]} <- next-ingredient/29 
+run/0: {name: "13", value: 13, type: 1, properties: ["13": "integer"]}, {name: "1", value: 1, type: 3, properties: ["1": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1
diff --git a/cpp/.traces/integer-to-decimal-digit-negative b/cpp/.traces/integer-to-decimal-digit-negative
index 0f3cc329..069c202f 100644
--- a/cpp/.traces/integer-to-decimal-digit-negative
+++ b/cpp/.traces/integer-to-decimal-digit-negative
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: integer-to-decimal-digit-negative
 run/0: instruction integer-to-decimal-digit-negative/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:array:character/raw <- integer-to-decimal-string -1:literal
     2:array:character/raw <- copy 1:address:array:character/deref/raw
   ", value: 0, type: 0, properties: ["
@@ -41,11 +41,11 @@ after-brace/0: copy ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- integer-to-decimal-string/105 {name: "-1", value: -1, type: 0, properties: ["-1": "literal"]}
 run/0: instruction integer-to-decimal-string/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction integer-to-decimal-string/1
-run/0: {name: "n", value: 1, type: 1, properties: ["n": "integer"]} <- next-ingredient/29 
+run/0: {name: "n", value: 1, type: 1, properties: ["n": "integer"]} <- next-ingredient/30 
 run/0: product 0 is -1
 mem/0: storing -1 in location 1002
 run/0: instruction integer-to-decimal-string/3
@@ -85,15 +85,15 @@ mem/0: storing 1 in location 1002
 run/0: instruction integer-to-decimal-string/14
 run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]} <- init-buffer/101 {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 run/0: instruction init-buffer/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1031
 run/0: instruction init-buffer/1
-run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new/41 {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
+run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new/42 {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
 mem/0: new alloc: 1062
 mem/0: storing 1062 in location 1033
 run/0: instruction init-buffer/2
-run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1033 is 1062
 run/0: ingredient 1 is length
@@ -106,7 +106,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1034 is 1062
 mem/0: storing 0 in location 1062
 run/0: instruction init-buffer/4
-run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address/24 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address/25 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1033 is 1062
 run/0: ingredient 1 is data
@@ -114,18 +114,18 @@ run/0: address to copy is 1063
 run/0: product 0 is 1063
 mem/0: storing 1063 in location 1035
 run/0: instruction init-buffer/5
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 30
 mem/0: storing 30 in location 1036
 run/0: instruction init-buffer/6
-run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1036 is 30
 mem/0: array size is 30
 mem/0: new alloc: 1064
 mem/0: location 1035 is 1063
 mem/0: storing 1064 in location 1063
 run/0: instruction init-buffer/7
-run/0: reply/32 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
 mem/0: location 1033 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1006
@@ -167,30 +167,30 @@ run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"
 mem/0: location 1006 is 1062
 mem/0: location 1010 is 49
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1095
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1097
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 49
 mem/0: storing 49 in location 1098
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1097 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1126
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1128
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1128 is 1062
 run/0: ingredient 1 is length
@@ -200,7 +200,7 @@ mem/0: location 1062 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1129
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1128 is 1062
 run/0: ingredient 1 is data
@@ -210,7 +210,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1130
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1130 is 1064
 mem/0: storing 30 in location 1131
 run/0: instruction buffer-full?/5
@@ -222,7 +222,7 @@ mem/0: location 1131 is 30
 run/0: product 0 is 0
 mem/0: storing 0 in location 1132
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1132 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1099
@@ -233,7 +233,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1097 is 1062
 run/0: ingredient 1 is length
@@ -241,7 +241,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1100
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1097 is 1062
 run/0: ingredient 1 is data
@@ -251,7 +251,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1101
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1101 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -276,7 +276,7 @@ run/0: product 0 is 1
 mem/0: location 1100 is 1062
 mem/0: storing 1 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1097 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1006
@@ -306,30 +306,30 @@ run/0: instruction integer-to-decimal-string/26
 run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]} <- buffer-append/104 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]}, {name: "45", value: 45, type: 0, properties: ["45": "literal"]}
 mem/0: location 1006 is 1062
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1157
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1159
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 45
 mem/0: storing 45 in location 1160
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1159 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1188
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1190
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1190 is 1062
 run/0: ingredient 1 is length
@@ -339,7 +339,7 @@ mem/0: location 1062 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 1191
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1190 is 1062
 run/0: ingredient 1 is data
@@ -349,7 +349,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1192
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1192 is 1064
 mem/0: storing 30 in location 1193
 run/0: instruction buffer-full?/5
@@ -361,7 +361,7 @@ mem/0: location 1193 is 30
 run/0: product 0 is 0
 mem/0: storing 0 in location 1194
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1194 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1161
@@ -372,7 +372,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1159 is 1062
 run/0: ingredient 1 is length
@@ -380,7 +380,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1162
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1159 is 1062
 run/0: ingredient 1 is data
@@ -390,7 +390,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1163
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1163 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -415,12 +415,12 @@ run/0: product 0 is 2
 mem/0: location 1162 is 1062
 mem/0: storing 2 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1159 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1006
 run/0: instruction integer-to-decimal-string/28
-run/0: {name: "len", value: 10, type: 1, properties: ["len": "integer"]} <- get/23 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 10, type: 1, properties: ["len": "integer"]} <- get/24 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is tmp
 mem/0: location 1006 is 1062
 run/0: ingredient 1 is length
@@ -430,7 +430,7 @@ mem/0: location 1062 is 2
 run/0: product 0 is 2
 mem/0: storing 2 in location 1011
 run/0: instruction integer-to-decimal-string/29
-run/0: {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is tmp
 mem/0: location 1006 is 1062
 run/0: ingredient 1 is data
@@ -440,7 +440,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1012
 run/0: instruction integer-to-decimal-string/30
-run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "len", value: 10, type: 1, properties: ["len": "integer"]}
+run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "len", value: 10, type: 1, properties: ["len": "integer"]}
 mem/0: location 1011 is 2
 mem/0: array size is 2
 mem/0: new alloc: 1219
@@ -469,7 +469,7 @@ mem/0: location 1008 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
-run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/25 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
+run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/26 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
@@ -480,7 +480,7 @@ mem/0: location 1066 is 45
 run/0: product 0 is 45
 mem/0: storing 45 in location 1015
 run/0: instruction integer-to-decimal-string/37
-run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
+run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1003 is 1219
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
@@ -525,7 +525,7 @@ mem/0: location 1008 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
-run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/25 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
+run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/26 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
@@ -536,7 +536,7 @@ mem/0: location 1065 is 49
 run/0: product 0 is 49
 mem/0: storing 49 in location 1015
 run/0: instruction integer-to-decimal-string/37
-run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
+run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1003 is 1219
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
@@ -582,7 +582,7 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 42
 run/0: instruction integer-to-decimal-string/43
-run/0: reply/32 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
+run/0: reply/33 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
 mem/0: location 1003 is 1219
 run/0: result 0 is 1219
 mem/0: storing 1219 in location 1
@@ -597,7 +597,7 @@ mem/0: storing 2 in location 2
 mem/0: storing 45 in location 3
 mem/0: storing 49 in location 4
 run/0: instruction integer-to-decimal-digit-negative/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2 <- 2
     3 <- 45  # '-'
     4 <- 49  # '1'
diff --git a/cpp/.traces/integer-to-decimal-digit-positive b/cpp/.traces/integer-to-decimal-digit-positive
index a09aa37a..2c711967 100644
--- a/cpp/.traces/integer-to-decimal-digit-positive
+++ b/cpp/.traces/integer-to-decimal-digit-positive
@@ -18,7 +18,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: integer-to-decimal-digit-positive
 run/0: instruction integer-to-decimal-digit-positive/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:array:character/raw <- integer-to-decimal-string 234:literal
     2:array:character/raw <- copy 1:address:array:character/deref/raw
   ", value: 0, type: 0, properties: ["
@@ -37,11 +37,11 @@ after-brace/0: copy ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- integer-to-decimal-string/105 {name: "234", value: 234, type: 0, properties: ["234": "literal"]}
 run/0: instruction integer-to-decimal-string/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction integer-to-decimal-string/1
-run/0: {name: "n", value: 1, type: 1, properties: ["n": "integer"]} <- next-ingredient/29 
+run/0: {name: "n", value: 1, type: 1, properties: ["n": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 234
 mem/0: storing 234 in location 1002
 run/0: instruction integer-to-decimal-string/3
@@ -70,15 +70,15 @@ run/0: jumping to instruction 13
 run/0: instruction integer-to-decimal-string/14
 run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]} <- init-buffer/101 {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 run/0: instruction init-buffer/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1031
 run/0: instruction init-buffer/1
-run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new/41 {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
+run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new/42 {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
 mem/0: new alloc: 1062
 mem/0: storing 1062 in location 1033
 run/0: instruction init-buffer/2
-run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1033 is 1062
 run/0: ingredient 1 is length
@@ -91,7 +91,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1034 is 1062
 mem/0: storing 0 in location 1062
 run/0: instruction init-buffer/4
-run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address/24 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address/25 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1033 is 1062
 run/0: ingredient 1 is data
@@ -99,18 +99,18 @@ run/0: address to copy is 1063
 run/0: product 0 is 1063
 mem/0: storing 1063 in location 1035
 run/0: instruction init-buffer/5
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/29 
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 30
 mem/0: storing 30 in location 1036
 run/0: instruction init-buffer/6
-run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
+run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1036 is 30
 mem/0: array size is 30
 mem/0: new alloc: 1064
 mem/0: location 1035 is 1063
 mem/0: storing 1064 in location 1063
 run/0: instruction init-buffer/7
-run/0: reply/32 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
 mem/0: location 1033 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1006
@@ -152,30 +152,30 @@ run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"
 mem/0: location 1006 is 1062
 mem/0: location 1010 is 52
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1095
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1097
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 52
 mem/0: storing 52 in location 1098
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1097 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1126
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1128
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1128 is 1062
 run/0: ingredient 1 is length
@@ -185,7 +185,7 @@ mem/0: location 1062 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1129
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1128 is 1062
 run/0: ingredient 1 is data
@@ -195,7 +195,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1130
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1130 is 1064
 mem/0: storing 30 in location 1131
 run/0: instruction buffer-full?/5
@@ -207,7 +207,7 @@ mem/0: location 1131 is 30
 run/0: product 0 is 0
 mem/0: storing 0 in location 1132
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1132 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1099
@@ -218,7 +218,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1097 is 1062
 run/0: ingredient 1 is length
@@ -226,7 +226,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1100
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1097 is 1062
 run/0: ingredient 1 is data
@@ -236,7 +236,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1101
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1101 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -261,7 +261,7 @@ run/0: product 0 is 1
 mem/0: location 1100 is 1062
 mem/0: storing 1 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1097 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1006
@@ -303,30 +303,30 @@ run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"
 mem/0: location 1006 is 1062
 mem/0: location 1010 is 51
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1157
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1159
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 51
 mem/0: storing 51 in location 1160
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1159 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1188
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1190
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1190 is 1062
 run/0: ingredient 1 is length
@@ -336,7 +336,7 @@ mem/0: location 1062 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 1191
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1190 is 1062
 run/0: ingredient 1 is data
@@ -346,7 +346,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1192
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1192 is 1064
 mem/0: storing 30 in location 1193
 run/0: instruction buffer-full?/5
@@ -358,7 +358,7 @@ mem/0: location 1193 is 30
 run/0: product 0 is 0
 mem/0: storing 0 in location 1194
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1194 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1161
@@ -369,7 +369,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1159 is 1062
 run/0: ingredient 1 is length
@@ -377,7 +377,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1162
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1159 is 1062
 run/0: ingredient 1 is data
@@ -387,7 +387,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1163
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1163 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -412,7 +412,7 @@ run/0: product 0 is 2
 mem/0: location 1162 is 1062
 mem/0: storing 2 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1159 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1006
@@ -454,30 +454,30 @@ run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"
 mem/0: location 1006 is 1062
 mem/0: location 1010 is 50
 run/0: instruction buffer-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1219
 run/0: instruction buffer-append/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1221
 run/0: instruction buffer-append/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 50
 mem/0: storing 50 in location 1222
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
 mem/0: location 1221 is 1062
 run/0: instruction buffer-full?/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1250
 run/0: instruction buffer-full?/1
-run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/29 
+run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1252
 run/0: instruction buffer-full?/2
-run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1252 is 1062
 run/0: ingredient 1 is length
@@ -487,7 +487,7 @@ mem/0: location 1062 is 2
 run/0: product 0 is 2
 mem/0: storing 2 in location 1253
 run/0: instruction buffer-full?/3
-run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1252 is 1062
 run/0: ingredient 1 is data
@@ -497,7 +497,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1254
 run/0: instruction buffer-full?/4
-run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/27 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
+run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
 mem/0: location 1254 is 1064
 mem/0: storing 30 in location 1255
 run/0: instruction buffer-full?/5
@@ -509,7 +509,7 @@ mem/0: location 1255 is 30
 run/0: product 0 is 0
 mem/0: storing 0 in location 1256
 run/0: instruction buffer-full?/6
-run/0: reply/32 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
+run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
 mem/0: location 1256 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 1223
@@ -520,7 +520,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
-run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1221 is 1062
 run/0: ingredient 1 is length
@@ -528,7 +528,7 @@ run/0: address to copy is 1062
 run/0: product 0 is 1062
 mem/0: storing 1062 in location 1224
 run/0: instruction buffer-append/9
-run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/23 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
 mem/0: location 1221 is 1062
 run/0: ingredient 1 is data
@@ -538,7 +538,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1225
 run/0: instruction buffer-append/10
-run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
 mem/0: location 1225 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
@@ -563,7 +563,7 @@ run/0: product 0 is 3
 mem/0: location 1224 is 1062
 mem/0: storing 3 in location 1062
 run/0: instruction buffer-append/13
-run/0: reply/32 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
 mem/0: location 1221 is 1062
 run/0: result 0 is 1062
 mem/0: storing 1062 in location 1006
@@ -591,7 +591,7 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 27
 run/0: instruction integer-to-decimal-string/28
-run/0: {name: "len", value: 10, type: 1, properties: ["len": "integer"]} <- get/23 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
+run/0: {name: "len", value: 10, type: 1, properties: ["len": "integer"]} <- get/24 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is tmp
 mem/0: location 1006 is 1062
 run/0: ingredient 1 is length
@@ -601,7 +601,7 @@ mem/0: location 1062 is 3
 run/0: product 0 is 3
 mem/0: storing 3 in location 1011
 run/0: instruction integer-to-decimal-string/29
-run/0: {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is tmp
 mem/0: location 1006 is 1062
 run/0: ingredient 1 is data
@@ -611,7 +611,7 @@ mem/0: location 1063 is 1064
 run/0: product 0 is 1064
 mem/0: storing 1064 in location 1012
 run/0: instruction integer-to-decimal-string/30
-run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "len", value: 10, type: 1, properties: ["len": "integer"]}
+run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "len", value: 10, type: 1, properties: ["len": "integer"]}
 mem/0: location 1011 is 3
 mem/0: array size is 3
 mem/0: new alloc: 1281
@@ -640,7 +640,7 @@ mem/0: location 1008 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
-run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/25 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
+run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/26 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
@@ -651,7 +651,7 @@ mem/0: location 1067 is 50
 run/0: product 0 is 50
 mem/0: storing 50 in location 1015
 run/0: instruction integer-to-decimal-string/37
-run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
+run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1003 is 1281
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
@@ -696,7 +696,7 @@ mem/0: location 1008 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
-run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/25 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
+run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/26 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
@@ -707,7 +707,7 @@ mem/0: location 1066 is 51
 run/0: product 0 is 51
 mem/0: storing 51 in location 1015
 run/0: instruction integer-to-decimal-string/37
-run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
+run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1003 is 1281
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
@@ -752,7 +752,7 @@ mem/0: location 1008 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
-run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/25 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
+run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index/26 {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
@@ -763,7 +763,7 @@ mem/0: location 1065 is 52
 run/0: product 0 is 52
 mem/0: storing 52 in location 1015
 run/0: instruction integer-to-decimal-string/37
-run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/26 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
+run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1003 is 1281
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
@@ -809,7 +809,7 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 42
 run/0: instruction integer-to-decimal-string/43
-run/0: reply/32 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
+run/0: reply/33 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
 mem/0: location 1003 is 1281
 run/0: result 0 is 1281
 mem/0: storing 1281 in location 1
@@ -826,7 +826,7 @@ mem/0: storing 50 in location 3
 mem/0: storing 51 in location 4
 mem/0: storing 52 in location 5
 run/0: instruction integer-to-decimal-digit-positive/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2:string <- [234]
   ", value: 0, type: 0, properties: ["
     2:string <- [234]
diff --git a/cpp/.traces/integer-to-decimal-digit-zero b/cpp/.traces/integer-to-decimal-digit-zero
index 64d5b93d..210d1e48 100644
--- a/cpp/.traces/integer-to-decimal-digit-zero
+++ b/cpp/.traces/integer-to-decimal-digit-zero
@@ -18,7 +18,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: integer-to-decimal-digit-zero
 run/0: instruction integer-to-decimal-digit-zero/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:array:character/raw <- integer-to-decimal-string 0:literal
     2:array:character/raw <- copy 1:address:array:character/deref/raw
   ", value: 0, type: 0, properties: ["
@@ -37,11 +37,11 @@ after-brace/0: copy ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- integer-to-decimal-string/105 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: instruction integer-to-decimal-string/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction integer-to-decimal-string/1
-run/0: {name: "n", value: 1, type: 1, properties: ["n": "integer"]} <- next-ingredient/29 
+run/0: {name: "n", value: 1, type: 1, properties: ["n": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 0
 mem/0: storing 0 in location 1002
 run/0: instruction integer-to-decimal-string/3
@@ -50,10 +50,10 @@ mem/0: location 1002 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/4
-run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/41 {name: "0", value: 0, type: 0, properties: ["0": "literal-string"]}
+run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/42 {name: "0", value: 0, type: 0, properties: ["0": "literal-string"]}
 mem/0: storing 1031 in location 1003
 run/0: instruction integer-to-decimal-string/5
-run/0: reply/32 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
+run/0: reply/33 {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
 mem/0: location 1003 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -66,7 +66,7 @@ mem/0: location 1032 is 48
 mem/0: storing 1 in location 2
 mem/0: storing 48 in location 3
 run/0: instruction integer-to-decimal-digit-zero/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     2:string <- [0]
   ", value: 0, type: 0, properties: ["
     2:string <- [0]
diff --git a/cpp/.traces/interpolate-at-end b/cpp/.traces/interpolate-at-end
index 08c9aa86..8b432ef7 100644
--- a/cpp/.traces/interpolate-at-end
+++ b/cpp/.traces/interpolate-at-end
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: interpolate-at-end
 run/0: instruction interpolate-at-end/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:array:character/raw <- new [hello, _]
     2:address:array:character/raw <- new [abc]
     3:address:array:character/raw <- interpolate 1:address:array:character/raw, 2:address:array:character/raw
@@ -54,25 +54,25 @@ after-brace/0: new ...
 after-brace/0: interpolate ...
 after-brace/0: copy ...
 run/0: instruction run1001/0
-run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- new/41 {name: "hello, _", value: 0, type: 0, properties: ["hello, _": "literal-string"]}
+run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- new/42 {name: "hello, _", value: 0, type: 0, properties: ["hello, _": "literal-string"]}
 mem/0: storing 1000 in location 1
 run/0: instruction run1001/1
-run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]} <- new/41 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
+run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]} <- new/42 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 mem/0: storing 1009 in location 2
 run/0: instruction run1001/2
 run/0: {name: "3", value: 3, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]} <- interpolate/107 {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}, {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 mem/0: location 1 is 1000
 mem/0: location 2 is 1009
 run/0: instruction interpolate/0
-run/0: {name: "default-space", value: 0, type: 5-2-1, properties: ["default-space": "array":"address":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "60", value: 60, type: 0, properties: ["60": "literal"]}
+run/0: {name: "default-space", value: 0, type: 5-2-1, properties: ["default-space": "array":"address":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "60", value: 60, type: 0, properties: ["60": "literal"]}
 mem/0: array size is 60
 mem/0: new alloc: 1013
 run/0: instruction interpolate/1
-run/0: {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1000
 mem/0: storing 1000 in location 1015
 run/0: instruction interpolate/2
-run/0: {name: "tem-len", value: 2, type: 1, properties: ["tem-len": "integer"]} <- length/27 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
+run/0: {name: "tem-len", value: 2, type: 1, properties: ["tem-len": "integer"]} <- length/28 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 mem/0: storing 8 in location 1016
 run/0: instruction interpolate/3
@@ -81,7 +81,7 @@ run/0: ingredient 0 is tem-len
 mem/0: location 1016 is 8
 mem/0: storing 8 in location 1017
 run/0: instruction interpolate/5
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 1009
 mem/0: storing 1009 in location 1018
 mem/0: storing 1 in location 1019
@@ -91,7 +91,7 @@ mem/0: location 1019 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction interpolate/7
-run/0: {name: "a-len", value: 6, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 6, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1018 is 1009
 mem/0: storing 3 in location 1020
 run/0: instruction interpolate/8
@@ -114,7 +114,7 @@ run/0: loop/10 {name: "", value: -6, type: , properties: ["": ]}
 run/0: ingredient 0 is -6
 run/0: jumping to instruction 5
 run/0: instruction interpolate/5
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1019
 run/0: instruction interpolate/6
 run/0: break-unless/12 {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
@@ -123,12 +123,12 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 11
 run/0: instruction interpolate/12
-run/0: rewind-ingredients/30 
+run/0: rewind-ingredients/31 
 run/0: instruction interpolate/13
-run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]} <- next-ingredient/29 
+run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]} <- next-ingredient/30 
 run/0: product 0 is 1000
 run/0: instruction interpolate/14
-run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
+run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
 mem/0: location 1017 is 10
 mem/0: array size is 10
 mem/0: new alloc: 1074
@@ -142,7 +142,7 @@ run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 1023
 run/0: instruction interpolate/18
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 1009
 mem/0: storing 1009 in location 1018
 mem/0: storing 1 in location 1019
@@ -165,7 +165,7 @@ mem/0: location 1024 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -188,7 +188,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -234,7 +234,7 @@ mem/0: location 1024 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -257,7 +257,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -303,7 +303,7 @@ mem/0: location 1024 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -326,7 +326,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -372,7 +372,7 @@ mem/0: location 1024 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -395,7 +395,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -441,7 +441,7 @@ mem/0: location 1024 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -464,7 +464,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -510,7 +510,7 @@ mem/0: location 1024 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -533,7 +533,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -579,7 +579,7 @@ mem/0: location 1024 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -602,7 +602,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -648,7 +648,7 @@ mem/0: location 1024 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -689,7 +689,7 @@ mem/0: location 1029 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1018 is 1009
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -700,7 +700,7 @@ mem/0: location 1010 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1025
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -746,7 +746,7 @@ mem/0: location 1029 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1018 is 1009
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -757,7 +757,7 @@ mem/0: location 1011 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1025
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -803,7 +803,7 @@ mem/0: location 1029 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1018 is 1009
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -814,7 +814,7 @@ mem/0: location 1012 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1025
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -872,7 +872,7 @@ run/0: loop/10 {name: "", value: -27, type: , properties: ["": ]}
 run/0: ingredient 0 is -27
 run/0: jumping to instruction 18
 run/0: instruction interpolate/18
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1019
 run/0: instruction interpolate/19
 run/0: break-unless/12 {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]}, {name: "", value: 25, type: , properties: ["": ]}
@@ -895,7 +895,7 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 55
 run/0: instruction interpolate/56
-run/0: reply/32 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
+run/0: reply/33 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
 mem/0: location 1021 is 1074
 run/0: result 0 is 1074
 mem/0: storing 1074 in location 3
@@ -926,7 +926,7 @@ mem/0: storing 97 in location 12
 mem/0: storing 98 in location 13
 mem/0: storing 99 in location 14
 run/0: instruction interpolate-at-end/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     4:string <- [hello, abc]
   ", value: 0, type: 0, properties: ["
     4:string <- [hello, abc]
diff --git a/cpp/.traces/interpolate-at-start b/cpp/.traces/interpolate-at-start
index faaacb97..f1208a13 100644
--- a/cpp/.traces/interpolate-at-start
+++ b/cpp/.traces/interpolate-at-start
@@ -24,7 +24,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: interpolate-at-start
 run/0: instruction interpolate-at-start/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:array:character/raw <- new [_, hello!]
     2:address:array:character/raw <- new [abc]
     3:address:array:character/raw <- interpolate 1:address:array:character/raw, 2:address:array:character/raw
@@ -56,25 +56,25 @@ after-brace/0: new ...
 after-brace/0: interpolate ...
 after-brace/0: copy ...
 run/0: instruction run1001/0
-run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- new/41 {name: "_, hello!", value: 0, type: 0, properties: ["_, hello!": "literal-string"]}
+run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- new/42 {name: "_, hello!", value: 0, type: 0, properties: ["_, hello!": "literal-string"]}
 mem/0: storing 1000 in location 1
 run/0: instruction run1001/1
-run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]} <- new/41 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
+run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]} <- new/42 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 mem/0: storing 1010 in location 2
 run/0: instruction run1001/2
 run/0: {name: "3", value: 3, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]} <- interpolate/107 {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}, {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 mem/0: location 1 is 1000
 mem/0: location 2 is 1010
 run/0: instruction interpolate/0
-run/0: {name: "default-space", value: 0, type: 5-2-1, properties: ["default-space": "array":"address":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "60", value: 60, type: 0, properties: ["60": "literal"]}
+run/0: {name: "default-space", value: 0, type: 5-2-1, properties: ["default-space": "array":"address":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "60", value: 60, type: 0, properties: ["60": "literal"]}
 mem/0: array size is 60
 mem/0: new alloc: 1014
 run/0: instruction interpolate/1
-run/0: {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1000
 mem/0: storing 1000 in location 1016
 run/0: instruction interpolate/2
-run/0: {name: "tem-len", value: 2, type: 1, properties: ["tem-len": "integer"]} <- length/27 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
+run/0: {name: "tem-len", value: 2, type: 1, properties: ["tem-len": "integer"]} <- length/28 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 mem/0: storing 9 in location 1017
 run/0: instruction interpolate/3
@@ -83,7 +83,7 @@ run/0: ingredient 0 is tem-len
 mem/0: location 1017 is 9
 mem/0: storing 9 in location 1018
 run/0: instruction interpolate/5
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 1010
 mem/0: storing 1010 in location 1019
 mem/0: storing 1 in location 1020
@@ -93,7 +93,7 @@ mem/0: location 1020 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction interpolate/7
-run/0: {name: "a-len", value: 6, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 6, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1010
 mem/0: storing 3 in location 1021
 run/0: instruction interpolate/8
@@ -116,7 +116,7 @@ run/0: loop/10 {name: "", value: -6, type: , properties: ["": ]}
 run/0: ingredient 0 is -6
 run/0: jumping to instruction 5
 run/0: instruction interpolate/5
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1020
 run/0: instruction interpolate/6
 run/0: break-unless/12 {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
@@ -125,12 +125,12 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 11
 run/0: instruction interpolate/12
-run/0: rewind-ingredients/30 
+run/0: rewind-ingredients/31 
 run/0: instruction interpolate/13
-run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]} <- next-ingredient/29 
+run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]} <- next-ingredient/30 
 run/0: product 0 is 1000
 run/0: instruction interpolate/14
-run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
+run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
 mem/0: location 1018 is 11
 mem/0: array size is 11
 mem/0: new alloc: 1075
@@ -144,7 +144,7 @@ run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 1024
 run/0: instruction interpolate/18
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 1010
 mem/0: storing 1010 in location 1019
 mem/0: storing 1 in location 1020
@@ -167,7 +167,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -208,7 +208,7 @@ mem/0: location 1030 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1010
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -219,7 +219,7 @@ mem/0: location 1011 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1026
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -265,7 +265,7 @@ mem/0: location 1030 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1010
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -276,7 +276,7 @@ mem/0: location 1012 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1026
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -322,7 +322,7 @@ mem/0: location 1030 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1010
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -333,7 +333,7 @@ mem/0: location 1013 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1026
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -391,7 +391,7 @@ run/0: loop/10 {name: "", value: -27, type: , properties: ["": ]}
 run/0: ingredient 0 is -27
 run/0: jumping to instruction 18
 run/0: instruction interpolate/18
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1020
 run/0: instruction interpolate/19
 run/0: break-unless/12 {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]}, {name: "", value: 25, type: , properties: ["": ]}
@@ -413,7 +413,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/49
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -424,7 +424,7 @@ mem/0: location 1002 is 44
 run/0: product 0 is 44
 mem/0: storing 44 in location 1026
 run/0: instruction interpolate/50
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -470,7 +470,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/49
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -481,7 +481,7 @@ mem/0: location 1003 is 32
 run/0: product 0 is 32
 mem/0: storing 32 in location 1026
 run/0: instruction interpolate/50
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -527,7 +527,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/49
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -538,7 +538,7 @@ mem/0: location 1004 is 104
 run/0: product 0 is 104
 mem/0: storing 104 in location 1026
 run/0: instruction interpolate/50
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -584,7 +584,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/49
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -595,7 +595,7 @@ mem/0: location 1005 is 101
 run/0: product 0 is 101
 mem/0: storing 101 in location 1026
 run/0: instruction interpolate/50
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -641,7 +641,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/49
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -652,7 +652,7 @@ mem/0: location 1006 is 108
 run/0: product 0 is 108
 mem/0: storing 108 in location 1026
 run/0: instruction interpolate/50
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -698,7 +698,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/49
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -709,7 +709,7 @@ mem/0: location 1007 is 108
 run/0: product 0 is 108
 mem/0: storing 108 in location 1026
 run/0: instruction interpolate/50
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -755,7 +755,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/49
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -766,7 +766,7 @@ mem/0: location 1008 is 111
 run/0: product 0 is 111
 mem/0: storing 111 in location 1026
 run/0: instruction interpolate/50
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -812,7 +812,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/49
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1016 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -823,7 +823,7 @@ mem/0: location 1009 is 33
 run/0: product 0 is 33
 mem/0: storing 33 in location 1026
 run/0: instruction interpolate/50
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -870,7 +870,7 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 55
 run/0: instruction interpolate/56
-run/0: reply/32 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
+run/0: reply/33 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
 mem/0: location 1022 is 1075
 run/0: result 0 is 1075
 mem/0: storing 1075 in location 3
@@ -903,7 +903,7 @@ mem/0: storing 108 in location 13
 mem/0: storing 111 in location 14
 mem/0: storing 33 in location 15
 run/0: instruction interpolate-at-start/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     4:string <- [abc, hello!]
     16 <- 0  # out of bounds
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/interpolate-works b/cpp/.traces/interpolate-works
index a9251adc..5e99215f 100644
--- a/cpp/.traces/interpolate-works
+++ b/cpp/.traces/interpolate-works
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: interpolate-works
 run/0: instruction interpolate-works/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:array:character/raw <- new [abc _]
     2:address:array:character/raw <- new [def]
     3:address:array:character/raw <- interpolate 1:address:array:character/raw, 2:address:array:character/raw
@@ -54,25 +54,25 @@ after-brace/0: new ...
 after-brace/0: interpolate ...
 after-brace/0: copy ...
 run/0: instruction run1001/0
-run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- new/41 {name: "abc _", value: 0, type: 0, properties: ["abc _": "literal-string"]}
+run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- new/42 {name: "abc _", value: 0, type: 0, properties: ["abc _": "literal-string"]}
 mem/0: storing 1000 in location 1
 run/0: instruction run1001/1
-run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]} <- new/41 {name: "def", value: 0, type: 0, properties: ["def": "literal-string"]}
+run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]} <- new/42 {name: "def", value: 0, type: 0, properties: ["def": "literal-string"]}
 mem/0: storing 1006 in location 2
 run/0: instruction run1001/2
 run/0: {name: "3", value: 3, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]} <- interpolate/107 {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}, {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 mem/0: location 1 is 1000
 mem/0: location 2 is 1006
 run/0: instruction interpolate/0
-run/0: {name: "default-space", value: 0, type: 5-2-1, properties: ["default-space": "array":"address":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "60", value: 60, type: 0, properties: ["60": "literal"]}
+run/0: {name: "default-space", value: 0, type: 5-2-1, properties: ["default-space": "array":"address":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "60", value: 60, type: 0, properties: ["60": "literal"]}
 mem/0: array size is 60
 mem/0: new alloc: 1010
 run/0: instruction interpolate/1
-run/0: {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1000
 mem/0: storing 1000 in location 1012
 run/0: instruction interpolate/2
-run/0: {name: "tem-len", value: 2, type: 1, properties: ["tem-len": "integer"]} <- length/27 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
+run/0: {name: "tem-len", value: 2, type: 1, properties: ["tem-len": "integer"]} <- length/28 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1000
 mem/0: storing 5 in location 1013
 run/0: instruction interpolate/3
@@ -81,7 +81,7 @@ run/0: ingredient 0 is tem-len
 mem/0: location 1013 is 5
 mem/0: storing 5 in location 1014
 run/0: instruction interpolate/5
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 1006
 mem/0: storing 1006 in location 1015
 mem/0: storing 1 in location 1016
@@ -91,7 +91,7 @@ mem/0: location 1016 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction interpolate/7
-run/0: {name: "a-len", value: 6, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 6, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1006
 mem/0: storing 3 in location 1017
 run/0: instruction interpolate/8
@@ -114,7 +114,7 @@ run/0: loop/10 {name: "", value: -6, type: , properties: ["": ]}
 run/0: ingredient 0 is -6
 run/0: jumping to instruction 5
 run/0: instruction interpolate/5
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1016
 run/0: instruction interpolate/6
 run/0: break-unless/12 {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
@@ -123,12 +123,12 @@ run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 11
 run/0: instruction interpolate/12
-run/0: rewind-ingredients/30 
+run/0: rewind-ingredients/31 
 run/0: instruction interpolate/13
-run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]} <- next-ingredient/29 
+run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]} <- next-ingredient/30 
 run/0: product 0 is 1000
 run/0: instruction interpolate/14
-run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
+run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
 mem/0: location 1014 is 7
 mem/0: array size is 7
 mem/0: new alloc: 1071
@@ -142,7 +142,7 @@ run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 1020
 run/0: instruction interpolate/18
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 1006
 mem/0: storing 1006 in location 1015
 mem/0: storing 1 in location 1016
@@ -165,7 +165,7 @@ mem/0: location 1021 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -188,7 +188,7 @@ mem/0: location 1023 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -234,7 +234,7 @@ mem/0: location 1021 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -257,7 +257,7 @@ mem/0: location 1023 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -303,7 +303,7 @@ mem/0: location 1021 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -326,7 +326,7 @@ mem/0: location 1023 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -372,7 +372,7 @@ mem/0: location 1021 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -395,7 +395,7 @@ mem/0: location 1023 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/26
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -441,7 +441,7 @@ mem/0: location 1021 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/23
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}, {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "template", value: 1, type: 2-5-4, properties: ["template": "address":"array":"character", "deref": ]}
 mem/0: location 1012 is 1000
 run/0: ingredient 1 is {name: "i", value: 9, type: 1, properties: ["i": "integer"]}
@@ -482,7 +482,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1006
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -493,7 +493,7 @@ mem/0: location 1007 is 100
 run/0: product 0 is 100
 mem/0: storing 100 in location 1022
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -539,7 +539,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1006
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -550,7 +550,7 @@ mem/0: location 1008 is 101
 run/0: product 0 is 101
 mem/0: storing 101 in location 1022
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -596,7 +596,7 @@ mem/0: location 1026 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction interpolate/36
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1015 is 1006
 run/0: ingredient 1 is {name: "j", value: 14, type: 1, properties: ["j": "integer"]}
@@ -607,7 +607,7 @@ mem/0: location 1009 is 102
 run/0: product 0 is 102
 mem/0: storing 102 in location 1022
 run/0: instruction interpolate/37
-run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
@@ -665,7 +665,7 @@ run/0: loop/10 {name: "", value: -27, type: , properties: ["": ]}
 run/0: ingredient 0 is -27
 run/0: jumping to instruction 18
 run/0: instruction interpolate/18
-run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/29 
+run/0: {name: "a", value: 4, type: 2-5-4, properties: ["a": "address":"array":"character"]}, {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1016
 run/0: instruction interpolate/19
 run/0: break-unless/12 {name: "arg-received?", value: 5, type: 3, properties: ["arg-received?": "boolean"]}, {name: "", value: 25, type: , properties: ["": ]}
@@ -688,7 +688,7 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 55
 run/0: instruction interpolate/56
-run/0: reply/32 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
+run/0: reply/33 {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
 mem/0: location 1018 is 1071
 run/0: result 0 is 1071
 mem/0: storing 1071 in location 3
@@ -713,7 +713,7 @@ mem/0: storing 100 in location 9
 mem/0: storing 101 in location 10
 mem/0: storing 102 in location 11
 run/0: instruction interpolate-works/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     4:string <- [abc def]
   ", value: 0, type: 0, properties: ["
     4:string <- [abc def]
diff --git a/cpp/.traces/maybe_convert b/cpp/.traces/maybe_convert
index 0c26557b..5a90d04c 100644
--- a/cpp/.traces/maybe_convert
+++ b/cpp/.traces/maybe_convert
@@ -31,7 +31,7 @@ run/0: {name: "14", value: 14, type: 1, properties: ["14": "integer"]} <- copy/1
 run/0: ingredient 0 is 36
 mem/0: storing 36 in location 14
 run/0: instruction main/3
-run/0: {name: "20", value: 20, type: 2-6, properties: ["20": "address":"point"]} <- maybe-convert/28 {name: "12", value: 12, type: 8, properties: ["12": "integer-or-point"]}, {name: "1", value: 1, type: 0, properties: ["1": "variant"]}
+run/0: {name: "20", value: 20, type: 2-6, properties: ["20": "address":"point"]} <- maybe-convert/29 {name: "12", value: 12, type: 8, properties: ["12": "integer-or-point"]}, {name: "1", value: 1, type: 0, properties: ["1": "variant"]}
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 mem/0: storing 13 in location 20
diff --git a/cpp/.traces/maybe_convert_fail b/cpp/.traces/maybe_convert_fail
index c28c17b3..e925f76c 100644
--- a/cpp/.traces/maybe_convert_fail
+++ b/cpp/.traces/maybe_convert_fail
@@ -31,7 +31,7 @@ run/0: {name: "14", value: 14, type: 1, properties: ["14": "integer"]} <- copy/1
 run/0: ingredient 0 is 36
 mem/0: storing 36 in location 14
 run/0: instruction main/3
-run/0: {name: "20", value: 20, type: 2-6, properties: ["20": "address":"point"]} <- maybe-convert/28 {name: "12", value: 12, type: 8, properties: ["12": "integer-or-point"]}, {name: "0", value: 0, type: 0, properties: ["0": "variant"]}
+run/0: {name: "20", value: 20, type: 2-6, properties: ["20": "address":"point"]} <- maybe-convert/29 {name: "12", value: 12, type: 8, properties: ["12": "integer-or-point"]}, {name: "0", value: 0, type: 0, properties: ["0": "variant"]}
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 0
 mem/0: storing 0 in location 20
diff --git a/cpp/.traces/maybe_convert_named b/cpp/.traces/maybe_convert_named
index 96a6528e..aea23061 100644
--- a/cpp/.traces/maybe_convert_named
+++ b/cpp/.traces/maybe_convert_named
@@ -32,7 +32,7 @@ run/0: {name: "14", value: 14, type: 1, properties: ["14": "integer"]} <- copy/1
 run/0: ingredient 0 is 36
 mem/0: storing 36 in location 14
 run/0: instruction main/3
-run/0: {name: "20", value: 20, type: 2-6, properties: ["20": "address":"point"]} <- maybe-convert/28 {name: "12", value: 12, type: 8, properties: ["12": "integer-or-point"]}, {name: "p", value: 1, type: 0, properties: ["p": "variant"]}
+run/0: {name: "20", value: 20, type: 2-6, properties: ["20": "address":"point"]} <- maybe-convert/29 {name: "12", value: 12, type: 8, properties: ["12": "integer-or-point"]}, {name: "p", value: 1, type: 0, properties: ["p": "variant"]}
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is p
 mem/0: storing 13 in location 20
diff --git a/cpp/.traces/memory_check b/cpp/.traces/memory_check
index 8f112824..5af724c2 100644
--- a/cpp/.traces/memory_check
+++ b/cpp/.traces/memory_check
@@ -9,7 +9,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 13
   ", value: 0, type: 0, properties: ["
     1 <- 13
diff --git a/cpp/.traces/memory_check_multiple b/cpp/.traces/memory_check_multiple
index a90f062b..cc3b17d6 100644
--- a/cpp/.traces/memory_check_multiple
+++ b/cpp/.traces/memory_check_multiple
@@ -11,7 +11,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 0
     1 <- 0
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/memory_check_string b/cpp/.traces/memory_check_string
index 4d878131..dfa06bdd 100644
--- a/cpp/.traces/memory_check_string
+++ b/cpp/.traces/memory_check_string
@@ -41,7 +41,7 @@ run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 99
 mem/0: storing 99 in location 4
 run/0: instruction main/4
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1:string <- [abc]
   ", value: 0, type: 0, properties: ["
     1:string <- [abc]
diff --git a/cpp/.traces/memory_check_string_length b/cpp/.traces/memory_check_string_length
index 2d9759cd..ffcdac6b 100644
--- a/cpp/.traces/memory_check_string_length
+++ b/cpp/.traces/memory_check_string_length
@@ -41,7 +41,7 @@ run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 99
 mem/0: storing 99 in location 4
 run/0: instruction main/4
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1:string <- [ab]
   ", value: 0, type: 0, properties: ["
     1:string <- [ab]
diff --git a/cpp/.traces/new b/cpp/.traces/new
index fddad2e9..cf7869b3 100644
--- a/cpp/.traces/new
+++ b/cpp/.traces/new
@@ -17,11 +17,11 @@ after-brace/0: equal ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer", "raw": ]} <- new/41 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
+run/0: {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer", "raw": ]} <- new/42 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
 mem/0: new alloc: 1000
 mem/0: storing 1000 in location 1
 run/0: instruction main/1
-run/0: {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer", "raw": ]} <- new/41 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
+run/0: {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer", "raw": ]} <- new/42 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
 mem/0: new alloc: 1001
 mem/0: storing 1001 in location 2
 run/0: instruction main/2
diff --git a/cpp/.traces/new_array b/cpp/.traces/new_array
index 44369804..b54be5a0 100644
--- a/cpp/.traces/new_array
+++ b/cpp/.traces/new_array
@@ -18,12 +18,12 @@ after-brace/0: subtract ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"integer", "raw": ]} <- new/41 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}, {name: "5", value: 5, type: 0, properties: ["5": "literal"]}
+run/0: {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"integer", "raw": ]} <- new/42 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}, {name: "5", value: 5, type: 0, properties: ["5": "literal"]}
 mem/0: array size is 5
 mem/0: new alloc: 1000
 mem/0: storing 1000 in location 1
 run/0: instruction main/1
-run/0: {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer", "raw": ]} <- new/41 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
+run/0: {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer", "raw": ]} <- new/42 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
 mem/0: new alloc: 1006
 mem/0: storing 1006 in location 2
 run/0: instruction main/2
diff --git a/cpp/.traces/new_concurrent b/cpp/.traces/new_concurrent
index cf9c8dba..be0d15a9 100644
--- a/cpp/.traces/new_concurrent
+++ b/cpp/.traces/new_concurrent
@@ -21,16 +21,16 @@ after-brace/0: equal ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: f1
 run/0: instruction f1/0
-run/0: start-running/33 {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
+run/0: start-running/34 {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
 run/0: ingredient 0 is f2
 new/0: routine allocated memory from 101000 to 201000
 run/0: instruction f1/1
-run/0: {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer", "raw": ]} <- new/41 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
+run/0: {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer", "raw": ]} <- new/42 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
 mem/0: new alloc: 1000
 mem/0: storing 1000 in location 1
 schedule/0: f2
 run/0: instruction f2/0
-run/0: {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer", "raw": ]} <- new/41 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
+run/0: {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer", "raw": ]} <- new/42 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
 mem/0: new alloc: 101000
 mem/0: storing 101000 in location 2
 run/0: instruction f2/1
diff --git a/cpp/.traces/new_overflow b/cpp/.traces/new_overflow
index 91203b0e..d620bc27 100644
--- a/cpp/.traces/new_overflow
+++ b/cpp/.traces/new_overflow
@@ -12,11 +12,11 @@ after-brace/0: new ...
 new/0: routine allocated memory from 1000 to 1002
 schedule/0: main
 run/0: instruction main/0
-run/0: {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer", "raw": ]} <- new/41 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
+run/0: {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer", "raw": ]} <- new/42 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
 mem/0: new alloc: 1000
 mem/0: storing 1000 in location 1
 run/0: instruction main/1
-run/0: {name: "2", value: 2, type: 2-6, properties: ["2": "address":"point", "raw": ]} <- new/41 {name: "point", value: 6, type: 0, properties: ["point": "type"]}
+run/0: {name: "2", value: 2, type: 2-6, properties: ["2": "address":"point", "raw": ]} <- new/42 {name: "point", value: 6, type: 0, properties: ["point": "type"]}
 new/0: routine allocated memory from 1002 to 1004
 mem/0: new alloc: 1002
 mem/0: storing 1002 in location 2
diff --git a/cpp/.traces/new_string b/cpp/.traces/new_string
index 75357567..b6c939ba 100644
--- a/cpp/.traces/new_string
+++ b/cpp/.traces/new_string
@@ -12,10 +12,10 @@ after-brace/0: index ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character"]} <- new/41 {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
+run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character"]} <- new/42 {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 mem/0: storing 1000 in location 1
 run/0: instruction main/1
-run/0: {name: "2", value: 2, type: 4, properties: ["2": "character"]} <- index/25 {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": ]}, {name: "5", value: 5, type: 0, properties: ["5": "literal"]}
+run/0: {name: "2", value: 2, type: 4, properties: ["2": "character"]} <- index/26 {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": ]}, {name: "5", value: 5, type: 0, properties: ["5": "literal"]}
 run/0: ingredient 0 is {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": ]}
 mem/0: location 1 is 1000
 run/0: ingredient 1 is {name: "5", value: 5, type: 0, properties: ["5": "literal"]}
diff --git a/cpp/.traces/next_ingredient b/cpp/.traces/next_ingredient
index 814f9298..34175e45 100644
--- a/cpp/.traces/next_ingredient
+++ b/cpp/.traces/next_ingredient
@@ -16,7 +16,7 @@ schedule/0: main
 run/0: instruction main/0
 run/0: f/1001 {name: "2", value: 2, type: 0, properties: ["2": "literal"]}
 run/0: instruction f/0
-run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/29 
+run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: storing 2 in location 12
 run/0: instruction f/1
diff --git a/cpp/.traces/next_ingredient_missing b/cpp/.traces/next_ingredient_missing
index f67ee2c5..8d120e20 100644
--- a/cpp/.traces/next_ingredient_missing
+++ b/cpp/.traces/next_ingredient_missing
@@ -11,5 +11,5 @@ schedule/0: main
 run/0: instruction main/0
 run/0: f/1001 
 run/0: instruction f/0
-run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/29 
+run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/30 
 mem/0: storing 0 in location 12
diff --git a/cpp/.traces/print-character-at-top-left b/cpp/.traces/print-character-at-top-left
index 4358d624..83aec2dd 100644
--- a/cpp/.traces/print-character-at-top-left
+++ b/cpp/.traces/print-character-at-top-left
@@ -28,7 +28,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: print-character-at-top-left
 run/0: instruction print-character-at-top-left/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
 #?     $start-tracing #? 3
     1:address:screen <- init-fake-screen 3:literal/width, 2:literal/height
     1:address:screen <- print-character 1:address:screen, 97:literal  # 'a'
@@ -65,15 +65,15 @@ after-brace/0: copy ...
 run/0: instruction run1001/0
 run/0: {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]} <- init-fake-screen/115 {name: "3", value: 3, type: 0, properties: ["3": "literal", "width": ]}, {name: "2", value: 2, type: 0, properties: ["2": "literal", "height": ]}
 run/0: instruction init-fake-screen/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal", "capacity": ]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal", "capacity": ]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-fake-screen/1
-run/0: {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]} <- new/41 {name: "screen", value: 11, type: 0, properties: ["screen": "type"]}
+run/0: {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]} <- new/42 {name: "screen", value: 11, type: 0, properties: ["screen": "type"]}
 mem/0: new alloc: 1031
 mem/0: storing 1031 in location 1002
 run/0: instruction init-fake-screen/2
-run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is num-columns
@@ -81,12 +81,12 @@ run/0: address to copy is 1032
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1003
 run/0: instruction init-fake-screen/3
-run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer", "deref": ]} <- next-ingredient/29 
+run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer", "deref": ]} <- next-ingredient/30 
 run/0: product 0 is 3
 mem/0: location 1003 is 1032
 mem/0: storing 3 in location 1032
 run/0: instruction init-fake-screen/4
-run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-rows", value: 0, type: 0, properties: ["num-rows": "offset"]}
+run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-rows", value: 0, type: 0, properties: ["num-rows": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is num-rows
@@ -94,12 +94,12 @@ run/0: address to copy is 1031
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1004
 run/0: instruction init-fake-screen/5
-run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer", "deref": ]} <- next-ingredient/29 
+run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer", "deref": ]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: location 1004 is 1031
 mem/0: storing 2 in location 1031
 run/0: instruction init-fake-screen/6
-run/0: {name: "row", value: 4, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: {name: "row", value: 4, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is cursor-row
@@ -112,7 +112,7 @@ run/0: ingredient 0 is 0
 mem/0: location 1005 is 1033
 mem/0: storing 0 in location 1033
 run/0: instruction init-fake-screen/8
-run/0: {name: "column", value: 5, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 5, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is cursor-column
@@ -136,7 +136,7 @@ run/0: ingredient 1 is 2
 run/0: product 0 is 6
 mem/0: storing 6 in location 1007
 run/0: instruction init-fake-screen/11
-run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character"]} <- get-address/24 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character"]} <- get-address/25 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
 mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
@@ -144,7 +144,7 @@ run/0: address to copy is 1035
 run/0: product 0 is 1035
 mem/0: storing 1035 in location 1008
 run/0: instruction init-fake-screen/12
-run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character", "deref": ]} <- new/41 {name: "character", value: 0, type: 0, properties: ["character": "literal"]}, {name: "bufsize", value: 6, type: 1, properties: ["bufsize": "integer"]}
+run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character", "deref": ]} <- new/42 {name: "character", value: 0, type: 0, properties: ["character": "literal"]}, {name: "bufsize", value: 6, type: 1, properties: ["bufsize": "integer"]}
 mem/0: location 1007 is 6
 mem/0: array size is 6
 mem/0: new alloc: 1036
@@ -154,11 +154,11 @@ run/0: instruction init-fake-screen/13
 run/0: clear-screen/116 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]}
 mem/0: location 1002 is 1031
 run/0: instruction clear-screen/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1043
 run/0: instruction clear-screen/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1045
 run/0: instruction clear-screen/3
@@ -167,7 +167,7 @@ mem/0: location 1045 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction clear-screen/4
-run/0: {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1045 is 1031
 run/0: ingredient 1 is data
@@ -177,7 +177,7 @@ mem/0: location 1035 is 1036
 run/0: product 0 is 1036
 mem/0: storing 1036 in location 1046
 run/0: instruction clear-screen/5
-run/0: {name: "max", value: 3, type: 1, properties: ["max": "integer"]} <- length/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
+run/0: {name: "max", value: 3, type: 1, properties: ["max": "integer"]} <- length/28 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
 mem/0: location 1046 is 1036
 mem/0: storing 6 in location 1047
 run/0: instruction clear-screen/6
@@ -198,7 +198,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -236,7 +236,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -274,7 +274,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -312,7 +312,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -350,7 +350,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -388,7 +388,7 @@ mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction clear-screen/10
-run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/26 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address/27 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1046 is 1036
 run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
@@ -427,10 +427,10 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 14
 run/0: instruction clear-screen/15
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1045 is 1031
 run/0: instruction init-fake-screen/14
-run/0: reply/32 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]}
+run/0: reply/33 {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]}
 mem/0: location 1002 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
@@ -438,15 +438,15 @@ run/0: instruction run1001/1
 run/0: {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]} <- print-character/117 {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]}, {name: "97", value: 97, type: 0, properties: ["97": "literal"]}
 mem/0: location 1 is 1031
 run/0: instruction print-character/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1074
 run/0: instruction print-character/1
-run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/29 
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1076
 run/0: instruction print-character/2
-run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/29 
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
 run/0: product 0 is 97
 mem/0: storing 97 in location 1077
 run/0: instruction print-character/4
@@ -455,7 +455,7 @@ mem/0: location 1076 is 1031
 run/0: ingredient 0 is 1031
 run/0: jump-unless fell through
 run/0: instruction print-character/5
-run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1076 is 1031
 run/0: ingredient 1 is cursor-row
@@ -463,7 +463,7 @@ run/0: address to copy is 1033
 run/0: product 0 is 1033
 mem/0: storing 1033 in location 1078
 run/0: instruction print-character/6
-run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1076 is 1031
 run/0: ingredient 1 is cursor-column
@@ -471,7 +471,7 @@ run/0: address to copy is 1034
 run/0: product 0 is 1034
 mem/0: storing 1034 in location 1079
 run/0: instruction print-character/7
-run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1076 is 1031
 run/0: ingredient 1 is num-columns
@@ -500,7 +500,7 @@ mem/0: location 1034 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 1081
 run/0: instruction print-character/10
-run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/23 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
 mem/0: location 1076 is 1031
 run/0: ingredient 1 is data
@@ -510,7 +510,7 @@ mem/0: location 1035 is 1036
 run/0: product 0 is 1036
 mem/0: storing 1036 in location 1082
 run/0: instruction print-character/11
-run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/26 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/27 {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
 run/0: ingredient 0 is buf
 mem/0: location 1082 is 1036
 run/0: ingredient 1 is {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
@@ -548,12 +548,12 @@ run/0: product 0 is 1
 mem/0: location 1079 is 1034
 mem/0: storing 1 in location 1034
 run/0: instruction print-character/18
-run/0: reply/32 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
 mem/0: location 1076 is 1031
 run/0: result 0 is 1031
 mem/0: storing 1031 in location 1
 run/0: instruction run1001/2
-run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character"]} <- get/23 {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character"]} <- get/24 {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1031
 run/0: ingredient 1 is data
@@ -581,7 +581,7 @@ mem/0: storing 0 in location 7
 mem/0: storing 0 in location 8
 mem/0: storing 0 in location 9
 run/0: instruction print-character-at-top-left/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     3 <- 6  # width*height
     4 <- 97  # 'a'
     5 <- 0
diff --git a/cpp/.traces/reply b/cpp/.traces/reply
index 5a7c9e81..6ac4c162 100644
--- a/cpp/.traces/reply
+++ b/cpp/.traces/reply
@@ -22,7 +22,7 @@ schedule/0: main
 run/0: instruction main/0
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]}, {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- f/1001 {name: "2", value: 2, type: 0, properties: ["2": "literal"]}
 run/0: instruction f/0
-run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/29 
+run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: storing 2 in location 12
 run/0: instruction f/1
@@ -33,7 +33,7 @@ mem/0: location 12 is 2
 run/0: product 0 is 3
 mem/0: storing 3 in location 13
 run/0: instruction f/2
-run/0: reply/32 {name: "12", value: 12, type: 1, properties: ["12": "integer"]}, {name: "13", value: 13, type: 1, properties: ["13": "integer"]}
+run/0: reply/33 {name: "12", value: 12, type: 1, properties: ["12": "integer"]}, {name: "13", value: 13, type: 1, properties: ["13": "integer"]}
 mem/0: location 12 is 2
 mem/0: location 13 is 3
 run/0: result 0 is 2
diff --git a/cpp/.traces/reply_container b/cpp/.traces/reply_container
index beaaab68..693f984d 100644
--- a/cpp/.traces/reply_container
+++ b/cpp/.traces/reply_container
@@ -19,7 +19,7 @@ schedule/0: main
 run/0: instruction main/0
 run/0: {name: "3", value: 3, type: 6, properties: ["3": "point"]} <- f/1001 {name: "2", value: 2, type: 0, properties: ["2": "literal"]}
 run/0: instruction f/0
-run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/29 
+run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: storing 2 in location 12
 run/0: instruction f/1
@@ -27,7 +27,7 @@ run/0: {name: "13", value: 13, type: 1, properties: ["13": "integer"]} <- copy/1
 run/0: ingredient 0 is 35
 mem/0: storing 35 in location 13
 run/0: instruction f/2
-run/0: reply/32 {name: "12", value: 12, type: 6, properties: ["12": "point"]}
+run/0: reply/33 {name: "12", value: 12, type: 6, properties: ["12": "point"]}
 mem/0: location 12 is 2
 mem/0: location 13 is 35
 run/0: result 0 is [2, 35]
diff --git a/cpp/.traces/reply_same_as_ingredient b/cpp/.traces/reply_same_as_ingredient
index 6c030bd3..7a2c81bd 100644
--- a/cpp/.traces/reply_same_as_ingredient
+++ b/cpp/.traces/reply_same_as_ingredient
@@ -18,18 +18,18 @@ after-brace/0: reply ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer"]} <- new/41 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
+run/0: {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer"]} <- new/42 {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
 mem/0: new alloc: 1000
 mem/0: storing 1000 in location 1
 run/0: instruction main/1
 run/0: {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer"]} <- test1/1001 {name: "1", value: 1, type: 2-1, properties: ["1": "address":"integer"]}
 mem/0: location 1 is 1000
 run/0: instruction test1/0
-run/0: {name: "10", value: 10, type: 2-1, properties: ["10": "address":"integer"]} <- next-ingredient/29 
+run/0: {name: "10", value: 10, type: 2-1, properties: ["10": "address":"integer"]} <- next-ingredient/30 
 run/0: product 0 is 1000
 mem/0: storing 1000 in location 10
 run/0: instruction test1/1
-run/0: reply/32 {name: "10", value: 10, type: 2-1, properties: ["10": "address":"integer", "same-as-ingredient": "0"]}
+run/0: reply/33 {name: "10", value: 10, type: 2-1, properties: ["10": "address":"integer", "same-as-ingredient": "0"]}
 mem/0: location 10 is 1000
 run/0: result 0 is 1000
 warn/0: 'same-as-ingredient' result 2 must be location 1
diff --git a/cpp/.traces/rewind_ingredients b/cpp/.traces/rewind_ingredients
index 7e01e4f3..4c7b4159 100644
--- a/cpp/.traces/rewind_ingredients
+++ b/cpp/.traces/rewind_ingredients
@@ -21,16 +21,16 @@ schedule/0: main
 run/0: instruction main/0
 run/0: f/1001 {name: "2", value: 2, type: 0, properties: ["2": "literal"]}
 run/0: instruction f/0
-run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/29 
+run/0: {name: "12", value: 12, type: 1, properties: ["12": "integer"]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: storing 2 in location 12
 run/0: instruction f/1
-run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 3, properties: ["1": "boolean"]} <- next-ingredient/29 
+run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 3, properties: ["1": "boolean"]} <- next-ingredient/30 
 mem/0: storing 0 in location 1
 run/0: instruction f/2
-run/0: rewind-ingredients/30 
+run/0: rewind-ingredients/31 
 run/0: instruction f/3
-run/0: {name: "13", value: 13, type: 1, properties: ["13": "integer"]}, {name: "2", value: 2, type: 3, properties: ["2": "boolean"]} <- next-ingredient/29 
+run/0: {name: "13", value: 13, type: 1, properties: ["13": "integer"]}, {name: "2", value: 2, type: 3, properties: ["2": "boolean"]} <- next-ingredient/30 
 run/0: product 0 is 2
 mem/0: storing 2 in location 13
 mem/0: storing 1 in location 2
diff --git a/cpp/.traces/run b/cpp/.traces/run
index f8480ccb..aa5d941a 100644
--- a/cpp/.traces/run
+++ b/cpp/.traces/run
@@ -9,7 +9,7 @@ after-brace/0: run ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- copy 13:literal
   ", value: 0, type: 0, properties: ["
     1:integer <- copy 13:literal
diff --git a/cpp/.traces/run_multiple b/cpp/.traces/run_multiple
index 6d11353c..ca2e9a0e 100644
--- a/cpp/.traces/run_multiple
+++ b/cpp/.traces/run_multiple
@@ -16,7 +16,7 @@ after-brace/0: run ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- copy 13:literal
   ", value: 0, type: 0, properties: ["
     1:integer <- copy 13:literal
@@ -31,7 +31,7 @@ run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 13
 mem/0: storing 13 in location 1
 run/0: instruction main/1
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     2:integer <- copy 13:literal
   ", value: 0, type: 0, properties: ["
     2:integer <- copy 13:literal
diff --git a/cpp/.traces/scenario_block b/cpp/.traces/scenario_block
index b57ef92d..270bb7a3 100644
--- a/cpp/.traces/scenario_block
+++ b/cpp/.traces/scenario_block
@@ -16,7 +16,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: foo
 run/0: instruction foo/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- copy 13:literal
   ", value: 0, type: 0, properties: ["
     1:integer <- copy 13:literal
@@ -31,7 +31,7 @@ run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 13
 mem/0: storing 13 in location 1
 run/0: instruction foo/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 13
   ", value: 0, type: 0, properties: ["
     1 <- 13
diff --git a/cpp/.traces/scenario_check_memory_and_trace b/cpp/.traces/scenario_check_memory_and_trace
index 8eceb1a5..4f14246f 100644
--- a/cpp/.traces/scenario_check_memory_and_trace
+++ b/cpp/.traces/scenario_check_memory_and_trace
@@ -32,7 +32,7 @@ after-brace/0: trace-should-not-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: foo
 run/0: instruction foo/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- copy 13:literal
     trace [a], [a b c]
   ", value: 0, type: 0, properties: ["
@@ -56,20 +56,20 @@ run/0: instruction run1001/1
 run/0: trace/18 {name: "a", value: 0, type: 0, properties: ["a": "literal-string"]}, {name: "a b c", value: 0, type: 0, properties: ["a b c": "literal-string"]}
 a/0: a b c
 run/0: instruction foo/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 13
   ", value: 0, type: 0, properties: ["
     1 <- 13
   ": "literal-string"]}
 run/0: checking location 1
 run/0: instruction foo/2
-run/0: trace-should-contain/44 {name: "
+run/0: trace-should-contain/45 {name: "
     a: a b c
   ", value: 0, type: 0, properties: ["
     a: a b c
   ": "literal-string"]}
 run/0: instruction foo/3
-run/0: trace-should-not-contain/45 {name: "
+run/0: trace-should-not-contain/46 {name: "
     a: x y z
   ", value: 0, type: 0, properties: ["
     a: x y z
diff --git a/cpp/.traces/scenario_multiple_blocks b/cpp/.traces/scenario_multiple_blocks
index e627fdb7..ff26c7d9 100644
--- a/cpp/.traces/scenario_multiple_blocks
+++ b/cpp/.traces/scenario_multiple_blocks
@@ -32,7 +32,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: foo
 run/0: instruction foo/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:integer <- copy 13:literal
   ", value: 0, type: 0, properties: ["
     1:integer <- copy 13:literal
@@ -47,14 +47,14 @@ run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 13
 mem/0: storing 13 in location 1
 run/0: instruction foo/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 13
   ", value: 0, type: 0, properties: ["
     1 <- 13
   ": "literal-string"]}
 run/0: checking location 1
 run/0: instruction foo/2
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     2:integer <- copy 13:literal
   ", value: 0, type: 0, properties: ["
     2:integer <- copy 13:literal
@@ -69,7 +69,7 @@ run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 13
 mem/0: storing 13 in location 2
 run/0: instruction foo/3
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 13
     2 <- 13
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/scenario_with_comment_in_mu b/cpp/.traces/scenario_with_comment_in_mu
index 57fe0aae..7d8aed06 100644
--- a/cpp/.traces/scenario_with_comment_in_mu
+++ b/cpp/.traces/scenario_with_comment_in_mu
@@ -18,7 +18,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: scenario_with_comment_in_mu
 run/0: instruction scenario_with_comment_in_mu/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     # comment
     1:integer <- add 2:literal, 2:literal
   ", value: 0, type: 0, properties: ["
@@ -38,7 +38,7 @@ run/0: ingredient 1 is 2
 run/0: product 0 is 4
 mem/0: storing 4 in location 1
 run/0: instruction scenario_with_comment_in_mu/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 4
   ", value: 0, type: 0, properties: ["
     1 <- 4
diff --git a/cpp/.traces/scenario_with_multiple_comments_in_mu b/cpp/.traces/scenario_with_multiple_comments_in_mu
index 55079205..21207ace 100644
--- a/cpp/.traces/scenario_with_multiple_comments_in_mu
+++ b/cpp/.traces/scenario_with_multiple_comments_in_mu
@@ -20,7 +20,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: scenario_with_multiple_comments_in_mu
 run/0: instruction scenario_with_multiple_comments_in_mu/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     # comment1
     # comment2
     1:integer <- add 2:literal, 2:literal
@@ -42,7 +42,7 @@ run/0: ingredient 1 is 2
 run/0: product 0 is 4
 mem/0: storing 4 in location 1
 run/0: instruction scenario_with_multiple_comments_in_mu/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     1 <- 4
   ", value: 0, type: 0, properties: ["
     1 <- 4
diff --git a/cpp/.traces/scheduler b/cpp/.traces/scheduler
index ea78689e..4f1f0a31 100644
--- a/cpp/.traces/scheduler
+++ b/cpp/.traces/scheduler
@@ -14,7 +14,7 @@ after-brace/0: copy ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: f1
 run/0: instruction f1/0
-run/0: start-running/33 {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
+run/0: start-running/34 {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
 run/0: ingredient 0 is f2
 new/0: routine allocated memory from 101000 to 201000
 run/0: instruction f1/1
diff --git a/cpp/.traces/scheduler_interleaves_routines b/cpp/.traces/scheduler_interleaves_routines
index 152ef18f..a9d4a4fb 100644
--- a/cpp/.traces/scheduler_interleaves_routines
+++ b/cpp/.traces/scheduler_interleaves_routines
@@ -22,7 +22,7 @@ after-brace/0: copy ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: f1
 run/0: instruction f1/0
-run/0: start-running/33 {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
+run/0: start-running/34 {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
 run/0: ingredient 0 is f2
 new/0: routine allocated memory from 101000 to 201000
 schedule/0: f2
diff --git a/cpp/.traces/string-append-1 b/cpp/.traces/string-append-1
index 8b514403..97dec546 100644
--- a/cpp/.traces/string-append-1
+++ b/cpp/.traces/string-append-1
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: string-append-1
 run/0: instruction string-append-1/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     1:address:array:character/raw <- new [hello,]
     2:address:array:character/raw <- new [ world!]
     3:address:array:character/raw <- string-append 1:address:array:character/raw, 2:address:array:character/raw
@@ -54,33 +54,33 @@ after-brace/0: new ...
 after-brace/0: string-append ...
 after-brace/0: copy ...
 run/0: instruction run1001/0
-run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- new/41 {name: "hello,", value: 0, type: 0, properties: ["hello,": "literal-string"]}
+run/0: {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]} <- new/42 {name: "hello,", value: 0, type: 0, properties: ["hello,": "literal-string"]}
 mem/0: storing 1000 in location 1
 run/0: instruction run1001/1
-run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]} <- new/41 {name: " world!", value: 0, type: 0, properties: [" world!": "literal-string"]}
+run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]} <- new/42 {name: " world!", value: 0, type: 0, properties: [" world!": "literal-string"]}
 mem/0: storing 1007 in location 2
 run/0: instruction run1001/2
 run/0: {name: "3", value: 3, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]} <- string-append/106 {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}, {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 mem/0: location 1 is 1000
 mem/0: location 2 is 1007
 run/0: instruction string-append/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1015
 run/0: instruction string-append/1
-run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1000
 mem/0: storing 1000 in location 1017
 run/0: instruction string-append/2
-run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1017 is 1000
 mem/0: storing 6 in location 1018
 run/0: instruction string-append/3
-run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1007
 mem/0: storing 1007 in location 1019
 run/0: instruction string-append/4
-run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/27 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/28 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1007
 mem/0: storing 7 in location 1020
 run/0: instruction string-append/5
@@ -92,7 +92,7 @@ mem/0: location 1020 is 7
 run/0: product 0 is 13
 mem/0: storing 13 in location 1021
 run/0: instruction string-append/6
-run/0: {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/41 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 5, type: 1, properties: ["result-len": "integer"]}
+run/0: {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new/42 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 5, type: 1, properties: ["result-len": "integer"]}
 mem/0: location 1021 is 13
 mem/0: array size is 13
 mem/0: new alloc: 1046
@@ -119,7 +119,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/12
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -128,7 +128,7 @@ run/0: address to copy is 1047
 run/0: product 0 is 1047
 mem/0: storing 1047 in location 1026
 run/0: instruction string-append/13
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1017 is 1000
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -176,7 +176,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/12
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -185,7 +185,7 @@ run/0: address to copy is 1048
 run/0: product 0 is 1048
 mem/0: storing 1048 in location 1026
 run/0: instruction string-append/13
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1017 is 1000
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -233,7 +233,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/12
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -242,7 +242,7 @@ run/0: address to copy is 1049
 run/0: product 0 is 1049
 mem/0: storing 1049 in location 1026
 run/0: instruction string-append/13
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1017 is 1000
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -290,7 +290,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/12
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -299,7 +299,7 @@ run/0: address to copy is 1050
 run/0: product 0 is 1050
 mem/0: storing 1050 in location 1026
 run/0: instruction string-append/13
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1017 is 1000
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -347,7 +347,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/12
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -356,7 +356,7 @@ run/0: address to copy is 1051
 run/0: product 0 is 1051
 mem/0: storing 1051 in location 1026
 run/0: instruction string-append/13
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1017 is 1000
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -404,7 +404,7 @@ mem/0: location 1025 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/12
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -413,7 +413,7 @@ run/0: address to copy is 1052
 run/0: product 0 is 1052
 mem/0: storing 1052 in location 1026
 run/0: instruction string-append/13
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1017 is 1000
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -479,7 +479,7 @@ mem/0: location 1028 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/23
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -488,7 +488,7 @@ run/0: address to copy is 1053
 run/0: product 0 is 1053
 mem/0: storing 1053 in location 1026
 run/0: instruction string-append/24
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1007
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -536,7 +536,7 @@ mem/0: location 1028 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/23
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -545,7 +545,7 @@ run/0: address to copy is 1054
 run/0: product 0 is 1054
 mem/0: storing 1054 in location 1026
 run/0: instruction string-append/24
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1007
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -593,7 +593,7 @@ mem/0: location 1028 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/23
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -602,7 +602,7 @@ run/0: address to copy is 1055
 run/0: product 0 is 1055
 mem/0: storing 1055 in location 1026
 run/0: instruction string-append/24
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1007
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -650,7 +650,7 @@ mem/0: location 1028 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/23
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -659,7 +659,7 @@ run/0: address to copy is 1056
 run/0: product 0 is 1056
 mem/0: storing 1056 in location 1026
 run/0: instruction string-append/24
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1007
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -707,7 +707,7 @@ mem/0: location 1028 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/23
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -716,7 +716,7 @@ run/0: address to copy is 1057
 run/0: product 0 is 1057
 mem/0: storing 1057 in location 1026
 run/0: instruction string-append/24
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1007
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -764,7 +764,7 @@ mem/0: location 1028 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/23
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -773,7 +773,7 @@ run/0: address to copy is 1058
 run/0: product 0 is 1058
 mem/0: storing 1058 in location 1026
 run/0: instruction string-append/24
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1007
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -821,7 +821,7 @@ mem/0: location 1028 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-append/23
-run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/26 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
+run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address/27 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
 mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
@@ -830,7 +830,7 @@ run/0: address to copy is 1059
 run/0: product 0 is 1059
 mem/0: storing 1059 in location 1026
 run/0: instruction string-append/24
-run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1019 is 1007
 run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
@@ -879,7 +879,7 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 29
 run/0: instruction string-append/30
-run/0: reply/32 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character"]}
+run/0: reply/33 {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character"]}
 mem/0: location 1022 is 1046
 run/0: result 0 is 1046
 mem/0: storing 1046 in location 3
@@ -916,7 +916,7 @@ mem/0: storing 108 in location 15
 mem/0: storing 100 in location 16
 mem/0: storing 33 in location 17
 run/0: instruction string-append-1/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     4:string <- [hello, world!]
   ", value: 0, type: 0, properties: ["
     4:string <- [hello, world!]
diff --git a/cpp/.traces/string-equal-common-lengths-but-distinct b/cpp/.traces/string-equal-common-lengths-but-distinct
index de6e94aa..164277bf 100644
--- a/cpp/.traces/string-equal-common-lengths-but-distinct
+++ b/cpp/.traces/string-equal-common-lengths-but-distinct
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: string-equal-common-lengths-but-distinct
 run/0: instruction string-equal-common-lengths-but-distinct/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     default-space:address:array:location <- new location:type, 30:literal
     x:address:array:character <- new [abc]
     y:address:array:character <- new [abd]
@@ -58,37 +58,37 @@ after-brace/0: new ...
 after-brace/0: new ...
 after-brace/0: string-equal ...
 run/0: instruction run1001/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction run1001/1
-run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/41 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
+run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/42 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 mem/0: storing 1031 in location 1002
 run/0: instruction run1001/2
-run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new/41 {name: "abd", value: 0, type: 0, properties: ["abd": "literal-string"]}
+run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new/42 {name: "abd", value: 0, type: 0, properties: ["abd": "literal-string"]}
 mem/0: storing 1035 in location 1003
 run/0: instruction run1001/3
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal/100 {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 mem/0: location 1002 is 1031
 mem/0: location 1003 is 1035
 run/0: instruction string-equal/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1039
 run/0: instruction string-equal/1
-run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1041
 run/0: instruction string-equal/2
-run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1031
 mem/0: storing 3 in location 1042
 run/0: instruction string-equal/3
-run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1035
 mem/0: storing 1035 in location 1043
 run/0: instruction string-equal/4
-run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/27 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/28 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1043 is 1035
 mem/0: storing 3 in location 1044
 run/0: instruction string-equal/6
@@ -129,7 +129,7 @@ mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -140,7 +140,7 @@ mem/0: location 1032 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1048
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -189,7 +189,7 @@ mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -200,7 +200,7 @@ mem/0: location 1033 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1048
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -249,7 +249,7 @@ mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -260,7 +260,7 @@ mem/0: location 1034 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1048
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -284,11 +284,11 @@ mem/0: location 1050 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/21
-run/0: reply/32 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: reply/33 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
 run/0: instruction string-equal-common-lengths-but-distinct/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     3 <- 0  # abc != abd
   ", value: 0, type: 0, properties: ["
     3 <- 0  # abc != abd
diff --git a/cpp/.traces/string-equal-distinct-lengths b/cpp/.traces/string-equal-distinct-lengths
index 72b419f9..7a8ac7c6 100644
--- a/cpp/.traces/string-equal-distinct-lengths
+++ b/cpp/.traces/string-equal-distinct-lengths
@@ -36,7 +36,7 @@ after-brace/0: trace-should-not-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: string-equal-distinct-lengths
 run/0: instruction string-equal-distinct-lengths/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     default-space:address:array:location <- new location:type, 30:literal
     x:address:array:character <- new [abc]
     y:address:array:character <- new [abcd]
@@ -72,37 +72,37 @@ after-brace/0: new ...
 after-brace/0: new ...
 after-brace/0: string-equal ...
 run/0: instruction run1001/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction run1001/1
-run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/41 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
+run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/42 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 mem/0: storing 1031 in location 1002
 run/0: instruction run1001/2
-run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new/41 {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
+run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new/42 {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
 mem/0: storing 1035 in location 1003
 run/0: instruction run1001/3
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal/100 {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 mem/0: location 1002 is 1031
 mem/0: location 1003 is 1035
 run/0: instruction string-equal/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1040
 run/0: instruction string-equal/1
-run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1042
 run/0: instruction string-equal/2
-run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1042 is 1031
 mem/0: storing 3 in location 1043
 run/0: instruction string-equal/3
-run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1035
 mem/0: storing 1035 in location 1044
 run/0: instruction string-equal/4
-run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/27 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/28 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1044 is 1035
 mem/0: storing 4 in location 1045
 run/0: instruction string-equal/6
@@ -122,24 +122,24 @@ mem/0: location 1046 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/9
-run/0: reply/32 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: reply/33 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
 run/0: instruction string-equal-distinct-lengths/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     3 <- 0  # abc != abcd
   ", value: 0, type: 0, properties: ["
     3 <- 0  # abc != abcd
   ": "literal-string"]}
 run/0: checking location 3
 run/0: instruction string-equal-distinct-lengths/2
-run/0: trace-should-contain/44 {name: "
+run/0: trace-should-contain/45 {name: "
     string-equal: comparing lengths
   ", value: 0, type: 0, properties: ["
     string-equal: comparing lengths
   ": "literal-string"]}
 run/0: instruction string-equal-distinct-lengths/3
-run/0: trace-should-not-contain/45 {name: "
+run/0: trace-should-not-contain/46 {name: "
     string-equal: comparing characters
   ", value: 0, type: 0, properties: ["
     string-equal: comparing characters
diff --git a/cpp/.traces/string-equal-identical b/cpp/.traces/string-equal-identical
index 254f7617..1bd96899 100644
--- a/cpp/.traces/string-equal-identical
+++ b/cpp/.traces/string-equal-identical
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: string-equal-identical
 run/0: instruction string-equal-identical/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     default-space:address:array:location <- new location:type, 30:literal
     x:address:array:character <- new [abc]
     y:address:array:character <- new [abc]
@@ -58,37 +58,37 @@ after-brace/0: new ...
 after-brace/0: new ...
 after-brace/0: string-equal ...
 run/0: instruction run1001/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction run1001/1
-run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/41 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
+run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/42 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 mem/0: storing 1031 in location 1002
 run/0: instruction run1001/2
-run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new/41 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
+run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new/42 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 mem/0: storing 1035 in location 1003
 run/0: instruction run1001/3
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal/100 {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 mem/0: location 1002 is 1031
 mem/0: location 1003 is 1035
 run/0: instruction string-equal/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1039
 run/0: instruction string-equal/1
-run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1041
 run/0: instruction string-equal/2
-run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1031
 mem/0: storing 3 in location 1042
 run/0: instruction string-equal/3
-run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1035
 mem/0: storing 1035 in location 1043
 run/0: instruction string-equal/4
-run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/27 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/28 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1043 is 1035
 mem/0: storing 3 in location 1044
 run/0: instruction string-equal/6
@@ -129,7 +129,7 @@ mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -140,7 +140,7 @@ mem/0: location 1032 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1048
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -189,7 +189,7 @@ mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -200,7 +200,7 @@ mem/0: location 1033 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1048
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -249,7 +249,7 @@ mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -260,7 +260,7 @@ mem/0: location 1034 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1048
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -310,11 +310,11 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 25
 run/0: instruction string-equal/26
-run/0: reply/32 {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: reply/33 {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: result 0 is 1
 mem/0: storing 1 in location 3
 run/0: instruction string-equal-identical/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     3 <- 1  # abc == abc
   ", value: 0, type: 0, properties: ["
     3 <- 1  # abc == abc
diff --git a/cpp/.traces/string-equal-reflexive b/cpp/.traces/string-equal-reflexive
index b8e8a7c3..4b440cfe 100644
--- a/cpp/.traces/string-equal-reflexive
+++ b/cpp/.traces/string-equal-reflexive
@@ -20,7 +20,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: string-equal-reflexive
 run/0: instruction string-equal-reflexive/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     default-space:address:array:location <- new location:type, 30:literal
     x:address:array:character <- new [abc]
     3:boolean/raw <- string-equal x:address:array:character, x:address:array:character
@@ -48,34 +48,34 @@ after-brace/0: new ...
 after-brace/0: new ...
 after-brace/0: string-equal ...
 run/0: instruction run1001/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction run1001/1
-run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/41 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
+run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/42 {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 mem/0: storing 1031 in location 1002
 run/0: instruction run1001/2
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal/100 {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 mem/0: location 1002 is 1031
 mem/0: location 1002 is 1031
 run/0: instruction string-equal/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1035
 run/0: instruction string-equal/1
-run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1037
 run/0: instruction string-equal/2
-run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1037 is 1031
 mem/0: storing 3 in location 1038
 run/0: instruction string-equal/3
-run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1039
 run/0: instruction string-equal/4
-run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/27 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/28 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1039 is 1031
 mem/0: storing 3 in location 1040
 run/0: instruction string-equal/6
@@ -116,7 +116,7 @@ mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1037 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -127,7 +127,7 @@ mem/0: location 1032 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1044
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -176,7 +176,7 @@ mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1037 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -187,7 +187,7 @@ mem/0: location 1033 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1044
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -236,7 +236,7 @@ mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/25 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index/26 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1037 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -247,7 +247,7 @@ mem/0: location 1034 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1044
 run/0: instruction string-equal/17
-run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/25 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
+run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index/26 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1039 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
@@ -297,11 +297,11 @@ run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 25
 run/0: instruction string-equal/26
-run/0: reply/32 {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: reply/33 {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: result 0 is 1
 mem/0: storing 1 in location 3
 run/0: instruction string-equal-reflexive/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     3 <- 1  # x == x for all x
   ", value: 0, type: 0, properties: ["
     3 <- 1  # x == x for all x
diff --git a/cpp/.traces/string-equal-with-empty b/cpp/.traces/string-equal-with-empty
index c103c72f..3a924504 100644
--- a/cpp/.traces/string-equal-with-empty
+++ b/cpp/.traces/string-equal-with-empty
@@ -22,7 +22,7 @@ after-brace/0: memory-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: string-equal-with-empty
 run/0: instruction string-equal-with-empty/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     default-space:address:array:location <- new location:type, 30:literal
     x:address:array:character <- new []
     y:address:array:character <- new [abcd]
@@ -58,37 +58,37 @@ after-brace/0: new ...
 after-brace/0: new ...
 after-brace/0: string-equal ...
 run/0: instruction run1001/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction run1001/1
-run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/41 {name: "", value: 0, type: 0, properties: ["": "literal-string"]}
+run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new/42 {name: "", value: 0, type: 0, properties: ["": "literal-string"]}
 mem/0: storing 1031 in location 1002
 run/0: instruction run1001/2
-run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new/41 {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
+run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new/42 {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
 mem/0: storing 1032 in location 1003
 run/0: instruction run1001/3
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal/100 {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 mem/0: location 1002 is 1031
 mem/0: location 1003 is 1032
 run/0: instruction string-equal/0
-run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/41 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/42 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
 mem/0: new alloc: 1037
 run/0: instruction string-equal/1
-run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1031
 mem/0: storing 1031 in location 1039
 run/0: instruction string-equal/2
-run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/27 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length/28 {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1039 is 1031
 mem/0: storing 0 in location 1040
 run/0: instruction string-equal/3
-run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/29 
+run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient/30 
 run/0: product 0 is 1032
 mem/0: storing 1032 in location 1041
 run/0: instruction string-equal/4
-run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/27 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length/28 {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1041 is 1032
 mem/0: storing 4 in location 1042
 run/0: instruction string-equal/6
@@ -108,11 +108,11 @@ mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/9
-run/0: reply/32 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: reply/33 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
 run/0: instruction string-equal-with-empty/1
-run/0: memory-should-contain/43 {name: "
+run/0: memory-should-contain/44 {name: "
     3 <- 0  # "" != abcd
   ", value: 0, type: 0, properties: ["
     3 <- 0  # "" != abcd
diff --git a/cpp/.traces/trace_check_passes_silently b/cpp/.traces/trace_check_passes_silently
index 3ee8d037..687c853e 100644
--- a/cpp/.traces/trace_check_passes_silently
+++ b/cpp/.traces/trace_check_passes_silently
@@ -16,7 +16,7 @@ after-brace/0: trace-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     trace [a], [b]
   ", value: 0, type: 0, properties: ["
     trace [a], [b]
@@ -30,7 +30,7 @@ run/0: instruction run1001/0
 run/0: trace/18 {name: "a", value: 0, type: 0, properties: ["a": "literal-string"]}, {name: "b", value: 0, type: 0, properties: ["b": "literal-string"]}
 a/0: b
 run/0: instruction main/1
-run/0: trace-should-contain/44 {name: "
+run/0: trace-should-contain/45 {name: "
     a: b
   ", value: 0, type: 0, properties: ["
     a: b
diff --git a/cpp/.traces/trace_check_warns_on_failure b/cpp/.traces/trace_check_warns_on_failure
index 244dd582..121235af 100644
--- a/cpp/.traces/trace_check_warns_on_failure
+++ b/cpp/.traces/trace_check_warns_on_failure
@@ -11,7 +11,7 @@ after-brace/0: trace-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: trace-should-contain/44 {name: "
+run/0: trace-should-contain/45 {name: "
     a: b
     a: d
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/trace_check_warns_on_failure_in_later_line b/cpp/.traces/trace_check_warns_on_failure_in_later_line
index edb485eb..35e575e2 100644
--- a/cpp/.traces/trace_check_warns_on_failure_in_later_line
+++ b/cpp/.traces/trace_check_warns_on_failure_in_later_line
@@ -18,7 +18,7 @@ after-brace/0: trace-should-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     trace [a], [b]
   ", value: 0, type: 0, properties: ["
     trace [a], [b]
@@ -32,7 +32,7 @@ run/0: instruction run1001/0
 run/0: trace/18 {name: "a", value: 0, type: 0, properties: ["a": "literal-string"]}, {name: "b", value: 0, type: 0, properties: ["b": "literal-string"]}
 a/0: b
 run/0: instruction main/1
-run/0: trace-should-contain/44 {name: "
+run/0: trace-should-contain/45 {name: "
     a: b
     a: d
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/trace_negative_check_passes_silently b/cpp/.traces/trace_negative_check_passes_silently
index 11d92333..fd380182 100644
--- a/cpp/.traces/trace_negative_check_passes_silently
+++ b/cpp/.traces/trace_negative_check_passes_silently
@@ -9,7 +9,7 @@ after-brace/0: trace-should-not-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: trace-should-not-contain/45 {name: "
+run/0: trace-should-not-contain/46 {name: "
     a: b
   ", value: 0, type: 0, properties: ["
     a: b
diff --git a/cpp/.traces/trace_negative_check_warns_on_any_unexpected_line b/cpp/.traces/trace_negative_check_warns_on_any_unexpected_line
index 372180e4..b753bfbc 100644
--- a/cpp/.traces/trace_negative_check_warns_on_any_unexpected_line
+++ b/cpp/.traces/trace_negative_check_warns_on_any_unexpected_line
@@ -18,7 +18,7 @@ after-brace/0: trace-should-not-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     trace [a], [d]
   ", value: 0, type: 0, properties: ["
     trace [a], [d]
@@ -32,7 +32,7 @@ run/0: instruction run1001/0
 run/0: trace/18 {name: "a", value: 0, type: 0, properties: ["a": "literal-string"]}, {name: "d", value: 0, type: 0, properties: ["d": "literal-string"]}
 a/0: d
 run/0: instruction main/1
-run/0: trace-should-not-contain/45 {name: "
+run/0: trace-should-not-contain/46 {name: "
     a: b
     a: d
   ", value: 0, type: 0, properties: ["
diff --git a/cpp/.traces/trace_negative_check_warns_on_failure b/cpp/.traces/trace_negative_check_warns_on_failure
index 0a8b1ed5..66f5baed 100644
--- a/cpp/.traces/trace_negative_check_warns_on_failure
+++ b/cpp/.traces/trace_negative_check_warns_on_failure
@@ -16,7 +16,7 @@ after-brace/0: trace-should-not-contain ...
 new/0: routine allocated memory from 1000 to 101000
 schedule/0: main
 run/0: instruction main/0
-run/0: run/42 {name: "
+run/0: run/43 {name: "
     trace [a], [b]
   ", value: 0, type: 0, properties: ["
     trace [a], [b]
@@ -30,7 +30,7 @@ run/0: instruction run1001/0
 run/0: trace/18 {name: "a", value: 0, type: 0, properties: ["a": "literal-string"]}, {name: "b", value: 0, type: 0, properties: ["b": "literal-string"]}
 a/0: b
 run/0: instruction main/1
-run/0: trace-should-not-contain/45 {name: "
+run/0: trace-should-not-contain/46 {name: "
     a: b
   ", value: 0, type: 0, properties: ["
     a: b
diff --git a/cpp/.traces/wait_for_location b/cpp/.traces/wait_for_location
index a1409536..44b627c0 100644
--- a/cpp/.traces/wait_for_location
+++ b/cpp/.traces/wait_for_location
@@ -25,11 +25,11 @@ run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy/1 {n
 run/0: ingredient 0 is 0
 mem/0: storing 0 in location 1
 run/0: instruction f1/1
-run/0: start-running/33 {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
+run/0: start-running/34 {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
 run/0: ingredient 0 is f2
 new/0: routine allocated memory from 101000 to 201000
 run/0: instruction f1/2
-run/0: wait-for-location/34 {name: "1", value: 1, type: 1, properties: ["1": "integer"]}
+run/0: wait-for-location/35 {name: "1", value: 1, type: 1, properties: ["1": "integer"]}
 run/0: waiting for 1 to change from 0
 schedule/0: f2
 run/0: instruction f2/0
diff --git a/cpp/027debug.cc b/cpp/027debug.cc
index 90ef9e49..d5de1072 100644
--- a/cpp/027debug.cc
+++ b/cpp/027debug.cc
@@ -40,3 +40,13 @@ case _STOP_TRACING: {
   Trace_stream->dump_layer = "";
   break;
 }
+
+:(before "End Primitive Recipe Declarations")
+_EXIT,
+:(before "End Primitive Recipe Numbers")
+Recipe_number["$exit"] = _EXIT;
+:(before "End Primitive Recipe Implementations")
+case _EXIT: {
+  exit(0);
+  break;
+}