     #@check_stage key
     if @sticky[key]
       @sticky[key]
+    else if @cycle[key]
+      throw new CycleError
     else if @stage < @last_stage
       value = @build @cache[key], opts.as
       @sticky[key] = value if opts.sticky
       value
-    else if @cycle[key]
-      @cycle[key] = false
-      throw new CycleError
     else
       @deps.push key
       @blank()

      throw 'no_runner'
    @cache = {}
    @saved_keys = {}
    @sequence = []
    @last_stage = 0
    num_workers++

  caught: (err) ->
    if err == 'resolve'
      @resolve()
    else if err.is_cycle
      @cycle_failure()
    else
      @error err

  # Let the dispatcher know that we failed to handle a cycle. Eventually the dispatcher
  # may resolve that conflict and re-run us anyway.
  cycle_failure: ->
    # TODO

  # Mark that a fatal exception occurred
  error: (err) ->
