diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index 861dd0b22..cc9a6dd12 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -78,6 +78,10 @@ module.exports = class LevelLoader extends CocoClass
       @listenToOnce @opponentSession, 'sync', @loadDependenciesForSession
 
   loadDependenciesForSession: (session) ->
+    return if @levelID is 'sky-span'  # TODO
+    # TODO: I think this runs afoul of https://github.com/codecombat/codecombat/issues/1108
+    # TODO: this shouldn't happen when it's not a hero level, but we don't have level loaded yet,
+    # and the sessions are being created with default hero config regardless of whether it's a hero level.
     if heroConfig = session.get('heroConfig')
       url = "/db/thang.type/#{heroConfig.thangType}/version?project=name,components,original"
       @worldNecessities.push @maybeLoadURL(url, ThangType, 'thang')
diff --git a/app/lib/surface/CocoSprite.coffee b/app/lib/surface/CocoSprite.coffee
index ff03d2388..a3dbc4130 100644
--- a/app/lib/surface/CocoSprite.coffee
+++ b/app/lib/surface/CocoSprite.coffee
@@ -321,6 +321,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
     @lastPos = p1.copy?() or _.clone(p1)
     @hasMoved = true
     if @thangType.get('name') is 'Flag' and not @notOfThisWorld
+      # Let the pending flags know we're here (but not this call stack, they need to delete themselves, and we may be iterating sprites).
       _.defer => Backbone.Mediator.publish 'surface:flag-appeared', sprite: @
 
   updateBaseScale: ->
@@ -521,7 +522,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
     @letterboxOn = e.on
 
   onMouseEvent: (e, ourEventName) ->
-    return if @letterboxOn
+    return if @letterboxOn or not @imageObject
     p = @imageObject
     p = p.parent while p.parent
     newEvent = sprite: @, thang: @thang, originalEvent: e, canvas:p.canvas
diff --git a/app/views/play/level/LevelFlagsView.coffee b/app/views/play/level/LevelFlagsView.coffee
index b06cc3487..a98b6a09f 100644
--- a/app/views/play/level/LevelFlagsView.coffee
+++ b/app/views/play/level/LevelFlagsView.coffee
@@ -38,6 +38,7 @@ module.exports = class LevelFlagsView extends CocoView
 
   onRealTimePlaybackEnded: (e) ->
     @realTime = false
+    @onFlagSelected color: null
     @$el.hide()
 
   onFlagSelected: (e) ->
diff --git a/app/views/play/level/tome/TomeView.coffee b/app/views/play/level/tome/TomeView.coffee
index 92e634dd9..1d340dfee 100644
--- a/app/views/play/level/tome/TomeView.coffee
+++ b/app/views/play/level/tome/TomeView.coffee
@@ -209,6 +209,7 @@ module.exports = class TomeView extends CocoView
 
   spellFor: (thang, spellName) ->
     return null unless thang?.isProgrammable
+    return unless @thangSpells[thang.id]  # Probably in streaming mode, where we don't update until it's done.
     selectedThangSpells = (@spells[spellKey] for spellKey in @thangSpells[thang.id])
     if spellName
       spell = _.find selectedThangSpells, {name: spellName}