code: func (r *RecordCompletion) RollForward(c context.Context) (muts []tumble.Mutation, err error) {
  	bdg := &model.BackDepGroup{Dependee: *r.For}
  	if err = ds.Get(c, bdg); err != nil && err != ds.ErrNoSuchEntity {
  		return
  	}
  
  	needProp := make([]*model.BackDep, 0, completionLimit)
  
  	q := (ds.NewQuery("BackDep").
  		Ancestor(ds.KeyForObj(c, bdg)).
  		Eq("Propagated", false).
  		Limit(completionLimit))
  
  	if err = ds.GetAll(c, q, &needProp); err != nil {
  		return
  	}
  
  	if len(needProp) > 0 {
  		muts = make([]tumble.Mutation, len(needProp))
  
  		for i, bdep := range needProp {
  			bdep.Propagated = true
  			muts[i] = &AckFwdDep{bdep.Edge()}
  		}
  
  		if len(needProp) == completionLimit {
  			// Append ourself if there might be more to do!
  			muts = append(muts, r)
  		}
  
  		if err = ds.Put(c, needProp); err != nil {
  			return
  		}
  	}
  
  	if !bdg.AttemptFinished {
  		bdg.AttemptFinished = true
  		if err = ds.Put(c, bdg); err != nil {
  			return
  		}
  	}
  
  	return
  }
docs: // RollForward implements tumble.Mutation.