anchor.diff:        // Yield the outputs.
         for (var output in wrappedWriter.assetsWritten) {
           (_assetGraph.get(output) as GeneratedAssetNode).wasOutput = true;
  -        streamController.add(output);
  -      }
  -    }
  -
  -    Future.wait(primaryInputs.map(runForInput)).then((_) {
  -      streamController.close();
  -    });
  -
  -    return streamController.stream;
  +        outputs.add(output);
  +      }
  +    }
  +
  +    await Future.wait(primaryInputs.map(runForInput));
  +
  +    return outputs;
     }
   
     Future _delete(AssetId id) {
  
positive.code:           .toSet();
  
    /// Runs [builder] with [primaryInputs] as inputs.
    Stream<AssetId> _runBuilder(int phaseNumber, Builder builder,
        Iterable<AssetId> primaryInputs, ResourceManager resourceManager) {
      var streamController = new StreamController<AssetId>();
      Future runForInput(AssetId input) async {
        var builderOutputs = expectedOutputs(builder, input);
  
  
negative.code:     for (var action in _buildActions) {
        phaseNumber++;
        var inputs = _matchingInputs(action.inputSet, phaseNumber);
        for (var output in await _runBuilder(
            phaseNumber, action.builder, inputs, resourceManager)) {
          outputs.add(output);
        }
  