about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-07-12 00:11:56 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-07-12 00:11:56 -0700
commitd5d908dda655c791329563522faad42d7e4ee618 (patch)
tree628b8a23e13878c45ef39dfbffb860c676da5304
parent9864bdd0792b697d7b03e692ba7f82cf5669c41c (diff)
downloadmu-d5d908dda655c791329563522faad42d7e4ee618.tar.gz
1766
-rw-r--r--html/010vm.cc.html81
-rw-r--r--html/011load.cc.html40
-rw-r--r--html/012transform.cc.html9
-rw-r--r--html/013literal_string.cc.html2
-rw-r--r--html/020run.cc.html14
-rw-r--r--html/021arithmetic.cc.html16
-rw-r--r--html/022boolean.cc.html6
-rw-r--r--html/023jump.cc.html8
-rw-r--r--html/024compare.cc.html10
-rw-r--r--html/025trace.cc.html4
-rw-r--r--html/026assert.cc.html2
-rw-r--r--html/027debug.cc.html31
-rw-r--r--html/030container.cc.html76
-rw-r--r--html/031address.cc.html2
-rw-r--r--html/032array.cc.html28
-rw-r--r--html/033exclusive_container.cc.html (renamed from html/034exclusive_container.cc.html)16
-rw-r--r--html/034call.cc.html (renamed from html/035call.cc.html)14
-rw-r--r--html/035call_ingredient.cc.html (renamed from html/036call_ingredient.cc.html)8
-rw-r--r--html/036call_reply.cc.html (renamed from html/037call_reply.cc.html)33
-rw-r--r--html/037recipe.cc.html90
-rw-r--r--html/038scheduler.cc.html26
-rw-r--r--html/039wait.cc.html6
-rw-r--r--html/040brace.cc.html158
-rw-r--r--html/041name.cc.html28
-rw-r--r--html/042new.cc.html31
-rw-r--r--html/043space.cc.html4
-rw-r--r--html/045closure_name.cc.html28
-rw-r--r--html/046tangle.cc.html2
-rw-r--r--html/047jump_label.cc.html16
-rw-r--r--html/048call_variable.cc.html81
-rw-r--r--html/049continuation.cc.html12
-rw-r--r--html/050scenario.cc.html65
-rw-r--r--html/060string.mu.html9
-rw-r--r--html/064random.cc.html6
-rw-r--r--html/070display.cc.html75
-rw-r--r--html/071print.mu.html25
-rw-r--r--html/072scenario_screen.cc.html42
-rw-r--r--html/074console.mu.html13
-rw-r--r--html/075scenario_console.cc.html14
-rw-r--r--html/080trace_browser.cc.html25
-rw-r--r--html/081run_interactive.cc.html298
-rw-r--r--html/display.mu.html2
-rw-r--r--html/edit.mu.html1510
-rw-r--r--html/repl.mu.html876
-rw-r--r--index.html10
45 files changed, 1851 insertions, 2001 deletions
diff --git a/html/010vm.cc.html b/html/010vm.cc.html
index eea4faf3..6e76f36f 100644
--- a/html/010vm.cc.html
+++ b/html/010vm.cc.html
@@ -15,11 +15,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 1.05em; }
 .cSpecial { color: #008000; }
 .Constant { color: #00a0a0; }
-.PreProc { color: #c000c0; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #a04060; }
 .SalientComment { color: #00ffff; }
 .CommentedCode { color: #6c6c6c; }
+.PreProc { color: #c000c0; }
 .Identifier { color: #804000; }
 -->
 </style>
@@ -32,17 +32,24 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 </head>
 <body>
 <pre id='vimCodeElement'>
-<span class="Delimiter">:(after &quot;Types&quot;)</span>
-<span class="Comment">// A program is a book of 'recipes' (functions)</span>
-typedef long long int recipe_number<span class="Delimiter">;</span>
+<span class="Comment">//: A program is a book of 'recipes' (functions)</span>
 <span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> recipe_number&gt; Recipe_number<span class="Delimiter">;</span>
-map&lt;recipe_number<span class="Delimiter">,</span> recipe&gt; Recipe<span class="Delimiter">;</span>
-recipe_number Next_recipe_number = <span class="Constant">1</span><span class="Delimiter">;</span>
+<span class="Comment">//: Each recipe is stored at a specific page number, or ordinal.</span>
+map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt; Recipe<span class="Delimiter">;</span>
+<span class="Comment">//: You can also refer to each recipe by its name.</span>
+map&lt;string<span class="Delimiter">,</span> recipe_ordinal&gt; Recipe_ordinal<span class="Delimiter">;</span>
+recipe_ordinal Next_recipe_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
+
+<span class="Comment">//: Ordinals are like numbers, except you can't do arithmetic on them. Ordinal</span>
+<span class="Comment">//: 1 is not less than 2, it's just different. Phone numbers are ordinals;</span>
+<span class="Comment">//: adding two phone numbers is meaningless. Here each recipe does something</span>
+<span class="Comment">//: incommensurable with any other recipe.</span>
+<span class="Delimiter">:(after &quot;Types&quot;)</span>
+typedef long long int recipe_ordinal<span class="Delimiter">;</span>
 
 <span class="Delimiter">:(before &quot;End Types&quot;)</span>
-<span class="Comment">// Recipes are lists of instructions. To run a recipe, the computer runs its</span>
-<span class="Comment">// instructions.</span>
+<span class="Comment">// Recipes are lists of instructions. To perform or 'run' a recipe, the</span>
+<span class="Comment">// computer runs its instructions.</span>
 struct recipe <span class="Delimiter">{</span>
   string name<span class="Delimiter">;</span>
   vector&lt;instruction&gt; steps<span class="Delimiter">;</span>
@@ -59,7 +66,7 @@ struct instruction <span class="Delimiter">{</span>
   bool is_label<span class="Delimiter">;</span>
   string label<span class="Delimiter">;</span>  <span class="Comment">// only if is_label</span>
   string name<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
-  recipe_number operation<span class="Delimiter">;</span>  <span class="Comment">// Recipe_number[name]</span>
+  recipe_ordinal operation<span class="Delimiter">;</span>  <span class="Comment">// Recipe_ordinal[name]</span>
   vector&lt;reagent&gt; ingredients<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
   vector&lt;reagent&gt; products<span class="Delimiter">;</span>  <span class="Comment">// only if !is_label</span>
   instruction<span class="Delimiter">();</span>
@@ -78,7 +85,7 @@ struct reagent <span class="Delimiter">{</span>
   string name<span class="Delimiter">;</span>
   double value<span class="Delimiter">;</span>
   bool initialized<span class="Delimiter">;</span>
-  vector&lt;type_number&gt; types<span class="Delimiter">;</span>
+  vector&lt;type_ordinal&gt; types<span class="Delimiter">;</span>
   reagent<span class="Delimiter">(</span>string s<span class="Delimiter">);</span>
   reagent<span class="Delimiter">();</span>
   void set_value<span class="Delimiter">(</span>double v<span class="Delimiter">)</span> <span class="Delimiter">{</span> value = v<span class="Delimiter">;</span> initialized = <span class="Constant">true</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
@@ -105,29 +112,29 @@ Memory<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
 <span class="Comment">// Unlike most computers today, mu stores types in a single big table, shared</span>
 <span class="Comment">// by all the mu programs on the computer. This is useful in providing a</span>
 <span class="Comment">// seamless experience to help understand arbitrary mu programs.</span>
-typedef long long int type_number<span class="Delimiter">;</span>
+typedef long long int type_ordinal<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;string<span class="Delimiter">,</span> type_number&gt; Type_number<span class="Delimiter">;</span>
-map&lt;type_number<span class="Delimiter">,</span> type_info&gt; Type<span class="Delimiter">;</span>
-type_number Next_type_number = <span class="Constant">1</span><span class="Delimiter">;</span>
+map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; Type_ordinal<span class="Delimiter">;</span>
+map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt; Type<span class="Delimiter">;</span>
+type_ordinal Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
 <span class="Delimiter">:(code)</span>
 void setup_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Type<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  Type_number<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Type_number[<span class="Constant">&quot;literal&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
-  Next_type_number = <span class="Constant">1</span><span class="Delimiter">;</span>
+  Type<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  Type_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+  Type_ordinal[<span class="Constant">&quot;literal&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
+  Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span>
   <span class="Comment">// Mu Types Initialization</span>
-  type_number number = Type_number[<span class="Constant">&quot;number&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
-  Type_number[<span class="Constant">&quot;location&quot;</span>] = Type_number[<span class="Constant">&quot;number&quot;</span>]<span class="Delimiter">;</span>  <span class="Comment">// wildcard type: either a pointer or a scalar</span>
+  type_ordinal number = Type_ordinal[<span class="Constant">&quot;number&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
+  Type_ordinal[<span class="Constant">&quot;location&quot;</span>] = Type_ordinal[<span class="Constant">&quot;number&quot;</span>]<span class="Delimiter">;</span>  <span class="Comment">// wildcard type: either a pointer or a scalar</span>
   Type[number]<span class="Delimiter">.</span>name = <span class="Constant">&quot;number&quot;</span><span class="Delimiter">;</span>
-  type_number address = Type_number[<span class="Constant">&quot;address&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
+  type_ordinal address = Type_ordinal[<span class="Constant">&quot;address&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
   Type[address]<span class="Delimiter">.</span>name = <span class="Constant">&quot;address&quot;</span><span class="Delimiter">;</span>
-  type_number boolean = Type_number[<span class="Constant">&quot;boolean&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
+  type_ordinal boolean = Type_ordinal[<span class="Constant">&quot;boolean&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
   Type[boolean]<span class="Delimiter">.</span>name = <span class="Constant">&quot;boolean&quot;</span><span class="Delimiter">;</span>
-  type_number character = Type_number[<span class="Constant">&quot;character&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
+  type_ordinal character = Type_ordinal[<span class="Constant">&quot;character&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
   Type[character]<span class="Delimiter">.</span>name = <span class="Constant">&quot;character&quot;</span><span class="Delimiter">;</span>
   <span class="Comment">// Array types are a special modifier to any other type. For example,</span>
   <span class="Comment">// array:number or array:address:boolean.</span>
-  type_number array = Type_number[<span class="Constant">&quot;array&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
+  type_ordinal array = Type_ordinal[<span class="Constant">&quot;array&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
   Type[array]<span class="Delimiter">.</span>name = <span class="Constant">&quot;array&quot;</span><span class="Delimiter">;</span>
   <span class="Comment">// End Mu Types Initialization</span>
 <span class="Delimiter">}</span>
@@ -155,7 +162,7 @@ struct type_info <span class="Delimiter">{</span>
   string name<span class="Delimiter">;</span>
   kind_of_type kind<span class="Delimiter">;</span>
   long long int size<span class="Delimiter">;</span>  <span class="Comment">// only if type is not primitive; primitives and addresses have size 1 (except arrays are dynamic)</span>
-  vector&lt;vector&lt;type_number&gt; &gt; elements<span class="Delimiter">;</span>
+  vector&lt;vector&lt;type_ordinal&gt; &gt; elements<span class="Delimiter">;</span>
   vector&lt;string&gt; element_names<span class="Delimiter">;</span>
   <span class="Comment">// End type_info Fields</span>
   type_info<span class="Delimiter">()</span> :kind<span class="Delimiter">(</span>primitive<span class="Delimiter">),</span> size<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
@@ -173,10 +180,10 @@ enum primitive_recipes <span class="Delimiter">{</span>
 <span class="Comment">//: recipes there are only codes, no entries in the book, because mu just knows</span>
 <span class="Comment">//: what to do for them.</span>
 void setup_recipes<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  Recipe<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  Recipe_number<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  Recipe_number[<span class="Constant">&quot;idle&quot;</span>] = IDLE<span class="Delimiter">;</span>
+  Recipe<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>  Recipe_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+  Recipe_ordinal[<span class="Constant">&quot;idle&quot;</span>] = IDLE<span class="Delimiter">;</span>
   <span class="Comment">// Primitive Recipe Numbers</span>
-  Recipe_number[<span class="Constant">&quot;copy&quot;</span>] = COPY<span class="Delimiter">;</span>
+  Recipe_ordinal[<span class="Constant">&quot;copy&quot;</span>] = COPY<span class="Delimiter">;</span>
   <span class="Comment">// End Primitive Recipe Numbers</span>
 <span class="Delimiter">}</span>
 <span class="Comment">//: We could just reset the recipe table after every test, but that gets slow</span>
@@ -186,12 +193,12 @@ void setup_recipes<span class="Delimiter">()</span> <span class="Delimiter">{</s
 <span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
 setup_recipes<span class="Delimiter">();</span>
 assert<span class="Delimiter">(</span>MAX_PRIMITIVE_RECIPES &lt; <span class="Constant">100</span><span class="Delimiter">);</span>  <span class="Comment">// level 0 is primitives; until 99</span>
-Next_recipe_number = <span class="Constant">100</span><span class="Delimiter">;</span>
+Next_recipe_ordinal = <span class="Constant">100</span><span class="Delimiter">;</span>
 <span class="Comment">// End Load Recipes</span>
 <span class="Delimiter">:(before &quot;End Test Run Initialization&quot;)</span>
-assert<span class="Delimiter">(</span>Next_recipe_number &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>  <span class="Comment">// recipes being tested didn't overflow into test space</span>
+assert<span class="Delimiter">(</span>Next_recipe_ordinal &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>  <span class="Comment">// recipes being tested didn't overflow into test space</span>
 <span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Next_recipe_number = <span class="Constant">1000</span><span class="Delimiter">;</span>  <span class="Comment">// consistent new numbers for each test</span>
+Next_recipe_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>  <span class="Comment">// consistent new numbers for each test</span>
 
 ^L
 
@@ -219,11 +226,15 @@ reagent::reagent<span class="Delimiter">(</span>string s<span class="Delimiter">
   name = properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>first<span class="Delimiter">;</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     string type = properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    if <span class="Delimiter">(</span>Type_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>type<span class="Delimiter">)</span> == Type_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?       cerr &lt;&lt; type &lt;&lt; &quot; is &quot; &lt;&lt; Next_type_number &lt;&lt; '\n'; //? 1</span>
-      Type_number[type] = Next_type_number++<span class="Delimiter">;</span>
+    if <span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>type<span class="Delimiter">)</span> == Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; type &lt;&lt; &quot; is &quot; &lt;&lt; Next_type_ordinal &lt;&lt; '\n'; //? 1</span>
+      Type_ordinal[type] = Next_type_ordinal++<span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
-    types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[type]<span class="Delimiter">);</span>
+    types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[type]<span class="Delimiter">);</span>
+  <span class="Delimiter">}</span>
+  if <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>name<span class="Delimiter">)</span> &amp;&amp; types<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+    types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+    properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><span class="Constant">&quot;literal&quot;</span><span class="Delimiter">);</span>
   <span class="Delimiter">}</span>
   if <span class="Delimiter">(</span>name == <span class="Constant">&quot;_&quot;</span> &amp;&amp; types<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
     types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
diff --git a/html/011load.cc.html b/html/011load.cc.html
index 83b4d64c..e8ea5c5c 100644
--- a/html/011load.cc.html
+++ b/html/011load.cc.html
@@ -44,15 +44,15 @@ recipe main [
 <span class="traceContains">+parse:   product: {name: &quot;1&quot;, properties: [&quot;1&quot;: &quot;number&quot;]}</span>
 
 <span class="Delimiter">:(code)</span>
-vector&lt;recipe_number&gt; load<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+vector&lt;recipe_ordinal&gt; load<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
   in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
   <span class="Identifier">return</span> load<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
 <span class="Delimiter">}</span>
 
-vector&lt;recipe_number&gt; load<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+vector&lt;recipe_ordinal&gt; load<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   in &gt;&gt; std::noskipws<span class="Delimiter">;</span>
-  vector&lt;recipe_number&gt; result<span class="Delimiter">;</span>
+  vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
   while <span class="Delimiter">(</span>!in<span class="Delimiter">.</span>eof<span class="Delimiter">())</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?     cerr &lt;&lt; &quot;===\n&quot;; //? 1</span>
     skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
@@ -64,20 +64,20 @@ vector&lt;recipe_number&gt; load<span class="Delimiter">(</span>istream&amp; in<
 <span class="CommentedCode">//?       cerr &lt;&lt; &quot;recipe: &quot; &lt;&lt; recipe_name &lt;&lt; '\n'; //? 1</span>
       if <span class="Delimiter">(</span>recipe_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
         raise &lt;&lt; <span class="Constant">&quot;empty recipe name</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-      if <span class="Delimiter">(</span>Recipe_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> == Recipe_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        Recipe_number[recipe_name] = Next_recipe_number++<span class="Delimiter">;</span>
+      if <span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> == Recipe_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+        Recipe_ordinal[recipe_name] = Next_recipe_ordinal++<span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
-      if <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>Recipe_number[recipe_name]<span class="Delimiter">)</span> != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-        raise &lt;&lt; <span class="Constant">&quot;redefining recipe &quot;</span> &lt;&lt; Recipe[Recipe_number[recipe_name]]<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
-        Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe_number[recipe_name]<span class="Delimiter">);</span>
+      if <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>Recipe_ordinal[recipe_name]<span class="Delimiter">)</span> != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+        if <span class="Delimiter">(</span>!Loading_interactive<span class="Delimiter">)</span> raise &lt;&lt; <span class="Constant">&quot;redefining recipe &quot;</span> &lt;&lt; Recipe[Recipe_ordinal[recipe_name]]<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+        Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe_ordinal[recipe_name]<span class="Delimiter">);</span>
       <span class="Delimiter">}</span>
       <span class="Comment">// todo: save user-defined recipes to mu's memory</span>
-      Recipe[Recipe_number[recipe_name]] = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<span class="CommentedCode">//?       cerr &lt;&lt; Recipe_number[recipe_name] &lt;&lt; &quot;: &quot; &lt;&lt; recipe_name &lt;&lt; '\n'; //? 1</span>
-      Recipe[Recipe_number[recipe_name]]<span class="Delimiter">.</span>name = recipe_name<span class="Delimiter">;</span>
+      Recipe[Recipe_ordinal[recipe_name]] = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; Recipe_ordinal[recipe_name] &lt;&lt; &quot;: &quot; &lt;&lt; recipe_name &lt;&lt; '\n'; //? 1</span>
+      Recipe[Recipe_ordinal[recipe_name]]<span class="Delimiter">.</span>name = recipe_name<span class="Delimiter">;</span>
       <span class="Comment">// track added recipes because we may need to undo them in tests; see below</span>
-      recently_added_recipes<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Recipe_number[recipe_name]<span class="Delimiter">);</span>
-      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Recipe_number[recipe_name]<span class="Delimiter">);</span>
+      recently_added_recipes<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Recipe_ordinal[recipe_name]<span class="Delimiter">);</span>
+      result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Recipe_ordinal[recipe_name]<span class="Delimiter">);</span>
     <span class="Delimiter">}</span>
     <span class="Comment">// End Command Handlers</span>
     else <span class="Delimiter">{</span>
@@ -150,14 +150,14 @@ bool next_instruction<span class="Delimiter">(</span>istream&amp; in<span class=
   if <span class="Delimiter">(</span>p == words<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
     raise &lt;&lt; <span class="Constant">&quot;instruction prematurely ended with '&lt;-'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
   curr<span class="Delimiter">-&gt;</span>name = *p<span class="Delimiter">;</span>
-  if <span class="Delimiter">(</span>Recipe_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> == Recipe_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    Recipe_number[*p] = Next_recipe_number++<span class="Delimiter">;</span>
-<span class="CommentedCode">//?     cout &lt;&lt; &quot;AAA: &quot; &lt;&lt; *p &lt;&lt; &quot; is now &quot; &lt;&lt; Recipe_number[*p] &lt;&lt; '\n'; //? 1</span>
+  if <span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> == Recipe_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+    Recipe_ordinal[*p] = Next_recipe_ordinal++<span class="Delimiter">;</span>
+<span class="CommentedCode">//?     cout &lt;&lt; &quot;AAA: &quot; &lt;&lt; *p &lt;&lt; &quot; is now &quot; &lt;&lt; Recipe_ordinal[*p] &lt;&lt; '\n'; //? 1</span>
   <span class="Delimiter">}</span>
-  if <span class="Delimiter">(</span>Recipe_number[*p] == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  if <span class="Delimiter">(</span>Recipe_ordinal[*p] == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
     raise &lt;&lt; <span class="Constant">&quot;Recipe &quot;</span> &lt;&lt; *p &lt;&lt; <span class="Constant">&quot; has number 0, which is reserved for IDLE.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
   <span class="Delimiter">}</span>
-  curr<span class="Delimiter">-&gt;</span>operation = Recipe_number[*p]<span class="Delimiter">;</span>  ++p<span class="Delimiter">;</span>
+  curr<span class="Delimiter">-&gt;</span>operation = Recipe_ordinal[*p]<span class="Delimiter">;</span>  ++p<span class="Delimiter">;</span>
 
   for <span class="Delimiter">(;</span> p != words<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     if <span class="Delimiter">(</span>*p == <span class="Constant">&quot;,&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
@@ -248,11 +248,11 @@ void show_rest_of_stream<span class="Delimiter">(</span>istream&amp; in<span cla
 
 <span class="Comment">//: Have tests clean up any recipes they added.</span>
 <span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-vector&lt;recipe_number&gt; recently_added_recipes<span class="Delimiter">;</span>
+vector&lt;recipe_ordinal&gt; recently_added_recipes<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Setup&quot;)</span>
 for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>recently_added_recipes<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;AAA clearing &quot; &lt;&lt; Recipe[recently_added_recipes.at(i)].name &lt;&lt; '\n'; //? 2</span>
-  Recipe_number<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe[recently_added_recipes<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+  Recipe_ordinal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe[recently_added_recipes<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
   Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>recently_added_recipes<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
 <span class="Delimiter">}</span>
 <span class="Comment">// Clear Other State For recently_added_recipes</span>
diff --git a/html/012transform.cc.html b/html/012transform.cc.html
index fd16c8d7..407e5be7 100644
--- a/html/012transform.cc.html
+++ b/html/012transform.cc.html
@@ -39,7 +39,7 @@ long long int transformed_until<span class="Delimiter">;</span>
   recipe<span class="Delimiter">()</span> :transformed_until<span class="Delimiter">(</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
 
 <span class="Delimiter">:(before &quot;End Types&quot;)</span>
-typedef void <span class="Delimiter">(</span>*transform_fn<span class="Delimiter">)(</span>recipe_number<span class="Delimiter">);</span>
+typedef void <span class="Delimiter">(</span>*transform_fn<span class="Delimiter">)(</span>recipe_ordinal<span class="Delimiter">);</span>
 
 <span class="Delimiter">:(before &quot;End Globals&quot;)</span>
 vector&lt;transform_fn&gt; Transform<span class="Delimiter">;</span>
@@ -48,11 +48,11 @@ vector&lt;transform_fn&gt; Transform<span class="Delimiter">;</span>
 void transform_all<span class="Delimiter">()</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA transform_all\n&quot;; //? 2</span>
   for <span class="Delimiter">(</span>long long int t = <span class="Constant">0</span><span class="Delimiter">;</span> t &lt; SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span> ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    for <span class="Delimiter">(</span>map&lt;recipe_number<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    for <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
       recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
       if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
       if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>transformed_until != t-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
-      <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span><span class="Comment">/*</span><span class="Comment">recipe_number</span><span class="Comment">*/</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">);</span>
+      <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span><span class="Comment">/*</span><span class="Comment">recipe_ordinal</span><span class="Comment">*/</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">);</span>
       r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
   <span class="Delimiter">}</span>
@@ -61,7 +61,7 @@ void transform_all<span class="Delimiter">()</span> <span class="Delimiter">{</s
 
 void parse_int_reagents<span class="Delimiter">()</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;parse_int_reagents\n&quot;; //? 1</span>
-  for <span class="Delimiter">(</span>map&lt;recipe_number<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  for <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
     if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
     for <span class="Delimiter">(</span>long long int index = <span class="Constant">0</span><span class="Delimiter">;</span> index &lt; SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -78,6 +78,7 @@ void parse_int_reagents<span class="Delimiter">()</span> <span class="Delimiter"
 
 void populate_value<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+  <span class="Comment">// End Reagent-parsing Exceptions</span>
   if <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
   r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
 <span class="Delimiter">}</span>
diff --git a/html/013literal_string.cc.html b/html/013literal_string.cc.html
index 3a95434d..154cfded 100644
--- a/html/013literal_string.cc.html
+++ b/html/013literal_string.cc.html
@@ -53,7 +53,7 @@ recipe main [
 <span class="traceContains">+parse:   ingredient: {name: &quot;abc:def/ghi&quot;, properties: [_: &quot;literal-string&quot;]}</span>
 
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-Type_number[<span class="Constant">&quot;literal-string&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
+Type_ordinal[<span class="Constant">&quot;literal-string&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
 
 <span class="Delimiter">:(after &quot;string next_word(istream&amp; in)&quot;)</span>
   if <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
diff --git a/html/020run.cc.html b/html/020run.cc.html
index 5d65fa9f..fc5fd15f 100644
--- a/html/020run.cc.html
+++ b/html/020run.cc.html
@@ -72,9 +72,9 @@ recipe main [
 <span class="Comment">// Book-keeping while running a recipe.</span>
 <span class="Comment">//: Later layers will change this.</span>
 struct routine <span class="Delimiter">{</span>
-  recipe_number running_recipe<span class="Delimiter">;</span>
+  recipe_ordinal running_recipe<span class="Delimiter">;</span>
   long long int running_step_index<span class="Delimiter">;</span>
-  routine<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> :running_recipe<span class="Delimiter">(</span>r<span class="Delimiter">),</span> running_step_index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
+  routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> :running_recipe<span class="Delimiter">(</span>r<span class="Delimiter">),</span> running_step_index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span>
   bool completed<span class="Delimiter">()</span> const<span class="Delimiter">;</span>
 <span class="Delimiter">};</span>
 
@@ -82,7 +82,7 @@ struct routine <span class="Delimiter">{</span>
 routine* Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
 
 <span class="Delimiter">:(code)</span>
-void run<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void run<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   routine rr<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
   Current_routine = &amp;rr<span class="Delimiter">;</span>
   run_current_routine<span class="Delimiter">();</span>
@@ -112,6 +112,7 @@ void run_current_routine<span class="Delimiter">()</span>
     switch <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">)</span> <span class="Delimiter">{</span>
       <span class="Comment">// Primitive Recipe Implementations</span>
       case COPY: <span class="Delimiter">{</span>
+<span class="CommentedCode">//?         if (!ingredients.empty()) cerr &lt;&lt; current_instruction().ingredients.at(0).to_string() &lt;&lt; ' ' &lt;&lt; ingredients.at(0).at(0) &lt;&lt; '\n'; //? 1</span>
         copy<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span>
         <span class="Identifier">break</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
@@ -167,7 +168,7 @@ if <span class="Delimiter">(</span>!Run_tests<span class="Delimiter">)</span> <s
   START_TRACING_UNTIL_END_OF_SCOPE<span class="Delimiter">;</span>
 <span class="CommentedCode">//?   Trace_stream-&gt;dump_layer = &quot;all&quot;; //? 2</span>
   transform_all<span class="Delimiter">();</span>
-  recipe_number r = Recipe_number[string<span class="Delimiter">(</span><span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span>]<span class="Delimiter">;</span>
+  recipe_ordinal r = Recipe_ordinal[string<span class="Delimiter">(</span><span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span>]<span class="Delimiter">;</span>
 <span class="CommentedCode">//?   Trace_stream-&gt;dump_layer = &quot;all&quot;; //? 1</span>
   if <span class="Delimiter">(</span>r<span class="Delimiter">)</span> run<span class="Delimiter">(</span>r<span class="Delimiter">);</span>
 <span class="CommentedCode">//?   dump_memory(); //? 1</span>
@@ -202,7 +203,7 @@ load_permanently<span class="Delimiter">(</span><span class="Constant">&quot;cor
 void run<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA 2\n&quot;; //? 2</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; form &lt;&lt; '\n'; //? 1</span>
-  vector&lt;recipe_number&gt; tmp = load<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
+  vector&lt;recipe_ordinal&gt; tmp = load<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
   if <span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
   transform_all<span class="Delimiter">();</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA 3\n&quot;; //? 2</span>
@@ -246,12 +247,13 @@ void write_memory<span class="Delimiter">(</span>reagent x<span class="Delimiter
 long long int size_of<span class="Delimiter">(</span>const reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">);</span>
 <span class="Delimiter">}</span>
-long long int size_of<span class="Delimiter">(</span>const vector&lt;type_number&gt;&amp; types<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+long long int size_of<span class="Delimiter">(</span>const vector&lt;type_ordinal&gt;&amp; types<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Comment">// End size_of(types) Cases</span>
   <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
 bool size_mismatch<span class="Delimiter">(</span>const reagent&amp; x<span class="Delimiter">,</span> const vector&lt;double&gt;&amp; data<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span class="CommentedCode">//?   if (size_of(x) != SIZE(data)) cerr &lt;&lt; size_of(x) &lt;&lt; &quot; vs &quot; &lt;&lt; SIZE(data) &lt;&lt; '\n'; //? 2</span>
   <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
 <span class="Delimiter">}</span>
 
diff --git a/html/021arithmetic.cc.html b/html/021arithmetic.cc.html
index 479a6f4c..19941a52 100644
--- a/html/021arithmetic.cc.html
+++ b/html/021arithmetic.cc.html
@@ -18,6 +18,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #a04060; }
 .Special { color: #ff6060; }
+.CommentedCode { color: #6c6c6c; }
 .Identifier { color: #804000; }
 -->
 </style>
@@ -35,10 +36,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 ADD<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;add&quot;</span>] = ADD<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;add&quot;</span>] = ADD<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case ADD: <span class="Delimiter">{</span>
   double result = <span class="Constant">0</span><span class="Delimiter">;</span>
+<span class="CommentedCode">//?   if (!tb_is_active()) cerr &lt;&lt; ingredients.at(1).at(0) &lt;&lt; '\n'; //? 1</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span>
     result += ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
@@ -71,7 +73,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 SUBTRACT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;subtract&quot;</span>] = SUBTRACT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;subtract&quot;</span>] = SUBTRACT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case SUBTRACT: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -108,7 +110,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MULTIPLY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;multiply&quot;</span>] = MULTIPLY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;multiply&quot;</span>] = MULTIPLY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MULTIPLY: <span class="Delimiter">{</span>
   double result = <span class="Constant">1</span><span class="Delimiter">;</span>
@@ -144,7 +146,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 DIVIDE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;divide&quot;</span>] = DIVIDE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;divide&quot;</span>] = DIVIDE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case DIVIDE: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -183,7 +185,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 DIVIDE_WITH_REMAINDER<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;divide-with-remainder&quot;</span>] = DIVIDE_WITH_REMAINDER<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;divide-with-remainder&quot;</span>] = DIVIDE_WITH_REMAINDER<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case DIVIDE_WITH_REMAINDER: <span class="Delimiter">{</span>
   long long int quotient = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> / ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
@@ -219,10 +221,10 @@ recipe main [
 <span class="traceContains">+mem: storing 2.5 in location 1</span>
 
 <span class="Delimiter">:(code)</span>
-inline bool scalar<span class="Delimiter">(</span>vector&lt;long long int&gt;&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+inline bool scalar<span class="Delimiter">(</span>const vector&lt;long long int&gt;&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
-inline bool scalar<span class="Delimiter">(</span>vector&lt;double&gt;&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+inline bool scalar<span class="Delimiter">(</span>const vector&lt;double&gt;&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 </pre>
diff --git a/html/022boolean.cc.html b/html/022boolean.cc.html
index c5b5bcff..a23df2d2 100644
--- a/html/022boolean.cc.html
+++ b/html/022boolean.cc.html
@@ -35,7 +35,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 AND<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;and&quot;</span>] = AND<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;and&quot;</span>] = AND<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case AND: <span class="Delimiter">{</span>
   bool result = <span class="Constant">true</span><span class="Delimiter">;</span>
@@ -77,7 +77,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 OR<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;or&quot;</span>] = OR<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;or&quot;</span>] = OR<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case OR: <span class="Delimiter">{</span>
   bool result = <span class="Constant">false</span><span class="Delimiter">;</span>
@@ -119,7 +119,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 NOT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;not&quot;</span>] = NOT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;not&quot;</span>] = NOT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case NOT: <span class="Delimiter">{</span>
   products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>size<span class="Delimiter">());</span>
diff --git a/html/023jump.cc.html b/html/023jump.cc.html
index 8d2f6d54..b72a1341 100644
--- a/html/023jump.cc.html
+++ b/html/023jump.cc.html
@@ -47,7 +47,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 JUMP<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;jump&quot;</span>] = JUMP<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;jump&quot;</span>] = JUMP<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case JUMP: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>initialized<span class="Delimiter">);</span>
@@ -60,7 +60,7 @@ case JUMP: <span class="Delimiter">{</span>
 
 <span class="Comment">//: special type to designate jump targets</span>
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-Type_number[<span class="Constant">&quot;offset&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
+Type_ordinal[<span class="Constant">&quot;offset&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
 
 <span class="Delimiter">:(scenario jump_backward)</span>
 recipe main [
@@ -76,7 +76,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 JUMP_IF<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;jump-if&quot;</span>] = JUMP_IF<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;jump-if&quot;</span>] = JUMP_IF<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case JUMP_IF: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>initialized<span class="Delimiter">);</span>
@@ -115,7 +115,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 JUMP_UNLESS<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;jump-unless&quot;</span>] = JUMP_UNLESS<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;jump-unless&quot;</span>] = JUMP_UNLESS<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case JUMP_UNLESS: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>initialized<span class="Delimiter">);</span>
diff --git a/html/024compare.cc.html b/html/024compare.cc.html
index fb97b2a0..7ee355f3 100644
--- a/html/024compare.cc.html
+++ b/html/024compare.cc.html
@@ -35,7 +35,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 EQUAL<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;equal&quot;</span>] = EQUAL<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;equal&quot;</span>] = EQUAL<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case EQUAL: <span class="Delimiter">{</span>
   vector&lt;double&gt;&amp; exemplar = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
@@ -86,7 +86,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 GREATER_THAN<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;greater-than&quot;</span>] = GREATER_THAN<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;greater-than&quot;</span>] = GREATER_THAN<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case GREATER_THAN: <span class="Delimiter">{</span>
   bool result = <span class="Constant">true</span><span class="Delimiter">;</span>
@@ -134,7 +134,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 LESSER_THAN<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;lesser-than&quot;</span>] = LESSER_THAN<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;lesser-than&quot;</span>] = LESSER_THAN<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case LESSER_THAN: <span class="Delimiter">{</span>
   bool result = <span class="Constant">true</span><span class="Delimiter">;</span>
@@ -182,7 +182,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 GREATER_OR_EQUAL<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;greater-or-equal&quot;</span>] = GREATER_OR_EQUAL<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;greater-or-equal&quot;</span>] = GREATER_OR_EQUAL<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case GREATER_OR_EQUAL: <span class="Delimiter">{</span>
   bool result = <span class="Constant">true</span><span class="Delimiter">;</span>
@@ -238,7 +238,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 LESSER_OR_EQUAL<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;lesser-or-equal&quot;</span>] = LESSER_OR_EQUAL<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;lesser-or-equal&quot;</span>] = LESSER_OR_EQUAL<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case LESSER_OR_EQUAL: <span class="Delimiter">{</span>
   bool result = <span class="Constant">true</span><span class="Delimiter">;</span>
diff --git a/html/025trace.cc.html b/html/025trace.cc.html
index 11c3c6bd..3ff21726 100644
--- a/html/025trace.cc.html
+++ b/html/025trace.cc.html
@@ -40,7 +40,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 TRACE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;trace&quot;</span>] = TRACE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;trace&quot;</span>] = TRACE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case TRACE: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -54,7 +54,7 @@ case TRACE: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 HIDE_WARNINGS<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;hide-warnings&quot;</span>] = HIDE_WARNINGS<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;hide-warnings&quot;</span>] = HIDE_WARNINGS<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case HIDE_WARNINGS: <span class="Delimiter">{</span>
   Hide_warnings = <span class="Constant">true</span><span class="Delimiter">;</span>
diff --git a/html/026assert.cc.html b/html/026assert.cc.html
index 685cf2e4..af3588b4 100644
--- a/html/026assert.cc.html
+++ b/html/026assert.cc.html
@@ -40,7 +40,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 ASSERT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;assert&quot;</span>] = ASSERT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;assert&quot;</span>] = ASSERT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case ASSERT: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> == <span class="Constant">2</span><span class="Delimiter">);</span>
diff --git a/html/027debug.cc.html b/html/027debug.cc.html
index 40a4a513..4035f006 100644
--- a/html/027debug.cc.html
+++ b/html/027debug.cc.html
@@ -34,7 +34,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _PRINT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$print&quot;</span>] = _PRINT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$print&quot;</span>] = _PRINT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _PRINT: <span class="Delimiter">{</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -56,7 +56,7 @@ case _PRINT: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _START_TRACING<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$start-tracing&quot;</span>] = _START_TRACING<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$start-tracing&quot;</span>] = _START_TRACING<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _START_TRACING: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
@@ -70,7 +70,7 @@ case _START_TRACING: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _STOP_TRACING<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$stop-tracing&quot;</span>] = _STOP_TRACING<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$stop-tracing&quot;</span>] = _STOP_TRACING<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _STOP_TRACING: <span class="Delimiter">{</span>
   Trace_stream<span class="Delimiter">-&gt;</span>dump_layer = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
@@ -80,7 +80,7 @@ case _STOP_TRACING: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _CLOSE_TRACE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$close-trace&quot;</span>] = _CLOSE_TRACE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$close-trace&quot;</span>] = _CLOSE_TRACE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _CLOSE_TRACE: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -93,7 +93,7 @@ case _CLOSE_TRACE: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _EXIT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$exit&quot;</span>] = _EXIT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$exit&quot;</span>] = _EXIT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _EXIT: <span class="Delimiter">{</span>
   exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
@@ -103,17 +103,32 @@ case _EXIT: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _DUMP_TRACE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$dump-trace&quot;</span>] = _DUMP_TRACE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$dump-trace&quot;</span>] = _DUMP_TRACE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _DUMP_TRACE: <span class="Delimiter">{</span>
-  DUMP<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+  if <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+    DUMP<span class="Delimiter">(</span><span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+  <span class="Delimiter">}</span>
+  else <span class="Delimiter">{</span>
+    DUMP<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span>
+  <span class="Delimiter">}</span>
+  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span class="Delimiter">}</span>
+
+<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+_CLEAR_TRACE<span class="Delimiter">,</span>
+<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+Recipe_ordinal[<span class="Constant">&quot;$clear-trace&quot;</span>] = _CLEAR_TRACE<span class="Delimiter">;</span>
+<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+case _CLEAR_TRACE: <span class="Delimiter">{</span>
+  CLEAR_TRACE<span class="Delimiter">;</span>
   <span class="Identifier">break</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _DUMP_MEMORY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$dump-memory&quot;</span>] = _DUMP_MEMORY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$dump-memory&quot;</span>] = _DUMP_MEMORY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _DUMP_MEMORY: <span class="Delimiter">{</span>
   dump_memory<span class="Delimiter">();</span>
diff --git a/html/030container.cc.html b/html/030container.cc.html
index 0cbe190a..fb0e1cdc 100644
--- a/html/030container.cc.html
+++ b/html/030container.cc.html
@@ -38,11 +38,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
 <span class="Comment">//: We'll use this container as a running example, with two number elements.</span>
-type_number point = Type_number[<span class="Constant">&quot;point&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
+type_ordinal point = Type_ordinal[<span class="Constant">&quot;point&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
 Type[point]<span class="Delimiter">.</span>size = <span class="Constant">2</span><span class="Delimiter">;</span>
 Type[point]<span class="Delimiter">.</span>kind = container<span class="Delimiter">;</span>
 Type[point]<span class="Delimiter">.</span>name = <span class="Constant">&quot;point&quot;</span><span class="Delimiter">;</span>
-vector&lt;type_number&gt; i<span class="Delimiter">;</span>
+vector&lt;type_ordinal&gt; i<span class="Delimiter">;</span>
 i<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>number<span class="Delimiter">);</span>
 Type[point]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
 Type[point]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
@@ -65,14 +65,14 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
 <span class="Comment">// A more complex container, containing another container as one of its</span>
 <span class="Comment">// elements.</span>
-type_number point_number = Type_number[<span class="Constant">&quot;point-number&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
+type_ordinal point_number = Type_ordinal[<span class="Constant">&quot;point-number&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
 Type[point_number]<span class="Delimiter">.</span>size = <span class="Constant">2</span><span class="Delimiter">;</span>
 Type[point_number]<span class="Delimiter">.</span>kind = container<span class="Delimiter">;</span>
 Type[point_number]<span class="Delimiter">.</span>name = <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">;</span>
-vector&lt;type_number&gt; p2<span class="Delimiter">;</span>
+vector&lt;type_ordinal&gt; p2<span class="Delimiter">;</span>
 p2<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>point<span class="Delimiter">);</span>
 Type[point_number]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>p2<span class="Delimiter">);</span>
-vector&lt;type_number&gt; i2<span class="Delimiter">;</span>
+vector&lt;type_ordinal&gt; i2<span class="Delimiter">;</span>
 i2<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>number<span class="Delimiter">);</span>
 Type[point_number]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>i2<span class="Delimiter">);</span>
 
@@ -137,17 +137,19 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 GET<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;get&quot;</span>] = GET<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;get&quot;</span>] = GET<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case GET: <span class="Delimiter">{</span>
   reagent base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
   long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  type_number base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+  type_ordinal base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
   if <span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>kind != container<span class="Delimiter">)</span>
     raise &lt;&lt; <span class="Constant">&quot;'get' on a non-container in &quot;</span> &lt;&lt; current_recipe_name <span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; die<span class="Delimiter">();</span>
   assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
   long long int offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>offset &lt; size_of<span class="Delimiter">(</span>base<span class="Delimiter">));</span>
   long long int src = base_address<span class="Delimiter">;</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; offset<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     src += size_of<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
@@ -155,7 +157,7 @@ case GET: <span class="Delimiter">{</span>
   trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; src<span class="Delimiter">;</span>
   assert<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>kind == container<span class="Delimiter">);</span>
   assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">)</span> &gt; offset<span class="Delimiter">);</span>
-  type_number src_type = Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+  type_ordinal src_type = Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
   trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;its type is &quot;</span> &lt;&lt; Type[src_type]<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
   reagent tmp<span class="Delimiter">;</span>
   tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>src<span class="Delimiter">);</span>
@@ -186,17 +188,19 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 GET_ADDRESS<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;get-address&quot;</span>] = GET_ADDRESS<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;get-address&quot;</span>] = GET_ADDRESS<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case GET_ADDRESS: <span class="Delimiter">{</span>
   reagent base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
   long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  type_number base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+  type_ordinal base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
   if <span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>kind != container<span class="Delimiter">)</span>
     raise &lt;&lt; <span class="Constant">&quot;'get' on a non-container in &quot;</span> &lt;&lt; current_recipe_name <span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; die<span class="Delimiter">();</span>
   assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
   long long int offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>offset &lt; size_of<span class="Delimiter">(</span>base<span class="Delimiter">));</span>
   long long int result = base_address<span class="Delimiter">;</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; offset<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     result += size_of<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
@@ -251,16 +255,16 @@ void insert_container<span class="Delimiter">(</span>const string&amp; command<s
   string name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
   trace<span class="Delimiter">(</span><span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;reading &quot;</span> &lt;&lt; command &lt;&lt; <span class="Constant">' '</span> &lt;&lt; name<span class="Delimiter">;</span>
 <span class="CommentedCode">//?   cout &lt;&lt; name &lt;&lt; '\n'; //? 2</span>
-<span class="CommentedCode">//?   if (Type_number.find(name) != Type_number.end()) //? 1</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; Type_number[name] &lt;&lt; '\n'; //? 1</span>
-  if <span class="Delimiter">(</span>Type_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>name<span class="Delimiter">)</span> == Type_number<span class="Delimiter">.</span>end<span class="Delimiter">()</span>
-      || Type_number[name] == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    Type_number[name] = Next_type_number++<span class="Delimiter">;</span>
+<span class="CommentedCode">//?   if (Type_ordinal.find(name) != Type_ordinal.end()) //? 1</span>
+<span class="CommentedCode">//?     cerr &lt;&lt; Type_ordinal[name] &lt;&lt; '\n'; //? 1</span>
+  if <span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>name<span class="Delimiter">)</span> == Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">()</span>
+      || Type_ordinal[name] == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    Type_ordinal[name] = Next_type_ordinal++<span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
-  trace<span class="Delimiter">(</span><span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type number: &quot;</span> &lt;&lt; Type_number[name]<span class="Delimiter">;</span>
+  trace<span class="Delimiter">(</span><span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type number: &quot;</span> &lt;&lt; Type_ordinal[name]<span class="Delimiter">;</span>
   skip_bracket<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">&quot;'container' must begin with '['&quot;</span><span class="Delimiter">);</span>
-  type_info&amp; t = Type[Type_number[name]]<span class="Delimiter">;</span>
-  recently_added_types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[name]<span class="Delimiter">);</span>
+  type_info&amp; t = Type[Type_ordinal[name]]<span class="Delimiter">;</span>
+  recently_added_types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[name]<span class="Delimiter">);</span>
   t<span class="Delimiter">.</span>name = name<span class="Delimiter">;</span>
   t<span class="Delimiter">.</span>kind = kind<span class="Delimiter">;</span>
   while <span class="Delimiter">(</span>!in<span class="Delimiter">.</span>eof<span class="Delimiter">())</span> <span class="Delimiter">{</span>
@@ -270,14 +274,14 @@ void insert_container<span class="Delimiter">(</span>const string&amp; command<s
     istringstream inner<span class="Delimiter">(</span>element<span class="Delimiter">);</span>
     t<span class="Delimiter">.</span>element_names<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>slurp_until<span class="Delimiter">(</span>inner<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">));</span>
     trace<span class="Delimiter">(</span><span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  element name: &quot;</span> &lt;&lt; t<span class="Delimiter">.</span>element_names<span class="Delimiter">.</span>back<span class="Delimiter">();</span>
-    vector&lt;type_number&gt; types<span class="Delimiter">;</span>
+    vector&lt;type_ordinal&gt; types<span class="Delimiter">;</span>
     while <span class="Delimiter">(</span>!inner<span class="Delimiter">.</span>eof<span class="Delimiter">())</span> <span class="Delimiter">{</span>
       string type_name = slurp_until<span class="Delimiter">(</span>inner<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
-      if <span class="Delimiter">(</span>Type_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>type_name<span class="Delimiter">)</span> == Type_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?         cerr &lt;&lt; type_name &lt;&lt; &quot; is &quot; &lt;&lt; Next_type_number &lt;&lt; '\n'; //? 1</span>
-        Type_number[type_name] = Next_type_number++<span class="Delimiter">;</span>
+      if <span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>type_name<span class="Delimiter">)</span> == Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<span class="CommentedCode">//?         cerr &lt;&lt; type_name &lt;&lt; &quot; is &quot; &lt;&lt; Next_type_ordinal &lt;&lt; '\n'; //? 1</span>
+        Type_ordinal[type_name] = Next_type_ordinal++<span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
-      types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[type_name]<span class="Delimiter">);</span>
+      types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[type_name]<span class="Delimiter">);</span>
       trace<span class="Delimiter">(</span><span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  type: &quot;</span> &lt;&lt; types<span class="Delimiter">.</span>back<span class="Delimiter">();</span>
     <span class="Delimiter">}</span>
     t<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>types<span class="Delimiter">);</span>
@@ -288,38 +292,38 @@ void insert_container<span class="Delimiter">(</span>const string&amp; command<s
 
 <span class="Comment">//: ensure types created in one scenario don't leak outside it.</span>
 <span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-vector&lt;type_number&gt; recently_added_types<span class="Delimiter">;</span>
+vector&lt;type_ordinal&gt; recently_added_types<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End load_permanently&quot;)</span>  <span class="Comment">//: for non-tests</span>
 recently_added_types<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
 <span class="Delimiter">:(before &quot;End Setup&quot;)</span>  <span class="Comment">//: for tests</span>
 for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>recently_added_types<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;erasing &quot; &lt;&lt; Type[recently_added_types.at(i)].name &lt;&lt; '\n'; //? 1</span>
-  Type_number<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Type[recently_added_types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+  Type_ordinal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Type[recently_added_types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
   Type<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>recently_added_types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
 <span class="Delimiter">}</span>
 recently_added_types<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
 <span class="Comment">// delete recent type references</span>
-<span class="Comment">// can't rely on recently_added_types to cleanup Type_number, because of deliberately misbehaving tests with references to undefined types</span>
-map&lt;string<span class="Delimiter">,</span> type_number&gt;::iterator p = Type_number<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
-while<span class="Delimiter">(</span>p != Type_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<span class="Comment">// can't rely on recently_added_types to cleanup Type_ordinal, because of deliberately misbehaving tests with references to undefined types</span>
+map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;::iterator p = Type_ordinal<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
+while<span class="Delimiter">(</span>p != Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
   <span class="Comment">// save current item</span>
   string name = p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">;</span>
-  type_number t = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+  type_ordinal t = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
   <span class="Comment">// increment iterator</span>
   ++p<span class="Delimiter">;</span>
   <span class="Comment">// now delete current item if necessary</span>
   if <span class="Delimiter">(</span>t &gt;= <span class="Constant">1000</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?     cerr &lt;&lt; &quot;AAA &quot; &lt;&lt; name &lt;&lt; &quot; &quot; &lt;&lt; t &lt;&lt; '\n'; //? 1</span>
-    Type_number<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>name<span class="Delimiter">);</span>
+    Type_ordinal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>name<span class="Delimiter">);</span>
   <span class="Delimiter">}</span>
 <span class="Delimiter">}</span>
 <span class="Comment">//: lastly, ensure scenarios are consistent by always starting them at the</span>
 <span class="Comment">//: same type number.</span>
-Next_type_number = <span class="Constant">1000</span><span class="Delimiter">;</span>
+Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Test Run Initialization&quot;)</span>
-assert<span class="Delimiter">(</span>Next_type_number &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>
+assert<span class="Delimiter">(</span>Next_type_ordinal &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>
 <span class="Delimiter">:(before &quot;End Setup&quot;)</span>
-Next_type_number = <span class="Constant">1000</span><span class="Delimiter">;</span>
+Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>
 
 <span class="SalientComment">//:: Allow container definitions anywhere in the codebase, but warn if you</span>
 <span class="SalientComment">//:: can't find a definition.</span>
@@ -350,7 +354,7 @@ $warn: <span class="Constant">0</span>
   Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_invalid_types<span class="Delimiter">);</span>
 
 <span class="Delimiter">:(code)</span>
-void check_invalid_types<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void check_invalid_types<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   for <span class="Delimiter">(</span>long long int index = <span class="Constant">0</span><span class="Delimiter">;</span> index &lt; SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     const instruction&amp; inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
     for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -395,7 +399,7 @@ check_container_field_types<span class="Delimiter">();</span>
 
 <span class="Delimiter">:(code)</span>
 void check_container_field_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-  for <span class="Delimiter">(</span>map&lt;type_number<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  for <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     const type_info&amp; info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
 <span class="CommentedCode">//?     cerr &lt;&lt; &quot;checking &quot; &lt;&lt; p-&gt;first &lt;&lt; '\n'; //? 1</span>
     for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -413,7 +417,7 @@ void check_container_field_types<span class="Delimiter">()</span> <span class="D
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MERGE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;merge&quot;</span>] = MERGE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;merge&quot;</span>] = MERGE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MERGE: <span class="Delimiter">{</span>
   products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
diff --git a/html/031address.cc.html b/html/031address.cc.html
index 05819ec5..76971a4f 100644
--- a/html/031address.cc.html
+++ b/html/031address.cc.html
@@ -72,7 +72,7 @@ reagent canonize<span class="Delimiter">(</span>reagent x<span class="Delimiter"
 
 reagent deref<span class="Delimiter">(</span>reagent x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;deref: &quot; &lt;&lt; x.to_string() &lt;&lt; &quot;\n&quot;; //? 2</span>
-  static const type_number ADDRESS = Type_number[<span class="Constant">&quot;address&quot;</span>]<span class="Delimiter">;</span>
+  static const type_ordinal ADDRESS = Type_ordinal[<span class="Constant">&quot;address&quot;</span>]<span class="Delimiter">;</span>
   reagent result<span class="Delimiter">;</span>
   assert<span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == ADDRESS<span class="Delimiter">);</span>
 
diff --git a/html/032array.cc.html b/html/032array.cc.html
index f3579a43..101bd958 100644
--- a/html/032array.cc.html
+++ b/html/032array.cc.html
@@ -74,9 +74,9 @@ recipe main [
 
 <span class="Comment">//: disable the size mismatch check since the destination array need not be initialized</span>
 <span class="Delimiter">:(after &quot;bool size_mismatch(const reagent&amp; x, const vector&lt;double&gt;&amp; data)&quot;)</span>
-if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_number[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
 <span class="Delimiter">:(after &quot;long long int size_of(const reagent&amp; r)&quot;)</span>
-  if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_number[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">);</span>
     <span class="Comment">// skip the 'array' type to get at the element type</span>
     <span class="Identifier">return</span> <span class="Constant">1</span> + Memory[r<span class="Delimiter">.</span>value]*size_of<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">));</span>
@@ -108,20 +108,22 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 INDEX<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;index&quot;</span>] = INDEX<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;index&quot;</span>] = INDEX<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case INDEX: <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   if (Trace_stream) Trace_stream-&gt;dump_layer = &quot;run&quot;; //? 1</span>
   reagent base = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
 <span class="CommentedCode">//?   trace(Primitive_recipe_depth, &quot;run&quot;) &lt;&lt; &quot;ingredient 0 after canonize: &quot; &lt;&lt; base.to_string(); //? 1</span>
   long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_number[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">);</span>
   reagent offset = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
 <span class="CommentedCode">//?   trace(Primitive_recipe_depth, &quot;run&quot;) &lt;&lt; &quot;ingredient 1 after canonize: &quot; &lt;&lt; offset.to_string(); //? 1</span>
   vector&lt;double&gt; offset_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>offset<span class="Delimiter">));</span>
-  vector&lt;type_number&gt; element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span>
+  vector&lt;type_ordinal&gt; element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span>
 <span class="CommentedCode">//?   trace(Primitive_recipe_depth, &quot;run&quot;) &lt;&lt; &quot;offset: &quot; &lt;&lt; offset_val.at(0); //? 1</span>
 <span class="CommentedCode">//?   trace(Primitive_recipe_depth, &quot;run&quot;) &lt;&lt; &quot;size of elements: &quot; &lt;&lt; size_of(element_type); //? 1</span>
+  assert<span class="Delimiter">(</span>offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; Memory[base_address]*size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">)</span> + <span class="Constant">1</span><span class="Delimiter">);</span>
   long long int src = base_address + <span class="Constant">1</span> + offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">);</span>
   trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; src<span class="Delimiter">;</span>
   trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;its type is &quot;</span> &lt;&lt; Type[element_type<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
@@ -133,8 +135,8 @@ case INDEX: <span class="Delimiter">{</span>
 <span class="Delimiter">}</span>
 
 <span class="Delimiter">:(code)</span>
-vector&lt;type_number&gt; array_element<span class="Delimiter">(</span>const vector&lt;type_number&gt;&amp; types<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  <span class="Identifier">return</span> vector&lt;type_number&gt;<span class="Delimiter">(</span>++types<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> types<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
+vector&lt;type_ordinal&gt; array_element<span class="Delimiter">(</span>const vector&lt;type_ordinal&gt;&amp; types<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  <span class="Identifier">return</span> vector&lt;type_ordinal&gt;<span class="Delimiter">(</span>++types<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> types<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
 <span class="Delimiter">}</span>
 
 <span class="Delimiter">:(scenario index_address)</span>
@@ -163,15 +165,17 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 INDEX_ADDRESS<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;index-address&quot;</span>] = INDEX_ADDRESS<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;index-address&quot;</span>] = INDEX_ADDRESS<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case INDEX_ADDRESS: <span class="Delimiter">{</span>
   reagent base = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
   long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_number[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">);</span>
   reagent offset = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
   vector&lt;double&gt; offset_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>offset<span class="Delimiter">));</span>
-  vector&lt;type_number&gt; element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span>
+  vector&lt;type_ordinal&gt; element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+  assert<span class="Delimiter">(</span>offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt; Memory[base_address]*size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">)</span> + <span class="Constant">1</span><span class="Delimiter">);</span>
   long long int result = base_address + <span class="Constant">1</span> + offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">);</span>
   products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
   products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
@@ -193,11 +197,11 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 LENGTH<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;length&quot;</span>] = LENGTH<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;length&quot;</span>] = LENGTH<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case LENGTH: <span class="Delimiter">{</span>
   reagent x = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
-  if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != Type_number[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">&quot;array&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     raise &lt;&lt; <span class="Constant">&quot;tried to calculate length of non-array &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
     <span class="Identifier">break</span><span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
diff --git a/html/034exclusive_container.cc.html b/html/033exclusive_container.cc.html
index 55d8a331..c6737f59 100644
--- a/html/034exclusive_container.cc.html
+++ b/html/033exclusive_container.cc.html
@@ -2,7 +2,7 @@
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-<title>Mu - 034exclusive_container.cc</title>
+<title>Mu - 033exclusive_container.cc</title>
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v1">
 <meta name="syntax" content="cpp">
@@ -41,16 +41,16 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
 <span class="Comment">//: We'll use this container as a running example, with two number elements.</span>
 <span class="Delimiter">{</span>
-type_number tmp = Type_number[<span class="Constant">&quot;number-or-point&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
+type_ordinal tmp = Type_ordinal[<span class="Constant">&quot;number-or-point&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
 Type[tmp]<span class="Delimiter">.</span>size = <span class="Constant">2</span><span class="Delimiter">;</span>
 Type[tmp]<span class="Delimiter">.</span>kind = exclusive_container<span class="Delimiter">;</span>
 Type[tmp]<span class="Delimiter">.</span>name = <span class="Constant">&quot;number-or-point&quot;</span><span class="Delimiter">;</span>
 <span class="CommentedCode">//? cout &lt;&lt; tmp &lt;&lt; &quot;: &quot; &lt;&lt; SIZE(Type[tmp].elements) &lt;&lt; '\n'; //? 1</span>
-vector&lt;type_number&gt; t1<span class="Delimiter">;</span>
+vector&lt;type_ordinal&gt; t1<span class="Delimiter">;</span>
 t1<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>number<span class="Delimiter">);</span>
 Type[tmp]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>t1<span class="Delimiter">);</span>
 <span class="CommentedCode">//? cout &lt;&lt; SIZE(Type[tmp].elements) &lt;&lt; '\n'; //? 1</span>
-vector&lt;type_number&gt; t2<span class="Delimiter">;</span>
+vector&lt;type_ordinal&gt; t2<span class="Delimiter">;</span>
 t2<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>point<span class="Delimiter">);</span>
 Type[tmp]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>t2<span class="Delimiter">);</span>
 <span class="CommentedCode">//? cout &lt;&lt; SIZE(Type[tmp].elements) &lt;&lt; '\n'; //? 1</span>
@@ -79,7 +79,7 @@ if <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == excl
   <span class="Comment">// size of an exclusive container is the size of its largest variant</span>
   <span class="Comment">// (So like containers, it can't contain arrays.)</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;--- &quot; &lt;&lt; types.at(0) &lt;&lt; ' ' &lt;&lt; t.size &lt;&lt; '\n'; //? 1</span>
-<span class="CommentedCode">//?   cout &lt;&lt; &quot;point: &quot; &lt;&lt; Type_number[&quot;point&quot;] &lt;&lt; &quot; &quot; &lt;&lt; Type[Type_number[&quot;point&quot;]].name &lt;&lt; &quot; &quot; &lt;&lt; Type[Type_number[&quot;point&quot;]].size &lt;&lt; '\n'; //? 1</span>
+<span class="CommentedCode">//?   cout &lt;&lt; &quot;point: &quot; &lt;&lt; Type_ordinal[&quot;point&quot;] &lt;&lt; &quot; &quot; &lt;&lt; Type[Type_ordinal[&quot;point&quot;]].name &lt;&lt; &quot; &quot; &lt;&lt; Type[Type_ordinal[&quot;point&quot;]].size &lt;&lt; '\n'; //? 1</span>
 <span class="CommentedCode">//?   cout &lt;&lt; t.name &lt;&lt; ' ' &lt;&lt; t.size &lt;&lt; ' ' &lt;&lt; SIZE(t.elements) &lt;&lt; '\n'; //? 1</span>
   long long int result = <span class="Constant">0</span><span class="Delimiter">;</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; t<span class="Delimiter">.</span>size<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -99,7 +99,7 @@ if <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == excl
 <span class="Comment">//: 'maybe-convert' requires a literal in ingredient 1. We'll use a synonym</span>
 <span class="Comment">//: called 'variant'.</span>
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-Type_number[<span class="Constant">&quot;variant&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
+Type_ordinal[<span class="Constant">&quot;variant&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
 
 <span class="Delimiter">:(scenario maybe_convert)</span>
 recipe main [
@@ -122,12 +122,12 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MAYBE_CONVERT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;maybe-convert&quot;</span>] = MAYBE_CONVERT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;maybe-convert&quot;</span>] = MAYBE_CONVERT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MAYBE_CONVERT: <span class="Delimiter">{</span>
   reagent base = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
   long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-  type_number base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+  type_ordinal base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
   assert<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>kind == exclusive_container<span class="Delimiter">);</span>
   assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
   long long int tag = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">;</span>
diff --git a/html/035call.cc.html b/html/034call.cc.html
index 9b729fe1..291dfeb9 100644
--- a/html/035call.cc.html
+++ b/html/034call.cc.html
@@ -2,7 +2,7 @@
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-<title>Mu - 035call.cc</title>
+<title>Mu - 034call.cc</title>
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v1">
 <meta name="syntax" content="cpp">
@@ -70,10 +70,10 @@ recipe f [
 <span class="Comment">// recipe. When that finishes, we continue this one where we left off.</span>
 <span class="Comment">// This requires maintaining a 'stack' of interrupted recipes or 'calls'.</span>
 struct call <span class="Delimiter">{</span>
-  recipe_number running_recipe<span class="Delimiter">;</span>
+  recipe_ordinal running_recipe<span class="Delimiter">;</span>
   long long int running_step_index<span class="Delimiter">;</span>
   <span class="Comment">// End call Fields</span>
-  call<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  call<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     running_recipe = r<span class="Delimiter">;</span>
     running_step_index = <span class="Constant">0</span><span class="Delimiter">;</span>
     <span class="Comment">// End call Constructor</span>
@@ -85,12 +85,12 @@ typedef list&lt;call&gt; call_stack<span class="Delimiter">;</span>
 struct routine <span class="Delimiter">{</span>
   call_stack calls<span class="Delimiter">;</span>
   <span class="Comment">// End routine Fields</span>
-  routine<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">);</span>
+  routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">);</span>
   bool completed<span class="Delimiter">()</span> const<span class="Delimiter">;</span>
   const vector&lt;instruction&gt;&amp; steps<span class="Delimiter">()</span> const<span class="Delimiter">;</span>
 <span class="Delimiter">};</span>
 <span class="Delimiter">:(code)</span>
-routine::routine<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+routine::routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
   <span class="Comment">// End routine Constructor</span>
 <span class="Delimiter">}</span>
@@ -143,10 +143,12 @@ inline const vector&lt;instruction&gt;&amp; routine::steps<span class="Delimiter
 <span class="Comment">// when we reach the end of one call, we may reach the end of the one below</span>
 <span class="Comment">// it, and the one below that, and so on</span>
 while <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> &gt;= SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>steps<span class="Delimiter">()))</span> <span class="Delimiter">{</span>
+  <span class="Comment">// Falling Through End Of Recipe</span>
   --Callstack_depth<span class="Delimiter">;</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;reply &quot; &lt;&lt; Current_routine-&gt;calls.size() &lt;&lt; '\n'; //? 1</span>
+<span class="CommentedCode">//?   cerr &lt;&lt; &quot;reply &quot; &lt;&lt; Current_routine-&gt;calls.size() &lt;&lt; '\n'; //? 2</span>
   Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span>
   if <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+  <span class="Comment">// Complete Call Fallthrough</span>
   <span class="Comment">// todo: no results returned warning</span>
   ++current_step_index<span class="Delimiter">();</span>
 <span class="Delimiter">}</span>
diff --git a/html/036call_ingredient.cc.html b/html/035call_ingredient.cc.html
index c19b4166..08d397db 100644
--- a/html/036call_ingredient.cc.html
+++ b/html/035call_ingredient.cc.html
@@ -2,7 +2,7 @@
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-<title>Mu - 036call_ingredient.cc</title>
+<title>Mu - 035call_ingredient.cc</title>
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v1">
 <meta name="syntax" content="cpp">
@@ -66,7 +66,7 @@ for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 NEXT_INGREDIENT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;next-ingredient&quot;</span>] = NEXT_INGREDIENT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;next-ingredient&quot;</span>] = NEXT_INGREDIENT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case NEXT_INGREDIENT: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
@@ -103,7 +103,7 @@ recipe f [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 REWIND_INGREDIENTS<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;rewind-ingredients&quot;</span>] = REWIND_INGREDIENTS<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;rewind-ingredients&quot;</span>] = REWIND_INGREDIENTS<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case REWIND_INGREDIENTS: <span class="Delimiter">{</span>
   Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>next_ingredient_to_process = <span class="Constant">0</span><span class="Delimiter">;</span>
@@ -124,7 +124,7 @@ recipe f [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 INGREDIENT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;ingredient&quot;</span>] = INGREDIENT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;ingredient&quot;</span>] = INGREDIENT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case INGREDIENT: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
diff --git a/html/037call_reply.cc.html b/html/036call_reply.cc.html
index 80199b4b..2738d935 100644
--- a/html/037call_reply.cc.html
+++ b/html/036call_reply.cc.html
@@ -2,7 +2,7 @@
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-<title>Mu - 037call_reply.cc</title>
+<title>Mu - 036call_reply.cc</title>
 <meta name="Generator" content="Vim/7.4">
 <meta name="plugin-version" content="vim7.4_v1">
 <meta name="syntax" content="cpp">
@@ -49,9 +49,10 @@ recipe f [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 REPLY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;reply&quot;</span>] = REPLY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;reply&quot;</span>] = REPLY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case REPLY: <span class="Delimiter">{</span>
+  <span class="Comment">// Starting Reply</span>
   const instruction&amp; reply_inst = current_instruction<span class="Delimiter">();</span>  <span class="Comment">// save pointer into recipe before pop</span>
   const string&amp; callee = current_recipe_name<span class="Delimiter">();</span>
   --Callstack_depth<span class="Delimiter">;</span>
@@ -67,6 +68,8 @@ case REPLY: <span class="Delimiter">{</span>
   copy<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span>
   <span class="Comment">// check that any reply ingredients with /same-as-ingredient connect up</span>
   <span class="Comment">// the corresponding ingredient and product in the caller.</span>
+  if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">)</span> &gt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span>
+    raise &lt;&lt; <span class="Constant">&quot;too few values replied from &quot;</span> &lt;&lt; callee &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?     cerr &lt;&lt; Recipe[Current_routine-&gt;calls.front().running_recipe].name &lt;&lt; '\n'; //? 1</span>
     trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
@@ -74,7 +77,11 @@ case REPLY: <span class="Delimiter">{</span>
       vector&lt;string&gt; tmp = property<span class="Delimiter">(</span>reply_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot;same-as-ingredient&quot;</span><span class="Delimiter">);</span>
       assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>tmp<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">);</span>
       long long int ingredient_index = to_integer<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
-      if <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>value != caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>value<span class="Delimiter">)</span>
+      if <span class="Delimiter">(</span>ingredient_index &gt;= SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span>
+        raise &lt;&lt; current_recipe_name<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;: 'same-as-ingredient' metadata overflows ingredients in: &quot;</span> &lt;&lt; caller_instruction<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; caller_instruction.products.size() &lt;&lt; ' ' &lt;&lt; i &lt;&lt; ' ' &lt;&lt; caller_instruction.ingredients.size() &lt;&lt; ' ' &lt;&lt; ingredient_index &lt;&lt; '\n'; //? 1</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; caller_instruction.to_string() &lt;&lt; '\n'; //? 1</span>
+      if <span class="Delimiter">(</span>!is_dummy<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &amp;&amp; caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>value != caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>value<span class="Delimiter">)</span>
         raise &lt;&lt; current_recipe_name<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;: 'same-as-ingredient' result &quot;</span> &lt;&lt; caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>value &lt;&lt; <span class="Constant">&quot; from call to &quot;</span> &lt;&lt; callee &lt;&lt; <span class="Constant">&quot; must be location &quot;</span> &lt;&lt; caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>value &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
   <span class="Delimiter">}</span>
@@ -112,6 +119,18 @@ recipe test1 [
 ]
 <span class="traceContains">+warn: main: 'same-as-ingredient' result 2 from call to test1 must be location 1</span>
 
+<span class="Delimiter">:(scenario reply_same_as_ingredient_dummy)</span>
+<span class="Special">% Hide_warnings = true;</span>
+recipe main [
+  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>:literal
+  _<span class="Special"> &lt;- </span>test1 <span class="Constant">1</span>:number  <span class="Comment"># call with different ingredient and product</span>
+]
+recipe test1 [
+  <span class="Constant">10</span>:address:number<span class="Special"> &lt;- </span>next-ingredient
+  reply <span class="Constant">10</span>:address:number/same-as-ingredient:<span class="Constant">0</span>
+]
+$warn: <span class="Constant">0</span>
+
 <span class="Delimiter">:(code)</span>
 string to_string<span class="Delimiter">(</span>const vector&lt;double&gt;&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>in<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">&quot;[]&quot;</span><span class="Delimiter">;</span>
@@ -159,7 +178,7 @@ recipe test1 [
 <span class="Comment">//   ```</span>
 if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply-if&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;jump-unless&quot;</span>]<span class="Delimiter">;</span>
+  curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">&quot;jump-unless&quot;</span>]<span class="Delimiter">;</span>
   curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;jump-unless&quot;</span><span class="Delimiter">;</span>
   vector&lt;reagent&gt; results<span class="Delimiter">;</span>
   copy<span class="Delimiter">(</span>++curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>results<span class="Delimiter">,</span> results<span class="Delimiter">.</span>end<span class="Delimiter">()));</span>
@@ -167,7 +186,7 @@ if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <
   curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;1:offset&quot;</span><span class="Delimiter">));</span>
   result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
   curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;reply&quot;</span>]<span class="Delimiter">;</span>
+  curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">&quot;reply&quot;</span>]<span class="Delimiter">;</span>
   curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;reply&quot;</span><span class="Delimiter">;</span>
   curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>results<span class="Delimiter">);</span>
 <span class="Delimiter">}</span>
@@ -178,7 +197,7 @@ if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <
 <span class="Comment">//   ```</span>
 if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;reply-unless&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;jump-if&quot;</span>]<span class="Delimiter">;</span>
+  curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">&quot;jump-if&quot;</span>]<span class="Delimiter">;</span>
   curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;jump-if&quot;</span><span class="Delimiter">;</span>
   vector&lt;reagent&gt; results<span class="Delimiter">;</span>
   copy<span class="Delimiter">(</span>++curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>results<span class="Delimiter">,</span> results<span class="Delimiter">.</span>end<span class="Delimiter">()));</span>
@@ -186,7 +205,7 @@ if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <
   curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;1:offset&quot;</span><span class="Delimiter">));</span>
   result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
   curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-  curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;reply&quot;</span>]<span class="Delimiter">;</span>
+  curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">&quot;reply&quot;</span>]<span class="Delimiter">;</span>
   curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;reply&quot;</span><span class="Delimiter">;</span>
   curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>results<span class="Delimiter">);</span>
 <span class="Delimiter">}</span>
diff --git a/html/037recipe.cc.html b/html/037recipe.cc.html
new file mode 100644
index 00000000..a84b95ef
--- /dev/null
+++ b/html/037recipe.cc.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<title>Mu - 037recipe.cc</title>
+<meta name="Generator" content="Vim/7.4">
+<meta name="plugin-version" content="vim7.4_v1">
+<meta name="syntax" content="cpp">
+<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
+<meta name="colorscheme" content="minimal">
+<style type="text/css">
+<!--
+pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
+body { font-family: monospace; color: #eeeeee; background-color: #080808; }
+* { font-size: 1.05em; }
+.traceContains { color: #008000; }
+.Constant { color: #00a0a0; }
+.Comment { color: #9090ff; }
+.Delimiter { color: #a04060; }
+.Special { color: #ff6060; }
+.CommentedCode { color: #6c6c6c; }
+.Identifier { color: #804000; }
+-->
+</style>
+
+<script type='text/javascript'>
+<!--
+
+-->
+</script>
+</head>
+<body>
+<pre id='vimCodeElement'>
+<span class="Comment">//: So far we've been calling a fixed recipe in each instruction, but we'd</span>
+<span class="Comment">//: also like to make the recipe a variable, pass recipes to &quot;higher-order&quot;</span>
+<span class="Comment">//: recipes, return recipes from recipes and so on.</span>
+
+<span class="Delimiter">:(scenario call_literal_recipe)</span>
+recipe main [
+  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>call f:recipe<span class="Delimiter">,</span> <span class="Constant">34</span>:literal
+]
+recipe f [
+  <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>next-ingredient
+  reply <span class="Constant">2</span>:number
+]
+<span class="traceContains">+mem: storing 34 in location 1</span>
+
+<span class="Delimiter">:(scenario call_variable)</span>
+recipe main [
+  <span class="Constant">1</span>:recipe-ordinal<span class="Special"> &lt;- </span>copy f:recipe
+  <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>call <span class="Constant">1</span>:recipe-ordinal<span class="Delimiter">,</span> <span class="Constant">34</span>:literal
+]
+recipe f [
+  <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>next-ingredient
+  reply <span class="Constant">3</span>:number
+]
+<span class="traceContains">+mem: storing 34 in location 2</span>
+<span class="CommentedCode">#? ?</span>
+
+<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<span class="Comment">// 'recipe' is a literal</span>
+Type_ordinal[<span class="Constant">&quot;recipe&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
+<span class="Comment">// 'recipe-ordinal' is the literal that can store recipe literals</span>
+type_ordinal recipe_ordinal = Type_ordinal[<span class="Constant">&quot;recipe-ordinal&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
+Type[recipe_ordinal]<span class="Delimiter">.</span>name = <span class="Constant">&quot;recipe-ordinal&quot;</span><span class="Delimiter">;</span>
+
+<span class="Delimiter">:(before &quot;End Reagent-parsing Exceptions&quot;)</span>
+if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">&quot;recipe&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>Recipe_ordinal[r<span class="Delimiter">.</span>name]<span class="Delimiter">);</span>
+  <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span class="Delimiter">}</span>
+
+<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+CALL<span class="Delimiter">,</span>
+<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+Recipe_ordinal[<span class="Constant">&quot;call&quot;</span>] = CALL<span class="Delimiter">;</span>
+<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+case CALL: <span class="Delimiter">{</span>
+  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+  <span class="Comment">// todo: when we start doing type checking this will be a prime point of</span>
+  <span class="Comment">// attention, so we don't accidentally allow external data to a program to</span>
+  <span class="Comment">// run as code.</span>
+  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+  ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>  <span class="Comment">// drop the callee</span>
+  <span class="Identifier">goto</span> complete_call<span class="Delimiter">;</span>
+<span class="Delimiter">}</span>
+</pre>
+</body>
+</html>
+<!-- vim: set foldmethod=manual : -->
diff --git a/html/038scheduler.cc.html b/html/038scheduler.cc.html
index 973a8712..89bd5f74 100644
--- a/html/038scheduler.cc.html
+++ b/html/038scheduler.cc.html
@@ -81,8 +81,8 @@ long long int Scheduling_interval = <span class="Constant">500</span><span class
 <span class="Delimiter">:(before &quot;End Setup&quot;)</span>
 Scheduling_interval = <span class="Constant">500</span><span class="Delimiter">;</span>
 Routines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<span class="Delimiter">:(replace{} &quot;void run(recipe_number r)&quot;)</span>
-void run<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span class="Delimiter">:(replace{} &quot;void run(recipe_ordinal r)&quot;)</span>
+void run<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA 4\n&quot;; //? 1</span>
   Routines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new routine<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA &quot; &lt;&lt; Routines.size() &lt;&lt; &quot; routines\n&quot;; //? 1</span>
@@ -163,10 +163,6 @@ Next_routine_id = <span class="Constant">1</span><span class="Delimiter">;</span
 id = Next_routine_id<span class="Delimiter">;</span>
 Next_routine_id++<span class="Delimiter">;</span>
 
-<span class="Comment">//: it needs a new type: 'recipe'</span>
-<span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-Type_number[<span class="Constant">&quot;recipe&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
-
 <span class="Comment">//: routines save the routine that spawned them</span>
 <span class="Delimiter">:(before &quot;End routine Fields&quot;)</span>
 <span class="Comment">// todo: really should be routine_id, but that's less efficient.</span>
@@ -177,12 +173,10 @@ parent_index = -<span class="Constant">1</span><span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 START_RUNNING<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;start-running&quot;</span>] = START_RUNNING<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;start-running&quot;</span>] = START_RUNNING<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case START_RUNNING: <span class="Delimiter">{</span>
-  assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
-  assert<span class="Delimiter">(</span>!current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>initialized<span class="Delimiter">);</span>
-  routine* new_routine = new routine<span class="Delimiter">(</span>Recipe_number[current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">);</span>
+  routine* new_routine = new routine<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; new_routine-&gt;id &lt;&lt; &quot; -&gt; &quot; &lt;&lt; Current_routine-&gt;id &lt;&lt; '\n'; //? 1</span>
   new_routine<span class="Delimiter">-&gt;</span>parent_index = Current_routine_index<span class="Delimiter">;</span>
   <span class="Comment">// populate ingredients</span>
@@ -253,8 +247,8 @@ recipe f2 [
 <span class="Comment">//: this scenario will require some careful setup in escaped C++</span>
 <span class="Comment">//: (straining our tangle capabilities to near-breaking point)</span>
 <span class="Delimiter">:(scenario scheduler_skips_completed_routines)</span>
-<span class="Special">% recipe_number f1 = load(&quot;recipe f1 [\n1:number &lt;- copy 0:literal\n]&quot;).front();</span>
-<span class="Special">% recipe_number f2 = load(&quot;recipe f2 [\n2:number &lt;- copy 0:literal\n]&quot;).front();</span>
+<span class="Special">% recipe_ordinal f1 = load(&quot;recipe f1 [\n1:number &lt;- copy 0:literal\n]&quot;).front();</span>
+<span class="Special">% recipe_ordinal f2 = load(&quot;recipe f2 [\n2:number &lt;- copy 0:literal\n]&quot;).front();</span>
 <span class="Special">% Routines.push_back(new routine(f1));  // f1 meant to run</span>
 <span class="Special">% Routines.push_back(new routine(f2));</span>
 <span class="Special">% Routines.back()-&gt;state = COMPLETED;  // f2 not meant to run</span>
@@ -343,7 +337,7 @@ recipe f2 [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 ROUTINE_STATE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;routine-state&quot;</span>] = ROUTINE_STATE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;routine-state&quot;</span>] = ROUTINE_STATE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case ROUTINE_STATE: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -365,7 +359,7 @@ case ROUTINE_STATE: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 RESTART<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;restart&quot;</span>] = RESTART<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;restart&quot;</span>] = RESTART<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case RESTART: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -382,7 +376,7 @@ case RESTART: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 STOP<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;stop&quot;</span>] = STOP<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;stop&quot;</span>] = STOP<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case STOP: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -399,7 +393,7 @@ case STOP: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _DUMP_ROUTINES<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$dump-routines&quot;</span>] = _DUMP_ROUTINES<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$dump-routines&quot;</span>] = _DUMP_ROUTINES<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _DUMP_ROUTINES: <span class="Delimiter">{</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
diff --git a/html/039wait.cc.html b/html/039wait.cc.html
index c9f72f72..34043e76 100644
--- a/html/039wait.cc.html
+++ b/html/039wait.cc.html
@@ -67,7 +67,7 @@ waiting_on_location = old_value_of_waiting_location = <span class="Constant">0</
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 WAIT_FOR_LOCATION<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;wait-for-location&quot;</span>] = WAIT_FOR_LOCATION<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;wait-for-location&quot;</span>] = WAIT_FOR_LOCATION<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case WAIT_FOR_LOCATION: <span class="Delimiter">{</span>
   reagent loc = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
@@ -127,7 +127,7 @@ waiting_on_routine = <span class="Constant">0</span><span class="Delimiter">;</s
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 WAIT_FOR_ROUTINE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;wait-for-routine&quot;</span>] = WAIT_FOR_ROUTINE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;wait-for-routine&quot;</span>] = WAIT_FOR_ROUTINE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case WAIT_FOR_ROUTINE: <span class="Delimiter">{</span>
   Current_routine<span class="Delimiter">-&gt;</span>state = WAITING<span class="Delimiter">;</span>
@@ -158,7 +158,7 @@ for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 SWITCH<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;switch&quot;</span>] = SWITCH<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;switch&quot;</span>] = SWITCH<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case SWITCH: <span class="Delimiter">{</span>
   long long int id = some_other_running_routine<span class="Delimiter">();</span>
diff --git a/html/040brace.cc.html b/html/040brace.cc.html
index 12122f75..f5f3921c 100644
--- a/html/040brace.cc.html
+++ b/html/040brace.cc.html
@@ -14,6 +14,7 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-
 body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 1.05em; }
 .traceContains { color: #008000; }
+.cSpecial { color: #008000; }
 .Constant { color: #00a0a0; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #a04060; }
@@ -69,7 +70,7 @@ recipe main [
   Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_braces<span class="Delimiter">);</span>
 
 <span class="Delimiter">:(code)</span>
-void transform_braces<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void transform_braces<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;AAA transform_braces\n&quot;; //? 1</span>
 <span class="CommentedCode">//?   exit(0); //? 1</span>
   const int OPEN = <span class="Constant">0</span><span class="Delimiter">,</span> CLOSE = <span class="Constant">1</span><span class="Delimiter">;</span>
@@ -89,103 +90,65 @@ void transform_braces<span class="Delimiter">(</span>const recipe_number r<span
   stack&lt;<span class="Comment">/*</span><span class="Comment">step</span><span class="Comment">*/</span>long long int&gt; open_braces<span class="Delimiter">;</span>
   trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
   for <span class="Delimiter">(</span>long long int index = <span class="Constant">0</span><span class="Delimiter">;</span> index &lt; SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; index &lt;&lt; '\n'; //? 1</span>
     instruction&amp; inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-<span class="CommentedCode">//?     cout &lt;&lt; &quot;AAA &quot; &lt;&lt; inst.name &lt;&lt; &quot;: &quot; &lt;&lt; inst.operation &lt;&lt; '\n'; //? 1</span>
-    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;{&quot;</span><span class="Delimiter">)</span> open_braces<span class="Delimiter">.</span>push<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> open_braces<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
-    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span>
-      <span class="Delimiter">;</span>  <span class="Comment">// do nothing</span>
-    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;loop&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;jump&quot;</span>]<span class="Delimiter">;</span>
-      if <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// explicit target; a later phase will handle it</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      else <span class="Delimiter">{</span>
-        reagent ing<span class="Delimiter">;</span>
-        ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span>
-        ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;offset&quot;</span>]<span class="Delimiter">);</span>
-        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; ing<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; index &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; ing<span class="Delimiter">.</span>to_string<span class="Delimiter">();</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; index &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">).</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>to_string<span class="Delimiter">();</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;break&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;jump&quot;</span>]<span class="Delimiter">;</span>
-      if <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// explicit target; a later phase will handle it</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      else <span class="Delimiter">{</span>
-        reagent ing<span class="Delimiter">;</span>
-        ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span>
-        ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;offset&quot;</span>]<span class="Delimiter">);</span>
-        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; ing<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-    <span class="Delimiter">}</span>
-    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;loop-if&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;jump-if&quot;</span>]<span class="Delimiter">;</span>
-      if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// explicit target; a later phase will handle it</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      else <span class="Delimiter">{</span>
-        reagent ing<span class="Delimiter">;</span>
-        ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span>
-        ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;offset&quot;</span>]<span class="Delimiter">);</span>
-        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-if &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; ing<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;{&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      open_braces<span class="Delimiter">.</span>push<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+      <span class="Identifier">continue</span><span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
-    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;break-if&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;jump-if&quot;</span>]<span class="Delimiter">;</span>
-      if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// explicit target; a later phase will handle it</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      else <span class="Delimiter">{</span>
-        reagent ing<span class="Delimiter">;</span>
-        ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span>
-        ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;offset&quot;</span>]<span class="Delimiter">);</span>
-        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-if &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; ing<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">&quot;}&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      open_braces<span class="Delimiter">.</span>pop<span class="Delimiter">();</span>
+      <span class="Identifier">continue</span><span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
-    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;loop-unless&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;jump-unless&quot;</span>]<span class="Delimiter">;</span>
-      if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// explicit target; a later phase will handle it</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      else <span class="Delimiter">{</span>
-        reagent ing<span class="Delimiter">;</span>
-        ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span>
-        ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;offset&quot;</span>]<span class="Delimiter">);</span>
-        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-unless &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; ing<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">&quot;loop&quot;</span>]
+         &amp;&amp; inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">&quot;loop-if&quot;</span>]
+         &amp;&amp; inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">&quot;loop-unless&quot;</span>]
+         &amp;&amp; inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">&quot;break&quot;</span>]
+         &amp;&amp; inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">&quot;break-if&quot;</span>]
+         &amp;&amp; inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">&quot;break-unless&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; ...&quot;</span><span class="Delimiter">;</span>
+      <span class="Identifier">continue</span><span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
-    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;break-unless&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?       cout &lt;&lt; &quot;AAA break-unless\n&quot;; //? 1</span>
-      inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;jump-unless&quot;</span>]<span class="Delimiter">;</span>
+    <span class="Comment">// update instruction operation</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span>
+      inst<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">&quot;jump-if&quot;</span>]<span class="Delimiter">;</span>
+    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span>
+      inst<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">&quot;jump-unless&quot;</span>]<span class="Delimiter">;</span>
+    else
+      inst<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">&quot;jump&quot;</span>]<span class="Delimiter">;</span>
+    <span class="Comment">// check for explicitly provided targets</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos || inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      <span class="Comment">// conditional branches check arg 1</span>
       if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
-        <span class="Comment">// explicit target; a later phase will handle it</span>
         trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
-      <span class="Delimiter">}</span>
-      else <span class="Delimiter">{</span>
-        reagent ing<span class="Delimiter">;</span>
-        ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span>
-        ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;offset&quot;</span>]<span class="Delimiter">);</span>
-        inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span>
-        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-unless &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; ing<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
+        <span class="Identifier">continue</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
     <span class="Delimiter">}</span>
     else <span class="Delimiter">{</span>
-      trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; ...&quot;</span><span class="Delimiter">;</span>
+      <span class="Comment">// unconditional branches check arg 0</span>
+      if <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+        trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
+        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+      <span class="Delimiter">}</span>
     <span class="Delimiter">}</span>
+    <span class="Comment">// if implicit, compute target</span>
+    reagent target<span class="Delimiter">;</span>
+    target<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;offset&quot;</span>]<span class="Delimiter">);</span>
+    target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+    if <span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
+      raise &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; wasn't inside {}</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;loop&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span>
+      target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span>
+    else  <span class="Comment">// break instruction</span>
+      target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span>
+    inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>target<span class="Delimiter">);</span>
+    <span class="Comment">// log computed target</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-if&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span>
+      trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-if &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; target<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
+    else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;-unless&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span>
+      trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump-unless &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; target<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
+    else
+      trace<span class="Delimiter">(</span><span class="Constant">&quot;after-brace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; target<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot;:offset&quot;</span><span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
 <span class="Delimiter">}</span>
 
@@ -219,12 +182,12 @@ LOOP<span class="Delimiter">,</span>
 LOOP_IF<span class="Delimiter">,</span>
 LOOP_UNLESS<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;break&quot;</span>] = BREAK<span class="Delimiter">;</span>
-Recipe_number[<span class="Constant">&quot;break-if&quot;</span>] = BREAK_IF<span class="Delimiter">;</span>
-Recipe_number[<span class="Constant">&quot;break-unless&quot;</span>] = BREAK_UNLESS<span class="Delimiter">;</span>
-Recipe_number[<span class="Constant">&quot;loop&quot;</span>] = LOOP<span class="Delimiter">;</span>
-Recipe_number[<span class="Constant">&quot;loop-if&quot;</span>] = LOOP_IF<span class="Delimiter">;</span>
-Recipe_number[<span class="Constant">&quot;loop-unless&quot;</span>] = LOOP_UNLESS<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;break&quot;</span>] = BREAK<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;break-if&quot;</span>] = BREAK_IF<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;break-unless&quot;</span>] = BREAK_UNLESS<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;loop&quot;</span>] = LOOP<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;loop-if&quot;</span>] = LOOP_IF<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;loop-unless&quot;</span>] = LOOP_UNLESS<span class="Delimiter">;</span>
 
 <span class="Delimiter">:(scenario loop)</span>
 recipe main [
@@ -427,6 +390,13 @@ recipe test-factorial [
   <span class="Constant">4</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:number  <span class="Comment"># trigger a read</span>
 ]
 <span class="traceContains">+mem: location 2 is 120</span>
+
+<span class="Delimiter">:(scenario break_outside_braces_warns)</span>
+<span class="Special">% Hide_warnings = true;</span>
+recipe main [
+  <span class="Identifier">break</span>
+]
+<span class="traceContains">+warn: break wasn't inside {}</span>
 </pre>
 </body>
 </html>
diff --git a/html/041name.cc.html b/html/041name.cc.html
index f465a974..a019f954 100644
--- a/html/041name.cc.html
+++ b/html/041name.cc.html
@@ -56,18 +56,18 @@ recipe main [
   Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_names<span class="Delimiter">);</span>
 
 <span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;recipe_number<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> long long int&gt; &gt; Name<span class="Delimiter">;</span>
+map&lt;recipe_ordinal<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> long long int&gt; &gt; Name<span class="Delimiter">;</span>
 <span class="Delimiter">:(after &quot;Clear Other State For recently_added_recipes&quot;)</span>
 for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>recently_added_recipes<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   Name<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>recently_added_recipes<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
 <span class="Delimiter">}</span>
 
 <span class="Delimiter">:(code)</span>
-void transform_names<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void transform_names<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   bool names_used = <span class="Constant">false</span><span class="Delimiter">;</span>
   bool numeric_locations_used = <span class="Constant">false</span><span class="Delimiter">;</span>
   map&lt;string<span class="Delimiter">,</span> long long int&gt;&amp; names = Name[r]<span class="Delimiter">;</span>
-  map&lt;string<span class="Delimiter">,</span> vector&lt;type_number&gt; &gt; metadata<span class="Delimiter">;</span>
+  map&lt;string<span class="Delimiter">,</span> vector&lt;type_ordinal&gt; &gt; metadata<span class="Delimiter">;</span>
   <span class="Comment">// store the indices 'used' so far in the map</span>
   long long int&amp; curr_idx = names[<span class="Constant">&quot;&quot;</span>]<span class="Delimiter">;</span>
   ++curr_idx<span class="Delimiter">;</span>  <span class="Comment">// avoid using index 0, benign skip in some other cases</span>
@@ -98,11 +98,11 @@ void transform_names<span class="Delimiter">(</span>const recipe_number r<span c
       inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>lookup_name<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">),</span> r<span class="Delimiter">));</span>
     <span class="Delimiter">}</span>
   <span class="Delimiter">}</span>
-  if <span class="Delimiter">(</span>names_used &amp;&amp; numeric_locations_used &amp;&amp; r != Recipe_number[<span class="Constant">&quot;interactive&quot;</span>]<span class="Delimiter">)</span>
+  if <span class="Delimiter">(</span>names_used &amp;&amp; numeric_locations_used &amp;&amp; r != Recipe_ordinal[<span class="Constant">&quot;interactive&quot;</span>]<span class="Delimiter">)</span>
     raise &lt;&lt; <span class="Constant">&quot;mixing variable names and numeric addresses in &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
-void check_metadata<span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> vector&lt;type_number&gt; &gt;&amp; metadata<span class="Delimiter">,</span> const reagent&amp; x<span class="Delimiter">,</span> const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void check_metadata<span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> vector&lt;type_ordinal&gt; &gt;&amp; metadata<span class="Delimiter">,</span> const reagent&amp; x<span class="Delimiter">,</span> const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
   if <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
   <span class="Comment">// if you use raw locations you're probably doing something unsafe</span>
@@ -130,19 +130,19 @@ bool already_transformed<span class="Delimiter">(</span>const reagent&amp; r<spa
   <span class="Identifier">return</span> names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">)</span> != names<span class="Delimiter">.</span>end<span class="Delimiter">();</span>
 <span class="Delimiter">}</span>
 
-long long int lookup_name<span class="Delimiter">(</span>const reagent&amp; r<span class="Delimiter">,</span> const recipe_number default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+long long int lookup_name<span class="Delimiter">(</span>const reagent&amp; r<span class="Delimiter">,</span> const recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Identifier">return</span> Name[default_recipe][r<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
-type_number skip_addresses<span class="Delimiter">(</span>const vector&lt;type_number&gt;&amp; types<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+type_ordinal skip_addresses<span class="Delimiter">(</span>const vector&lt;type_ordinal&gt;&amp; types<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>types<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    if <span class="Delimiter">(</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != Type_number[<span class="Constant">&quot;address&quot;</span>]<span class="Delimiter">)</span> <span class="Identifier">return</span> types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+    if <span class="Delimiter">(</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">&quot;address&quot;</span>]<span class="Delimiter">)</span> <span class="Identifier">return</span> types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
   <span class="Delimiter">}</span>
   raise &lt;&lt; <span class="Constant">&quot;expected a container&quot;</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; die<span class="Delimiter">();</span>
   <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
-int find_element_name<span class="Delimiter">(</span>const type_number t<span class="Delimiter">,</span> const string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+int find_element_name<span class="Delimiter">(</span>const type_ordinal t<span class="Delimiter">,</span> const string&amp; name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   const type_info&amp; container = Type[t]<span class="Delimiter">;</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;looking for element &quot; &lt;&lt; name &lt;&lt; &quot; in type &quot; &lt;&lt; container.name &lt;&lt; &quot; with &quot; &lt;&lt; SIZE(container.element_names) &lt;&lt; &quot; elements\n&quot;; //? 1</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>container<span class="Delimiter">.</span>element_names<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -251,8 +251,8 @@ recipe main [
 
 <span class="Delimiter">:(after &quot;Per-recipe Transforms&quot;)</span>
 <span class="Comment">// replace element names of containers with offsets</span>
-if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;get&quot;</span>]
-    || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;get-address&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;get&quot;</span>]
+    || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;get-address&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Comment">// at least 2 args, and second arg is offset</span>
   assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">2</span><span class="Delimiter">);</span>
 <span class="CommentedCode">//?   cout &lt;&lt; inst.ingredients.at(1).to_string() &lt;&lt; '\n'; //? 1</span>
@@ -260,7 +260,7 @@ if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation
     raise &lt;&lt; inst<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot;: expected literal; got &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; die<span class="Delimiter">();</span>
   if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     <span class="Comment">// since first non-address in base type must be a container, we don't have to canonize</span>
-    type_number base_type = skip_addresses<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>types<span class="Delimiter">);</span>
+    type_ordinal base_type = skip_addresses<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>types<span class="Delimiter">);</span>
     inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>find_element_name<span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span>
     trace<span class="Delimiter">(</span><span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;element &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; of type &quot;</span> &lt;&lt; Type[base_type]<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; is at offset &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
@@ -291,13 +291,13 @@ recipe main [
 
 <span class="Delimiter">:(after &quot;Per-recipe Transforms&quot;)</span>
 <span class="Comment">// convert variant names of exclusive containers</span>
-if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;maybe-convert&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;maybe-convert&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Comment">// at least 2 args, and second arg is offset</span>
   assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">2</span><span class="Delimiter">);</span>
   assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
   if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     <span class="Comment">// since first non-address in base type must be an exclusive container, we don't have to canonize</span>
-    type_number base_type = skip_addresses<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>types<span class="Delimiter">);</span>
+    type_ordinal base_type = skip_addresses<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>types<span class="Delimiter">);</span>
     inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>find_element_name<span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span>
     trace<span class="Delimiter">(</span><span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;variant &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; of type &quot;</span> &lt;&lt; Type[base_type]<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; has tag &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
diff --git a/html/042new.cc.html b/html/042new.cc.html
index ca62a658..ec3963ed 100644
--- a/html/042new.cc.html
+++ b/html/042new.cc.html
@@ -63,10 +63,10 @@ trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimite
 <span class="SalientComment">//:: First handle 'type' operands.</span>
 
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-Type_number[<span class="Constant">&quot;type&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
+Type_ordinal[<span class="Constant">&quot;type&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
 <span class="Delimiter">:(after &quot;Per-recipe Transforms&quot;)</span>
-<span class="Comment">// replace type names with type_numbers</span>
-if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;new&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span class="Comment">// replace type names with type_ordinals</span>
+if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;new&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Comment">// End NEW Transform Special-cases</span>
   <span class="Comment">// first arg must be of type 'type'</span>
   assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">1</span><span class="Delimiter">);</span>
@@ -74,10 +74,10 @@ if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation
     raise &lt;&lt; <span class="Constant">&quot;expected literal, got &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; die<span class="Delimiter">();</span>
   if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != <span class="Constant">&quot;type&quot;</span><span class="Delimiter">)</span>
     raise &lt;&lt; <span class="Constant">&quot;tried to allocate non-type &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot; in recipe &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; die<span class="Delimiter">();</span>
-  if <span class="Delimiter">(</span>Type_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> == Type_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
+  if <span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> == Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
     raise &lt;&lt; <span class="Constant">&quot;unknown type &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; in recipe &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; die<span class="Delimiter">();</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;type &quot; &lt;&lt; inst.ingredients.at(0).name &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Type_number[inst.ingredients.at(0).name] &lt;&lt; '\n'; //? 1</span>
-  inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>Type_number[inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">);</span>
+<span class="CommentedCode">//?   cerr &lt;&lt; &quot;type &quot; &lt;&lt; inst.ingredients.at(0).name &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Type_ordinal[inst.ingredients.at(0).name] &lt;&lt; '\n'; //? 1</span>
+  inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>Type_ordinal[inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">);</span>
   trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;new&quot;</span><span class="Delimiter">)</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">;</span>
   end_new_transform:<span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
@@ -88,14 +88,14 @@ if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 NEW<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;new&quot;</span>] = NEW<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;new&quot;</span>] = NEW<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case NEW: <span class="Delimiter">{</span>
   <span class="Comment">// compute the space we need</span>
   long long int size = <span class="Constant">0</span><span class="Delimiter">;</span>
   long long int array_length = <span class="Constant">0</span><span class="Delimiter">;</span>
   <span class="Delimiter">{</span>
-    vector&lt;type_number&gt; type<span class="Delimiter">;</span>
+    vector&lt;type_ordinal&gt; type<span class="Delimiter">;</span>
     assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
     type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>value<span class="Delimiter">);</span>
 <span class="CommentedCode">//?     trace(Primitive_recipe_depth, &quot;mem&quot;) &lt;&lt; &quot;type &quot; &lt;&lt; current_instruction().ingredients.at(0).to_string() &lt;&lt; ' ' &lt;&lt; type.size() &lt;&lt; ' ' &lt;&lt; type.back() &lt;&lt; &quot; has size &quot; &lt;&lt; size_of(type); //? 1</span>
@@ -238,17 +238,22 @@ recipe main [
 <span class="Delimiter">:(after &quot;case NEW&quot; following &quot;Primitive Recipe Implementations&quot;)</span>
 if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span>
     &amp;&amp; current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>new_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span>
+  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span class="Delimiter">}</span>
+
+<span class="Delimiter">:(code)</span>
+long long int new_string<span class="Delimiter">(</span>const string&amp; contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Comment">// allocate an array just large enough for it</span>
-  long long int string_length = unicode_length<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span>
+  long long int string_length = unicode_length<span class="Delimiter">(</span>contents<span class="Delimiter">);</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;string_length is &quot; &lt;&lt; string_length &lt;&lt; '\n'; //? 1</span>
   ensure_space<span class="Delimiter">(</span>string_length+<span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">// don't forget the extra location for array size</span>
-  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>alloc<span class="Delimiter">);</span>
   <span class="Comment">// initialize string</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;new string literal: &quot; &lt;&lt; current_instruction().ingredients.at(0).name &lt;&lt; '\n'; //? 1</span>
+  long long int result = Current_routine<span class="Delimiter">-&gt;</span>alloc<span class="Delimiter">;</span>
   Memory[Current_routine<span class="Delimiter">-&gt;</span>alloc++] = string_length<span class="Delimiter">;</span>
   long long int curr = <span class="Constant">0</span><span class="Delimiter">;</span>
-  const string&amp; contents = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">;</span>
   const char* raw_contents = contents<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; string_length<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     uint32_t curr_character<span class="Delimiter">;</span>
@@ -259,7 +264,7 @@ if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>cur
     ++Current_routine<span class="Delimiter">-&gt;</span>alloc<span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
   <span class="Comment">// mu strings are not null-terminated in memory</span>
-  <span class="Identifier">break</span><span class="Delimiter">;</span>
+  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
 <span class="Comment">//: Allocate more to routine when initializing a literal string</span>
diff --git a/html/043space.cc.html b/html/043space.cc.html
index f43b35a5..f6d61fba 100644
--- a/html/043space.cc.html
+++ b/html/043space.cc.html
@@ -85,8 +85,8 @@ default_space = <span class="Constant">0</span><span class="Delimiter">;</span>
 reagent r = absolutize<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
 <span class="Delimiter">:(code)</span>
 reagent absolutize<span class="Delimiter">(</span>reagent x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?   if (Recipe_number.find(&quot;increment-counter&quot;) != Recipe_number.end()) //? 1</span>
-<span class="CommentedCode">//?     cout &lt;&lt; &quot;AAA &quot; &lt;&lt; &quot;increment-counter/2: &quot; &lt;&lt; Recipe[Recipe_number[&quot;increment-counter&quot;]].steps.at(2).products.at(0).to_string() &lt;&lt; '\n'; //? 1</span>
+<span class="CommentedCode">//?   if (Recipe_ordinal.find(&quot;increment-counter&quot;) != Recipe_ordinal.end()) //? 1</span>
+<span class="CommentedCode">//?     cout &lt;&lt; &quot;AAA &quot; &lt;&lt; &quot;increment-counter/2: &quot; &lt;&lt; Recipe[Recipe_ordinal[&quot;increment-counter&quot;]].steps.at(2).products.at(0).to_string() &lt;&lt; '\n'; //? 1</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;absolutize &quot; &lt;&lt; x.to_string() &lt;&lt; '\n'; //? 4</span>
 <span class="CommentedCode">//?   cout &lt;&lt; is_raw(x) &lt;&lt; '\n'; //? 1</span>
   if <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> x<span class="Delimiter">;</span>
diff --git a/html/045closure_name.cc.html b/html/045closure_name.cc.html
index 85686258..892495e8 100644
--- a/html/045closure_name.cc.html
+++ b/html/045closure_name.cc.html
@@ -69,13 +69,13 @@ recipe increment-counter [
 <span class="Comment">//: surrounding space of each recipe. This must happen before transform_names.</span>
 
 <span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-map&lt;recipe_number<span class="Delimiter">,</span> recipe_number&gt; Surrounding_space<span class="Delimiter">;</span>
+map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe_ordinal&gt; Surrounding_space<span class="Delimiter">;</span>
 
 <span class="Delimiter">:(after &quot;int main&quot;)</span>
   Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>collect_surrounding_spaces<span class="Delimiter">);</span>
 
 <span class="Delimiter">:(code)</span>
-void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     const instruction&amp; inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
     if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
@@ -83,9 +83,9 @@ void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_numb
       if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
       if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>name != <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
       if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">)</span> != <span class="Constant">3</span>
-          || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != Type_number[<span class="Constant">&quot;address&quot;</span>]
-          || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)</span> != Type_number[<span class="Constant">&quot;array&quot;</span>]
-          || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)</span> != Type_number[<span class="Constant">&quot;location&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+          || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">&quot;address&quot;</span>]
+          || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">&quot;array&quot;</span>]
+          || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">&quot;location&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         raise &lt;&lt; <span class="Constant">&quot;slot 0 should always have type address:array:location, but is &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
         <span class="Identifier">continue</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
@@ -95,12 +95,12 @@ void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_numb
       if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>s<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> raise &lt;&lt; <span class="Constant">&quot;slot 0 should have a single value in /names, got &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
       string surrounding_recipe_name = s<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
       if <span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">.</span>find<span class="Delimiter">(</span>r<span class="Delimiter">)</span> != Surrounding_space<span class="Delimiter">.</span>end<span class="Delimiter">()</span>
-          &amp;&amp; Surrounding_space[r] != Recipe_number[surrounding_recipe_name]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+          &amp;&amp; Surrounding_space[r] != Recipe_ordinal[surrounding_recipe_name]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         raise &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; can have only one 'surrounding' recipe but has &quot;</span> &lt;&lt; Recipe[Surrounding_space[r]]<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; and &quot;</span> &lt;&lt; surrounding_recipe_name &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
         <span class="Identifier">continue</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
       trace<span class="Delimiter">(</span><span class="Constant">&quot;name&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;recipe &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; is surrounded by &quot;</span> &lt;&lt; surrounding_recipe_name<span class="Delimiter">;</span>
-      Surrounding_space[r] = Recipe_number[surrounding_recipe_name]<span class="Delimiter">;</span>
+      Surrounding_space[r] = Recipe_ordinal[surrounding_recipe_name]<span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
   <span class="Delimiter">}</span>
 <span class="Delimiter">}</span>
@@ -108,8 +108,8 @@ void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_numb
 <span class="Comment">//: Once surrounding spaces are available, transform_names uses them to handle</span>
 <span class="Comment">//: /space properties.</span>
 
-<span class="Delimiter">:(replace{} &quot;long long int lookup_name(const reagent&amp; r, const recipe_number default_recipe)&quot;)</span>
-long long int lookup_name<span class="Delimiter">(</span>const reagent&amp; x<span class="Delimiter">,</span> const recipe_number default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span class="Delimiter">:(replace{} &quot;long long int lookup_name(const reagent&amp; r, const recipe_ordinal default_recipe)&quot;)</span>
+long long int lookup_name<span class="Delimiter">(</span>const reagent&amp; x<span class="Delimiter">,</span> const recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;AAA &quot; &lt;&lt; default_recipe &lt;&lt; &quot; &quot; &lt;&lt; Recipe[default_recipe].name &lt;&lt; '\n'; //? 2</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;AAA &quot; &lt;&lt; x.to_string() &lt;&lt; '\n'; //? 1</span>
   if <span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;space&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
@@ -120,15 +120,15 @@ long long int lookup_name<span class="Delimiter">(</span>const reagent&amp; x<sp
   if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>p<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> raise &lt;&lt; <span class="Constant">&quot;/space property should have exactly one (non-negative integer) value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
   long long int n = to_integer<span class="Delimiter">(</span>p<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
   assert<span class="Delimiter">(</span>n &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-  recipe_number surrounding_recipe = lookup_surrounding_recipe<span class="Delimiter">(</span>default_recipe<span class="Delimiter">,</span> n<span class="Delimiter">);</span>
-  set&lt;recipe_number&gt; done<span class="Delimiter">;</span>
-  vector&lt;recipe_number&gt; path<span class="Delimiter">;</span>
+  recipe_ordinal surrounding_recipe = lookup_surrounding_recipe<span class="Delimiter">(</span>default_recipe<span class="Delimiter">,</span> n<span class="Delimiter">);</span>
+  set&lt;recipe_ordinal&gt; done<span class="Delimiter">;</span>
+  vector&lt;recipe_ordinal&gt; path<span class="Delimiter">;</span>
   <span class="Identifier">return</span> lookup_name<span class="Delimiter">(</span>x<span class="Delimiter">,</span> surrounding_recipe<span class="Delimiter">,</span> done<span class="Delimiter">,</span> path<span class="Delimiter">);</span>
 <span class="Delimiter">}</span>
 
 <span class="Comment">// If the recipe we need to lookup this name in doesn't have names done yet,</span>
 <span class="Comment">// recursively call transform_names on it.</span>
-long long int lookup_name<span class="Delimiter">(</span>const reagent&amp; x<span class="Delimiter">,</span> const recipe_number r<span class="Delimiter">,</span> set&lt;recipe_number&gt;&amp; done<span class="Delimiter">,</span> vector&lt;recipe_number&gt;&amp; path<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+long long int lookup_name<span class="Delimiter">(</span>const reagent&amp; x<span class="Delimiter">,</span> const recipe_ordinal r<span class="Delimiter">,</span> set&lt;recipe_ordinal&gt;&amp; done<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt;&amp; path<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>!Name[r]<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
   if <span class="Delimiter">(</span>done<span class="Delimiter">.</span>find<span class="Delimiter">(</span>r<span class="Delimiter">)</span> != done<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
     raise &lt;&lt; <span class="Constant">&quot;can't compute address of &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> &lt;&lt; <span class="Constant">&quot; because &quot;</span><span class="Delimiter">;</span>
@@ -145,7 +145,7 @@ long long int lookup_name<span class="Delimiter">(</span>const reagent&amp; x<sp
   <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
-recipe_number lookup_surrounding_recipe<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">,</span> long long int n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+recipe_ordinal lookup_surrounding_recipe<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">,</span> long long int n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>n == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> r<span class="Delimiter">;</span>
   if <span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">.</span>find<span class="Delimiter">(</span>r<span class="Delimiter">)</span> == Surrounding_space<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
     raise &lt;&lt; <span class="Constant">&quot;don't know surrounding recipe of &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
diff --git a/html/046tangle.cc.html b/html/046tangle.cc.html
index b863b80c..15a61c22 100644
--- a/html/046tangle.cc.html
+++ b/html/046tangle.cc.html
@@ -77,7 +77,7 @@ else if <span class="Delimiter">(</span>command == <span class="Constant">&quot;
   Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>insert_fragments<span class="Delimiter">);</span>
 
 <span class="Delimiter">:(code)</span>
-void insert_fragments<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void insert_fragments<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Comment">// Copy into a new vector because insertions invalidate iterators.</span>
   <span class="Comment">// But this way we can't insert into labels created inside before/after.</span>
   vector&lt;instruction&gt; result<span class="Delimiter">;</span>
diff --git a/html/047jump_label.cc.html b/html/047jump_label.cc.html
index df4ed5ad..0573ff3c 100644
--- a/html/047jump_label.cc.html
+++ b/html/047jump_label.cc.html
@@ -46,13 +46,13 @@ recipe main [
 <span class="traceAbsent">-mem: storing 0 in location 1</span>
 
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-Type_number[<span class="Constant">&quot;label&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
+Type_ordinal[<span class="Constant">&quot;label&quot;</span>] = <span class="Constant">0</span><span class="Delimiter">;</span>
 
 <span class="Delimiter">:(after &quot;int main&quot;)</span>
   Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_labels<span class="Delimiter">);</span>
 
 <span class="Delimiter">:(code)</span>
-void transform_labels<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void transform_labels<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   map&lt;string<span class="Delimiter">,</span> long long int&gt; offset<span class="Delimiter">;</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     const instruction&amp; inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
@@ -60,19 +60,19 @@ void transform_labels<span class="Delimiter">(</span>const recipe_number r<span
   <span class="Delimiter">}</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     instruction&amp; inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;jump&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;jump&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?       cerr &lt;&lt; inst.to_string() &lt;&lt; '\n'; //? 1</span>
       replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
     <span class="Delimiter">}</span>
-    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;jump-if&quot;</span>] || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;jump-unless&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;jump-if&quot;</span>] || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;jump-unless&quot;</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
       replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
     <span class="Delimiter">}</span>
-    if <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;loop&quot;</span>] || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;break&quot;</span>]<span class="Delimiter">)</span>
+    if <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;loop&quot;</span>] || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;break&quot;</span>]<span class="Delimiter">)</span>
         &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
       replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
     <span class="Delimiter">}</span>
-    if <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;loop-if&quot;</span>] || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;loop-unless&quot;</span>]
-            || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;break-if&quot;</span>] || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">&quot;break-unless&quot;</span>]<span class="Delimiter">)</span>
+    if <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;loop-if&quot;</span>] || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;loop-unless&quot;</span>]
+            || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;break-if&quot;</span>] || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">&quot;break-unless&quot;</span>]<span class="Delimiter">)</span>
         &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> == <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
       replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
     <span class="Delimiter">}</span>
@@ -80,7 +80,7 @@ void transform_labels<span class="Delimiter">(</span>const recipe_number r<span
 <span class="Delimiter">}</span>
 
 <span class="Delimiter">:(code)</span>
-void replace_offset<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map&lt;string<span class="Delimiter">,</span> long long int&gt;&amp; offset<span class="Delimiter">,</span> const long long int current_offset<span class="Delimiter">,</span> const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void replace_offset<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map&lt;string<span class="Delimiter">,</span> long long int&gt;&amp; offset<span class="Delimiter">,</span> const long long int current_offset<span class="Delimiter">,</span> const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA &quot; &lt;&lt; x.to_string() &lt;&lt; '\n'; //? 1</span>
   assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">));</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;BBB &quot; &lt;&lt; x.to_string() &lt;&lt; '\n'; //? 1</span>
diff --git a/html/048call_variable.cc.html b/html/048call_variable.cc.html
deleted file mode 100644
index 225ee513..00000000
--- a/html/048call_variable.cc.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-<meta http-equiv="content-type" content="text/html; charset=UTF-8">
-<title>Mu - 048call_variable.cc</title>
-<meta name="Generator" content="Vim/7.4">
-<meta name="plugin-version" content="vim7.4_v1">
-<meta name="syntax" content="cpp">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
-<meta name="colorscheme" content="minimal">
-<style type="text/css">
-<!--
-pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
-body { font-family: monospace; color: #eeeeee; background-color: #080808; }
-* { font-size: 1.05em; }
-.traceContains { color: #008000; }
-.Constant { color: #00a0a0; }
-.Comment { color: #9090ff; }
-.Delimiter { color: #a04060; }
-.Special { color: #ff6060; }
-.CommentedCode { color: #6c6c6c; }
-.Identifier { color: #804000; }
--->
-</style>
-
-<script type='text/javascript'>
-<!--
-
--->
-</script>
-</head>
-<body>
-<pre id='vimCodeElement'>
-<span class="Comment">//: push a variable recipe on the call stack</span>
-
-<span class="Delimiter">:(scenario call_literal_recipe)</span>
-recipe main [
-  <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>call f:recipe<span class="Delimiter">,</span> <span class="Constant">34</span>:literal
-]
-recipe f [
-  <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>next-ingredient
-  reply <span class="Constant">2</span>:number
-]
-<span class="traceContains">+mem: storing 34 in location 1</span>
-
-<span class="Delimiter">:(scenario call_variable)</span>
-recipe main [
-  <span class="Constant">1</span>:number/recipe<span class="Special"> &lt;- </span>copy <span class="Constant">1001</span>:literal/f  <span class="Comment"># hack: assumes tests start recipes at 1000</span>
-  <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>call <span class="Constant">1</span>:number/recipe<span class="Delimiter">,</span> <span class="Constant">34</span>:literal
-]
-recipe f [  <span class="Comment"># recipe 1001</span>
-  <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>next-ingredient
-  reply <span class="Constant">3</span>:number
-]
-<span class="traceContains">+mem: storing 34 in location 2</span>
-<span class="CommentedCode">#? ?</span>
-
-<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-CALL<span class="Delimiter">,</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;call&quot;</span>] = CALL<span class="Delimiter">;</span>
-<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-case CALL: <span class="Delimiter">{</span>
-  recipe_number r = <span class="Constant">0</span><span class="Delimiter">;</span>
-  if <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>initialized<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
-    <span class="Comment">// 'call' received an integer recipe_number</span>
-    r = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  else <span class="Delimiter">{</span>
-    <span class="Comment">// 'call' received a literal recipe name</span>
-    r = Recipe_number[current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>r<span class="Delimiter">));</span>
-  ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>  <span class="Comment">// drop the callee</span>
-  <span class="Identifier">goto</span> complete_call<span class="Delimiter">;</span>
-<span class="Delimiter">}</span>
-</pre>
-</body>
-</html>
-<!-- vim: set foldmethod=manual : -->
diff --git a/html/049continuation.cc.html b/html/049continuation.cc.html
index cc734e78..0eba6a43 100644
--- a/html/049continuation.cc.html
+++ b/html/049continuation.cc.html
@@ -49,13 +49,13 @@ Continuation<span class="Delimiter">.</span>clear<span class="Delimiter">();</sp
 Next_continuation_id = <span class="Constant">0</span><span class="Delimiter">;</span>
 
 <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-type_number continuation = Type_number[<span class="Constant">&quot;continuation&quot;</span>] = Next_type_number++<span class="Delimiter">;</span>
+type_ordinal continuation = Type_ordinal[<span class="Constant">&quot;continuation&quot;</span>] = Next_type_ordinal++<span class="Delimiter">;</span>
 Type[continuation]<span class="Delimiter">.</span>name = <span class="Constant">&quot;continuation&quot;</span><span class="Delimiter">;</span>
 
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 CURRENT_CONTINUATION<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;current-continuation&quot;</span>] = CURRENT_CONTINUATION<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;current-continuation&quot;</span>] = CURRENT_CONTINUATION<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case CURRENT_CONTINUATION: <span class="Delimiter">{</span>
   <span class="Comment">// copy the current call stack</span>
@@ -72,7 +72,7 @@ case CURRENT_CONTINUATION: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 CONTINUE_FROM<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;continue-from&quot;</span>] = CONTINUE_FROM<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;continue-from&quot;</span>] = CONTINUE_FROM<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case CONTINUE_FROM: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -200,11 +200,11 @@ is_reset = <span class="Constant">false</span><span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 CREATE_DELIMITED_CONTINUATION<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;create-delimited-continuation&quot;</span>] = CREATE_DELIMITED_CONTINUATION<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;create-delimited-continuation&quot;</span>] = CREATE_DELIMITED_CONTINUATION<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case CREATE_DELIMITED_CONTINUATION: <span class="Delimiter">{</span>
   Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>is_reset = <span class="Constant">true</span><span class="Delimiter">;</span>
-  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>Recipe_number[current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">));</span>
+  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>Recipe_ordinal[current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">));</span>
   ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>  <span class="Comment">// drop the callee</span>
   <span class="Identifier">goto</span> complete_call<span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
@@ -222,7 +222,7 @@ Next_delimited_continuation_id = <span class="Constant">0</span><span class="Del
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 REPLY_DELIMITED_CONTINUATION<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;reply-delimited-continuation&quot;</span>] = REPLY_DELIMITED_CONTINUATION<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;reply-delimited-continuation&quot;</span>] = REPLY_DELIMITED_CONTINUATION<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case REPLY_DELIMITED_CONTINUATION: <span class="Delimiter">{</span>
   <span class="Comment">// first clear any existing ingredients, to isolate the creation of the</span>
diff --git a/html/050scenario.cc.html b/html/050scenario.cc.html
index d49f477e..ca947e34 100644
--- a/html/050scenario.cc.html
+++ b/html/050scenario.cc.html
@@ -146,19 +146,18 @@ time_t mu_time<span class="Delimiter">;</span> time<span class="Delimiter">(</sp
 cerr &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">Mu tests: &quot;</span> &lt;&lt; ctime<span class="Delimiter">(</span>&amp;mu_time<span class="Delimiter">);</span>
 for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; Passed &lt;&lt; '\n'; //? 1</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; Scenarios.at(i).name &lt;&lt; '\n'; //? 5</span>
+<span class="CommentedCode">//?   cerr &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; Scenarios.at(i).name &lt;&lt; '\n'; //? 6</span>
   run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
   if <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;.&quot;</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
 <span class="Comment">//: Convenience: run a single named scenario.</span>
-<span class="Delimiter">:(before &quot;Loading Commandline Files&quot;)</span>
-if <span class="Delimiter">(</span>argc == <span class="Constant">2</span> &amp;&amp; Run_tests<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    if <span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == argv[<span class="Constant">1</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-      <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-    <span class="Delimiter">}</span>
+<span class="Delimiter">:(after &quot;Test Runs&quot;)</span>
+for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  if <span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == argv[argc-<span class="Constant">1</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+    if <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr &lt;&lt; <span class="Constant">&quot;.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
+    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
 <span class="Delimiter">}</span>
 
@@ -168,14 +167,14 @@ const scenario* Current_scenario = <span class="Constant">NULL</span><span class
 void run_mu_scenario<span class="Delimiter">(</span>const scenario&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   Current_scenario = &amp;s<span class="Delimiter">;</span>
   bool not_already_inside_test = !Trace_stream<span class="Delimiter">;</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; s.name &lt;&lt; '\n'; //? 6</span>
+<span class="CommentedCode">//?   cerr &lt;&lt; s.name &lt;&lt; '\n'; //? 11</span>
   if <span class="Delimiter">(</span>not_already_inside_test<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     Trace_file = s<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
     Trace_stream = new trace_stream<span class="Delimiter">;</span>
     setup<span class="Delimiter">();</span>
   <span class="Delimiter">}</span>
   assert<span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-  vector&lt;recipe_number&gt; tmp = load<span class="Delimiter">(</span><span class="Constant">&quot;recipe &quot;</span>+s<span class="Delimiter">.</span>name+<span class="Constant">&quot; [ &quot;</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">&quot; ]&quot;</span><span class="Delimiter">);</span>
+  vector&lt;recipe_ordinal&gt; tmp = load<span class="Delimiter">(</span><span class="Constant">&quot;recipe &quot;</span>+s<span class="Delimiter">.</span>name+<span class="Constant">&quot; [ &quot;</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">&quot; ]&quot;</span><span class="Delimiter">);</span>
   bind_special_scenario_names<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
   transform_all<span class="Delimiter">();</span>
   run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span>
@@ -209,17 +208,17 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 RUN<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;run&quot;</span>] = RUN<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;run&quot;</span>] = RUN<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case RUN: <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cout &lt;&lt; &quot;recipe &quot; &lt;&lt; current_instruction().ingredients.at(0).name &lt;&lt; '\n'; //? 1</span>
   ostringstream tmp<span class="Delimiter">;</span>
-  tmp &lt;&lt; <span class="Constant">&quot;recipe run&quot;</span> &lt;&lt; Next_recipe_number &lt;&lt; <span class="Constant">&quot; [ &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; ]&quot;</span><span class="Delimiter">;</span>
+  tmp &lt;&lt; <span class="Constant">&quot;recipe run&quot;</span> &lt;&lt; Next_recipe_ordinal &lt;&lt; <span class="Constant">&quot; [ &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot; ]&quot;</span><span class="Delimiter">;</span>
 <span class="CommentedCode">//?   Show_rest_of_stream = true; //? 1</span>
-  vector&lt;recipe_number&gt; tmp_recipe = load<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+  vector&lt;recipe_ordinal&gt; tmp_recipe = load<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
   bind_special_scenario_names<span class="Delimiter">(</span>tmp_recipe<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
   transform_all<span class="Delimiter">();</span>
-<span class="CommentedCode">//?   cout &lt;&lt; tmp_recipe.at(0) &lt;&lt; ' ' &lt;&lt; Recipe_number[&quot;main&quot;] &lt;&lt; '\n'; //? 1</span>
+<span class="CommentedCode">//?   cout &lt;&lt; tmp_recipe.at(0) &lt;&lt; ' ' &lt;&lt; Recipe_ordinal[&quot;main&quot;] &lt;&lt; '\n'; //? 1</span>
   Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>tmp_recipe<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
   <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not done with caller; don't increment current_step_index()</span>
 <span class="Delimiter">}</span>
@@ -227,7 +226,7 @@ case RUN: <span class="Delimiter">{</span>
 <span class="Comment">// Some variables for fake resources always get special addresses in</span>
 <span class="Comment">// scenarios.</span>
 <span class="Delimiter">:(code)</span>
-void bind_special_scenario_names<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+void bind_special_scenario_names<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Comment">// Special Scenario Variable Names(r)</span>
   <span class="Comment">// End Special Scenario Variable Names(r)</span>
 <span class="Delimiter">}</span>
@@ -247,7 +246,13 @@ recipe main [
 <span class="Comment">//: 'memory-should-contain' raises warnings if specific locations aren't as expected</span>
 <span class="Comment">//: Also includes some special support for checking strings.</span>
 
+<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+bool Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span>
+<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span>
+
 <span class="Delimiter">:(scenario memory_check)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   memory-should-contain [
@@ -260,7 +265,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MEMORY_SHOULD_CONTAIN<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;memory-should-contain&quot;</span>] = MEMORY_SHOULD_CONTAIN<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;memory-should-contain&quot;</span>] = MEMORY_SHOULD_CONTAIN<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@@ -291,7 +296,7 @@ void check_memory<span class="Delimiter">(</span>const string&amp; s<span class=
       raise &lt;&lt; <span class="Constant">&quot;duplicate expectation for location &quot;</span> &lt;&lt; address &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
     trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking location &quot;</span> &lt;&lt; address<span class="Delimiter">;</span>
     if <span class="Delimiter">(</span>Memory[address] != value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         <span class="Comment">// genuine test in a mu file</span>
         raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location &quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot; to contain &quot;</span> &lt;&lt; value &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; Memory[address] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
@@ -299,7 +304,7 @@ void check_memory<span class="Delimiter">(</span>const string&amp; s<span class=
         <span class="Comment">// just testing scenario support</span>
         raise &lt;&lt; <span class="Constant">&quot;expected location &quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot; to contain &quot;</span> &lt;&lt; value &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; Memory[address] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
-      if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
         ++Num_failures<span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
@@ -331,11 +336,11 @@ void check_type<span class="Delimiter">(</span>const string&amp; lhs<span class=
 void check_string<span class="Delimiter">(</span>long long int address<span class="Delimiter">,</span> const string&amp; literal<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking string length at &quot;</span> &lt;&lt; address<span class="Delimiter">;</span>
   if <span class="Delimiter">(</span>Memory[address] != SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Hide_warnings<span class="Delimiter">)</span>
+    if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span>
       raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location &quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot; to contain length &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; of string [&quot;</span> &lt;&lt; literal &lt;&lt; <span class="Constant">&quot;] but saw &quot;</span> &lt;&lt; Memory[address] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
     else
       raise &lt;&lt; <span class="Constant">&quot;expected location &quot;</span> &lt;&lt; address &lt;&lt; <span class="Constant">&quot; to contain length &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; of string [&quot;</span> &lt;&lt; literal &lt;&lt; <span class="Constant">&quot;] but saw &quot;</span> &lt;&lt; Memory[address] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
       Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
       ++Num_failures<span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
@@ -345,7 +350,7 @@ void check_string<span class="Delimiter">(</span>long long int address<span clas
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;checking location &quot;</span> &lt;&lt; address+i<span class="Delimiter">;</span>
     if <span class="Delimiter">(</span>Memory[address+i] != literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-      if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         <span class="Comment">// genuine test in a mu file</span>
         raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected location &quot;</span> &lt;&lt; <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to contain &quot;</span> &lt;&lt; literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; Memory[address+i] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
@@ -353,7 +358,7 @@ void check_string<span class="Delimiter">(</span>long long int address<span clas
         <span class="Comment">// just testing scenario support</span>
         raise &lt;&lt; <span class="Constant">&quot;expected location &quot;</span> &lt;&lt; <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to contain &quot;</span> &lt;&lt; literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but saw &quot;</span> &lt;&lt; Memory[address+i] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
-      if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
         ++Num_failures<span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
@@ -363,6 +368,7 @@ void check_string<span class="Delimiter">(</span>long long int address<span clas
 <span class="Delimiter">}</span>
 
 <span class="Delimiter">:(scenario memory_check_multiple)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   memory-should-contain [
@@ -373,6 +379,7 @@ recipe main [
 <span class="traceContains">+warn: duplicate expectation for location 1</span>
 
 <span class="Delimiter">:(scenario memory_check_string_length)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:literal
@@ -405,12 +412,9 @@ recipe main [
 <span class="Comment">// Like runs of contiguous '+' lines, order is important. The trace checks</span>
 <span class="Comment">// that the lines are present *and* in the specified sequence. (There can be</span>
 <span class="Comment">// other lines in between.)</span>
-<span class="Comment">//</span>
-<span class="Comment">// Be careful not to mix setting Hide_warnings and checking the trace in .mu</span>
-<span class="Comment">// files. It'll work in C++ scenarios, but the test failure gets silently</span>
-<span class="Comment">// hidden in mu scenarios.</span>
 
 <span class="Delimiter">:(scenario trace_check_warns_on_failure)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   trace-should-contain [
@@ -423,7 +427,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 TRACE_SHOULD_CONTAIN<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;trace-should-contain&quot;</span>] = TRACE_SHOULD_CONTAIN<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;trace-should-contain&quot;</span>] = TRACE_SHOULD_CONTAIN<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@@ -471,6 +475,7 @@ vector&lt;trace_line&gt; parse_trace<span class="Delimiter">(</span>const string
 <span class="Delimiter">}</span>
 
 <span class="Delimiter">:(scenario trace_check_warns_on_failure_in_later_line)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   run [
@@ -484,6 +489,7 @@ recipe main [
 <span class="traceContains">+warn: missing [d] in trace layer a</span>
 
 <span class="Delimiter">:(scenario trace_check_passes_silently)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   run [
@@ -501,6 +507,7 @@ $warn: <span class="Constant">0</span>
 <span class="Comment">//: important, so you can't say things like &quot;B should not exist after A.&quot;</span>
 
 <span class="Delimiter">:(scenario trace_negative_check_warns_on_failure)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   run [
@@ -515,7 +522,7 @@ recipe main [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;trace-should-not-contain&quot;</span>] = TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;trace-should-not-contain&quot;</span>] = TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@@ -540,6 +547,7 @@ bool check_trace_missing<span class="Delimiter">(</span>const string&amp; in<spa
 <span class="Delimiter">}</span>
 
 <span class="Delimiter">:(scenario trace_negative_check_passes_silently)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   trace-should-not-contain [
@@ -550,6 +558,7 @@ recipe main [
 $warn: <span class="Constant">0</span>
 
 <span class="Delimiter">:(scenario trace_negative_check_warns_on_any_unexpected_line)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   run [
diff --git a/html/060string.mu.html b/html/060string.mu.html
index d917c926..45ff99e2 100644
--- a/html/060string.mu.html
+++ b/html/060string.mu.html
@@ -145,7 +145,8 @@ container buffer [
   len:address:number<span class="Special"> &lt;- </span>get-address result:address:buffer/deref, length:offset
   len:address:number/deref<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal</span>
   s:address:address:array:character<span class="Special"> &lt;- </span>get-address result:address:buffer/deref, data:offset
-  capacity:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  capacity:number, found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  assert found?:boolean, <span class="Constant">[new-buffer must get a capacity argument]</span>
   s:address:address:array:character/deref<span class="Special"> &lt;- </span>new character:type, capacity:number
 <span class="CommentedCode">#?   $print s:address:address:array:character/deref, [</span>
 <span class="CommentedCode">#? ]</span>
@@ -207,7 +208,13 @@ container buffer [
     in:address:buffer<span class="Special"> &lt;- </span>grow-buffer in:address:buffer
   <span class="Delimiter">}</span>
   s:address:array:character<span class="Special"> &lt;- </span>get in:address:buffer/deref, data:offset
+<span class="CommentedCode">#?   $print [array underlying buf: ], s:address:array:character, [ </span>
+<span class="CommentedCode">#? ] #? 1</span>
+<span class="CommentedCode">#?   $print [index: ], len:address:number/deref, [ </span>
+<span class="CommentedCode">#? ] #? 1</span>
   dest:address:character<span class="Special"> &lt;- </span>index-address s:address:array:character/deref, len:address:number/deref
+<span class="CommentedCode">#?   $print [storing ], c:character, [ in ], dest:address:character, [ </span>
+<span class="CommentedCode">#? ] #? 1</span>
   dest:address:character/deref<span class="Special"> &lt;- </span>copy c:character
   len:address:number/deref<span class="Special"> &lt;- </span>add len:address:number/deref, <span class="Constant">1:literal</span>
   <span class="muControl">reply</span> in:address:buffer/same-as-ingredient:0
diff --git a/html/064random.cc.html b/html/064random.cc.html
index f783de38..b340cf44 100644
--- a/html/064random.cc.html
+++ b/html/064random.cc.html
@@ -34,7 +34,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 RANDOM<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;random&quot;</span>] = RANDOM<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;random&quot;</span>] = RANDOM<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case RANDOM: <span class="Delimiter">{</span>
   <span class="Comment">// todo: limited range of numbers, might be imperfectly random</span>
@@ -47,7 +47,7 @@ case RANDOM: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;make-random-nondeterministic&quot;</span>] = MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;make-random-nondeterministic&quot;</span>] = MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span>
   srand<span class="Delimiter">(</span>time<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">));</span>
@@ -57,7 +57,7 @@ case MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 ROUND<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;round&quot;</span>] = ROUND<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;round&quot;</span>] = ROUND<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case ROUND: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
diff --git a/html/070display.cc.html b/html/070display.cc.html
index 3d6669ff..5ac50f18 100644
--- a/html/070display.cc.html
+++ b/html/070display.cc.html
@@ -46,7 +46,7 @@ bool Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 OPEN_CONSOLE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;open-console&quot;</span>] = OPEN_CONSOLE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;open-console&quot;</span>] = OPEN_CONSOLE<span class="Delimiter">;</span>
 <span class="CommentedCode">//? cerr &lt;&lt; &quot;open-console: &quot; &lt;&lt; OPEN_CONSOLE &lt;&lt; '\n'; //? 1</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case OPEN_CONSOLE: <span class="Delimiter">{</span>
@@ -58,7 +58,7 @@ case OPEN_CONSOLE: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 CLOSE_CONSOLE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;close-console&quot;</span>] = CLOSE_CONSOLE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;close-console&quot;</span>] = CLOSE_CONSOLE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case CLOSE_CONSOLE: <span class="Delimiter">{</span>
   tb_shutdown<span class="Delimiter">();</span>
@@ -72,7 +72,7 @@ tb_shutdown<span class="Delimiter">();</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 CLEAR_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;clear-display&quot;</span>] = CLEAR_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;clear-display&quot;</span>] = CLEAR_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case CLEAR_DISPLAY: <span class="Delimiter">{</span>
   tb_clear<span class="Delimiter">();</span>
@@ -83,7 +83,7 @@ case CLEAR_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 CLEAR_LINE_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;clear-line-on-display&quot;</span>] = CLEAR_LINE_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;clear-line-on-display&quot;</span>] = CLEAR_LINE_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span>
   long long int width = tb_width<span class="Delimiter">();</span>
@@ -98,7 +98,7 @@ case CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;print-character-to-display&quot;</span>] = PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;print-character-to-display&quot;</span>] = PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span>
   int h=tb_height<span class="Delimiter">(),</span> w=tb_width<span class="Delimiter">();</span>
@@ -109,6 +109,21 @@ case PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   tb_shutdown(); //? 1</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA &quot; &lt;&lt; c &lt;&lt; ' ' &lt;&lt; (int)'\n' &lt;&lt; ' ' &lt;&lt; (int)'\r' &lt;&lt; '\n'; //? 1</span>
 <span class="CommentedCode">//?   exit(1); //? 1</span>
+  int color = TB_BLACK<span class="Delimiter">;</span>
+  if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
+    color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<span class="CommentedCode">//?     tb_shutdown(); //? 1</span>
+<span class="CommentedCode">//?     cerr &lt;&lt; &quot;AAA &quot; &lt;&lt; color &lt;&lt; '\n'; //? 1</span>
+<span class="CommentedCode">//?     exit(1); //? 1</span>
+  <span class="Delimiter">}</span>
+  int bg_color = TB_BLACK<span class="Delimiter">;</span>
+  if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)));</span>
+    bg_color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+    if <span class="Delimiter">(</span>bg_color == <span class="Constant">0</span><span class="Delimiter">)</span> bg_color = TB_BLACK<span class="Delimiter">;</span>
+  <span class="Delimiter">}</span>
+  tb_change_cell<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> bg_color<span class="Delimiter">);</span>
   if <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span> || c == <span class="cSpecial">'\r'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
     if <span class="Delimiter">(</span>Display_row &lt; height-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
       Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
@@ -120,22 +135,13 @@ case PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span>
   <span class="Delimiter">}</span>
   if <span class="Delimiter">(</span>c == <span class="cSpecial">'\b'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
     if <span class="Delimiter">(</span>Display_column &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-      tb_change_cell<span class="Delimiter">(</span>Display_column-<span class="Constant">1</span><span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
+      tb_change_cell<span class="Delimiter">(</span>Display_column-<span class="Constant">1</span><span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> color<span class="Delimiter">,</span> bg_color<span class="Delimiter">);</span>
       --Display_column<span class="Delimiter">;</span>
       tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
       if <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span>
     <span class="Delimiter">}</span>
     <span class="Identifier">break</span><span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
-  int color = TB_BLACK<span class="Delimiter">;</span>
-  if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span>
-    color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-<span class="CommentedCode">//?     tb_shutdown(); //? 1</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; &quot;AAA &quot; &lt;&lt; color &lt;&lt; '\n'; //? 1</span>
-<span class="CommentedCode">//?     exit(1); //? 1</span>
-  <span class="Delimiter">}</span>
-  tb_change_cell<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
   if <span class="Delimiter">(</span>Display_column &lt; width-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
     ++Display_column<span class="Delimiter">;</span>
     tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
@@ -147,7 +153,7 @@ case PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;cursor-position-on-display&quot;</span>] = CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;cursor-position-on-display&quot;</span>] = CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span>
   products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
@@ -159,7 +165,7 @@ case CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;move-cursor-on-display&quot;</span>] = MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;move-cursor-on-display&quot;</span>] = MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -174,7 +180,7 @@ case MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;move-cursor-down-on-display&quot;</span>] = MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;move-cursor-down-on-display&quot;</span>] = MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span>
   int h=tb_height<span class="Delimiter">();</span>
@@ -190,7 +196,7 @@ case MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;move-cursor-up-on-display&quot;</span>] = MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;move-cursor-up-on-display&quot;</span>] = MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>Display_row &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -204,7 +210,7 @@ case MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;move-cursor-right-on-display&quot;</span>] = MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;move-cursor-right-on-display&quot;</span>] = MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span>
   int w=tb_width<span class="Delimiter">();</span>
@@ -220,7 +226,7 @@ case MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;move-cursor-left-on-display&quot;</span>] = MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;move-cursor-left-on-display&quot;</span>] = MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>Display_column &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
@@ -234,7 +240,7 @@ case MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 DISPLAY_WIDTH<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;display-width&quot;</span>] = DISPLAY_WIDTH<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;display-width&quot;</span>] = DISPLAY_WIDTH<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case DISPLAY_WIDTH: <span class="Delimiter">{</span>
   products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
@@ -245,7 +251,7 @@ case DISPLAY_WIDTH: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 DISPLAY_HEIGHT<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;display-height&quot;</span>] = DISPLAY_HEIGHT<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;display-height&quot;</span>] = DISPLAY_HEIGHT<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case DISPLAY_HEIGHT: <span class="Delimiter">{</span>
   products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
@@ -256,7 +262,7 @@ case DISPLAY_HEIGHT: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;hide-cursor-on-display&quot;</span>] = HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;hide-cursor-on-display&quot;</span>] = HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
   tb_set_cursor<span class="Delimiter">(</span>TB_HIDE_CURSOR<span class="Delimiter">,</span> TB_HIDE_CURSOR<span class="Delimiter">);</span>
@@ -266,7 +272,7 @@ case HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;show-cursor-on-display&quot;</span>] = SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;show-cursor-on-display&quot;</span>] = SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
   tb_set_cursor<span class="Delimiter">(</span>Display_row<span class="Delimiter">,</span> Display_column<span class="Delimiter">);</span>
@@ -276,7 +282,7 @@ case SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 HIDE_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;hide-display&quot;</span>] = HIDE_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;hide-display&quot;</span>] = HIDE_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case HIDE_DISPLAY: <span class="Delimiter">{</span>
   Autodisplay = <span class="Constant">false</span><span class="Delimiter">;</span>
@@ -286,7 +292,7 @@ case HIDE_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 SHOW_DISPLAY<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;show-display&quot;</span>] = SHOW_DISPLAY<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;show-display&quot;</span>] = SHOW_DISPLAY<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case SHOW_DISPLAY: <span class="Delimiter">{</span>
   Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</span>
@@ -299,7 +305,7 @@ case SHOW_DISPLAY: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 WAIT_FOR_SOME_INTERACTION<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;wait-for-some-interaction&quot;</span>] = WAIT_FOR_SOME_INTERACTION<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;wait-for-some-interaction&quot;</span>] = WAIT_FOR_SOME_INTERACTION<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span>
   tb_event event<span class="Delimiter">;</span>
@@ -310,7 +316,7 @@ case WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 CHECK_FOR_INTERACTION<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;check-for-interaction&quot;</span>] = CHECK_FOR_INTERACTION<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;check-for-interaction&quot;</span>] = CHECK_FOR_INTERACTION<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case CHECK_FOR_INTERACTION: <span class="Delimiter">{</span>
   products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">// result and status</span>
@@ -363,6 +369,17 @@ case CHECK_FOR_INTERACTION: <span class="Delimiter">{</span>
   products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
   <span class="Identifier">break</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
+
+<span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+INTERACTIONS_LEFT<span class="Delimiter">,</span>
+<span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+Recipe_ordinal[<span class="Constant">&quot;interactions-left?&quot;</span>] = INTERACTIONS_LEFT<span class="Delimiter">;</span>
+<span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+case INTERACTIONS_LEFT: <span class="Delimiter">{</span>
+  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>tb_event_ready<span class="Delimiter">());</span>
+  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
diff --git a/html/071print.mu.html b/html/071print.mu.html
index 7fe33765..29e893bf 100644
--- a/html/071print.mu.html
+++ b/html/071print.mu.html
@@ -113,6 +113,13 @@ container screen-cell [
     <span class="muControl">break-if</span> color-found?:boolean
     color:number<span class="Special"> &lt;- </span>copy <span class="Constant">7:literal/white</span>
   <span class="Delimiter">}</span>
+  bg-color:number, bg-color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="Comment"># default bg-color to black</span>
+    <span class="muControl">break-if</span> bg-color-found?:boolean
+    bg-color:number<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal/black</span>
+  <span class="Delimiter">}</span>
+<span class="CommentedCode">#?   trace [app], [print character] #? 1</span>
   <span class="Delimiter">{</span>
     <span class="Comment"># if x exists</span>
     <span class="Comment"># (handle special cases exactly like in the real screen)</span>
@@ -180,7 +187,7 @@ container screen-cell [
     <span class="muControl">reply</span> x:address:screen/same-as-ingredient:0
   <span class="Delimiter">}</span>
   <span class="Comment"># otherwise, real screen</span>
-  print-character-to-display c:character, color:number
+  print-character-to-display c:character, color:number, bg-color:number
   <span class="muControl">reply</span> x:address:screen/same-as-ingredient:0
 ]
 
@@ -631,13 +638,19 @@ container screen-cell [
     <span class="muControl">break-if</span> color-found?:boolean
     color:number<span class="Special"> &lt;- </span>copy <span class="Constant">7:literal/white</span>
   <span class="Delimiter">}</span>
+  bg-color:number, bg-color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="Comment"># default bg-color to black</span>
+    <span class="muControl">break-if</span> bg-color-found?:boolean
+    bg-color:number<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal/black</span>
+  <span class="Delimiter">}</span>
   len:number<span class="Special"> &lt;- </span>length s:address:array:character/deref
   i:number<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal</span>
   <span class="Delimiter">{</span>
     done?:boolean<span class="Special"> &lt;- </span>greater-or-equal i:number, len:number
     <span class="muControl">break-if</span> done?:boolean
     c:character<span class="Special"> &lt;- </span>index s:address:array:character/deref, i:number
-    print-character x:address:screen, c:character, color:number
+    print-character x:address:screen, c:character, color:number, bg-color:number
     i:number<span class="Special"> &lt;- </span>add i:number, <span class="Constant">1:literal</span>
     <span class="muControl">loop</span>
   <span class="Delimiter">}</span>
@@ -674,9 +687,15 @@ container screen-cell [
     <span class="muControl">break-if</span> color-found?:boolean
     color:number<span class="Special"> &lt;- </span>copy <span class="Constant">7:literal/white</span>
   <span class="Delimiter">}</span>
+  bg-color:number, bg-color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="Comment"># default bg-color to black</span>
+    <span class="muControl">break-if</span> bg-color-found?:boolean
+    bg-color:number<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal/black</span>
+  <span class="Delimiter">}</span>
   <span class="Comment"># todo: other bases besides decimal</span>
   s:address:array:character<span class="Special"> &lt;- </span>integer-to-decimal-string n:number
-  print-string x:address:screen, s:address:array:character, color:number
+  print-string x:address:screen, s:address:array:character, color:number, bg-color:number
   <span class="muControl">reply</span> x:address:screen/same-as-ingredient:0
 ]
 </pre>
diff --git a/html/072scenario_screen.cc.html b/html/072scenario_screen.cc.html
index f5210f0b..5df91b60 100644
--- a/html/072scenario_screen.cc.html
+++ b/html/072scenario_screen.cc.html
@@ -106,6 +106,7 @@ scenario screen-in-scenario-color [
 ]
 
 <span class="Delimiter">:(scenario screen_in_scenario_error)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 scenario screen-in-scenario-error [
   assume-screen <span class="Constant">5</span>:literal/width<span class="Delimiter">,</span> <span class="Constant">3</span>:literal/height
@@ -122,6 +123,7 @@ scenario screen-in-scenario-error [
 <span class="traceContains">+warn: expected screen location (0, 0) to contain 98 ('b') instead of 97 ('a')</span>
 
 <span class="Delimiter">:(scenario screen_in_scenario_color_error)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 <span class="Comment"># screen-should-contain can check unicode characters in the fake screen</span>
 scenario screen-in-scenario-color [
@@ -144,6 +146,7 @@ if <span class="Delimiter">(</span>s == <span class="Constant">&quot;screen&quot
 
 <span class="Delimiter">:(scenarios run)</span>
 <span class="Delimiter">:(scenario convert_names_does_not_warn_when_mixing_special_names_and_numeric_locations)</span>
+<span class="Special">% Scenario_testing_scenario = true;</span>
 <span class="Special">% Hide_warnings = true;</span>
 recipe main [
   screen:number<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:number
@@ -178,21 +181,21 @@ Name[r][<span class="Constant">&quot;screen&quot;</span>] = SCREEN<span class="D
 <span class="Comment">// `screen:address &lt;- new-fake-screen width, height`</span>
 <span class="CommentedCode">//? cout &lt;&lt; &quot;before: &quot; &lt;&lt; curr.to_string() &lt;&lt; '\n'; //? 1</span>
 if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">&quot;assume-screen&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-  curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">&quot;new-fake-screen&quot;</span>]<span class="Delimiter">;</span>
+  curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">&quot;new-fake-screen&quot;</span>]<span class="Delimiter">;</span>
   curr<span class="Delimiter">.</span>name = <span class="Constant">&quot;new-fake-screen&quot;</span><span class="Delimiter">;</span>
   assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
   assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
   curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;screen:address&quot;</span><span class="Delimiter">));</span>
   curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>SCREEN<span class="Delimiter">);</span>
 <span class="CommentedCode">//? cout &lt;&lt; &quot;after: &quot; &lt;&lt; curr.to_string() &lt;&lt; '\n'; //? 1</span>
-<span class="CommentedCode">//? cout &lt;&lt; &quot;AAA &quot; &lt;&lt; Recipe_number[&quot;new-fake-screen&quot;] &lt;&lt; '\n'; //? 1</span>
+<span class="CommentedCode">//? cout &lt;&lt; &quot;AAA &quot; &lt;&lt; Recipe_ordinal[&quot;new-fake-screen&quot;] &lt;&lt; '\n'; //? 1</span>
 <span class="Delimiter">}</span>
 
 <span class="Comment">//: screen-should-contain is a regular instruction</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 SCREEN_SHOULD_CONTAIN<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;screen-should-contain&quot;</span>] = SCREEN_SHOULD_CONTAIN<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;screen-should-contain&quot;</span>] = SCREEN_SHOULD_CONTAIN<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@@ -203,7 +206,7 @@ case SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;screen-should-contain-in-color&quot;</span>] = SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;screen-should-contain-in-color&quot;</span>] = SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case SCREEN_SHOULD_CONTAIN_IN_COLOR: <span class="Delimiter">{</span>
   if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
@@ -231,36 +234,42 @@ void check_screen<span class="Delimiter">(</span>const string&amp; expected_cont
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;Checking screen for color &quot; &lt;&lt; color &lt;&lt; &quot;\n&quot;; //? 2</span>
   assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>default_space<span class="Delimiter">);</span>  <span class="Comment">// not supported</span>
   long long int screen_location = Memory[SCREEN]<span class="Delimiter">;</span>
-  int data_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">);</span>
+  int data_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">);</span>
   assert<span class="Delimiter">(</span>data_offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
   long long int screen_data_location = screen_location+data_offset<span class="Delimiter">;</span>  <span class="Comment">// type: address:array:character</span>
   long long int screen_data_start = Memory[screen_data_location]<span class="Delimiter">;</span>  <span class="Comment">// type: array:character</span>
-  int width_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;num-columns&quot;</span><span class="Delimiter">);</span>
+  int width_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;num-columns&quot;</span><span class="Delimiter">);</span>
   long long int screen_width = Memory[screen_location+width_offset]<span class="Delimiter">;</span>
-  int height_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;num-rows&quot;</span><span class="Delimiter">);</span>
+  int height_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;num-rows&quot;</span><span class="Delimiter">);</span>
   long long int screen_height = Memory[screen_location+height_offset]<span class="Delimiter">;</span>
   raw_string_stream cursor<span class="Delimiter">(</span>expected_contents<span class="Delimiter">);</span>
   <span class="Comment">// todo: too-long expected_contents should fail</span>
   long long int addr = screen_data_start+<span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// skip length</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;screen height &quot; &lt;&lt; screen_height &lt;&lt; '\n'; //? 1</span>
   for <span class="Delimiter">(</span>long long int row = <span class="Constant">0</span><span class="Delimiter">;</span> row &lt; screen_height<span class="Delimiter">;</span> ++row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span class="CommentedCode">//?     cerr &lt;&lt; &quot;row: &quot; &lt;&lt; row &lt;&lt; '\n'; //? 1</span>
+<span class="CommentedCode">//?     cerr &lt;&lt; &quot;row: &quot; &lt;&lt; row &lt;&lt; '\n'; //? 3</span>
+<span class="CommentedCode">//?     cerr &lt;&lt; &quot;contents: &quot; &lt;&lt; cursor.buf+cursor.index &lt;&lt; &quot;$\n&quot;; //? 1</span>
     cursor<span class="Delimiter">.</span>skip_whitespace_and_comments<span class="Delimiter">();</span>
     if <span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>at_end<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span class="CommentedCode">//?     cerr &lt;&lt; &quot;row2\n&quot;; //? 2</span>
     assert<span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>get<span class="Delimiter">()</span> == <span class="Constant">'.'</span><span class="Delimiter">);</span>
     for <span class="Delimiter">(</span>long long int column = <span class="Constant">0</span><span class="Delimiter">;</span>  column &lt; screen_width<span class="Delimiter">;</span>  ++column<span class="Delimiter">,</span> addr+= <span class="Comment">/*</span><span class="Comment">size of screen-cell</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
       const int cell_color_offset = <span class="Constant">1</span><span class="Delimiter">;</span>
       uint32_t curr = cursor<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; &quot;col: &quot; &lt;&lt; column &lt;&lt; '\n'; //? 1</span>
       if <span class="Delimiter">(</span>Memory[addr] == <span class="Constant">0</span> &amp;&amp; isspace<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
 <span class="CommentedCode">//?       cerr &lt;&lt; color &lt;&lt; &quot; vs &quot; &lt;&lt; Memory[addr+1] &lt;&lt; '\n'; //? 1</span>
       if <span class="Delimiter">(</span>curr == <span class="Constant">' '</span> &amp;&amp; color != -<span class="Constant">1</span> &amp;&amp; color != Memory[addr+cell_color_offset]<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         <span class="Comment">// filter out other colors</span>
         <span class="Identifier">continue</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; &quot;col3 &quot; &lt;&lt; column &lt;&lt; &quot;: &quot; &lt;&lt; Memory[addr] &lt;&lt; &quot; &quot; &lt;&lt; curr &lt;&lt; '\n'; //? 1</span>
       if <span class="Delimiter">(</span>Memory[addr] != <span class="Constant">0</span> &amp;&amp; Memory[addr] == curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span class="CommentedCode">//?         cerr &lt;&lt; &quot;col4\n&quot;; //? 1</span>
         if <span class="Delimiter">(</span>color == -<span class="Constant">1</span> || color == Memory[addr+cell_color_offset]<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<span class="CommentedCode">//?         cerr &lt;&lt; &quot;col5: &quot; &lt;&lt; column &lt;&lt; '\n'; //? 1</span>
         <span class="Comment">// contents match but color is off</span>
-        if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+        if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
           <span class="Comment">// genuine test in a mu file</span>
           raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;, address &quot;</span> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot;, value &quot;</span> &lt;&lt; Memory[addr] &lt;&lt; <span class="Constant">&quot;) to be in color &quot;</span> &lt;&lt; color &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; Memory[addr+cell_color_offset] &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">;</span>
         <span class="Delimiter">}</span>
@@ -268,13 +277,14 @@ void check_screen<span class="Delimiter">(</span>const string&amp; expected_cont
           <span class="Comment">// just testing check_screen</span>
           raise &lt;&lt; <span class="Constant">&quot;expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to be in color &quot;</span> &lt;&lt; color &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; Memory[addr+cell_color_offset] &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
         <span class="Delimiter">}</span>
-        if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+        if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
           Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
           ++Num_failures<span class="Delimiter">;</span>
         <span class="Delimiter">}</span>
         <span class="Identifier">return</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
 
+<span class="CommentedCode">//?       cerr &lt;&lt; &quot;col6 &quot; &lt;&lt; column &lt;&lt; &quot;: &quot; &lt;&lt; Memory[addr] &lt;&lt; &quot; &quot; &lt;&lt; curr &lt;&lt; '\n'; //? 1</span>
       <span class="Comment">// really a mismatch</span>
       <span class="Comment">// can't print multi-byte unicode characters in warnings just yet. not very useful for debugging anyway.</span>
       char expected_pretty[<span class="Constant">10</span>] = <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">};</span>
@@ -288,7 +298,7 @@ void check_screen<span class="Delimiter">(</span>const string&amp; expected_cont
         actual_pretty[<span class="Constant">0</span>] = <span class="Constant">' '</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">1</span>] = <span class="Constant">'('</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">2</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">3</span>] = static_cast&lt;unsigned char&gt;<span class="Delimiter">(</span>Memory[addr]<span class="Delimiter">),</span> actual_pretty[<span class="Constant">4</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">5</span>] = <span class="Constant">')'</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">6</span>] = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
 
-      if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      if <span class="Delimiter">(</span>Current_scenario &amp;&amp; !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         <span class="Comment">// genuine test in a mu file</span>
         raise &lt;&lt; <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">F - &quot;</span> &lt;&lt; Current_scenario<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot;: expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to contain &quot;</span> &lt;&lt; curr &lt;&lt; expected_pretty &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; Memory[addr] &lt;&lt; actual_pretty &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
         dump_screen<span class="Delimiter">();</span>
@@ -297,7 +307,7 @@ void check_screen<span class="Delimiter">(</span>const string&amp; expected_cont
         <span class="Comment">// just testing check_screen</span>
         raise &lt;&lt; <span class="Constant">&quot;expected screen location (&quot;</span> &lt;&lt; row &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; column &lt;&lt; <span class="Constant">&quot;) to contain &quot;</span> &lt;&lt; curr &lt;&lt; expected_pretty &lt;&lt; <span class="Constant">&quot; instead of &quot;</span> &lt;&lt; Memory[addr] &lt;&lt; actual_pretty &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
-      if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
         Passed = <span class="Constant">false</span><span class="Delimiter">;</span>
         ++Num_failures<span class="Delimiter">;</span>
       <span class="Delimiter">}</span>
@@ -354,7 +364,7 @@ void raw_string_stream::skip_whitespace_and_comments<span class="Delimiter">()</
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _DUMP_SCREEN<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$dump-screen&quot;</span>] = _DUMP_SCREEN<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$dump-screen&quot;</span>] = _DUMP_SCREEN<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _DUMP_SCREEN: <span class="Delimiter">{</span>
   dump_screen<span class="Delimiter">();</span>
@@ -365,11 +375,11 @@ case _DUMP_SCREEN: <span class="Delimiter">{</span>
 void dump_screen<span class="Delimiter">()</span> <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>default_space<span class="Delimiter">);</span>  <span class="Comment">// not supported</span>
   long long int screen_location = Memory[SCREEN]<span class="Delimiter">;</span>
-  int width_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;num-columns&quot;</span><span class="Delimiter">);</span>
+  int width_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;num-columns&quot;</span><span class="Delimiter">);</span>
   long long int screen_width = Memory[screen_location+width_offset]<span class="Delimiter">;</span>
-  int height_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;num-rows&quot;</span><span class="Delimiter">);</span>
+  int height_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;num-rows&quot;</span><span class="Delimiter">);</span>
   long long int screen_height = Memory[screen_location+height_offset]<span class="Delimiter">;</span>
-  int data_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">);</span>
+  int data_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;screen&quot;</span>]<span class="Delimiter">,</span> <span class="Constant">&quot;data&quot;</span><span class="Delimiter">);</span>
   assert<span class="Delimiter">(</span>data_offset &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
   long long int screen_data_location = screen_location+data_offset<span class="Delimiter">;</span>  <span class="Comment">// type: address:array:character</span>
   long long int screen_data_start = Memory[screen_data_location]<span class="Delimiter">;</span>  <span class="Comment">// type: array:character</span>
diff --git a/html/074console.mu.html b/html/074console.mu.html
index 651fa9a6..b89a1333 100644
--- a/html/074console.mu.html
+++ b/html/074console.mu.html
@@ -133,6 +133,19 @@ container console [
     <span class="muControl">loop-unless</span> found?:boolean
   <span class="Delimiter">}</span>
 ]
+
+<span class="Comment"># use this helper to skip rendering if there's lots of other events queued up</span>
+<span class="muRecipe">recipe</span> has-more-events? [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
+  console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-unless</span> console:address
+    <span class="Comment"># fake consoles should be plenty fast; never skip</span>
+    <span class="muControl">reply</span> <span class="Constant">0:literal/false</span>
+  <span class="Delimiter">}</span>
+  result:boolean<span class="Special"> &lt;- </span>interactions-left?
+  <span class="muControl">reply</span> result:boolean
+]
 </pre>
 </body>
 </html>
diff --git a/html/075scenario_console.cc.html b/html/075scenario_console.cc.html
index fe3b2adc..9a0bc5c9 100644
--- a/html/075scenario_console.cc.html
+++ b/html/075scenario_console.cc.html
@@ -76,7 +76,7 @@ if <span class="Delimiter">(</span>s == <span class="Constant">&quot;console&quo
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 ASSUME_CONSOLE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;assume-console&quot;</span>] = ASSUME_CONSOLE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;assume-console&quot;</span>] = ASSUME_CONSOLE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case ASSUME_CONSOLE: <span class="Delimiter">{</span>
 <span class="CommentedCode">//?   cerr &lt;&lt; &quot;aaa: &quot; &lt;&lt; current_instruction().ingredients.at(0).name &lt;&lt; '\n'; //? 2</span>
@@ -195,7 +195,7 @@ scenario events-in-scenario [
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 REPLACE_IN_CONSOLE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;replace-in-console&quot;</span>] = REPLACE_IN_CONSOLE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;replace-in-console&quot;</span>] = REPLACE_IN_CONSOLE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case REPLACE_IN_CONSOLE: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
@@ -236,8 +236,8 @@ long long int size_of_event<span class="Delimiter">()</span> <span class="Delimi
   <span class="Comment">// memoize result if already computed</span>
   static long long int result = <span class="Constant">0</span><span class="Delimiter">;</span>
   if <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  vector&lt;type_number&gt; type<span class="Delimiter">;</span>
-  type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;event&quot;</span>]<span class="Delimiter">);</span>
+  vector&lt;type_ordinal&gt; type<span class="Delimiter">;</span>
+  type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;event&quot;</span>]<span class="Delimiter">);</span>
   result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
   <span class="Identifier">return</span> result<span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
@@ -246,9 +246,9 @@ long long int size_of_events<span class="Delimiter">()</span> <span class="Delim
   <span class="Comment">// memoize result if already computed</span>
   static long long int result = <span class="Constant">0</span><span class="Delimiter">;</span>
   if <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-  vector&lt;type_number&gt; type<span class="Delimiter">;</span>
-  assert<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;console&quot;</span>]<span class="Delimiter">);</span>
-  type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">&quot;console&quot;</span>]<span class="Delimiter">);</span>
+  vector&lt;type_ordinal&gt; type<span class="Delimiter">;</span>
+  assert<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;console&quot;</span>]<span class="Delimiter">);</span>
+  type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">&quot;console&quot;</span>]<span class="Delimiter">);</span>
   result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
   <span class="Identifier">return</span> result<span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
diff --git a/html/080trace_browser.cc.html b/html/080trace_browser.cc.html
index efb5e428..f2139f3f 100644
--- a/html/080trace_browser.cc.html
+++ b/html/080trace_browser.cc.html
@@ -33,7 +33,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 _BROWSE_TRACE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$browse-trace&quot;</span>] = _BROWSE_TRACE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;$browse-trace&quot;</span>] = _BROWSE_TRACE<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case _BROWSE_TRACE: <span class="Delimiter">{</span>
   start_trace_browser<span class="Delimiter">();</span>
@@ -207,6 +207,13 @@ void render<span class="Delimiter">()</span> <span class="Delimiter">{</span>
     trace_line&amp; curr_line = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>Trace_index[screen_row]<span class="Delimiter">);</span>
     ostringstream out<span class="Delimiter">;</span>
     out &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">)</span> &lt;&lt; curr_line<span class="Delimiter">.</span>depth &lt;&lt; <span class="Constant">' '</span> &lt;&lt; curr_line<span class="Delimiter">.</span>label &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; curr_line<span class="Delimiter">.</span>contents<span class="Delimiter">;</span>
+    if <span class="Delimiter">(</span>screen_row &lt; tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+      long long int delta = lines_hidden<span class="Delimiter">(</span>screen_row<span class="Delimiter">);</span>
+      <span class="Comment">// home-brew escape sequence for red</span>
+      if <span class="Delimiter">(</span>delta &gt; <span class="Constant">999</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;{&quot;</span><span class="Delimiter">;</span>
+      out &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; lines_hidden<span class="Delimiter">(</span>screen_row<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span><span class="Delimiter">;</span>
+      if <span class="Delimiter">(</span>delta &gt; <span class="Constant">999</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot;}&quot;</span><span class="Delimiter">;</span>
+    <span class="Delimiter">}</span>
     render_line<span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> out<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
   <span class="Delimiter">}</span>
   <span class="Comment">// clear rest of screen</span>
@@ -219,12 +226,24 @@ void render<span class="Delimiter">()</span> <span class="Delimiter">{</span>
   tb_present<span class="Delimiter">();</span>
 <span class="Delimiter">}</span>
 
+long long int lines_hidden<span class="Delimiter">(</span>long long int screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  assert<span class="Delimiter">(</span>Trace_index<span class="Delimiter">.</span>find<span class="Delimiter">(</span>screen_row<span class="Delimiter">)</span> != Trace_index<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
+  if <span class="Delimiter">(</span>Trace_index<span class="Delimiter">.</span>find<span class="Delimiter">(</span>screen_row+<span class="Constant">1</span><span class="Delimiter">)</span> == Trace_index<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
+    <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">)</span>-Trace_index[screen_row]<span class="Delimiter">;</span>
+  else
+    <span class="Identifier">return</span> Trace_index[screen_row+<span class="Constant">1</span>] - Trace_index[screen_row]<span class="Delimiter">;</span>
+<span class="Delimiter">}</span>
+
 void render_line<span class="Delimiter">(</span>int screen_row<span class="Delimiter">,</span> const string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   long long int col = <span class="Constant">0</span><span class="Delimiter">;</span>
+  int color = TB_WHITE<span class="Delimiter">;</span>
   for <span class="Delimiter">(</span>col = <span class="Constant">0</span><span class="Delimiter">;</span> col &lt; tb_width<span class="Delimiter">()</span> &amp;&amp; col &lt; SIZE<span class="Delimiter">(</span>s<span class="Delimiter">);</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    char c = s<span class="Delimiter">.</span>at<span class="Delimiter">(</span>col<span class="Delimiter">);</span>
+    char c = s<span class="Delimiter">.</span>at<span class="Delimiter">(</span>col<span class="Delimiter">);</span>  <span class="Comment">// todo: unicode</span>
     if <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> c = <span class="Constant">';'</span><span class="Delimiter">;</span>  <span class="Comment">// replace newlines with semi-colons</span>
-    tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
+    <span class="Comment">// escapes. hack: can't start a line with them.</span>
+    if <span class="Delimiter">(</span>c == <span class="Constant">'{'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> color = <span class="Comment">/*</span><span class="Comment">red</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> c = <span class="Constant">' '</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
+    if <span class="Delimiter">(</span>c == <span class="Constant">'}'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> color = TB_WHITE<span class="Delimiter">;</span> c = <span class="Constant">' '</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
+    tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
   <span class="Delimiter">}</span>
   for <span class="Delimiter">(;</span> col &lt; tb_width<span class="Delimiter">();</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
diff --git a/html/081run_interactive.cc.html b/html/081run_interactive.cc.html
index cdd3a5b7..5183cee6 100644
--- a/html/081run_interactive.cc.html
+++ b/html/081run_interactive.cc.html
@@ -13,11 +13,12 @@
 pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
 body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 * { font-size: 1.05em; }
+.traceContains { color: #008000; }
 .cSpecial { color: #008000; }
 .Constant { color: #00a0a0; }
 .Comment { color: #9090ff; }
 .Delimiter { color: #a04060; }
-.SalientComment { color: #00ffff; }
+.Special { color: #ff6060; }
 .CommentedCode { color: #6c6c6c; }
 .Identifier { color: #804000; }
 -->
@@ -31,79 +32,180 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 </head>
 <body>
 <pre id='vimCodeElement'>
-<span class="Comment">//: Helper for the repl.</span>
+<span class="Comment">//: Helper for various programming environments: run arbitrary mu code and</span>
+<span class="Comment">//: return some result in string form.</span>
 
+<span class="Delimiter">:(scenario run_interactive_code)</span>
+recipe main [
+  <span class="Constant">2</span>:address:array:character<span class="Special"> &lt;- </span>new [<span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>:literal]
+  run-interactive <span class="Constant">2</span>:address:array:character
+]
+<span class="traceContains">+mem: storing 34 in location 1</span>
+
+<span class="Delimiter">:(scenario run_interactive_empty)</span>
+recipe main [
+  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>run-interactive <span class="Constant">0</span>:literal
+]
+<span class="Comment"># result is null</span>
+<span class="traceContains">+mem: storing 0 in location 1</span>
+
+<span class="Comment">//: run code in 'interactive mode', i.e. with warnings off, and recording</span>
+<span class="Comment">//: output in case we want to print it to screen</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
 RUN_INTERACTIVE<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;run-interactive&quot;</span>] = RUN_INTERACTIVE<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;run-interactive&quot;</span>] = RUN_INTERACTIVE<span class="Delimiter">;</span>
 <span class="CommentedCode">//? cerr &lt;&lt; &quot;run-interactive: &quot; &lt;&lt; RUN_INTERACTIVE &lt;&lt; '\n'; //? 1</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
 case RUN_INTERACTIVE: <span class="Delimiter">{</span>
   assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA 0\n&quot;; //? 1</span>
-  run_interactive<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;ZZZ\n&quot;; //? 1</span>
-  <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not done with caller; don't increment current_step_index()</span>
+  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+  bool new_code_pushed_to_stack = run_interactive<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
+  if <span class="Delimiter">(</span>!new_code_pushed_to_stack<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+    products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>warnings_from_trace<span class="Delimiter">());</span>
+    <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// done with this instruction</span>
+  <span class="Delimiter">}</span>
+  else <span class="Delimiter">{</span>
+    <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not done with caller; don't increment current_step_index()</span>
+  <span class="Delimiter">}</span>
 <span class="Delimiter">}</span>
 
+<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+bool Running_interactive = <span class="Constant">false</span><span class="Delimiter">;</span>
+<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+Running_interactive = <span class="Constant">false</span><span class="Delimiter">;</span>
 <span class="Delimiter">:(code)</span>
-<span class="Comment">// manual tests:</span>
-<span class="Comment">//  empty string (excluding whitespace and comments) does nothing</span>
-<span class="Comment">//  ctrl-d</span>
-<span class="Comment">//  just an integer (excluding whitespace and comments) prints value of that location in memory</span>
-<span class="Comment">//  instruction executes</span>
-<span class="Comment">//  backspace at start begins new attempt</span>
-void run_interactive<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span class="Comment">// reads a string, tries to call it as code, saving all warnings.</span>
+<span class="Comment">// returns true if successfully called (no errors found during load and transform)</span>
+bool run_interactive<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  if <span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> == Recipe_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
+    Recipe_ordinal[<span class="Constant">&quot;interactive&quot;</span>] = Next_recipe_ordinal++<span class="Delimiter">;</span>
+  string command = trim<span class="Delimiter">(</span>strip_comments<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>address<span class="Delimiter">)));</span>
+  if <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
 <span class="CommentedCode">//?   tb_shutdown(); //? 1</span>
-  long long int size = Memory[address]<span class="Delimiter">;</span>
-  if <span class="Delimiter">(</span>size == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    ++current_step_index<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  ostringstream tmp<span class="Delimiter">;</span>
-  for <span class="Delimiter">(</span>long long int curr = address+<span class="Constant">1</span><span class="Delimiter">;</span> curr &lt; address+size<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    <span class="Comment">// todo: unicode</span>
-    tmp &lt;&lt; <span class="Delimiter">(</span>char<span class="Delimiter">)(</span>int<span class="Delimiter">)</span>Memory[curr]<span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; size &lt;&lt; ' ' &lt;&lt; Memory[address+size] &lt;&lt; '\n'; //? 1</span>
-  assert<span class="Delimiter">(</span>Memory[address+size] == <span class="Constant">10</span><span class="Delimiter">);</span>  <span class="Comment">// skip the newline</span>
-  if <span class="Delimiter">(</span>Recipe_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> == Recipe_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span>
-    Recipe_number[<span class="Constant">&quot;interactive&quot;</span>] = Next_recipe_number++<span class="Delimiter">;</span>
-  string command = trim<span class="Delimiter">(</span>strip_comments<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>str<span class="Delimiter">()));</span>
-  if <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    ++current_step_index<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  if <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>command<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-    print_value_of_location_as_response<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>command<span class="Delimiter">));</span>
-    ++current_step_index<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-<span class="CommentedCode">//?   exit(0); //? 1</span>
-  if <span class="Delimiter">(</span>Name[Recipe_number[<span class="Constant">&quot;interactive&quot;</span>]]<span class="Delimiter">.</span>find<span class="Delimiter">(</span>command<span class="Delimiter">)</span> != Name[Recipe_number[<span class="Constant">&quot;interactive&quot;</span>]]<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    print_value_of_location_as_response<span class="Delimiter">(</span>Name[Recipe_number[<span class="Constant">&quot;interactive&quot;</span>]][command]<span class="Delimiter">);</span>
-    ++current_step_index<span class="Delimiter">();</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span class="CommentedCode">//?   cerr &lt;&lt; command &lt;&lt; '\n'; //? 2</span>
+  Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe_ordinal[<span class="Constant">&quot;interactive&quot;</span>]<span class="Delimiter">);</span>
+  Hide_warnings = <span class="Constant">true</span><span class="Delimiter">;</span>
+  if <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    Trace_file = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>  <span class="Comment">// if there wasn't already a stream we don't want to save it</span>
+    Trace_stream = new trace_stream<span class="Delimiter">;</span>
   <span class="Delimiter">}</span>
-<span class="CommentedCode">//?   tb_shutdown(); //? 1</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; command; //? 1</span>
-<span class="CommentedCode">//?   exit(0); //? 1</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;AAA 1\n&quot;; //? 1</span>
-  Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe_number[<span class="Constant">&quot;interactive&quot;</span>]<span class="Delimiter">);</span>
   <span class="Comment">// call run(string) but without the scheduling</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; (&quot;recipe interactive [\n&quot;+command+&quot;\n]\n&quot;); //? 1</span>
   load<span class="Delimiter">(</span><span class="Constant">&quot;recipe interactive [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>+command+<span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
   transform_all<span class="Delimiter">();</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;names: &quot; &lt;&lt; Name[Recipe_number[&quot;interactive&quot;]].size() &lt;&lt; &quot;; &quot;; //? 1</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;steps: &quot; &lt;&lt; Recipe[Recipe_number[&quot;interactive&quot;]].steps.size() &lt;&lt; &quot;; &quot;; //? 1</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;interactive transformed_until: &quot; &lt;&lt; Recipe[Recipe_number[&quot;interactive&quot;]].transformed_until &lt;&lt; '\n'; //? 1</span>
-  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>Recipe_number[<span class="Constant">&quot;interactive&quot;</span>]<span class="Delimiter">));</span>
+  if <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;warn&quot;</span><span class="Delimiter">)</span> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    Hide_warnings = <span class="Constant">false</span><span class="Delimiter">;</span>
+    <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+  <span class="Delimiter">}</span>
+  Running_interactive = <span class="Constant">true</span><span class="Delimiter">;</span>
+  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>Recipe_ordinal[<span class="Constant">&quot;interactive&quot;</span>]<span class="Delimiter">));</span>
+  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<span class="Delimiter">}</span>
+
+<span class="Delimiter">:(after &quot;Starting Reply&quot;)</span>
+if <span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">()</span> == <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> clean_up_interactive<span class="Delimiter">();</span>
+<span class="Delimiter">:(after &quot;Falling Through End Of Recipe&quot;)</span>
+if <span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">()</span> == <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> clean_up_interactive<span class="Delimiter">();</span>
+<span class="Delimiter">:(code)</span>
+void clean_up_interactive<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span class="CommentedCode">//?   static int foo = 0; //? 1</span>
+  Hide_warnings = <span class="Constant">false</span><span class="Delimiter">;</span>
+  Running_interactive = <span class="Constant">false</span><span class="Delimiter">;</span>
+<span class="CommentedCode">//?   ++foo; //? 1</span>
+<span class="CommentedCode">//?   if (foo == 1) tb_init(); //? 1</span>
+<span class="Delimiter">}</span>
+
+<span class="Delimiter">:(scenario &quot;run_interactive_returns_stringified_result&quot;)</span>
+recipe main [
+  <span class="Comment"># try to interactively add 2 and 2</span>
+  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>new [add <span class="Constant">2</span>:literal<span class="Delimiter">,</span> <span class="Constant">2</span>:literal]
+  <span class="Constant">2</span>:address:array:character<span class="Special"> &lt;- </span>run-interactive <span class="Constant">1</span>:address:array:character
+  <span class="Constant">10</span>:array:character<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:address:array:character/deref
+]
+<span class="Comment"># first letter in the output should be '4' in unicode</span>
+<span class="traceContains">+mem: storing 52 in location 11</span>
+
+<span class="Delimiter">:(scenario &quot;run_interactive_returns_string&quot;)</span>
+recipe main [
+  <span class="Comment"># try to interactively add 2 and 2</span>
+  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>new [
+    <span class="Constant">100</span>:address:array:character<span class="Special"> &lt;- </span>new [a]
+    <span class="Constant">101</span>:address:array:character<span class="Special"> &lt;- </span>new [b]
+    <span class="Constant">102</span>:address:array:character<span class="Special"> &lt;- </span>string-append <span class="Constant">100</span>:address:array:character<span class="Delimiter">,</span> <span class="Constant">101</span>:address:array:character
+  ]
+  <span class="Constant">2</span>:address:array:character<span class="Special"> &lt;- </span>run-interactive <span class="Constant">1</span>:address:array:character
+  <span class="Constant">10</span>:array:character<span class="Special"> &lt;- </span>copy <span class="Constant">2</span>:address:array:character/deref
+]
+<span class="Comment"># output contains &quot;ab&quot;</span>
+<span class="traceContains">+mem: storing 97 in location 11</span>
+<span class="traceContains">+mem: storing 98 in location 12</span>
+
+<span class="Delimiter">:(scenario &quot;run_interactive_returns_warnings&quot;)</span>
+recipe main [
+  <span class="Comment"># run a command that generates a warning</span>
+  <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>new [get <span class="Constant">1234</span>:number<span class="Delimiter">,</span> foo:offset]
+  <span class="Constant">2</span>:address:array:character<span class="Delimiter">,</span> <span class="Constant">3</span>:address:array:character<span class="Special"> &lt;- </span>run-interactive <span class="Constant">1</span>:address:array:character
+  <span class="Constant">10</span>:array:character<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>:address:array:character/deref
+]
+<span class="Comment"># warning should be &quot;unknown element foo in container number&quot;</span>
+<span class="traceContains">+mem: storing 117 in location 11</span>
+<span class="traceContains">+mem: storing 110 in location 12</span>
+<span class="traceContains">+mem: storing 107 in location 13</span>
+<span class="traceContains">+mem: storing 110 in location 14</span>
+
+<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+string Most_recent_results<span class="Delimiter">;</span>
+<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+Most_recent_results = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+<span class="Delimiter">:(before &quot;End of Instruction&quot;)</span>
+if <span class="Delimiter">(</span>Running_interactive<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  record_products<span class="Delimiter">(</span>current_instruction<span class="Delimiter">(),</span> products<span class="Delimiter">);</span>
+<span class="Delimiter">}</span>
+<span class="Delimiter">:(code)</span>
+void record_products<span class="Delimiter">(</span>const instruction&amp; instruction<span class="Delimiter">,</span> const vector&lt;vector&lt;double&gt; &gt;&amp; products<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  ostringstream out<span class="Delimiter">;</span>
+<span class="CommentedCode">//?   cerr &lt;&lt; current_instruction().to_string() &lt;&lt; '\n'; //? 1</span>
+  for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    <span class="Comment">// string</span>
+    if <span class="Delimiter">(</span>i &lt; SIZE<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; &quot;AA\n&quot;; //? 1</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; instruction.products.size() &lt;&lt; &quot; vs &quot; &lt;&lt; i &lt;&lt; '\n'; //? 1</span>
+      if <span class="Delimiter">(</span>is_string<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
+<span class="CommentedCode">//?         cerr &lt;&lt; &quot;BB\n&quot;; //? 1</span>
+        assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span>
+        out &lt;&lt; to_string<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+        <span class="Identifier">continue</span><span class="Delimiter">;</span>
+      <span class="Delimiter">}</span>
+      <span class="Comment">// End Record Product Special-cases</span>
+    <span class="Delimiter">}</span>
+    for <span class="Delimiter">(</span>long long int j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; SIZE<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span class="CommentedCode">//?       cerr &lt;&lt; &quot;aa: &quot; &lt;&lt; i &lt;&lt; &quot;, &quot; &lt;&lt; j &lt;&lt; &quot;: &quot; &lt;&lt; products.at(i).at(j) &lt;&lt; '\n'; //? 1</span>
+        out &lt;&lt; products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
+    <span class="Delimiter">}</span>
+    out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+  <span class="Delimiter">}</span>
+<span class="CommentedCode">//?   cerr &lt;&lt; &quot;aa: {\n&quot; &lt;&lt; out.str() &lt;&lt; &quot;}\n&quot;; //? 2</span>
+  Most_recent_results = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<span class="Delimiter">}</span>
+<span class="Delimiter">:(before &quot;Complete Call Fallthrough&quot;)</span>
+if <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation == RUN_INTERACTIVE &amp;&amp; !current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+  assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> &lt;= <span class="Constant">2</span><span class="Delimiter">);</span>
+  <span class="Comment">// Send the results of the most recently executed instruction, regardless of</span>
+  <span class="Comment">// call depth, to be converted to string and potentially printed to string.</span>
+  vector&lt;double&gt; result<span class="Delimiter">;</span>
+  result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_string<span class="Delimiter">(</span>Most_recent_results<span class="Delimiter">));</span>
+  write_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> result<span class="Delimiter">);</span>
+  if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> == <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    vector&lt;double&gt; warnings<span class="Delimiter">;</span>
+    warnings<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>warnings_from_trace<span class="Delimiter">());</span>
+    write_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> warnings<span class="Delimiter">);</span>
+  <span class="Delimiter">}</span>
 <span class="Delimiter">}</span>
 
+<span class="Delimiter">:(code)</span>
 string strip_comments<span class="Delimiter">(</span>string in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   ostringstream result<span class="Delimiter">;</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; in; //? 1</span>
   for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
     if <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
       result &lt;&lt; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
@@ -114,43 +216,79 @@ string strip_comments<span class="Delimiter">(</span>string in<span class="Delim
       if <span class="Delimiter">(</span>i &lt; SIZE<span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> ++i<span class="Delimiter">;</span>
     <span class="Delimiter">}</span>
   <span class="Delimiter">}</span>
-<span class="CommentedCode">//?   cerr &lt;&lt; &quot;ZZZ&quot;; //? 1</span>
   <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
 <span class="Delimiter">}</span>
 
-void print_value_of_location_as_response<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+string to_string<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  long long int size = Memory[address]<span class="Delimiter">;</span>
+  if <span class="Delimiter">(</span>size == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
+  ostringstream tmp<span class="Delimiter">;</span>
+  for <span class="Delimiter">(</span>long long int curr = address+<span class="Constant">1</span><span class="Delimiter">;</span> curr &lt;= address+size<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    <span class="Comment">// todo: unicode</span>
+    tmp &lt;&lt; <span class="Delimiter">(</span>char<span class="Delimiter">)(</span>int<span class="Delimiter">)</span>Memory[curr]<span class="Delimiter">;</span>
+  <span class="Delimiter">}</span>
+<span class="CommentedCode">//?   tb_shutdown(); //? 1</span>
+<span class="CommentedCode">//?   cerr &lt;&lt; tmp.str() &lt;&lt; '\n'; //? 1</span>
+  <span class="Identifier">return</span> tmp<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<span class="Delimiter">}</span>
+
+long long int stringified_value_of_location<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
   <span class="Comment">// convert to string</span>
   ostringstream out<span class="Delimiter">;</span>
-  out &lt;&lt; <span class="Constant">&quot;=&gt; &quot;</span> &lt;&lt; Memory[address]<span class="Delimiter">;</span>
-  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-  <span class="Comment">// handle regular I/O</span>
-  if <span class="Delimiter">(</span>!tb_is_active<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-    cerr &lt;&lt; result &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
-    <span class="Identifier">return</span><span class="Delimiter">;</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// raw I/O; use termbox to print</span>
-  long long int bound = SIZE<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
-  if <span class="Delimiter">(</span>bound &gt; tb_width<span class="Delimiter">())</span> bound = tb_width<span class="Delimiter">();</span>
-  for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; bound<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-    tb_change_cell<span class="Delimiter">(</span>i<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> result<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">computer's color</span><span class="Comment">*/</span><span class="Constant">245</span><span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment">// newline</span>
-  if <span class="Delimiter">(</span>Display_row &lt; tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span>
-    ++Display_row<span class="Delimiter">;</span>
-  Display_column = <span class="Constant">0</span><span class="Delimiter">;</span>
-  tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span>
-  tb_present<span class="Delimiter">();</span>
+<span class="CommentedCode">//?   trace(1, &quot;foo&quot;) &lt;&lt; &quot;a: &quot; &lt;&lt; address; //? 1</span>
+  out &lt;&lt; Memory[address]<span class="Delimiter">;</span>
+<span class="CommentedCode">//?   trace(1, &quot;foo&quot;) &lt;&lt; &quot;b: &quot; &lt;&lt; Memory[address]; //? 1</span>
+  <span class="Identifier">return</span> new_string<span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<span class="Delimiter">}</span>
+
+bool is_string<span class="Delimiter">(</span>const reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+  <span class="Identifier">return</span> x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>size<span class="Delimiter">()</span> == <span class="Constant">3</span>
+      &amp;&amp; x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">&quot;address&quot;</span>]
+      &amp;&amp; x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">&quot;array&quot;</span>]
+      &amp;&amp; x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">&quot;character&quot;</span>]<span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 
-<span class="SalientComment">//:: debugging tool</span>
+long long int warnings_from_trace<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+  if <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+  if <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;warn&quot;</span><span class="Delimiter">)</span> &lt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+  ostringstream out<span class="Delimiter">;</span>
+  for <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+    if <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>label != <span class="Constant">&quot;warn&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
+    out &lt;&lt; p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">;</span>
+    if <span class="Delimiter">(</span>*--p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">.</span>end<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
+  <span class="Delimiter">}</span>
+  assert<span class="Delimiter">(</span>!out<span class="Delimiter">.</span>str<span class="Delimiter">().</span>empty<span class="Delimiter">());</span>
+  <span class="Identifier">return</span> new_string<span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
+<span class="Delimiter">}</span>
 
+<span class="Comment">//: simpler version of run-interactive: doesn't do any running, just loads</span>
+<span class="Comment">//: recipes and reports warnings.</span>
+<span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+bool Loading_interactive = <span class="Constant">false</span><span class="Delimiter">;</span>
+<span class="Delimiter">:(before &quot;End Setup&quot;)</span>
+Loading_interactive = <span class="Constant">false</span><span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-_RUN_DEPTH<span class="Delimiter">,</span>
+RELOAD<span class="Delimiter">,</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-Recipe_number[<span class="Constant">&quot;$run-depth&quot;</span>] = _RUN_DEPTH<span class="Delimiter">;</span>
+Recipe_ordinal[<span class="Constant">&quot;reload&quot;</span>] = RELOAD<span class="Delimiter">;</span>
 <span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-case _RUN_DEPTH: <span class="Delimiter">{</span>
-  cerr &lt;&lt; Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>size<span class="Delimiter">();</span>
+case RELOAD: <span class="Delimiter">{</span>
+  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+  Loading_interactive = <span class="Constant">true</span><span class="Delimiter">;</span>
+  Hide_warnings = <span class="Constant">true</span><span class="Delimiter">;</span>
+  load<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
+<span class="CommentedCode">//?   static int foo = 0;</span>
+<span class="CommentedCode">//?   if (++foo == 2) {</span>
+<span class="CommentedCode">//?     tb_shutdown();</span>
+<span class="CommentedCode">//?     cerr &lt;&lt; Recipe_ordinal[&quot;new-add&quot;] &lt;&lt; '\n';</span>
+<span class="CommentedCode">//?     cerr &lt;&lt; Recipe[Recipe_ordinal[&quot;new-add&quot;]].steps[2].to_string() &lt;&lt; '\n';</span>
+<span class="CommentedCode">//?     exit(0);</span>
+<span class="CommentedCode">//?   }</span>
+  transform_all<span class="Delimiter">();</span>
+  Hide_warnings = <span class="Constant">false</span><span class="Delimiter">;</span>
+  Loading_interactive = <span class="Constant">false</span><span class="Delimiter">;</span>
+  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>warnings_from_trace<span class="Delimiter">());</span>
   <span class="Identifier">break</span><span class="Delimiter">;</span>
 <span class="Delimiter">}</span>
 </pre>
diff --git a/html/display.mu.html b/html/display.mu.html
index 6d3cd7a9..d6e1560f 100644
--- a/html/display.mu.html
+++ b/html/display.mu.html
@@ -33,7 +33,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 
 <span class="muRecipe">recipe</span> main [
   open-console
-  print-character-to-display <span class="Constant">97:literal</span>, <span class="Constant">1:literal/red</span>
+  print-character-to-display <span class="Constant">97:literal</span>, <span class="Constant">1:literal/red</span>, <span class="Constant">2:literal/green</span>
   1:number/<span class="Special">raw</span>, 2:number/<span class="Special">raw &lt;- </span>cursor-position-on-display
   wait-for-some-interaction
   clear-display
diff --git a/html/edit.mu.html b/html/edit.mu.html
index 8481c441..3eb34a4b 100644
--- a/html/edit.mu.html
+++ b/html/edit.mu.html
@@ -33,43 +33,71 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 </head>
 <body>
 <pre id='vimCodeElement'>
-<span class="Comment"># Editor widget: takes a string and screen coordinates, modifying them in place.</span>
+<span class="Comment"># Environment for learning programming using mu.</span>
 
 <span class="muRecipe">recipe</span> main [
   <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
   open-console
-  width:number<span class="Special"> &lt;- </span>display-width
-  height:number<span class="Special"> &lt;- </span>display-height
-  <span class="Comment"># draw a line</span>
+  initial-recipe:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[recipe new-add [</span>
+<span class="Constant">  x:number &lt;- next-ingredient</span>
+<span class="Constant">  y:number &lt;- next-ingredient</span>
+<span class="Constant">  z:number &lt;- add x:number, y:number</span>
+<span class="Constant">  reply z:number</span>
+<span class="Constant">]</span>]
+  initial-sandbox:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[new-add 2:literal, 3:literal]</span>
+  env:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment <span class="Constant">0:literal/screen</span>, initial-recipe:address:array:character, initial-sandbox:address:array:character
+  render-all <span class="Constant">0:literal/address</span>, env:address:programming-environment-data
+  event-loop <span class="Constant">0:literal/screen</span>, <span class="Constant">0:literal/console</span>, env:address:programming-environment-data
+]
+
+container programming-environment-data [
+  recipes:address:editor-data
+  recipe-warnings:address:array:character
+  current-sandbox:address:editor-data
+  sandbox:address:sandbox-data
+  sandbox-in-focus?:boolean  <span class="Comment"># false =&gt; focus in recipes; true =&gt; focus in current-sandbox</span>
+]
+
+<span class="muRecipe">recipe</span> new-programming-environment [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  initial-recipe-contents:address:array:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  initial-sandbox-contents:address:array:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  width:number<span class="Special"> &lt;- </span>screen-width screen:address
+  height:number<span class="Special"> &lt;- </span>screen-height screen:address
+  <span class="Comment"># top menu</span>
+  result:address:programming-environment-data<span class="Special"> &lt;- </span>new programming-environment-data:type
+  draw-horizontal screen:address, <span class="Constant">0:literal</span>, <span class="Constant">0:literal/left</span>, width:number, <span class="Constant">32:literal/space</span>, <span class="Constant">0:literal/black</span>, <span class="Constant">238:literal/grey</span>
+  button-start:number<span class="Special"> &lt;- </span>subtract width:number, <span class="Constant">20:literal</span>
+  button-on-screen?:boolean<span class="Special"> &lt;- </span>greater-or-equal button-start:number, <span class="Constant">0:literal</span>
+  assert button-on-screen?:boolean, <span class="Constant">[screen too narrow for menu]</span>
+  move-cursor screen:address, <span class="Constant">0:literal/row</span>, button-start:number/column
+  run-button:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[ run (F10)  ]</span>
+  print-string screen:address, run-button:address:array:character, <span class="Constant">255:literal/white</span>, <span class="Constant">161:literal/reddish</span>
+  <span class="Comment"># dotted line down the middle</span>
   divider:number, _<span class="Special"> &lt;- </span>divide-with-remainder width:number, <span class="Constant">2:literal</span>
-  draw-vertical <span class="Constant">0:literal/screen</span>, divider:number, <span class="Constant">0:literal/top</span>, height:number
-  <span class="Comment"># editor on the left</span>
-  left:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde]</span>
-  left-editor:address:editor-data<span class="Special"> &lt;- </span>new-editor left:address:array:character, <span class="Constant">0:literal/screen</span>, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> <span class="Comment">#divider:number/right</span>
-  <span class="Comment"># editor on the right</span>
-  right:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
-  new-left:number<span class="Special"> &lt;- </span>add divider:number/right, <span class="Constant">1:literal</span>
-  right-editor:address:editor-data<span class="Special"> &lt;- </span>new-editor right:address:array:character, <span class="Constant">0:literal/screen</span>, <span class="Constant">0:literal/top</span>, new-left:number, width:number
-  <span class="Comment"># chain</span>
-  x:address:address:editor-data<span class="Special"> &lt;- </span>get-address left-editor:address:editor-data/deref, next-editor:offset
-  x:address:address:editor-data/deref<span class="Special"> &lt;- </span>copy right-editor:address:editor-data
-  <span class="Comment"># initialize focus</span>
-  reset-focus left-editor:address:editor-data
-  cursor-row:number<span class="Special"> &lt;- </span>get left-editor:address:editor-data/deref, cursor-row:offset
-  cursor-column:number<span class="Special"> &lt;- </span>get left-editor:address:editor-data/deref, cursor-column:offset
-  move-cursor <span class="Constant">0:literal/screen</span>, cursor-row:number, cursor-column:number
-  <span class="Comment"># and we're off!</span>
-  event-loop <span class="Constant">0:literal/screen</span>, <span class="Constant">0:literal/events</span>, left-editor:address:editor-data
-  close-console
+  draw-vertical screen:address, divider:number, <span class="Constant">1:literal/top</span>, height:number, <span class="Constant">9482:literal/vertical-dotted</span>
+  <span class="Comment"># recipe editor on the left</span>
+  recipes:address:address:editor-data<span class="Special"> &lt;- </span>get-address result:address:programming-environment-data/deref, recipes:offset
+  recipes:address:address:editor-data/deref<span class="Special"> &lt;- </span>new-editor initial-recipe-contents:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, divider:number/right
+  <span class="Comment"># sandbox editor on the right</span>
+  new-left:number<span class="Special"> &lt;- </span>add divider:number, <span class="Constant">1:literal</span>
+  new-right:number<span class="Special"> &lt;- </span>add new-left:number, <span class="Constant">5:literal</span>
+  current-sandbox:address:address:editor-data<span class="Special"> &lt;- </span>get-address result:address:programming-environment-data/deref, current-sandbox:offset
+  current-sandbox:address:address:editor-data/deref<span class="Special"> &lt;- </span>new-editor initial-sandbox-contents:address:array:character, screen:address, new-left:number, width:number
+  <span class="Comment"># initialize cursor</span>
+  update-cursor screen:address, recipes:address:address:editor-data/deref, current-sandbox:address:address:editor-data/deref, <span class="Constant">0:literal/focus-in-recipes</span>
+  <span class="muControl">reply</span> result:address:programming-environment-data
 ]
 
 <span class="muScenario">scenario</span> editor-initially-prints-string-to-screen [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   run [
     1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-    new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+    new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .          .</span>
   ]
@@ -79,30 +107,21 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; }
 <span class="SalientComment">## text to the screen.</span>
 
 container editor-data [
-  <span class="Comment"># doubly linked list of characters (head contains a special sentinel)</span>
+  <span class="Comment"># editable text: doubly linked list of characters (head contains a special sentinel)</span>
   data:address:duplex-list
-  <span class="Comment"># location of top-left of screen inside data (scrolling)</span>
-  top-of-screen:address:duplex-list
   <span class="Comment"># location before cursor inside data</span>
   before-cursor:address:duplex-list
 
-  screen:address:screen
   <span class="Comment"># raw bounds of display area on screen</span>
-  top:number
+  <span class="Comment"># always displays from row 1 and at most until bottom of screen</span>
   left:number
-  bottom:number
   right:number
   <span class="Comment"># raw screen coordinates of cursor</span>
   cursor-row:number
   cursor-column:number
-
-  <span class="Comment"># pointer to another editor, responsible for a different area of screen.</span>
-  <span class="Comment"># helps organize editors in a 'chain'.</span>
-  next-editor:address:editor-data
-  in-focus?:boolean  <span class="Comment"># set for the one editor in this chain currently being edited</span>
 ]
 
-<span class="Comment"># editor:address, screen:address &lt;- new-editor s:address:array:character, screen:address, top:number, left:number, bottom:number</span>
+<span class="Comment"># editor:address, screen:address &lt;- new-editor s:address:array:character, screen:address, left:number, right:number</span>
 <span class="Comment"># creates a new editor widget and renders its initial appearance to screen.</span>
 <span class="Comment">#   top/left/right constrain the screen area available to the new editor.</span>
 <span class="Comment">#   right is exclusive.</span>
@@ -111,42 +130,24 @@ container editor-data [
   s:address:array:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   <span class="Comment"># no clipping of bounds</span>
-  top:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   left:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   right:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   right:number<span class="Special"> &lt;- </span>subtract right:number, <span class="Constant">1:literal</span>
   result:address:editor-data<span class="Special"> &lt;- </span>new editor-data:type
   <span class="Comment"># initialize screen-related fields</span>
-  sc:address:address:screen<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, screen:offset
-  sc:address:address:screen/deref<span class="Special"> &lt;- </span>copy screen:address
-  x:address:number<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, top:offset
-  x:address:number/deref<span class="Special"> &lt;- </span>copy top:number
   x:address:number<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, left:offset
   x:address:number/deref<span class="Special"> &lt;- </span>copy left:number
   x:address:number<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, right:offset
   x:address:number/deref<span class="Special"> &lt;- </span>copy right:number
-  <span class="Comment"># bottom = top (in case of early exit)</span>
-  x:address:number<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, bottom:offset
-  x:address:number/deref<span class="Special"> &lt;- </span>copy top:number
   <span class="Comment"># initialize cursor</span>
   x:address:number<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, cursor-row:offset
-  x:address:number/deref<span class="Special"> &lt;- </span>copy top:number
+  x:address:number/deref<span class="Special"> &lt;- </span>copy <span class="Constant">1:literal/top</span>
   x:address:number<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, cursor-column:offset
-<span class="CommentedCode">#?   $print left:number, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
   x:address:number/deref<span class="Special"> &lt;- </span>copy left:number
-  d:address:address:duplex-list<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, data:offset
-  d:address:address:duplex-list/deref<span class="Special"> &lt;- </span>push-duplex <span class="Constant">167:literal/§</span>, <span class="Constant">0:literal/tail</span>
+  init:address:address:duplex-list<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, data:offset
+  init:address:address:duplex-list/deref<span class="Special"> &lt;- </span>push-duplex <span class="Constant">167:literal/§</span>, <span class="Constant">0:literal/tail</span>
   y:address:address:duplex-list<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, before-cursor:offset
-  y:address:address:duplex-list/deref<span class="Special"> &lt;- </span>copy d:address:address:duplex-list/deref
-  init:address:address:duplex-list<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, top-of-screen:offset
-  init:address:address:duplex-list/deref<span class="Special"> &lt;- </span>copy d:address:address:duplex-list/deref
-  <span class="Comment"># set focus</span>
-  <span class="Comment"># if using multiple editors, must call reset-focus after chaining them all</span>
-  b:address:boolean<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, in-focus?:offset
-  b:address:boolean/deref<span class="Special"> &lt;- </span>copy <span class="Constant">1:literal/true</span>
-<span class="CommentedCode">#?   $print d:address:address:duplex-list/deref, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
+  y:address:address:duplex-list/deref<span class="Special"> &lt;- </span>copy init:address:address:duplex-list/deref
   <span class="Comment"># early exit if s is empty</span>
   <span class="muControl">reply-unless</span> s:address:array:character, result:address:editor-data
   len:number<span class="Special"> &lt;- </span>length s:address:array:character/deref
@@ -155,15 +156,9 @@ container editor-data [
   <span class="Comment"># now we can start appending the rest, character by character</span>
   curr:address:duplex-list<span class="Special"> &lt;- </span>copy init:address:address:duplex-list/deref
   <span class="Delimiter">{</span>
-<span class="CommentedCode">#?     $print idx:number, [ vs ], len:number, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?     $print [append to ], curr:address:duplex-list, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
     done?:boolean<span class="Special"> &lt;- </span>greater-or-equal idx:number, len:number
     <span class="muControl">break-if</span> done?:boolean
     c:character<span class="Special"> &lt;- </span>index s:address:array:character/deref, idx:number
-<span class="CommentedCode">#?     $print [aa: ], c:character, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
     insert-duplex c:character, curr:address:duplex-list
     <span class="Comment"># next iter</span>
     curr:address:duplex-list<span class="Special"> &lt;- </span>next-duplex curr:address:duplex-list
@@ -173,29 +168,24 @@ container editor-data [
   <span class="Comment"># initialize cursor to top of screen</span>
   y:address:address:duplex-list<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, before-cursor:offset
   y:address:address:duplex-list/deref<span class="Special"> &lt;- </span>copy init:address:address:duplex-list/deref
-  <span class="Comment"># perform initial rendering to screen</span>
-  bottom:address:number<span class="Special"> &lt;- </span>get-address result:address:editor-data/deref, bottom:offset
-  result:address:editor-data<span class="Special"> &lt;- </span>render result:address:editor-data
+  <span class="Comment"># initial render to screen, just for some old tests</span>
+  _, screen:address<span class="Special"> &lt;- </span>render screen:address, result:address:editor-data
   <span class="muControl">reply</span> result:address:editor-data
 ]
 
 <span class="muScenario">scenario</span> editor-initializes-without-data [
   assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span>
   run [
-    1:address:editor-data<span class="Special"> &lt;- </span>new-editor <span class="Constant">0:literal/data</span>, screen:address, <span class="Constant">1:literal/top</span>, <span class="Constant">2:literal/left</span>, <span class="Constant">5:literal/right</span>
+    1:address:editor-data<span class="Special"> &lt;- </span>new-editor <span class="Constant">0:literal/data</span>, screen:address, <span class="Constant">2:literal/left</span>, <span class="Constant">5:literal/right</span>
     2:editor-data<span class="Special"> &lt;- </span>copy 1:address:editor-data/deref
   ]
   memory-should-contain [
-    <span class="Comment"># 2 &lt;- just the § sentinel</span>
-    <span class="Comment"># 3 (top of screen) &lt;- the § sentinel</span>
-    <span class="Comment"># 4 (before cursor) &lt;- the § sentinel</span>
-    <span class="Comment"># 5 &lt;- screen</span>
-    6<span class="Special"> &lt;- </span>1  <span class="Comment"># top</span>
-    7<span class="Special"> &lt;- </span>2  <span class="Comment"># left</span>
-    8<span class="Special"> &lt;- </span>1  <span class="Comment"># bottom</span>
-    9<span class="Special"> &lt;- </span>4  <span class="Comment"># right  (inclusive)</span>
-    10<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor row</span>
-    11<span class="Special"> &lt;- </span>2  <span class="Comment"># cursor column</span>
+    <span class="Comment"># 2 (data) &lt;- just the § sentinel</span>
+    <span class="Comment"># 3 (before cursor) &lt;- the § sentinel</span>
+    4<span class="Special"> &lt;- </span>2  <span class="Comment"># left</span>
+    5<span class="Special"> &lt;- </span>4  <span class="Comment"># right  (inclusive)</span>
+    6<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor row</span>
+    7<span class="Special"> &lt;- </span>2  <span class="Comment"># cursor column</span>
   ]
   screen-should-contain [
    <span class="Constant"> .     .</span>
@@ -204,23 +194,22 @@ container editor-data [
   ]
 ]
 
+<span class="Comment"># bottom:number, screen:address &lt;- render screen:address, editor:address:editor-data</span>
 <span class="muRecipe">recipe</span> render [
   <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">40:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   editor:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-<span class="CommentedCode">#?   $print [=== render</span>
-<span class="CommentedCode">#? ] #? 2</span>
-  screen:address<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, screen:offset
-  top:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, top:offset
+  <span class="muControl">reply-unless</span> editor:address:editor-data, <span class="Constant">1:literal/top</span>, screen:address/same-as-ingredient:0
   left:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, left:offset
   screen-height:number<span class="Special"> &lt;- </span>screen-height screen:address
   right:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, right:offset
   hide-screen screen:address
   <span class="Comment"># traversing editor</span>
-  curr:address:duplex-list<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, top-of-screen:offset
+  curr:address:duplex-list<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, data:offset
   prev:address:duplex-list<span class="Special"> &lt;- </span>copy curr:address:duplex-list
   curr:address:duplex-list<span class="Special"> &lt;- </span>next-duplex curr:address:duplex-list
   <span class="Comment"># traversing screen</span>
-  row:number<span class="Special"> &lt;- </span>copy top:number
+  row:number<span class="Special"> &lt;- </span>copy <span class="Constant">1:literal/top</span>
   column:number<span class="Special"> &lt;- </span>copy left:number
   cursor-row:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, cursor-row:offset
   cursor-column:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, cursor-column:offset
@@ -228,8 +217,6 @@ container editor-data [
   move-cursor screen:address, row:number, column:number
   <span class="Delimiter">{</span>
 <span class="Constant">    +next-character</span>
-<span class="CommentedCode">#?     $print curr:address:duplex-list, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
     <span class="muControl">break-unless</span> curr:address:duplex-list
     off-screen?:boolean<span class="Special"> &lt;- </span>greater-or-equal row:number, screen-height:number
     <span class="muControl">break-if</span> off-screen?:boolean
@@ -242,13 +229,8 @@ container editor-data [
       at-cursor?:boolean<span class="Special"> &lt;- </span>equal column:number, cursor-column:address:number/deref
       <span class="muControl">break-unless</span> at-cursor?:boolean
       before-cursor:address:address:duplex-list/deref<span class="Special"> &lt;- </span>prev-duplex curr:address:duplex-list
-<span class="CommentedCode">#?       new-prev:character &lt;- get before-cursor:address:address:duplex-list/deref/deref, value:offset #? 1</span>
-<span class="CommentedCode">#?       $print [render 0: cursor adjusted to after ], new-prev:character, [(], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [)</span>
-<span class="CommentedCode">#? ] #? 1</span>
     <span class="Delimiter">}</span>
     c:character<span class="Special"> &lt;- </span>get curr:address:duplex-list/deref, value:offset
-<span class="CommentedCode">#?     $print [rendering ], c:character, [ </span>
-<span class="CommentedCode">#? ] #? 2</span>
     <span class="Delimiter">{</span>
       <span class="Comment"># newline? move to left rather than 0</span>
       newline?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">10:literal/newline</span>
@@ -261,22 +243,9 @@ container editor-data [
         <span class="muControl">break-unless</span> left-of-cursor?:boolean
         cursor-column:address:number/deref<span class="Special"> &lt;- </span>copy column:number
         before-cursor:address:address:duplex-list/deref<span class="Special"> &lt;- </span>prev-duplex curr:address:duplex-list
-<span class="CommentedCode">#?         new-prev:character &lt;- get before-cursor:address:address:duplex-list/deref/deref, value:offset #? 1</span>
-<span class="CommentedCode">#?         $print [render 1: cursor adjusted to after ], new-prev:character, [(], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [)</span>
-<span class="CommentedCode">#? ] #? 1</span>
       <span class="Delimiter">}</span>
       <span class="Comment"># clear rest of line in this window</span>
-<span class="CommentedCode">#?       $print row:number, [ ], column:number, [ ], right:number, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-      <span class="Delimiter">{</span>
-        done?:boolean<span class="Special"> &lt;- </span>greater-than column:number, right:number
-        <span class="muControl">break-if</span> done?:boolean
-        print-character screen:address, <span class="Constant">32:literal/space</span>
-        column:number<span class="Special"> &lt;- </span>add column:number, <span class="Constant">1:literal</span>
-<span class="CommentedCode">#?         $print column:number, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-        <span class="muControl">loop</span>
-      <span class="Delimiter">}</span>
+      clear-line-delimited screen:address, column:number, right:number
       <span class="Comment"># skip to next line</span>
       row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
       column:number<span class="Special"> &lt;- </span>copy left:number
@@ -286,15 +255,11 @@ container editor-data [
       <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
     <span class="Delimiter">}</span>
     <span class="Delimiter">{</span>
-      <span class="Comment"># at right? more than one letter left in the line? wrap</span>
+      <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span>
+      <span class="Comment"># room for clicking on the cursor after it.</span>
       at-right?:boolean<span class="Special"> &lt;- </span>equal column:number, right:number
       <span class="muControl">break-unless</span> at-right?:boolean
-      next-node:address:duplex-list<span class="Special"> &lt;- </span>next-duplex curr:address:duplex-list
-      <span class="muControl">break-unless</span> next-node:address:duplex-list
-      next:character<span class="Special"> &lt;- </span>get next-node:address:duplex-list/deref, value:offset
-      next-character-is-newline?:boolean<span class="Special"> &lt;- </span>equal next:character, <span class="Constant">10:literal/newline</span>
-      <span class="muControl">break-if</span> next-character-is-newline?:boolean
-      <span class="Comment"># wrap</span>
+      <span class="Comment"># print wrap icon</span>
       print-character screen:address, <span class="Constant">8617:literal/loop-back-to-left</span>, <span class="Constant">245:literal/grey</span>
       column:number<span class="Special"> &lt;- </span>copy left:number
       row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
@@ -308,9 +273,6 @@ container editor-data [
     column:number<span class="Special"> &lt;- </span>add column:number, <span class="Constant">1:literal</span>
     <span class="muControl">loop</span>
   <span class="Delimiter">}</span>
-  <span class="Comment"># bottom = row</span>
-  bottom:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, bottom:offset
-  bottom:address:number/deref<span class="Special"> &lt;- </span>copy row:number
   <span class="Comment"># is cursor to the right of the last line? move to end</span>
   <span class="Delimiter">{</span>
     at-cursor-row?:boolean<span class="Special"> &lt;- </span>equal row:number, cursor-row:address:number/deref
@@ -319,12 +281,8 @@ container editor-data [
     above-cursor-row?:boolean<span class="Special"> &lt;- </span>lesser-than row:number, cursor-row:address:number/deref
     before-cursor?:boolean<span class="Special"> &lt;- </span>or before-cursor-on-same-line?:boolean, above-cursor-row?:boolean
     <span class="muControl">break-unless</span> before-cursor?:boolean
-<span class="CommentedCode">#?     $print [pointed after all text</span>
-<span class="CommentedCode">#? ] #? 1</span>
     cursor-row:address:number/deref<span class="Special"> &lt;- </span>copy row:number
     cursor-column:address:number/deref<span class="Special"> &lt;- </span>copy column:number
-<span class="CommentedCode">#?     $print [render: cursor moved to ], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
     <span class="Comment"># line not wrapped but cursor outside bounds? wrap cursor</span>
     <span class="Delimiter">{</span>
       too-far-right?:boolean<span class="Special"> &lt;- </span>greater-than cursor-column:address:number/deref, right:number
@@ -334,62 +292,106 @@ container editor-data [
       above-screen-bottom?:boolean<span class="Special"> &lt;- </span>lesser-than cursor-row:address:number/deref, screen-height:number
       assert above-screen-bottom?:boolean, <span class="Constant">[unimplemented: wrapping cursor past bottom of screen]</span>
     <span class="Delimiter">}</span>
-<span class="CommentedCode">#?     $print [now ], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
     before-cursor:address:address:duplex-list/deref<span class="Special"> &lt;- </span>copy prev:address:duplex-list
-<span class="CommentedCode">#?     new-prev:character &lt;- get before-cursor:address:address:duplex-list/deref/deref, value:offset #? 1</span>
-<span class="CommentedCode">#?     $print [render Ω: cursor adjusted to after ], new-prev:character, [(], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [)</span>
-<span class="CommentedCode">#? ] #? 1</span>
   <span class="Delimiter">}</span>
-<span class="CommentedCode">#?   $print [clearing ], row:number, [ ], column:number, [ ], right:number, [ </span>
-<span class="CommentedCode">#? ] #? 2</span>
+  <span class="Comment"># clear rest of current line</span>
+  clear-line-delimited screen:address, column:number, right:number
+  <span class="muControl">reply</span> row:number, screen:address/same-as-ingredient:0
+]
+
+<span class="Comment"># row:number, screen:address &lt;- render-string screen:address, s:address:array:character, left:number, right:number, color:number, row:number</span>
+<span class="Comment"># print a string 's' to 'editor' in 'color' starting at 'row'</span>
+<span class="Comment"># leave cursor at start of next line</span>
+<span class="muRecipe">recipe</span> render-string [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">40:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  s:address:array:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  left:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  right:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  color:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  row:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
+  <span class="muControl">reply-unless</span> s:address:array:character, row:number/same-as-ingredient:5, screen:address/same-as-ingredient:0
+  column:number<span class="Special"> &lt;- </span>copy left:number
+  move-cursor screen:address, row:number, column:number
+  screen-height:number<span class="Special"> &lt;- </span>screen-height screen:address
+  i:number<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal</span>
+  len:number<span class="Special"> &lt;- </span>length s:address:array:character/deref
   <span class="Delimiter">{</span>
-    <span class="Comment"># clear rest of current line</span>
+<span class="Constant">    +next-character</span>
+    done?:boolean<span class="Special"> &lt;- </span>greater-or-equal i:number, len:number
+    <span class="muControl">break-if</span> done?:boolean
     done?:boolean<span class="Special"> &lt;- </span>greater-or-equal row:number, screen-height:number
     <span class="muControl">break-if</span> done?:boolean
+    c:character<span class="Special"> &lt;- </span>index s:address:array:character/deref, i:number
     <span class="Delimiter">{</span>
-      line-done?:boolean<span class="Special"> &lt;- </span>greater-than column:number, right:number
-      <span class="muControl">break-if</span> line-done?:boolean
-      print-character screen:address, <span class="Constant">32:literal/space</span>
-      column:number<span class="Special"> &lt;- </span>add column:number, <span class="Constant">1:literal</span>
-      <span class="muControl">loop</span>
+      <span class="Comment"># at right? wrap.</span>
+      at-right?:boolean<span class="Special"> &lt;- </span>equal column:number, right:number
+      <span class="muControl">break-unless</span> at-right?:boolean
+      <span class="Comment"># print wrap icon</span>
+      print-character screen:address, <span class="Constant">8617:literal/loop-back-to-left</span>, <span class="Constant">245:literal/grey</span>
+      column:number<span class="Special"> &lt;- </span>copy left:number
+      row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
+      move-cursor screen:address, row:number, column:number
+      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>  <span class="Comment"># retry i</span>
     <span class="Delimiter">}</span>
-    <span class="Comment"># clear one more line just in case we just backspaced out of it</span>
-    row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
-    column:number<span class="Special"> &lt;- </span>copy left:number
-    done?:boolean<span class="Special"> &lt;- </span>greater-or-equal row:number, screen-height:number
-    <span class="muControl">break-if</span> done?:boolean
-    move-cursor screen:address, row:number, column:number
+    i:number<span class="Special"> &lt;- </span>add i:number, <span class="Constant">1:literal</span>
     <span class="Delimiter">{</span>
-      line-done?:boolean<span class="Special"> &lt;- </span>greater-or-equal column:number, right:number
-      <span class="muControl">break-if</span> line-done?:boolean
-      print-character screen:address, <span class="Constant">32:literal/space</span>
-      column:number<span class="Special"> &lt;- </span>add column:number, <span class="Constant">1:literal</span>
-      <span class="muControl">loop</span>
+      <span class="Comment"># newline? move to left rather than 0</span>
+      newline?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">10:literal/newline</span>
+      <span class="muControl">break-unless</span> newline?:boolean
+      <span class="Comment"># clear rest of line in this window</span>
+      <span class="Delimiter">{</span>
+        done?:boolean<span class="Special"> &lt;- </span>greater-than column:number, right:number
+        <span class="muControl">break-if</span> done?:boolean
+        print-character screen:address, <span class="Constant">32:literal/space</span>
+        column:number<span class="Special"> &lt;- </span>add column:number, <span class="Constant">1:literal</span>
+        <span class="muControl">loop</span>
+      <span class="Delimiter">}</span>
+      row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
+      column:number<span class="Special"> &lt;- </span>copy left:number
+      move-cursor screen:address, row:number, column:number
+      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
     <span class="Delimiter">}</span>
+    print-character screen:address, c:character, color:number
+    column:number<span class="Special"> &lt;- </span>add column:number, <span class="Constant">1:literal</span>
+    <span class="muControl">loop</span>
   <span class="Delimiter">}</span>
-  <span class="Comment"># update cursor</span>
   <span class="Delimiter">{</span>
-    in-focus?:boolean<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, in-focus?:offset
-    <span class="muControl">break-unless</span> in-focus?:boolean
-    cursor-inside-right-margin?:boolean<span class="Special"> &lt;- </span>lesser-or-equal cursor-column:address:number/deref, right:number
-    assert cursor-inside-right-margin?:boolean, <span class="Constant">[cursor outside right margin]</span>
-    cursor-inside-left-margin?:boolean<span class="Special"> &lt;- </span>greater-or-equal cursor-column:address:number/deref, left:number
-    assert cursor-inside-left-margin?:boolean, <span class="Constant">[cursor outside left margin]</span>
-    move-cursor screen:address, cursor-row:address:number/deref, cursor-column:address:number/deref
+    <span class="Comment"># clear rest of current line</span>
+    line-done?:boolean<span class="Special"> &lt;- </span>greater-than column:number, right:number
+    <span class="muControl">break-if</span> line-done?:boolean
+    print-character screen:address, <span class="Constant">32:literal/space</span>
+    column:number<span class="Special"> &lt;- </span>add column:number, <span class="Constant">1:literal</span>
+    <span class="muControl">loop</span>
+  <span class="Delimiter">}</span>
+  <span class="muControl">reply</span> row:number/same-as-ingredient:5, screen:address/same-as-ingredient:0
+]
+
+<span class="muRecipe">recipe</span> clear-line-delimited [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">40:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  left:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  right:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  column:number<span class="Special"> &lt;- </span>copy left:number
+  <span class="Delimiter">{</span>
+    done?:boolean<span class="Special"> &lt;- </span>greater-than column:number, right:number
+    <span class="muControl">break-if</span> done?:boolean
+    print-character screen:address, <span class="Constant">32:literal/space</span>
+    column:number<span class="Special"> &lt;- </span>add column:number, <span class="Constant">1:literal</span>
+    <span class="muControl">loop</span>
   <span class="Delimiter">}</span>
-  show-screen screen:address
-  <span class="muControl">reply</span> editor:address:editor-data/same-as-ingredient:0
 ]
 
 <span class="muScenario">scenario</span> editor-initially-prints-multiple-lines [
-  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span>
+  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span>
   run [
     s:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">def]</span>
-    new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+    new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   ]
   screen-should-contain [
+   <span class="Constant"> .     .</span>
    <span class="Constant"> .abc  .</span>
    <span class="Constant"> .def  .</span>
    <span class="Constant"> .     .</span>
@@ -397,26 +399,27 @@ container editor-data [
 ]
 
 <span class="muScenario">scenario</span> editor-initially-handles-offsets [
-  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span>
+  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span>
   run [
     s:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-    new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">1:literal/left</span>, <span class="Constant">5:literal/right</span>
+    new-editor s:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">5:literal/right</span>
   ]
   screen-should-contain [
-   <span class="Constant"> . abc .</span>
    <span class="Constant"> .     .</span>
+   <span class="Constant"> . abc .</span>
    <span class="Constant"> .     .</span>
   ]
 ]
 
 <span class="muScenario">scenario</span> editor-initially-prints-multiple-lines-at-offset [
-  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span>
+  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span>
   run [
     s:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">def]</span>
-    new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">1:literal/left</span>, <span class="Constant">5:literal/right</span>
+    new-editor s:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">5:literal/right</span>
   ]
   screen-should-contain [
+   <span class="Constant"> .     .</span>
    <span class="Constant"> . abc .</span>
    <span class="Constant"> . def .</span>
    <span class="Constant"> .     .</span>
@@ -424,17 +427,41 @@ container editor-data [
 ]
 
 <span class="muScenario">scenario</span> editor-initially-wraps-long-lines [
-  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span>
+  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span>
   run [
     s:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc def]</span>
-    new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+    new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   ]
   screen-should-contain [
+   <span class="Constant"> .     .</span>
    <span class="Constant"> .abc ↩.</span>
    <span class="Constant"> .def  .</span>
    <span class="Constant"> .     .</span>
   ]
   screen-should-contain-in-color, <span class="Constant">245:literal/grey</span> [
+   <span class="Constant"> .     .</span>
+   <span class="Constant"> .    ↩.</span>
+   <span class="Constant"> .     .</span>
+   <span class="Constant"> .     .</span>
+  ]
+]
+
+<span class="muScenario">scenario</span> editor-initially-wraps-barely-long-lines [
+  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span>
+  run [
+    s:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde]</span>
+    new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  ]
+  <span class="Comment"># still wrap, even though the line would fit. We need room to click on the</span>
+  <span class="Comment"># end of the line</span>
+  screen-should-contain [
+   <span class="Constant"> .     .</span>
+<span class="Constant">    .abcd↩.</span>
+   <span class="Constant"> .e    .</span>
+   <span class="Constant"> .     .</span>
+  ]
+  screen-should-contain-in-color, <span class="Constant">245:literal/grey</span> [
+   <span class="Constant"> .     .</span>
    <span class="Constant"> .    ↩.</span>
    <span class="Constant"> .     .</span>
    <span class="Constant"> .     .</span>
@@ -442,10 +469,10 @@ container editor-data [
 ]
 
 <span class="muScenario">scenario</span> editor-initializes-empty-text [
-  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span>
+  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span>
   run [
     1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[]</span>
-    2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+    2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
@@ -455,86 +482,112 @@ container editor-data [
    <span class="Constant"> .     .</span>
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0  <span class="Comment"># cursor row</span>
+    3<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor row</span>
     4<span class="Special"> &lt;- </span>0  <span class="Comment"># cursor column</span>
   ]
 ]
 
 <span class="SalientComment">## handling events from the keyboard, mouse, touch screen, ...</span>
 
-<span class="Comment"># Takes a chain of editors (chained using editor-data.next-editor), sends each</span>
-<span class="Comment"># event from the console to each editor.</span>
 <span class="muRecipe">recipe</span> event-loop [
   <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
   screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  editor:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  env:address:programming-environment-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  recipes:address:editor-data<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, recipes:offset
+  current-sandbox:address:editor-data<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, current-sandbox:offset
+  sandbox-in-focus?:address:boolean<span class="Special"> &lt;- </span>get-address env:address:programming-environment-data/deref, sandbox-in-focus?:offset
   <span class="Delimiter">{</span>
-    <span class="Comment"># send each event to each editor</span>
+    <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span>
+<span class="Constant">    +next-event</span>
     e:event, console:address, found?:boolean, quit?:boolean<span class="Special"> &lt;- </span>read-event console:address
     <span class="muControl">loop-unless</span> found?:boolean
     <span class="muControl">break-if</span> quit?:boolean  <span class="Comment"># only in tests</span>
     trace <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span>
-<span class="CommentedCode">#?     $print [--- new event</span>
-<span class="CommentedCode">#? ] #? 1</span>
-    curr:address:editor-data<span class="Special"> &lt;- </span>copy editor:address:editor-data
+    <span class="Comment"># check for global events that will trigger regardless of which editor has focus</span>
     <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> curr:address:editor-data
-      handle-event screen:address, console:address, curr:address:editor-data, e:event
-      curr:address:editor-data<span class="Special"> &lt;- </span>get curr:address:editor-data/deref, next-editor:offset
-      <span class="muControl">loop</span>
+      k:address:number<span class="Special"> &lt;- </span>maybe-convert e:event, keycode:variant
+      <span class="muControl">break-unless</span> k:address:number
+      <span class="Comment"># F10? load all code and run all sandboxes.</span>
+      <span class="Delimiter">{</span>
+        do-run?:boolean<span class="Special"> &lt;- </span>equal k:address:number/deref, <span class="Constant">65526:literal/F10</span>
+        <span class="muControl">break-unless</span> do-run?:boolean
+        run-sandboxes env:address:programming-environment-data
+        <span class="muControl">jump</span> <span class="Constant">+continue:label</span>
+      <span class="Delimiter">}</span>
     <span class="Delimiter">}</span>
-    <span class="Comment"># after each non-trivial event, render all editors</span>
-    curr:address:editor-data<span class="Special"> &lt;- </span>copy editor:address:editor-data
+    <span class="Comment"># 'touch' event - send to both editors</span>
     <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> curr:address:editor-data
-      render curr:address:editor-data
-      curr:address:editor-data<span class="Special"> &lt;- </span>get curr:address:editor-data/deref, next-editor:offset
-      <span class="muControl">loop</span>
+      t:address:touch-event<span class="Special"> &lt;- </span>maybe-convert e:event, touch:variant
+      <span class="muControl">break-unless</span> t:address:touch-event
+      _<span class="Special"> &lt;- </span>move-cursor-in-editor screen:address, recipes:address:editor-data, t:address:touch-event/deref
+      sandbox-in-focus?:address:boolean/deref<span class="Special"> &lt;- </span>move-cursor-in-editor screen:address, current-sandbox:address:editor-data, t:address:touch-event/deref
+      <span class="muControl">jump</span> <span class="Constant">+continue:label</span>
     <span class="Delimiter">}</span>
-    <span class="Comment"># ..and position the cursor</span>
-    curr:address:editor-data<span class="Special"> &lt;- </span>copy editor:address:editor-data
+    <span class="Comment"># if it's not global, send to appropriate editor</span>
     <span class="Delimiter">{</span>
-      <span class="muControl">break-unless</span> curr:address:editor-data
       <span class="Delimiter">{</span>
-        in-focus?:boolean<span class="Special"> &lt;- </span>get curr:address:editor-data/deref, in-focus?:offset
-        <span class="muControl">break-unless</span> in-focus?:boolean
-        cursor-row:number<span class="Special"> &lt;- </span>get curr:address:editor-data/deref, cursor-row:offset
-        cursor-column:number<span class="Special"> &lt;- </span>get curr:address:editor-data/deref, cursor-column:offset
-        move-cursor screen:address, cursor-row:number, cursor-column:number
+        <span class="muControl">break-if</span> sandbox-in-focus?:address:boolean/deref
+        handle-event screen:address, console:address, recipes:address:editor-data, e:event
       <span class="Delimiter">}</span>
-      curr:address:editor-data<span class="Special"> &lt;- </span>get curr:address:editor-data/deref, next-editor:offset
-      <span class="muControl">loop</span>
+      <span class="Delimiter">{</span>
+        <span class="muControl">break-unless</span> sandbox-in-focus?:address:boolean/deref
+        handle-event screen:address, console:address, current-sandbox:address:editor-data, e:event
+      <span class="Delimiter">}</span>
+    <span class="Delimiter">}</span>
+<span class="Constant">    +continue</span>
+    <span class="Comment"># if no more events currently left to process, render</span>
+    <span class="Comment"># todo: test this</span>
+    <span class="Delimiter">{</span>
+      more-events?:boolean<span class="Special"> &lt;- </span>has-more-events? console:address
+      <span class="muControl">break-if</span> more-events?:boolean
+      render-all screen:address, env:address:programming-environment-data
     <span class="Delimiter">}</span>
     <span class="muControl">loop</span>
   <span class="Delimiter">}</span>
 ]
 
+<span class="Comment"># helper for testing a single editor</span>
+<span class="muRecipe">recipe</span> editor-event-loop [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  editor:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span>
+<span class="Constant">    +next-event</span>
+    e:event, console:address, found?:boolean, quit?:boolean<span class="Special"> &lt;- </span>read-event console:address
+    <span class="muControl">loop-unless</span> found?:boolean
+    <span class="muControl">break-if</span> quit?:boolean  <span class="Comment"># only in tests</span>
+    trace <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span>
+    <span class="Comment"># 'touch' event - send to both editors</span>
+    <span class="Delimiter">{</span>
+      t:address:touch-event<span class="Special"> &lt;- </span>maybe-convert e:event, touch:variant
+      <span class="muControl">break-unless</span> t:address:touch-event
+      move-cursor-in-editor screen:address, editor:address:editor-data, t:address:touch-event/deref
+      <span class="muControl">jump</span> <span class="Constant">+continue:label</span>
+    <span class="Delimiter">}</span>
+    <span class="Comment"># other events - send to appropriate editor</span>
+    handle-event screen:address, console:address, editor:address:editor-data, e:event
+<span class="Constant">    +continue</span>
+    row:number, screen:address<span class="Special"> &lt;- </span>render screen:address, editor:address:editor-data
+    <span class="Comment"># clear next line, in case we just processed a backspace</span>
+    left:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, left:offset
+    right:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, right:offset
+    row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
+    move-cursor screen:address, row:number, left:number
+    clear-line-delimited screen:address, left:number, right:number
+    <span class="muControl">loop</span>
+  <span class="Delimiter">}</span>
+]
+
 <span class="muRecipe">recipe</span> handle-event [
   <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">50:literal</span>
   screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   editor:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   e:event<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  <span class="Comment"># 'touch' event</span>
-  <span class="Delimiter">{</span>
-    t:address:touch-event<span class="Special"> &lt;- </span>maybe-convert e:event, touch:variant
-    <span class="muControl">break-unless</span> t:address:touch-event
-    move-cursor-in-editor editor:address:editor-data, t:address:touch-event/deref
-    <span class="muControl">reply</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># other events trigger only if this editor is in focus</span>
-<span class="CommentedCode">#?   $print [checking ], editor:address:editor-data, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?   x:address:boolean &lt;- get-address editor:address:editor-data/deref, in-focus?:offset #? 1</span>
-<span class="CommentedCode">#?   $print [address of focus: ], x:address:boolean, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-  in-focus?:address:boolean<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, in-focus?:offset
-<span class="CommentedCode">#?   $print [ at ], in-focus?:address:boolean, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-  <span class="muControl">reply-unless</span> in-focus?:address:boolean/deref
-<span class="CommentedCode">#?   $print [in focus: ], editor:address:editor-data, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
+  <span class="muControl">reply-unless</span> editor:address:editor-data
   <span class="Comment"># typing a character</span>
   <span class="Delimiter">{</span>
     c:address:character<span class="Special"> &lt;- </span>maybe-convert e:event, text:variant
@@ -546,7 +599,7 @@ container editor-data [
       delete-before-cursor editor:address:editor-data
       <span class="muControl">reply</span>
     <span class="Delimiter">}</span>
-    insert-at-cursor editor:address:editor-data, c:address:character/deref
+    insert-at-cursor editor:address:editor-data, c:address:character/deref, screen:address
     <span class="muControl">reply</span>
   <span class="Delimiter">}</span>
   <span class="Comment"># otherwise it's a special key to control the editor</span>
@@ -557,7 +610,8 @@ container editor-data [
   cursor-row:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, cursor-row:offset
   cursor-column:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, cursor-column:offset
   screen-height:number<span class="Special"> &lt;- </span>screen-height screen:address
-  top:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, top:offset
+  left:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, left:offset
+  right:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, right:offset
   <span class="Comment"># arrows; update cursor-row and cursor-column, leave before-cursor to 'render'.</span>
   <span class="Comment"># right arrow</span>
   <span class="Delimiter">{</span>
@@ -574,7 +628,7 @@ container editor-data [
       was-at-newline?:boolean<span class="Special"> &lt;- </span>equal old-cursor-character:character, <span class="Constant">10:literal/newline</span>
       <span class="muControl">break-unless</span> was-at-newline?:boolean
       cursor-row:address:number/deref<span class="Special"> &lt;- </span>add cursor-row:address:number/deref, <span class="Constant">1:literal</span>
-      cursor-column:address:number/deref<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal</span>
+      cursor-column:address:number/deref<span class="Special"> &lt;- </span>copy left:number
       <span class="Comment"># todo: what happens when cursor is too far down?</span>
       screen-height:number<span class="Special"> &lt;- </span>screen-height screen:address
       above-screen-bottom?:boolean<span class="Special"> &lt;- </span>lesser-than cursor-row:address:number/deref, screen-height:number
@@ -584,21 +638,17 @@ container editor-data [
     <span class="Comment"># if the line wraps, move cursor to start of next row</span>
     <span class="Delimiter">{</span>
       <span class="Comment"># if we're at the column just before the wrap indicator</span>
-      right:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, right:offset
       wrap-column:number<span class="Special"> &lt;- </span>subtract right:number, <span class="Constant">1:literal</span>
       at-wrap?:boolean<span class="Special"> &lt;- </span>equal cursor-column:address:number/deref, wrap-column:number
       <span class="muControl">break-unless</span> at-wrap?:boolean
-      <span class="Comment"># and if character after next isn't newline</span>
-<span class="CommentedCode">#?       $print [aaa] #? 1</span>
+      <span class="Comment"># and if next character isn't newline</span>
       new-cursor:address:duplex-list<span class="Special"> &lt;- </span>next-duplex old-cursor:address:duplex-list
       <span class="muControl">break-unless</span> new-cursor:address:duplex-list
-      next:address:duplex-list<span class="Special"> &lt;- </span>next-duplex new-cursor:address:duplex-list
-      <span class="muControl">break-unless</span> next:address:duplex-list
-      next-character:character<span class="Special"> &lt;- </span>get next:address:duplex-list/deref, value:offset
+      next-character:character<span class="Special"> &lt;- </span>get new-cursor:address:duplex-list/deref, value:offset
       newline?:boolean<span class="Special"> &lt;- </span>equal next-character:character, <span class="Constant">10:literal/newline</span>
       <span class="muControl">break-if</span> newline?:boolean
       cursor-row:address:number/deref<span class="Special"> &lt;- </span>add cursor-row:address:number/deref, <span class="Constant">1:literal</span>
-      cursor-column:address:number/deref<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal</span>
+      cursor-column:address:number/deref<span class="Special"> &lt;- </span>copy left:number
       <span class="Comment"># todo: what happens when cursor is too far down?</span>
       above-screen-bottom?:boolean<span class="Special"> &lt;- </span>lesser-than cursor-row:address:number/deref, screen-height:number
       assert above-screen-bottom?:boolean, <span class="Constant">[unimplemented: moving past bottom of screen]</span>
@@ -611,6 +661,7 @@ container editor-data [
   <span class="Delimiter">{</span>
     move-to-previous-character?:boolean<span class="Special"> &lt;- </span>equal k:address:number/deref, <span class="Constant">65515:literal/left-arrow</span>
     <span class="muControl">break-unless</span> move-to-previous-character?:boolean
+<span class="CommentedCode">#?     trace [app], [left arrow] #? 1</span>
     <span class="Comment"># if not at start of text (before-cursor at § sentinel)</span>
     prev:address:duplex-list<span class="Special"> &lt;- </span>prev-duplex before-cursor:address:address:duplex-list/deref
     <span class="muControl">break-unless</span> prev:address:duplex-list
@@ -618,6 +669,7 @@ container editor-data [
     <span class="Delimiter">{</span>
       at-left-margin?:boolean<span class="Special"> &lt;- </span>equal cursor-column:address:number/deref, <span class="Constant">0:literal</span>
       <span class="muControl">break-if</span> at-left-margin?:boolean
+<span class="CommentedCode">#?       trace [app], [decrementing] #? 1</span>
       cursor-column:address:number/deref<span class="Special"> &lt;- </span>subtract cursor-column:address:number/deref, <span class="Constant">1:literal</span>
       <span class="muControl">reply</span>
     <span class="Delimiter">}</span>
@@ -628,6 +680,7 @@ container editor-data [
       prevc:character<span class="Special"> &lt;- </span>get before-cursor:address:address:duplex-list/deref/deref, value:offset
       previous-character-is-newline?:boolean<span class="Special"> &lt;- </span>equal prevc:character, <span class="Constant">10:literal/newline</span>
       <span class="muControl">break-unless</span> previous-character-is-newline?:boolean
+<span class="CommentedCode">#?       trace [app], [previous line] #? 1</span>
       <span class="Comment"># compute length of previous line</span>
       end-of-line:number<span class="Special"> &lt;- </span>previous-line-length before-cursor:address:address:duplex-list/deref, d:address:duplex-list
       cursor-row:address:number/deref<span class="Special"> &lt;- </span>subtract cursor-row:address:number/deref, <span class="Constant">1:literal</span>
@@ -637,7 +690,6 @@ container editor-data [
     <span class="Comment"># if before-cursor is not at newline, we're just at a wrapped line</span>
     assert cursor-row:address:number/deref, <span class="Constant">[unimplemented: moving cursor above top of screen]</span>
     cursor-row:address:number/deref<span class="Special"> &lt;- </span>subtract cursor-row:address:number/deref, <span class="Constant">1:literal</span>
-    right:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, right:offset
     cursor-column:address:number/deref<span class="Special"> &lt;- </span>subtract right:number, <span class="Constant">1:literal</span>  <span class="Comment"># leave room for wrap icon</span>
   <span class="Delimiter">}</span>
   <span class="Comment"># down arrow</span>
@@ -657,7 +709,7 @@ container editor-data [
     move-to-previous-line?:boolean<span class="Special"> &lt;- </span>equal k:address:number/deref, <span class="Constant">65517:literal/up-arrow</span>
     <span class="muControl">break-unless</span> move-to-previous-line?:boolean
     <span class="Comment"># todo: support scrolling</span>
-    already-at-top?:boolean<span class="Special"> &lt;- </span>lesser-or-equal cursor-row:address:number/deref, top:number
+    already-at-top?:boolean<span class="Special"> &lt;- </span>lesser-or-equal cursor-row:address:number/deref, <span class="Constant">1:literal/top</span>
     <span class="muControl">break-if</span> already-at-top?:boolean
 <span class="CommentedCode">#?     $print [moving up</span>
 <span class="CommentedCode">#? ] #? 1</span>
@@ -666,58 +718,58 @@ container editor-data [
   <span class="Delimiter">}</span>
 ]
 
+<span class="Comment"># process click, return if it was on current editor</span>
+<span class="Comment"># todo: ignores menu bar (for now just displays shortcuts)</span>
 <span class="muRecipe">recipe</span> move-cursor-in-editor [
   <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   editor:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   t:touch-event<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  <span class="Comment"># always reset focus to start</span>
-  in-focus?:address:boolean<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, in-focus?:offset
-  in-focus?:address:boolean/deref<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal/true</span>
+  <span class="muControl">reply-unless</span> editor:address:editor-data, <span class="Constant">0:literal/false</span>
   click-column:number<span class="Special"> &lt;- </span>get t:touch-event, column:offset
   left:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, left:offset
   too-far-left?:boolean<span class="Special"> &lt;- </span>lesser-than click-column:number, left:number
-  <span class="muControl">reply-if</span> too-far-left?:boolean
+  <span class="muControl">reply-if</span> too-far-left?:boolean, <span class="Constant">0:literal/false</span>
   right:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, right:offset
   too-far-right?:boolean<span class="Special"> &lt;- </span>greater-than click-column:number, right:number
-  <span class="muControl">reply-if</span> too-far-right?:boolean
-<span class="CommentedCode">#?   $print [focus now at ], editor:address:editor-data, [ </span>
-<span class="CommentedCode">#? ] #? 2</span>
-  <span class="Comment"># click on this window; gain focus</span>
-  in-focus?:address:boolean/deref<span class="Special"> &lt;- </span>copy <span class="Constant">1:literal/true</span>
+  <span class="muControl">reply-if</span> too-far-right?:boolean, <span class="Constant">0:literal/false</span>
   <span class="Comment"># update cursor</span>
   cursor-row:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, cursor-row:offset
   cursor-row:address:number/deref<span class="Special"> &lt;- </span>get t:touch-event, row:offset
   cursor-column:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, cursor-column:offset
   cursor-column:address:number/deref<span class="Special"> &lt;- </span>get t:touch-event, column:offset
-<span class="CommentedCode">#?   $print [column is at: ], cursor-column:address:number, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
+  render screen:address, editor:address:editor-data
+  <span class="Comment"># gain focus</span>
+  <span class="muControl">reply</span> <span class="Constant">1:literal/true</span>
 ]
 
 <span class="muRecipe">recipe</span> insert-at-cursor [
   <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
   editor:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   c:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
 <span class="CommentedCode">#?   $print [insert ], c:character, [ </span>
 <span class="CommentedCode">#? ] #? 1</span>
   before-cursor:address:address:duplex-list<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, before-cursor:offset
   d:address:duplex-list<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, data:offset
   insert-duplex c:character, before-cursor:address:address:duplex-list/deref
-  screen:address<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, screen:offset
+  before-cursor:address:address:duplex-list/deref<span class="Special"> &lt;- </span>next-duplex before-cursor:address:address:duplex-list/deref
   cursor-row:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, cursor-row:offset
   cursor-column:address:number<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, cursor-column:offset
+  left:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, left:offset
+  right:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, right:offset
   <span class="Comment"># update cursor: if newline, move cursor to start of next line</span>
   <span class="Comment"># todo: bottom of screen</span>
   <span class="Delimiter">{</span>
     newline?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">10:literal/newline</span>
     <span class="muControl">break-unless</span> newline?:boolean
     cursor-row:address:number/deref<span class="Special"> &lt;- </span>add cursor-row:address:number/deref, <span class="Constant">1:literal</span>
-    cursor-column:address:number/deref<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal</span>
+    cursor-column:address:number/deref<span class="Special"> &lt;- </span>copy left:number
     <span class="muControl">reply</span>
   <span class="Delimiter">}</span>
   <span class="Comment"># if the line wraps at the cursor, move cursor to start of next row</span>
   <span class="Delimiter">{</span>
     <span class="Comment"># if we're at the column just before the wrap indicator</span>
-    right:number<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, right:offset
     wrap-column:number<span class="Special"> &lt;- </span>subtract right:number, <span class="Constant">1:literal</span>
 <span class="CommentedCode">#?     $print [wrap? ], cursor-column:address:number/deref, [ vs ], wrap-column:number, [ </span>
 <span class="CommentedCode">#? ] #? 1</span>
@@ -782,24 +834,116 @@ container editor-data [
   <span class="muControl">reply</span> result:number
 ]
 
+<span class="muRecipe">recipe</span> render-all [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">40:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  env:address:programming-environment-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  recipes:address:editor-data<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, recipes:offset
+  current-sandbox:address:editor-data<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, current-sandbox:offset
+  sandbox-in-focus?:boolean<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, sandbox-in-focus?:offset
+  <span class="Comment"># render recipes, along with any warnings</span>
+  left:number<span class="Special"> &lt;- </span>get recipes:address:editor-data/deref, left:offset
+  right:number<span class="Special"> &lt;- </span>get recipes:address:editor-data/deref, right:offset
+  row:number, screen:address<span class="Special"> &lt;- </span>render screen:address, recipes:address:editor-data
+  recipe-warnings:address:array:character<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, recipe-warnings:offset
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-unless</span> recipe-warnings:address:array:character
+    row:number, screen:address<span class="Special"> &lt;- </span>render-string screen:address, recipe-warnings:address:array:character, left:number, right:number, <span class="Constant">1:literal/red</span>, row:number
+  <span class="Delimiter">}</span>
+  <span class="Delimiter">{</span>
+    <span class="Comment"># no warnings? move to next lin</span>
+    <span class="muControl">break-if</span> recipe-warnings:address:array:character
+    row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
+  <span class="Delimiter">}</span>
+  <span class="Comment"># draw dotted line after recipes</span>
+  draw-horizontal screen:address, row:number, left:number, right:number, <span class="Constant">9480:literal/horizontal-dotted</span>
+  <span class="Comment"># clear next line, in case we just processed a backspace</span>
+  row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
+  move-cursor screen:address, row:number, left:number
+  clear-line-delimited screen:address, left:number, right:number
+  <span class="Comment"># render sandboxes along with warnings for each</span>
+  left:number<span class="Special"> &lt;- </span>get current-sandbox:address:editor-data/deref, left:offset
+  right:number<span class="Special"> &lt;- </span>get current-sandbox:address:editor-data/deref, right:offset
+  row:number, screen:address<span class="Special"> &lt;- </span>render screen:address, current-sandbox:address:editor-data
+  row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
+  draw-horizontal screen:address, row:number, left:number, right:number, <span class="Constant">9473:literal/horizontal-double</span>
+  sandbox:address:sandbox-data<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, sandbox:offset
+  row:number, screen:address<span class="Special"> &lt;- </span>render-sandboxes screen:address, sandbox:address:sandbox-data, left:number, right:number, row:number
+  <span class="Comment"># clear next line, in case we just processed a backspace</span>
+  row:number<span class="Special"> &lt;- </span>add row:number, <span class="Constant">1:literal</span>
+  move-cursor screen:address, row:number, left:number
+  clear-line-delimited screen:address, left:number, right:number
+  update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:boolean
+  show-screen screen:address
+  <span class="muControl">reply</span> screen:address/same-as-ingredient:0
+]
+
+<span class="muRecipe">recipe</span> render-sandboxes [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">40:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  sandbox:address:sandbox-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  left:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  right:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  row:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="muControl">reply-unless</span> sandbox:address:sandbox-data, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0
+  screen-height:number<span class="Special"> &lt;- </span>screen-width screen:address
+  at-bottom?:boolean<span class="Special"> &lt;- </span>greater-or-equal row:number screen-height:number
+  <span class="muControl">reply-if</span> at-bottom?:boolean, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0
+  <span class="Comment"># render sandbox contents</span>
+  sandbox-data:address:array:character<span class="Special"> &lt;- </span>get sandbox:address:sandbox-data/deref, data:offset
+  row:number, screen:address<span class="Special"> &lt;- </span>render-string screen:address, sandbox-data:address:array:character, left:number, right:number, <span class="Constant">7:literal/white</span>, row:number
+  <span class="Comment"># render sandbox warnings or response, in that order</span>
+  sandbox-response:address:array:character<span class="Special"> &lt;- </span>get sandbox:address:sandbox-data/deref, response:offset
+  sandbox-warnings:address:array:character<span class="Special"> &lt;- </span>get sandbox:address:sandbox-data/deref, warnings:offset
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-unless</span> sandbox-warnings:address:array:character
+    row:number, screen:address<span class="Special"> &lt;- </span>render-string screen:address, sandbox-warnings:address:array:character, left:number, right:number, <span class="Constant">1:literal/red</span>, row:number
+  <span class="Delimiter">}</span>
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-if</span> sandbox-warnings:address:array:character
+    row:number, screen:address<span class="Special"> &lt;- </span>render-string screen:address, sandbox-response:address:array:character, left:number, right:number, <span class="Constant">245:literal/grey</span>, row:number
+  <span class="Delimiter">}</span>
+  <span class="Comment"># draw solid line after sandbox</span>
+  draw-horizontal screen:address, row:number, left:number, right:number, <span class="Constant">9473:literal/horizontal-double</span>
+  <span class="Comment"># draw next sandbox</span>
+  next-sandbox:address:sandbox-data<span class="Special"> &lt;- </span>get sandbox:address:sandbox-data/deref, next-sandbox:offset
+  row:number, screen:address<span class="Special"> &lt;- </span>render-sandboxes screen:address, next-sandbox:address:sandbox-data, left:number, right:number, row:number
+  <span class="muControl">reply</span> row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0
+]
+
+<span class="muRecipe">recipe</span> update-cursor [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">40:literal</span>
+  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  recipes:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  current-sandbox:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  sandbox-in-focus?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-if</span> sandbox-in-focus?:boolean
+<span class="CommentedCode">#?     $print [recipes in focus</span>
+<span class="CommentedCode">#? ] #? 1</span>
+    cursor-row:number<span class="Special"> &lt;- </span>get recipes:address:editor-data/deref, cursor-row:offset
+    cursor-column:number<span class="Special"> &lt;- </span>get recipes:address:editor-data/deref, cursor-column:offset
+  <span class="Delimiter">}</span>
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-unless</span> sandbox-in-focus?:boolean
+<span class="CommentedCode">#?     $print [sandboxes in focus</span>
+<span class="CommentedCode">#? ] #? 1</span>
+    cursor-row:number<span class="Special"> &lt;- </span>get current-sandbox:address:editor-data/deref, cursor-row:offset
+    cursor-column:number<span class="Special"> &lt;- </span>get current-sandbox:address:editor-data/deref, cursor-column:offset
+  <span class="Delimiter">}</span>
+  move-cursor screen:address, cursor-row:number, cursor-column:number
+]
+
 <span class="muScenario">scenario</span> editor-handles-empty-event-queue [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-<span class="CommentedCode">#?   3:number &lt;- get screen:address/deref, num-rows:offset #? 1</span>
-<span class="CommentedCode">#?   $print [0: ], screen:address, [: ], 3:number, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-<span class="CommentedCode">#?   $print [1: ], screen:address, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console <span class="Constant">[]</span>
-<span class="CommentedCode">#?   $print [8: ], screen:address, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
-<span class="CommentedCode">#?   $print [9: ], screen:address, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .          .</span>
   ]
@@ -808,21 +952,22 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-handles-mouse-clicks [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 0, 1  <span class="Comment"># on the 'b'</span>
+    left-click 1, 1  <span class="Comment"># on the 'b'</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .          .</span>
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0  <span class="Comment"># cursor is at row 0..</span>
+    3<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor is at row 0..</span>
     4<span class="Special"> &lt;- </span>1  <span class="Comment"># ..and column 1</span>
   ]
 ]
@@ -830,17 +975,17 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 0, 7  <span class="Comment"># last line, to the right of text</span>
+    left-click 1, 7  <span class="Comment"># last line, to the right of text</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0  <span class="Comment"># cursor row</span>
+    3<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor row</span>
     4<span class="Special"> &lt;- </span>3  <span class="Comment"># cursor column</span>
   ]
 ]
@@ -849,17 +994,17 @@ container editor-data [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">def]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 0, 7  <span class="Comment"># interior line, to the right of text</span>
+    left-click 1, 7  <span class="Comment"># interior line, to the right of text</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0  <span class="Comment"># cursor row</span>
+    3<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor row</span>
     4<span class="Special"> &lt;- </span>3  <span class="Comment"># cursor column</span>
   ]
 ]
@@ -868,17 +1013,17 @@ container editor-data [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">def]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 2, 7  <span class="Comment"># below text</span>
+    left-click 3, 7  <span class="Comment"># below text</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor row</span>
+    3<span class="Special"> &lt;- </span>2  <span class="Comment"># cursor row</span>
     4<span class="Special"> &lt;- </span>3  <span class="Comment"># cursor column</span>
   ]
 ]
@@ -887,22 +1032,23 @@ container editor-data [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
   <span class="Comment"># editor occupies only left half of screen</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   assume-console [
     <span class="Comment"># click on right half of screen</span>
     left-click 3, 8
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .          .</span>
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0  <span class="Comment"># no change to cursor row</span>
+    3<span class="Special"> &lt;- </span>1  <span class="Comment"># no change to cursor row</span>
     4<span class="Special"> &lt;- </span>0  <span class="Comment"># ..or column</span>
   ]
 ]
@@ -910,14 +1056,15 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-inserts-characters-into-empty-editor [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   assume-console [
     type <span class="Constant">[abc]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .          .</span>
   ]
@@ -926,16 +1073,17 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-inserts-characters-at-cursor [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
     type <span class="Constant">[0]</span>
-    left-click 0, 2
+    left-click 1, 2
     type <span class="Constant">[d]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .0adbc     .</span>
    <span class="Constant"> .          .</span>
   ]
@@ -944,15 +1092,16 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-2 [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 0, 5  <span class="Comment"># right of last line</span>
+    left-click 1, 5  <span class="Comment"># right of last line</span>
     type <span class="Constant">[d]</span>  <span class="Comment"># should append</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abcd      .</span>
    <span class="Constant"> .          .</span>
   ]
@@ -961,15 +1110,16 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-3 [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
     left-click 3, 5  <span class="Comment"># below all text</span>
     type <span class="Constant">[d]</span>  <span class="Comment"># should append</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abcd      .</span>
    <span class="Constant"> .          .</span>
   ]
@@ -979,15 +1129,16 @@ container editor-data [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">d]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
     left-click 3, 5  <span class="Comment"># below all text</span>
     type <span class="Constant">[e]</span>  <span class="Comment"># should append</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .de        .</span>
    <span class="Constant"> .          .</span>
@@ -998,61 +1149,38 @@ container editor-data [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">d]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
     left-click 3, 5  <span class="Comment"># below all text</span>
     type <span class="Constant">[ef]</span>  <span class="Comment"># should append multiple characters in order</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .def       .</span>
    <span class="Constant"> .          .</span>
   ]
 ]
 
-<span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-6 [
-  assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-  <span class="Comment"># text fills line</span>
-  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
-  <span class="Comment"># position cursor at end</span>
-  assume-console [
-    left-click 3, 0
-  ]
-  run [
-    event-loop screen:address, console:address, 2:address:editor-data
-    3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
-    4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
-  ]
-  <span class="Comment"># text shouldn't wrap</span>
-  screen-should-contain [
-   <span class="Constant"> .abcde     .</span>
-   <span class="Constant"> .          .</span>
-  ]
-  <span class="Comment"># cursor should wrap</span>
-  memory-should-contain [
-    3<span class="Special"> &lt;- </span>1
-    4<span class="Special"> &lt;- </span>0
-  ]
-]
-
 <span class="muScenario">scenario</span> editor-wraps-line-on-insert [
-  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span>
-  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcd]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   <span class="Comment"># type a letter</span>
   assume-console [
     type <span class="Constant">[e]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   <span class="Comment"># no wrap yet</span>
   screen-should-contain [
-<span class="Constant">    .eabcd.</span>
+   <span class="Constant"> .     .</span>
+   <span class="Constant"> .eabc .</span>
+   <span class="Constant"> .     .</span>
    <span class="Constant"> .     .</span>
   ]
   <span class="Comment"># type a second letter</span>
@@ -1060,28 +1188,30 @@ container editor-data [
     type <span class="Constant">[f]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   <span class="Comment"># now wrap</span>
   screen-should-contain [
+   <span class="Constant"> .     .</span>
 <span class="Constant">    .efab↩.</span>
-   <span class="Constant"> .cd   .</span>
+   <span class="Constant"> .c    .</span>
    <span class="Constant"> .     .</span>
   ]
 ]
 
 <span class="muScenario">scenario</span> editor-moves-cursor-after-inserting-characters [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[ab]</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   assume-console [
     type <span class="Constant">[01]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
-   <span class="Constant"> .01abc     .</span>
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> .01ab      .</span>
    <span class="Constant"> .          .</span>
   ]
 ]
@@ -1089,23 +1219,24 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   assume-console [
-    left-click 0, 4  <span class="Comment"># line is full; no wrap icon yet</span>
+    left-click 1, 4  <span class="Comment"># line is full; no wrap icon yet</span>
     type <span class="Constant">[f]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abcd↩     .</span>
    <span class="Constant"> .fe        .</span>
    <span class="Constant"> .          .</span>
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor row</span>
+    3<span class="Special"> &lt;- </span>2  <span class="Comment"># cursor row</span>
     4<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor column</span>
   ]
 ]
@@ -1113,23 +1244,24 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters-2 [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   assume-console [
-    left-click 0, 3  <span class="Comment"># right before the wrap icon</span>
+    left-click 1, 3  <span class="Comment"># right before the wrap icon</span>
     type <span class="Constant">[f]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abcf↩     .</span>
    <span class="Constant"> .de        .</span>
    <span class="Constant"> .          .</span>
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>1  <span class="Comment"># cursor row</span>
+    3<span class="Special"> &lt;- </span>2  <span class="Comment"># cursor row</span>
     4<span class="Special"> &lt;- </span>0  <span class="Comment"># cursor column</span>
   ]
 ]
@@ -1137,66 +1269,92 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
     type <span class="Constant">[0</span>
 <span class="Constant">1]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .0         .</span>
    <span class="Constant"> .1abc      .</span>
    <span class="Constant"> .          .</span>
   ]
 ]
 
+<span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline-2 [
+  assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">10:literal/right</span>
+  assume-console [
+    type <span class="Constant">[0</span>
+<span class="Constant">1]</span>
+  ]
+  run [
+    editor-event-loop screen:address, console:address, 2:address:editor-data
+  ]
+  screen-should-contain [
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> . 0        .</span>
+   <span class="Constant"> . 1abc     .</span>
+   <span class="Constant"> .          .</span>
+  ]
+]
+
 <span class="muScenario">scenario</span> editor-clears-previous-line-completely-after-inserting-newline [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   <span class="Comment"># press just a 'newline'</span>
   assume-console [
     type [
 ]
   ]
+  screen-should-contain [
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> .abcd↩     .</span>
+   <span class="Constant"> .e         .</span>
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> .          .</span>
+  ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   <span class="Comment"># line should be fully cleared</span>
   screen-should-contain [
    <span class="Constant"> .          .</span>
-   <span class="Constant"> .abcde     .</span>
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> .abcd↩     .</span>
+   <span class="Constant"> .e         .</span>
    <span class="Constant"> .          .</span>
   ]
 ]
 
 <span class="muScenario">scenario</span> editor-handles-backspace-key [
-<span class="CommentedCode">#?   $print [=== new test</span>
-<span class="CommentedCode">#? ] #? 1</span>
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
-<span class="CommentedCode">#?   $print [editor: ], 2:address:editor-data, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 0, 1
+    left-click 1, 1
     type <span class="Constant">[«]</span>
   ]
   3:event/backspace<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
   replace-in-console <span class="Constant">171:literal/«</span>, 3:event/backspace
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     5:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .bc        .</span>
    <span class="Constant"> .          .</span>
   ]
   memory-should-contain [
-    4<span class="Special"> &lt;- </span>0
+    4<span class="Special"> &lt;- </span>1
     5<span class="Special"> &lt;- </span>0
   ]
 ]
@@ -1204,87 +1362,71 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-clears-last-line-on-backspace [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   <span class="Comment"># just one character in final line</span>
-  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
-<span class="Constant">d]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[ab</span>
+<span class="Constant">cd]</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   assume-console [
-    left-click 1, 0  <span class="Comment"># cursor at only character in final line</span>
+    left-click 2, 0  <span class="Comment"># cursor at only character in final line</span>
     type <span class="Constant">[«]</span>
   ]
   3:event/backspace<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
   replace-in-console <span class="Constant">171:literal/«</span>, 3:event/backspace
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abcd      .</span>
    <span class="Constant"> .          .</span>
   ]
 ]
 
-<span class="muScenario">scenario</span> editor-handles-backspace-key-at-right-margin [
+<span class="muScenario">scenario</span> editor-moves-cursor-right-with-key [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-  <span class="Comment"># fill a line with text</span>
-  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
-  <span class="Comment"># position cursor at end</span>
-  assume-console [
-    left-click 1, 3  <span class="Comment"># at end of text</span>
-  ]
-  run [
-    event-loop screen:address, console:address, 2:address:editor-data
-    3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
-    4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
-  ]
-  <span class="Comment"># check that cursor wraps to next line</span>
-  memory-should-contain [
-    3<span class="Special"> &lt;- </span>1
-    4<span class="Special"> &lt;- </span>0
-  ]
-  <span class="Comment"># now hit a backspace key</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    type <span class="Constant">[«]</span>
+    press 65514  <span class="Comment"># right arrow</span>
+    type <span class="Constant">[0]</span>
   ]
-  5:event/backspace<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, 5:event/backspace
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
-    3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
-    4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
-  ]
-  <span class="Comment"># cursor unwraps</span>
-  memory-should-contain [
-    3<span class="Special"> &lt;- </span>0
-    4<span class="Special"> &lt;- </span>4
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
-   <span class="Constant"> .abcd      .</span>
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> .a0bc      .</span>
    <span class="Constant"> .          .</span>
   ]
 ]
 
-<span class="muScenario">scenario</span> editor-moves-cursor-right-with-key [
+<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
+<span class="Constant">d]</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
     press 65514  <span class="Comment"># right arrow</span>
+    press 65514  <span class="Comment"># right arrow</span>
+    press 65514  <span class="Comment"># right arrow</span>
+    press 65514  <span class="Comment"># right arrow - next line</span>
     type <span class="Constant">[0]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
-   <span class="Constant"> .a0bc      .</span>
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> .abc       .</span>
+   <span class="Constant"> .0d        .</span>
    <span class="Constant"> .          .</span>
   ]
 ]
 
-<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow [
+<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow-2 [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">d]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
     press 65514  <span class="Comment"># right arrow</span>
     press 65514  <span class="Comment"># right arrow</span>
@@ -1293,11 +1435,12 @@ container editor-data [
     type <span class="Constant">[0]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
-   <span class="Constant"> .abc       .</span>
-   <span class="Constant"> .0d        .</span>
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> . abc      .</span>
+   <span class="Constant"> . 0d       .</span>
    <span class="Constant"> .          .</span>
   ]
 ]
@@ -1305,63 +1448,84 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcdef]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   assume-console [
-    left-click 0, 3
+    left-click 1, 3
     press 65514  <span class="Comment"># right arrow</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abcd↩     .</span>
    <span class="Constant"> .ef        .</span>
    <span class="Constant"> .          .</span>
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>1
+    3<span class="Special"> &lt;- </span>2
     4<span class="Special"> &lt;- </span>0
   ]
 ]
 
-<span class="muScenario">scenario</span> editor-does-not-wrap-cursor-when-line-does-not-wrap [
+<span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-2 [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
+  <span class="Comment"># line just barely wrapping</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  <span class="Comment"># position cursor at last character before wrap and hit right-arrow</span>
   assume-console [
-    left-click 0, 3  <span class="Comment"># one before right, in the last line</span>
+    left-click 1, 3
     press 65514  <span class="Comment"># right arrow</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
+    3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
+    4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
+  ]
+  memory-should-contain [
+    3<span class="Special"> &lt;- </span>2
+    4<span class="Special"> &lt;- </span>0
+  ]
+  <span class="Comment"># now hit right arrow again</span>
+  assume-console [
+    press 65514
+  ]
+  run [
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0
-    4<span class="Special"> &lt;- </span>4
+    3<span class="Special"> &lt;- </span>2
+    4<span class="Special"> &lt;- </span>1
   ]
 ]
 
-<span class="muScenario">scenario</span> editor-does-not-wrap-cursor-when-line-does-not-wrap-2 [
+<span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-3 [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcde</span>
-<span class="Constant">f]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcdef]</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">6:literal/right</span>
   assume-console [
-    left-click 0, 3  <span class="Comment"># one before right, not the last line</span>
+    left-click 1, 4
     press 65514  <span class="Comment"># right arrow</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
+  screen-should-contain [
+   <span class="Constant"> .          .</span>
+   <span class="Constant"> . abcd↩    .</span>
+   <span class="Constant"> . ef       .</span>
+   <span class="Constant"> .          .</span>
+  ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0
-    4<span class="Special"> &lt;- </span>4
+    3<span class="Special"> &lt;- </span>2
+    4<span class="Special"> &lt;- </span>1
   ]
 ]
 
@@ -1369,16 +1533,17 @@ container editor-data [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">d]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 0, 3
+    left-click 1, 3
     press 65514  <span class="Comment"># right arrow - next line</span>
     type <span class="Constant">[0]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .0d        .</span>
    <span class="Constant"> .          .</span>
@@ -1388,16 +1553,17 @@ container editor-data [
 <span class="muScenario">scenario</span> editor-moves-cursor-left-with-key [
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 0, 2
+    left-click 1, 2
     press 65515  <span class="Comment"># left arrow</span>
     type <span class="Constant">[0]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .a0bc      .</span>
    <span class="Constant"> .          .</span>
   ]
@@ -1408,20 +1574,20 @@ container editor-data [
   <span class="Comment"># initialize editor with two lines</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">d]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   <span class="Comment"># position cursor at start of second line (so there's no previous newline)</span>
   assume-console [
-    left-click 1, 0
+    left-click 2, 0
     press 65515  <span class="Comment"># left arrow</span>
-    type <span class="Constant">[0]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
+    3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
+    4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
-  screen-should-contain [
-   <span class="Constant"> .abc0      .</span>
-   <span class="Constant"> .d         .</span>
-   <span class="Constant"> .          .</span>
+  memory-should-contain [
+    3<span class="Special"> &lt;- </span>1
+    4<span class="Special"> &lt;- </span>3
   ]
 ]
 
@@ -1431,18 +1597,19 @@ container editor-data [
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">def</span>
 <span class="Constant">g]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   <span class="Comment"># position cursor further down (so there's a newline before the character at</span>
   <span class="Comment"># the cursor)</span>
   assume-console [
-    left-click 2, 0
+    left-click 3, 0
     press 65515  <span class="Comment"># left arrow</span>
     type <span class="Constant">[0]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .def0      .</span>
    <span class="Constant"> .g         .</span>
@@ -1455,17 +1622,18 @@ container editor-data [
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">def</span>
 <span class="Constant">g]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   <span class="Comment"># position cursor at start of text</span>
   assume-console [
-    left-click 0, 0
+    left-click 1, 0
     press 65515  <span class="Comment"># left arrow should have no effect</span>
     type <span class="Constant">[0]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .0abc      .</span>
    <span class="Constant"> .def       .</span>
    <span class="Constant"> .g         .</span>
@@ -1479,17 +1647,18 @@ container editor-data [
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 
 d]
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   <span class="Comment"># position cursor right after empty line</span>
   assume-console [
-    left-click 2, 0
+    left-click 3, 0
     press 65515  <span class="Comment"># left arrow</span>
     type <span class="Constant">[0]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
   ]
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abc       .</span>
    <span class="Constant"> .0         .</span>
    <span class="Constant"> .d         .</span>
@@ -1501,24 +1670,25 @@ d]
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   <span class="Comment"># initialize editor with text containing an empty line</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcdef]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
   screen-should-contain [
+   <span class="Constant"> .          .</span>
    <span class="Constant"> .abcd↩     .</span>
    <span class="Constant"> .ef        .</span>
    <span class="Constant"> .          .</span>
   ]
   <span class="Comment"># position cursor right after empty line</span>
   assume-console [
-    left-click 1, 0
+    left-click 2, 0
     press 65515  <span class="Comment"># left arrow</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0  <span class="Comment"># previous row</span>
+    3<span class="Special"> &lt;- </span>1  <span class="Comment"># previous row</span>
     4<span class="Special"> &lt;- </span>3  <span class="Comment"># end of wrapped line</span>
   ]
 ]
@@ -1527,18 +1697,18 @@ d]
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">def]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 1, 1
+    left-click 2, 1
     press 65517  <span class="Comment"># up arrow</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0
+    3<span class="Special"> &lt;- </span>1
     4<span class="Special"> &lt;- </span>1
   ]
 ]
@@ -1547,19 +1717,19 @@ d]
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">def]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
-  <span class="Comment"># cursor starts out at (0, 0)</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  <span class="Comment"># cursor starts out at (1, 0)</span>
   assume-console [
     press 65516  <span class="Comment"># down arrow</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
-  <span class="Comment"># ..and ends at (1, 0)</span>
+  <span class="Comment"># ..and ends at (2, 0)</span>
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>1
+    3<span class="Special"> &lt;- </span>2
     4<span class="Special"> &lt;- </span>0
   ]
 ]
@@ -1568,18 +1738,18 @@ d]
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[ab</span>
 <span class="Constant">def]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 1, 3
+    left-click 2, 3
     press 65517  <span class="Comment"># up arrow</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>0
+    3<span class="Special"> &lt;- </span>1
     4<span class="Special"> &lt;- </span>2
   ]
 ]
@@ -1588,164 +1758,402 @@ d]
   assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc</span>
 <span class="Constant">de]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
   assume-console [
-    left-click 0, 3
+    left-click 1, 3
     press 65516  <span class="Comment"># down arrow</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    editor-event-loop screen:address, console:address, 2:address:editor-data
     3:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
     4:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
-    3<span class="Special"> &lt;- </span>1
+    3<span class="Special"> &lt;- </span>2
     4<span class="Special"> &lt;- </span>2
   ]
 ]
 
 <span class="muScenario">scenario</span> point-at-multiple-editors [
-  assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-  <span class="Comment"># initialize an editor covering left half of screen</span>
+  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
+  <span class="Comment"># initialize both halves of screen</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
-  3:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
-  <span class="Comment"># chain new editor to it, covering the right half of the screen</span>
-  4:address:address:editor-data<span class="Special"> &lt;- </span>get-address 2:address:editor-data/deref, next-editor:offset
-  4:address:address:editor-data/deref<span class="Special"> &lt;- </span>new-editor 3:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">5:literal/left</span>, <span class="Constant">10:literal/right</span>
-  <span class="Comment"># type one letter in each of them</span>
+  2:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
+  3:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character
+  <span class="Comment"># focus on both sides</span>
   assume-console [
-    left-click 0, 1
-    left-click 0, 8
+    left-click 1, 1
+    left-click 1, 17
   ]
+  <span class="Comment"># check cursor column in each</span>
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
-    5:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
-    6:number<span class="Special"> &lt;- </span>get 4:address:address:editor-data/deref/deref, cursor-column:offset
+    event-loop screen:address, console:address, 3:address:programming-environment-data
+    4:address:editor-data<span class="Special"> &lt;- </span>get 3:address:programming-environment-data/deref, recipes:offset
+    5:number<span class="Special"> &lt;- </span>get 4:address:editor-data/deref, cursor-column:offset
+    6:address:editor-data<span class="Special"> &lt;- </span>get 3:address:programming-environment-data/deref, current-sandbox:offset
+    7:number<span class="Special"> &lt;- </span>get 6:address:editor-data/deref, cursor-column:offset
   ]
   memory-should-contain [
     5<span class="Special"> &lt;- </span>1
-    6<span class="Special"> &lt;- </span>8
+    7<span class="Special"> &lt;- </span>17
   ]
 ]
 
-<span class="muScenario">scenario</span> editors-chain-to-cover-multiple-columns [
-  assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-  <span class="Comment"># initialize an editor covering left half of screen</span>
+<span class="muScenario">scenario</span> edit-multiple-editors [
+  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
+  <span class="Comment"># initialize both halves of screen</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
-  3:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
-  <span class="Comment"># chain new editor to it, covering the right half of the screen</span>
-  4:address:address:editor-data<span class="Special"> &lt;- </span>get-address 2:address:editor-data/deref, next-editor:offset
-  4:address:address:editor-data/deref<span class="Special"> &lt;- </span>new-editor 3:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">5:literal/left</span>, <span class="Constant">10:literal/right</span>
-  reset-focus 2:address:editor-data
+  2:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
+  3:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character
   <span class="Comment"># type one letter in each of them</span>
   assume-console [
-    left-click 0, 1
+    left-click 1, 1
     type <span class="Constant">[0]</span>
-    left-click 0, 6
+    left-click 1, 17
     type <span class="Constant">[1]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
-    5:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
-    6:number<span class="Special"> &lt;- </span>get 4:address:address:editor-data/deref/deref, cursor-column:offset
+    event-loop screen:address, console:address, 3:address:programming-environment-data
+    4:address:editor-data<span class="Special"> &lt;- </span>get 3:address:programming-environment-data/deref, recipes:offset
+    5:number<span class="Special"> &lt;- </span>get 4:address:editor-data/deref, cursor-column:offset
+    6:address:editor-data<span class="Special"> &lt;- </span>get 3:address:programming-environment-data/deref, current-sandbox:offset
+    7:number<span class="Special"> &lt;- </span>get 6:address:editor-data/deref, cursor-column:offset
   ]
   screen-should-contain [
-   <span class="Constant"> .a0bc d1ef .</span>
-   <span class="Constant"> .          .</span>
+   <span class="Constant"> .           run (F10)          .  # this line has a different background, but we don't test that yet</span>
+   <span class="Constant"> .a0bc           ┊d1ef          .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .               ┊              .</span>
   ]
   memory-should-contain [
-    5<span class="Special"> &lt;- </span>2
-    6<span class="Special"> &lt;- </span>7
+    5<span class="Special"> &lt;- </span>2  <span class="Comment"># cursor column of recipe editor</span>
+    7<span class="Special"> &lt;- </span>18  <span class="Comment"># cursor column of sandbox editor</span>
   ]
   <span class="Comment"># show the cursor at the right window</span>
   run [
     screen:address<span class="Special"> &lt;- </span>print-character screen:address, <span class="Constant">9251:literal/␣</span>
   ]
   screen-should-contain [
-   <span class="Constant"> .a0bc d1␣f .</span>
-   <span class="Constant"> .          .</span>
+   <span class="Constant"> .           run (F10)          .</span>
+   <span class="Constant"> .a0bc           ┊d1␣f          .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .               ┊              .</span>
   ]
 ]
 
 <span class="muScenario">scenario</span> multiple-editors-cover-only-their-own-areas [
-  assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
+  assume-screen <span class="Constant">60:literal/width</span>, <span class="Constant">10:literal/height</span>
   run [
-    <span class="Comment"># draw a divider</span>
-    draw-vertical screen:address, <span class="Constant">5:literal/divider</span>, <span class="Constant">0:literal/top</span>, <span class="Constant">5:literal/height</span>
-    <span class="Comment"># initialize editors on both sides of it and chain the two</span>
     1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-    2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
-    3:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
-    4:address:address:editor-data<span class="Special"> &lt;- </span>get-address 2:address:editor-data/deref, next-editor:offset
-    4:address:address:editor-data/deref<span class="Special"> &lt;- </span>new-editor 3:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">6:literal/left</span>, <span class="Constant">10:literal/right</span>
+    2:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
+    3:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character
   ]
   <span class="Comment"># divider isn't messed up</span>
   screen-should-contain [
-   <span class="Constant"> .abc  │def .</span>
-   <span class="Constant"> .     │    .</span>
-   <span class="Constant"> .     │    .</span>
-   <span class="Constant"> .     │    .</span>
-   <span class="Constant"> .     │    .</span>
+   <span class="Constant"> .                                         run (F10)          .</span>
+   <span class="Constant"> .abc                           ┊def                          .</span>
+   <span class="Constant"> .                              ┊                             .</span>
+   <span class="Constant"> .                              ┊                             .</span>
+   <span class="Constant"> .                              ┊                             .</span>
   ]
 ]
 
 <span class="muScenario">scenario</span> editor-in-focus-keeps-cursor [
-  assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
-  <span class="Comment"># initialize an editor covering left half of screen</span>
+  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
   1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
-  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span>
-  3:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
-  <span class="Comment"># chain new editor to it, covering the right half of the screen</span>
-  4:address:address:editor-data<span class="Special"> &lt;- </span>get-address 2:address:editor-data/deref, next-editor:offset
-  4:address:address:editor-data/deref<span class="Special"> &lt;- </span>new-editor 3:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">5:literal/left</span>, <span class="Constant">10:literal/right</span>
-  <span class="Comment"># initialize cursor</span>
+  2:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span>
+  <span class="Comment"># initialize programming environment and highlight cursor</span>
+  assume-console <span class="Constant">[]</span>
   run [
-    reset-focus 2:address:editor-data
-    5:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-row:offset
-    6:number<span class="Special"> &lt;- </span>get 2:address:editor-data/deref, cursor-column:offset
-    move-cursor screen:address, 5:number, 6:number
+    3:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character
+    event-loop screen:address, console:address, 3:address:programming-environment-data
     screen:address<span class="Special"> &lt;- </span>print-character screen:address, <span class="Constant">9251:literal/␣</span>
   ]
-  <span class="Comment"># is it at the right place?</span>
+  <span class="Comment"># is cursor at the right place?</span>
   screen-should-contain [
-   <span class="Constant"> .␣bc  def  .</span>
-   <span class="Constant"> .          .</span>
+   <span class="Constant"> .           run (F10)          .</span>
+   <span class="Constant"> .␣bc            ┊def           .</span>
+<span class="Comment"># artifact of fake console: no events = no render</span>
+<span class="Comment">#   .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .               ┊              .</span>
   ]
   <span class="Comment"># now try typing a letter</span>
   assume-console [
     type <span class="Constant">[z]</span>
   ]
   run [
-    event-loop screen:address, console:address, 2:address:editor-data
+    3:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character
+    event-loop screen:address, console:address, 3:address:programming-environment-data
     screen:address<span class="Special"> &lt;- </span>print-character screen:address, <span class="Constant">9251:literal/␣</span>
   ]
   <span class="Comment"># cursor should still be right</span>
   screen-should-contain [
-   <span class="Constant"> .z␣bc def  .</span>
-   <span class="Constant"> .          .</span>
+   <span class="Constant"> .           run (F10)          .</span>
+   <span class="Constant"> .z␣bc           ┊def           .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .               ┊              .</span>
+  ]
+]
+
+<span class="SalientComment">## Running code from the editors</span>
+
+container sandbox-data [
+  data:address:array:character
+  response:address:array:character
+  warnings:address:array:character
+  next-sandbox:address:sandbox-data
+]
+
+<span class="muScenario">scenario</span> run-and-show-results [
+  $close-trace  <span class="Comment"># trace too long for github</span>
+  assume-screen <span class="Constant">100:literal/width</span>, <span class="Constant">12:literal/height</span>
+  <span class="Comment"># recipe editor is empty</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[]</span>
+  <span class="Comment"># sandbox editor contains an instruction without storing outputs</span>
+  2:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[divide-with-remainder 11:literal, 3:literal]</span>
+  3:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character
+  <span class="Comment"># run the code in the editors</span>
+  assume-console [
+    press 65526  <span class="Comment"># F10</span>
+  ]
+  run [
+    event-loop screen:address, console:address, 3:address:programming-environment-data
+  ]
+  <span class="Comment"># check that screen prints the results</span>
+  screen-should-contain [
+   <span class="Constant"> .                                                                                 run (F10)          .</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊divide-with-remainder 11:literal, 3:literal      .</span>
+   <span class="Constant"> .                                                  ┊3                                                .</span>
+   <span class="Constant"> .                                                  ┊2                                                .</span>
+   <span class="Constant"> .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+  ]
+  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                   divide-with-remainder 11:literal, 3:literal      .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+  ]
+  screen-should-contain-in-color, <span class="Constant">245:literal/grey</span>, [
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+   <span class="Constant"> .                                                  ┊3                                                .</span>
+   <span class="Constant"> .                                                  ┊2                                                .</span>
+   <span class="Constant"> .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+  ]
+  <span class="Comment"># run another command</span>
+  assume-console [
+    left-click 1, 80
+    type <span class="Constant">[add 2:literal, 2:literal]</span>
+    press 65526  <span class="Comment"># F10</span>
+  ]
+  run [
+    event-loop screen:address, console:address, 3:address:programming-environment-data
+  ]
+  <span class="Comment"># check that screen prints the results</span>
+  screen-should-contain [
+   <span class="Constant"> .                                                                                 run (F10)          .</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊add 2:literal, 2:literal                         .</span>
+   <span class="Constant"> .                                                  ┊4                                                .</span>
+   <span class="Constant"> .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊divide-with-remainder 11:literal, 3:literal      .</span>
+   <span class="Constant"> .                                                  ┊3                                                .</span>
+   <span class="Constant"> .                                                  ┊2                                                .</span>
+   <span class="Constant"> .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+  ]
+]
+
+<span class="muRecipe">recipe</span> run-sandboxes [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
+  env:address:programming-environment-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  recipes:address:editor-data<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, recipes:offset
+  current-sandbox:address:editor-data<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, current-sandbox:offset
+  <span class="Comment"># load code from recipe editor, save any warnings</span>
+  in:address:array:character<span class="Special"> &lt;- </span>editor-contents recipes:address:editor-data
+  recipe-warnings:address:address:array:character<span class="Special"> &lt;- </span>get-address env:address:programming-environment-data/deref, recipe-warnings:offset
+  recipe-warnings:address:address:array:character/deref<span class="Special"> &lt;- </span>reload in:address:array:character
+  <span class="Comment"># check contents of right editor (sandbox)</span>
+  <span class="Delimiter">{</span>
+    sandbox-contents:address:array:character<span class="Special"> &lt;- </span>editor-contents current-sandbox:address:editor-data
+    <span class="muControl">break-unless</span> sandbox-contents:address:array:character
+    <span class="Comment"># if contents exist, run them and turn them into a new sandbox-data</span>
+    new-sandbox:address:sandbox-data<span class="Special"> &lt;- </span>new sandbox-data:type
+    data:address:address:array:character<span class="Special"> &lt;- </span>get-address new-sandbox:address:sandbox-data/deref, data:offset
+    data:address:address:array:character/deref<span class="Special"> &lt;- </span>copy sandbox-contents:address:array:character
+    <span class="Comment"># push to head of sandbox list</span>
+    dest:address:address:sandbox-data<span class="Special"> &lt;- </span>get-address env:address:programming-environment-data/deref, sandbox:offset
+    next:address:address:sandbox-data<span class="Special"> &lt;- </span>get-address new-sandbox:address:sandbox-data/deref, next-sandbox:offset
+    next:address:address:sandbox-data/deref<span class="Special"> &lt;- </span>copy dest:address:address:sandbox-data/deref
+    dest:address:address:sandbox-data/deref<span class="Special"> &lt;- </span>copy new-sandbox:address:sandbox-data
+    <span class="Comment"># clear sandbox editor</span>
+    init:address:address:duplex-list<span class="Special"> &lt;- </span>get-address current-sandbox:address:editor-data/deref, data:offset
+    init:address:address:duplex-list/deref<span class="Special"> &lt;- </span>push-duplex <span class="Constant">167:literal/§</span>, <span class="Constant">0:literal/tail</span>
+  <span class="Delimiter">}</span>
+  <span class="Comment"># rerun other sandboxes</span>
+  curr:address:sandbox-data<span class="Special"> &lt;- </span>get env:address:programming-environment-data/deref, sandbox:offset
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-unless</span> curr:address:sandbox-data
+    data:address:address:array:character<span class="Special"> &lt;- </span>get-address curr:address:sandbox-data/deref, data:offset
+    response:address:address:array:character<span class="Special"> &lt;- </span>get-address curr:address:sandbox-data/deref, response:offset
+    warnings:address:address:array:character<span class="Special"> &lt;- </span>get-address curr:address:sandbox-data/deref, warnings:offset
+    response:address:address:array:character/deref, warnings:address:address:array:character/deref<span class="Special"> &lt;- </span>run-interactive data:address:address:array:character/deref
+    curr:address:sandbox-data<span class="Special"> &lt;- </span>get curr:address:sandbox-data/deref, next-sandbox:offset
+    <span class="muControl">loop</span>
+  <span class="Delimiter">}</span>
+]
+
+<span class="muScenario">scenario</span> run-updates-results [
+  $close-trace  <span class="Comment"># trace too long for github</span>
+  assume-screen <span class="Constant">100:literal/width</span>, <span class="Constant">12:literal/height</span>
+  <span class="Comment"># define a recipe (no indent for the 'add' line below so column numbers are more obvious)</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[ </span>
+<span class="Constant">recipe foo [</span>
+<span class="Constant">z:number &lt;- add 2:literal, 2:literal</span>
+<span class="Constant">]</span>]
+  <span class="Comment"># sandbox editor contains an instruction without storing outputs</span>
+  2:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[foo]</span>
+  3:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character
+  <span class="Comment"># run the code in the editors</span>
+  assume-console [
+    press 65526  <span class="Comment"># F10</span>
+  ]
+  run [
+    event-loop screen:address, console:address, 3:address:programming-environment-data
+  ]
+  <span class="Comment"># check that screen prints the results</span>
+  screen-should-contain [
+   <span class="Constant"> .                                                                                 run (F10)          .</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+   <span class="Constant"> .recipe foo [                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .z:number &lt;- add 2:literal, 2:literal              ┊foo                                              .</span>
+   <span class="Constant"> .]                                                 ┊4                                                .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+  ]
+  <span class="Comment"># make a change (incrementing one of the args to 'add'), then rerun</span>
+  assume-console [
+    left-click 3, 28  <span class="Comment"># one past the value of the second arg</span>
+    type <span class="Constant">[«3]</span>  <span class="Comment"># replace</span>
+    press 65526  <span class="Comment"># F10</span>
+  ]
+  4:event/backspace<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
+  replace-in-console <span class="Constant">171:literal/«</span>, 4:event/backspace
+  run [
+    event-loop screen:address, console:address, 3:address:programming-environment-data
+  ]
+  <span class="Comment"># check that screen updates the result on the right</span>
+  screen-should-contain [
+   <span class="Constant"> .                                                                                 run (F10)          .</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+   <span class="Constant"> .recipe foo [                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .z:number &lt;- add 2:literal, 3:literal              ┊foo                                              .</span>
+   <span class="Constant"> .]                                                 ┊5                                                .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
   ]
 ]
 
-<span class="Comment"># set focus to first editor, reset it in later ones</span>
-<span class="muRecipe">recipe</span> reset-focus [
+<span class="muScenario">scenario</span> run-instruction-and-print-warnings [
+  $close-trace  <span class="Comment"># trace too long for github</span>
+  assume-screen <span class="Constant">100:literal/width</span>, <span class="Constant">10:literal/height</span>
+  <span class="Comment"># left editor is empty</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[]</span>
+  <span class="Comment"># right editor contains an illegal instruction</span>
+  2:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[get 1234:number, foo:offset]</span>
+  3:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character
+  <span class="Comment"># run the code in the editors</span>
+  assume-console [
+    press 65526  <span class="Comment"># F10</span>
+  ]
+  run [
+    event-loop screen:address, console:address, 3:address:programming-environment-data
+  ]
+  <span class="Comment"># check that screen prints error message in red</span>
+  screen-should-contain [
+   <span class="Constant"> .                                                                                 run (F10)          .</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊get 1234:number, foo:offset                      .</span>
+   <span class="Constant"> .                                                  ┊unknown element foo in container number          .</span>
+   <span class="Constant"> .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+  ]
+  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                   get 1234:number, foo:offset                      .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+  ]
+  screen-should-contain-in-color, <span class="Constant">1:literal/red</span>, [
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                   unknown element foo in container number          .</span>
+   <span class="Constant"> .                                                                                                    .</span>
+  ]
+  screen-should-contain-in-color, <span class="Constant">245:literal/grey</span>, [
+   <span class="Constant"> .                                                                                                    .</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+<span class="Constant">    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+   <span class="Constant"> .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span>
+   <span class="Constant"> .                                                  ┊                                                 .</span>
+  ]
+]
+
+<span class="muRecipe">recipe</span> editor-contents [
   <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
   editor:address:editor-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  in-focus:address:boolean<span class="Special"> &lt;- </span>get-address editor:address:editor-data/deref, in-focus?:offset
-  in-focus:address:boolean/deref<span class="Special"> &lt;- </span>copy <span class="Constant">1:literal/true</span>
-  e:address:editor-data<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, next-editor:offset
+  buf:address:buffer<span class="Special"> &lt;- </span>new-buffer <span class="Constant">80:literal</span>
+  curr:address:duplex-list<span class="Special"> &lt;- </span>get editor:address:editor-data/deref, data:offset
+  <span class="Comment"># skip § sentinel</span>
+  assert curr:address:duplex-list, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span>
+  curr:address:duplex-list<span class="Special"> &lt;- </span>next-duplex curr:address:duplex-list
+  <span class="muControl">reply-unless</span> curr:address:duplex-list, <span class="Constant">0:literal</span>
   <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> e:address:editor-data
-<span class="CommentedCode">#?     $print [resetting focus in ], e:address:editor-data, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-    x:address:boolean<span class="Special"> &lt;- </span>get-address e:address:editor-data/deref, in-focus?:offset
-<span class="CommentedCode">#?     $print [ at ], x:address:boolean, [ </span>
-<span class="CommentedCode">#? ] #? 1</span>
-    x:address:boolean/deref<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal/false</span>
-    e:address:editor-data<span class="Special"> &lt;- </span>get e:address:editor-data/deref, next-editor:offset
+    <span class="muControl">break-unless</span> curr:address:duplex-list
+    c:character<span class="Special"> &lt;- </span>get curr:address:duplex-list/deref, value:offset
+    buffer-append buf:address:buffer, c:character
+    curr:address:duplex-list<span class="Special"> &lt;- </span>next-duplex curr:address:duplex-list
     <span class="muControl">loop</span>
   <span class="Delimiter">}</span>
+  result:address:array:character<span class="Special"> &lt;- </span>buffer-to-array buf:address:buffer
+  <span class="muControl">reply</span> result:address:array:character
+]
+
+<span class="muScenario">scenario</span> editor-provides-edited-contents [
+  assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span>
+  1:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span>
+  2:address:editor-data<span class="Special"> &lt;- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span>
+  assume-console [
+    left-click 1, 2
+    type <span class="Constant">[def]</span>
+  ]
+  run [
+    editor-event-loop screen:address, console:address, 2:address:editor-data
+    3:address:array:character<span class="Special"> &lt;- </span>editor-contents 2:address:editor-data
+    4:array:character<span class="Special"> &lt;- </span>copy 3:address:array:character/deref
+  ]
+  memory-should-contain [
+    4:string<span class="Special"> &lt;- </span><span class="Constant">[abdefc]</span>
+  ]
 ]
 
 <span class="SalientComment">## helpers for drawing editor borders</span>
@@ -1784,17 +2192,27 @@ d]
   row:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   x:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   right:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  style:character, style-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-if</span> style-found?:boolean
+    style:character<span class="Special"> &lt;- </span>copy <span class="Constant">9472:literal/horizontal</span>
+  <span class="Delimiter">}</span>
   color:number, color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   <span class="Delimiter">{</span>
     <span class="Comment"># default color to white</span>
     <span class="muControl">break-if</span> color-found?:boolean
     color:number<span class="Special"> &lt;- </span>copy <span class="Constant">245:literal/grey</span>
   <span class="Delimiter">}</span>
+  bg-color:number, bg-color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-if</span> bg-color-found?:boolean
+    bg-color:number<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal/black</span>
+  <span class="Delimiter">}</span>
   move-cursor screen:address, row:number, x:number
   <span class="Delimiter">{</span>
-    continue?:boolean<span class="Special"> &lt;- </span>lesser-than x:number, right:number
+    continue?:boolean<span class="Special"> &lt;- </span>lesser-or-equal x:number, right:number  <span class="Comment"># right is inclusive, to match editor-data semantics</span>
     <span class="muControl">break-unless</span> continue?:boolean
-    print-character screen:address, <span class="Constant">9472:literal/horizontal</span>, color:number
+    print-character screen:address, style:character, color:number, bg-color:number
     x:number<span class="Special"> &lt;- </span>add x:number, <span class="Constant">1:literal</span>
     <span class="muControl">loop</span>
   <span class="Delimiter">}</span>
@@ -1806,6 +2224,11 @@ d]
   col:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   x:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   bottom:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  style:character, style-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  <span class="Delimiter">{</span>
+    <span class="muControl">break-if</span> style-found?:boolean
+    style:character<span class="Special"> &lt;- </span>copy <span class="Constant">9474:literal/vertical</span>
+  <span class="Delimiter">}</span>
   color:number, color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
   <span class="Delimiter">{</span>
     <span class="Comment"># default color to white</span>
@@ -1816,7 +2239,7 @@ d]
     continue?:boolean<span class="Special"> &lt;- </span>lesser-than x:number, bottom:number
     <span class="muControl">break-unless</span> continue?:boolean
     move-cursor screen:address, x:number, col:number
-    print-character screen:address, <span class="Constant">9474:literal/vertical</span>, color:number
+    print-character screen:address, style:character, color:number
     x:number<span class="Special"> &lt;- </span>add x:number, <span class="Constant">1:literal</span>
     <span class="muControl">loop</span>
   <span class="Delimiter">}</span>
@@ -1881,6 +2304,37 @@ d]
   move-cursor screen:address, bottom:number, right:number
   print-character screen:address, <span class="Constant">9496:literal/up-left</span>, color:number
 ]
+
+<span class="muRecipe">recipe</span> print-string-with-gradient-background [
+  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
+  x:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  s:address:array:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  color:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  bg-color1:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  bg-color2:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
+  len:number<span class="Special"> &lt;- </span>length s:address:array:character/deref
+  color-range:number<span class="Special"> &lt;- </span>subtract bg-color2:number, bg-color1:number
+  color-quantum:number<span class="Special"> &lt;- </span>divide color-range:number, len:number
+<span class="CommentedCode">#?   close-console #? 2</span>
+<span class="CommentedCode">#?   $print len:number, [, ], color-range:number, [, ], color-quantum:number, [ </span>
+<span class="CommentedCode">#? ] #? 2</span>
+<span class="CommentedCode">#? #?   $exit #? 3</span>
+  bg-color:number<span class="Special"> &lt;- </span>copy bg-color1:number
+  i:number<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal</span>
+  <span class="Delimiter">{</span>
+    done?:boolean<span class="Special"> &lt;- </span>greater-or-equal i:number, len:number
+    <span class="muControl">break-if</span> done?:boolean
+    c:character<span class="Special"> &lt;- </span>index s:address:array:character/deref, i:number
+    print-character x:address:screen, c:character, color:number, bg-color:number
+    i:number<span class="Special"> &lt;- </span>add i:number, <span class="Constant">1:literal</span>
+    bg-color:number<span class="Special"> &lt;- </span>add bg-color:number, color-quantum:number
+<span class="CommentedCode">#?     $print [=&gt; ], bg-color:number, [ </span>
+<span class="CommentedCode">#? ] #? 1</span>
+    <span class="muControl">loop</span>
+  <span class="Delimiter">}</span>
+<span class="CommentedCode">#?   $exit #? 1</span>
+  <span class="muControl">reply</span> x:address:screen/same-as-ingredient:0
+]
 </pre>
 </body>
 </html>
diff --git a/html/repl.mu.html b/html/repl.mu.html
deleted file mode 100644
index 4a0f2c21..00000000
--- a/html/repl.mu.html
+++ /dev/null
@@ -1,876 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-<meta http-equiv="content-type" content="text/html; charset=UTF-8">
-<title>Mu - repl.mu</title>
-<meta name="Generator" content="Vim/7.4">
-<meta name="plugin-version" content="vim7.4_v1">
-<meta name="syntax" content="none">
-<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
-<meta name="colorscheme" content="minimal">
-<style type="text/css">
-<!--
-pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
-body { font-family: monospace; color: #eeeeee; background-color: #080808; }
-* { font-size: 1.05em; }
-.muScenario { color: #00af00; }
-.Delimiter { color: #a04060; }
-.Comment { color: #9090ff; }
-.Constant { color: #00a0a0; }
-.Special { color: #ff6060; }
-.CommentedCode { color: #6c6c6c; }
-.muControl { color: #c0a020; }
-.muRecipe { color: #ff8700; }
--->
-</style>
-
-<script type='text/javascript'>
-<!--
-
--->
-</script>
-</head>
-<body>
-<pre id='vimCodeElement'>
-<span class="Comment"># interactive prompt for mu</span>
-
-<span class="muRecipe">recipe</span> main [
-  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
-  open-console
-  msg:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[ready! type in an instruction, then hit enter. ctrl-d exits.</span>
-<span class="Constant">]</span>
-  <span class="Constant">0:literal/real-screen</span><span class="Special"> &lt;- </span>print-string <span class="Constant">0:literal/real-screen</span>, msg:address:array:character, <span class="Constant">245:literal/grey</span>
-  <span class="Constant">0:literal/real-console</span>, <span class="Constant">0:literal/real-screen</span><span class="Special"> &lt;- </span>color-session <span class="Constant">0:literal/real-console</span>, <span class="Constant">0:literal/real-screen</span>
-  close-console
-]
-
-<span class="muRecipe">recipe</span> color-session [
-  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
-  console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-    inst:address:array:character, console:address, screen:address<span class="Special"> &lt;- </span>read-instruction console:address, screen:address
-    <span class="muControl">break-unless</span> inst:address:array:character
-    run-interactive inst:address:array:character
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="muControl">reply</span> console:address/same-as-ingredient:0, screen:address/same-as-ingredient:1
-]
-
-<span class="Comment"># basic console input; just text and enter</span>
-<span class="muScenario">scenario</span> read-instruction1 [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[x &lt;- copy y</span>
-<span class="Constant">]</span>
-  ]
-  run [
-    1:address:array:character<span class="Special"> &lt;- </span>read-instruction console:address, screen:address
-    2:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[=&gt; ]</span>
-    print-string screen:address, 2:address:array:character
-    print-string screen:address, 1:address:array:character
-  ]
-  screen-should-contain [
-   <span class="Constant"> .x &lt;- copy y                   .</span>
-   <span class="Constant"> .=&gt; x &lt;- copy y                .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .x    copy y                   .</span>
-   <span class="Constant"> .=&gt; x &lt;- copy y                .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [
-   <span class="Constant"> .  &lt;-                          .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="Comment"># Read characters as they're typed at the console, print them to the screen,</span>
-<span class="Comment"># accumulate them in a string, return the string at the end.</span>
-<span class="Comment"># Most of the complexity is for the printing to screen, to highlight strings</span>
-<span class="Comment"># and comments specially. Especially in the presence of backspacing.</span>
-<span class="muRecipe">recipe</span> read-instruction [
-  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">60:literal</span>
-  console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  result:address:buffer<span class="Special"> &lt;- </span>new-buffer <span class="Constant">10:literal</span>  <span class="Comment"># string to maybe add to</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[read-instruction]</span>
-  <span class="Comment"># start state machine by calling slurp-regular-characters, which will return</span>
-  <span class="Comment"># by calling the complete continuation</span>
-  complete:continuation<span class="Special"> &lt;- </span><span class="muControl">current-continuation</span>
-  <span class="Comment"># If result is not empty, we've run slurp-regular-characters below, called</span>
-  <span class="Comment"># the continuation and so bounced back here. We're done.</span>
-  len:number<span class="Special"> &lt;- </span>get result:address:buffer/deref, length:offset
-  completed?:boolean<span class="Special"> &lt;- </span>greater-than len:number, <span class="Constant">0:literal</span>
-  <span class="muControl">jump-if</span> completed?:boolean, <span class="Constant">+completed:label</span>
-  <span class="Comment"># Otherwise we're just getting started.</span>
-  result:address:buffer, console:address, screen:address<span class="Special"> &lt;- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation
-<span class="CommentedCode">#?   $print [aaa: ], result:address:buffer #? 1</span>
-<span class="CommentedCode">#?   move-cursor-down-on-display #? 1</span>
-  trace <span class="Constant">[error]</span>, <span class="Constant">[slurp-regular-characters should never return normally]</span>
-<span class="Constant">  +completed</span>
-  result2:address:array:character<span class="Special"> &lt;- </span>buffer-to-array result:address:buffer
-<span class="CommentedCode">#?   $print [bbb: ], result2:address:array:character #? 1</span>
-<span class="CommentedCode">#?   move-cursor-down-on-display #? 1</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[exiting read-instruction]</span>
-  <span class="muControl">reply</span> result2:address:array:character, console:address/same-as-ingredient:0, screen:address/same-as-ingredient:1
-]
-
-<span class="Comment"># read characters from the console, print them to the screen in *white*.</span>
-<span class="Comment"># Transition to other routines for comments and strings.</span>
-<span class="muRecipe">recipe</span> slurp-regular-characters [
-  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
-  result:address:buffer<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  complete:continuation<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters]</span>
-  characters-slurped:number<span class="Special"> &lt;- </span>copy <span class="Constant">0:literal</span>
-<span class="CommentedCode">#?   $run-depth #? 1</span>
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: next]</span>
-<span class="CommentedCode">#?     $print [a0 #? 1</span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?     move-cursor-down-on-display #? 1</span>
-    <span class="Comment"># read character</span>
-    c:character, console:address found?:boolean<span class="Special"> &lt;- </span>read-key console:address
-    <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span>
-<span class="CommentedCode">#?     print-character screen:address, c:character #? 1</span>
-<span class="CommentedCode">#?     move-cursor-down-on-display #? 1</span>
-    <span class="Comment"># quit?</span>
-    <span class="Delimiter">{</span>
-<span class="CommentedCode">#?       $print [aaa] #? 1</span>
-<span class="CommentedCode">#?       move-cursor-down-on-display #? 1</span>
-      ctrl-d?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span>
-      <span class="muControl">break-unless</span> ctrl-d?:boolean
-<span class="CommentedCode">#?       $print [ctrl-d] #? 1</span>
-<span class="CommentedCode">#?       move-cursor-down-on-display #? 1</span>
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: ctrl-d]</span>
-      <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      null?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">0:literal/null</span>
-      <span class="muControl">break-unless</span> null?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: null]</span>
-      <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-    <span class="Comment"># comment?</span>
-    <span class="Delimiter">{</span>
-      comment?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">35:literal/hash</span>
-      <span class="muControl">break-unless</span> comment?:boolean
-      print-character screen:address, c:character, <span class="Constant">4:literal/blue</span>
-      result:address:buffer<span class="Special"> &lt;- </span>buffer-append result:address:buffer, c:character
-      result:address:buffer, console:address, screen:address<span class="Special"> &lt;- </span>slurp-comment result:address:buffer, console:address, screen:address, complete:continuation
-      <span class="Comment"># continue appending to this instruction, whether comment ended or was backspaced out of</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># string</span>
-    <span class="Delimiter">{</span>
-      string?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">91:literal/open-bracket</span>
-      <span class="muControl">break-unless</span> string?:boolean
-      print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span>
-      result:address:buffer<span class="Special"> &lt;- </span>buffer-append result:address:buffer, c:character
-      result:address:buffer, _, console:address, screen:address<span class="Special"> &lt;- </span>slurp-string result:address:buffer, console:address, screen:address, complete:continuation
-      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># assignment</span>
-    <span class="Delimiter">{</span>
-      assign?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">60:literal/less-than</span>
-      <span class="muControl">break-unless</span> assign?:boolean
-      print-character screen:address, c:character, <span class="Constant">1:literal/red</span>
-      trace <span class="Constant">[app]</span>, <span class="Constant">[start of assignment: &lt;]</span>
-      result:address:buffer<span class="Special"> &lt;- </span>buffer-append result:address:buffer, c:character
-      result:address:buffer, console:address, screen:address<span class="Special"> &lt;- </span>slurp-assignment result:address:buffer, console:address, screen:address, complete:continuation
-      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># print</span>
-    print-character screen:address, c:character  <span class="Comment"># default color</span>
-    <span class="Comment"># append</span>
-    result:address:buffer<span class="Special"> &lt;- </span>buffer-append result:address:buffer, c:character
-<span class="CommentedCode">#?     $print [a1 #? 1</span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?     move-cursor-down-on-display #? 1</span>
-    <span class="Comment"># backspace? decrement and maybe return</span>
-    <span class="Delimiter">{</span>
-<span class="CommentedCode">#?       $print [a2 #? 1</span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?       move-cursor-down-on-display #? 1</span>
-      backspace?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">8:literal/backspace</span>
-      <span class="muControl">break-unless</span> backspace?:boolean
-<span class="CommentedCode">#?       $print [a3 #? 1</span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?       move-cursor-down-on-display #? 1</span>
-      characters-slurped:number<span class="Special"> &lt;- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span>
-      <span class="Delimiter">{</span>
-<span class="CommentedCode">#?         $print [a4 #? 1</span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?         move-cursor-down-on-display #? 1</span>
-        done?:boolean<span class="Special"> &lt;- </span>lesser-or-equal characters-slurped:number, <span class="Constant">-1:literal</span>
-        <span class="muControl">break-unless</span> done?:boolean
-<span class="CommentedCode">#?         $print [a5 #? 1</span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?         move-cursor-down-on-display #? 1</span>
-        trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: too many backspaces; returning]</span>
-<span class="CommentedCode">#?         $print [a6 #? 1</span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?         move-cursor-down-on-display #? 1</span>
-        <span class="muControl">reply</span> result:address:buffer, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-      <span class="Delimiter">}</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
-    <span class="Delimiter">}</span>
-<span class="CommentedCode">#?     $print [a9 #? 1</span>
-<span class="CommentedCode">#? ] #? 1</span>
-<span class="CommentedCode">#?     move-cursor-down-on-display #? 1</span>
-    <span class="Comment"># otherwise increment</span>
-    characters-slurped:number<span class="Special"> &lt;- </span>add characters-slurped:number, <span class="Constant">1:literal</span>
-    <span class="Comment"># done with this instruction?</span>
-    done?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">10:literal/newline</span>
-    <span class="muControl">break-if</span> done?:boolean
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Comment"># newline encountered; terminate all recursive calls</span>
-<span class="CommentedCode">#?   xx:address:array:character &lt;- new [completing!] #? 1</span>
-<span class="CommentedCode">#?   print-string screen:address, xx:address:array:character #? 1</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: newline encountered; unwinding stack]</span>
-  <span class="muControl">continue-from</span> complete:continuation
-]
-
-<span class="Comment"># read characters from console, print them to screen in the comment color.</span>
-<span class="Comment">#</span>
-<span class="Comment"># Simpler version of slurp-regular-characters; doesn't handle comments or</span>
-<span class="Comment"># strings. Tracks an extra count in case we backspace out of it</span>
-<span class="muRecipe">recipe</span> slurp-comment [
-  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
-  result:address:buffer<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  complete:continuation<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment]</span>
-  <span class="Comment"># use this to track when backspace should reset color</span>
-  characters-slurped:number<span class="Special"> &lt;- </span>copy <span class="Constant">1:literal</span>  <span class="Comment"># for the initial '#' that's already appended to result</span>
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    <span class="Comment"># read character</span>
-    c:character, console:address, found?:boolean<span class="Special"> &lt;- </span>read-key console:address
-    <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span>
-    <span class="Comment"># quit?</span>
-    <span class="Delimiter">{</span>
-      ctrl-d?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span>
-      <span class="muControl">break-unless</span> ctrl-d?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: ctrl-d]</span>
-      <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      null?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">0:literal/null</span>
-      <span class="muControl">break-unless</span> null?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: null]</span>
-      <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-    <span class="Comment"># print</span>
-    print-character screen:address, c:character, <span class="Constant">4:literal/blue</span>
-    <span class="Comment"># append</span>
-    result:address:buffer<span class="Special"> &lt;- </span>buffer-append result:address:buffer, c:character
-    <span class="Comment"># backspace? decrement</span>
-    <span class="Delimiter">{</span>
-      backspace?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">8:literal/backspace</span>
-      <span class="muControl">break-unless</span> backspace?:boolean
-      characters-slurped:number<span class="Special"> &lt;- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span>
-      <span class="Delimiter">{</span>
-        reset-color?:boolean<span class="Special"> &lt;- </span>lesser-or-equal characters-slurped:number, <span class="Constant">0:literal</span>
-        <span class="muControl">break-unless</span> reset-color?:boolean
-        trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: too many backspaces; returning]</span>
-        <span class="muControl">reply</span> result:address:buffer, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-      <span class="Delimiter">}</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># otherwise increment</span>
-    characters-slurped:number<span class="Special"> &lt;- </span>add characters-slurped:number, <span class="Constant">1:literal</span>
-    <span class="Comment"># done with this instruction?</span>
-    done?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">10:literal/newline</span>
-    <span class="muControl">break-if</span> done?:boolean
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: newline encountered; unwinding stack]</span>
-  <span class="muControl">continue-from</span> complete:continuation
-]
-
-<span class="Comment"># read characters from console, print them to screen in the string color and</span>
-<span class="Comment"># accumulate them into a buffer.</span>
-<span class="Comment">#</span>
-<span class="Comment"># Version of slurp-regular-characters that:</span>
-<span class="Comment">#   a) doesn't handle comments</span>
-<span class="Comment">#   b) handles nested strings using recursive calls to itself. Tracks an extra</span>
-<span class="Comment">#   count in case we backspace out of it.</span>
-<span class="muRecipe">recipe</span> slurp-string [
-  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
-  result:address:buffer<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  complete:continuation<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  nested-string?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string]</span>
-  <span class="Comment"># use this to track when backspace should reset color</span>
-  characters-slurped:number<span class="Special"> &lt;- </span>copy <span class="Constant">1:literal</span>  <span class="Comment"># for the initial '[' that's already appended to result</span>
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    <span class="Comment"># read character</span>
-    c:character, console:address, found?:boolean<span class="Special"> &lt;- </span>read-key console:address
-    <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span>
-    <span class="Comment"># quit?</span>
-    <span class="Delimiter">{</span>
-      ctrl-d?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span>
-      <span class="muControl">break-unless</span> ctrl-d?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: ctrl-d]</span>
-      <span class="muControl">reply</span> <span class="Constant">0:literal</span>, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      null?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">0:literal/null</span>
-      <span class="muControl">break-unless</span> null?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: null]</span>
-      <span class="muControl">reply</span> <span class="Constant">0:literal</span>, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-    <span class="Comment"># string</span>
-    <span class="Delimiter">{</span>
-      string?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">91:literal/open-bracket</span>
-      <span class="muControl">break-unless</span> string?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: open-bracket encountered; recursing]</span>
-      print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span>
-      result:address:buffer<span class="Special"> &lt;- </span>buffer-append result:address:buffer, c:character
-      <span class="Comment"># make a recursive call to handle nested strings</span>
-      result:address:buffer, tmp:number, console:address, screen:address<span class="Special"> &lt;- </span>slurp-string result:address:buffer, console:address, screen:address, complete:continuation, <span class="Constant">1:literal/nested?</span>
-      <span class="Comment"># but if we backspace over a completed nested string, handle it in the caller</span>
-      characters-slurped:number<span class="Special"> &lt;- </span>add characters-slurped:number, tmp:number, <span class="Constant">1:literal</span>  <span class="Comment"># for the leading '['</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># print</span>
-    print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span>
-    <span class="Comment"># append</span>
-    result:address:buffer<span class="Special"> &lt;- </span>buffer-append result:address:buffer, c:character
-    <span class="Comment"># backspace? decrement</span>
-    <span class="Delimiter">{</span>
-      backspace?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">8:literal/backspace</span>
-      <span class="muControl">break-unless</span> backspace?:boolean
-      characters-slurped:number<span class="Special"> &lt;- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span>
-      <span class="Delimiter">{</span>
-        reset-color?:boolean<span class="Special"> &lt;- </span>lesser-or-equal characters-slurped:number, <span class="Constant">0:literal</span>
-        <span class="muControl">break-unless</span> reset-color?:boolean
-        trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: too many backspaces; returning]</span>
-        <span class="muControl">reply</span> result:address:buffer/same-as-ingredient:0, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-      <span class="Delimiter">}</span>
-      <span class="muControl">loop</span> <span class="Constant">+next-character:label</span>
-    <span class="Delimiter">}</span>
-    <span class="Comment"># otherwise increment</span>
-    characters-slurped:number<span class="Special"> &lt;- </span>add characters-slurped:number, <span class="Constant">1:literal</span>
-    <span class="Comment"># done with this instruction?</span>
-    done?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">93:literal/close-bracket</span>
-    <span class="muControl">break-if</span> done?:boolean
-    <span class="muControl">loop</span>
-  <span class="Delimiter">}</span>
-  <span class="Delimiter">{</span>
-    <span class="muControl">break-unless</span> nested-string?:boolean
-    <span class="Comment"># nested string? return like a normal recipe</span>
-    <span class="muControl">reply</span> result:address:buffer, characters-slurped:number, console:address, screen:address
-  <span class="Delimiter">}</span>
-  <span class="Comment"># top-level string call? recurse</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: close-bracket encountered; recursing to regular characters]</span>
-  result:address:buffer, console:address, screen:address<span class="Special"> &lt;- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation
-  <span class="Comment"># backspaced back into this string</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: backspaced back into string; restarting]</span>
-  <span class="muControl">jump</span> <span class="Constant">+next-character:label</span>
-]
-
-<span class="muRecipe">recipe</span> slurp-assignment [
-  <span class="Constant">default-space</span>:address:array:location<span class="Special"> &lt;- </span>new location:type, <span class="Constant">30:literal</span>
-  result:address:buffer<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  complete:continuation<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span>
-  <span class="Delimiter">{</span>
-<span class="Constant">    +next-character</span>
-    <span class="Comment"># read character</span>
-    c:character, console:address, found?:boolean<span class="Special"> &lt;- </span>read-key console:address
-    <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span>
-    <span class="Comment"># quit?</span>
-    <span class="Delimiter">{</span>
-      ctrl-d?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span>
-      <span class="muControl">break-unless</span> ctrl-d?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: ctrl-d]</span>
-      <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-    <span class="Delimiter">{</span>
-      null?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">0:literal/null</span>
-      <span class="muControl">break-unless</span> null?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: null]</span>
-      <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-    <span class="Comment"># print</span>
-    print-character screen:address, c:character, <span class="Constant">1:literal/red</span>
-    trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: saved one character]</span>
-    <span class="Comment"># append</span>
-    result:address:buffer<span class="Special"> &lt;- </span>buffer-append result:address:buffer, c:character
-    <span class="Comment"># backspace? return</span>
-    <span class="Delimiter">{</span>
-      backspace?:boolean<span class="Special"> &lt;- </span>equal c:character, <span class="Constant">8:literal/backspace</span>
-      <span class="muControl">break-unless</span> backspace?:boolean
-      trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: backspace; returning]</span>
-      <span class="muControl">reply</span> result:address:buffer/same-as-ingredient:0, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2
-    <span class="Delimiter">}</span>
-  <span class="Delimiter">}</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: done, recursing to regular characters]</span>
-  result:address:buffer, console:address, screen:address<span class="Special"> &lt;- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation
-  <span class="Comment"># backspaced back into this string</span>
-  trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: backspaced back into assignment; restarting]</span>
-  <span class="muControl">jump</span> <span class="Constant">+next-character:label</span>
-]
-
-<span class="muScenario">scenario</span> read-instruction-color-comment [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[# comment]</span>
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [
-   <span class="Constant"> .# comment                     .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[#a««z]</span>
-  ]
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .z                             .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace2 [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[#ab«««z]</span>
-  ]
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .z                             .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace3 [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[#a«z]</span>
-  ]
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [
-   <span class="Constant"> .#z                            .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-stop-after-comment [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  <span class="Comment"># console contains comment and then a second line</span>
-  assume-console [
-    type <span class="Constant">[#abc</span>
-<span class="Constant">3]</span>
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  <span class="Comment"># check that read-instruction reads just the comment</span>
-  screen-should-contain [
-   <span class="Constant"> .#abc                          .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-color-string [
-<span class="CommentedCode">#?   $start-tracing #? 1</span>
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[abc [string]</span>]
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .abc [string]                  .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .    [string]                  .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .abc                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-color-string-multiline [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[abc [line1</span>
-<span class="Constant">line2]</span>]
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .abc [line1                    .</span>
-   <span class="Constant"> .line2]                        .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .    [line1                    .</span>
-   <span class="Constant"> .line2]                        .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .abc                           .</span>
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-color-string-and-comment [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[abc [string]</span>  <span class="Comment"># comment]</span>
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .abc [string]  # comment       .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [
-   <span class="Constant"> .              # comment       .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .    [string]                  .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .abc                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-ignore-comment-inside-string [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[abc [string # not a comment]</span>]
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .abc [string # not a comment]  .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .    [string # not a comment]  .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .abc                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-ignore-string-inside-comment [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[abc # comment [not a string]</span>]
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .abc # comment [not a string]  .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .abc                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [
-   <span class="Constant"> .    # comment [not a string]  .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-color-string-inside-string [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[abc [string [inner string]</span>]]
-  ]
-  run [
-<span class="CommentedCode">#?     $start-tracing #? 1</span>
-    read-instruction console:address, screen:address
-<span class="CommentedCode">#?     $stop-tracing #? 1</span>
-<span class="CommentedCode">#?     $browse-trace #? 1</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .abc [string [inner string]]   .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .    [string [inner string]]   .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .abc                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-cancel-string-on-backspace [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[(a««z]</span>  <span class="Comment"># '(' is '[' and '«' is backspace</span>
-  ]
-  open-bracket:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">91:literal/open-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">40:literal/open-paren</span>, open-bracket:event
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-  run [
-<span class="CommentedCode">#?     d:address:array:event &lt;- get console:address/deref, data:offset #? 1</span>
-<span class="CommentedCode">#?     $print [a: ], d:address:array:event #? 1</span>
-<span class="CommentedCode">#?     x:number &lt;- length d:address:array:event/deref #? 1</span>
-<span class="CommentedCode">#?     $print [b: ], x:number #? 1</span>
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .z                             .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-cancel-string-inside-string-on-backspace [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[(a[b]</span>«««b)]  <span class="Comment"># '(' is '[' and '«' is backspace</span>
-  ]
-  open-bracket:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">91:literal/open-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">40:literal/open-paren</span>, open-bracket:event
-  close-bracket:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">93:literal/close-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">41:literal/close-paren</span>, close-bracket:event
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .[ab]                          .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-backspace-back-into-string [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[[a]</span>«b]  <span class="Comment"># '«' is backspace</span>
-  ]
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .\\\[ab                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-<span class="CommentedCode">#?   $print [aaa] #? 1</span>
-  screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [
-   <span class="Constant"> .\\\[ab                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .                              .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  <span class="Comment"># todo: trace sequence of events</span>
-  <span class="Comment">#   slurp-regular-characters: [</span>
-  <span class="Comment">#   slurp-regular-characters/slurp-string: a</span>
-  <span class="Comment">#   slurp-regular-characters/slurp-string: ]</span>
-  <span class="Comment">#   slurp-regular-characters/slurp-string/slurp-regular-characters: backspace</span>
-  <span class="Comment">#   slurp-regular-characters/slurp-string: b</span>
-]
-
-<span class="muScenario">scenario</span> read-instruction-highlight-start-of-assignment [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[a &lt;]</span>
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .a &lt;                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [
-   <span class="Constant"> .  &lt;                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .a                             .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-highlight-assignment [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[a &lt;- b]</span>
-  ]
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .a &lt;- b                        .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [
-   <span class="Constant"> .  &lt;-                          .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .a    b                        .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-backspace-over-assignment [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[a &lt;-«]</span>  <span class="Comment"># '«' is backspace</span>
-  ]
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .a &lt;                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [
-   <span class="Constant"> .  &lt;                           .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .a                             .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-assignment-continues-after-backspace [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[a &lt;-«-]</span>  <span class="Comment"># '«' is backspace</span>
-  ]
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-<span class="CommentedCode">#?   $print [aaa] #? 1</span>
-  run [
-    read-instruction console:address, screen:address
-  ]
-  screen-should-contain [
-   <span class="Constant"> .a &lt;-                          .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [
-   <span class="Constant"> .  &lt;-                          .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .a                             .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-
-<span class="muScenario">scenario</span> read-instruction-assignment-continues-after-backspace2 [
-  assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span>
-  assume-console [
-    type <span class="Constant">[a &lt;- ««-]</span>  <span class="Comment"># '«' is backspace</span>
-  ]
-  backspace:event<span class="Special"> &lt;- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span>
-  replace-in-console <span class="Constant">171:literal/«</span>, backspace:event
-  run [
-    read-instruction console:address, screen:address
-<span class="CommentedCode">#?     $browse-trace #? 1</span>
-  ]
-  screen-should-contain [
-   <span class="Constant"> .a &lt;-                          .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [
-   <span class="Constant"> .  &lt;-                          .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-  screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [
-   <span class="Constant"> .a                             .</span>
-   <span class="Constant"> .                              .</span>
-  ]
-]
-</pre>
-</body>
-</html>
-<!-- vim: set foldmethod=manual : -->
diff --git a/index.html b/index.html
index 95139e93..9926243c 100644
--- a/index.html
+++ b/index.html
@@ -89,14 +89,16 @@ akin to records, structs or classes.
 layers of indirection to mu data.
 <br/><a href='html/032array.cc.html'>032array.cc</a>: all mu data structures
 are bounds-checked.
-<br/><a href='html/034exclusive_container.cc.html'>034exclusive_container.cc</a>: tagged unions or sum types.
-<br/><a href='html/035call.cc.html'>035call.cc</a>: calls to recipes look
+<br/><a href='html/033exclusive_container.cc.html'>033exclusive_container.cc</a>: tagged unions or sum types.
+<br/><a href='html/034call.cc.html'>034call.cc</a>: calls to recipes look
 just like primitive operations.
-<br/><a href='html/036call_ingredient.cc.html'>036call_ingredient.cc</a>: how
+<br/><a href='html/035call_ingredient.cc.html'>035call_ingredient.cc</a>: how
 recipes pass arguments or 'ingredients' without introducing any syntax and
 breaking the metaphor of recipes as lists of instructions.
-<br/><a href='html/037call_reply.cc.html'>037call_reply.cc</a>: recipes can
+<br/><a href='html/036call_reply.cc.html'>036call_reply.cc</a>: recipes can
 return arbitrary numbers of values to their callers.
+<br/><a href='html/037recipe.cc.html'>037recipe.cc</a>: passing recipes around
+as first-class values in higher-order functions.
 <br/><a href='html/038scheduler.cc.html'>038scheduler.cc</a>: running multiple
 recipes concurrently using <em>routines</em> that might execute in interleaved
 fashion.