code: func visitAndMarkTags(c context.Context, job mapper.JobID, keys []*datastore.Key, cb func(*model.Tag) string) error {
  	var marked []*markedTag
  	err := multiGetTags(c, keys, func(key *datastore.Key, tag *model.Tag) error {
  		if why := cb(tag); why != "" {
  			mt := &markedTag{
  				Job: job,
  				Key: key,
  				Tag: tag.Tag,
  				Why: why,
  			}
  			mt.genID()
  			marked = append(marked, mt)
  		}
  		return nil
  	})
  	if err != nil {
  		return err
  	}
  
  	if err := datastore.Put(c, marked); err != nil {
  		return errors.Annotate(err, "failed to store %d markedTag(s)", len(marked)).Tag(transient.Tag).Err()
  	}
  	return nil
  }
docs: // visitAndMarkTags fetches Tag entities given their keys and passes them to
  // the callback, which may choose to mark a tag by returning non-empty string
  // with the human-readable reason why the tag was marked.
  //
  // Such marked tags are then stored in the datastore and later can be queried.