       end
     end
   end
-  defp handle_action(:fail, step),
-    do: Steppable.fail(step)
+
+  docp """
+  If the request is to fail/abort an step, we'll call `Steppable.fail/1`,
+  and then handle the failure with `fail_step/1`
+  """
+  defp handle_action(:fail, step) do
+    with {:ok, step, events} <- Steppable.fail(step) do
+      Event.emit(events)
+
+      hespawn fn ->
+        fail_step(step)
+      end
+    end
+  end
+
+  docp """
+  Received action `:noop`, so we do nothing
+  """
   defp handle_action(:noop, _),
     do: :noop
 
   @spec update_next(Step.t(struct), Step.step_name) ::
     term
+  docp """
+  Updates the database, so that the player gets moved to the next step.
+
+  This is where we call next step's `Steppable.setup`, as well as the
+  `StepProceededEvent` is sent to the client
+
+  Emits: StepProceededEvent.t
+  """
   defp update_next(prev_step = %{entity_id: entity_id}, next_step_name) do
     next_step = Step.fetch(next_step_name, entity_id, %{})
 

defmodule Helix.Story.Event.Handler.Story do

  import HELF.Flow
  import HELL.MacroHelpers


  @spec handle_action(:complete | :fail | :noop, Step.t(struct)) ::
    term
  docp """
  When a step requests to be completed, we'll call `Steppable.complete/1`,
  get the next step's name and then update on the database using `update_next/2`
  """
  defp handle_action(:complete, step) do
    with {:ok, step, events} <- Steppable.complete(step) do
      Event.emit(events)
