code: func (r *runner) RestartRun(qr QueuedRun) bool {
  	if !atomic.CompareAndSwapUint32(r.state, runnerIdle, runnerWorking) {
  		// already working
  		return false
  	}
  	// create a QueuedRun because we cant stm.CreateNextRun
  	runLogger := r.logger.With(zap.String("run_id", qr.RunID.String()), zap.Int64("now", qr.Now))
  	r.wg.Add(1)
  	r.ts.runningMu.Lock()
  	rCtx, ok := r.ts.running[qr.RunID]
  	if !ok {
  		ctx, cancel := context.WithCancel(context.TODO())
  		rCtx = runCtx{Context: ctx, CancelFunc: cancel}
  		r.ts.running[qr.RunID] = rCtx
  	}
  	r.ts.runningMu.Unlock()
  	go r.executeAndWait(rCtx.Context, qr, runLogger)
  
  	r.updateRunState(qr, RunStarted, runLogger)
  	return true
  }
docs: // RestartRun attempts to restart a queued run if the runner is available to do the work.
  // If the runner was already busy we return false.