diff --git a/extra/builder/builder.factor b/extra/builder/builder.factor
index bb83fcf3f8..1783a36928 100644
--- a/extra/builder/builder.factor
+++ b/extra/builder/builder.factor
@@ -133,36 +133,154 @@ VAR: stamp
   
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-SYMBOL: build-status
+! SYMBOL: build-status
 
-: build ( -- )
+! : build ( -- )
+
+!   enter-build-dir
+  
+!   git-clone "git clone error" run-or-notify
+
+!   "factor" cd
+
+!   record-git-id
+
+!   make-clean "make clean error" run-or-notify
+
+!   make-vm "vm compile error" "../compile-log" run-or-send-file
+
+!   retrieve-boot-image
+
+!   bootstrap "bootstrap error" "../boot-log" run-or-send-file
+
+!   builder-test "builder.test fatal error" run-or-notify
+  
+!   "../load-everything-log" exists?
+!   [ "load-everything" "../load-everything-log" email-file ]
+!   when
+
+!   "../failing-tests" exists?
+!   [ "failing tests" "../failing-tests" email-file ]
+!   when ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+SYMBOL: report
+
+: (build) ( -- )
 
   enter-build-dir
-  
-  git-clone "git clone error" run-or-notify
+
+  "report" <file-writer> report set
+
+  report get [ "Build machine:   " write host-name write nl ] with-stream*
+
+  report get [ "Build directory: " write cwd write nl ] with-stream*
+
+  [ git-clone try-process ]
+  [
+    report get
+     [ "Builder fatal error: git clone failed" write nl ]
+    with-stream*
+    throw
+  ]
+  recover
 
   "factor" cd
 
   record-git-id
 
-  make-clean "make clean error" run-or-notify
+  make-clean run-process drop
 
-  make-vm "vm compile error" "../compile-log" run-or-send-file
+  [ make-vm try-process ]
+  [
+    report get
+    [
+      "Builder fatal error: vm compile error" write nl
+      "../compile-log" <file-reader> contents write
+    ]
+    with-stream*
+    throw
+  ]
+  recover
 
-  retrieve-boot-image
+  [ my-arch download-image ]
+  [
+    report get
+      [ "Builder fatal error: image download" write nl ]
+    with-stream*
+    throw
+  ]
+  recover
 
-  bootstrap "bootstrap error" "../boot-log" run-or-send-file
+  [ bootstrap try-process ]
+  [
+    report get
+      [
+        "Bootstrap error" write nl
+        "../boot-log" <file-reader> contents write
+      ]
+    with-stream*
+    throw
+  ]
+  recover
 
-  builder-test "builder.test fatal error" run-or-notify
-  
-  "../load-everything-log" exists?
-  [ "load-everything" "../load-everything-log" email-file ]
+  [ builder-test try-process ]
+  [
+    report get
+      [
+        "Builder test error" write nl
+        "../load-everything-log" exists?
+          [ "../load-everything-log" <file-reader> contents write nl ]
+        when
+        "../test-all-log" exists?
+          [ "../test-all-log" <file-reader> contents write nl ]
+        when
+      ]
+    with-stream*
+    throw
+  ]
+  recover
+
+  report get
+    [
+      "Bootstrap time: " write
+      "../bootstrap-time" <file-reader> contents write nl
+    ]
+  with-stream*
+
+  "../load-everything-vocabs" exists?
+    [
+      report get
+        [
+          "Did not pass load-everything: " write nl
+          "../load-everything-vocabs" <file-reader> contents write nl
+        ]
+      with-stream*
+    ]
   when
 
-  "../failing-tests" exists?
-  [ "failing tests" "../failing-tests" email-file ]
+  "../test-all-vocabs" exists?
+    [
+      report get
+        [
+          "Did not pass test-all: " write nl
+          "../test-all-vocabs" <file-reader> contents write nl
+        ]
+      with-stream*
+    ]
   when ;
 
+: send-report ( -- )
+  report get dispose
+  "report" "../report" email-file ;
+
+: build ( -- )
+  [ (build) ]
+    [ drop ]
+  recover
+  send-report ;
+
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 : minutes>ms ( min -- ms ) 60 * 1000 * ;
diff --git a/extra/builder/test/test.factor b/extra/builder/test/test.factor
index b77199c7c5..159fe02ad6 100644
--- a/extra/builder/test/test.factor
+++ b/extra/builder/test/test.factor
@@ -7,22 +7,54 @@ USING: kernel sequences assocs builder continuations vocabs vocabs.loader
 
 IN: builder.test
 
+: record-bootstrap-time ( -- )
+  "../bootstrap-time" <file-writer>
+    [ bootstrap-time get . ]
+  with-stream ;
+
 : try-everything* ( -- vocabs ) try-everything [ first vocab-link-name ] map ;
 
+! : do-load ( -- )
+!   [ try-everything* ] "../load-everything-time" log-runtime
+!   dup empty?
+!     [ drop ]
+!     [ "../load-everything-log" log-object ]
+!   if ;
+
 : do-load ( -- )
-  [ try-everything* ] "../load-everything-time" log-runtime
+  [
+    "../load-everything-log" <file-writer>
+      [ try-everything* ]
+    with-stream
+  ] "../load-everything-time" log-runtime
   dup empty?
     [ drop ]
-    [ "../load-everything-log" log-object ]
-  if ;
+    [ "../load-everything-vocabs" log-object ]
+  if
+  "../load-everything-log" delete-file ;
+
+! : do-tests ( -- )
+!   run-all-tests keys
+!   dup empty?
+!   [ drop ]
+!   [ "../failing-tests" log-object ]
+!   if ;
 
 : do-tests ( -- )
-  run-all-tests keys
+  [
+    "../test-all-log" <file-writer>
+      [ run-all-tests keys ]
+    with-stream
+  ] "../test-all-time" log-runtime
   dup empty?
-  [ drop ]
-  [ "../failing-tests" log-object ]
-  if ;
+    [ drop ]
+    [ "../test-all-vocabs" log-object ]
+  if
+  "../test-all-log" delete-file ;
 
-: do-all ( -- ) do-load do-tests ;
+: do-all ( -- )
+  record-bootstrap-time
+  do-load
+  do-tests ;
 
 MAIN: do-all
\ No newline at end of file