anchor.diff:          if not b || (is_stale intf impl intf_t impl_t) then
             //reverse st from "first dependency first order" to "last dependency first order"
             let env = pop_tc_and_stack env' (List.rev_append st []) ts in
  -          tc_deps m good_stack env depnames good_ts
  +          tc_deps good_stack env depnames good_ts
           else
             let stack_elt, st' = List.hd st, List.tl st in
             iterate depnames' st' env' ts' (stack_elt::good_stack) (ts_elt::good_ts)
  -      | []           -> (* st should also be empty here *) tc_deps m good_stack env' depnames good_ts
  +      | []           -> (* st should also be empty here *) tc_deps good_stack env' depnames good_ts
     in
   
     (* Well, the file list hasn't changed, so our (single) file is still there. *)
  
positive.code:         let impl_t = get_file_last_modification_time impl in
          intf_t, impl_t
        in
        tc_deps m stack env remaining ((intf, impl, intf_t, impl_t)::ts)
  
  
  (*
   * check if some dependencies have been modified, added, or deleted
  
negative.code:    * during recursive calls, the good_stack and good_ts grow "last dependency first" order.
     * returns the new stack, environment, and timestamps
     *)
    let rec iterate (depnames:list<string>) (st:deps_stack_t) (env':env_t)
                    (ts:m_timestamps) (good_stack:deps_stack_t) (good_ts:m_timestamps)
            : (env_t * (list<env_t> * m_timestamps)) =
      //invariant length good_stack = length good_ts, and same for stack and ts
  
      let match_dep (depnames:list<string>) (intf:option<string>) (impl:string) : (bool * list<string>) =
  