   deductReasonForFailure: ->
     reasons = {}
     reasons.internetDown      = ["bongo", "broker", "external"]
-    reasons.kodingDown        = ["bongo", "broker"]
-    reasons.kitesDown         = ["sharedHosting", "webterm"]
     reasons.brokerDown        = ["broker"]
+    reasons.kitesDown         = ["os"]
     reasons.bongoDown         = ["bongo"]
-    reasons.webtermDown       = ["webterm"]
 
     for reason, items of reasons
       intersection = _.intersection items, @failedPings

    notifications =
      internetUp : "All systems go!"
      internetDown: "Your internet is down."
      kodingDown: "Koding is down."
      kitesDown: "Kites are down."
      sharedHostingDown: "SharedHosting is down."
      webtermDown: "Webterm is down."
      bongoDown: "Bongo is down"
      brokerDown: "Broker is Down."
      undefined: "Sorry, something went wrong."

    msg = notifications[reason] or notifications["undefined"]


  KD.troubleshoot = (showNotifications=true)->
    monitorItems = KD.getSingleton("monitorItems").items

    if monitorItems.length == 1
      log "no services connected; possible auth/social worker down"
      return

    monitor = new MonitorStatus monitorItems
    monitor.showNotifications = showNotifications
    monitor.run()

  window.jsonp =-> KD.externalPong()

  brokerInterval       = null
  failureCallback      = null
  lastPong             = null
  timesTroubleshootRan = 0

  # use broker ping to determine internet connection
  # TODO: refactor this ugliness
  pingBrokerOnInterval = ->
    brokerInterval = setInterval ->
      clearTimeout failureCallback
