docs: def get_guts(self, last_build, missing='missing or bad'):
          """
          returns None if guts have changed
          """
          try:
              data = _load_data(self.out)
          except:
              logger.info("building because %s %s", os.path.basename(self.out), missing)
              return None
  
          if len(data) != len(self.GUTS):
              logger.info("building because %s is bad", self.outnm)
              return None
          for i, (attr, func) in enumerate(self.GUTS):
              if func is None:
                  # no check for this value
                  continue
              if func(attr, data[i], getattr(self, attr), last_build):
                  return None
          return data