Repository: GoogleChrome/lighthouse
Pull request #10250 (2020-01-22 23:51:44)

docs: add protobuf install directions
okay i think these are reproducible and good.

i'm not sure when they changed the format that results in [this empty object to null change](https://github.com/GoogleChrome/lighthouse/pull/10242/commits/4a32b15f6c6e8cc5e8ddc61c7f1f936717f0e37a), but it was between 3.7.1 and 3.11.2.





Patch:
diff --git a/.appveyor.yml b/.appveyor.yml
index 2e2804816..ecd6cde77 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -40,7 +40,6 @@ test_script:
   # run smoke tests serially, trying up to three times to prevent flakes.
   # FIXME: Exclude Appveyor from running `lantern` smoketest until we fix the flake.
   - yarn smoke -j=1 --retries=2 a11y errors oopif pwa pwa2 pwa3 dbw redirects seo offline byte perf metrics
-  - yarn test-docs
 
 cache:
   #- chrome-win32 -> appveyor.yml,package.json
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
deleted file mode 100644
index f31ed0bd0..000000000
--- a/.github/CODEOWNERS
+++ /dev/null
@@ -1,21 +0,0 @@
-# Each line is a file pattern followed by one or more owners.
-# Order is important. The last matching pattern has the most precedence.
-# https://help.github.com/articles/about-codeowners/
-
-lighthouse-cli/                     @patrickhulce       @paulirish
-lighthouse-cli/test/fixtures/       @patrickhulce       @brendankenny
-lighthouse-cli/test/smokehouse/     @patrickhulce       @brendankenny
-
-lighthouse-core/gather/             @patrickhulce       @paulirish
-lighthouse-core/audits/             @patrickhulce       @brendankenny   @paulirish
-lighthouse-core/report/             @paulirish
-
-lighthouse-core/config/             @patrickhulce       @brendankenny
-lighthouse-core/lib/                @brendankenny       @paulirish
-clients/                            @paulirish          @patrickhulce
-lighthouse-viewer/                  @ebidel             @brendankenny
-
-docs/                               @paulirish
-proto/                              @brendankenny       @exterkamp
-
-# no explicit owner for travis, etc
diff --git a/.npmignore b/.npmignore
index 7c42d9dc7..3228964db 100644
--- a/.npmignore
+++ b/.npmignore
@@ -24,10 +24,12 @@ lighthouse-logger/
 # keep smokehouse tests, etc
 !lighthouse-cli/test
 
-node_modules/
 results/
 lantern-data/
-latest-run/
+
+# ignore all folders named as such
+node_modules
+latest-run
 
 # generated files
 **/pages/scripts/lighthouse-report.js
@@ -50,3 +52,4 @@ results.html
 .eslintignore
 .eslintrc.js
 .travis.yml
+*.tgz
\ No newline at end of file
diff --git a/build/build-pack.sh b/build/build-pack.sh
new file mode 100644
index 000000000..2877f33a9
--- /dev/null
+++ b/build/build-pack.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+
+DIRNAME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+LH_ROOT="$DIRNAME/.."
+
+tmp_dir=$(mktemp -d -t lh-XXXXXXXXXX)
+
+cd "$tmp_dir"
+npm pack "$LH_ROOT"
+mv *.tgz "$LH_ROOT/dist/lighthouse.tgz"
+
+rmdir "$tmp_dir"
diff --git a/docs/recipes/auth/package.json b/docs/recipes/auth/package.json
index b632de6bb..d05fcb742 100644
--- a/docs/recipes/auth/package.json
+++ b/docs/recipes/auth/package.json
@@ -5,7 +5,7 @@
   "dependencies": {
     "express": "^4.17.1",
     "express-session": "^1.16.2",
-    "lighthouse": "file:../../..",
+    "lighthouse": "file:../../../dist/lighthouse.tgz",
     "morgan": "^1.9.1"
   }
 }
diff --git a/docs/recipes/custom-gatherer-puppeteer/custom-audit.js b/docs/recipes/custom-gatherer-puppeteer/custom-audit.js
new file mode 100644
index 000000000..1a640cbcf
--- /dev/null
+++ b/docs/recipes/custom-gatherer-puppeteer/custom-audit.js
@@ -0,0 +1,34 @@
+/**
+ * @license Copyright 2020 Google Inc. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+'use strict';
+
+const Audit = require('lighthouse').Audit;
+
+class CustomAudit extends Audit {
+  static get meta() {
+    return {
+      id: 'custom-audit',
+      title: 'First text input field accepts `123` as input',
+      failureTitle: 'First text input field doesn\'t accept `123` as input',
+      description: 'Example custom audit which relies on a fancy gatherer.',
+
+      // The name of the custom gatherer class that provides input to this audit.
+      requiredArtifacts: ['CustomGatherer'],
+    };
+  }
+
+  static audit(artifacts) {
+    const value = artifacts.CustomGatherer.value;
+    const success = value === '123';
+
+    return {
+      // Cast true/false to 1/0
+      score: Number(success),
+    };
+  }
+}
+
+module.exports = CustomAudit;
diff --git a/docs/recipes/custom-gatherer-puppeteer/custom-config.js b/docs/recipes/custom-gatherer-puppeteer/custom-config.js
new file mode 100644
index 000000000..47fbc0527
--- /dev/null
+++ b/docs/recipes/custom-gatherer-puppeteer/custom-config.js
@@ -0,0 +1,29 @@
+/**
+ * @license Copyright 2020 Google Inc. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+'use strict';
+
+module.exports = {
+  passes: [{
+    passName: 'defaultPass',
+    gatherers: [
+      'custom-gatherer',
+    ],
+  }],
+
+  audits: [
+    'custom-audit',
+  ],
+
+  categories: {
+    mysite: {
+      title: 'My custom audit',
+      description: 'Super awesome, strings included',
+      auditRefs: [
+        {id: 'custom-audit', weight: 1},
+      ],
+    },
+  },
+};
diff --git a/docs/recipes/custom-gatherer-puppeteer/custom-gatherer.js b/docs/recipes/custom-gatherer-puppeteer/custom-gatherer.js
new file mode 100644
index 000000000..41373da8b
--- /dev/null
+++ b/docs/recipes/custom-gatherer-puppeteer/custom-gatherer.js
@@ -0,0 +1,51 @@
+/**
+ * @license Copyright 2020 Google Inc. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+'use strict';
+
+/* global document */
+
+const Gatherer = require('lighthouse').Gatherer;
+const Puppeteer = require('puppeteer-core');
+
+async function connect(driver) {
+  const browser = await Puppeteer.connect({
+    browserWSEndpoint: await driver.wsEndpoint(),
+    defaultViewport: null,
+  });
+  const {targetInfo} = await driver.sendCommand('Target.getTargetInfo');
+  const puppeteerTarget = (await browser.targets())
+    .find(target => target._targetId === targetInfo.targetId);
+  const page = await puppeteerTarget.page();
+  return {browser, page};
+}
+
+class CustomGatherer extends Gatherer {
+  async afterPass(options) {
+    const {driver} = options;
+    const {page} = await connect(driver);
+
+    // Inject an input field for our debugging pleasure.
+    function makeInput() {
+      const el = document.createElement('input');
+      el.type = 'number';
+      document.body.append(el);
+    }
+    await driver.evaluateAsync(`(${makeInput})()`);
+    await new Promise(resolve => setTimeout(resolve, 100));
+
+    // Prove that `driver` (Lighthouse) and `page` (Puppeteer) are talking to the same page.
+    await driver.evaluateAsync(`document.querySelector('input').value = '1'`);
+    await page.type('input', '23', {delay: 300});
+    const value = await driver.evaluateAsync(`document.querySelector('input').value`);
+    if (value !== '123') throw new Error('huh?');
+
+    // No need to close the browser or page. Puppeteer doesn't own either of them.
+
+    return {value};
+  }
+}
+
+module.exports = CustomGatherer;
diff --git a/docs/recipes/custom-gatherer-puppeteer/package.json b/docs/recipes/custom-gatherer-puppeteer/package.json
new file mode 100644
index 000000000..f708a69fb
--- /dev/null
+++ b/docs/recipes/custom-gatherer-puppeteer/package.json
@@ -0,0 +1,13 @@
+{
+  "name": "custom-lighthouse-recipe",
+  "private": true,
+  "scripts": {
+    "test": "sh test.sh"
+  },
+  "devDependencies": {
+    "lighthouse": "file:../../../dist/lighthouse.tgz"
+  },
+  "dependencies": {
+    "puppeteer-core": "^2.0.0"
+  }
+}
diff --git a/docs/recipes/custom-gatherer-puppeteer/readme.md b/docs/recipes/custom-gatherer-puppeteer/readme.md
new file mode 100644
index 000000000..337953939
--- /dev/null
+++ b/docs/recipes/custom-gatherer-puppeteer/readme.md
@@ -0,0 +1,7 @@
+# Using Puppeteer in a Gatherer
+
+> **Tip**: see [Basic Custom Audit Recipe](../custom-audit) for basic information about custom audits.
+
+```sh
+lighthouse --config-path=custom-config.js https://www.example.com
+```
diff --git a/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js b/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js
index 5fc0bdd18..83211009a 100644
--- a/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js
+++ b/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js
@@ -24,10 +24,8 @@ const UIStrings = {
    */
   warning: 'Unable to determine the destination for anchor ({anchorHTML}). ' +
     'If not used as a hyperlink, consider removing target=_blank.',
-  /** Label for a column in a data table; entries will be the target attribute of a link. Each entry is either an empty string or a string like `_blank`.  */
-  columnTarget: 'Target',
-  /** Label for a column in a data table; entries will be the values of the html "rel" attribute from link in a page.  */
-  columnRel: 'Rel',
+  /** Label for a column in a data table; entries will be the HTML elements that failed the audit. Anchors are DOM elements that are links. */
+  columnFailingAnchors: 'Failing Anchors',
 };
 
 const str_ = i18n.createMessageInstanceIdFn(__filename, UIStrings);
@@ -71,6 +69,13 @@ class ExternalAnchorsUseRelNoopenerAudit extends Audit {
       })
       .map(anchor => {
         return {
+          node: /** @type {LH.Audit.Details.NodeValue} */  ({
+            type: 'node',
+            path: anchor.devtoolsNodePath || '',
+            selector: anchor.selector || '',
+            nodeLabel: anchor.nodeLabel || '',
+            snippet: anchor.outerHTML || '',
+          }),
           href: anchor.href || 'Unknown',
           target: anchor.target || '',
           rel: anchor.rel || '',
@@ -80,9 +85,7 @@ class ExternalAnchorsUseRelNoopenerAudit extends Audit {
 
     /** @type {LH.Audit.Details.Table['headings']} */
     const headings = [
-      {key: 'href', itemType: 'url', text: str_(i18n.UIStrings.columnURL)},
-      {key: 'target', itemType: 'text', text: str_(UIStrings.columnTarget)},
-      {key: 'rel', itemType: 'text', text: str_(UIStrings.columnRel)},
+      {key: 'node', itemType: 'node', text: str_(UIStrings.columnFailingAnchors)},
     ];
 
     const details = Audit.makeTableDetails(headings, failingAnchors);
diff --git a/lighthouse-core/gather/gatherers/anchor-elements.js b/lighthouse-core/gather/gatherers/anchor-elements.js
index 3f8b6b80f..4b75cf5c1 100644
--- a/lighthouse-core/gather/gatherers/anchor-elements.js
+++ b/lighthouse-core/gather/gatherers/anchor-elements.js
@@ -37,6 +37,12 @@ function collectAnchorElements() {
   return anchorElements.map(node => {
     // @ts-ignore - put into scope via stringification
     const outerHTML = getOuterHTMLSnippet(node); // eslint-disable-line no-undef
+    // @ts-ignore - put into scope via stringification
+    const nodePath = getNodePath(node); // eslint-disable-line no-undef
+    // @ts-ignore - getNodeSelector put into scope via stringification
+    const selector = getNodeSelector(node); // eslint-disable-line no-undef
+    // @ts-ignore - getNodeLabel put into scope via stringification
+    const nodeLabel = getNodeLabel(node); // eslint-disable-line no-undef
 
     if (node instanceof HTMLAnchorElement) {
       return {
@@ -44,6 +50,9 @@ function collectAnchorElements() {
         text: node.innerText, // we don't want to return hidden text, so use innerText
         rel: node.rel,
         target: node.target,
+        devtoolsNodePath: nodePath,
+        selector,
+        nodeLabel,
         outerHTML,
       };
     }
@@ -53,6 +62,9 @@ function collectAnchorElements() {
       text: node.textContent || '',
       rel: '',
       target: node.target.baseVal || '',
+      devtoolsNodePath: nodePath,
+      selector,
+      nodeLabel,
       outerHTML,
     };
   });
@@ -68,6 +80,9 @@ class AnchorElements extends Gatherer {
     const expression = `(() => {
       ${pageFunctions.getOuterHTMLSnippetString};
       ${pageFunctions.getElementsInDocumentString};
+      ${pageFunctions.getNodePathString};
+      ${pageFunctions.getNodeSelectorString};
+      ${pageFunctions.getNodeLabelString};
 
       return (${collectAnchorElements})();
     })()`;
diff --git a/lighthouse-core/lib/i18n/locales/ar-XB.json b/lighthouse-core/lib/i18n/locales/ar-XB.json
index ca4d9f849..4ae84d1cb 100644
--- a/lighthouse-core/lib/i18n/locales/ar-XB.json
+++ b/lighthouse-core/lib/i18n/locales/ar-XB.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "‏‮Avoids‬‏ ‏‮an‬‏ ‏‮excessive‬‏ ‏‮DOM‬‏ ‏‮size‬‏"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "‏‮Rel‬‏"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "‏‮Target‬‏"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "‏‮Add‬‏ `rel=\"noopener\"` ‏‮or‬‏ `rel=\"noreferrer\"` ‏‮to‬‏ ‏‮any‬‏ ‏‮external‬‏ ‏‮links‬‏ ‏‮to‬‏ ‏‮improve‬‏ ‏‮performance‬‏ ‏‮and‬‏ ‏‮prevent‬‏ ‏‮security‬‏ ‏‮vulnerabilities‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/ar.json b/lighthouse-core/lib/i18n/locales/ar.json
index 4fe3ac76e..e3cd2f0a4 100644
--- a/lighthouse-core/lib/i18n/locales/ar.json
+++ b/lighthouse-core/lib/i18n/locales/ar.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "تجنُب حجم DOM الزائد"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "السمة المُستهدَفة"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "يمكنك إضافة `rel=\"noopener\"` أو `rel=\"noreferrer\"` إلى أي روابط خارجية لتحسين الأداء ومنع الثغرات الأمنية. [مزيد من المعلومات](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/bg.json b/lighthouse-core/lib/i18n/locales/bg.json
index b5fb2deb6..065938a2c 100644
--- a/lighthouse-core/lib/i18n/locales/bg.json
+++ b/lighthouse-core/lib/i18n/locales/bg.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Не се използва DOM с твърде голям размер"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Target"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Добавете `rel=\"noopener\"` или `rel=\"noreferrer\"` към връзките към външни сайтове, за да подобрите ефективността и да избегнете уязвимости в сигурността. [Научете повече](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/ca.json b/lighthouse-core/lib/i18n/locales/ca.json
index 18fc17695..6d0bfcc40 100644
--- a/lighthouse-core/lib/i18n/locales/ca.json
+++ b/lighthouse-core/lib/i18n/locales/ca.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Evita una mida excessiva de DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Objectiu"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Afegeix `rel=\"noopener\"` o `rel=\"noreferrer\"` a qualsevol enllaç extern per millorar-ne el rendiment i evitar vulnerabilitats de seguretat. [Obtén més informació](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/cs.json b/lighthouse-core/lib/i18n/locales/cs.json
index 4c4fadfbc..cfa33b2b4 100644
--- a/lighthouse-core/lib/i18n/locales/cs.json
+++ b/lighthouse-core/lib/i18n/locales/cs.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Nepoužívá příliš velký model DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Cíl"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Ke všem externím odkazům přidejte atribut `rel=\"noopener\"` nebo `rel=\"noreferrer\"`. Stránku tím zrychlíte a předejdete ohrožení zabezpečení. [Další informace](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/da.json b/lighthouse-core/lib/i18n/locales/da.json
index 045c30bdf..87f17f5ed 100644
--- a/lighthouse-core/lib/i18n/locales/da.json
+++ b/lighthouse-core/lib/i18n/locales/da.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Undgår en overdreven DOM-størrelse"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Mål"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Føj `rel=\"noopener\"` eller `rel=\"noreferrer\"` til alle eksterne links for at forbedre ydeevnen og forhindre sikkerhedssårbarheder. [Få flere oplysninger](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/de.json b/lighthouse-core/lib/i18n/locales/de.json
index 41a717bcd..1dd09c95f 100644
--- a/lighthouse-core/lib/i18n/locales/de.json
+++ b/lighthouse-core/lib/i18n/locales/de.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Vermeidet eine übermäßige DOM-Größe"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Ziel"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Fügen Sie beliebigen externen Links `rel=\"noopener\"` oder `rel=\"noreferrer\"` hinzu, um die Leistung zu verbessern und Sicherheitslücken zu vermeiden. [Weitere Informationen.](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/el.json b/lighthouse-core/lib/i18n/locales/el.json
index 1808f9427..3c0e1ac78 100644
--- a/lighthouse-core/lib/i18n/locales/el.json
+++ b/lighthouse-core/lib/i18n/locales/el.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Αποφεύγει τα υπερβολικά μεγάλα μεγέθη DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Στόχος"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Προσθέστε ένα στοιχείο `rel=\"noopener\"` ή `rel=\"noreferrer\"` στους εξωτερικούς συνδέσμους για να βελτιώσετε την απόδοση και να αποφύγετε τις ευπάθειες ασφάλειας. [Μάθετε περισσότερα](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/en-GB.json b/lighthouse-core/lib/i18n/locales/en-GB.json
index 4e6eb39df..5be1784f0 100644
--- a/lighthouse-core/lib/i18n/locales/en-GB.json
+++ b/lighthouse-core/lib/i18n/locales/en-GB.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Avoids an excessive DOM size"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Target"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Add `rel=\"noopener\"` or `rel=\"noreferrer\"` to any external links to improve performance and prevent security vulnerabilities. [Learn more](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/en-US.json b/lighthouse-core/lib/i18n/locales/en-US.json
index 75358f442..2d30a5b6d 100644
--- a/lighthouse-core/lib/i18n/locales/en-US.json
+++ b/lighthouse-core/lib/i18n/locales/en-US.json
@@ -605,11 +605,8 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Avoids an excessive DOM size"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Target"
+  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
+    "message": "Failing Anchors"
   },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Add `rel=\"noopener\"` or `rel=\"noreferrer\"` to any external links to improve performance and prevent security vulnerabilities. [Learn more](https://web.dev/external-anchors-use-rel-noopener)."
diff --git a/lighthouse-core/lib/i18n/locales/en-XA.json b/lighthouse-core/lib/i18n/locales/en-XA.json
index e02c4f69c..342d92811 100644
--- a/lighthouse-core/lib/i18n/locales/en-XA.json
+++ b/lighthouse-core/lib/i18n/locales/en-XA.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "[Åvöîðš åñ éxçéššîvé ÐÖM šîžé one two three four five six]"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "[Ŕéļ one]"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "[Ţåŕĝéţ one]"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "[Åðð ᐅ`rel=\"noopener\"`ᐊ öŕ ᐅ`rel=\"noreferrer\"`ᐊ ţö åñý éxţéŕñåļ ļîñķš ţö îmþŕövé þéŕƒöŕmåñçé åñð þŕévéñţ šéçûŕîţý vûļñéŕåбîļîţîéš. ᐅ[ᐊĻéåŕñ möŕéᐅ](https://web.dev/external-anchors-use-rel-noopener)ᐊ. one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen]"
   },
diff --git a/lighthouse-core/lib/i18n/locales/en-XL.json b/lighthouse-core/lib/i18n/locales/en-XL.json
index ceb72c12b..72724d107 100644
--- a/lighthouse-core/lib/i18n/locales/en-XL.json
+++ b/lighthouse-core/lib/i18n/locales/en-XL.json
@@ -605,11 +605,8 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Âv́ôíd̂ś âń êx́ĉéŝśîv́ê D́ÔḾ ŝíẑé"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "R̂él̂"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "T̂ár̂ǵêt́"
+  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": {
+    "message": "F̂áîĺîńĝ Án̂ćĥór̂ś"
   },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Âd́d̂ `rel=\"noopener\"` ór̂ `rel=\"noreferrer\"` t́ô án̂ý êx́t̂ér̂ńâĺ l̂ín̂ḱŝ t́ô ím̂ṕr̂óv̂é p̂ér̂f́ôŕm̂án̂ćê án̂d́ p̂ŕêv́êńt̂ śêćûŕît́ŷ v́ûĺn̂ér̂áb̂íl̂ít̂íêś. [L̂éâŕn̂ ḿôŕê](https://web.dev/external-anchors-use-rel-noopener)."
diff --git a/lighthouse-core/lib/i18n/locales/es-419.json b/lighthouse-core/lib/i18n/locales/es-419.json
index 21be7cf3c..43dc723da 100644
--- a/lighthouse-core/lib/i18n/locales/es-419.json
+++ b/lighthouse-core/lib/i18n/locales/es-419.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Evita un tamaño excesivo de DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Objetivo"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Agrega `rel=\"noopener\"` o `rel=\"noreferrer\"` a cualquier vínculo externo para mejorar el rendimiento y evitar vulnerabilidades de seguridad. [Obtén más información](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/es.json b/lighthouse-core/lib/i18n/locales/es.json
index e2e972e07..92f1151f4 100644
--- a/lighthouse-core/lib/i18n/locales/es.json
+++ b/lighthouse-core/lib/i18n/locales/es.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Evita un tamaño excesivo de DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Destino"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Añade `rel=\"noopener\"` o `rel=\"noreferrer\"` a cualquier enlace externo para mejorar el rendimiento y evitar vulnerabilidades de seguridad. [Más información](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/fi.json b/lighthouse-core/lib/i18n/locales/fi.json
index 1f993d090..4b1381d90 100644
--- a/lighthouse-core/lib/i18n/locales/fi.json
+++ b/lighthouse-core/lib/i18n/locales/fi.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Välttää liian suurta DOM:ää"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Kohde"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Lisää ulkoisiin linkkeihin `rel=\"noopener\"` tai `rel=\"noreferrer\"` parantaaksesi tehokkuutta ja estääksesi tietoturvahaavoittuvuuksia. [Lue lisää](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/fil.json b/lighthouse-core/lib/i18n/locales/fil.json
index 4ff9e844e..601ebb31d 100644
--- a/lighthouse-core/lib/i18n/locales/fil.json
+++ b/lighthouse-core/lib/i18n/locales/fil.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Umiiwas sa masyadong malaking DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Target"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Idagdag ang `rel=\"noopener\"` o `rel=\"noreferrer\"` sa anumang external na link para pahusayin ang performance at pigilan ang mga kahinaan sa seguridad. [Matuto pa](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/fr.json b/lighthouse-core/lib/i18n/locales/fr.json
index 443e7c312..f430a45da 100644
--- a/lighthouse-core/lib/i18n/locales/fr.json
+++ b/lighthouse-core/lib/i18n/locales/fr.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Éviter une taille excessive de DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Cible"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Ajoutez les attributs `rel=\"noopener\"` ou `rel=\"noreferrer\"` à tous les liens externes pour améliorer les performances et prévenir les failles de sécurité. [En savoir plus](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/he.json b/lighthouse-core/lib/i18n/locales/he.json
index f71f925b3..0a5bbfbdd 100644
--- a/lighthouse-core/lib/i18n/locales/he.json
+++ b/lighthouse-core/lib/i18n/locales/he.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "נמנע מ-DOM גדול מדי"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "יעד"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "כדי לשפר את הביצועים ולמנוע פגיעויות המסכנות את האבטחה, יש להוסיף `rel=\"noopener\"` או `rel=\"noreferrer\"` לקישורים חיצוניים. [מידע נוסף](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/hi.json b/lighthouse-core/lib/i18n/locales/hi.json
index 6ca3c8991..3d1a5faf4 100644
--- a/lighthouse-core/lib/i18n/locales/hi.json
+++ b/lighthouse-core/lib/i18n/locales/hi.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "बहुत ज़्यादा बड़े DOM आकार से बचता है"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "लक्ष्य"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "किसी बाहरी लिंक में `rel=\"noopener\"` या `rel=\"noreferrer\"` जोड़कर परफ़ॉर्मेंस बेहतर करें और सुरक्षा जोखिमों से बचें. [ज़्यादा जानें](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/hr.json b/lighthouse-core/lib/i18n/locales/hr.json
index ed05865a5..22a628056 100644
--- a/lighthouse-core/lib/i18n/locales/hr.json
+++ b/lighthouse-core/lib/i18n/locales/hr.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Izbjegava pretjeranu veličinu DOM-a"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Cilj"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Dodajte `rel=\"noopener\"` ili `rel=\"noreferrer\"` bilo kojoj eksternoj vezi da biste unaprijedili uspješnost i spriječili sigurnosne propuste. [Saznajte više](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/hu.json b/lighthouse-core/lib/i18n/locales/hu.json
index c767f4f09..eeb22794d 100644
--- a/lighthouse-core/lib/i18n/locales/hu.json
+++ b/lighthouse-core/lib/i18n/locales/hu.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Kerüli a túlzó DOM-méretet"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Cél"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Adjon `rel=\"noopener\"` vagy `rel=\"noreferrer\"` címkét a külső linkekhez, hogy javíthassa a teljesítményt és elkerülhesse a sebezhetőségeket. [További információ](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/id.json b/lighthouse-core/lib/i18n/locales/id.json
index 87639c792..4280b3224 100644
--- a/lighthouse-core/lib/i18n/locales/id.json
+++ b/lighthouse-core/lib/i18n/locales/id.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Menghindari ukuran DOM yang berlebihan"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Target"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Tambahkan `rel=\"noopener\"` atau `rel=\"noreferrer\"` ke link eksternal mana pun untuk menyempurnakan performa dan mencegah kerentanan keamanan. [Pelajari lebih lanjut](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/it.json b/lighthouse-core/lib/i18n/locales/it.json
index 970b80bc2..51245b3dd 100644
--- a/lighthouse-core/lib/i18n/locales/it.json
+++ b/lighthouse-core/lib/i18n/locales/it.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Viene evitato un DOM di dimensioni eccessive"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Target"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Aggiungi `rel=\"noopener\"` o `rel=\"noreferrer\"` a eventuali link esterni per migliorare le prestazioni ed evitare vulnerabilità di sicurezza. [Ulteriori informazioni](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/ja.json b/lighthouse-core/lib/i18n/locales/ja.json
index f22ec78f3..7707ff680 100644
--- a/lighthouse-core/lib/i18n/locales/ja.json
+++ b/lighthouse-core/lib/i18n/locales/ja.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "過大な DOM サイズの回避"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "リンク先"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "パフォーマンスを向上し、セキュリティの脆弱性が生じないようにするには、`rel=\"noopener\"` または `rel=\"noreferrer\"` を外部リンクに追加します。[詳細](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/ko.json b/lighthouse-core/lib/i18n/locales/ko.json
index 83185d7c6..fef9011d1 100644
--- a/lighthouse-core/lib/i18n/locales/ko.json
+++ b/lighthouse-core/lib/i18n/locales/ko.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "과도한 DOM 크기 지양하기"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "타겟"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "성능을 개선하고 보안 취약점을 예방하려면 `rel=\"noopener\"` 또는 `rel=\"noreferrer\"`을(를) 외부 링크에 추가합니다. [자세히 알아보기](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/lt.json b/lighthouse-core/lib/i18n/locales/lt.json
index 61ef87a31..ed5d860b8 100644
--- a/lighthouse-core/lib/i18n/locales/lt.json
+++ b/lighthouse-core/lib/i18n/locales/lt.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Išvengiama per didelių DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Atributas „rel“"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Taikymas"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Pridėkite fragmentus „`rel=\"noopener\"`“ arba „`rel=\"noreferrer\"`“ prie bet kurių išorinių nuorodų, kad pagerintumėte našumą ir išvengtumėte saugos pažeidimų. [Sužinokite daugiau](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/lv.json b/lighthouse-core/lib/i18n/locales/lv.json
index a2d60d4e2..994cb0a63 100644
--- a/lighthouse-core/lib/i18n/locales/lv.json
+++ b/lighthouse-core/lib/i18n/locales/lv.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Nepieļauj pārāk lielus DOM izmērus"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Mērķis"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Pievienojiet parametru `rel=\"noopener\"` vai `rel=\"noreferrer\"` jebkurām ārējām saitēm, lai uzlabotu veiktspēju un novērstu drošības ievainojamību. [Uzziniet vairāk](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/nl.json b/lighthouse-core/lib/i18n/locales/nl.json
index f4a174b11..50d947e88 100644
--- a/lighthouse-core/lib/i18n/locales/nl.json
+++ b/lighthouse-core/lib/i18n/locales/nl.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Vermijdt een overmatige grote DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Doel"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Voeg `rel=\"noopener\"` of `rel=\"noreferrer\"` toe aan eventuele externe links om de prestaties te verbeteren en kwetsbaarheden in de beveiliging te voorkomen. [Meer informatie](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/no.json b/lighthouse-core/lib/i18n/locales/no.json
index a92854798..788feaabe 100644
--- a/lighthouse-core/lib/i18n/locales/no.json
+++ b/lighthouse-core/lib/i18n/locales/no.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Unngå for stor DOM-struktur"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Mål"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Legg til `rel=\"noopener\"` eller `rel=\"noreferrer\"` i eksterne linker for å øke ytelsen og forhindre sikkerhetssårbarheter. [Finn ut mer](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/pl.json b/lighthouse-core/lib/i18n/locales/pl.json
index 3320a3a5c..ce3dc552c 100644
--- a/lighthouse-core/lib/i18n/locales/pl.json
+++ b/lighthouse-core/lib/i18n/locales/pl.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Unika zbyt dużego DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Cel"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Dodaj atrybut `rel=\"noopener\"` lub `rel=\"noreferrer\"` do wszystkich linków zewnętrznych, by przyśpieszyć działanie i zapobiec lukom w zabezpieczeniach. [Więcej informacji](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/pt-PT.json b/lighthouse-core/lib/i18n/locales/pt-PT.json
index ee4e3e8e8..76378ad66 100644
--- a/lighthouse-core/lib/i18n/locales/pt-PT.json
+++ b/lighthouse-core/lib/i18n/locales/pt-PT.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Evita um tamanho excessivo do DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Alvo"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Adicione `rel=\"noopener\"` ou `rel=\"noreferrer\"` a quaisquer links externos para melhorar o desempenho e prevenir vulnerabilidades de segurança. [Saiba mais](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/pt.json b/lighthouse-core/lib/i18n/locales/pt.json
index d65cac1cc..c8c6dfaf9 100644
--- a/lighthouse-core/lib/i18n/locales/pt.json
+++ b/lighthouse-core/lib/i18n/locales/pt.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Evita DOM de tamanho excessivo"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Destino"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Adicione `rel=\"noopener\"` ou `rel=\"noreferrer\"` a qualquer link externo para melhorar o desempenho e evitar vulnerabilidades de segurança. [Saiba mais](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/ro.json b/lighthouse-core/lib/i18n/locales/ro.json
index 0ed7ea26f..14a76de79 100644
--- a/lighthouse-core/lib/i18n/locales/ro.json
+++ b/lighthouse-core/lib/i18n/locales/ro.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Evită o dimensiune DOM excesivă"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Obiectiv"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Adaugă `rel=\"noopener\"` sau `rel=\"noreferrer\"` la orice linkuri externe pentru a îmbunătăți rezultatele și a preveni vulnerabilitățile de securitate. [Află mai multe](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/ru.json b/lighthouse-core/lib/i18n/locales/ru.json
index c990d5f80..0b14ec165 100644
--- a/lighthouse-core/lib/i18n/locales/ru.json
+++ b/lighthouse-core/lib/i18n/locales/ru.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Сокращение размера структуры DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Атрибут target"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Добавьте атрибут `rel=\"noopener\"` или `rel=\"noreferrer\"` ко всем внешним ссылкам, чтобы повысить производительность и избежать уязвимостей в защите. [Подробнее…](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/sk.json b/lighthouse-core/lib/i18n/locales/sk.json
index dce9de1f3..9b0765f5b 100644
--- a/lighthouse-core/lib/i18n/locales/sk.json
+++ b/lighthouse-core/lib/i18n/locales/sk.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Zabráni použitiu nadmerne veľkého prvku DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Cieľ"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Ak chcete zlepšiť výkonnosť a zabrániť chybám zabezpečenia, pridajte k ľubovoľným externým odkazom prvok `rel=\"noopener\"` alebo `rel=\"noreferrer\"`. [Ďalšie informácie](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/sl.json b/lighthouse-core/lib/i18n/locales/sl.json
index 207ecdcaa..c24980861 100644
--- a/lighthouse-core/lib/i18n/locales/sl.json
+++ b/lighthouse-core/lib/i18n/locales/sl.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Izogiba se prekomerni velikosti DOM-a"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Cilj"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Zunanjim povezavam dodajte `rel=\"noopener\"` ali `rel=\"noreferrer\"` zaradi izboljšanja delovanja in preprečevanja varnostnih ranljivosti. [Več o tem](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/sr-Latn.json b/lighthouse-core/lib/i18n/locales/sr-Latn.json
index abc15ded5..2f190fb92 100644
--- a/lighthouse-core/lib/i18n/locales/sr-Latn.json
+++ b/lighthouse-core/lib/i18n/locales/sr-Latn.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Izbegava preveliku veličinu DOM-a"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Cilj"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Dodajte `rel=\"noopener\"` ili`rel=\"noreferrer\"` svim spoljnim linkovima da biste poboljšali učinak i sprečili bezbednosne propuste. [Saznajte više](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/sr.json b/lighthouse-core/lib/i18n/locales/sr.json
index 3cf59000e..543aa23ee 100644
--- a/lighthouse-core/lib/i18n/locales/sr.json
+++ b/lighthouse-core/lib/i18n/locales/sr.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Избегава превелику величину DOM-а"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Циљ"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Додајте `rel=\"noopener\"` или`rel=\"noreferrer\"` свим спољним линковима да бисте побољшали учинак и спречили безбедносне пропусте. [Сазнајте више](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/sv.json b/lighthouse-core/lib/i18n/locales/sv.json
index 3f3814394..520150974 100644
--- a/lighthouse-core/lib/i18n/locales/sv.json
+++ b/lighthouse-core/lib/i18n/locales/sv.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Undviker ett onödigt stort DOM-träd"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Mål"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Lägg till `rel=\"noopener\"` eller `rel=\"noreferrer\"` i alla externa länkar för att förbättra prestanda och säkerhet. [Läs mer](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/ta.json b/lighthouse-core/lib/i18n/locales/ta.json
index d0cb41877..1cf36e33e 100644
--- a/lighthouse-core/lib/i18n/locales/ta.json
+++ b/lighthouse-core/lib/i18n/locales/ta.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "அபரிமிதமான DOM அளவைத் தவிர்க்கிறது"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "இலக்கு"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "ஏதேனும் புற இணைப்புகளின் செயல்திறனை அதிகரிக்கவும் அவற்றிலுள்ள பாதுகாப்புக் குறைபாடுகளைத் தடுக்கவும் `rel=\"noopener\"` அல்லது `rel=\"noreferrer\"`ஐ சேர்க்கவும். [மேலும் அறிக](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/te.json b/lighthouse-core/lib/i18n/locales/te.json
index fe1f59ae8..4bb466e33 100644
--- a/lighthouse-core/lib/i18n/locales/te.json
+++ b/lighthouse-core/lib/i18n/locales/te.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "అధిక DOM పరిమాణాన్ని నివారిస్తుంది"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "లక్ష్యం"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "పనితీరును మెరుగుపరచడానికి, అలాగే భద్రతా ప్రమాదాలను నిరోధించడానికి ఏవైనా బయటి లింక్‌లకు '`rel=\"noopener\"`' లేదా '`rel=\"noreferrer\"`'లను జోడించండి. [మరింత తెలుసుకోండి](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/th.json b/lighthouse-core/lib/i18n/locales/th.json
index 8a0bc3b04..869667d16 100644
--- a/lighthouse-core/lib/i18n/locales/th.json
+++ b/lighthouse-core/lib/i18n/locales/th.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "หลีกเลี่ยง DOM ที่มีขนาดใหญ่เกินไป"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "เป้าหมาย"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "เพิ่ม `rel=\"noopener\"` หรือ `rel=\"noreferrer\"` ไปยังลิงก์ภายนอกใดๆ เพื่อปรับปรุงประสิทธิภาพและป้องกันช่องโหว่ด้านความปลอดภัย [ดูข้อมูลเพิ่มเติม](https://web.dev/external-anchors-use-rel-noopener)"
   },
diff --git a/lighthouse-core/lib/i18n/locales/tr.json b/lighthouse-core/lib/i18n/locales/tr.json
index f9c772e0a..8fe95e660 100644
--- a/lighthouse-core/lib/i18n/locales/tr.json
+++ b/lighthouse-core/lib/i18n/locales/tr.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Aşırı büyük bir DOM boyutunu önler"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Hedef"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Performansı artırmak ve güvenlik açıklarını önlemek için harici bağlantılara `rel=\"noopener\"` veya `rel=\"noreferrer\"` ekleyin. [Daha fazla bilgi](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/uk.json b/lighthouse-core/lib/i18n/locales/uk.json
index 7827f8ace..94359b717 100644
--- a/lighthouse-core/lib/i18n/locales/uk.json
+++ b/lighthouse-core/lib/i18n/locales/uk.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Уникається надмірний розмір DOM"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Ціль"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Додайте `rel=\"noopener\"` або `rel=\"noreferrer\"` до зовнішніх посилань, щоб покращити ефективність і підвищити їх захищеність. [Докладніше](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/vi.json b/lighthouse-core/lib/i18n/locales/vi.json
index 4c652d2d7..55442abf6 100644
--- a/lighthouse-core/lib/i18n/locales/vi.json
+++ b/lighthouse-core/lib/i18n/locales/vi.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "Tránh kích thước DOM quá lớn"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "Mục tiêu"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "Thêm `rel=\"noopener\"` hoặc `rel=\"noreferrer\"` vào mọi đường dẫn liên kết ngoài để cải thiện hiệu suất và ngăn chặn các lỗ hổng bảo mật. [Tìm hiểu thêm](https://web.dev/external-anchors-use-rel-noopener)."
   },
diff --git a/lighthouse-core/lib/i18n/locales/zh-HK.json b/lighthouse-core/lib/i18n/locales/zh-HK.json
index e036c827a..5bced9334 100644
--- a/lighthouse-core/lib/i18n/locales/zh-HK.json
+++ b/lighthouse-core/lib/i18n/locales/zh-HK.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "避免 DOM 過大"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "目標"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "將 `rel=\"noopener\"` 或 `rel=\"noreferrer\"` 新增至所有外部連結，可提升效能並防範安全漏洞。[瞭解詳情](https://web.dev/external-anchors-use-rel-noopener)。"
   },
diff --git a/lighthouse-core/lib/i18n/locales/zh-TW.json b/lighthouse-core/lib/i18n/locales/zh-TW.json
index cbedaf34a..632553f2a 100644
--- a/lighthouse-core/lib/i18n/locales/zh-TW.json
+++ b/lighthouse-core/lib/i18n/locales/zh-TW.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "避免 DOM 過大"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "目標"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "將 `rel=\"noopener\"` 或 `rel=\"noreferrer\"` 新增至所有外部連結，可提升效能並防範安全漏洞。[瞭解詳情](https://web.dev/external-anchors-use-rel-noopener)。"
   },
diff --git a/lighthouse-core/lib/i18n/locales/zh.json b/lighthouse-core/lib/i18n/locales/zh.json
index a5db7e350..d460a4caf 100644
--- a/lighthouse-core/lib/i18n/locales/zh.json
+++ b/lighthouse-core/lib/i18n/locales/zh.json
@@ -605,12 +605,6 @@
   "lighthouse-core/audits/dobetterweb/dom-size.js | title": {
     "message": "避免 DOM 规模过大"
   },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": {
-    "message": "Rel"
-  },
-  "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": {
-    "message": "目标"
-  },
   "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | description": {
     "message": "向任何外部链接添加 `rel=\"noopener\"` 或 `rel=\"noreferrer\"`，可提高性能并减少安全漏洞。[了解详情](https://web.dev/external-anchors-use-rel-noopener)。"
   },
diff --git a/lighthouse-core/scripts/git3po-rules/cannot-attach-to-this-target.yaml b/lighthouse-core/scripts/git3po-rules/cannot-attach-to-this-target.yaml
new file mode 100644
index 000000000..a34276dcd
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/cannot-attach-to-this-target.yaml
@@ -0,0 +1,25 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'Extension Error: Cannot attach to this target'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is the same root issue as #6990. So, **we''ll automatically
+  mark this as a duplicate**. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/failed-document-request.yaml b/lighthouse-core/scripts/git3po-rules/failed-document-request.yaml
new file mode 100644
index 000000000..8f8fb6282
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/failed-document-request.yaml
@@ -0,0 +1,33 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'Unable to load page:'
+          - $match: 'Unable to load the page:'
+          - $match: "FAILED_DOCUMENT_REQUEST"
+          - $match: "ERRORED_DOCUMENT_REQUEST"
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Thanks! Appreciate you filing this bug. :clap:
+
+
+  This is a known issue, most well described in #2784. So, **we''ll automatically
+  close this as a duplicate**.
+
+
+  _However_, if you believe your bug is different than the cases described there,
+  please comment here with "necessarily-wide-alpaca" and I''ll reopen this bug. :robot:
+  Beep beep boop.
+
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
+
diff --git a/lighthouse-core/scripts/git3po-rules/failed-to-construct-url.yaml b/lighthouse-core/scripts/git3po-rules/failed-to-construct-url.yaml
new file mode 100644
index 000000000..b63a0fbca
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/failed-to-construct-url.yaml
@@ -0,0 +1,24 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'Failed to construct ''URL'''
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+  This is fixed in Chrome 74, which is coming out ~March 12th.
+
+  Marking this as a duplicate of issue #6157.
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/invalid-url.yaml b/lighthouse-core/scripts/git3po-rules/invalid-url.yaml
new file mode 100644
index 000000000..083e7778d
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/invalid-url.yaml
@@ -0,0 +1,25 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'Error: INVALID_URL'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is the same root issue as #6421. So, **we''ll automatically
+  mark this as a duplicate**. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/land-when-green.yaml b/lighthouse-core/scripts/git3po-rules/land-when-green.yaml
new file mode 100644
index 000000000..0a210e259
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/land-when-green.yaml
@@ -0,0 +1,20 @@
+repo: GoogleChrome/lighthouse
+pullRequests: true
+filters:
+  - type: issue
+    criteria:
+      state: open
+      mergeable: true
+      mergeableState: clean
+  - type: label
+    label: land-when-ci-is-green
+actions:
+  - type: merge
+    # Squash all commits, leave commit message blank.
+    # The commit title (AKA first line of commit message) defaults to the PR title.
+    mergeMethod: squash
+    # Note: no `title`, so the default (PR title) is used.
+    # Disable the default squash message.
+    message: ''
+  - type: remove_label
+    label: land-when-ci-is-green
diff --git a/lighthouse-core/scripts/git3po-rules/multiple-tabs.yaml b/lighthouse-core/scripts/git3po-rules/multiple-tabs.yaml
new file mode 100644
index 000000000..705c8d565
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/multiple-tabs.yaml
@@ -0,0 +1,27 @@
+
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: text
+    text: 'You probably have multiple tabs open to the same origin'
+  - type: state
+    state: open
+  - type: comments
+    length: 0
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  This is a known issue that is best described in #3024. So, **we''ll automatically
+  close this as a duplicate**.
+
+
+  _However_, if you believe your bug is different than the cases described there,
+  please comment here with "necessarily-wide-alpaca" and I''ll reopen this bug. :robot:
+  Beep beep boop.
+
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/no-fcp.yaml b/lighthouse-core/scripts/git3po-rules/no-fcp.yaml
new file mode 100644
index 000000000..29e16118d
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/no-fcp.yaml
@@ -0,0 +1,28 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'Error: NO_FCP'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  This page seems to take too long to paint content, and Lighthouse gives up on waiting.
+  If you need to change this behavior, you can run Lighthouse from the command line with
+  a custom config modifying maxWaitForFcp.
+
+  Marking at as dupe of #7415. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/no-tabid-set-for-sendcommand.yaml b/lighthouse-core/scripts/git3po-rules/no-tabid-set-for-sendcommand.yaml
new file mode 100644
index 000000000..e1c3132e4
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/no-tabid-set-for-sendcommand.yaml
@@ -0,0 +1,25 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'No tabId set for sendCommand'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is the same root issue as #5595. So, **we''ll automatically
+  mark this as a duplicate**. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/page-hung.yaml b/lighthouse-core/scripts/git3po-rules/page-hung.yaml
new file mode 100644
index 000000000..8bbd8f7ce
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/page-hung.yaml
@@ -0,0 +1,23 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'PAGE_HUNG'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+  This error means that the page stopped responding. The solution here is to re-run. If the error repeats, the page or your machine creates infinite loops and needs to be fixed.
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/parsing-problem.yaml b/lighthouse-core/scripts/git3po-rules/parsing-problem.yaml
new file mode 100644
index 000000000..05a20b8d9
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/parsing-problem.yaml
@@ -0,0 +1,28 @@
+
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'Parsing problem'
+          - $match: "PARSING_PROBLEM"
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is the same root issue as #3306. So, **we''ll automatically
+  mark this as a duplicate**. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
+
diff --git a/lighthouse-core/scripts/git3po-rules/protocol-timeout.yaml b/lighthouse-core/scripts/git3po-rules/protocol-timeout.yaml
new file mode 100644
index 000000000..42f0bf81a
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/protocol-timeout.yaml
@@ -0,0 +1,25 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'Error: PROTOCOL_TIMEOUT'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is the same root issue as #6512. So, **we''ll automatically
+  mark this as a duplicate**. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/read-failed.yaml b/lighthouse-core/scripts/git3po-rules/read-failed.yaml
new file mode 100644
index 000000000..60704e27b
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/read-failed.yaml
@@ -0,0 +1,31 @@
+
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: "Read failed"
+          - $match: "READ_FAILED"
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is mighty similar to #2174. So, **we''ll automatically
+  close this as a duplicate**.
+
+
+  _However_, if you believe this is a mistake,
+  please comment here with "necessarily-wide-alpaca" and I''ll reopen this bug. :robot:
+  Beep beep boop.
+
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/resolve-current-tab.yaml b/lighthouse-core/scripts/git3po-rules/resolve-current-tab.yaml
new file mode 100644
index 000000000..26648586c
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/resolve-current-tab.yaml
@@ -0,0 +1,25 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: 'resolve current tab. Check your URL'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is the same root issue as #5668. So, **we''ll automatically
+  mark this as a duplicate**. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/tracing-start-wasnt-found.yaml b/lighthouse-core/scripts/git3po-rules/tracing-start-wasnt-found.yaml
new file mode 100644
index 000000000..766e5719d
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/tracing-start-wasnt-found.yaml
@@ -0,0 +1,26 @@
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $and:
+          - $match: 'Error: Protocol error'
+          - $match: '''Tracing.start'' wasn''t found'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is the same root issue as #7246. So, **we''ll automatically
+  mark this as a duplicate**. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/tracing.yaml b/lighthouse-core/scripts/git3po-rules/tracing.yaml
new file mode 100644
index 000000000..03701276e
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/tracing.yaml
@@ -0,0 +1,27 @@
+
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $or:
+          - $match: "Tracing is already started"
+          - $match: "TRACING_ALREADY_STARTED"
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is the same root issue as #1091. So, **we''ll automatically
+  mark this as a duplicate**. Thanks!
+
+  :robot: Beep beep boop.
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/git3po-rules/url-runner.yaml b/lighthouse-core/scripts/git3po-rules/url-runner.yaml
new file mode 100644
index 000000000..e61ba8f04
--- /dev/null
+++ b/lighthouse-core/scripts/git3po-rules/url-runner.yaml
@@ -0,0 +1,29 @@
+
+repo: GoogleChrome/lighthouse
+startAt: '2020-01-12T16:00:00Z'
+filters:
+  - type: issue
+    criteria:
+      text:
+        $match: 'You must provide a url to the runner'
+      state: open
+  - type: comments
+    length:
+      $lt: 2
+actions:
+  - type: add_comment
+    body: 'Howdy! Appreciate you filing this bug. :clap:
+
+
+  We think this is mighty similar to #1834. So, **we''ll automatically
+  close this as a duplicate**.
+
+
+  _However_, if you believe this is a mistake,
+  please comment here with "necessarily-wide-alpaca" and I''ll reopen this bug. :robot:
+  Beep beep boop.
+
+  '
+  - type: add_label
+    label: duplicate
+  - type: close
diff --git a/lighthouse-core/scripts/run-git3po.sh b/lighthouse-core/scripts/run-git3po.sh
new file mode 100755
index 000000000..d0d986ac6
--- /dev/null
+++ b/lighthouse-core/scripts/run-git3po.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+# requires a ghtoken set as GIT3PO_GH_TOKEN
+# likely invocation:
+#     env GIT3PO_GH_TOKEN=<token> lighthouse-core/scripts/run-git3po.sh
+
+set -ex
+
+DIRNAME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+cd "$DIRNAME"
+
+npm install -g git3po
+
+find git3po-rules/*.yaml -exec git3po -c {} \;
diff --git a/package.json b/package.json
index 8d23aafbe..e04d4906d 100644
--- a/package.json
+++ b/package.json
@@ -12,11 +12,12 @@
   },
   "scripts": {
     "build-all": "npm-run-posix-or-windows build-all:task",
-    "build-all:task": "yarn build-extension & yarn build-devtools & yarn build-lr & yarn build-viewer & wait",
+    "build-all:task": "(yarn build-extension & yarn build-devtools & yarn build-lr & yarn build-viewer & wait) && yarn build-pack",
     "build-all:task:windows": "yarn build-extension && yarn build-devtools && yarn build-lr && yarn build-viewer",
     "build-extension": "node ./build/build-extension.js",
     "build-devtools": "node ./build/build-bundle.js clients/devtools-entry.js dist/lighthouse-dt-bundle.js && node ./build/build-dt-report-resources.js",
     "build-lr": "node ./build/build-lightrider-bundles.js",
+    "build-pack": "bash build/build-pack.sh",
     "build-viewer": "node ./build/build-viewer.js",
     "clean": "rimraf dist proto/scripts/*.json proto/scripts/*_pb2.* proto/scripts/*_pb.* proto/scripts/__pycache__ proto/scripts/*.pyc *.report.html *.report.dom.html *.report.json *.devtoolslog.json *.trace.json lighthouse-core/lib/i18n/locales/*.ctc.json || true",
     "lint": "[ \"$CI\" = true ] && eslint --quiet -f codeframe . || eslint .",
@@ -28,7 +29,7 @@
     "test-clients": "jest \"clients/\"",
     "test-viewer": "yarn unit-viewer && jest lighthouse-viewer/test/viewer-test-pptr.js",
     "test-lantern": "bash lighthouse-core/scripts/test-lantern.sh",
-    "test-docs": "yarn --cwd docs/recipes/auth && jest docs/recipes/integration-test",
+    "test-docs": "yarn --cwd docs/recipes/auth && jest docs/recipes/integration-test && yarn --cwd docs/recipes/custom-gatherer-puppeteer test",
     "unit-core": "jest \"lighthouse-core/\"",
     "unit-cli": "jest \"lighthouse-cli/\"",
     "unit-viewer": "jest \"lighthouse-viewer/.*-test.js\"",
diff --git a/proto/sample_v2_round_trip.json b/proto/sample_v2_round_trip.json
index b81c39a00..1260615e4 100644
--- a/proto/sample_v2_round_trip.json
+++ b/proto/sample_v2_round_trip.json
@@ -708,34 +708,36 @@
             "details": {
                 "headings": [
                     {
-                        "itemType": "url",
-                        "key": "href",
-                        "text": "URL"
-                    },
-                    {
-                        "itemType": "text",
-                        "key": "target",
-                        "text": "Target"
-                    },
-                    {
-                        "itemType": "text",
-                        "key": "rel",
-                        "text": "Rel"
+                        "itemType": "node",
+                        "key": "node",
+                        "text": "Failing Anchors"
                     }
                 ],
                 "items": [
                     {
                         "href": "https://www.google.com/",
+                        "node": {
+                            "snippet": "<a href=\"https://www.google.com/\" target=\"blank\">Hello</a>",
+                            "type": "node"
+                        },
                         "outerHTML": "<a href=\"https://www.google.com/\" target=\"blank\">Hello</a>",
                         "target": "_blank"
                     },
                     {
                         "href": "Unknown",
+                        "node": {
+                            "snippet": "<a target=\"blank\">Hello</a>",
+                            "type": "node"
+                        },
                         "outerHTML": "<a target=\"blank\">Hello</a>",
                         "target": "_blank"
                     },
                     {
                         "href": "https://www.google.com/",
+                        "node": {
+                            "snippet": "<a rel=\"nofollow\" href=\"https://www.google.com/\" target=\"blank\">Hello</a>",
+                            "type": "node"
+                        },
                         "outerHTML": "<a rel=\"nofollow\" href=\"https://www.google.com/\" target=\"blank\">Hello</a>",
                         "rel": "nofollow",
                         "target": "_blank"
diff --git a/readme.md b/readme.md
index 91145b02e..e624ebb04 100644
--- a/readme.md
+++ b/readme.md
@@ -245,7 +245,30 @@ yarn
 yarn build-all
 ```
 
-If changing audit output, you'll likely also need to have the protocol-buffer compiler installed. See the [official installation instructions](https://github.com/protocolbuffers/protobuf#protocol-compiler-installation) or consult your [favorite package manager](https://formulae.brew.sh/formula/protobuf) for your OS.
+#### installing protobuf
+If changing audit output, you'll need to have v3.7.1 of the protocol-buffer/protobuf compiler installed. (v3.7.1 is known to be compatible, and 3.11.x is known to be **not** compatible.). 
+
+Homebrew should be able to install it correctly: `brew install protobuf@3.7.1`
+
+But if you want to do it manually, these steps that have worked well for us:
+
+```sh
+mkdir protobuf-install && cd protobuf-install
+curl -L -o protobuf-python-3.7.1.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/protobuf-python-3.7.1.zip
+unzip protobuf-python-3.7.1.zip
+cd protobuf-3.7.1
+
+cd python
+python setup.py build
+python setup.py test
+(cd .. && autogen.sh && configure && make)
+(cd .. && sudo make install)
+python setup.py build --cpp_implementation
+sudo python setup.py install --cpp_implementation
+```
+
+Also, see the [official installation instructions](https://github.com/protocolbuffers/protobuf#protocol-compiler-installation).
+
 
 ### Run
 
@@ -278,6 +301,13 @@ yarn smoke
 yarn type-check
 ```
 
+### Docs
+
+Some of our docs have tests that run only in CI by default. If you end up needing to modify our documentation, you'll need to run `yarn test-docs` locally to make sure they pass.
+
+**Additional Dependencies**
+- `brew install jq`
+
 ## Lighthouse Integrations
 This section details services that have integrated Lighthouse data. If you're working on a cool project integrating Lighthouse and would like to be featured here, file an issue to this repo or tweet at us [@_____lighthouse](https://twitter.com/____lighthouse?lang=en)!
 
diff --git a/types/artifacts.d.ts b/types/artifacts.d.ts
index 8e75b1a73..42324540e 100644
--- a/types/artifacts.d.ts
+++ b/types/artifacts.d.ts
@@ -289,6 +289,9 @@ declare global {
         href: string
         text: string
         target: string
+        devtoolsNodePath: string
+        selector: string
+        nodeLabel: string
         outerHTML: string
       }
 


Test patch:
diff --git a/docs/recipes/custom-gatherer-puppeteer/test.sh b/docs/recipes/custom-gatherer-puppeteer/test.sh
new file mode 100644
index 000000000..674135bb5
--- /dev/null
+++ b/docs/recipes/custom-gatherer-puppeteer/test.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# Make sure we're in this `docs/recipes/customer-gatherer-puppeteer` directory
+cd "$(dirname "$0")"
+
+yarn
+node node_modules/.bin/lighthouse --config-path=custom-config.js https://www.example.com --output=json |
+  jq '.audits["custom-audit"].score' |
+  grep -q 1
diff --git a/docs/recipes/integration-test/package.json b/docs/recipes/integration-test/package.json
index bdcf37287..720f9cefd 100644
--- a/docs/recipes/integration-test/package.json
+++ b/docs/recipes/integration-test/package.json
@@ -4,6 +4,6 @@
   },
   "dependencies": {
     "jest": "^24.9.0",
-    "lighthouse": "file:../../.."
+    "lighthouse": "file:../../../dist/lighthouse.tgz"
   }
 }
diff --git a/lighthouse-core/test/audits/dobetterweb/external-anchors-use-rel-noopener-test.js b/lighthouse-core/test/audits/dobetterweb/external-anchors-use-rel-noopener-test.js
index 7837214c1..e88864f35 100644
--- a/lighthouse-core/test/audits/dobetterweb/external-anchors-use-rel-noopener-test.js
+++ b/lighthouse-core/test/audits/dobetterweb/external-anchors-use-rel-noopener-test.js
@@ -24,7 +24,6 @@ describe('External anchors use rel="noopener"', () => {
     });
     assert.equal(auditResult.score, 1);
     assert.equal(auditResult.details.items.length, 0);
-    assert.equal(auditResult.details.items.length, 0);
   });
 
   it('passes when links have a valid rel', () => {
@@ -38,7 +37,6 @@ describe('External anchors use rel="noopener"', () => {
     });
     assert.equal(auditResult.score, 1);
     assert.equal(auditResult.details.items.length, 0);
-    assert.equal(auditResult.details.items.length, 0);
   });
 
   it('passes when links do not use target=_blank', () => {
@@ -51,7 +49,6 @@ describe('External anchors use rel="noopener"', () => {
     });
     assert.equal(auditResult.score, 1);
     assert.equal(auditResult.details.items.length, 0);
-    assert.equal(auditResult.details.items.length, 0);
   });
 
   it('passes when links have javascript in href attribute', () => {
@@ -81,26 +78,36 @@ describe('External anchors use rel="noopener"', () => {
   it('fails when links are from different hosts than the page host', () => {
     const auditResult = ExternalAnchorsAudit.audit({
       AnchorElements: [
-        {href: 'https://example.com/test', target: '_blank', rel: 'nofollow'},
-        {href: 'https://example.com/test1', target: '_blank', rel: ''},
+        {
+          href: 'https://example.com/test',
+          target: '_blank',
+          rel: 'nofollow',
+          devtoolsNodePath: 'devtools',
+        },
+        {
+          href: 'https://example.com/test1',
+          target: '_blank',
+          rel: '',
+          devtoolsNodePath: 'nodepath',
+        },
       ],
       URL: {finalUrl: URL},
     });
     assert.equal(auditResult.score, 0);
     assert.equal(auditResult.details.items.length, 2);
-    assert.equal(auditResult.details.items.length, 2);
+    assert.equal(auditResult.details.items[0].node.type, 'node');
+    assert.equal(auditResult.details.items[0].node.path, 'devtools');
+    assert.equal(auditResult.details.items[1].node.type, 'node');
+    assert.equal(auditResult.details.items[1].node.path, 'nodepath');
   });
 
   it('fails when links have no href attribute', () => {
     const auditResult = ExternalAnchorsAudit.audit({
-      AnchorElements: [
-        {href: '', target: '_blank', rel: ''},
-      ],
+      AnchorElements: [{href: '', target: '_blank', rel: ''}],
       URL: {finalUrl: URL},
     });
     assert.equal(auditResult.score, 0);
     assert.equal(auditResult.details.items.length, 1);
-    assert.equal(auditResult.details.items.length, 1);
     assert.ok(auditResult.warnings.length, 'includes warning');
   });
 
@@ -116,7 +123,6 @@ describe('External anchors use rel="noopener"', () => {
     });
     assert.equal(auditResult.score, 0);
     assert.equal(auditResult.details.items.length, 4);
-    assert.equal(auditResult.details.items.length, 4);
     assert.equal(auditResult.warnings.length, 4);
   });
 });
diff --git a/lighthouse-core/test/results/sample_v2.json b/lighthouse-core/test/results/sample_v2.json
index 27861221c..845d6bec3 100644
--- a/lighthouse-core/test/results/sample_v2.json
+++ b/lighthouse-core/test/results/sample_v2.json
@@ -2848,35 +2848,46 @@
         "type": "table",
         "headings": [
           {
-            "key": "href",
-            "itemType": "url",
-            "text": "URL"
-          },
-          {
-            "key": "target",
-            "itemType": "text",
-            "text": "Target"
-          },
-          {
-            "key": "rel",
-            "itemType": "text",
-            "text": "Rel"
+            "key": "node",
+            "itemType": "node",
+            "text": "Failing Anchors"
           }
         ],
         "items": [
           {
+            "node": {
+              "type": "node",
+              "path": "",
+              "selector": "",
+              "nodeLabel": "",
+              "snippet": "<a href=\"https://www.google.com/\" target=\"blank\">Hello</a>"
+            },
             "href": "https://www.google.com/",
             "target": "_blank",
             "rel": "",
             "outerHTML": "<a href=\"https://www.google.com/\" target=\"blank\">Hello</a>"
           },
           {
+            "node": {
+              "type": "node",
+              "path": "",
+              "selector": "",
+              "nodeLabel": "",
+              "snippet": "<a target=\"blank\">Hello</a>"
+            },
             "href": "Unknown",
             "target": "_blank",
             "rel": "",
             "outerHTML": "<a target=\"blank\">Hello</a>"
           },
           {
+            "node": {
+              "type": "node",
+              "path": "",
+              "selector": "",
+              "nodeLabel": "",
+              "snippet": "<a rel=\"nofollow\" href=\"https://www.google.com/\" target=\"blank\">Hello</a>"
+            },
             "href": "https://www.google.com/",
             "target": "_blank",
             "rel": "nofollow",
@@ -5600,7 +5611,6 @@
         "audits[unminified-javascript].details.headings[0].label",
         "audits[uses-webp-images].details.headings[1].label",
         "audits[uses-text-compression].details.headings[0].label",
-        "audits[external-anchors-use-rel-noopener].details.headings[0].text",
         "audits[geolocation-on-start].details.headings[0].text",
         "audits[no-document-write].details.headings[0].text",
         "audits[notification-on-start].details.headings[0].text",
@@ -6395,11 +6405,8 @@
           "path": "audits[external-anchors-use-rel-noopener].warnings[0]"
         }
       ],
-      "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnTarget": [
-        "audits[external-anchors-use-rel-noopener].details.headings[1].text"
-      ],
-      "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnRel": [
-        "audits[external-anchors-use-rel-noopener].details.headings[2].text"
+      "lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js | columnFailingAnchors": [
+        "audits[external-anchors-use-rel-noopener].details.headings[0].text"
       ],
       "lighthouse-core/audits/dobetterweb/geolocation-on-start.js | failureTitle": [
         "audits[geolocation-on-start].title"