anchor.diff:        dartDocsIndex.writeAsStringSync(_buildDartDocsIndexHtml(renderData));
         _copyDartDocsIndexHtml("dartdocs_index.html");
         dartDocsIndex.deleteSync();
  +      return _packageBuildInfoDataStore.fetchBuilt(false);
  +    }).then((List<PackageBuildInfo> packageBuildInfos) {
  +      // TODO: DRY
  +      Map renderData = {'docsUrls': []};
  +      renderData['docsUrls'].addAll(packageBuildInfos.map((packageBuildInfo) {
  +        Uri httpBuildLog;
  +
  +        if (packageBuildInfo.buildLog != null && packageBuildInfo.buildLog.isNotEmpty) {
  +          Uri gsBuildLog = Uri.parse(packageBuildInfo.buildLog);
  +          httpBuildLog = new Uri.http(gsBuildLog.host, gsBuildLog.path);
  +        } else {
  +          httpBuildLog = new Uri.http("www.dartdocs.org", "/failed/notfound.html");
  +        }
  +
  +
  +        return {
  +          "name": packageBuildInfo.name,
  +          "version": packageBuildInfo.version,
  +          "url": httpBuildLog.toString()
  +        };
  +      }).toList());
  +
  +      File dartDocsIndex = new File("dartdocs_failed_index.html");
  +      dartDocsIndex.writeAsStringSync(_buildDartDocsFailedIndexHtml(renderData));
  +      _copyDartDocsFailedIndexHtml("dartdocs_failed_index.html");
  +      dartDocsIndex.deleteSync();
       });
  +  }
  +
  +  // TODO: DRY
  +  String _buildDartDocsFailedIndexHtml(Map renderData, {String dartDocsTemplate:
  +                                  "bin/dartdocs_failed_index.html.mustache"}) {
  +    String indexTemplate = new File(dartDocsTemplate).readAsStringSync();
  +    var template = mustache.parse(indexTemplate);
  +    var indexHtml = template.renderString(renderData, htmlEscapeValues: false);
  +    return indexHtml;
  +  }
  +
  +  // TODO: DRY
  +  int _copyDartDocsFailedIndexHtml(String dartDocsIndexPath) {
  +    List<String> args = ['-m', 'cp',
  +                         '-e',
  +                         '-c',
  +                         '-z', COMPRESS_FILE_TYPES,
  +                         '-a', 'public-read',
  +                         dartDocsIndexPath, "gs://www.dartdocs.org/failed/index.html"];
  +    ProcessResult processResult = Process.runSync('gsutil', args, runInShell: true);
  +    stdout.write(processResult.stdout);
  +    stderr.write(processResult.stderr);
  +    return processResult.exitCode;
     }
   
     // TODO: move to library
  
positive.code:     Logger.root.severe(processResult.stderr);
      return processResult.exitCode;
    }
  }
  
  void main(List<String> args, SendPort replyTo) {
  
negative.code:     isolateGceLauncherSendPort.send(isolateGceLauncherReceivePort.sendPort);
      _initListeners();
      _initDatastore();
      _initServer();
      Timer.run(callback);
    }
  
  