code: func (f *AckFwdDep) RollForward(c context.Context) (muts []tumble.Mutation, err error) {
  	atmpt, fdep := f.Dep.Fwd(c)
  	err = ds.Get(c, atmpt, fdep)
  	if err != nil {
  		return
  	}
  
  	if (atmpt.State != dm.Attempt_EXECUTING && atmpt.State != dm.Attempt_WAITING) || atmpt.CurExecution != fdep.ForExecution {
  		logging.Errorf(c, "EARLY EXIT: %s: %s v %s", atmpt.State, atmpt.CurExecution, fdep.ForExecution)
  		return
  	}
  
  	idx := uint32(fdep.BitIndex)
  
  	if !atmpt.DepMap.IsSet(idx) {
  		atmpt.DepMap.Set(idx)
  
  		if atmpt.DepMap.All(true) && atmpt.State == dm.Attempt_WAITING {
  			if err = atmpt.ModifyState(c, dm.Attempt_SCHEDULING); err != nil {
  				return
  			}
  			atmpt.DepMap.Reset()
  			muts = append(muts, &ScheduleExecution{For: f.Dep.From})
  		}
  
  		err = ds.Put(c, atmpt)
  	}
  
  	return
  }
docs: // RollForward implements tumble.Mutation.