code: func (r *runner) startFromWorking(now int64) {
  	if nextDue, hasQueue := r.ts.NextDue(); now < nextDue && !hasQueue {
  		// Not ready for a new run. Go idle again.
  		atomic.StoreUint32(r.state, runnerIdle)
  		return
  	}
  	ctx, cancel := context.WithCancel(r.ctx)
  	rc, err := r.desiredState.CreateNextRun(ctx, r.task.ID, now)
  	if err != nil {
  		r.logger.Info("Failed to create run", zap.Error(err))
  		atomic.StoreUint32(r.state, runnerIdle)
  		cancel() // cancel to prevent context leak
  		return
  	}
  	qr := rc.Created
  	r.ts.runningMu.Lock()
  	r.ts.running[qr.RunID] = runCtx{Context: ctx, CancelFunc: cancel}
  	r.ts.runningMu.Unlock()
  	r.ts.SetNextDue(rc.NextDue, rc.HasQueue, qr.Now)
  
  	// Create a new child logger for the individual run.
  	// We can't do r.logger = r.logger.With(zap.String("run_id", qr.RunID.String()) because zap doesn't deduplicate fields,
  	// and we'll quickly end up with many run_ids associated with the log.
  	runLogger := r.logger.With(zap.String("run_id", qr.RunID.String()), zap.Int64("now", qr.Now))
  
  	runLogger.Info("Created run; beginning execution")
  	r.wg.Add(1)
  	go r.executeAndWait(ctx, qr, runLogger)
  
  	r.updateRunState(qr, RunStarted, runLogger)
  }
docs: // startFromWorking attempts to create a run if one is due, and then begins execution on a separate goroutine.
  // r.state must be runnerWorking when this is called.