anchor.diff:        // Yield the outputs.
         for (var output in writer.assetsWritten) {
           (_assetGraph.get(output) as GeneratedAssetNode).wasOutput = true;
  -        groupOutputs.add(output);
           yield output;
         }
       }
  
positive.code: 
    /// Runs [builder] with [primaryInputs] as inputs.
    Stream<AssetId> _runBuilder(int phaseNumber, Builder builder,
        Iterable<AssetId> primaryInputs, Set<AssetId> groupOutputs) async* {
      for (var input in primaryInputs) {
        var builderOutputs = expectedOutputs(builder, input);
  
  
negative.code:       // Skip the build step if none of the outputs need updating.
        var skipBuild = !builderOutputs.any((output) =>
            (_assetGraph.get(output) as GeneratedAssetNode).needsUpdate);
        if (skipBuild) continue;
  
        var reader = new SinglePhaseReader(_reader, _assetGraph, phaseNumber);
        var writer = new AssetWriterSpy(_writer);
        await runBuilder(builder, [input], reader, writer, _resolvers,
  