 ;; Stub to wait for left to be evaluated
 (defn- make-left-stub [left-stub right-stub-fn]
   (let [mid (atom nil) 
-        ret (traits/reify-traits [simple-watched]
+        ret (traits/reify-traits [simple-watched cache-trait summaries/simple-node]
               summaries/Summarizable
               (summarize [s]
                 (summary/re-source 


(comment (defn tree-summary [sp] (summaries/summary (tree-summarizer sp))))

(defn persistent-watcher [sp w]
  (fn p-watch [watched child]
    (add-watcher! (tree-summarizer child) p-watch)
    (w watched child)))

              (summarize [s] (summary/+ (summaries/summary left-sp) (summaries/summary right-stub) s)))]
    (add-watcher! right-stub (fn [_ o] (add-output! ret (make-right-subproblem ret left-sp o))))
    (summaries/connect! ret left-sp false)
    (summaries/connect! ret right-stub false)    
    ret))


;; TODO: should hold refined outputs until right is evaluated.
;; Basic idea: this is only thing watching sp1's output.
(defn- make-middle-stub [left-sp right-stub-fn]
  (let [ret (traits/reify-traits [simple-watched cache-trait summaries/simple-node]
              summaries/Summarizable
              (summarize [s]
                (summary/or-combine
