anchor.diff:              internalSources, _options.packageGraph.root.name, _options.reader);
           buildScriptUpdates =
               await BuildScriptUpdates.create(_options, assetGraph);
  -        conflictingOutputs =
  -            assetGraph.outputs.where(allSources.contains).toSet();
  +        conflictingOutputs = assetGraph.outputs
  +            .where((n) => n.package == _options.packageGraph.root.name)
  +            .where(inputSources.contains)
  +            .toSet();
  +        final conflictsInDeps = assetGraph.outputs
  +            .where((n) => n.package != _options.packageGraph.root.name)
  +            .where(inputSources.contains)
  +            .toSet();
  +        // TODO(https://github.com/dart-lang/build/issues/706) - stop special
  +        // casing this conflict
  +        conflictsInDeps
  +            .remove((new AssetId('node_preamble', 'lib/preamble.js')));
  +        if (conflictsInDeps.isNotEmpty) {
  +          throw new UnexpectedExistingOutputsException(conflictsInDeps);
  +        }
         });
   
         await logTimedAsync(
  
positive.code:           _logger,
            'Checking for updates since last build',
            () => _updateAssetGraph(assetGraph, _buildActions, inputSources,
                cacheDirSources, internalSources, allSources));
  
        buildScriptUpdates =
            await BuildScriptUpdates.create(_options, assetGraph);
  
negative.code:       AssetGraph assetGraph,
        Set<AssetId> inputSources,
        Set<AssetId> generatedSources,
        Set<AssetId> internalSources) async {
      final allSources = new Set<AssetId>()
        ..addAll(inputSources)
        ..addAll(generatedSources)
        ..addAll(internalSources);
      var updates = <AssetId, ChangeType>{};
      addUpdates(Iterable<AssetId> assets, ChangeType type) {
        for (var asset in assets) {
  