Repository: DefinitelyTyped/dt-mergebot
Pull request #386 (2021-04-26 12:20:25)

Moves PRs which need manually accepting for CI to the DT maintainer action queue
New contributors to DT need to have their CI privileges set - this PR changes the DT mergebot to move those PRs directly into the maintainer's TODO list.

## Major additions:

* Switch from a GQL mutation to a REST api call for rerunning builds.
  See the source for the HACK comment re doing a REST call.

* Collect the IDs of *all* such tests, so they're all triggered, rather
  than just the first found.

* New `The CI is blocked` label if test runs need to be approved and
  this cannot be done automatically due to infra edits.

* When there are no infra edits, approve the build (by re-running it),
  and treat it as a test-in-progress.  In this case, mostly treat the CI
  state as `unknown` (still running) for the welcome message etc since
  it'll be started now.

* Add an `info.tooManyFiles` field that tracks when we didn't see all of
  the files, and:
  - `info.possiblyEditsInfra` is true if such edits exist *or* there are
    too many files so we can't be sure.  New `Possibly Edits
    Infrastructure` label reflects this.
  - add a prominent note to the welcome message when there are too many
    files, to alert DT maintainers.


orta: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/52586 would remove the other GH actions CI step which is what is allowing DT mergebot to think it's green right now
andrewbranch: To automatically approve, you can just rerequest each check suite whose `conclusion` is `ACTION_REQUIRED`: https://docs.github.com/en/graphql/reference/mutations#rerequestchecksuite

I would recommend doing this on the condition that no files outside the `types/` directory are added/removed/modified.

You can also do the same thing with the [REST API](https://docs.github.com/en/rest/reference/checks#rerequest-a-check-suite) if for some reason that’s easier, but you’ll need to use the `databaseId` property instead of the `id` property of the check suite as returned from the GraphQL API.

There’s also another way to do this at the [repo/actions/runs level with the REST API](https://docs.github.com/en/rest/reference/actions#re-run-a-workflow), but that’s not available via GraphQL mutation, and it’s also very difficult to figure out the check run id from the check suite (I don’t think it can even be retrieved with GraphQL at all), so I don’t recommend that.

Patch:
diff --git a/src/compute-pr-actions.ts b/src/compute-pr-actions.ts
index 04c6abf..906e752 100644
--- a/src/compute-pr-actions.ts
+++ b/src/compute-pr-actions.ts
@@ -29,6 +29,7 @@ export const LabelNames = [
     "Mergebot Error",
     "Has Merge Conflict",
     "The CI failed",
+    "The CI is blocked",
     "Revision needed",
     "New Definition",
     "Edits Owners",
@@ -40,12 +41,14 @@ export const LabelNames = [
     "Popular package",
     "Critical package",
     "Edits Infrastructure",
+    "Possibly Edits Infrastructure",
     "Edits multiple packages",
     "Author is Owner",
     "No Other Owners",
     "Too Many Owners",
     "Untested Change",
     "Check Config",
+    "Needs Actions Permission",
     ...StalenessKinds,
 ] as const;
 
@@ -56,6 +59,7 @@ export interface Actions {
     shouldClose: boolean;
     shouldMerge: boolean;
     shouldUpdateLabels: boolean;
+    reRunActionsCheckSuiteIDs?: number[];
 }
 
 function createDefaultActions(): Actions {
@@ -93,6 +97,7 @@ type ApproverKind = "maintainer" | "owner" | "other";
 interface ExtendedPrInfo extends PrInfo {
     readonly orig: PrInfo;
     readonly editsInfra: boolean;
+    readonly possiblyEditsInfra: boolean; // if we can't be sure since there's too many files
     readonly checkConfig: boolean;
     readonly authorIsOwner: boolean;
     readonly allOwners: string[];
@@ -113,6 +118,7 @@ interface ExtendedPrInfo extends PrInfo {
     readonly approvedBy: ApproverKind[];
     readonly hasChangereqs: boolean;
     readonly failedCI: boolean;
+    readonly blockedCI: boolean;
     readonly staleness?: Staleness;
     readonly packages: readonly string[];
     readonly hasMultiplePackages: boolean; // not counting infra files
@@ -130,6 +136,7 @@ function extendPrInfo(info: PrInfo): ExtendedPrInfo {
     const isAuthor = (user: string) => sameUser(user, info.author);
     const authorIsOwner = info.pkgInfo.every(p => p.owners.some(isAuthor));
     const editsInfra = info.pkgInfo.some(p => p.name === null);
+    const possiblyEditsInfra = editsInfra || info.tooManyFiles;
     const checkConfig = info.pkgInfo.some(p => p.files.some(f => f.kind === "package-meta"));
     const allOwners = unique(flatten(info.pkgInfo.map(p => p.owners)));
     const otherOwners = allOwners.filter(o => !isAuthor(o));
@@ -144,8 +151,8 @@ function extendPrInfo(info: PrInfo): ExtendedPrInfo {
     const newPackages = noNullish(info.pkgInfo.map(p => p.kind === "add" ? p.name : null));
     const hasNewPackages = newPackages.length > 0;
     const hasEditedPackages = packages.length > newPackages.length;
-    const requireMaintainer = editsInfra || checkConfig || hasMultiplePackages || isUntested || hasNewPackages || tooManyOwners;
-    const blessable = !(hasNewPackages || editsInfra || noOtherOwners);
+    const requireMaintainer = possiblyEditsInfra || checkConfig || hasMultiplePackages || isUntested || hasNewPackages || tooManyOwners;
+    const blessable = !(hasNewPackages || possiblyEditsInfra || noOtherOwners);
     const approvedReviews = info.reviews.filter(r => r.type === "approved") as ExtendedPrInfo["approvedReviews"];
     const changereqReviews = info.reviews.filter(r => r.type === "changereq") as ExtendedPrInfo["changereqReviews"];
     const staleReviews = info.reviews.filter(r => r.type === "stale") as ExtendedPrInfo["staleReviews"];
@@ -155,6 +162,9 @@ function extendPrInfo(info: PrInfo): ExtendedPrInfo {
     const approverKind = getApproverKind();
     const approved = getApproved();
     const failedCI = info.ciResult === "fail";
+    const blockedCI = info.ciResult === "action_required";
+    const ciResult = // override ciResult: treated as in-progress if it's approved (blockedCI distinguishes it from real unknown)
+        blockedCI && !possiblyEditsInfra ? "unknown" : info.ciResult;
     const canBeSelfMerged = info.ciResult === "pass" && !info.hasMergeConflict && approved;
     const hasValidMergeRequest = !!(info.mergeOfferDate && info.mergeRequestDate && info.mergeRequestDate > info.mergeOfferDate);
     const needsAuthorAction = failedCI || info.hasMergeConflict || hasChangereqs;
@@ -163,9 +173,10 @@ function extendPrInfo(info: PrInfo): ExtendedPrInfo {
     const reviewColumn = getReviewColumn();
     return {
         ...info, orig: info,
-        authorIsOwner, editsInfra, checkConfig, allOwners, otherOwners, noOtherOwners, tooManyOwners, editsOwners,
+        authorIsOwner, editsInfra, possiblyEditsInfra, checkConfig,
+        allOwners, otherOwners, noOtherOwners, tooManyOwners, editsOwners,
         canBeSelfMerged, hasValidMergeRequest, pendingCriticalPackages, approved, approverKind,
-        requireMaintainer, blessable, failedCI, staleness,
+        requireMaintainer, blessable, failedCI, blockedCI, ciResult, staleness,
         packages, hasMultiplePackages, hasDefinitions, hasTests, isUntested, newPackages, hasNewPackages, hasEditedPackages,
         approvedReviews, changereqReviews, staleReviews, approvedBy, hasChangereqs,
         needsAuthorAction, reviewColumn, isAuthor,
@@ -258,6 +269,7 @@ export function process(prInfo: BotResult,
     };
     label("Has Merge Conflict", info.hasMergeConflict);
     label("The CI failed", info.failedCI);
+    label("The CI is blocked", info.ciResult === "action_required");
     label("Revision needed", info.hasChangereqs);
     label("Critical package", info.popularityLevel === "Critical");
     label("Popular package", info.popularityLevel === "Popular");
@@ -269,6 +281,7 @@ export function process(prInfo: BotResult,
     label("New Definition", info.hasNewPackages);
     label("Edits Owners", info.editsOwners);
     label("Edits Infrastructure", info.editsInfra);
+    label("Possibly Edits Infrastructure", info.possiblyEditsInfra && !info.editsInfra);
     label("Edits multiple packages", info.hasMultiplePackages);
     label("Author is Owner", info.authorIsOwner);
     label("No Other Owners", info.hasEditedPackages && info.noOtherOwners);
@@ -297,8 +310,12 @@ export function process(prInfo: BotResult,
     // Some step should override this
     actions.projectColumn = "Other";
 
+    // First-timers are blocked from CI runs until approved, this case is for infra edits (require a maintainer)
+    if (info.ciResult === "action_required") {
+        actions.projectColumn = "Needs Maintainer Action";
+    }
     // Needs author attention (bad CI, merge conflicts)
-    if (info.needsAuthorAction) {
+    else if (info.needsAuthorAction) {
         actions.projectColumn = "Needs Author Action";
         if (info.hasMergeConflict) post(Comments.MergeConflicted(headCommitAbbrOid, info.author));
         if (info.failedCI) post(Comments.CIFailed(headCommitAbbrOid, info.author, info.ciUrl!));
@@ -307,6 +324,8 @@ export function process(prInfo: BotResult,
     // CI is running; default column is Waiting for Reviewers
     else if (info.ciResult === "unknown") {
         actions.projectColumn = "Waiting for Code Reviews";
+        if (info.blockedCI) // => we should approve the tests (by rerunning)
+            actions.reRunActionsCheckSuiteIDs = info.reRunCheckSuiteIDs || undefined;
     }
     // CI is missing
     else if (info.ciResult === "missing") {
@@ -408,9 +427,10 @@ function createWelcomeComment(info: ExtendedPrInfo, post: (c: Comments.Comment)
 
     if (info.isUntested) {
         post(Comments.SuggestTesting(info.author, testsLink));
-    } else if (info.editsInfra) {
+    } else if (info.possiblyEditsInfra) {
         display(``,
-                `This PR touches some part of DefinitelyTyped infrastructure, so ${requiredApprover} will need to review it. This is rare — did you mean to do this?`);
+                `This PR ${info.editsInfra ? "touches" : "might touch"} some part of DefinitelyTyped infrastructure, so ${
+                 requiredApprover} will need to review it. This is rare — did you mean to do this?`);
     }
 
     const announceList = (what: string, xs: readonly string[]) => `${xs.length} ${what}${xs.length !== 1 ? "s" : ""}`;
@@ -422,6 +442,10 @@ function createWelcomeComment(info: ExtendedPrInfo, post: (c: Comments.Comment)
     display(``,
             `## ${announceList("package", info.packages)} in this PR`,
             ``);
+    if (info.tooManyFiles) {
+        display(``,
+                `***Note: this PR touches too many files, and I didn't see all of them!***`);
+    }
     let addedSelfToManyOwners = 0;
     if (info.pkgInfo.length === 0) {
         display(`This PR is editing only infrastructure files!`);
diff --git a/src/emoji.ts b/src/emoji.ts
index 39be6c7..109d54e 100644
--- a/src/emoji.ts
+++ b/src/emoji.ts
@@ -8,6 +8,7 @@ export const result = (result: CIResult) => {
     switch (result) {
         case "fail": return { emoji: "❌", text: "have failed" };
         case "pass": return { emoji: "✅", text: "have passed" };
+        case "action_required": return { emoji: "🔐", text: "waiting for a maintainer to authorize a run" };
         case "unknown": return { emoji: "🕐", text: "are still running" };
         case "missing": return { emoji: "❓", text: "have gone missing" };
     }
diff --git a/src/execute-pr-actions.ts b/src/execute-pr-actions.ts
index d89d9fc..a4aacf3 100644
--- a/src/execute-pr-actions.ts
+++ b/src/execute-pr-actions.ts
@@ -7,6 +7,7 @@ import { getProjectBoardColumns, getLabels } from "./util/cachedQueries";
 import { noNullish, flatten } from "./util/util";
 import { tagsToDeleteIfNotPosted } from "./comments";
 import * as comment from "./util/comment";
+import { request } from "https";
 
 // https://github.com/DefinitelyTyped/DefinitelyTyped/projects/5
 const ProjectBoardNumber = 5;
@@ -20,12 +21,15 @@ export async function executePrActions(actions: Actions, pr: PR_repository_pullR
         ...getMutationsForCommentRemovals(actions, botComments),
         ...getMutationsForChangingPRState(actions, pr),
     ]);
+    const restCalls = getMutationsForReRunningCI(actions);
     if (!dry) {
         // Perform mutations one at a time
         for (const mutation of mutations)
             await client.mutate(mutation as MutationOptions<void, typeof mutations[number]["variables"]>);
+        for (const restCall of restCalls)
+            await doRestCall(restCall);
     }
-    return mutations;
+    return [...mutations, ...restCalls];
 }
 
 async function getMutationsForLabels(actions: Actions, pr: PR_repository_pullRequest) {
@@ -130,3 +134,36 @@ async function getLabelIdByName(name: string): Promise<string> {
     if (!res) throw new Error(`No label named "${name}" exists`);
     return res;
 }
+
+// *** HACK ***
+// A GQL mutation of `rerequestCheckSuite` throws an error that it's only
+// allowed from a GH app, but a `rerequest` rest call works fine.  So do a rest
+// call for now, and hopefully GH will have a better way of handling these
+// first-time contributors.  This whole mess should then turn to a GQL mutation,
+// or better, be removed if there's some repo settings to allow test builds
+// based on paths or something similar.
+
+type RestMutation = { method: string, op: string };
+
+function doRestCall(call: RestMutation): Promise<void> {
+    const url = `https://api.github.com/repos/DefinitelyTyped/DefinitelyTyped/${call.op}`;
+    const headers = {
+        "accept": "application/vnd.github.v3+json",
+        "authorization": `token ${process.env.BOT_AUTH_TOKEN}`,
+        "user-agent": "dt-mergebot"
+    };
+    return new Promise((resolve, reject) => {
+        const req = request(url, { method: call.method, headers }, reply => {
+            const bad = !reply.statusCode || reply.statusCode < 200 || reply.statusCode >= 300;
+            if (bad) return reject(`doRestCall failed with a status of ${reply.statusCode}`);
+            return resolve();
+        });
+        req.on("error", reject);
+        req.end();
+    });
+}
+
+function getMutationsForReRunningCI(actions: Actions) {
+    return (actions.reRunActionsCheckSuiteIDs || []).map(id =>
+        ({ method: "POST", op: `check-suites/${id}/rerequest` }));
+}
diff --git a/src/pr-info.ts b/src/pr-info.ts
index 8b0e77f..87be91a 100644
--- a/src/pr-info.ts
+++ b/src/pr-info.ts
@@ -68,7 +68,7 @@ export type ReviewInfo = {
     | { type: "stale", abbrOid: string }
 );
 
-export type CIResult = "unknown" | "pass" | "fail" | "missing";
+export type CIResult = "unknown" | "pass" | "fail" | "missing" | "action_required";
 
 export interface PrInfo {
     readonly type: "info";
@@ -98,6 +98,11 @@ export interface PrInfo {
      */
     readonly ciUrl?: string;
 
+    /**
+     * An ID for a check suite which could need re-running
+     */
+    readonly reRunCheckSuiteIDs?: number[];
+
     /**
      * True if the PR has a merge conflict
      */
@@ -131,6 +136,11 @@ export interface PrInfo {
 
     readonly isFirstContribution: boolean;
 
+    /*
+     * True if there are more files than we can fetch from the initial query
+     */
+    readonly tooManyFiles: boolean;
+
     readonly popularityLevel: PopularityLevel;
 
     readonly pkgInfo: readonly PackageInfo[];
@@ -200,6 +210,7 @@ export async function deriveStateForPR(
     const lastCommentDate = getLastCommentishActivityDate(prInfo);
     const lastBlessing = getLastMaintainerBlessingDate(prInfo.timelineItems);
     const reopenedDate = getReopenedDate(prInfo.timelineItems);
+    const tooManyFiles = prInfo.files?.totalCount !== prInfo.files?.nodes?.length;
 
     const pkgInfoEtc = await getPackageInfosEtc(
         noNullish(prInfo.files?.nodes).map(f => f.path).sort(),
@@ -227,6 +238,7 @@ export async function deriveStateForPR(
         mergeOfferDate, mergeRequestDate: mergeRequest?.date, mergeRequestUser: mergeRequest?.user,
         hasMergeConflict: prInfo.mergeable === "CONFLICTING",
         isFirstContribution,
+        tooManyFiles,
         popularityLevel,
         pkgInfo,
         reviews,
@@ -472,12 +484,20 @@ function getReviews(prInfo: PR_repository_pullRequest) {
     return reviews;
 }
 
-function getCIResult(checkSuites: PR_repository_pullRequest_commits_nodes_commit_checkSuites | null): { ciResult: CIResult, ciUrl?: string } {
+function getCIResult(checkSuites: PR_repository_pullRequest_commits_nodes_commit_checkSuites | null): { ciResult: CIResult, ciUrl?: string, reRunCheckSuiteIDs?: number[] } {
     const ghActionsChecks = checkSuites?.nodes?.filter(check => check?.app?.name.includes("GitHub Actions"));
+
+    // Freakin' crypto miners ruined GitHub Actions, and now we need to manually confirm new folks can run CI
+    const actionRequiredIDs = noNullish(ghActionsChecks?.map(check =>
+        check?.conclusion === "ACTION_REQUIRED" ? check.databaseId : null));
+    if (actionRequiredIDs.length > 0)
+        return { ciResult: "action_required", reRunCheckSuiteIDs: actionRequiredIDs };
+
     // Now that there is more than one GitHub Actions suite, we need to get the right one, but naively fall back
     // to the first if we can't find it, mostly to prevent breaking old tests.
     const totalStatusChecks = ghActionsChecks?.find(check => check?.checkRuns?.nodes?.[0]?.title === "test") || ghActionsChecks?.[0];
     if (!totalStatusChecks) return { ciResult: "missing", ciUrl: undefined };
+
     switch (totalStatusChecks.conclusion) {
         case "SUCCESS":
             return { ciResult: "pass" };
diff --git a/src/queries/pr-query.ts b/src/queries/pr-query.ts
index 3f2cb7f..704cee4 100644
--- a/src/queries/pr-query.ts
+++ b/src/queries/pr-query.ts
@@ -81,6 +81,7 @@ query PR($pr_number: Int!) {
             commit {
               checkSuites(first: 100) {
                 nodes {
+                  databaseId
                   app {
                     name
                   }
diff --git a/src/queries/schema/PR.ts b/src/queries/schema/PR.ts
index d412926..e2118ed 100644
--- a/src/queries/schema/PR.ts
+++ b/src/queries/schema/PR.ts
@@ -201,6 +201,10 @@ export interface PR_repository_pullRequest_commits_nodes_commit_checkSuites_node
 
 export interface PR_repository_pullRequest_commits_nodes_commit_checkSuites_nodes {
   __typename: "CheckSuite";
+  /**
+   * Identifies the primary key from the database.
+   */
+  databaseId: number | null;
   /**
    * The GitHub App which created this check suite.
    */


Test patch:
diff --git a/src/_tests/cachedQueries.json b/src/_tests/cachedQueries.json
index f397af0..a36a5f0 100644
--- a/src/_tests/cachedQueries.json
+++ b/src/_tests/cachedQueries.json
@@ -2,286 +2,296 @@
   "comment": "Generate & update with `npm run update-test-data`",
   "getProjectBoardColumns": [
     {
+      "__typename": "ProjectColumn",
       "id": "MDEzOlByb2plY3RDb2x1bW43NTUyOTI0",
-      "name": "Needs Author Action",
-      "__typename": "ProjectColumn"
+      "name": "Needs Author Action"
     },
     {
+      "__typename": "ProjectColumn",
       "id": "MDEzOlByb2plY3RDb2x1bW45ODY3MDA2",
-      "name": "Needs Maintainer Action",
-      "__typename": "ProjectColumn"
+      "name": "Needs Maintainer Action"
     },
     {
+      "__typename": "ProjectColumn",
       "id": "MDEzOlByb2plY3RDb2x1bW43NTUyOTIy",
-      "name": "Needs Maintainer Review",
-      "__typename": "ProjectColumn"
+      "name": "Needs Maintainer Review"
     },
     {
+      "__typename": "ProjectColumn",
       "id": "MDEzOlByb2plY3RDb2x1bW43NTUyOTI2",
-      "name": "Other",
-      "__typename": "ProjectColumn"
+      "name": "Other"
     },
     {
+      "__typename": "ProjectColumn",
       "id": "MDEzOlByb2plY3RDb2x1bW43NTUyOTI1",
-      "name": "Recently Merged",
-      "__typename": "ProjectColumn"
+      "name": "Recently Merged"
     },
     {
+      "__typename": "ProjectColumn",
       "id": "MDEzOlByb2plY3RDb2x1bW43NTUyOTIz",
-      "name": "Waiting for Author to Merge",
-      "__typename": "ProjectColumn"
+      "name": "Waiting for Author to Merge"
     },
     {
+      "__typename": "ProjectColumn",
       "id": "MDEzOlByb2plY3RDb2x1bW43NTUyOTMw",
-      "name": "Waiting for Code Reviews",
-      "__typename": "ProjectColumn"
+      "name": "Waiting for Code Reviews"
     }
   ],
   "getLabels": [
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw0MDUzNDEwNjk=",
-      "name": "@types",
-      "__typename": "Label"
+      "name": "@types"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw2NDQxMTYxNzA=",
-      "name": "Abandoned",
-      "__typename": "Label"
+      "name": "Abandoned"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw3OTg3Mzc0Nzg=",
-      "name": "Author is Owner",
-      "__typename": "Label"
+      "name": "Author is Owner"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMTU0ODE2NTQ5",
-      "name": "Check Config",
-      "__typename": "Label"
+      "name": "Check Config"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNjA4NjM0NDg0",
-      "name": "Critical package",
-      "__typename": "Label"
+      "name": "Critical package"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNTY4Nzg5MA==",
-      "name": "Definition:Bug",
-      "__typename": "Label"
+      "name": "Definition:Bug"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw4ODk3OTYxOA==",
-      "name": "Definition:Creating",
-      "__typename": "Label"
+      "name": "Definition:Creating"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNTY4Nzg5Mg==",
-      "name": "Definition:Enhancement",
-      "__typename": "Label"
+      "name": "Definition:Enhancement"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyOTM4NjAwOA==",
-      "name": "Definition:Missing",
-      "__typename": "Label"
+      "name": "Definition:Missing"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMzcwODQxMw==",
-      "name": "Definition:Request",
-      "__typename": "Label"
+      "name": "Definition:Request"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMTg2MTM4MjI0",
-      "name": "dependencies",
-      "__typename": "Label"
+      "name": "dependencies"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw1NjcxNzAyMQ==",
-      "name": "Discussion",
-      "__typename": "Label"
+      "name": "Discussion"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw3NTcxMTk0Ng==",
-      "name": "Documents",
-      "__typename": "Label"
+      "name": "Documents"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwzMDI2OTUyNQ==",
-      "name": "Duplicate",
-      "__typename": "Label"
+      "name": "Duplicate"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNjA4MjA4ODM1",
-      "name": "Edits Infrastructure",
-      "__typename": "Label"
+      "name": "Edits Infrastructure"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNjA4MjEwODMz",
-      "name": "Edits multiple packages",
-      "__typename": "Label"
+      "name": "Edits multiple packages"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyNDk1OTc2ODI5",
-      "name": "Edits Owners",
-      "__typename": "Label"
+      "name": "Edits Owners"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw1ODMyOTQ0NzQ=",
-      "name": "Has Merge Conflict",
-      "__typename": "Label"
+      "name": "Has Merge Conflict"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwzMDI2OTc0NQ==",
-      "name": "Infrastructure",
-      "__typename": "Label"
+      "name": "Infrastructure"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwzMDI2OTUzOA==",
-      "name": "invalid",
-      "__typename": "Label"
+      "name": "invalid"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw1NjcxNDU5MQ==",
-      "name": "Level:Advanced",
-      "__typename": "Label"
+      "name": "Level:Advanced"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw1NjcxNDU3Mg==",
-      "name": "Level:Intermediate",
-      "__typename": "Label"
+      "name": "Level:Intermediate"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw1NjcxNDU3MQ==",
-      "name": "Level:Starter",
-      "__typename": "Label"
+      "name": "Level:Starter"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNjA4NTUyNDEw",
-      "name": "Maintainer Approved",
-      "__typename": "Label"
+      "name": "Maintainer Approved"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMTk3MzU2OTA1",
-      "name": "Mergebot Error",
-      "__typename": "Label"
+      "name": "Mergebot Error"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyNTI5Mjc2Njc2",
-      "name": "Multiple Languages",
-      "__typename": "Label"
+      "name": "Multiple Languages"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw2NDY3ODg4ODg=",
-      "name": "New Definition",
-      "__typename": "Label"
+      "name": "New Definition"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMTU0ODU3ODAw",
-      "name": "No Other Owners",
-      "__typename": "Label"
+      "name": "No Other Owners"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw1ODYxNzcwNjM=",
-      "name": "Other Approved",
-      "__typename": "Label"
+      "name": "Other Approved"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw5MDUzMzQwOTU=",
-      "name": "Owner Approved",
-      "__typename": "Label"
+      "name": "Owner Approved"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNTk2MTk1ODI0",
-      "name": "Perf: Better",
-      "__typename": "Label"
+      "name": "Perf: Better"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNTk2MTk4NTgw",
-      "name": "Perf: Mixed",
-      "__typename": "Label"
+      "name": "Perf: Mixed"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNTk2MTk0NzQ0",
-      "name": "Perf: Same",
-      "__typename": "Label"
+      "name": "Perf: Same"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNTk2MTk5Mjg2",
-      "name": "Perf: Worse",
-      "__typename": "Label"
+      "name": "Perf: Worse"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw2ODQzMjE1NzY=",
-      "name": "Popular package",
-      "__typename": "Label"
+      "name": "Popular package"
     },
     {
+      "__typename": "Label",
+      "id": "MDU6TGFiZWwyOTUzOTk4NzE4",
+      "name": "Possibly Edits Infrastructure"
+    },
+    {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwxNTY4Nzg5NA==",
-      "name": "Question",
-      "__typename": "Label"
+      "name": "Question"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwzOTU2NzkwNTk=",
-      "name": "Revision needed",
-      "__typename": "Label"
+      "name": "Revision needed"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw2OTcwMTg5NzI=",
-      "name": "Self Merge",
-      "__typename": "Label"
+      "name": "Self Merge"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw1NjcxNDI1Mg==",
-      "name": "Target:Browser",
-      "__typename": "Label"
+      "name": "Target:Browser"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw1NjcxNDI0NQ==",
-      "name": "Target:NodeJS",
-      "__typename": "Label"
+      "name": "Target:NodeJS"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMDk2NzQzNjAw",
-      "name": "The CI failed",
-      "__typename": "Label"
+      "name": "The CI failed"
+    },
+    {
+      "__typename": "Label",
+      "id": "MDU6TGFiZWwyOTUzOTk2NDAx",
+      "name": "The CI is blocked"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMTU2MzIyMzcx",
-      "name": "Too Many Owners",
-      "__typename": "Label"
+      "name": "Too Many Owners"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwzMjAzMjg3Mg==",
-      "name": "TypeScript-Core",
-      "__typename": "Label"
+      "name": "TypeScript-Core"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw2NDQwOTUzNDI=",
-      "name": "Unmergeable",
-      "__typename": "Label"
+      "name": "Unmergeable"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw2NDQwOTU4ODI=",
-      "name": "Unmerged",
-      "__typename": "Label"
+      "name": "Unmerged"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWw2NDY3ODkyMDU=",
-      "name": "Unowned",
-      "__typename": "Label"
+      "name": "Unowned"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyNDYyODA0MzE1",
-      "name": "Unreviewed",
-      "__typename": "Label"
+      "name": "Unreviewed"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMTU0NzUwNDcz",
-      "name": "Untested Change",
-      "__typename": "Label"
+      "name": "Untested Change"
     },
     {
+      "__typename": "Label",
       "id": "MDU6TGFiZWwyMDk2NzQ1NzQx",
-      "name": "Where is GH Actions?",
-      "__typename": "Label"
+      "name": "Where is GH Actions?"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/_tests/fixtures/38979/derived.json b/src/_tests/fixtures/38979/derived.json
index 696c571..a1ec89d 100644
--- a/src/_tests/fixtures/38979/derived.json
+++ b/src/_tests/fixtures/38979/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43136/derived.json b/src/_tests/fixtures/43136/derived.json
index 9e13ecf..44f1a23 100644
--- a/src/_tests/fixtures/43136/derived.json
+++ b/src/_tests/fixtures/43136/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43144/derived.json b/src/_tests/fixtures/43144/derived.json
index 33676f1..fb0f95d 100644
--- a/src/_tests/fixtures/43144/derived.json
+++ b/src/_tests/fixtures/43144/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43151/derived.json b/src/_tests/fixtures/43151/derived.json
index 33466bb..f0f14cb 100644
--- a/src/_tests/fixtures/43151/derived.json
+++ b/src/_tests/fixtures/43151/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43160/derived.json b/src/_tests/fixtures/43160/derived.json
index 43f5dda..c3ecf29 100644
--- a/src/_tests/fixtures/43160/derived.json
+++ b/src/_tests/fixtures/43160/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43175/derived.json b/src/_tests/fixtures/43175/derived.json
index e8fca30..3d24edc 100644
--- a/src/_tests/fixtures/43175/derived.json
+++ b/src/_tests/fixtures/43175/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43235/derived.json b/src/_tests/fixtures/43235/derived.json
index 0627d8d..be35993 100644
--- a/src/_tests/fixtures/43235/derived.json
+++ b/src/_tests/fixtures/43235/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43314/derived.json b/src/_tests/fixtures/43314/derived.json
index db8d41a..b592c21 100644
--- a/src/_tests/fixtures/43314/derived.json
+++ b/src/_tests/fixtures/43314/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43695-duplicate-comment/derived.json b/src/_tests/fixtures/43695-duplicate-comment/derived.json
index 3989bfc..b73e1f8 100644
--- a/src/_tests/fixtures/43695-duplicate-comment/derived.json
+++ b/src/_tests/fixtures/43695-duplicate-comment/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43695-post-review/derived.json b/src/_tests/fixtures/43695-post-review/derived.json
index e1238dd..a79c2e7 100644
--- a/src/_tests/fixtures/43695-post-review/derived.json
+++ b/src/_tests/fixtures/43695-post-review/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43695/derived.json b/src/_tests/fixtures/43695/derived.json
index 9a31f75..9fe9e1f 100644
--- a/src/_tests/fixtures/43695/derived.json
+++ b/src/_tests/fixtures/43695/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/43960/derived.json b/src/_tests/fixtures/43960/derived.json
index ea4a7ae..7912fe5 100644
--- a/src/_tests/fixtures/43960/derived.json
+++ b/src/_tests/fixtures/43960/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44267/derived.json b/src/_tests/fixtures/44267/derived.json
index 66b5532..82bc7ef 100644
--- a/src/_tests/fixtures/44267/derived.json
+++ b/src/_tests/fixtures/44267/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44282/derived.json b/src/_tests/fixtures/44282/derived.json
index 81d5ac0..93369e8 100644
--- a/src/_tests/fixtures/44282/derived.json
+++ b/src/_tests/fixtures/44282/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44288/derived.json b/src/_tests/fixtures/44288/derived.json
index 61367fb..e73a1a7 100644
--- a/src/_tests/fixtures/44288/derived.json
+++ b/src/_tests/fixtures/44288/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44299-with-files/derived.json b/src/_tests/fixtures/44299-with-files/derived.json
index c2f3a86..d7f0747 100644
--- a/src/_tests/fixtures/44299-with-files/derived.json
+++ b/src/_tests/fixtures/44299-with-files/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44299/derived.json b/src/_tests/fixtures/44299/derived.json
index c2f3a86..d7f0747 100644
--- a/src/_tests/fixtures/44299/derived.json
+++ b/src/_tests/fixtures/44299/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44316/derived.json b/src/_tests/fixtures/44316/derived.json
index 2cb7a3e..04d66f1 100644
--- a/src/_tests/fixtures/44316/derived.json
+++ b/src/_tests/fixtures/44316/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44343-pending-travis/derived.json b/src/_tests/fixtures/44343-pending-travis/derived.json
index 7d3d2e4..d0539c7 100644
--- a/src/_tests/fixtures/44343-pending-travis/derived.json
+++ b/src/_tests/fixtures/44343-pending-travis/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44343-pre-travis/derived.json b/src/_tests/fixtures/44343-pre-travis/derived.json
index 7d3d2e4..d0539c7 100644
--- a/src/_tests/fixtures/44343-pre-travis/derived.json
+++ b/src/_tests/fixtures/44343-pre-travis/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44343/derived.json b/src/_tests/fixtures/44343/derived.json
index f6e7359..0207fb3 100644
--- a/src/_tests/fixtures/44343/derived.json
+++ b/src/_tests/fixtures/44343/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44402/derived.json b/src/_tests/fixtures/44402/derived.json
index 3e58925..30fc91f 100644
--- a/src/_tests/fixtures/44402/derived.json
+++ b/src/_tests/fixtures/44402/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44411/derived.json b/src/_tests/fixtures/44411/derived.json
index ac39a51..bf5a6ac 100644
--- a/src/_tests/fixtures/44411/derived.json
+++ b/src/_tests/fixtures/44411/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44424-1-travis-instantly-finished/derived.json b/src/_tests/fixtures/44424-1-travis-instantly-finished/derived.json
index ea2b0ba..a2a48ec 100644
--- a/src/_tests/fixtures/44424-1-travis-instantly-finished/derived.json
+++ b/src/_tests/fixtures/44424-1-travis-instantly-finished/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": true,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44424-1-travis-instantly-finished/mutations.json b/src/_tests/fixtures/44424-1-travis-instantly-finished/mutations.json
index 609ed60..90f7058 100644
--- a/src/_tests/fixtures/44424-1-travis-instantly-finished/mutations.json
+++ b/src/_tests/fixtures/44424-1-travis-instantly-finished/mutations.json
@@ -1,4 +1,15 @@
 [
+  {
+    "mutation": "mutation ($input: AddLabelsToLabelableInput!) {\n  addLabelsToLabelable(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "labelIds": [
+          "MDU6TGFiZWwyOTUzOTk4NzE4"
+        ],
+        "labelableId": "MDExOlB1bGxSZXF1ZXN0NDEyMjY1MDE2"
+      }
+    }
+  },
   {
     "mutation": "mutation ($input: RemoveLabelsFromLabelableInput!) {\n  removeLabelsFromLabelable(input: $input) {\n    __typename\n  }\n}\n",
     "variables": {
@@ -10,12 +21,21 @@
       }
     }
   },
+  {
+    "mutation": "mutation ($input: MoveProjectCardInput!) {\n  moveProjectCard(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "cardId": "MDExOlByb2plY3RDYXJkMzczOTYzMTI=",
+        "columnId": "MDEzOlByb2plY3RDb2x1bW45ODY3MDA2"
+      }
+    }
+  },
   {
     "mutation": "mutation ($input: UpdateIssueCommentInput!) {\n  updateIssueComment(input: $input) {\n    __typename\n  }\n}\n",
     "variables": {
       "input": {
         "id": "MDEyOklzc3VlQ29tbWVudDYyMjUyNzAxNQ==",
-        "body": "@tomer-openfin Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `openfin` [on npm](https://www.npmjs.com/package/openfin), [on unpkg](https://unpkg.com/browse/openfin@latest/) (author is owner)\n\n## Code Reviews\n\nBecause you edited one package and updated the tests (👏), I can help you merge this PR once someone else signs off on it.\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Most recent commit is approved by type definition owners, DT maintainers or others\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
+        "body": "@tomer-openfin Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\nThis PR might touch some part of DefinitelyTyped infrastructure, so a DT maintainer will need to review it. This is rare — did you mean to do this?\n\n## 1 package in this PR\n\n\n***Note: this PR touches too many files, and I didn't see all of them!***\n* `openfin` [on npm](https://www.npmjs.com/package/openfin), [on unpkg](https://unpkg.com/browse/openfin@latest/) (author is owner)\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
       }
     }
   }
diff --git a/src/_tests/fixtures/44424-1-travis-instantly-finished/result.json b/src/_tests/fixtures/44424-1-travis-instantly-finished/result.json
index 0717ea8..0b58782 100644
--- a/src/_tests/fixtures/44424-1-travis-instantly-finished/result.json
+++ b/src/_tests/fixtures/44424-1-travis-instantly-finished/result.json
@@ -1,12 +1,13 @@
 {
-  "projectColumn": "Waiting for Code Reviews",
+  "projectColumn": "Needs Maintainer Action",
   "labels": [
+    "Possibly Edits Infrastructure",
     "Author is Owner"
   ],
   "responseComments": [
     {
       "tag": "welcome",
-      "status": "@tomer-openfin Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `openfin` [on npm](https://www.npmjs.com/package/openfin), [on unpkg](https://unpkg.com/browse/openfin@latest/) (author is owner)\n\n## Code Reviews\n\nBecause you edited one package and updated the tests (👏), I can help you merge this PR once someone else signs off on it.\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Most recent commit is approved by type definition owners, DT maintainers or others\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ..."
+      "status": "@tomer-openfin Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\nThis PR might touch some part of DefinitelyTyped infrastructure, so a DT maintainer will need to review it. This is rare — did you mean to do this?\n\n## 1 package in this PR\n\n\n***Note: this PR touches too many files, and I didn't see all of them!***\n* `openfin` [on npm](https://www.npmjs.com/package/openfin), [on unpkg](https://unpkg.com/browse/openfin@latest/) (author is owner)\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ..."
     },
     {
       "tag": "pinging-reviewers",
diff --git a/src/_tests/fixtures/44424-2-after-travis-second/derived.json b/src/_tests/fixtures/44424-2-after-travis-second/derived.json
index 63a1da2..e717d42 100644
--- a/src/_tests/fixtures/44424-2-after-travis-second/derived.json
+++ b/src/_tests/fixtures/44424-2-after-travis-second/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": true,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44424-2-after-travis-second/mutations.json b/src/_tests/fixtures/44424-2-after-travis-second/mutations.json
index ebd5220..bb7a309 100644
--- a/src/_tests/fixtures/44424-2-after-travis-second/mutations.json
+++ b/src/_tests/fixtures/44424-2-after-travis-second/mutations.json
@@ -1,4 +1,15 @@
 [
+  {
+    "mutation": "mutation ($input: AddLabelsToLabelableInput!) {\n  addLabelsToLabelable(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "labelIds": [
+          "MDU6TGFiZWwyOTUzOTk4NzE4"
+        ],
+        "labelableId": "MDExOlB1bGxSZXF1ZXN0NDEyMjY1MDE2"
+      }
+    }
+  },
   {
     "mutation": "mutation ($input: RemoveLabelsFromLabelableInput!) {\n  removeLabelsFromLabelable(input: $input) {\n    __typename\n  }\n}\n",
     "variables": {
@@ -15,7 +26,7 @@
     "variables": {
       "input": {
         "id": "MDEyOklzc3VlQ29tbWVudDYyMjUyNzAxNQ==",
-        "body": "@tomer-openfin Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `openfin` [on npm](https://www.npmjs.com/package/openfin), [on unpkg](https://unpkg.com/browse/openfin@latest/) (author is owner)\n\n## Code Reviews\n\nBecause you edited one package and updated the tests (👏), I can help you merge this PR once someone else signs off on it.\n\n## Status\n\n * ✅ No merge conflicts\n * 🕐 Continuous integration tests are still running\n * 🕐 Most recent commit is approved by type definition owners, DT maintainers or others\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
+        "body": "@tomer-openfin Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\nThis PR might touch some part of DefinitelyTyped infrastructure, so a DT maintainer will need to review it. This is rare — did you mean to do this?\n\n## 1 package in this PR\n\n\n***Note: this PR touches too many files, and I didn't see all of them!***\n* `openfin` [on npm](https://www.npmjs.com/package/openfin), [on unpkg](https://unpkg.com/browse/openfin@latest/) (author is owner)\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\n## Status\n\n * ✅ No merge conflicts\n * 🕐 Continuous integration tests are still running\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
       }
     }
   }
diff --git a/src/_tests/fixtures/44424-2-after-travis-second/result.json b/src/_tests/fixtures/44424-2-after-travis-second/result.json
index a30a426..ac3412d 100644
--- a/src/_tests/fixtures/44424-2-after-travis-second/result.json
+++ b/src/_tests/fixtures/44424-2-after-travis-second/result.json
@@ -1,12 +1,13 @@
 {
   "projectColumn": "Waiting for Code Reviews",
   "labels": [
+    "Possibly Edits Infrastructure",
     "Author is Owner"
   ],
   "responseComments": [
     {
       "tag": "welcome",
-      "status": "@tomer-openfin Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `openfin` [on npm](https://www.npmjs.com/package/openfin), [on unpkg](https://unpkg.com/browse/openfin@latest/) (author is owner)\n\n## Code Reviews\n\nBecause you edited one package and updated the tests (👏), I can help you merge this PR once someone else signs off on it.\n\n## Status\n\n * ✅ No merge conflicts\n * 🕐 Continuous integration tests are still running\n * 🕐 Most recent commit is approved by type definition owners, DT maintainers or others\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ..."
+      "status": "@tomer-openfin Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\nThis PR might touch some part of DefinitelyTyped infrastructure, so a DT maintainer will need to review it. This is rare — did you mean to do this?\n\n## 1 package in this PR\n\n\n***Note: this PR touches too many files, and I didn't see all of them!***\n* `openfin` [on npm](https://www.npmjs.com/package/openfin), [on unpkg](https://unpkg.com/browse/openfin@latest/) (author is owner)\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\n## Status\n\n * ✅ No merge conflicts\n * 🕐 Continuous integration tests are still running\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ..."
     },
     {
       "tag": "pinging-reviewers",
diff --git a/src/_tests/fixtures/44437/derived.json b/src/_tests/fixtures/44437/derived.json
index 9af7b5e..663f7d0 100644
--- a/src/_tests/fixtures/44437/derived.json
+++ b/src/_tests/fixtures/44437/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-05-02T12:19:18.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44439/derived.json b/src/_tests/fixtures/44439/derived.json
index 3d0703c..1d229d0 100644
--- a/src/_tests/fixtures/44439/derived.json
+++ b/src/_tests/fixtures/44439/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44631/derived.json b/src/_tests/fixtures/44631/derived.json
index a344435..370bc6a 100644
--- a/src/_tests/fixtures/44631/derived.json
+++ b/src/_tests/fixtures/44631/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-05-15T15:41:43.000Z",
   "hasMergeConflict": true,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44857/derived.json b/src/_tests/fixtures/44857/derived.json
index 4815586..36e5f31 100644
--- a/src/_tests/fixtures/44857/derived.json
+++ b/src/_tests/fixtures/44857/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44989-14days/derived.json b/src/_tests/fixtures/44989-14days/derived.json
index ff0ad2e..668a4d0 100644
--- a/src/_tests/fixtures/44989-14days/derived.json
+++ b/src/_tests/fixtures/44989-14days/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-05-23T10:05:30.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44989-32days/derived.json b/src/_tests/fixtures/44989-32days/derived.json
index ac0f4d4..18672ea 100644
--- a/src/_tests/fixtures/44989-32days/derived.json
+++ b/src/_tests/fixtures/44989-32days/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-05-23T10:05:30.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44989-3days/derived.json b/src/_tests/fixtures/44989-3days/derived.json
index 3d005b7..c61eff8 100644
--- a/src/_tests/fixtures/44989-3days/derived.json
+++ b/src/_tests/fixtures/44989-3days/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-05-23T10:05:30.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/44989-7days/derived.json b/src/_tests/fixtures/44989-7days/derived.json
index afbf11d..a8937cf 100644
--- a/src/_tests/fixtures/44989-7days/derived.json
+++ b/src/_tests/fixtures/44989-7days/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-05-23T10:05:30.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/45137/derived.json b/src/_tests/fixtures/45137/derived.json
index 37d7d08..0b3261a 100644
--- a/src/_tests/fixtures/45137/derived.json
+++ b/src/_tests/fixtures/45137/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/45627/derived.json b/src/_tests/fixtures/45627/derived.json
index 58b4adf..ebf8071 100644
--- a/src/_tests/fixtures/45627/derived.json
+++ b/src/_tests/fixtures/45627/derived.json
@@ -12,6 +12,7 @@
   "mergeRequestUser": "spamshaker",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/45836/derived.json b/src/_tests/fixtures/45836/derived.json
index 4408cf1..2f89878 100644
--- a/src/_tests/fixtures/45836/derived.json
+++ b/src/_tests/fixtures/45836/derived.json
@@ -12,6 +12,7 @@
   "mergeRequestUser": "mmorearty",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/45884/derived.json b/src/_tests/fixtures/45884/derived.json
index ad039ab..ea33ee0 100644
--- a/src/_tests/fixtures/45884/derived.json
+++ b/src/_tests/fixtures/45884/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-07-06T06:51:10.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/45888/derived.json b/src/_tests/fixtures/45888/derived.json
index f29f1bf..1356dde 100644
--- a/src/_tests/fixtures/45888/derived.json
+++ b/src/_tests/fixtures/45888/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": true,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/45890/derived.json b/src/_tests/fixtures/45890/derived.json
index c214555..9bf1ad9 100644
--- a/src/_tests/fixtures/45890/derived.json
+++ b/src/_tests/fixtures/45890/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/45946/derived.json b/src/_tests/fixtures/45946/derived.json
index 45f6083..3d21710 100644
--- a/src/_tests/fixtures/45946/derived.json
+++ b/src/_tests/fixtures/45946/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/45999/derived.json b/src/_tests/fixtures/45999/derived.json
index 08b55b9..c576175 100644
--- a/src/_tests/fixtures/45999/derived.json
+++ b/src/_tests/fixtures/45999/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": true,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/46008/derived.json b/src/_tests/fixtures/46008/derived.json
index 021669e..9daff42 100644
--- a/src/_tests/fixtures/46008/derived.json
+++ b/src/_tests/fixtures/46008/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": true,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/46019/derived.json b/src/_tests/fixtures/46019/derived.json
index 7cb8734..db291be 100644
--- a/src/_tests/fixtures/46019/derived.json
+++ b/src/_tests/fixtures/46019/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-07-12T04:07:31.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/46120/derived.json b/src/_tests/fixtures/46120/derived.json
index e846657..ee13bcf 100644
--- a/src/_tests/fixtures/46120/derived.json
+++ b/src/_tests/fixtures/46120/derived.json
@@ -11,6 +11,7 @@
   "mergeRequestUser": "reubenrybnik",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/46191/derived.json b/src/_tests/fixtures/46191/derived.json
index dc26c2b..c4f9d92 100644
--- a/src/_tests/fixtures/46191/derived.json
+++ b/src/_tests/fixtures/46191/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/46196/derived.json b/src/_tests/fixtures/46196/derived.json
index 58c46c4..23010c8 100644
--- a/src/_tests/fixtures/46196/derived.json
+++ b/src/_tests/fixtures/46196/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/46279/derived.json b/src/_tests/fixtures/46279/derived.json
index 668850c..7955ab3 100644
--- a/src/_tests/fixtures/46279/derived.json
+++ b/src/_tests/fixtures/46279/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": true,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/46804/derived.json b/src/_tests/fixtures/46804/derived.json
index 11549a1..abac2c2 100644
--- a/src/_tests/fixtures/46804/derived.json
+++ b/src/_tests/fixtures/46804/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": true,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/46879/derived.json b/src/_tests/fixtures/46879/derived.json
index ccd4404..27641f9 100644
--- a/src/_tests/fixtures/46879/derived.json
+++ b/src/_tests/fixtures/46879/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Popular",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/47017-blessed-and-one-owner/derived.json b/src/_tests/fixtures/47017-blessed-and-one-owner/derived.json
index 7835ffb..fddee39 100644
--- a/src/_tests/fixtures/47017-blessed-and-one-owner/derived.json
+++ b/src/_tests/fixtures/47017-blessed-and-one-owner/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": true,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/47017-blessed-and-two-owner/derived.json b/src/_tests/fixtures/47017-blessed-and-two-owner/derived.json
index 39a59f1..8635a0c 100644
--- a/src/_tests/fixtures/47017-blessed-and-two-owner/derived.json
+++ b/src/_tests/fixtures/47017-blessed-and-two-owner/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": true,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/47017-blessed/derived.json b/src/_tests/fixtures/47017-blessed/derived.json
index 9ebf710..00622a4 100644
--- a/src/_tests/fixtures/47017-blessed/derived.json
+++ b/src/_tests/fixtures/47017-blessed/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": true,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/47017/derived.json b/src/_tests/fixtures/47017/derived.json
index bc2f8c1..41ea88f 100644
--- a/src/_tests/fixtures/47017/derived.json
+++ b/src/_tests/fixtures/47017/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/48216/derived.json b/src/_tests/fixtures/48216/derived.json
index 3b117bb..b29a019 100644
--- a/src/_tests/fixtures/48216/derived.json
+++ b/src/_tests/fixtures/48216/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/48236/derived.json b/src/_tests/fixtures/48236/derived.json
index bb94b65..12cb6bc 100644
--- a/src/_tests/fixtures/48236/derived.json
+++ b/src/_tests/fixtures/48236/derived.json
@@ -12,6 +12,7 @@
   "mergeRequestUser": "jablko",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/48652-merge-offer/derived.json b/src/_tests/fixtures/48652-merge-offer/derived.json
index c5bf827..3a61527 100644
--- a/src/_tests/fixtures/48652-merge-offer/derived.json
+++ b/src/_tests/fixtures/48652-merge-offer/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/48652-prereq/derived.json b/src/_tests/fixtures/48652-prereq/derived.json
index 2277a5f..427ef9f 100644
--- a/src/_tests/fixtures/48652-prereq/derived.json
+++ b/src/_tests/fixtures/48652-prereq/derived.json
@@ -11,6 +11,7 @@
   "mergeRequestUser": "mgol",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/48652-retract-merge-offer-and-prerequest/derived.json b/src/_tests/fixtures/48652-retract-merge-offer-and-prerequest/derived.json
index bc4b839..430a433 100644
--- a/src/_tests/fixtures/48652-retract-merge-offer-and-prerequest/derived.json
+++ b/src/_tests/fixtures/48652-retract-merge-offer-and-prerequest/derived.json
@@ -12,6 +12,7 @@
   "mergeRequestUser": "mgol",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/48652-retract-merge-offer/derived.json b/src/_tests/fixtures/48652-retract-merge-offer/derived.json
index f4f3b69..c3e1583 100644
--- a/src/_tests/fixtures/48652-retract-merge-offer/derived.json
+++ b/src/_tests/fixtures/48652-retract-merge-offer/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-11-04T00:23:45.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/48708/derived.json b/src/_tests/fixtures/48708/derived.json
index 277ee1f..f4cd442 100644
--- a/src/_tests/fixtures/48708/derived.json
+++ b/src/_tests/fixtures/48708/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/48945/derived.json b/src/_tests/fixtures/48945/derived.json
index 47836b0..07670a7 100644
--- a/src/_tests/fixtures/48945/derived.json
+++ b/src/_tests/fixtures/48945/derived.json
@@ -10,6 +10,7 @@
   "mergeOfferDate": "2020-10-20T11:35:45.000Z",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/49417/derived.json b/src/_tests/fixtures/49417/derived.json
index 23d7115..3ad77d7 100644
--- a/src/_tests/fixtures/49417/derived.json
+++ b/src/_tests/fixtures/49417/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/49548/derived.json b/src/_tests/fixtures/49548/derived.json
index 38a3f7f..7a7fc08 100644
--- a/src/_tests/fixtures/49548/derived.json
+++ b/src/_tests/fixtures/49548/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/49575/derived.json b/src/_tests/fixtures/49575/derived.json
index cdb6ff5..3188949 100644
--- a/src/_tests/fixtures/49575/derived.json
+++ b/src/_tests/fixtures/49575/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/49841/derived.json b/src/_tests/fixtures/49841/derived.json
index 128dd7d..0b2459f 100644
--- a/src/_tests/fixtures/49841/derived.json
+++ b/src/_tests/fixtures/49841/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/50429/derived.json b/src/_tests/fixtures/50429/derived.json
index c7090fa..a78fd29 100644
--- a/src/_tests/fixtures/50429/derived.json
+++ b/src/_tests/fixtures/50429/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": true,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/50443/derived.json b/src/_tests/fixtures/50443/derived.json
index 8d30d3a..cf2ac0b 100644
--- a/src/_tests/fixtures/50443/derived.json
+++ b/src/_tests/fixtures/50443/derived.json
@@ -12,6 +12,7 @@
   "mergeRequestUser": "shockdevv",
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Well-liked by everyone",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/51338/derived.json b/src/_tests/fixtures/51338/derived.json
index 9fff5f7..3ebb3ff 100644
--- a/src/_tests/fixtures/51338/derived.json
+++ b/src/_tests/fixtures/51338/derived.json
@@ -9,6 +9,7 @@
   "maintainerBlessed": false,
   "hasMergeConflict": false,
   "isFirstContribution": false,
+  "tooManyFiles": false,
   "popularityLevel": "Critical",
   "pkgInfo": [
     {
diff --git a/src/_tests/fixtures/52579-edits-infra/_downloads.json b/src/_tests/fixtures/52579-edits-infra/_downloads.json
new file mode 100644
index 0000000..b06e745
--- /dev/null
+++ b/src/_tests/fixtures/52579-edits-infra/_downloads.json
@@ -0,0 +1,3 @@
+{
+  "vertx__eventbus-bridge-client.js": 0
+}
diff --git a/src/_tests/fixtures/52579-edits-infra/_files.json b/src/_tests/fixtures/52579-edits-infra/_files.json
new file mode 100644
index 0000000..9f7a08f
--- /dev/null
+++ b/src/_tests/fixtures/52579-edits-infra/_files.json
@@ -0,0 +1,5 @@
+{
+  "5337ea17b2407707bead503cd20c9ca29438f5df:types/vertx__eventbus-bridge-client.js/tsconfig.json": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"noImplicitAny\": true,\n        \"noImplicitThis\": true,\n        \"strictFunctionTypes\": true,\n        \"strictNullChecks\": true,\n        \"baseUrl\": \"../\",\n        \"typeRoots\": [\n            \"../\"\n        ],\n        \"types\": [],\n        \"noEmit\": true,\n        \"forceConsistentCasingInFileNames\": true\n    },\n    \"files\": [\n        \"index.d.ts\",\n        \"vertx__eventbus-bridge-client.js-tests.ts\"\n    ]\n}\n",
+  "5337ea17b2407707bead503cd20c9ca29438f5df:types/vertx__eventbus-bridge-client.js/tslint.json": "{ \"extends\": \"dtslint/dt.json\" }\n",
+  "5337ea17b2407707bead503cd20c9ca29438f5df:package.json": "{}"
+}
diff --git a/src/_tests/fixtures/52579-edits-infra/_response.json b/src/_tests/fixtures/52579-edits-infra/_response.json
new file mode 100644
index 0000000..caf5854
--- /dev/null
+++ b/src/_tests/fixtures/52579-edits-infra/_response.json
@@ -0,0 +1,232 @@
+{
+  "data": {
+    "repository": {
+      "id": "MDEwOlJlcG9zaXRvcnk2MDkzMzE2",
+      "pullRequest": {
+        "id": "MDExOlB1bGxSZXF1ZXN0NjIyODUxNTk2",
+        "title": "new definition for @vertx/eventbus-bridge-client.js",
+        "createdAt": "2021-04-25T22:27:45Z",
+        "author": {
+          "login": "Phong6698",
+          "__typename": "User"
+        },
+        "authorAssociation": "FIRST_TIME_CONTRIBUTOR",
+        "baseRef": {
+          "name": "master",
+          "__typename": "Ref"
+        },
+        "labels": {
+          "nodes": [
+            {
+              "name": "New Definition",
+              "__typename": "Label"
+            }
+          ],
+          "__typename": "LabelConnection"
+        },
+        "isDraft": false,
+        "mergeable": "MERGEABLE",
+        "number": 52579,
+        "state": "OPEN",
+        "headRefOid": "5337ea17b2407707bead503cd20c9ca29438f5df",
+        "timelineItems": {
+          "nodes": [
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-04-25T22:30:06Z",
+              "__typename": "MovedColumnsInProjectEvent"
+            }
+          ],
+          "__typename": "PullRequestTimelineItemsConnection"
+        },
+        "reviews": {
+          "nodes": [],
+          "__typename": "PullRequestReviewConnection"
+        },
+        "commits": {
+          "totalCount": 1,
+          "nodes": [
+            {
+              "commit": {
+                "checkSuites": {
+                  "nodes": [
+                    {
+                      "app": {
+                        "name": "GitHub Actions",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289453",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289453",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": "build",
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    },
+                    {
+                      "databaseId": 123456,
+                      "app": {
+                        "name": "GitHub Actions",
+                        "__typename": "App"
+                      },
+                      "conclusion": "ACTION_REQUIRED",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289527",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289527",
+                      "checkRuns": {
+                        "nodes": [],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    },
+                    {
+                      "app": {
+                        "name": "Azure Pipelines",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289989",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289989",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": "Build #95853 succeeded",
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    }
+                  ],
+                  "__typename": "CheckSuiteConnection"
+                },
+                "status": null,
+                "authoredDate": "2021-04-25T22:24:54Z",
+                "committedDate": "2021-04-25T22:24:54Z",
+                "pushedDate": "2021-04-25T22:25:04Z",
+                "oid": "5337ea17b2407707bead503cd20c9ca29438f5df",
+                "__typename": "Commit"
+              },
+              "__typename": "PullRequestCommit"
+            }
+          ],
+          "__typename": "PullRequestCommitConnection"
+        },
+        "comments": {
+          "totalCount": 3,
+          "nodes": [
+            {
+              "id": "MDEyOklzc3VlQ29tbWVudDgyNjM5OTk2OA==",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "body": "@Phong6698 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `vertx__eventbus-bridge-client.js` (*new!*) [on npm](https://www.npmjs.com/package/@vertx/eventbus-bridge-client.js), [on unpkg](https://unpkg.com/browse/@vertx/eventbus-bridge-client.js@latest/)\n  - 1 added owner: ✎@Phong6698\n\n## Code Reviews\n\nThis PR adds a new definition, so it needs to be reviewed by a DT maintainer before it can be merged.\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes when there are new packages added\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->",
+              "createdAt": "2021-04-25T22:28:24Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "MDEyOklzc3VlQ29tbWVudDgyNjM5OTk3MA==",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "body": "🔔 @Phong6698 — you're the only owner, but it would still be good if you find someone to [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/52579/files) in the next few days, otherwise a maintainer will look at it. (And if you do find someone, maybe even recruit them to be a second owner to make future changes easier...)\n<!--typescript_bot_pinging-reviewers-others-->",
+              "createdAt": "2021-04-25T22:28:24Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "MDEyOklzc3VlQ29tbWVudDgyNjQwMDU1Ng==",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "body": "<!-- @dt-perf {\"version\":2,\"data\":{\"benchmarks\":[{\"createdAt\":\"2021-04-25T22:33:17.385Z\"}]}} -->\n\n👋 **Hi there!** I’ve run some quick measurements against master and your PR. These metrics should help the humans reviewing this PR gauge whether it might negatively affect compile times or editor responsiveness for users who install these typings.\n\n\nLet’s review the numbers, shall we?\n\nThese typings are for a package that doesn’t yet exist on master, so I don’t have anything to compare against yet! In the future, I’ll be able to compare PRs to vertx__eventbus-bridge-client.js with its source on master.\n\n\n<details>\n<summary><strong>Comparison details</strong> 📊</summary>\n\n| **Batch compilation**                                                                     |                                                                                                                                                                                |\n| ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| Type count                                                                                | 2159                                                                                                                                                                           |\n| Assignability cache size                                                                  | 95                                                                                                                                                                             |\n|                                                                                           |                                                                                                                                                                                |\n| **Language service measurements**                                                         |                                                                                                                                                                                |\n| Samples taken                                                                             | 3                                                                                                                                                                              |\n| Identifiers in tests                                                                      | 3                                                                                                                                                                              |\n| **`getCompletionsAtPosition`**                                                            |                                                                                                                                                                                |\n| &nbsp;&nbsp;&nbsp;&nbsp;Mean duration (ms)                                                | 121.8                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Mean [CV](https://en.wikipedia.org/wiki/Coefficient_of_variation) | 33.7%                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Worst duration (ms)                                               | 135.1                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Worst identifier                                                  | [EventBus](/DefinitelyTyped/DefinitelyTyped/blob/43964b6b3855ea074d509c41d4d60cd9e2f8db28/types/vertx__eventbus-bridge-client.js/vertx__eventbus-bridge-client.js-tests.ts#L3) |\n| **`getQuickInfoAtPosition`**                                                              |                                                                                                                                                                                |\n| &nbsp;&nbsp;&nbsp;&nbsp;Mean duration (ms)                                                | 104.1                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Mean [CV](https://en.wikipedia.org/wiki/Coefficient_of_variation) | 19.0%                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Worst duration (ms)                                               | 109.4                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Worst identifier                                                  | [EventBus](/DefinitelyTyped/DefinitelyTyped/blob/43964b6b3855ea074d509c41d4d60cd9e2f8db28/types/vertx__eventbus-bridge-client.js/vertx__eventbus-bridge-client.js-tests.ts#L3) |\n|                                                                                           |                                                                                                                                                                                |\n| **System information**                                                                    |                                                                                                                                                                                |\n| Node version                                                                              | v14.16.1                                                                                                                                                                       |\n| CPU count                                                                                 | 2                                                                                                                                                                              |\n| CPU speed                                                                                 | 2.294 GHz                                                                                                                                                                      |\n| CPU model                                                                                 | Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz                                                                                                                                      |\n| CPU Architecture                                                                          | x64                                                                                                                                                                            |\n| Memory                                                                                    | 6.8 GiB                                                                                                                                                                        |\n| Platform                                                                                  | linux                                                                                                                                                                          |\n| Release                                                                                   | 4.15.0-1113-azure                                                                                                                                                              |\n\n\n</details>\n",
+              "createdAt": "2021-04-25T22:33:17Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            }
+          ],
+          "__typename": "IssueCommentConnection"
+        },
+        "files": {
+          "totalCount": 4,
+          "nodes": [
+            {
+              "path": "package.json",
+              "additions": 39,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            },
+            {
+              "path": "types/vertx__eventbus-bridge-client.js/tsconfig.json",
+              "additions": 23,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            },
+            {
+              "path": "types/vertx__eventbus-bridge-client.js/tslint.json",
+              "additions": 1,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            },
+            {
+              "path": "types/vertx__eventbus-bridge-client.js/vertx__eventbus-bridge-client.js-tests.ts",
+              "additions": 3,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            }
+          ],
+          "__typename": "PullRequestChangedFileConnection"
+        },
+        "projectCards": {
+          "nodes": [
+            {
+              "id": "MDExOlByb2plY3RDYXJkNTk3OTk5NDQ=",
+              "project": {
+                "id": "MDc6UHJvamVjdDM3NDExMDQ=",
+                "number": 5,
+                "name": "New Pull Request Status Board",
+                "__typename": "Project"
+              },
+              "column": {
+                "id": "MDEzOlByb2plY3RDb2x1bW45ODY3MDA2",
+                "name": "Needs Maintainer Action",
+                "__typename": "ProjectColumn"
+              },
+              "__typename": "ProjectCard"
+            }
+          ],
+          "__typename": "ProjectCardConnection"
+        },
+        "__typename": "PullRequest"
+      },
+      "__typename": "Repository"
+    }
+  },
+  "loading": false,
+  "networkStatus": 7
+}
diff --git a/src/_tests/fixtures/52579-edits-infra/derived.json b/src/_tests/fixtures/52579-edits-infra/derived.json
new file mode 100644
index 0000000..ca9558b
--- /dev/null
+++ b/src/_tests/fixtures/52579-edits-infra/derived.json
@@ -0,0 +1,57 @@
+{
+  "type": "info",
+  "now": "2021-04-26T11:48:53.676Z",
+  "pr_number": 52579,
+  "author": "Phong6698",
+  "headCommitOid": "5337ea17b2407707bead503cd20c9ca29438f5df",
+  "lastPushDate": "2021-04-25T22:25:04.000Z",
+  "lastActivityDate": "2021-04-25T22:27:45.000Z",
+  "maintainerBlessed": false,
+  "hasMergeConflict": false,
+  "isFirstContribution": true,
+  "tooManyFiles": false,
+  "popularityLevel": "Well-liked by everyone",
+  "pkgInfo": [
+    {
+      "name": null,
+      "kind": "edit",
+      "files": [
+        {
+          "path": "package.json",
+          "kind": "infrastructure"
+        }
+      ],
+      "owners": [],
+      "addedOwners": [],
+      "deletedOwners": [],
+      "popularityLevel": "Critical"
+    },
+    {
+      "name": "vertx__eventbus-bridge-client.js",
+      "kind": "add",
+      "files": [
+        {
+          "path": "types/vertx__eventbus-bridge-client.js/tsconfig.json",
+          "kind": "package-meta-ok"
+        },
+        {
+          "path": "types/vertx__eventbus-bridge-client.js/tslint.json",
+          "kind": "package-meta-ok"
+        },
+        {
+          "path": "types/vertx__eventbus-bridge-client.js/vertx__eventbus-bridge-client.js-tests.ts",
+          "kind": "test"
+        }
+      ],
+      "owners": [],
+      "addedOwners": [],
+      "deletedOwners": [],
+      "popularityLevel": "Well-liked by everyone"
+    }
+  ],
+  "reviews": [],
+  "ciResult": "action_required",
+  "reRunCheckSuiteIDs": [
+    123456
+  ]
+}
diff --git a/src/_tests/fixtures/52579-edits-infra/mutations.json b/src/_tests/fixtures/52579-edits-infra/mutations.json
new file mode 100644
index 0000000..3fd7cf1
--- /dev/null
+++ b/src/_tests/fixtures/52579-edits-infra/mutations.json
@@ -0,0 +1,23 @@
+[
+  {
+    "mutation": "mutation ($input: AddLabelsToLabelableInput!) {\n  addLabelsToLabelable(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "labelIds": [
+          "MDU6TGFiZWwyOTUzOTk2NDAx",
+          "MDU6TGFiZWwxNjA4MjA4ODM1"
+        ],
+        "labelableId": "MDExOlB1bGxSZXF1ZXN0NjIyODUxNTk2"
+      }
+    }
+  },
+  {
+    "mutation": "mutation ($input: UpdateIssueCommentInput!) {\n  updateIssueComment(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "id": "MDEyOklzc3VlQ29tbWVudDgyNjM5OTk2OA==",
+        "body": "@Phong6698 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\nThis PR touches some part of DefinitelyTyped infrastructure, so a DT maintainer will need to review it. This is rare — did you mean to do this?\n\n## 1 package in this PR\n\n* `vertx__eventbus-bridge-client.js` (*new!*) [on npm](https://www.npmjs.com/package/@vertx/eventbus-bridge-client.js), [on unpkg](https://unpkg.com/browse/@vertx/eventbus-bridge-client.js@latest/)\n\n## Code Reviews\n\nThis PR adds a new definition, so it needs to be reviewed by a DT maintainer before it can be merged.\n\n## Status\n\n * ✅ No merge conflicts\n * 🔐 Continuous integration tests waiting for a maintainer to authorize a run\n * 🕐 Only a DT maintainer can approve changes when there are new packages added\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
+      }
+    }
+  }
+]
diff --git a/src/_tests/fixtures/52579-edits-infra/result.json b/src/_tests/fixtures/52579-edits-infra/result.json
new file mode 100644
index 0000000..23f1990
--- /dev/null
+++ b/src/_tests/fixtures/52579-edits-infra/result.json
@@ -0,0 +1,21 @@
+{
+  "projectColumn": "Needs Maintainer Action",
+  "labels": [
+    "The CI is blocked",
+    "New Definition",
+    "Edits Infrastructure"
+  ],
+  "responseComments": [
+    {
+      "tag": "welcome",
+      "status": "@Phong6698 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\nThis PR touches some part of DefinitelyTyped infrastructure, so a DT maintainer will need to review it. This is rare — did you mean to do this?\n\n## 1 package in this PR\n\n* `vertx__eventbus-bridge-client.js` (*new!*) [on npm](https://www.npmjs.com/package/@vertx/eventbus-bridge-client.js), [on unpkg](https://unpkg.com/browse/@vertx/eventbus-bridge-client.js@latest/)\n\n## Code Reviews\n\nThis PR adds a new definition, so it needs to be reviewed by a DT maintainer before it can be merged.\n\n## Status\n\n * ✅ No merge conflicts\n * 🔐 Continuous integration tests waiting for a maintainer to authorize a run\n * 🕐 Only a DT maintainer can approve changes when there are new packages added\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ..."
+    },
+    {
+      "tag": "pinging-reviewers-others",
+      "status": "🔔 @Phong6698 — you're the only owner, but it would still be good if you find someone to [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/52579/files) in the next few days, otherwise a maintainer will look at it. (And if you do find someone, maybe even recruit them to be a second owner to make future changes easier...)"
+    }
+  ],
+  "shouldClose": false,
+  "shouldMerge": false,
+  "shouldUpdateLabels": true
+}
diff --git a/src/_tests/fixtures/52579/_downloads.json b/src/_tests/fixtures/52579/_downloads.json
new file mode 100644
index 0000000..b06e745
--- /dev/null
+++ b/src/_tests/fixtures/52579/_downloads.json
@@ -0,0 +1,3 @@
+{
+  "vertx__eventbus-bridge-client.js": 0
+}
diff --git a/src/_tests/fixtures/52579/_files.json b/src/_tests/fixtures/52579/_files.json
new file mode 100644
index 0000000..12957ae
--- /dev/null
+++ b/src/_tests/fixtures/52579/_files.json
@@ -0,0 +1,5 @@
+{
+  "5337ea17b2407707bead503cd20c9ca29438f5df:types/vertx__eventbus-bridge-client.js/tsconfig.json": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"noImplicitAny\": true,\n        \"noImplicitThis\": true,\n        \"strictFunctionTypes\": true,\n        \"strictNullChecks\": true,\n        \"baseUrl\": \"../\",\n        \"typeRoots\": [\n            \"../\"\n        ],\n        \"types\": [],\n        \"noEmit\": true,\n        \"forceConsistentCasingInFileNames\": true\n    },\n    \"files\": [\n        \"index.d.ts\",\n        \"vertx__eventbus-bridge-client.js-tests.ts\"\n    ]\n}\n",
+  "5337ea17b2407707bead503cd20c9ca29438f5df:types/vertx__eventbus-bridge-client.js/tslint.json": "{ \"extends\": \"dtslint/dt.json\" }\n",
+  "5337ea17b2407707bead503cd20c9ca29438f5df:types/vertx__eventbus-bridge-client.js/index.d.ts": "// Type definitions for @vertx/eventbus-bridge-client.js 1.0\n// Project: http://vertx.io\n// Definitions by: Chiramet Phong Penglerd <https://github.com/Phong6698>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\ndeclare namespace EventBus {\n    type EventBusStatic = new(url: string, options?: any) => EventBus;\n\n    interface EventBus {\n        url: string;\n        options?: EventBusOptions;\n        onopen(): void;\n        onerror(error: EventBusError): void;\n        onclose(): void;\n        registerHandler(address: string, headers?: object, callback?: (error: Error, message: any) => void): void;\n        unregisterHandler(address: string, headers?: object, callback?: (error: Error, message: any) => void): void;\n        send(address: string, message: any, headers?: object, callback?: (error: Error, message: any) => void): void;\n        publish(address: string, message: any, headers?: any): void;\n        enableReconnect(enable: boolean): void;\n        enablePing(enable: boolean): void;\n        close(): void;\n    }\n\n    interface EventBusOptions {\n        vertxbus_reconnect_attempts_max: number; // Max reconnect attempts\n        vertxbus_reconnect_delay_min: number; // Initial delay (in ms) before first reconnect attempt\n        vertxbus_reconnect_delay_max: number; // Max delay (in ms) between reconnect attempts\n        vertxbus_reconnect_exponent: number; // Exponential backoff factor\n        vertxbus_randomization_factor: number; // Randomization factor between 0 and 1\n    }\n\n    interface EventBusError {\n        body: string;\n        type: string;\n    }\n}\n\ndeclare var EventBus: EventBus.EventBusStatic;\nexport = EventBus;\n"
+}
diff --git a/src/_tests/fixtures/52579/_response.json b/src/_tests/fixtures/52579/_response.json
new file mode 100644
index 0000000..8031ee9
--- /dev/null
+++ b/src/_tests/fixtures/52579/_response.json
@@ -0,0 +1,232 @@
+{
+  "data": {
+    "repository": {
+      "id": "MDEwOlJlcG9zaXRvcnk2MDkzMzE2",
+      "pullRequest": {
+        "id": "MDExOlB1bGxSZXF1ZXN0NjIyODUxNTk2",
+        "title": "new definition for @vertx/eventbus-bridge-client.js",
+        "createdAt": "2021-04-25T22:27:45Z",
+        "author": {
+          "login": "Phong6698",
+          "__typename": "User"
+        },
+        "authorAssociation": "FIRST_TIME_CONTRIBUTOR",
+        "baseRef": {
+          "name": "master",
+          "__typename": "Ref"
+        },
+        "labels": {
+          "nodes": [
+            {
+              "name": "New Definition",
+              "__typename": "Label"
+            }
+          ],
+          "__typename": "LabelConnection"
+        },
+        "isDraft": false,
+        "mergeable": "MERGEABLE",
+        "number": 52579,
+        "state": "OPEN",
+        "headRefOid": "5337ea17b2407707bead503cd20c9ca29438f5df",
+        "timelineItems": {
+          "nodes": [
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-04-25T22:30:06Z",
+              "__typename": "MovedColumnsInProjectEvent"
+            }
+          ],
+          "__typename": "PullRequestTimelineItemsConnection"
+        },
+        "reviews": {
+          "nodes": [],
+          "__typename": "PullRequestReviewConnection"
+        },
+        "commits": {
+          "totalCount": 1,
+          "nodes": [
+            {
+              "commit": {
+                "checkSuites": {
+                  "nodes": [
+                    {
+                      "app": {
+                        "name": "GitHub Actions",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289453",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289453",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": "build",
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    },
+                    {
+                      "databaseId": 123456,
+                      "app": {
+                        "name": "GitHub Actions",
+                        "__typename": "App"
+                      },
+                      "conclusion": "ACTION_REQUIRED",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289527",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289527",
+                      "checkRuns": {
+                        "nodes": [],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    },
+                    {
+                      "app": {
+                        "name": "Azure Pipelines",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289989",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/5337ea17b2407707bead503cd20c9ca29438f5df/checks?check_suite_id=2579289989",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": "Build #95853 succeeded",
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    }
+                  ],
+                  "__typename": "CheckSuiteConnection"
+                },
+                "status": null,
+                "authoredDate": "2021-04-25T22:24:54Z",
+                "committedDate": "2021-04-25T22:24:54Z",
+                "pushedDate": "2021-04-25T22:25:04Z",
+                "oid": "5337ea17b2407707bead503cd20c9ca29438f5df",
+                "__typename": "Commit"
+              },
+              "__typename": "PullRequestCommit"
+            }
+          ],
+          "__typename": "PullRequestCommitConnection"
+        },
+        "comments": {
+          "totalCount": 3,
+          "nodes": [
+            {
+              "id": "MDEyOklzc3VlQ29tbWVudDgyNjM5OTk2OA==",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "body": "@Phong6698 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `vertx__eventbus-bridge-client.js` (*new!*) [on npm](https://www.npmjs.com/package/@vertx/eventbus-bridge-client.js), [on unpkg](https://unpkg.com/browse/@vertx/eventbus-bridge-client.js@latest/)\n  - 1 added owner: ✎@Phong6698\n\n## Code Reviews\n\nThis PR adds a new definition, so it needs to be reviewed by a DT maintainer before it can be merged.\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes when there are new packages added\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->",
+              "createdAt": "2021-04-25T22:28:24Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "MDEyOklzc3VlQ29tbWVudDgyNjM5OTk3MA==",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "body": "🔔 @Phong6698 — you're the only owner, but it would still be good if you find someone to [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/52579/files) in the next few days, otherwise a maintainer will look at it. (And if you do find someone, maybe even recruit them to be a second owner to make future changes easier...)\n<!--typescript_bot_pinging-reviewers-others-->",
+              "createdAt": "2021-04-25T22:28:24Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "MDEyOklzc3VlQ29tbWVudDgyNjQwMDU1Ng==",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "body": "<!-- @dt-perf {\"version\":2,\"data\":{\"benchmarks\":[{\"createdAt\":\"2021-04-25T22:33:17.385Z\"}]}} -->\n\n👋 **Hi there!** I’ve run some quick measurements against master and your PR. These metrics should help the humans reviewing this PR gauge whether it might negatively affect compile times or editor responsiveness for users who install these typings.\n\n\nLet’s review the numbers, shall we?\n\nThese typings are for a package that doesn’t yet exist on master, so I don’t have anything to compare against yet! In the future, I’ll be able to compare PRs to vertx__eventbus-bridge-client.js with its source on master.\n\n\n<details>\n<summary><strong>Comparison details</strong> 📊</summary>\n\n| **Batch compilation**                                                                     |                                                                                                                                                                                |\n| ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| Type count                                                                                | 2159                                                                                                                                                                           |\n| Assignability cache size                                                                  | 95                                                                                                                                                                             |\n|                                                                                           |                                                                                                                                                                                |\n| **Language service measurements**                                                         |                                                                                                                                                                                |\n| Samples taken                                                                             | 3                                                                                                                                                                              |\n| Identifiers in tests                                                                      | 3                                                                                                                                                                              |\n| **`getCompletionsAtPosition`**                                                            |                                                                                                                                                                                |\n| &nbsp;&nbsp;&nbsp;&nbsp;Mean duration (ms)                                                | 121.8                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Mean [CV](https://en.wikipedia.org/wiki/Coefficient_of_variation) | 33.7%                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Worst duration (ms)                                               | 135.1                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Worst identifier                                                  | [EventBus](/DefinitelyTyped/DefinitelyTyped/blob/43964b6b3855ea074d509c41d4d60cd9e2f8db28/types/vertx__eventbus-bridge-client.js/vertx__eventbus-bridge-client.js-tests.ts#L3) |\n| **`getQuickInfoAtPosition`**                                                              |                                                                                                                                                                                |\n| &nbsp;&nbsp;&nbsp;&nbsp;Mean duration (ms)                                                | 104.1                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Mean [CV](https://en.wikipedia.org/wiki/Coefficient_of_variation) | 19.0%                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Worst duration (ms)                                               | 109.4                                                                                                                                                                          |\n| &nbsp;&nbsp;&nbsp;&nbsp;Worst identifier                                                  | [EventBus](/DefinitelyTyped/DefinitelyTyped/blob/43964b6b3855ea074d509c41d4d60cd9e2f8db28/types/vertx__eventbus-bridge-client.js/vertx__eventbus-bridge-client.js-tests.ts#L3) |\n|                                                                                           |                                                                                                                                                                                |\n| **System information**                                                                    |                                                                                                                                                                                |\n| Node version                                                                              | v14.16.1                                                                                                                                                                       |\n| CPU count                                                                                 | 2                                                                                                                                                                              |\n| CPU speed                                                                                 | 2.294 GHz                                                                                                                                                                      |\n| CPU model                                                                                 | Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz                                                                                                                                      |\n| CPU Architecture                                                                          | x64                                                                                                                                                                            |\n| Memory                                                                                    | 6.8 GiB                                                                                                                                                                        |\n| Platform                                                                                  | linux                                                                                                                                                                          |\n| Release                                                                                   | 4.15.0-1113-azure                                                                                                                                                              |\n\n\n</details>\n",
+              "createdAt": "2021-04-25T22:33:17Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            }
+          ],
+          "__typename": "IssueCommentConnection"
+        },
+        "files": {
+          "totalCount": 4,
+          "nodes": [
+            {
+              "path": "types/vertx__eventbus-bridge-client.js/index.d.ts",
+              "additions": 39,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            },
+            {
+              "path": "types/vertx__eventbus-bridge-client.js/tsconfig.json",
+              "additions": 23,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            },
+            {
+              "path": "types/vertx__eventbus-bridge-client.js/tslint.json",
+              "additions": 1,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            },
+            {
+              "path": "types/vertx__eventbus-bridge-client.js/vertx__eventbus-bridge-client.js-tests.ts",
+              "additions": 3,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            }
+          ],
+          "__typename": "PullRequestChangedFileConnection"
+        },
+        "projectCards": {
+          "nodes": [
+            {
+              "id": "MDExOlByb2plY3RDYXJkNTk3OTk5NDQ=",
+              "project": {
+                "id": "MDc6UHJvamVjdDM3NDExMDQ=",
+                "number": 5,
+                "name": "New Pull Request Status Board",
+                "__typename": "Project"
+              },
+              "column": {
+                "id": "MDEzOlByb2plY3RDb2x1bW45ODY3MDA2",
+                "name": "Needs Maintainer Action",
+                "__typename": "ProjectColumn"
+              },
+              "__typename": "ProjectCard"
+            }
+          ],
+          "__typename": "ProjectCardConnection"
+        },
+        "__typename": "PullRequest"
+      },
+      "__typename": "Repository"
+    }
+  },
+  "loading": false,
+  "networkStatus": 7
+}
diff --git a/src/_tests/fixtures/52579/derived.json b/src/_tests/fixtures/52579/derived.json
new file mode 100644
index 0000000..7da6761
--- /dev/null
+++ b/src/_tests/fixtures/52579/derived.json
@@ -0,0 +1,49 @@
+{
+  "type": "info",
+  "now": "2021-04-26T11:48:53.676Z",
+  "pr_number": 52579,
+  "author": "Phong6698",
+  "headCommitOid": "5337ea17b2407707bead503cd20c9ca29438f5df",
+  "lastPushDate": "2021-04-25T22:25:04.000Z",
+  "lastActivityDate": "2021-04-25T22:27:45.000Z",
+  "maintainerBlessed": false,
+  "hasMergeConflict": false,
+  "isFirstContribution": true,
+  "tooManyFiles": false,
+  "popularityLevel": "Well-liked by everyone",
+  "pkgInfo": [
+    {
+      "name": "vertx__eventbus-bridge-client.js",
+      "kind": "add",
+      "files": [
+        {
+          "path": "types/vertx__eventbus-bridge-client.js/index.d.ts",
+          "kind": "definition"
+        },
+        {
+          "path": "types/vertx__eventbus-bridge-client.js/tsconfig.json",
+          "kind": "package-meta-ok"
+        },
+        {
+          "path": "types/vertx__eventbus-bridge-client.js/tslint.json",
+          "kind": "package-meta-ok"
+        },
+        {
+          "path": "types/vertx__eventbus-bridge-client.js/vertx__eventbus-bridge-client.js-tests.ts",
+          "kind": "test"
+        }
+      ],
+      "owners": [],
+      "addedOwners": [
+        "Phong6698"
+      ],
+      "deletedOwners": [],
+      "popularityLevel": "Well-liked by everyone"
+    }
+  ],
+  "reviews": [],
+  "ciResult": "action_required",
+  "reRunCheckSuiteIDs": [
+    123456
+  ]
+}
diff --git a/src/_tests/fixtures/52579/mutations.json b/src/_tests/fixtures/52579/mutations.json
new file mode 100644
index 0000000..1e6e287
--- /dev/null
+++ b/src/_tests/fixtures/52579/mutations.json
@@ -0,0 +1,24 @@
+[
+  {
+    "mutation": "mutation ($input: MoveProjectCardInput!) {\n  moveProjectCard(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "cardId": "MDExOlByb2plY3RDYXJkNTk3OTk5NDQ=",
+        "columnId": "MDEzOlByb2plY3RDb2x1bW43NTUyOTMw"
+      }
+    }
+  },
+  {
+    "mutation": "mutation ($input: UpdateIssueCommentInput!) {\n  updateIssueComment(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "id": "MDEyOklzc3VlQ29tbWVudDgyNjM5OTk2OA==",
+        "body": "@Phong6698 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `vertx__eventbus-bridge-client.js` (*new!*) [on npm](https://www.npmjs.com/package/@vertx/eventbus-bridge-client.js), [on unpkg](https://unpkg.com/browse/@vertx/eventbus-bridge-client.js@latest/)\n  - 1 added owner: ✎@Phong6698\n\n## Code Reviews\n\nThis PR adds a new definition, so it needs to be reviewed by a DT maintainer before it can be merged.\n\n## Status\n\n * ✅ No merge conflicts\n * 🕐 Continuous integration tests are still running\n * 🕐 Only a DT maintainer can approve changes when there are new packages added\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
+      }
+    }
+  },
+  {
+    "method": "POST",
+    "op": "check-suites/123456/rerequest"
+  }
+]
diff --git a/src/_tests/fixtures/52579/result.json b/src/_tests/fixtures/52579/result.json
new file mode 100644
index 0000000..980dd14
--- /dev/null
+++ b/src/_tests/fixtures/52579/result.json
@@ -0,0 +1,22 @@
+{
+  "projectColumn": "Waiting for Code Reviews",
+  "labels": [
+    "New Definition"
+  ],
+  "responseComments": [
+    {
+      "tag": "welcome",
+      "status": "@Phong6698 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `vertx__eventbus-bridge-client.js` (*new!*) [on npm](https://www.npmjs.com/package/@vertx/eventbus-bridge-client.js), [on unpkg](https://unpkg.com/browse/@vertx/eventbus-bridge-client.js@latest/)\n  - 1 added owner: ✎@Phong6698\n\n## Code Reviews\n\nThis PR adds a new definition, so it needs to be reviewed by a DT maintainer before it can be merged.\n\n## Status\n\n * ✅ No merge conflicts\n * 🕐 Continuous integration tests are still running\n * 🕐 Only a DT maintainer can approve changes when there are new packages added\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ..."
+    },
+    {
+      "tag": "pinging-reviewers-others",
+      "status": "🔔 @Phong6698 — you're the only owner, but it would still be good if you find someone to [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/52579/files) in the next few days, otherwise a maintainer will look at it. (And if you do find someone, maybe even recruit them to be a second owner to make future changes easier...)"
+    }
+  ],
+  "shouldClose": false,
+  "shouldMerge": false,
+  "shouldUpdateLabels": true,
+  "reRunActionsCheckSuiteIDs": [
+    123456
+  ]
+}
diff --git a/src/commands/update-test-data.ts b/src/commands/update-test-data.ts
index 75c92bb..1ce3968 100644
--- a/src/commands/update-test-data.ts
+++ b/src/commands/update-test-data.ts
@@ -19,7 +19,8 @@ async function main() {
     await fs.promises.writeFile(
         dataPath,
         JSON.stringify({ comment: "Generate & update with `npm run update-test-data`", ...data },
-                       undefined, 2),
+                       undefined, 2)
+        + "\n",
         "utf8");
 }