     (util/assert-is (and (not (identical? s c)) (get-output-set c)))
     (.add child-list c)
     (summaries/summary-changed-local! s)
-    (when (underived? s)
+    (when (canonical? s)
       (summaries/connect! (sp-ts s) (sp-ts c))
       (when (get-output-set s) (summaries/summary-changed! (sp-ts s)))) ;; TODO: remove this overhead from atomic.   
     (when (get-output-set s) (doseq [w (doall (seq child-watchers))] (swap! *out-count* inc) (w s c))))

    (assert (nil? @out-set-atom))
    (reset! out-set-atom o)
    (summaries/summary-changed-local! s)
    (when (underived? s) 
      (summaries/summary-changed! (sp-ts s)))    
    (doseq [w output-watchers] (w s))
    (doseq [c (get-children s), w (doall (seq child-watchers))] (w s c)))


(defn- add-sp-child! [sp child-sp up?]
;  (println sp child-sp) (Thread/sleep 100)
  (when (canonical? sp)
    (summaries/connect-subsumed! (sp-ts sp) (sp-ts child-sp))
    ;; TODO: propagate!
    )
