anchor.diff:  Some stages may fail due to transient issues, in which case they are retried (for example, Handshake may fail due to a broken connection, but a retry may succeed).
   If a retryable stage runs out of attempts, then execution is aborted, which may skip following stages as appropriate.
   
  -==== The `run` script
  +=== The `run` script
   
   Every job consists of a `bash` script that the agent composes, forks, and monitors.
   
  -This separation allows treating every job the same way, wether they are Spark or Notebook kernels, or anything else.
  +This separation allows treating every job the same way, whether they are Spark or Notebook kernels, or anything else.
   
   The structure of a `run` script is as follows:
   
  
positive.code: 
  All jobs launched by the server (as a result of an API job submission) execute in non-interactive mode.
  
  ==== Persistence
  
  Out of the box, Genie supports MySQL and Postgress persistence via JPA and Hibernate.
  
  H2 in-memory database is also supported for integration tests.
  
  Other kinds of persistence can be plugged in either via JPA or by re-implementing the persistence interface with a different technology.
  
  ==== Plug-in Selectors
  
  Genie provides a mechanism to load and invoke Groovy scripts, and even reload the script if it changes at runtime.
  
  This hooks are provided in order to plug-in custom logic:
  
  ====== Command selector script
  
  A job command criteria may be broad enough to match multiple commands (for example, a Spark job may match 10 different Spark commands, one for each Spark version).
  
  
negative.code:  * Mark jobs whose agent is AWOL as failed
   * Collect and publish user metrics about running jobs
  
  === Execution stages
  
  Every job is executed by a dedicated agent.
  This is true for both API-submitted jobs and CLI-initiated jobs.
  