code: func (m *Machine) Start(ctx context.Context, wg *sync.WaitGroup) (started chan struct{}) {
  	m.ctx, m.cancel = context.WithCancel(ctx)
  
  	started = make(chan struct{})
  
  	runf := func() {
  
  		if m.SplayStart > 0 {
  			s1 := rand.NewSource(time.Now().UnixNano())
  			r1 := rand.New(s1)
  			sleepSeconds := time.Duration(r1.Intn(m.SplayStart)) * time.Second
  			m.Infof(m.MachineName, "Sleeping %v before starting Autonomous Agent", sleepSeconds)
  
  			t := time.NewTimer(sleepSeconds)
  
  			select {
  			case <-t.C:
  			case <-m.ctx.Done():
  				m.Infof(m.MachineName, "Exiting on context interrupt")
  				return
  			}
  		}
  
  		m.Infof(m.MachineName, "Starting Choria Machine %s version %s from %s", m.MachineName, m.MachineVersion, m.directory)
  		m.startTime = time.Now().UTC()
  
  		err := m.manager.Run(m.ctx, wg)
  		if err != nil {
  			m.Errorf(m.MachineName, "Could not start manager: %s", err)
  		}
  
  		started <- struct{}{}
  	}
  
  	go runf()
  
  	return started
  }
docs: // Start runs the machine in the background