anchor.diff:            bool autoUpdateHostedVersions: false}) =>
         executeTask('check release versions', () async {
           final ProjectVersions versions = await getCurrentProjectVersions(
  -            _graph, type, autoUpdateHostedVersions);
  +            graph, type, autoUpdateHostedVersions);
           if (versions.newReleaseVersion is Some) {
  -          _log.info('==> project ${_graph.name} will be upgraded from version: '
  +          _log.info('==> project ${graph.name} will be upgraded from version: '
                 '${versions.taggedGitVersion} '
                 'to: ${versions.newReleaseVersion.get()}. '
                 'It will ${versions.hasBeenPublished ? "" : "NOT "}be published to pub');
           } else {
  -          _log.info('project ${_graph.name} will NOT be upgraded. '
  +          _log.info('project ${graph.name} will NOT be upgraded. '
                 'It will remain at version: ${versions.pubspecVersion}');
           }
         });
  
positive.code: 
      return executeTask(
          'set up project for new feature $featureName',
          () => _graph.processDepthFirst((JefeProject project) => project
              .lifecycle
              .startNewFeature(featureName, doPush: doPush, recursive: false)));
    }
  
    Future startNewFeatureForCurrentProject(String featureName,
        {bool doPush: false}) {
      return executeTask(
          'set up project for new feature "$featureName" for project ${_graph.name}',
          () async {
        /*
            TODO: it may not make much sense to try to hide the multi vs single
            project here as we likely wanna explicitly decide concurrency at
            each step.
             */
  
        await _git.assertWorkingTreeClean();
        await _gitFeature.featureStart(featureName);
        await _pubspec.setToPathDependencies();
        await _pub.get();
        await _git.commit('$featureStartCommitPrefix $featureName');
        if (doPush) await _git.push();
      });
    }
  
  
negative.code:         .completeFeature(featureName, doPush: doPush, recursive: false);
  
      return executeTask('complete development of feature $featureName',
          () => graph.processDepthFirst(doComplete));
    }
  
    Future completeFeatureForCurrentProject(String featureName,
        {bool doPush: false}) {
      return executeTask(
          'complete development of feature $featureName for project ${graph.name}',
          () async {
        await _git.assertWorkingTreeClean();
  
        final currentBranchName = await gitCurrentBranchName(await graph.gitDir);
        if (!(currentBranchName == _gitFeature.developBranchName)) {
          await _gitFeature.featureFinish(featureName,
              excludeOnlyCommitIf: (Commit c) =>
  