If ``self._savepath`` doesn't exist, can't be read as JSON, or doesn't
        match ``VERSION``, return 0. Otherwise, return the step which that file
        lists as the last-run step for this release.

        :return: last-run step from the release or 0
        :rtype: int

def _last_step(self):
        """
        If ``self._savepath`` doesn't exist, can't be read as JSON, or doesn't
        match ``VERSION``, return 0. Otherwise, return the step which that file
        lists as the last-run step for this release.

        :return: last-run step from the release or 0
        :rtype: int
        """
        if not os.path.exists(self._savepath):
            return 0
        try:
            with open(self._savepath, 'r') as fh:
                j = json.loads(fh.read())
        except Exception:
            logger.warning(
                'Could not read or JSON-deserialize %s', self._savepath
            )
            return 0
        if j.get('version', '') != VERSION:
            return 0
        return j.get('last_successful_step', 0)