anchor.diff:        dartDocsIndex.writeAsStringSync(_buildDartDocsFailedIndexHtml(renderData));
         _copyDartDocsFailedIndexHtml("dartdocs_failed_index.html");
         dartDocsIndex.deleteSync();
  +
  +      // Generate failed.json
  +      String failedJson = JSON.encode(renderData);
  +      File dartDocsFailedJson = new File("dartdocs_failed.json");
  +      dartDocsFailedJson.writeAsStringSync(failedJson);
  +      _copyDartDocsRoot("dartdocs_failed.json", "failed.json");
  +      dartDocsFailedJson.deleteSync();
       }).catchError((error) =>
           Logger.root.severe("fetch and build failed on building index pages: $error"));
     }
  
positive.code: 
  
    // TODO: DRY
    int _copyDartDocsIndexJson(String dartDocsIndexPath) {
      List<String> args = ['-m', 'cp',
                           '-e',
                           '-c',
                           '-z', COMPRESS_FILE_TYPES,
                           '-a', 'public-read',
                           dartDocsIndexPath, "gs://www.dartdocs.org/index.json"];
      ProcessResult processResult = Process.runSync('gsutil', args, runInShell: true);
      stdout.write(processResult.stdout);
      stderr.write(processResult.stderr);
  
negative.code:       String indexJson = JSON.encode(renderData);
        File dartDocsIndexJson = new File("dartdocs_index.json");
        dartDocsIndexJson.writeAsStringSync(indexJson);
        _copyDartDocsRoot("dartdocs_index.json", "index.json");
        dartDocsIndexJson.deleteSync();
  
        return _packageBuildInfoDataStore.fetchBuilt(false);
  