         (assert (false? end?)) ;; have to be at a key to descend
         (assert (< key-ix (- (alength key-ix->intersection) 1)))
         (set! key-ix (+ key-ix 1))
-        (.maintain (aget key-ix->intersection key-ix))
         (let [iterator->present? (aget key-ix->iterator->present? key-ix)]
           (dotimes [i (alength iterator->present?)]
             (if (aget iterator->present? i)
               (.down (aget iterators i))
               (.mark (aget iterators i))))
+          (.maintain (aget key-ix->intersection key-ix))
           (.maintain this)))
   (up [this]
       (assert (> key-ix 0))
       (set! key-ix (- key-ix 1))
-      (.maintain (aget key-ix->intersection key-ix))
       (let [iterator->present? (aget key-ix->iterator->present? key-ix)]
         (dotimes [i (alength iterator->present?)]
           (if (aget iterator->present? i)
             (.up (aget iterators i))
             (.reset (aget iterators i))))
+        (.maintain (aget key-ix->intersection key-ix))
         (.maintain this))))
 
 (defn join [iterators num-vars iterator->vars]

      (assert (> moving-key-ix 0))
      (when (false? end?)
        (.seek iterator pinned-key))
      (aset seek-key moving-key-ix greatest)
      (set! moving-key-ix (- moving-key-ix 1))
      (when (>= moving-key-ix 0)
        (aset pinned-key moving-key-ix greatest))

  (dc/quick-check 10000 (trie-tree-prop 2))
  (dc/quick-check 10000 (trie-tree-prop 3))
  (dc/quick-check 10000 (self-join-prop 1))
  (dc/quick-check 10000 (self-join-prop 2))
  (dc/quick-check 10000 (self-join-prop 3))


  (defn f []
