diff --git a/fggl/app.cpp b/fggl/app.cpp
index 0d6ec0d79f6b7ace899f9748dd6da5662a5a4a5b..7d1c223d5159b8c14b7a47e05618fccf2c3195fb 100644
--- a/fggl/app.cpp
+++ b/fggl/app.cpp
@@ -46,7 +46,10 @@ namespace fggl {
         while ( m_running ) {
 			// trigger a state change if expected
 			if ( m_expectedScene != m_states.activeID() ) {
-				m_states.change(m_expectedScene);
+				auto result = m_states.change(m_expectedScene);
+				if ( !result ) {
+					m_expectedScene = m_states.activeID();
+				}
 			}
 
             auto& state = m_states.active();
diff --git a/fggl/scenes/game.cpp b/fggl/scenes/game.cpp
index 607ef4e80d8d20c18df848d413a9875fb1da2a25..2dea4c4b8ac5239260d0156a4e3b005a489b2b1d 100644
--- a/fggl/scenes/game.cpp
+++ b/fggl/scenes/game.cpp
@@ -43,7 +43,7 @@ namespace fggl::scenes {
 	}
 
 	void Game::update() {
-		assert( m_world );
+		assert( m_world && "called game update, but there was no world - was activate called?" );
 
 		if ( m_input != nullptr ) {
 			bool escapePressed = m_input->keyboard.pressed(glfwGetKeyScancode(GLFW_KEY_ESCAPE));
diff --git a/include/fggl/util/states.hpp b/include/fggl/util/states.hpp
index 6edee1ffe56374f3ecf17206c9ec998ff4e55db3..fa2c713047e4b38e53ff43107691bceb042a8846 100644
--- a/include/fggl/util/states.hpp
+++ b/include/fggl/util/states.hpp
@@ -48,12 +48,16 @@ namespace fggl::util {
 				return (T *) (m_states[name].get());
 			}
 
-			void change(const Identifer &name) {
-				assertm(m_states.find(name) != m_states.end(), "state does not exist");
+			bool change(const Identifer &name) {
+				if ( m_states.find(name) == m_states.end() )  {
+					debug::error("attempted to change to non-existent state {}, ignoring you.", name);
+					return false;
+				}
 
 				active().deactivate();
 				m_active = name;
 				active().activate();
+				return true;
 			}
 
 			StateType &active() const {