diff --git a/analysis_options.yaml b/analysis_options.yaml
index 4f5a9c5..4cf6349 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -43,3 +43,6 @@
   rules:
     use_super_parameters: true
     prefer_final_fields: true
+    prefer_final_locals: true
+    require_trailing_commas: true
+    unawaited_futures: true
diff --git a/analyze/analyze.dart b/analyze/analyze.dart
index 694ccbf..7dd6c9c 100644
--- a/analyze/analyze.dart
+++ b/analyze/analyze.dart
@@ -125,8 +125,10 @@
       pending.addAll(entity.listSync());
     }
   }
-  assert(matches >= minimumMatches,
-      'Expected to find at least $minimumMatches files with extension ".$extension" in "$workingDirectory", but only found $matches.');
+  assert(
+    matches >= minimumMatches,
+    'Expected to find at least $minimumMatches files with extension ".$extension" in "$workingDirectory", but only found $matches.',
+  );
 }
 
 class EvalResult {
diff --git a/app_dart/bin/server.dart b/app_dart/bin/server.dart
index d0dbc37..168a21b 100644
--- a/app_dart/bin/server.dart
+++ b/app_dart/bin/server.dart
@@ -274,34 +274,38 @@
       '/readiness_check': ReadinessCheck(config: config),
     };
 
-    return await runAppEngine((HttpRequest request) async {
-      if (handlers.containsKey(request.uri.path)) {
-        final RequestHandler<dynamic> handler = handlers[request.uri.path]!;
-        await handler.service(request);
-      } else {
-        /// Requests with query parameters and anchors need to be trimmed to get the file path.
-        // TODO(chillers): Use toFilePath(), https://github.com/dart-lang/sdk/issues/39373
-        final int queryIndex = request.uri.path.contains('?') ? request.uri.path.indexOf('?') : request.uri.path.length;
-        final int anchorIndex =
-            request.uri.path.contains('#') ? request.uri.path.indexOf('#') : request.uri.path.length;
+    return await runAppEngine(
+      (HttpRequest request) async {
+        if (handlers.containsKey(request.uri.path)) {
+          final RequestHandler<dynamic> handler = handlers[request.uri.path]!;
+          await handler.service(request);
+        } else {
+          /// Requests with query parameters and anchors need to be trimmed to get the file path.
+          // TODO(chillers): Use toFilePath(), https://github.com/dart-lang/sdk/issues/39373
+          final int queryIndex =
+              request.uri.path.contains('?') ? request.uri.path.indexOf('?') : request.uri.path.length;
+          final int anchorIndex =
+              request.uri.path.contains('#') ? request.uri.path.indexOf('#') : request.uri.path.length;
 
-        /// Trim to the first instance of an anchor or query.
-        final int trimIndex = min(queryIndex, anchorIndex);
-        final String filePath = request.uri.path.substring(0, trimIndex);
+          /// Trim to the first instance of an anchor or query.
+          final int trimIndex = min(queryIndex, anchorIndex);
+          final String filePath = request.uri.path.substring(0, trimIndex);
 
-        const Map<String, String> redirects = <String, String>{
-          '/build.html': '/#/build',
-        };
-        if (redirects.containsKey(filePath)) {
-          request.response.statusCode = HttpStatus.permanentRedirect;
-          return await request.response.redirect(Uri.parse(redirects[filePath]!));
+          const Map<String, String> redirects = <String, String>{
+            '/build.html': '/#/build',
+          };
+          if (redirects.containsKey(filePath)) {
+            request.response.statusCode = HttpStatus.permanentRedirect;
+            return await request.response.redirect(Uri.parse(redirects[filePath]!));
+          }
+
+          await StaticFileHandler(filePath, config: config).service(request);
         }
-
-        await StaticFileHandler(filePath, config: config).service(request);
-      }
-    }, onAcceptingConnections: (InternetAddress address, int port) {
-      final String host = address.isLoopback ? 'localhost' : address.host;
-      print('Serving requests at http://$host:$port/');
-    });
+      },
+      onAcceptingConnections: (InternetAddress address, int port) {
+        final String host = address.isLoopback ? 'localhost' : address.host;
+        print('Serving requests at http://$host:$port/');
+      },
+    );
   });
 }
diff --git a/app_dart/bin/validate_scheduler_config.dart b/app_dart/bin/validate_scheduler_config.dart
index bc736c8..3b3fb11 100644
--- a/app_dart/bin/validate_scheduler_config.dart
+++ b/app_dart/bin/validate_scheduler_config.dart
@@ -23,9 +23,11 @@
 
   final YamlMap configYaml = loadYaml(configFile.readAsStringSync()) as YamlMap;
   final pb.SchedulerConfig unCheckedSchedulerConfig = pb.SchedulerConfig()..mergeFromProto3Json(configYaml);
-  print(CiYaml(
-    slug: Config.flutterSlug,
-    branch: Config.defaultBranch(Config.flutterSlug),
-    config: unCheckedSchedulerConfig,
-  ).config);
+  print(
+    CiYaml(
+      slug: Config.flutterSlug,
+      branch: Config.defaultBranch(Config.flutterSlug),
+      config: unCheckedSchedulerConfig,
+    ).config,
+  );
 }
diff --git a/app_dart/integration_test/validate_all_ci_configs_test.dart b/app_dart/integration_test/validate_all_ci_configs_test.dart
index 4f0c300..69f2f03 100644
--- a/app_dart/integration_test/validate_all_ci_configs_test.dart
+++ b/app_dart/integration_test/validate_all_ci_configs_test.dart
@@ -47,50 +47,57 @@
       }
     });
 
-    test('validate enabled branches of $config', () async {
-      final String configContent = await githubFileContent(
-        config.slug,
-        kCiYamlPath,
-        httpClientProvider: () => http.Client(),
-        ref: config.branch,
-      );
-      final YamlMap configYaml = loadYaml(configContent) as YamlMap;
-      final pb.SchedulerConfig schedulerConfig = pb.SchedulerConfig()..mergeFromProto3Json(configYaml);
+    test(
+      'validate enabled branches of $config',
+      () async {
+        final String configContent = await githubFileContent(
+          config.slug,
+          kCiYamlPath,
+          httpClientProvider: () => http.Client(),
+          ref: config.branch,
+        );
+        final YamlMap configYaml = loadYaml(configContent) as YamlMap;
+        final pb.SchedulerConfig schedulerConfig = pb.SchedulerConfig()..mergeFromProto3Json(configYaml);
 
-      final List<String> githubBranches = getBranchesForRepository(config.slug);
+        final List<String> githubBranches = getBranchesForRepository(config.slug);
 
-      final Map<String, bool> validEnabledBranches = <String, bool>{};
-      // Add config wide enabled branches
-      for (String enabledBranch in schedulerConfig.enabledBranches) {
-        validEnabledBranches[enabledBranch] = false;
-      }
-      // Add all target specific enabled branches
-      for (pb.Target target in schedulerConfig.targets) {
-        for (String enabledBranch in target.enabledBranches) {
+        final Map<String, bool> validEnabledBranches = <String, bool>{};
+        // Add config wide enabled branches
+        for (String enabledBranch in schedulerConfig.enabledBranches) {
           validEnabledBranches[enabledBranch] = false;
         }
-      }
-
-      // N^2 scan to verify all enabled branch patterns match an exist branch on the repo.
-      for (String enabledBranch in validEnabledBranches.keys) {
-        for (String githubBranch in githubBranches) {
-          if (CiYaml.enabledBranchesMatchesCurrentBranch(<String>[enabledBranch], githubBranch)) {
-            validEnabledBranches[enabledBranch] = true;
+        // Add all target specific enabled branches
+        for (pb.Target target in schedulerConfig.targets) {
+          for (String enabledBranch in target.enabledBranches) {
+            validEnabledBranches[enabledBranch] = false;
           }
         }
-      }
 
-      if (config.slug.name == 'engine') {
-        print(githubBranches);
-        print(validEnabledBranches);
-      }
+        // N^2 scan to verify all enabled branch patterns match an exist branch on the repo.
+        for (String enabledBranch in validEnabledBranches.keys) {
+          for (String githubBranch in githubBranches) {
+            if (CiYaml.enabledBranchesMatchesCurrentBranch(<String>[enabledBranch], githubBranch)) {
+              validEnabledBranches[enabledBranch] = true;
+            }
+          }
+        }
 
-      // Verify the enabled branches
-      for (String enabledBranch in validEnabledBranches.keys) {
-        expect(validEnabledBranches[enabledBranch], isTrue,
-            reason: '$enabledBranch does not match to a branch in ${config.slug.fullName}');
-      }
-    }, skip: config.slug.name == 'flutter');
+        if (config.slug.name == 'engine') {
+          print(githubBranches);
+          print(validEnabledBranches);
+        }
+
+        // Verify the enabled branches
+        for (String enabledBranch in validEnabledBranches.keys) {
+          expect(
+            validEnabledBranches[enabledBranch],
+            isTrue,
+            reason: '$enabledBranch does not match to a branch in ${config.slug.fullName}',
+          );
+        }
+      },
+      skip: config.slug.name == 'flutter',
+    );
   }
 }
 
diff --git a/app_dart/integration_test/validate_test_ownership_test.dart b/app_dart/integration_test/validate_test_ownership_test.dart
index f9bfc15..6710c62 100644
--- a/app_dart/integration_test/validate_test_ownership_test.dart
+++ b/app_dart/integration_test/validate_test_ownership_test.dart
@@ -24,8 +24,8 @@
       const String taskExecutable = 'bin/validate_task_ownership.dart';
       final List<String> taskArgs = <String>[config.slug.name, config.branch];
 
-      ProcessManager processManager = const LocalProcessManager();
-      Process process = await processManager.start(
+      const ProcessManager processManager = LocalProcessManager();
+      final Process process = await processManager.start(
         <String>[dart, taskExecutable, ...taskArgs],
         workingDirectory: Directory.current.path,
       );
diff --git a/app_dart/lib/src/foundation/github_checks_util.dart b/app_dart/lib/src/foundation/github_checks_util.dart
index 7f0a383..6edbb69 100644
--- a/app_dart/lib/src/foundation/github_checks_util.dart
+++ b/app_dart/lib/src/foundation/github_checks_util.dart
@@ -55,17 +55,20 @@
       maxAttempts: 3,
       delayFactor: Duration(seconds: 2),
     );
-    return r.retry(() async {
-      final github.GitHub gitHubClient = await cocoonConfig.createGitHubClient(slug: slug);
-      await gitHubClient.checks.checkRuns.updateCheckRun(
-        slug,
-        checkRun,
-        status: status,
-        conclusion: conclusion,
-        detailsUrl: detailsUrl,
-        output: output,
-      );
-    }, retryIf: (Exception e) => e is github.GitHubError || e is SocketException);
+    return r.retry(
+      () async {
+        final github.GitHub gitHubClient = await cocoonConfig.createGitHubClient(slug: slug);
+        await gitHubClient.checks.checkRuns.updateCheckRun(
+          slug,
+          checkRun,
+          status: status,
+          conclusion: conclusion,
+          detailsUrl: detailsUrl,
+          output: output,
+        );
+      },
+      retryIf: (Exception e) => e is github.GitHubError || e is SocketException,
+    );
   }
 
   Future<github.CheckRun> getCheckRun(
@@ -77,13 +80,16 @@
       maxAttempts: 3,
       delayFactor: Duration(seconds: 2),
     );
-    return r.retry(() async {
-      final github.GitHub gitHubClient = await cocoonConfig.createGitHubClient(slug: slug);
-      return await gitHubClient.checks.checkRuns.getCheckRun(
-        slug,
-        checkRunId: id!,
-      );
-    }, retryIf: (Exception e) => e is github.GitHubError || e is SocketException);
+    return r.retry(
+      () async {
+        final github.GitHub gitHubClient = await cocoonConfig.createGitHubClient(slug: slug);
+        return await gitHubClient.checks.checkRuns.getCheckRun(
+          slug,
+          checkRunId: id!,
+        );
+      },
+      retryIf: (Exception e) => e is github.GitHubError || e is SocketException,
+    );
   }
 
   /// Sends a request to GitHub's Checks API to create a new [github.CheckRun].
@@ -102,18 +108,19 @@
       maxAttempts: 3,
       delayFactor: Duration(seconds: 2),
     );
-    return r.retry(() async {
-      return _createCheckRun(
-        cocoonConfig!,
-        slug,
-        sha,
-        name,
-        output: output,
-      );
-    },
-        retryIf: (Exception e) => e is github.GitHubError || e is SocketException,
-        onRetry: (Exception e) =>
-            log.warning('createCheckRun fails for slug: ${slug.fullName}, sha: $sha, name: $name'));
+    return r.retry(
+      () async {
+        return _createCheckRun(
+          cocoonConfig!,
+          slug,
+          sha,
+          name,
+          output: output,
+        );
+      },
+      retryIf: (Exception e) => e is github.GitHubError || e is SocketException,
+      onRetry: (Exception e) => log.warning('createCheckRun fails for slug: ${slug.fullName}, sha: $sha, name: $name'),
+    );
   }
 
   Future<github.CheckRun> _createCheckRun(
diff --git a/app_dart/lib/src/model/appengine/key_helper.dart b/app_dart/lib/src/model/appengine/key_helper.dart
index 001e443..f5d6be4 100644
--- a/app_dart/lib/src/model/appengine/key_helper.dart
+++ b/app_dart/lib/src/model/appengine/key_helper.dart
@@ -133,18 +133,20 @@
       path.insert(0, current);
     }
     return Path()
-      ..element.addAll(path.map<Path_Element>((Key<dynamic> key) {
-        final Path_Element element = Path_Element();
-        if (key.type != null) {
-          element.type = types.containsKey(key.type) ? types[key.type!]!.name! : key.type.toString();
-        }
-        final Object? id = key.id;
-        if (id is String) {
-          element.name = id;
-        } else if (id is int) {
-          element.id = Int64(id);
-        }
-        return element;
-      }));
+      ..element.addAll(
+        path.map<Path_Element>((Key<dynamic> key) {
+          final Path_Element element = Path_Element();
+          if (key.type != null) {
+            element.type = types.containsKey(key.type) ? types[key.type!]!.name! : key.type.toString();
+          }
+          final Object? id = key.id;
+          if (id is String) {
+            element.name = id;
+          } else if (id is int) {
+            element.id = Int64(id);
+          }
+          return element;
+        }),
+      );
   }
 }
diff --git a/app_dart/lib/src/model/ci_yaml/ci_yaml.dart b/app_dart/lib/src/model/ci_yaml/ci_yaml.dart
index 78b9ea1..4079cd9 100644
--- a/app_dart/lib/src/model/ci_yaml/ci_yaml.dart
+++ b/app_dart/lib/src/model/ci_yaml/ci_yaml.dart
@@ -69,11 +69,13 @@
     return initialTargets.toList();
   }
 
-  Iterable<Target> get _targets => config.targets.map((pb.Target target) => Target(
-        schedulerConfig: config,
-        value: target,
-        slug: slug,
-      ));
+  Iterable<Target> get _targets => config.targets.map(
+        (pb.Target target) => Target(
+          schedulerConfig: config,
+          value: target,
+          slug: slug,
+        ),
+      );
 
   /// Get an unfiltered list of all [targets] that are found in the ci.yaml file.
   List<Target> get targets => _targets.toList();
@@ -157,7 +159,8 @@
         // link to wiki - https://github.com/flutter/flutter/wiki/Reducing-Test-Flakiness#adding-a-new-devicelab-test
         if (totTargets.isNotEmpty && !totTargets.contains(target.name) && target.bringup != true) {
           exceptions.add(
-              'ERROR: ${target.name} is a new builder added. it needs to be marked bringup: true\nIf ci.yaml wasn\'t changed, try `git fetch upstream && git merge upstream/master`');
+            'ERROR: ${target.name} is a new builder added. it needs to be marked bringup: true\nIf ci.yaml wasn\'t changed, try `git fetch upstream && git merge upstream/master`',
+          );
           continue;
         }
         targetGraph[target.name] = <pb.Target>[];
@@ -211,13 +214,13 @@
     final List<String> exceptions = <String>[];
 
     /// Decoded will contain a list of maps for the dependencies found.
-    List<dynamic> decoded = json.decode(dependencyJsonString) as List<dynamic>;
+    final List<dynamic> decoded = json.decode(dependencyJsonString) as List<dynamic>;
 
     for (Map<String, dynamic> depMap in decoded) {
       if (!depMap.containsKey('version')) {
         exceptions.add('ERROR: dependency ${depMap['dependency']} must have a version.');
       } else {
-        String version = depMap['version'] as String;
+        final String version = depMap['version'] as String;
         if (version.isEmpty || version == 'latest') {
           exceptions
               .add('ERROR: dependency ${depMap['dependency']} must have a non empty, non "latest" version supplied.');
diff --git a/app_dart/lib/src/model/ci_yaml/target.dart b/app_dart/lib/src/model/ci_yaml/target.dart
index 812083b..0306e82 100644
--- a/app_dart/lib/src/model/ci_yaml/target.dart
+++ b/app_dart/lib/src/model/ci_yaml/target.dart
@@ -53,7 +53,7 @@
 
     final Map<String, Object> platformDimensions = _getPlatformDimensions();
     for (String key in platformDimensions.keys) {
-      String value = platformDimensions[key].toString();
+      final String value = platformDimensions[key].toString();
       dimensionsMap[key] = RequestedDimension(key: key, value: value);
     }
 
@@ -62,14 +62,14 @@
     // remove this logic after dimensions are supported in ci.yaml files
     for (String dimension in dimensionList) {
       if (properties.containsKey(dimension)) {
-        String value = properties[dimension].toString();
+        final String value = properties[dimension].toString();
         dimensionsMap[dimension] = RequestedDimension(key: dimension, value: value);
       }
     }
 
     final Map<String, Object> targetDimensions = _getTargetDimensions();
     for (String key in targetDimensions.keys) {
-      String value = targetDimensions[key].toString();
+      final String value = targetDimensions[key].toString();
       dimensionsMap[key] = RequestedDimension(key: key, value: value);
     }
 
@@ -93,7 +93,7 @@
   ///
   /// Return an empty list if no tags are found.
   List<String> get tags {
-    Map<String, Object> properties = getProperties();
+    final Map<String, Object> properties = getProperties();
     return (properties.containsKey('tags')) ? (properties['tags'] as List).map((e) => e as String).toList() : [];
   }
 
diff --git a/app_dart/lib/src/model/luci/buildbucket.dart b/app_dart/lib/src/model/luci/buildbucket.dart
index f063d8e..88bebad 100644
--- a/app_dart/lib/src/model/luci/buildbucket.dart
+++ b/app_dart/lib/src/model/luci/buildbucket.dart
@@ -56,10 +56,12 @@
     this.searchBuilds,
     this.scheduleBuild,
     this.cancelBuild,
-  }) : assert((getBuild != null && searchBuilds == null && scheduleBuild == null && cancelBuild == null) ||
-            (getBuild == null && searchBuilds != null && scheduleBuild == null && cancelBuild == null) ||
-            (getBuild == null && searchBuilds == null && scheduleBuild != null && cancelBuild == null) ||
-            (getBuild == null && searchBuilds == null && scheduleBuild == null && cancelBuild != null));
+  }) : assert(
+          (getBuild != null && searchBuilds == null && scheduleBuild == null && cancelBuild == null) ||
+              (getBuild == null && searchBuilds != null && scheduleBuild == null && cancelBuild == null) ||
+              (getBuild == null && searchBuilds == null && scheduleBuild != null && cancelBuild == null) ||
+              (getBuild == null && searchBuilds == null && scheduleBuild == null && cancelBuild != null),
+        );
 
   /// Creates a [Request] object from JSON.
   static Request fromJson(Map<String, dynamic> json) => _$RequestFromJson(json);
@@ -122,7 +124,8 @@
     this.cancelBuild,
     this.error,
   }) : assert(
-            getBuild != null || searchBuilds != null || scheduleBuild != null || cancelBuild != null || error != null);
+          getBuild != null || searchBuilds != null || scheduleBuild != null || cancelBuild != null || error != null,
+        );
 
   /// Creates a [Response] from JSON.
   static Response fromJson(Map<String, dynamic> json) => _$ResponseFromJson(json);
@@ -170,8 +173,10 @@
     this.builderId,
     this.buildNumber,
     this.fields,
-  }) : assert((id == null && builderId != null && buildNumber != null) ||
-            (id != null && builderId == null && buildNumber == null));
+  }) : assert(
+          (id == null && builderId != null && buildNumber != null) ||
+              (id != null && builderId == null && buildNumber == null),
+        );
 
   /// Creates a [GetBuildRequest] from JSON.
   static GetBuildRequest fromJson(Map<String, dynamic> json) => _$GetBuildRequestFromJson(json);
diff --git a/app_dart/lib/src/request_handlers/check_flaky_builders.dart b/app_dart/lib/src/request_handlers/check_flaky_builders.dart
index c678596..958a88b 100644
--- a/app_dart/lib/src/request_handlers/check_flaky_builders.dart
+++ b/app_dart/lib/src/request_handlers/check_flaky_builders.dart
@@ -105,8 +105,12 @@
   /// 3. The builder is not in [ignoredBuilders].
   /// 4. The flaky issue of the builder is closed if there is one.
   /// 5. Does not have any existing pr against the builder.
-  Future<List<_BuilderInfo>> _getEligibleFlakyBuilders(GithubService gitHub, RepositorySlug slug,
-      {required String content, required CiYaml ciYaml}) async {
+  Future<List<_BuilderInfo>> _getEligibleFlakyBuilders(
+    GithubService gitHub,
+    RepositorySlug slug, {
+    required String content,
+    required CiYaml ciYaml,
+  }) async {
     final YamlMap ci = loadYaml(content) as YamlMap;
     final YamlList targets = ci[kCiYamlTargetsKey] as YamlList;
     final List<YamlMap?> flakyTargets = targets
@@ -169,7 +173,11 @@
     final String modifiedContent = _deflakeBuilderInContent(ciContent, info.name);
     final GitReference masterRef = await gitHub.getReference(slug, kMasterRefs);
     final DeflakePullRequestBuilder prBuilder = DeflakePullRequestBuilder(
-        name: info.name, recordNumber: kRecordNumber, ownership: testOwnership, issue: info.existingIssue);
+      name: info.name,
+      recordNumber: kRecordNumber,
+      ownership: testOwnership,
+      issue: info.existingIssue,
+    );
     final PullRequest pullRequest = await gitHub.createPullRequest(
       slug,
       title: prBuilder.pullRequestTitle,
diff --git a/app_dart/lib/src/request_handlers/file_flaky_issue_and_pr.dart b/app_dart/lib/src/request_handlers/file_flaky_issue_and_pr.dart
index 1decf11..307de14 100644
--- a/app_dart/lib/src/request_handlers/file_flaky_issue_and_pr.dart
+++ b/app_dart/lib/src/request_handlers/file_flaky_issue_and_pr.dart
@@ -62,12 +62,13 @@
         gitHub,
         slug,
         builderDetail: BuilderDetail(
-            statistic: statistic,
-            existingIssue: nameToExistingIssue[statistic.name],
-            existingPullRequest: nameToExistingPR[statistic.name],
-            isMarkedFlaky: _getIsMarkedFlaky(statistic.name, ci!),
-            type: type,
-            ownership: getTestOwnership(statistic.name, type, testOwnerContent)),
+          statistic: statistic,
+          existingIssue: nameToExistingIssue[statistic.name],
+          existingPullRequest: nameToExistingPR[statistic.name],
+          isMarkedFlaky: _getIsMarkedFlaky(statistic.name, ci!),
+          type: type,
+          ownership: getTestOwnership(statistic.name, type, testOwnerContent),
+        ),
       );
     }
     return Body.forJson(const <String, dynamic>{
@@ -95,28 +96,31 @@
       return;
     }
     final String modifiedContent = _marksBuildFlakyInContent(
-        await gitHub.getFileContent(
-          slug,
-          kCiYamlPath,
-        ),
-        builderDetail.statistic.name,
-        issue.htmlUrl);
+      await gitHub.getFileContent(
+        slug,
+        kCiYamlPath,
+      ),
+      builderDetail.statistic.name,
+      issue.htmlUrl,
+    );
     final GitReference masterRef = await gitHub.getReference(slug, kMasterRefs);
     final PullRequestBuilder prBuilder =
         PullRequestBuilder(statistic: builderDetail.statistic, ownership: builderDetail.ownership, issue: issue);
-    final PullRequest pullRequest = await gitHub.createPullRequest(slug,
-        title: prBuilder.pullRequestTitle,
-        body: prBuilder.pullRequestBody,
-        commitMessage: prBuilder.pullRequestTitle,
-        baseRef: masterRef,
-        entries: <CreateGitTreeEntry>[
-          CreateGitTreeEntry(
-            kCiYamlPath,
-            kModifyMode,
-            kModifyType,
-            content: modifiedContent,
-          )
-        ]);
+    final PullRequest pullRequest = await gitHub.createPullRequest(
+      slug,
+      title: prBuilder.pullRequestTitle,
+      body: prBuilder.pullRequestBody,
+      commitMessage: prBuilder.pullRequestTitle,
+      baseRef: masterRef,
+      entries: <CreateGitTreeEntry>[
+        CreateGitTreeEntry(
+          kCiYamlPath,
+          kModifyMode,
+          kModifyType,
+          content: modifiedContent,
+        )
+      ],
+    );
     await gitHub.assignReviewer(slug, reviewer: prBuilder.pullRequestReviewer, pullRequestNumber: pullRequest.number);
   }
 
diff --git a/app_dart/lib/src/request_handlers/get_branches.dart b/app_dart/lib/src/request_handlers/get_branches.dart
index a020572..3b81d80 100644
--- a/app_dart/lib/src/request_handlers/get_branches.dart
+++ b/app_dart/lib/src/request_handlers/get_branches.dart
@@ -54,8 +54,9 @@
 
     final List<Branch> branches = await datastore
         .queryBranches()
-        .where((Branch b) =>
-            DateTime.now().millisecondsSinceEpoch - b.lastActivity! < kActiveBranchActivity.inMilliseconds)
+        .where(
+          (Branch b) => DateTime.now().millisecondsSinceEpoch - b.lastActivity! < kActiveBranchActivity.inMilliseconds,
+        )
         .toList();
     return Body.forJson(branches);
   }
diff --git a/app_dart/lib/src/request_handlers/get_green_commits.dart b/app_dart/lib/src/request_handlers/get_green_commits.dart
index e8a0ce7..8a3adba 100644
--- a/app_dart/lib/src/request_handlers/get_green_commits.dart
+++ b/app_dart/lib/src/request_handlers/get_green_commits.dart
@@ -69,8 +69,10 @@
   }
 
   bool everyNonFlakyTaskSucceed(CommitStatus status) {
-    return status.stages.every((Stage stage) => stage.tasks
-        .where((Task task) => !task.isFlaky!)
-        .every((Task nonFlakyTask) => nonFlakyTask.status == Task.statusSucceeded));
+    return status.stages.every(
+      (Stage stage) => stage.tasks
+          .where((Task task) => !task.isFlaky!)
+          .every((Task nonFlakyTask) => nonFlakyTask.status == Task.statusSucceeded),
+    );
   }
 }
diff --git a/app_dart/lib/src/request_handlers/get_release_branches.dart b/app_dart/lib/src/request_handlers/get_release_branches.dart
index e313dcb..f698e2f 100644
--- a/app_dart/lib/src/request_handlers/get_release_branches.dart
+++ b/app_dart/lib/src/request_handlers/get_release_branches.dart
@@ -41,7 +41,7 @@
   Future<Body> get() async {
     final GitHub github = await config.createGitHubClient(slug: Config.flutterSlug);
     final GithubService githubService = GithubService(github);
-    List<Map<String, String>> branchNames =
+    final List<Map<String, String>> branchNames =
         await branchService.getReleaseBranches(githubService: githubService, slug: Config.flutterSlug);
     return Body.forJson(branchNames);
   }
diff --git a/app_dart/lib/src/request_handlers/get_status.dart b/app_dart/lib/src/request_handlers/get_status.dart
index 49ee363..3e29791 100644
--- a/app_dart/lib/src/request_handlers/get_status.dart
+++ b/app_dart/lib/src/request_handlers/get_status.dart
@@ -52,7 +52,8 @@
           slug: slug,
         )
         .map<SerializableCommitStatus>(
-            (CommitStatus status) => SerializableCommitStatus(status, keyHelper.encode(status.commit.key)))
+          (CommitStatus status) => SerializableCommitStatus(status, keyHelper.encode(status.commit.key)),
+        )
         .toList();
 
     return Body.forJson(<String, dynamic>{
@@ -69,8 +70,10 @@
 
     if (encodedLastCommitKey != null) {
       final Key<String> ownerKey = keyHelper.decode(encodedLastCommitKey) as Key<String>;
-      final Commit commit = await datastore.db.lookupValue<Commit>(ownerKey,
-          orElse: () => throw NotFoundException('Failed to find commit with key $ownerKey'));
+      final Commit commit = await datastore.db.lookupValue<Commit>(
+        ownerKey,
+        orElse: () => throw NotFoundException('Failed to find commit with key $ownerKey'),
+      );
 
       lastCommitTimestamp = commit.timestamp!;
     }
diff --git a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart
index a93fad8..ed8c7ae 100644
--- a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart
+++ b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart
@@ -160,7 +160,8 @@
     final RepositorySlug slug = pullRequestEvent.repository!.slug();
 
     log.info(
-        'Scheduling tasks if mergeable(${pr.mergeable}): owner=${slug.owner} repo=${slug.name} and pr=${pr.number}');
+      'Scheduling tasks if mergeable(${pr.mergeable}): owner=${slug.owner} repo=${slug.name} and pr=${pr.number}',
+    );
 
     // The mergeable flag may be null. False indicates there's a merge conflict,
     // null indicates unknown. Err on the side of allowing the job to run.
diff --git a/app_dart/lib/src/request_handlers/postsubmit_luci_subscription.dart b/app_dart/lib/src/request_handlers/postsubmit_luci_subscription.dart
index 7db236a..50f178d 100644
--- a/app_dart/lib/src/request_handlers/postsubmit_luci_subscription.dart
+++ b/app_dart/lib/src/request_handlers/postsubmit_luci_subscription.dart
@@ -80,7 +80,7 @@
       // create the slug from the data in the message and send the check status
       // update.
 
-      RepositorySlug slug = RepositorySlug(
+      final RepositorySlug slug = RepositorySlug(
         userData['repo_owner'] as String,
         userData['repo_name'] as String,
       );
diff --git a/app_dart/lib/src/request_handlers/push_gold_status_to_github.dart b/app_dart/lib/src/request_handlers/push_gold_status_to_github.dart
index d0f34f6..e774586 100644
--- a/app_dart/lib/src/request_handlers/push_gold_status_to_github.dart
+++ b/app_dart/lib/src/request_handlers/push_gold_status_to_github.dart
@@ -157,12 +157,11 @@
           // Get Gold status.
           final String goldStatus = await _getGoldStatus(slug, pr);
           statusRequest = _createStatus(
-              goldStatus,
-              goldStatus == GithubGoldStatusUpdate.statusRunning
-                  ? config.flutterGoldChanges
-                  : config.flutterGoldSuccess,
-              slug,
-              pr.number!);
+            goldStatus,
+            goldStatus == GithubGoldStatusUpdate.statusRunning ? config.flutterGoldChanges : config.flutterGoldSuccess,
+            slug,
+            pr.number!,
+          );
           log.fine('New status for potential update: ${statusRequest.state}, ${statusRequest.description}');
           if (goldStatus == GithubGoldStatusUpdate.statusRunning &&
               !await _alreadyCommented(gitHubClient, pr, slug, config.flutterGoldCommentID(pr))) {
diff --git a/app_dart/lib/src/request_handlers/refresh_cirrus_status.dart b/app_dart/lib/src/request_handlers/refresh_cirrus_status.dart
index 49c27c5..e8002af 100644
--- a/app_dart/lib/src/request_handlers/refresh_cirrus_status.dart
+++ b/app_dart/lib/src/request_handlers/refresh_cirrus_status.dart
@@ -74,9 +74,9 @@
   }
   final Map<String, dynamic> searchBuild = searchBuilds.first as Map<String, dynamic>;
   tasks.addAll((searchBuild['latestGroupTasks'] as List<dynamic>).cast<Map<String, dynamic>>());
-  String? id = searchBuild['id'] as String?;
+  final String? id = searchBuild['id'] as String?;
   log.info('Cirrus searchBuild id for flutter/$name, commit: $sha: $id');
-  String? branch = searchBuild['branch'] as String?;
+  final String? branch = searchBuild['branch'] as String?;
   return CirrusResult(id, branch, tasks);
 }
 
diff --git a/app_dart/lib/src/request_handlers/scheduler/batch_backfiller.dart b/app_dart/lib/src/request_handlers/scheduler/batch_backfiller.dart
index e17455c..a0d2643 100644
--- a/app_dart/lib/src/request_handlers/scheduler/batch_backfiller.dart
+++ b/app_dart/lib/src/request_handlers/scheduler/batch_backfiller.dart
@@ -87,7 +87,8 @@
         transaction.queueMutations(inserts: backfillTasks);
         await transaction.commit();
         log.fine(
-            'Updated ${backfillTasks.length} tasks: ${backfillTasks.map((e) => e.name).toList()} when backfilling.');
+          'Updated ${backfillTasks.length} tasks: ${backfillTasks.map((e) => e.name).toList()} when backfilling.',
+        );
       });
       // Schedule all builds asynchronously.
       // Schedule after db updates to avoid duplicate scheduling when db update fails.
@@ -107,10 +108,12 @@
         tuple.second.task,
         tuple.third,
       );
-      futures.add(scheduler.luciBuildService.schedulePostsubmitBuilds(
-        commit: tuple.second.commit,
-        toBeScheduled: [toBeScheduled],
-      ));
+      futures.add(
+        scheduler.luciBuildService.schedulePostsubmitBuilds(
+          commit: tuple.second.commit,
+          toBeScheduled: [toBeScheduled],
+        ),
+      );
     }
     return futures;
   }
diff --git a/app_dart/lib/src/request_handlers/update_branches.dart b/app_dart/lib/src/request_handlers/update_branches.dart
index 8943f8d..72366c5 100644
--- a/app_dart/lib/src/request_handlers/update_branches.dart
+++ b/app_dart/lib/src/request_handlers/update_branches.dart
@@ -61,19 +61,21 @@
 
     final List<md.Branch> branches = await datastore
         .queryBranches()
-        .where((md.Branch b) =>
-            DateTime.now().millisecondsSinceEpoch - b.lastActivity! < kActiveBranchActivityPeriod.inMilliseconds)
+        .where(
+          (md.Branch b) =>
+              DateTime.now().millisecondsSinceEpoch - b.lastActivity! < kActiveBranchActivityPeriod.inMilliseconds,
+        )
         .toList();
     return Body.forJson(branches);
   }
 
   Future<void> _updateBranchesForAllRepos(Config config, DatastoreService datastore) async {
-    DateTime timeNow = DateTime.now();
+    final DateTime timeNow = DateTime.now();
 
     processManager ??= const LocalProcessManager();
     final Set<RepositorySlug> slugs = config.supportedRepos;
     for (RepositorySlug slug in slugs) {
-      ProcessResult result =
+      final ProcessResult result =
           processManager!.runSync(['git', 'ls-remote', '--heads', 'git@github.com:flutter/${slug.name}']);
       // https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499- only a exit code of 0 is good for windows
       // for mac or linux, exit code in the range 0 to 255 is good
@@ -81,9 +83,9 @@
           ((Platform.isMacOS || Platform.isLinux) && result.exitCode < 0)) {
         throw const FormatException('returned exit code from git ls-remote is bad');
       }
-      List<String> shaAndName = (result.stdout as String).trim().split(RegExp(' |\t|\r?\n'));
-      List<String> branchShas = [];
-      List<String> branchNames = [];
+      final List<String> shaAndName = (result.stdout as String).trim().split(RegExp(' |\t|\r?\n'));
+      final List<String> branchShas = [];
+      final List<String> branchNames = [];
       for (int i = 0; i < shaAndName.length; i += 2) {
         branchShas.add(shaAndName[i]);
         branchNames.add(shaAndName[i + 1].replaceAll('refs/heads/', ''));
@@ -94,12 +96,18 @@
     return;
   }
 
-  Future<void> _updateBranchesForRepo(List<String> branchShas, List<String> branchNames, GitHub github,
-      RepositorySlug slug, DatastoreService datastore, DateTime timeNow) async {
-    List<md.Branch> updatedBranches = [];
+  Future<void> _updateBranchesForRepo(
+    List<String> branchShas,
+    List<String> branchNames,
+    GitHub github,
+    RepositorySlug slug,
+    DatastoreService datastore,
+    DateTime timeNow,
+  ) async {
+    final List<md.Branch> updatedBranches = [];
     for (int i = 0; i < branchShas.length; i += 1) {
       final RepositoryCommit branchCommit = await github.repositories.getCommit(slug, branchShas[i]);
-      int lastUpdate = branchCommit.commit!.committer!.date!.millisecondsSinceEpoch;
+      final int lastUpdate = branchCommit.commit!.committer!.date!.millisecondsSinceEpoch;
       if (lastUpdate > timeNow.subtract(kActiveBranchActivityPeriod).millisecondsSinceEpoch) {
         final String id = '${slug.fullName}/${branchNames[i]}';
         final Key<String> key = datastore.db.emptyKey.append<String>(Branch, id: id);
diff --git a/app_dart/lib/src/request_handlers/update_existing_flaky_issues.dart b/app_dart/lib/src/request_handlers/update_existing_flaky_issues.dart
index a25caf0..b9ffda1 100644
--- a/app_dart/lib/src/request_handlers/update_existing_flaky_issues.dart
+++ b/app_dart/lib/src/request_handlers/update_existing_flaky_issues.dart
@@ -44,10 +44,12 @@
 
     CiYaml? localCiYaml = ciYaml;
     if (localCiYaml == null) {
-      final YamlMap? ci = loadYaml(await gitHub.getFileContent(
-        slug,
-        kCiYamlPath,
-      )) as YamlMap?;
+      final YamlMap? ci = loadYaml(
+        await gitHub.getFileContent(
+          slug,
+          kCiYamlPath,
+        ),
+      ) as YamlMap?;
       final pb.SchedulerConfig unCheckedSchedulerConfig = pb.SchedulerConfig()..mergeFromProto3Json(ci);
       localCiYaml = CiYaml(
         slug: slug,
diff --git a/app_dart/lib/src/request_handlers/vacuum_github_commits.dart b/app_dart/lib/src/request_handlers/vacuum_github_commits.dart
index 78a1125..3d814a4 100644
--- a/app_dart/lib/src/request_handlers/vacuum_github_commits.dart
+++ b/app_dart/lib/src/request_handlers/vacuum_github_commits.dart
@@ -67,8 +67,10 @@
       // Do not try to add recent commits as they may already be processed
       // by cocoon, which can cause race conditions.
       commits = commits
-          .where((gh.RepositoryCommit commit) =>
-              commit.commit!.committer!.date!.millisecondsSinceEpoch < queryBefore.millisecondsSinceEpoch)
+          .where(
+            (gh.RepositoryCommit commit) =>
+                commit.commit!.committer!.date!.millisecondsSinceEpoch < queryBefore.millisecondsSinceEpoch,
+          )
           .toList();
     } on gh.GitHubError catch (error) {
       log.severe('$error');
@@ -79,23 +81,29 @@
 
   /// Convert [gh.RepositoryCommit] to Cocoon's [Commit] format.
   Future<List<Commit>> _toDatastoreCommit(
-      gh.RepositorySlug slug, List<gh.RepositoryCommit> commits, DatastoreService? datastore, String branch) async {
+    gh.RepositorySlug slug,
+    List<gh.RepositoryCommit> commits,
+    DatastoreService? datastore,
+    String branch,
+  ) async {
     final List<Commit> recentCommits = <Commit>[];
     for (gh.RepositoryCommit commit in commits) {
       final String id = '${slug.fullName}/$branch/${commit.sha}';
       final Key<String> key = datastore!.db.emptyKey.append<String>(Commit, id: id);
-      recentCommits.add(Commit(
-        key: key,
-        timestamp: commit.commit!.committer!.date!.millisecondsSinceEpoch,
-        repository: slug.fullName,
-        sha: commit.sha!,
-        author: commit.author!.login!,
-        authorAvatarUrl: commit.author!.avatarUrl!,
-        // The field has a size of 1500 we need to ensure the commit message
-        // is at most 1500 chars long.
-        message: truncate(commit.commit!.message!, 1490, omission: '...'),
-        branch: branch,
-      ));
+      recentCommits.add(
+        Commit(
+          key: key,
+          timestamp: commit.commit!.committer!.date!.millisecondsSinceEpoch,
+          repository: slug.fullName,
+          sha: commit.sha!,
+          author: commit.author!.login!,
+          authorAvatarUrl: commit.author!.avatarUrl!,
+          // The field has a size of 1500 we need to ensure the commit message
+          // is at most 1500 chars long.
+          message: truncate(commit.commit!.message!, 1490, omission: '...'),
+          branch: branch,
+        ),
+      );
     }
     return recentCommits;
   }
diff --git a/app_dart/lib/src/request_handling/api_request_handler.dart b/app_dart/lib/src/request_handling/api_request_handler.dart
index f43b738..b20e178 100644
--- a/app_dart/lib/src/request_handling/api_request_handler.dart
+++ b/app_dart/lib/src/request_handling/api_request_handler.dart
@@ -146,13 +146,16 @@
       }
     }
 
-    await runZoned<Future<void>>(() async {
-      await super.service(request);
-    }, zoneValues: <ApiKey<dynamic>, Object?>{
-      ApiKey.authContext: context,
-      ApiKey.requestBody: Uint8List.fromList(body),
-      ApiKey.requestData: requestData,
-    });
+    await runZoned<Future<void>>(
+      () async {
+        await super.service(request);
+      },
+      zoneValues: <ApiKey<dynamic>, Object?>{
+        ApiKey.authContext: context,
+        ApiKey.requestBody: Uint8List.fromList(body),
+        ApiKey.requestData: requestData,
+      },
+    );
   }
 }
 
diff --git a/app_dart/lib/src/request_handling/authentication.dart b/app_dart/lib/src/request_handling/authentication.dart
index 69d2fd7..21d99ee 100644
--- a/app_dart/lib/src/request_handling/authentication.dart
+++ b/app_dart/lib/src/request_handling/authentication.dart
@@ -105,13 +105,15 @@
     final String? idTokenFromHeader = request.headers.value('X-Flutter-IdToken');
     final http.Client client = httpClientProvider();
     try {
-      final http.Response verifyTokenResponse = await client.get(Uri.https(
-        'oauth2.googleapis.com',
-        '/tokeninfo',
-        <String, String?>{
-          tokenType: idTokenFromHeader,
-        },
-      ));
+      final http.Response verifyTokenResponse = await client.get(
+        Uri.https(
+          'oauth2.googleapis.com',
+          '/tokeninfo',
+          <String, String?>{
+            tokenType: idTokenFromHeader,
+          },
+        ),
+      );
 
       if (verifyTokenResponse.statusCode != HttpStatus.ok) {
         /// Google Auth API returns a message in the response body explaining why
diff --git a/app_dart/lib/src/request_handling/no_auth_request_handler.dart b/app_dart/lib/src/request_handling/no_auth_request_handler.dart
index d2a6026..92a5244 100644
--- a/app_dart/lib/src/request_handling/no_auth_request_handler.dart
+++ b/app_dart/lib/src/request_handling/no_auth_request_handler.dart
@@ -98,12 +98,15 @@
       }
     }
 
-    await runZoned<Future<void>>(() async {
-      await super.service(request);
-    }, zoneValues: <NoAuthKey<dynamic>, Object?>{
-      NoAuthKey.requestBody: Uint8List.fromList(body),
-      NoAuthKey.requestData: requestData,
-    });
+    await runZoned<Future<void>>(
+      () async {
+        await super.service(request);
+      },
+      zoneValues: <NoAuthKey<dynamic>, Object?>{
+        NoAuthKey.requestBody: Uint8List.fromList(body),
+        NoAuthKey.requestData: requestData,
+      },
+    );
   }
 }
 
diff --git a/app_dart/lib/src/request_handling/pubsub.dart b/app_dart/lib/src/request_handling/pubsub.dart
index c5d42f3..e9deacc 100644
--- a/app_dart/lib/src/request_handling/pubsub.dart
+++ b/app_dart/lib/src/request_handling/pubsub.dart
@@ -21,16 +21,20 @@
   final HttpClientProvider httpClientProvider;
 
   Future<void> publish(String topic, dynamic json) async {
-    final Client httpClient = await clientViaApplicationDefaultCredentials(scopes: <String>[
-      PubsubApi.pubsubScope,
-    ]);
+    final Client httpClient = await clientViaApplicationDefaultCredentials(
+      scopes: <String>[
+        PubsubApi.pubsubScope,
+      ],
+    );
     final PubsubApi pubsubApi = PubsubApi(httpClient);
     final String messageData = jsonEncode(json);
     final List<int> messageBytes = utf8.encode(messageData);
     final String messageBase64 = base64Encode(messageBytes);
-    final PublishRequest request = PublishRequest(messages: <PubsubMessage>[
-      PubsubMessage(data: messageBase64),
-    ]);
+    final PublishRequest request = PublishRequest(
+      messages: <PubsubMessage>[
+        PubsubMessage(data: messageBase64),
+      ],
+    );
     final String fullTopicName = 'projects/flutter-dashboard/topics/$topic';
     final PublishResponse response = await pubsubApi.projects.topics.publish(request, fullTopicName);
     log.info('pubsub response messageId=${response.messageIds}');
diff --git a/app_dart/lib/src/request_handling/request_handler.dart b/app_dart/lib/src/request_handling/request_handler.dart
index 8e57bf4..2577b4c 100644
--- a/app_dart/lib/src/request_handling/request_handler.dart
+++ b/app_dart/lib/src/request_handling/request_handler.dart
@@ -39,46 +39,49 @@
     HttpRequest request, {
     Future<void> Function(HttpStatusException)? onError,
   }) {
-    return runZoned<Future<void>>(() async {
-      final HttpResponse response = request.response;
-      try {
+    return runZoned<Future<void>>(
+      () async {
+        final HttpResponse response = request.response;
         try {
-          T body;
-          switch (request.method) {
-            case 'GET':
-              body = await get();
-              break;
-            case 'POST':
-              body = await post();
-              break;
-            default:
-              throw MethodNotAllowed(request.method);
+          try {
+            T body;
+            switch (request.method) {
+              case 'GET':
+                body = await get();
+                break;
+              case 'POST':
+                body = await post();
+                break;
+              default:
+                throw MethodNotAllowed(request.method);
+            }
+            await _respond(body: body);
+            httpClient?.close();
+            return;
+          } on HttpStatusException {
+            rethrow;
+          } catch (error, stackTrace) {
+            log.severe('$error\n$stackTrace');
+            throw InternalServerError('$error\n$stackTrace');
           }
-          await _respond(body: body);
-          httpClient?.close();
+        } on HttpStatusException catch (error) {
+          if (onError != null) {
+            await onError(error);
+          }
+          response
+            ..statusCode = error.statusCode
+            ..write(error.message);
+          await response.flush();
+          await response.close();
           return;
-        } on HttpStatusException {
-          rethrow;
-        } catch (error, stackTrace) {
-          log.severe('$error\n$stackTrace');
-          throw InternalServerError('$error\n$stackTrace');
         }
-      } on HttpStatusException catch (error) {
-        if (onError != null) {
-          await onError(error);
-        }
-        response
-          ..statusCode = error.statusCode
-          ..write(error.message);
-        await response.flush();
-        await response.close();
-        return;
-      }
-    }, zoneValues: <RequestKey<dynamic>, Object>{
-      RequestKey.request: request,
-      RequestKey.response: request.response,
-      RequestKey.httpClient: httpClient ?? http.Client(),
-    });
+      },
+      zoneValues: <RequestKey<dynamic>, Object>{
+        RequestKey.request: request,
+        RequestKey.response: request.response,
+        RequestKey.httpClient: httpClient ?? http.Client(),
+      },
+    );
   }
 
   /// Responds (using [response]) with the specified [status] and optional
diff --git a/app_dart/lib/src/request_handling/swarming_authentication.dart b/app_dart/lib/src/request_handling/swarming_authentication.dart
index a6d9ce0..4362e94 100644
--- a/app_dart/lib/src/request_handling/swarming_authentication.dart
+++ b/app_dart/lib/src/request_handling/swarming_authentication.dart
@@ -69,19 +69,23 @@
   /// if they belong to a LUCI prod service account.
   ///
   /// If LUCI auth adds id tokens, we can switch to that and remove this.
-  Future<AuthenticatedContext> authenticateAccessToken(String accessToken,
-      {required ClientContext clientContext}) async {
+  Future<AuthenticatedContext> authenticateAccessToken(
+    String accessToken, {
+    required ClientContext clientContext,
+  }) async {
     // Authenticate as a signed-in Google account via OAuth id token.
     final Client client = httpClientProvider();
     try {
       log.fine('Sending token request to Google OAuth');
-      final Response verifyTokenResponse = await client.get(Uri.https(
-        'oauth2.googleapis.com',
-        '/tokeninfo',
-        <String, String>{
-          'access_token': accessToken,
-        },
-      ));
+      final Response verifyTokenResponse = await client.get(
+        Uri.https(
+          'oauth2.googleapis.com',
+          '/tokeninfo',
+          <String, String>{
+            'access_token': accessToken,
+          },
+        ),
+      );
 
       if (verifyTokenResponse.statusCode != HttpStatus.ok) {
         /// Google Auth API returns a message in the response body explaining why
diff --git a/app_dart/lib/src/service/bigquery.dart b/app_dart/lib/src/service/bigquery.dart
index 650362a..7c7e9d4 100644
--- a/app_dart/lib/src/service/bigquery.dart
+++ b/app_dart/lib/src/service/bigquery.dart
@@ -108,8 +108,11 @@
   ///
   /// See getBuilderStatisticQuery to get the detail information about the table
   /// schema
-  Future<List<BuilderStatistic>> listBuilderStatistic(String projectId,
-      {int limit = 100, String bucket = 'prod'}) async {
+  Future<List<BuilderStatistic>> listBuilderStatistic(
+    String projectId, {
+    int limit = 100,
+    String bucket = 'prod',
+  }) async {
     final JobsResource jobsResource = await defaultJobs();
     final QueryRequest query = QueryRequest.fromJson(<String, Object>{
       'query': bucket == 'staging' ? getStagingBuilderStatisticQuery : getBuilderStatisticQuery,
@@ -135,16 +138,18 @@
       List<String>? succeededBuilds = (row.f![4].v as String?)?.split(', ');
       succeededBuilds?.sort();
       succeededBuilds = succeededBuilds?.reversed.toList();
-      result.add(BuilderStatistic(
-        name: builder,
-        flakyRate: double.parse(row.f![7].v as String),
-        flakyBuilds: flakyBuilds ?? const <String>[],
-        succeededBuilds: succeededBuilds ?? const <String>[],
-        recentCommit: row.f![5].v as String?,
-        flakyBuildOfRecentCommit: row.f![6].v as String?,
-        flakyNumber: int.parse(row.f![1].v as String),
-        totalNumber: int.parse(row.f![2].v as String),
-      ));
+      result.add(
+        BuilderStatistic(
+          name: builder,
+          flakyRate: double.parse(row.f![7].v as String),
+          flakyBuilds: flakyBuilds ?? const <String>[],
+          succeededBuilds: succeededBuilds ?? const <String>[],
+          recentCommit: row.f![5].v as String?,
+          flakyBuildOfRecentCommit: row.f![6].v as String?,
+          flakyNumber: int.parse(row.f![1].v as String),
+          totalNumber: int.parse(row.f![2].v as String),
+        ),
+      );
     }
     return result;
   }
@@ -186,11 +191,13 @@
       return result;
     }
     for (final TableRow row in response.rows!) {
-      result.add(BuilderRecord(
-        commit: row.f![0].v as String,
-        isFlaky: row.f![1].v as String != '0',
-        isFailed: row.f![2].v as String != '0',
-      ));
+      result.add(
+        BuilderRecord(
+          commit: row.f![0].v as String,
+          isFlaky: row.f![1].v as String != '0',
+          isFailed: row.f![2].v as String != '0',
+        ),
+      );
     }
     return result;
   }
diff --git a/app_dart/lib/src/service/branch_service.dart b/app_dart/lib/src/service/branch_service.dart
index 3d11185..4409367 100644
--- a/app_dart/lib/src/service/branch_service.dart
+++ b/app_dart/lib/src/service/branch_service.dart
@@ -88,8 +88,11 @@
   /// short timespan, and require the release manager to CP onto the recipes branch (in the case of reverts).
   Future<void> branchFlutterRecipes(String branch) async {
     final gh.RepositorySlug recipesSlug = gh.RepositorySlug('flutter', 'recipes');
-    if ((await gerritService.branches('${recipesSlug.owner}-review.googlesource.com', recipesSlug.name,
-            filterRegex: branch))
+    if ((await gerritService.branches(
+      '${recipesSlug.owner}-review.googlesource.com',
+      recipesSlug.name,
+      filterRegex: branch,
+    ))
         .contains(branch)) {
       // subString is a regex, and can return multiple matches
       log.warning('$branch already exists for $recipesSlug');
@@ -122,7 +125,7 @@
     required GithubService githubService,
     required gh.RepositorySlug slug,
   }) async {
-    List<gh.Branch> branches = await githubService.github.repositories.listBranches(slug).toList();
+    final List<gh.Branch> branches = await githubService.github.repositories.listBranches(slug).toList();
     final String latestCandidateBranch = await _getLatestCandidateBranch(
       github: githubService.github,
       slug: slug,
@@ -175,18 +178,18 @@
     required List<gh.Branch> branches,
   }) async {
     final RegExp candidateBranchName = RegExp(r'flutter-\d+\.\d+-candidate\.\d+');
-    List<gh.Branch> devBranches = branches.where((gh.Branch b) => candidateBranchName.hasMatch(b.name!)).toList();
+    final List<gh.Branch> devBranches = branches.where((gh.Branch b) => candidateBranchName.hasMatch(b.name!)).toList();
     devBranches.sort((b, a) => (_versionSum(a.name!)).compareTo(_versionSum(b.name!)));
-    String devBranchName = devBranches.take(1).single.name!;
+    final String devBranchName = devBranches.take(1).single.name!;
     return devBranchName;
   }
 
   /// Helper function to convert candidate branch versions to numbers for comparison.
   int _versionSum(String tagOrBranchName) {
-    List<String> digits = tagOrBranchName.replaceAll(r'flutter|candidate', '0').split(RegExp(r'\.|\-'));
+    final List<String> digits = tagOrBranchName.replaceAll(r'flutter|candidate', '0').split(RegExp(r'\.|\-'));
     int versionSum = 0;
     for (String digit in digits) {
-      int? d = int.tryParse(digit);
+      final int? d = int.tryParse(digit);
       if (d == null) {
         continue;
       }
diff --git a/app_dart/lib/src/service/buildbucket.dart b/app_dart/lib/src/service/buildbucket.dart
index 40cf2b9..fabcc90 100644
--- a/app_dart/lib/src/service/buildbucket.dart
+++ b/app_dart/lib/src/service/buildbucket.dart
@@ -67,15 +67,20 @@
     final Uri url = Uri.parse('$buildBucketUri$path');
     final AccessToken? token = await accessTokenService?.createAccessToken();
 
-    final http.Response response = await httpClient.post(url, body: json.encode(request), headers: <String, String>{
-      HttpHeaders.contentTypeHeader: 'application/json',
-      HttpHeaders.acceptHeader: 'application/json',
-      if (token != null) HttpHeaders.authorizationHeader: '${token.type} ${token.data}',
-    });
+    final http.Response response = await httpClient.post(
+      url,
+      body: json.encode(request),
+      headers: <String, String>{
+        HttpHeaders.contentTypeHeader: 'application/json',
+        HttpHeaders.acceptHeader: 'application/json',
+        if (token != null) HttpHeaders.authorizationHeader: '${token.type} ${token.data}',
+      },
+    );
 
     if (response.statusCode < 300) {
       return responseFromJson(
-          json.decode(response.body.substring(kRpcResponseGarbage.length)) as Map<String, dynamic>?);
+        json.decode(response.body.substring(kRpcResponseGarbage.length)) as Map<String, dynamic>?,
+      );
     }
     throw BuildBucketException(response.statusCode, response.body);
   }
diff --git a/app_dart/lib/src/service/datastore.dart b/app_dart/lib/src/service/datastore.dart
index 5a589de..dfa9897 100644
--- a/app_dart/lib/src/service/datastore.dart
+++ b/app_dart/lib/src/service/datastore.dart
@@ -195,8 +195,10 @@
       /// occurs in app engine. When multiple records exist, the latest one
       /// is returned.
       if (previousStatusUpdates.length > 1) {
-        return previousStatusUpdates.reduce((GithubBuildStatusUpdate current, GithubBuildStatusUpdate next) =>
-            current.updateTimeMillis! < next.updateTimeMillis! ? next : current);
+        return previousStatusUpdates.reduce(
+          (GithubBuildStatusUpdate current, GithubBuildStatusUpdate next) =>
+              current.updateTimeMillis! < next.updateTimeMillis! ? next : current,
+        );
       }
       return previousStatusUpdates.single;
     }
@@ -242,45 +244,57 @@
   Future<void> insert(List<Model<dynamic>> rows) async {
     final List<List<Model<dynamic>>> shards = await shard(rows);
     for (List<Model<dynamic>> shard in shards) {
-      await runTransactionWithRetries(() async {
-        await db.withTransaction<void>((Transaction transaction) async {
-          transaction.queueMutations(inserts: shard);
-          await transaction.commit();
-        });
-      }, retryOptions: retryOptions);
+      await runTransactionWithRetries(
+        () async {
+          await db.withTransaction<void>((Transaction transaction) async {
+            transaction.queueMutations(inserts: shard);
+            await transaction.commit();
+          });
+        },
+        retryOptions: retryOptions,
+      );
     }
   }
 
   /// Looks up registers by [keys].
   Future<List<T?>> lookupByKey<T extends Model<dynamic>>(List<Key<dynamic>> keys) async {
     List<T?> results = <T>[];
-    await runTransactionWithRetries(() async {
-      await db.withTransaction<void>((Transaction transaction) async {
-        results = await transaction.lookup<T>(keys);
-      });
-    }, retryOptions: retryOptions);
+    await runTransactionWithRetries(
+      () async {
+        await db.withTransaction<void>((Transaction transaction) async {
+          results = await transaction.lookup<T>(keys);
+        });
+      },
+      retryOptions: retryOptions,
+    );
     return results;
   }
 
   /// Looks up registers by value using a single [key].
   Future<T> lookupByValue<T extends Model<dynamic>>(Key<dynamic> key, {T Function()? orElse}) async {
     late T result;
-    await runTransactionWithRetries(() async {
-      await db.withTransaction<void>((Transaction transaction) async {
-        result = await db.lookupValue<T>(key, orElse: orElse);
-      });
-    }, retryOptions: retryOptions);
+    await runTransactionWithRetries(
+      () async {
+        await db.withTransaction<void>((Transaction transaction) async {
+          result = await db.lookupValue<T>(key, orElse: orElse);
+        });
+      },
+      retryOptions: retryOptions,
+    );
     return result;
   }
 
   /// Runs a function inside a transaction providing a [Transaction] parameter.
   Future<T?> withTransaction<T>(Future<T> Function(Transaction) handler) async {
     T? result;
-    await runTransactionWithRetries(() async {
-      await db.withTransaction<void>((Transaction transaction) async {
-        result = await handler(transaction);
-      });
-    }, retryOptions: retryOptions);
+    await runTransactionWithRetries(
+      () async {
+        await db.withTransaction<void>((Transaction transaction) async {
+          result = await handler(transaction);
+        });
+      },
+      retryOptions: retryOptions,
+    );
     return result;
   }
 }
diff --git a/app_dart/lib/src/service/github_checks_service.dart b/app_dart/lib/src/service/github_checks_service.dart
index 42f48fa..b7bfe24 100644
--- a/app_dart/lib/src/service/github_checks_service.dart
+++ b/app_dart/lib/src/service/github_checks_service.dart
@@ -40,7 +40,10 @@
   ///   https://docs.github.com/en/rest/reference/checks#create-a-check-suite
   ///   https://docs.github.com/en/rest/reference/checks#rerequest-a-check-suite
   Future<void> handleCheckSuite(
-      github.PullRequest pullRequest, CheckSuiteEvent checkSuiteEvent, Scheduler scheduler) async {
+    github.PullRequest pullRequest,
+    CheckSuiteEvent checkSuiteEvent,
+    Scheduler scheduler,
+  ) async {
     switch (checkSuiteEvent.action) {
       case 'requested':
         // Trigger all try builders.
diff --git a/app_dart/lib/src/service/github_service.dart b/app_dart/lib/src/service/github_service.dart
index 1ea5524..129d681 100644
--- a/app_dart/lib/src/service/github_service.dart
+++ b/app_dart/lib/src/service/github_service.dart
@@ -70,9 +70,10 @@
         ..commit = (GitCommit()
           ..message = commit['commit']['message'] as String?
           ..committer = (GitCommitUser(
-              commit['commit']['author']['name'] as String?,
-              commit['commit']['author']['email'] as String?,
-              DateTime.parse(commit['commit']['author']['date'] as String))));
+            commit['commit']['author']['name'] as String?,
+            commit['commit']['author']['email'] as String?,
+            DateTime.parse(commit['commit']['author']['date'] as String),
+          )));
     }).toList();
   }
 
@@ -217,8 +218,11 @@
   }) async {
     ArgumentError.checkNotNull(slug);
     ArgumentError.checkNotNull(issueNumber);
-    final Response response = await github.request('PUT', '/repos/${slug.fullName}/issues/$issueNumber/labels',
-        body: GitHubJson.encode(labels));
+    final Response response = await github.request(
+      'PUT',
+      '/repos/${slug.fullName}/issues/$issueNumber/labels',
+      body: GitHubJson.encode(labels),
+    );
     final List<dynamic> body = jsonDecode(response.body) as List<dynamic>;
     return body.map((dynamic it) => IssueLabel.fromJson(it as Map<String, dynamic>)).toList();
   }
diff --git a/app_dart/lib/src/service/luci_build_service.dart b/app_dart/lib/src/service/luci_build_service.dart
index bcb0d96..d018c32 100644
--- a/app_dart/lib/src/service/luci_build_service.dart
+++ b/app_dart/lib/src/service/luci_build_service.dart
@@ -95,21 +95,25 @@
     String bucket,
     Map<String, List<String>> tags,
   ) async {
-    final BatchResponse batch = await buildBucketClient.batch(BatchRequest(requests: <Request>[
-      Request(
-        searchBuilds: SearchBuildsRequest(
-          predicate: BuildPredicate(
-            builderId: BuilderId(
-              project: 'flutter',
-              bucket: bucket,
-              builder: builderName,
+    final BatchResponse batch = await buildBucketClient.batch(
+      BatchRequest(
+        requests: <Request>[
+          Request(
+            searchBuilds: SearchBuildsRequest(
+              predicate: BuildPredicate(
+                builderId: BuilderId(
+                  project: 'flutter',
+                  bucket: bucket,
+                  builder: builderName,
+                ),
+                tags: tags,
+              ),
+              fields: 'builds.*.id,builds.*.builder,builds.*.tags,builds.*.status,builds.*.input.properties',
             ),
-            tags: tags,
           ),
-          fields: 'builds.*.id,builds.*.builder,builds.*.tags,builds.*.status,builds.*.input.properties',
-        ),
+        ],
       ),
-    ]));
+    );
     final Iterable<Build> builds = batch.responses!
         .map((Response response) => response.searchBuilds)
         .expand((SearchBuildsResponse? response) => response!.builds ?? <Build>[]);
@@ -121,42 +125,46 @@
   Future<Map<String?, Build?>> tryBuildsForPullRequest(
     github.PullRequest pullRequest,
   ) async {
-    final BatchResponse batch = await buildBucketClient.batch(BatchRequest(requests: <Request>[
-      // Builds created by Cocoon
-      Request(
-        searchBuilds: SearchBuildsRequest(
-          predicate: BuildPredicate(
-            builderId: const BuilderId(
-              project: 'flutter',
-              bucket: 'try',
+    final BatchResponse batch = await buildBucketClient.batch(
+      BatchRequest(
+        requests: <Request>[
+          // Builds created by Cocoon
+          Request(
+            searchBuilds: SearchBuildsRequest(
+              predicate: BuildPredicate(
+                builderId: const BuilderId(
+                  project: 'flutter',
+                  bucket: 'try',
+                ),
+                createdBy: 'cocoon',
+                tags: <String, List<String>>{
+                  'buildset': <String>['pr/git/${pullRequest.number}'],
+                  'github_link': <String>[
+                    'https://github.com/${pullRequest.base!.repo!.fullName}/pull/${pullRequest.number}'
+                  ],
+                  'user_agent': const <String>['flutter-cocoon'],
+                },
+              ),
             ),
-            createdBy: 'cocoon',
-            tags: <String, List<String>>{
-              'buildset': <String>['pr/git/${pullRequest.number}'],
-              'github_link': <String>[
-                'https://github.com/${pullRequest.base!.repo!.fullName}/pull/${pullRequest.number}'
-              ],
-              'user_agent': const <String>['flutter-cocoon'],
-            },
           ),
-        ),
-      ),
-      // Builds created by recipe (via swarming create task)
-      Request(
-        searchBuilds: SearchBuildsRequest(
-          predicate: BuildPredicate(
-            builderId: const BuilderId(
-              project: 'flutter',
-              bucket: 'try',
+          // Builds created by recipe (via swarming create task)
+          Request(
+            searchBuilds: SearchBuildsRequest(
+              predicate: BuildPredicate(
+                builderId: const BuilderId(
+                  project: 'flutter',
+                  bucket: 'try',
+                ),
+                tags: <String, List<String>>{
+                  'buildset': <String>['pr/git/${pullRequest.number}'],
+                  'user_agent': const <String>['recipe'],
+                },
+              ),
             ),
-            tags: <String, List<String>>{
-              'buildset': <String>['pr/git/${pullRequest.number}'],
-              'user_agent': const <String>['recipe'],
-            },
           ),
-        ),
+        ],
       ),
-    ]));
+    );
     final Iterable<Build> builds = batch.responses!
         .map((Response response) => response.searchBuilds)
         .expand((SearchBuildsResponse? response) => response?.builds ?? <Build>[]);
@@ -193,8 +201,10 @@
     }
 
     final Map<String?, Build?> tryBuilds = await tryBuildsForPullRequest(pullRequest);
-    final Iterable<Build?> runningOrCompletedBuilds = tryBuilds.values.where((Build? build) =>
-        build?.status == Status.scheduled || build?.status == Status.started || build?.status == Status.success);
+    final Iterable<Build?> runningOrCompletedBuilds = tryBuilds.values.where(
+      (Build? build) =>
+          build?.status == Status.scheduled || build?.status == Status.started || build?.status == Status.success,
+    );
     final List<Target> targetsToSchedule = <Target>[];
     for (Target target in targets) {
       if (runningOrCompletedBuilds.any((Build? build) => build?.builderId.builder == target.value.name)) {
@@ -243,26 +253,29 @@
         userData['builder_name'] = target.value.name;
       }
 
-      Map<String, List<String>> tags = <String, List<String>>{
+      final Map<String, List<String>> tags = <String, List<String>>{
         'github_checkrun': <String>[checkRun.id.toString()],
       };
 
-      Map<String, Object> properties = target.getProperties();
+      final Map<String, Object> properties = target.getProperties();
       properties.putIfAbsent('git_branch', () => pullRequest.base!.ref!.replaceAll('refs/heads/', ''));
 
-      requests.add(Request(
+      requests.add(
+        Request(
           scheduleBuild: _createPresubmitScheduleBuild(
-        slug: slug,
-        sha: pullRequest.head!.sha!,
-        //Use target.value.name here otherwise tests will die due to null checkRun.name.
-        checkName: target.value.name,
-        pullRequestNumber: pullRequest.number!,
-        cipdVersion: cipdVersion,
-        userData: userData,
-        properties: properties,
-        tags: tags,
-        dimensions: target.getDimensions(),
-      )));
+            slug: slug,
+            sha: pullRequest.head!.sha!,
+            //Use target.value.name here otherwise tests will die due to null checkRun.name.
+            checkName: target.value.name,
+            pullRequestNumber: pullRequest.number!,
+            cipdVersion: cipdVersion,
+            userData: userData,
+            properties: properties,
+            tags: tags,
+            dimensions: target.getDimensions(),
+          ),
+        ),
+      );
     }
 
     final Iterable<List<Request>> requestPartitions = await shard(requests, config.schedulingShardSize);
@@ -323,24 +336,26 @@
     // is expecting just the last part after "."(prod).
     final String bucketName = buildPushMessage.build!.bucket!.split('.').last;
     final Map<String, dynamic>? userData = jsonDecode(buildPushMessage.userData!) as Map<String, dynamic>?;
-    await buildBucketClient.scheduleBuild(ScheduleBuildRequest(
-      builderId: BuilderId(
-        project: buildPushMessage.build!.project,
-        bucket: bucketName,
-        builder: builderName,
+    await buildBucketClient.scheduleBuild(
+      ScheduleBuildRequest(
+        builderId: BuilderId(
+          project: buildPushMessage.build!.project,
+          bucket: bucketName,
+          builder: builderName,
+        ),
+        tags: <String, List<String>>{
+          'buildset': buildPushMessage.build!.tagsByName('buildset'),
+          'user_agent': buildPushMessage.build!.tagsByName('user_agent'),
+          'github_link': buildPushMessage.build!.tagsByName('github_link'),
+        },
+        properties:
+            (buildPushMessage.build!.buildParameters!['properties'] as Map<String, dynamic>).cast<String, String>(),
+        notify: NotificationConfig(
+          pubsubTopic: 'projects/flutter-dashboard/topics/luci-builds',
+          userData: json.encode(userData),
+        ),
       ),
-      tags: <String, List<String>>{
-        'buildset': buildPushMessage.build!.tagsByName('buildset'),
-        'user_agent': buildPushMessage.build!.tagsByName('user_agent'),
-        'github_link': buildPushMessage.build!.tagsByName('github_link'),
-      },
-      properties:
-          (buildPushMessage.build!.buildParameters!['properties'] as Map<String, dynamic>).cast<String, String>(),
-      notify: NotificationConfig(
-        pubsubTopic: 'projects/flutter-dashboard/topics/luci-builds',
-        userData: json.encode(userData),
-      ),
-    ));
+    );
     return true;
   }
 
@@ -368,18 +383,19 @@
     final String cipdVersion = build.tags!['cipd_version']![0]!;
     final int prNumber = int.parse(prString.split('/')[2]);
 
-    Map<String, dynamic> userData = <String, dynamic>{'check_run_id': githubCheckRun.id};
-    Map<String, dynamic>? properties = build.input!.properties;
+    final Map<String, dynamic> userData = <String, dynamic>{'check_run_id': githubCheckRun.id};
+    final Map<String, dynamic>? properties = build.input!.properties;
     log.info('input ${build.input!} properties $properties');
 
-    ScheduleBuildRequest scheduleBuildRequest = _createPresubmitScheduleBuild(
-        slug: slug,
-        sha: sha,
-        checkName: checkName,
-        pullRequestNumber: prNumber,
-        cipdVersion: cipdVersion,
-        properties: properties,
-        userData: userData);
+    final ScheduleBuildRequest scheduleBuildRequest = _createPresubmitScheduleBuild(
+      slug: slug,
+      sha: sha,
+      checkName: checkName,
+      pullRequestNumber: prNumber,
+      cipdVersion: cipdVersion,
+      properties: properties,
+      userData: userData,
+    );
 
     final Build scheduleBuild = await buildBucketClient.scheduleBuild(scheduleBuildRequest);
 
@@ -400,7 +416,7 @@
     String project = 'flutter',
     String bucket = 'prod',
   }) async {
-    Set<String> availableBuilderSet = <String>{};
+    final Set<String> availableBuilderSet = <String>{};
     String? token;
     do {
       final ListBuildersResponse listBuildersResponse =
@@ -480,8 +496,9 @@
     processedTags['cipd_version'] = <String>[cipdVersion];
 
     final NotificationConfig notificationConfig = NotificationConfig(
-        pubsubTopic: 'projects/flutter-dashboard/topics/luci-builds',
-        userData: base64Encode(json.encode(processedUserData).codeUnits));
+      pubsubTopic: 'projects/flutter-dashboard/topics/luci-builds',
+      userData: base64Encode(json.encode(processedUserData).codeUnits),
+    );
 
     final Map<String, dynamic> exec = <String, dynamic>{'cipdVersion': cipdVersion};
 
diff --git a/app_dart/lib/src/service/scheduler.dart b/app_dart/lib/src/service/scheduler.dart
index dd7707f..d33a6f0 100644
--- a/app_dart/lib/src/service/scheduler.dart
+++ b/app_dart/lib/src/service/scheduler.dart
@@ -168,10 +168,12 @@
   Future<void> _batchScheduleBuilds(Commit commit, List<Tuple<Target, Task, int>> toBeScheduled) async {
     final List<Future<void>> futures = <Future<void>>[];
     for (int i = 0; i < toBeScheduled.length; i += config.batchSize) {
-      futures.add(luciBuildService.schedulePostsubmitBuilds(
-        commit: commit,
-        toBeScheduled: toBeScheduled.sublist(i, min(i + config.batchSize, toBeScheduled.length)),
-      ));
+      futures.add(
+        luciBuildService.schedulePostsubmitBuilds(
+          commit: commit,
+          toBeScheduled: toBeScheduled.sublist(i, min(i + config.batchSize, toBeScheduled.length)),
+        ),
+      );
     }
     await Future.wait<void>(futures);
   }
@@ -252,7 +254,7 @@
       retryOptions: retryOptions,
     );
     final YamlMap configYaml = loadYaml(configContent) as YamlMap;
-    pb.SchedulerConfig schedulerConfig = pb.SchedulerConfig()..mergeFromProto3Json(configYaml);
+    final pb.SchedulerConfig schedulerConfig = pb.SchedulerConfig()..mergeFromProto3Json(configYaml);
     return schedulerConfig.writeToBuffer();
   }
 
@@ -338,7 +340,8 @@
       );
     }
     log.info(
-        'Finished triggering builds for: pr ${pullRequest.number}, commit ${pullRequest.base!.sha}, branch ${pullRequest.head!.ref} and slug ${pullRequest.base!.repo!.slug()}}');
+      'Finished triggering builds for: pr ${pullRequest.number}, commit ${pullRequest.base!.sha}, branch ${pullRequest.head!.ref} and slug ${pullRequest.base!.repo!.slug()}}',
+    );
   }
 
   /// If [builderTriggerList] is specificed, return only builders that are contained in [presubmitTarget].
@@ -402,8 +405,10 @@
       ciYaml = await getCiYaml(commit);
     }
 
-    final Iterable<Target> presubmitTargets = ciYaml.presubmitTargets.where((Target target) =>
-        target.value.scheduler == pb.SchedulerSystem.luci || target.value.scheduler == pb.SchedulerSystem.cocoon);
+    final Iterable<Target> presubmitTargets = ciYaml.presubmitTargets.where(
+      (Target target) =>
+          target.value.scheduler == pb.SchedulerSystem.luci || target.value.scheduler == pb.SchedulerSystem.cocoon,
+    );
     // Release branches should run every test.
     if (pullRequest.base!.ref != Config.defaultBranch(pullRequest.base!.repo!.slug())) {
       return presubmitTargets.toList();
diff --git a/app_dart/test/foundation/utils_test.dart b/app_dart/test/foundation/utils_test.dart
index 77ab5a2..18e60b9 100644
--- a/app_dart/test/foundation/utils_test.dart
+++ b/app_dart/test/foundation/utils_test.dart
@@ -153,17 +153,18 @@
         final List<LogRecord> records = <LogRecord>[];
         log.onRecord.listen((LogRecord record) => records.add(record));
         await expectLater(
-            githubFileContent(
-              RepositorySlug('flutter', 'cocoon'),
-              'branches.txt',
-              httpClientProvider: () => branchHttpClient,
-              retryOptions: const RetryOptions(
-                maxAttempts: 3,
-                delayFactor: Duration.zero,
-                maxDelay: Duration.zero,
-              ),
+          githubFileContent(
+            RepositorySlug('flutter', 'cocoon'),
+            'branches.txt',
+            httpClientProvider: () => branchHttpClient,
+            retryOptions: const RetryOptions(
+              maxAttempts: 3,
+              delayFactor: Duration.zero,
+              maxDelay: Duration.zero,
             ),
-            throwsA(isA<HttpException>()));
+          ),
+          throwsA(isA<HttpException>()),
+        );
         // It will request from GitHub 3 times, fallback to GoB, then fail.
         expect(retry, 6);
         expect(records.where((LogRecord record) => record.level == Level.WARNING), isNotEmpty);
diff --git a/app_dart/test/model/ci_yaml/ci_yaml_test.dart b/app_dart/test/model/ci_yaml/ci_yaml_test.dart
index a15a1ce..920626b 100644
--- a/app_dart/test/model/ci_yaml/ci_yaml_test.dart
+++ b/app_dart/test/model/ci_yaml/ci_yaml_test.dart
@@ -15,15 +15,20 @@
     final List<EnabledBranchesRegexTest> tests = <EnabledBranchesRegexTest>[
       EnabledBranchesRegexTest('matches main', 'main', <String>['main']),
       EnabledBranchesRegexTest(
-          'matches candidate branch', 'flutter-2.4-candidate.3', <String>['flutter-\\d+\\.\\d+-candidate\\.\\d+']),
+        'matches candidate branch',
+        'flutter-2.4-candidate.3',
+        <String>['flutter-\\d+\\.\\d+-candidate\\.\\d+'],
+      ),
       EnabledBranchesRegexTest('matches main when not first pattern', 'main', <String>['dev', 'main']),
       EnabledBranchesRegexTest('does not do partial matches', 'super-main', <String>['main'], false),
     ];
 
     for (EnabledBranchesRegexTest regexTest in tests) {
       test(regexTest.name, () {
-        expect(CiYaml.enabledBranchesMatchesCurrentBranch(regexTest.enabledBranches, regexTest.branch),
-            regexTest.expectation);
+        expect(
+          CiYaml.enabledBranchesMatchesCurrentBranch(regexTest.enabledBranches, regexTest.branch),
+          regexTest.expectation,
+        );
       });
     }
   });
@@ -39,7 +44,8 @@
     validatePinnedVersion('[{"dependency": "open_jdk", "version": "11"}]');
     validatePinnedVersion('[{"dependency": "android_sdk", "version": "version:31v8"}]');
     validatePinnedVersion(
-        '[{"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}]');
+      '[{"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}]',
+    );
   });
 
   group('Validate un-pinned version operation.', () {
diff --git a/app_dart/test/model/ci_yaml/target_test.dart b/app_dart/test/model/ci_yaml/target_test.dart
index 2916016..9306439 100644
--- a/app_dart/test/model/ci_yaml/target_test.dart
+++ b/app_dart/test/model/ci_yaml/target_test.dart
@@ -370,8 +370,10 @@
       });
 
       test('non-cocoon scheduler targets return omit policy', () {
-        expect(generateTarget(1, platform: 'Linux_android', schedulerSystem: pb.SchedulerSystem.luci).schedulerPolicy,
-            isA<OmitPolicy>());
+        expect(
+          generateTarget(1, platform: 'Linux_android', schedulerSystem: pb.SchedulerSystem.luci).schedulerPolicy,
+          isA<OmitPolicy>(),
+        );
       });
 
       test('vm cocoon targets return batch policy', () {
diff --git a/app_dart/test/model/stage_test.dart b/app_dart/test/model/stage_test.dart
index 53c6b98..207db5a 100644
--- a/app_dart/test/model/stage_test.dart
+++ b/app_dart/test/model/stage_test.dart
@@ -40,95 +40,119 @@
 
     test('taskStatus', () {
       expect(
-        buildStage(statuses: <String>[
-          Task.statusSucceeded,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusSucceeded,
+          ],
+        ).taskStatus,
         Task.statusSucceeded,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusSucceeded,
-          Task.statusSucceeded,
-          Task.statusFailed,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusSucceeded,
+            Task.statusSucceeded,
+            Task.statusFailed,
+          ],
+        ).taskStatus,
         Task.statusFailed,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusNew,
-          Task.statusFailed,
-          Task.statusNew,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusNew,
+            Task.statusFailed,
+            Task.statusNew,
+          ],
+        ).taskStatus,
         Task.statusFailed,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusInProgress,
-          Task.statusFailed,
-          Task.statusInProgress,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusInProgress,
+            Task.statusFailed,
+            Task.statusInProgress,
+          ],
+        ).taskStatus,
         Task.statusFailed,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusSucceeded,
-          Task.statusFailed,
-          Task.statusSucceeded,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusSucceeded,
+            Task.statusFailed,
+            Task.statusSucceeded,
+          ],
+        ).taskStatus,
         Task.statusFailed,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusNew,
-          Task.statusFailed,
-          Task.statusInProgress,
-          Task.statusSucceeded,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusNew,
+            Task.statusFailed,
+            Task.statusInProgress,
+            Task.statusSucceeded,
+          ],
+        ).taskStatus,
         Task.statusFailed,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusNew,
-          Task.statusInProgress,
-          Task.statusNew,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusNew,
+            Task.statusInProgress,
+            Task.statusNew,
+          ],
+        ).taskStatus,
         Task.statusInProgress,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusNew,
-          Task.statusSucceeded,
-          Task.statusNew,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusNew,
+            Task.statusSucceeded,
+            Task.statusNew,
+          ],
+        ).taskStatus,
         Task.statusInProgress,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusSucceeded,
-          Task.statusSucceeded,
-          Task.statusInProgress,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusSucceeded,
+            Task.statusSucceeded,
+            Task.statusInProgress,
+          ],
+        ).taskStatus,
         Task.statusInProgress,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusNew,
-          Task.statusNew,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusNew,
+            Task.statusNew,
+          ],
+        ).taskStatus,
         Task.statusNew,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusInProgress,
-          Task.statusInProgress,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusInProgress,
+            Task.statusInProgress,
+          ],
+        ).taskStatus,
         Task.statusInProgress,
       );
       expect(
-        buildStage(statuses: <String>[
-          Task.statusSucceeded,
-          Task.statusSucceeded,
-        ]).taskStatus,
+        buildStage(
+          statuses: <String>[
+            Task.statusSucceeded,
+            Task.statusSucceeded,
+          ],
+        ).taskStatus,
         Task.statusSucceeded,
       );
     });
@@ -140,11 +164,12 @@
       expect(() => (StageBuilder()..name = 'name').build(), throwsStateError);
       expect(() => (StageBuilder()..commit = generateCommit(1)).build(), throwsStateError);
       expect(
-          () => (StageBuilder()
-                ..name = 'name'
-                ..commit = generateCommit(1))
-              .build(),
-          throwsStateError);
+        () => (StageBuilder()
+              ..name = 'name'
+              ..commit = generateCommit(1))
+            .build(),
+        throwsStateError,
+      );
     });
   });
 }
diff --git a/app_dart/test/request_handlers/check_flaky_builders_test.dart b/app_dart/test/request_handlers/check_flaky_builders_test.dart
index 17669f3..9c5357f 100644
--- a/app_dart/test/request_handlers/check_flaky_builders_test.dart
+++ b/app_dart/test/request_handlers/check_flaky_builders_test.dart
@@ -64,20 +64,26 @@
       mockGitService = MockGitService();
       mockUsersService = MockUsersService();
       // when gets the content of .ci.yaml
-      when(mockRepositoriesService.getContents(
-        captureAny,
-        kCiYamlPath,
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockRepositoriesService.getContents(
+          captureAny,
+          kCiYamlPath,
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<RepositoryContents>.value(
-            RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContent))));
+          RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContent))),
+        );
       });
       // when gets the content of TESTOWNERS
-      when(mockRepositoriesService.getContents(
-        captureAny,
-        kTestOwnerPath,
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockRepositoriesService.getContents(
+          captureAny,
+          kTestOwnerPath,
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<RepositoryContents>.value(
-            RepositoryContents(file: GitHubFile(content: gitHubEncode(testOwnersContent))));
+          RepositoryContents(file: GitHubFile(content: gitHubEncode(testOwnersContent))),
+        );
       });
       // when gets existing marks flaky prs.
       when(mockPullRequestsService.list(captureAny)).thenAnswer((Invocation invocation) {
@@ -98,16 +104,18 @@
         return Future<CurrentUser>.value(result);
       });
       // when assigns pull request reviewer.
-      when(mockGitHubClient.postJSON<Map<String, dynamic>, PullRequest>(
-        captureAny,
-        statusCode: captureAnyNamed('statusCode'),
-        fail: captureAnyNamed('fail'),
-        headers: captureAnyNamed('headers'),
-        params: captureAnyNamed('params'),
-        convert: captureAnyNamed('convert'),
-        body: captureAnyNamed('body'),
-        preview: captureAnyNamed('preview'),
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockGitHubClient.postJSON<Map<String, dynamic>, PullRequest>(
+          captureAny,
+          statusCode: captureAnyNamed('statusCode'),
+          fail: captureAnyNamed('fail'),
+          headers: captureAnyNamed('headers'),
+          params: captureAnyNamed('params'),
+          convert: captureAnyNamed('convert'),
+          body: captureAnyNamed('body'),
+          preview: captureAnyNamed('preview'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<PullRequest>.value(PullRequest());
       });
       when(mockGitHubClient.repositories).thenReturn(mockRepositoriesService);
@@ -129,9 +137,13 @@
 
     test('Can create pr if the flaky test is no longer flaky with a closed issue', () async {
       // When queries flaky data from BigQuery.
-      when(mockBigqueryService.listRecentBuildRecordsForBuilder(kBigQueryProjectId,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .thenAnswer((Invocation invocation) {
+      when(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          kBigQueryProjectId,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<List<BuilderRecord>>.value(semanticsIntegrationTestRecordsAllPassed);
       });
       // When queries flaky data from BigQuery.
@@ -167,9 +179,13 @@
           .single as Map<String, dynamic>;
 
       // Verify BigQuery is called correctly.
-      List<dynamic> captured = verify(mockBigqueryService.listRecentBuildRecordsForBuilder(captureAny,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .captured;
+      List<dynamic> captured = verify(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          captureAny,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).captured;
       expect(captured.length, 3);
       expect(captured[0].toString(), kBigQueryProjectId);
       expect(captured[1] as String?, expectedSemanticsIntegrationTestBuilderName);
@@ -232,17 +248,24 @@
 
     test('Can create pr if the flaky test is no longer flaky without an issue', () async {
       // when gets the content of .ci.yaml
-      when(mockRepositoriesService.getContents(
-        captureAny,
-        kCiYamlPath,
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockRepositoriesService.getContents(
+          captureAny,
+          kCiYamlPath,
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<RepositoryContents>.value(
-            RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContentNoIssue))));
+          RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContentNoIssue))),
+        );
       });
       // When queries flaky data from BigQuery.
-      when(mockBigqueryService.listRecentBuildRecordsForBuilder(kBigQueryProjectId,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .thenAnswer((Invocation invocation) {
+      when(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          kBigQueryProjectId,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<List<BuilderRecord>>.value(semanticsIntegrationTestRecordsAllPassed);
       });
       // When queries flaky data from BigQuery.
@@ -274,9 +297,13 @@
           .single as Map<String, dynamic>;
 
       // Verify BigQuery is called correctly.
-      List<dynamic> captured = verify(mockBigqueryService.listRecentBuildRecordsForBuilder(captureAny,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .captured;
+      List<dynamic> captured = verify(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          captureAny,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).captured;
       expect(captured.length, 3);
       expect(captured[0].toString(), kBigQueryProjectId);
       expect(captured[1] as String?, expectedSemanticsIntegrationTestBuilderName);
@@ -336,12 +363,15 @@
 
     test('Do not create PR if the builder is in the ignored list', () async {
       // when gets the content of .ci.yaml
-      when(mockRepositoriesService.getContents(
-        captureAny,
-        kCiYamlPath,
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockRepositoriesService.getContents(
+          captureAny,
+          kCiYamlPath,
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<RepositoryContents>.value(
-            RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContentFlakyInIgnoreList))));
+          RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContentFlakyInIgnoreList))),
+        );
       });
       // When queries flaky data from BigQuery.
       when(mockBigqueryService.listBuilderStatistic(kBigQueryProjectId, bucket: 'staging'))
@@ -362,9 +392,13 @@
 
     test('Do not create pr if the issue is still open', () async {
       // When queries flaky data from BigQuery.
-      when(mockBigqueryService.listRecentBuildRecordsForBuilder(kBigQueryProjectId,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .thenAnswer((Invocation invocation) {
+      when(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          kBigQueryProjectId,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<List<BuilderRecord>>.value(semanticsIntegrationTestRecordsAllPassed);
       });
       // When queries flaky data from BigQuery.
@@ -397,18 +431,24 @@
     test('Do not create pr and do not create issue if the records have flaky runs and there is an open issue',
         () async {
       // When queries flaky data from BigQuery.
-      when(mockBigqueryService.listRecentBuildRecordsForBuilder(kBigQueryProjectId,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .thenAnswer((Invocation invocation) {
+      when(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          kBigQueryProjectId,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<List<BuilderRecord>>.value(semanticsIntegrationTestRecordsFlaky);
       });
       // When get issue
       when(mockIssuesService.get(captureAny, captureAny)).thenAnswer((_) {
-        return Future<Issue>.value(Issue(
-          state: 'closed',
-          htmlUrl: existingIssueURL,
-          closedAt: DateTime.now().subtract(const Duration(days: kGracePeriodForClosedFlake - 1)),
-        ));
+        return Future<Issue>.value(
+          Issue(
+            state: 'closed',
+            htmlUrl: existingIssueURL,
+            closedAt: DateTime.now().subtract(const Duration(days: kGracePeriodForClosedFlake - 1)),
+          ),
+        );
       });
       // When queries flaky data from BigQuery.
       when(mockBigqueryService.listBuilderStatistic(kBigQueryProjectId, bucket: 'staging'))
@@ -435,10 +475,12 @@
         () async {
       // When get issue
       when(mockIssuesService.get(captureAny, captureAny)).thenAnswer((_) {
-        return Future<Issue>.value(Issue(
-          state: 'open',
-          htmlUrl: existingIssueURL,
-        ));
+        return Future<Issue>.value(
+          Issue(
+            state: 'open',
+            htmlUrl: existingIssueURL,
+          ),
+        );
       });
       // When queries flaky data from BigQuery.
       when(mockBigqueryService.listBuilderStatistic(kBigQueryProjectId, bucket: 'staging'))
@@ -463,9 +505,13 @@
 
     test('Do not create pr if the records have failed runs', () async {
       // When queries flaky data from BigQuery.
-      when(mockBigqueryService.listRecentBuildRecordsForBuilder(kBigQueryProjectId,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .thenAnswer((Invocation invocation) {
+      when(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          kBigQueryProjectId,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<List<BuilderRecord>>.value(semanticsIntegrationTestRecordsFailed);
       });
       // When queries flaky data from BigQuery.
@@ -475,8 +521,13 @@
       });
       // When get issue
       when(mockIssuesService.get(captureAny, captureAny)).thenAnswer((_) {
-        return Future<Issue>.value(Issue(
-            state: 'closed', htmlUrl: existingIssueURL, closedAt: DateTime.now().subtract(const Duration(days: 50))));
+        return Future<Issue>.value(
+          Issue(
+            state: 'closed',
+            htmlUrl: existingIssueURL,
+            closedAt: DateTime.now().subtract(const Duration(days: 50)),
+          ),
+        );
       });
 
       CheckFlakyBuilders.kRecordNumber = semanticsIntegrationTestRecordsFailed.length;
@@ -486,9 +537,13 @@
           .single as Map<String, dynamic>;
 
       // Verify BigQuery is called correctly.
-      List<dynamic> captured = verify(mockBigqueryService.listRecentBuildRecordsForBuilder(captureAny,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .captured;
+      List<dynamic> captured = verify(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          captureAny,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).captured;
       expect(captured.length, 3);
       expect(captured[0].toString(), kBigQueryProjectId);
       expect(captured[1] as String?, expectedSemanticsIntegrationTestBuilderName);
@@ -508,9 +563,13 @@
 
     test('Do not create pr if there is an open one', () async {
       // When queries flaky data from BigQuery.
-      when(mockBigqueryService.listRecentBuildRecordsForBuilder(kBigQueryProjectId,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .thenAnswer((Invocation invocation) {
+      when(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          kBigQueryProjectId,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<List<BuilderRecord>>.value(semanticsIntegrationTestRecordsAllPassed);
       });
       // When queries flaky data from BigQuery.
@@ -541,9 +600,13 @@
 
     test('Do not create pr if not enough records', () async {
       // When queries flaky data from BigQuery.
-      when(mockBigqueryService.listRecentBuildRecordsForBuilder(kBigQueryProjectId,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .thenAnswer((Invocation invocation) {
+      when(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          kBigQueryProjectId,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<List<BuilderRecord>>.value(semanticsIntegrationTestRecordsAllPassed);
       });
       // When queries flaky data from BigQuery.
@@ -553,8 +616,13 @@
       });
       // When get issue
       when(mockIssuesService.get(captureAny, captureAny)).thenAnswer((_) {
-        return Future<Issue>.value(Issue(
-            state: 'closed', htmlUrl: existingIssueURL, closedAt: DateTime.now().subtract(const Duration(days: 50))));
+        return Future<Issue>.value(
+          Issue(
+            state: 'closed',
+            htmlUrl: existingIssueURL,
+            closedAt: DateTime.now().subtract(const Duration(days: 50)),
+          ),
+        );
       });
 
       CheckFlakyBuilders.kRecordNumber = semanticsIntegrationTestRecordsAllPassed.length + 1;
@@ -564,9 +632,13 @@
           .single as Map<String, dynamic>;
 
       // Verify BigQuery is called correctly.
-      List<dynamic> captured = verify(mockBigqueryService.listRecentBuildRecordsForBuilder(captureAny,
-              builder: captureAnyNamed('builder'), limit: captureAnyNamed('limit')))
-          .captured;
+      List<dynamic> captured = verify(
+        mockBigqueryService.listRecentBuildRecordsForBuilder(
+          captureAny,
+          builder: captureAnyNamed('builder'),
+          limit: captureAnyNamed('limit'),
+        ),
+      ).captured;
       expect(captured.length, 3);
       expect(captured[0].toString(), kBigQueryProjectId);
       expect(captured[1] as String?, expectedSemanticsIntegrationTestBuilderName);
diff --git a/app_dart/test/request_handlers/file_flaky_issue_and_pr_test.dart b/app_dart/test/request_handlers/file_flaky_issue_and_pr_test.dart
index 1b2f2c6..72e85c9 100644
--- a/app_dart/test/request_handlers/file_flaky_issue_and_pr_test.dart
+++ b/app_dart/test/request_handlers/file_flaky_issue_and_pr_test.dart
@@ -63,20 +63,26 @@
       mockGitService = MockGitService();
       mockUsersService = MockUsersService();
       // when gets the content of .ci.yaml
-      when(mockRepositoriesService.getContents(
-        captureAny,
-        kCiYamlPath,
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockRepositoriesService.getContents(
+          captureAny,
+          kCiYamlPath,
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<RepositoryContents>.value(
-            RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContent))));
+          RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContent))),
+        );
       });
       // when gets the content of TESTOWNERS
-      when(mockRepositoriesService.getContents(
-        captureAny,
-        kTestOwnerPath,
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockRepositoriesService.getContents(
+          captureAny,
+          kTestOwnerPath,
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<RepositoryContents>.value(
-            RepositoryContents(file: GitHubFile(content: gitHubEncode(testOwnersContent))));
+          RepositoryContents(file: GitHubFile(content: gitHubEncode(testOwnersContent))),
+        );
       });
       when(mockIssuesService.create(any, any)).thenAnswer((_) async => Issue());
       // when gets existing flaky issues.
@@ -103,16 +109,18 @@
         return Future<CurrentUser>.value(result);
       });
       // when assigns pull request reviewer.
-      when(mockGitHubClient.postJSON<Map<String, dynamic>, PullRequest>(
-        captureAny,
-        statusCode: captureAnyNamed('statusCode'),
-        fail: captureAnyNamed('fail'),
-        headers: captureAnyNamed('headers'),
-        params: captureAnyNamed('params'),
-        convert: captureAnyNamed('convert'),
-        body: captureAnyNamed('body'),
-        preview: captureAnyNamed('preview'),
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockGitHubClient.postJSON<Map<String, dynamic>, PullRequest>(
+          captureAny,
+          statusCode: captureAnyNamed('statusCode'),
+          fail: captureAnyNamed('fail'),
+          headers: captureAnyNamed('headers'),
+          params: captureAnyNamed('params'),
+          convert: captureAnyNamed('convert'),
+          body: captureAnyNamed('body'),
+          preview: captureAnyNamed('preview'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<PullRequest>.value(PullRequest());
       });
       when(mockGitHubClient.repositories).thenReturn(mockRepositoriesService);
@@ -172,8 +180,10 @@
       expect(issueRequest.title, expectedSemanticsIntegrationTestResponseTitle);
       expect(issueRequest.body, expectedSemanticsIntegrationTestResponseBody);
       expect(issueRequest.assignee, expectedSemanticsIntegrationTestResponseAssignee);
-      expect(const ListEquality<String>().equals(issueRequest.labels, expectedSemanticsIntegrationTestResponseLabels),
-          isTrue);
+      expect(
+        const ListEquality<String>().equals(issueRequest.labels, expectedSemanticsIntegrationTestResponseLabels),
+        isTrue,
+      );
 
       // Verify tree is created correctly.
       captured = verify(mockGitService.createTree(captureAny, captureAny)).captured;
@@ -351,7 +361,9 @@
           .thenAnswer((Invocation invocation) {
         return Stream<Issue>.fromIterable(<Issue>[
           Issue(
-              title: expectedSemanticsIntegrationTestResponseTitle, body: expectedSemanticsIntegrationTestResponseBody)
+            title: expectedSemanticsIntegrationTestResponseTitle,
+            body: expectedSemanticsIntegrationTestResponseBody,
+          )
         ]);
       });
       // When creates git tree
@@ -471,8 +483,10 @@
       expect(issueRequest.title, expectedSemanticsIntegrationTestResponseTitle);
       expect(issueRequest.body, expectedSemanticsIntegrationTestResponseBody);
       expect(issueRequest.assignee, expectedSemanticsIntegrationTestResponseAssignee);
-      expect(const ListEquality<String>().equals(issueRequest.labels, expectedSemanticsIntegrationTestResponseLabels),
-          isTrue);
+      expect(
+        const ListEquality<String>().equals(issueRequest.labels, expectedSemanticsIntegrationTestResponseLabels),
+        isTrue,
+      );
 
       expect(result['Status'], 'success');
     });
@@ -483,12 +497,15 @@
         return Future<List<BuilderStatistic>>.value(semanticsIntegrationTestResponse);
       });
       // when gets the content of .ci.yaml
-      when(mockRepositoriesService.getContents(
-        captureAny,
-        kCiYamlPath,
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockRepositoriesService.getContents(
+          captureAny,
+          kCiYamlPath,
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<RepositoryContents>.value(
-            RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContentAlreadyFlaky))));
+          RepositoryContents(file: GitHubFile(content: gitHubEncode(ciYamlContentAlreadyFlaky))),
+        );
       });
 
       final Map<String, dynamic> result = await utf8.decoder
diff --git a/app_dart/test/request_handlers/flaky_handler_utiles_test.dart b/app_dart/test/request_handlers/flaky_handler_utiles_test.dart
index 0618211..e6a0089 100644
--- a/app_dart/test/request_handlers/flaky_handler_utiles_test.dart
+++ b/app_dart/test/request_handlers/flaky_handler_utiles_test.dart
@@ -97,23 +97,30 @@
         const String expectedHtml = 'https://someurl';
         // when gets existing marks flaky prs.
         when(mockPullRequestsService.list(captureAny)).thenAnswer((Invocation invocation) {
-          return Stream<PullRequest>.value(PullRequest(
-            htmlUrl: expectedHtml,
-            body: '''
+          return Stream<PullRequest>.value(
+            PullRequest(
+              htmlUrl: expectedHtml,
+              body: '''
 <!-- meta-tags: To be used by the automation script only, DO NOT MODIFY.
 {
   "name"
 }
 -->''',
-          ));
+            ),
+          );
         });
         when(mockGitHubClient.pullRequests).thenReturn(mockPullRequestsService);
         final FakeConfig config = FakeConfig(
           githubService: GithubService(mockGitHubClient),
         );
-        expect(() => getExistingPRs(config.githubService!, Config.flutterSlug), throwsA(predicate<String>((String e) {
-          return e.contains('Unable to parse body of $expectedHtml');
-        })));
+        expect(
+          () => getExistingPRs(config.githubService!, Config.flutterSlug),
+          throwsA(
+            predicate<String>((String e) {
+              return e.contains('Unable to parse body of $expectedHtml');
+            }),
+          ),
+        );
       });
 
       test('handles PRs with empty body message', () async {
@@ -121,9 +128,11 @@
         final MockPullRequestsService mockPullRequestsService = MockPullRequestsService();
         const String expectedHtml = 'https://someurl';
         when(mockPullRequestsService.list(captureAny)).thenAnswer((Invocation invocation) {
-          return Stream<PullRequest>.value(PullRequest(
-            htmlUrl: expectedHtml,
-          ));
+          return Stream<PullRequest>.value(
+            PullRequest(
+              htmlUrl: expectedHtml,
+            ),
+          );
         });
         when(mockGitHubClient.pullRequests).thenReturn(mockPullRequestsService);
         final FakeConfig config = FakeConfig(
diff --git a/app_dart/test/request_handlers/flush_cache_test.dart b/app_dart/test/request_handlers/flush_cache_test.dart
index 05e65f0..21246a8 100644
--- a/app_dart/test/request_handlers/flush_cache_test.dart
+++ b/app_dart/test/request_handlers/flush_cache_test.dart
@@ -41,9 +41,11 @@
         Uint8List.fromList('123'.codeUnits),
       );
 
-      tester.request = FakeHttpRequest(queryParametersValue: <String, String>{
-        FlushCache.cacheKeyParam: cacheKey,
-      });
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          FlushCache.cacheKeyParam: cacheKey,
+        },
+      );
       await tester.get(handler);
 
       expect(await cache.getOrCreate(Config.configCacheName, cacheKey), null);
@@ -54,9 +56,11 @@
     });
 
     test('raises error if cache key does not exist', () async {
-      tester.request = FakeHttpRequest(queryParametersValue: <String, String>{
-        FlushCache.cacheKeyParam: 'abc',
-      });
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          FlushCache.cacheKeyParam: 'abc',
+        },
+      );
       expect(tester.get(handler), throwsA(isA<NotFoundException>()));
     });
   });
diff --git a/app_dart/test/request_handlers/get_branches_test.dart b/app_dart/test/request_handlers/get_branches_test.dart
index ce2ec6d..b382e66 100644
--- a/app_dart/test/request_handlers/get_branches_test.dart
+++ b/app_dart/test/request_handlers/get_branches_test.dart
@@ -48,7 +48,7 @@
       );
 
       const String id = 'flutter/flutter/branch-created-old';
-      int lastActivity = DateTime.tryParse("2019-05-15T15:20:56Z")!.millisecondsSinceEpoch;
+      final int lastActivity = DateTime.tryParse("2019-05-15T15:20:56Z")!.millisecondsSinceEpoch;
       final Key<String> branchKey = db.emptyKey.append<String>(Branch, id: id);
       final Branch currentBranch = Branch(
         key: branchKey,
@@ -68,7 +68,7 @@
       expect(db.values.values.whereType<Branch>().length, 1);
 
       const String id = 'flutter/flutter/branch-created-now';
-      int lastActivity = DateTime.now().millisecondsSinceEpoch;
+      final int lastActivity = DateTime.now().millisecondsSinceEpoch;
       final Key<String> branchKey = db.emptyKey.append<String>(Branch, id: id);
       final Branch currentBranch = Branch(
         key: branchKey,
diff --git a/app_dart/test/request_handlers/get_green_commits_test.dart b/app_dart/test/request_handlers/get_green_commits_test.dart
index fd2ea0b..6a33909 100644
--- a/app_dart/test/request_handlers/get_green_commits_test.dart
+++ b/app_dart/test/request_handlers/get_green_commits_test.dart
@@ -46,12 +46,24 @@
 
     final Stage stageOneSucceed =
         Stage('cocoon', commit1, [task1Succeed], Task.statusInProgress); // should scceed, since task 1 succeed
-    final Stage stageFailed = Stage('luci', commit1, [task1Succeed, task2Failed],
-        Task.statusInProgress); // should fail, since task 1 succeed and task2 fail
-    final Stage stageMultipleSucceed = Stage('cocoon', commit2, [task1Succeed, task4SucceedFlaky],
-        Task.statusInProgress); // should succeed, since both task 1 and task 4 succeed
-    final Stage stageFailedFlaky = Stage('luci', commit2, [task1Succeed, task3FailedFlaky],
-        Task.statusInProgress); // should succeed, even though it includes task 3
+    final Stage stageFailed = Stage(
+      'luci',
+      commit1,
+      [task1Succeed, task2Failed],
+      Task.statusInProgress,
+    ); // should fail, since task 1 succeed and task2 fail
+    final Stage stageMultipleSucceed = Stage(
+      'cocoon',
+      commit2,
+      [task1Succeed, task4SucceedFlaky],
+      Task.statusInProgress,
+    ); // should succeed, since both task 1 and task 4 succeed
+    final Stage stageFailedFlaky = Stage(
+      'luci',
+      commit2,
+      [task1Succeed, task3FailedFlaky],
+      Task.statusInProgress,
+    ); // should succeed, even though it includes task 3
 
     Future<List<T?>?> decodeHandlerBody<T>() async {
       final Body body = await tester.get(handler);
@@ -79,10 +91,12 @@
     });
 
     test('should return commits with all tasks succeed', () async {
-      buildStatusService = FakeBuildStatusService(commitStatuses: <CommitStatus>[
-        CommitStatus(commit1, <Stage>[stageOneSucceed]),
-        CommitStatus(commit2, <Stage>[stageOneSucceed, stageMultipleSucceed])
-      ]);
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[
+          CommitStatus(commit1, <Stage>[stageOneSucceed]),
+          CommitStatus(commit2, <Stage>[stageOneSucceed, stageMultipleSucceed])
+        ],
+      );
       handler = GetGreenCommits(
         config: config,
         datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
@@ -99,10 +113,12 @@
     });
 
     test('should fail commits that have failed task without [bringup: true] label', () async {
-      buildStatusService = FakeBuildStatusService(commitStatuses: <CommitStatus>[
-        CommitStatus(commit1, <Stage>[stageFailed]),
-        CommitStatus(commit2, <Stage>[stageOneSucceed, stageMultipleSucceed])
-      ]);
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[
+          CommitStatus(commit1, <Stage>[stageFailed]),
+          CommitStatus(commit2, <Stage>[stageOneSucceed, stageMultipleSucceed])
+        ],
+      );
       handler = GetGreenCommits(
         config: config,
         datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
@@ -116,10 +132,12 @@
     });
 
     test('should return commits with failed tasks but with `bringup: true` label', () async {
-      buildStatusService = FakeBuildStatusService(commitStatuses: <CommitStatus>[
-        CommitStatus(commit1, <Stage>[stageFailed]),
-        CommitStatus(commit2, <Stage>[stageFailedFlaky])
-      ]);
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[
+          CommitStatus(commit1, <Stage>[stageFailed]),
+          CommitStatus(commit2, <Stage>[stageFailedFlaky])
+        ],
+      );
       handler = GetGreenCommits(
         config: config,
         datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
@@ -133,10 +151,12 @@
     });
 
     test('should return commits with both flaky and succeeded tasks', () async {
-      buildStatusService = FakeBuildStatusService(commitStatuses: <CommitStatus>[
-        CommitStatus(commit1, <Stage>[stageOneSucceed, stageMultipleSucceed]),
-        CommitStatus(commit2, <Stage>[stageOneSucceed, stageFailedFlaky])
-      ]);
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[
+          CommitStatus(commit1, <Stage>[stageOneSucceed, stageMultipleSucceed]),
+          CommitStatus(commit2, <Stage>[stageOneSucceed, stageFailedFlaky])
+        ],
+      );
       handler = GetGreenCommits(
         config: config,
         datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
@@ -153,12 +173,16 @@
     });
 
     test('should return branched commits', () async {
-      buildStatusService = FakeBuildStatusService(commitStatuses: <CommitStatus>[
-        CommitStatus(commitBranched, <Stage>[stageOneSucceed]),
-      ]);
-      tester.request = FakeHttpRequest(queryParametersValue: <String, String>{
-        GetGreenCommits.kBranchParam: commitBranched.branch!,
-      });
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[
+          CommitStatus(commitBranched, <Stage>[stageOneSucceed]),
+        ],
+      );
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          GetGreenCommits.kBranchParam: commitBranched.branch!,
+        },
+      );
       handler = GetGreenCommits(
         config: config,
         datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
diff --git a/app_dart/test/request_handlers/get_status_test.dart b/app_dart/test/request_handlers/get_status_test.dart
index efb5630..c7b0f64 100644
--- a/app_dart/test/request_handlers/get_status_test.dart
+++ b/app_dart/test/request_handlers/get_status_test.dart
@@ -48,19 +48,21 @@
         buildStatusProvider: (_) => buildStatusService,
       );
       commit1 = Commit(
-          key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/ea28a9c34dc701de891eaf74503ca4717019f829'),
-          repository: 'flutter/flutter',
-          sha: 'ea28a9c34dc701de891eaf74503ca4717019f829',
-          timestamp: 3,
-          message: 'test message 1',
-          branch: 'master');
+        key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/ea28a9c34dc701de891eaf74503ca4717019f829'),
+        repository: 'flutter/flutter',
+        sha: 'ea28a9c34dc701de891eaf74503ca4717019f829',
+        timestamp: 3,
+        message: 'test message 1',
+        branch: 'master',
+      );
       commit2 = Commit(
-          key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/d5b0b3c8d1c5fd89302089077ccabbcfaae045e4'),
-          repository: 'flutter/flutter',
-          sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
-          timestamp: 1,
-          message: 'test message 2',
-          branch: 'master');
+        key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/d5b0b3c8d1c5fd89302089077ccabbcfaae045e4'),
+        repository: 'flutter/flutter',
+        sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+        timestamp: 1,
+        message: 'test message 2',
+        branch: 'master',
+      );
     });
 
     test('no statuses', () async {
@@ -71,10 +73,9 @@
     test('reports statuses without input commit key', () async {
       config.db.values[commit1.key] = commit1;
       config.db.values[commit2.key] = commit2;
-      buildStatusService = FakeBuildStatusService(commitStatuses: <CommitStatus>[
-        CommitStatus(commit1, const <Stage>[]),
-        CommitStatus(commit2, const <Stage>[])
-      ]);
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[CommitStatus(commit1, const <Stage>[]), CommitStatus(commit2, const <Stage>[])],
+      );
       handler = GetStatus(
         config: config,
         datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
@@ -88,25 +89,26 @@
 
     test('reports statuses with input commit key', () async {
       final Commit commit1 = Commit(
-          key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/ea28a9c34dc701de891eaf74503ca4717019f829'),
-          repository: 'flutter/flutter',
-          sha: 'ea28a9c34dc701de891eaf74503ca4717019f829',
-          timestamp: 3,
-          message: 'test message 1',
-          branch: 'master');
+        key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/ea28a9c34dc701de891eaf74503ca4717019f829'),
+        repository: 'flutter/flutter',
+        sha: 'ea28a9c34dc701de891eaf74503ca4717019f829',
+        timestamp: 3,
+        message: 'test message 1',
+        branch: 'master',
+      );
       final Commit commit2 = Commit(
-          key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/d5b0b3c8d1c5fd89302089077ccabbcfaae045e4'),
-          repository: 'flutter/flutter',
-          sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
-          timestamp: 1,
-          message: 'test message 2',
-          branch: 'master');
+        key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/d5b0b3c8d1c5fd89302089077ccabbcfaae045e4'),
+        repository: 'flutter/flutter',
+        sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+        timestamp: 1,
+        message: 'test message 2',
+        branch: 'master',
+      );
       config.db.values[commit1.key] = commit1;
       config.db.values[commit2.key] = commit2;
-      buildStatusService = FakeBuildStatusService(commitStatuses: <CommitStatus>[
-        CommitStatus(commit1, const <Stage>[]),
-        CommitStatus(commit2, const <Stage>[])
-      ]);
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[CommitStatus(commit1, const <Stage>[]), CommitStatus(commit2, const <Stage>[])],
+      );
       handler = GetStatus(
         config: config,
         datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
@@ -116,9 +118,11 @@
       const String expectedLastCommitKeyEncoded =
           'ahNzfmZsdXR0ZXItZGFzaGJvYXJkckcLEglDaGVja2xpc3QiOGZsdXR0ZXIvZmx1dHRlci9lYTI4YTljMzRkYzcwMWRlODkxZWFmNzQ1MDNjYTQ3MTcwMTlmODI5DA';
 
-      tester.request = FakeHttpRequest(queryParametersValue: <String, String>{
-        GetStatus.kLastCommitKeyParam: expectedLastCommitKeyEncoded,
-      });
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          GetStatus.kLastCommitKeyParam: expectedLastCommitKeyEncoded,
+        },
+      );
       final Map<String, dynamic> result = (await decodeHandlerBody())!;
 
       expect(result['Statuses'].first, <String, dynamic>{
@@ -144,10 +148,9 @@
       commit2.branch = 'flutter-1.1-candidate.1';
       config.db.values[commit1.key] = commit1;
       config.db.values[commit2.key] = commit2;
-      buildStatusService = FakeBuildStatusService(commitStatuses: <CommitStatus>[
-        CommitStatus(commit1, const <Stage>[]),
-        CommitStatus(commit2, const <Stage>[])
-      ]);
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[CommitStatus(commit1, const <Stage>[]), CommitStatus(commit2, const <Stage>[])],
+      );
       handler = GetStatus(
         config: config,
         datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
@@ -158,9 +161,11 @@
 
       expect(config.db.values.length, 2);
 
-      tester.request = FakeHttpRequest(queryParametersValue: <String, String>{
-        GetStatus.kBranchParam: branch,
-      });
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          GetStatus.kBranchParam: branch,
+        },
+      );
       final Map<String, dynamic> result = (await decodeHandlerBody())!;
 
       expect(result['Statuses'].length, 1);
diff --git a/app_dart/test/request_handlers/github/webhook_subscription_test.dart b/app_dart/test/request_handlers/github/webhook_subscription_test.dart
index 4bc36cf..636bdb8 100644
--- a/app_dart/test/request_handlers/github/webhook_subscription_test.dart
+++ b/app_dart/test/request_handlers/github/webhook_subscription_test.dart
@@ -130,17 +130,21 @@
 
       await tester.post(webhook);
 
-      verify(pullRequestsService.edit(
-        Config.flutterSlug,
-        issueNumber,
-        state: 'closed',
-      )).called(1);
+      verify(
+        pullRequestsService.edit(
+          Config.flutterSlug,
+          issueNumber,
+          state: 'closed',
+        ),
+      ).called(1);
 
-      verify(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.wrongHeadBranchPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.wrongHeadBranchPullRequestMessageValue)),
+        ),
+      ).called(1);
     });
 
     test('No action against candidate branches', () async {
@@ -166,17 +170,21 @@
 
       await tester.post(webhook);
 
-      verifyNever(pullRequestsService.edit(
-        Config.flutterSlug,
-        issueNumber,
-        base: kDefaultBranchName,
-      ));
+      verifyNever(
+        pullRequestsService.edit(
+          Config.flutterSlug,
+          issueNumber,
+          base: kDefaultBranchName,
+        ),
+      );
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains('-> master')),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains('-> master')),
+        ),
+      );
     });
 
     test('Acts on opened against dev', () async {
@@ -202,17 +210,21 @@
 
       await tester.post(webhook);
 
-      verify(pullRequestsService.edit(
-        Config.flutterSlug,
-        issueNumber,
-        base: kDefaultBranchName,
-      )).called(1);
+      verify(
+        pullRequestsService.edit(
+          Config.flutterSlug,
+          issueNumber,
+          base: kDefaultBranchName,
+        ),
+      ).called(1);
 
-      verify(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains('dev -> master')),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains('dev -> master')),
+        ),
+      ).called(1);
     });
 
     test('Acts on opened against master when default is main', () async {
@@ -239,17 +251,21 @@
 
       await tester.post(webhook);
 
-      verify(pullRequestsService.edit(
-        Config.engineSlug,
-        issueNumber,
-        base: 'main',
-      )).called(1);
+      verify(
+        pullRequestsService.edit(
+          Config.engineSlug,
+          issueNumber,
+          base: 'main',
+        ),
+      ).called(1);
 
-      verify(issuesService.createComment(
-        Config.engineSlug,
-        issueNumber,
-        argThat(contains('master -> main')),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          Config.engineSlug,
+          issueNumber,
+          argThat(contains('master -> main')),
+        ),
+      ).called(1);
     });
 
     // We already schedule checks when a draft is opened, don't need to re-test
@@ -337,32 +353,42 @@
 
       await tester.post(webhook);
 
-      verifyNever(pullRequestsService.edit(
-        Config.flutterSlug,
-        issueNumber,
-        base: kDefaultBranchName,
-      ));
+      verifyNever(
+        pullRequestsService.edit(
+          Config.flutterSlug,
+          issueNumber,
+          base: kDefaultBranchName,
+        ),
+      );
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.wrongBaseBranchPullRequestMessage)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.wrongBaseBranchPullRequestMessage)),
+        ),
+      );
     });
 
     group('getLabelsForFrameworkPath', () {
       test('Only the team label is applied to pubspec.yaml', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_tools/pubspec.yaml'),
-            <String>{'team'});
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_tools/pubspec.yaml'),
+          <String>{'team'},
+        );
       });
 
       test('Tool label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_tools/hot_reload.dart'),
-            contains('tool'));
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath(
-                'packages/fuchsia_remote_debug_protocol/hot_reload.dart'),
-            contains('tool'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_tools/hot_reload.dart'),
+          contains('tool'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath(
+            'packages/fuchsia_remote_debug_protocol/hot_reload.dart',
+          ),
+          contains('tool'),
+        );
       });
 
       test('iOS label applied', () {
@@ -377,151 +403,225 @@
       });
 
       test('Framework label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/widget.dart'),
-            contains('framework'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_test/lib/tester.dart'),
-            contains('framework'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_driver/lib/driver.dart'),
-            contains('framework'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens/lib/flutter_goldens.dart'),
-            contains('framework'));
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens_client/lib/skia_client.dart'),
-            contains('framework'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/widget.dart'),
+          contains('framework'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_test/lib/tester.dart'),
+          contains('framework'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_driver/lib/driver.dart'),
+          contains('framework'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens/lib/flutter_goldens.dart'),
+          contains('framework'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens_client/lib/skia_client.dart'),
+          contains('framework'),
+        );
       });
 
       test('Material label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('foo/bar/baz/material/design.dart'),
-            contains('f: material design'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('foo/bar/baz/material/design.dart'),
+          contains('f: material design'),
+        );
       });
 
       test('Cupertino label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('foo/bar/baz/cupertino/design.dart'),
-            contains('f: cupertino'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('foo/bar/baz/cupertino/design.dart'),
+          contains('f: cupertino'),
+        );
       });
 
       test('i18n label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_localizations/allo.dart'),
-            contains('a: internationalization'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_localizations/allo.dart'),
+          contains('a: internationalization'),
+        );
       });
 
       test('Tests label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_test/lib/tester.dart'),
-            contains('a: tests'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_driver/lib/driver.dart'),
-            contains('a: tests'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens/lib/flutter_goldens.dart'),
-            contains('a: tests'));
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens_client/lib/skia_client.dart'),
-            contains('a: tests'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_test/lib/tester.dart'),
+          contains('a: tests'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_driver/lib/driver.dart'),
+          contains('a: tests'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens/lib/flutter_goldens.dart'),
+          contains('a: tests'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens_client/lib/skia_client.dart'),
+          contains('a: tests'),
+        );
       });
 
       test('a11y label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('foo/bar/baz/semantics/voiceover.dart'),
-            contains('a: accessibility'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('foo/bar/baz/accessibility/voiceover.dart'),
-            contains('a: accessibility'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('foo/bar/baz/semantics/voiceover.dart'),
+          contains('a: accessibility'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('foo/bar/baz/accessibility/voiceover.dart'),
+          contains('a: accessibility'),
+        );
       });
 
       test('Examples label applied', () {
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath('examples/foo/bar/baz.dart'), contains('d: examples'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath('examples/foo/bar/baz.dart'),
+          contains('d: examples'),
+        );
       });
 
       test('API Docs label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('examples/api/bar/baz.dart'),
-            <String>['d: examples', 'team', 'd: api docs', 'documentation']);
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('examples/api/bar/baz.dart'),
+          <String>['d: examples', 'team', 'd: api docs', 'documentation'],
+        );
       });
 
       test('Gallery label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('examples/flutter_gallery/lib/gallery.dart'),
-            contains('team: gallery'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('examples/flutter_gallery/lib/gallery.dart'),
+          contains('team: gallery'),
+        );
       });
 
       test('Team label applied', () {
         expect(GithubWebhookSubscription.getLabelsForFrameworkPath('dev/foo/bar/baz.dart'), contains('team'));
         expect(GithubWebhookSubscription.getLabelsForFrameworkPath('examples/foo/bar/baz.dart'), contains('team'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens/lib/flutter_goldens.dart'),
-            contains('team'));
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens_client/lib/skia_client.dart'),
-            contains('team'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/fix_data.yaml'),
-            contains('team'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens/lib/flutter_goldens.dart'),
+          contains('team'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter_goldens_client/lib/skia_client.dart'),
+          contains('team'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/fix_data.yaml'),
+          contains('team'),
+        );
         expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/test_fixes'), contains('team'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/test_fixes/material.expect'),
-            contains('team'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/test_fixes/material.expect'),
+          contains('team'),
+        );
       });
 
       test('tech-debt label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/fix_data.yaml'),
-            contains('tech-debt'));
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/test_fixes'), contains('tech-debt'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/test_fixes/material.expect'),
-            contains('tech-debt'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/fix_data.yaml'),
+          contains('tech-debt'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/test_fixes'),
+          contains('tech-debt'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/test_fixes/material.expect'),
+          contains('tech-debt'),
+        );
       });
 
       test('gestures label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/gestures'),
-            contains('f: gestures'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/gestures'),
+          contains('f: gestures'),
+        );
       });
 
       test('focus label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/focus_node.dart'),
-            contains('f: focus'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/focus_scope.dart'),
-            contains('f: focus'));
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/focus_manager.dart'),
-            contains('f: focus'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/focus_node.dart'),
+          contains('f: focus'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/focus_scope.dart'),
+          contains('f: focus'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/focus_manager.dart'),
+          contains('f: focus'),
+        );
       });
 
       test('routes label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/router.dart'),
-            contains('f: routes'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/routes.dart'),
-            contains('f: routes'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/navigator.dart'),
-            contains('f: routes'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/router.dart'),
+          contains('f: routes'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/routes.dart'),
+          contains('f: routes'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/navigator.dart'),
+          contains('f: routes'),
+        );
       });
 
       test('text input label applied', () {
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath(
-                'dev/integration_tests/web_e2e_tests/test_driver/text_editing_integration.dart'),
-            contains('a: text input'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath(
+            'dev/integration_tests/web_e2e_tests/test_driver/text_editing_integration.dart',
+          ),
+          contains('a: text input'),
+        );
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath(
-                'packages/flutter/lib/src/widgets/text_editing_action.dart'),
-            contains('a: text input'));
+          GithubWebhookSubscription.getLabelsForFrameworkPath(
+            'packages/flutter/lib/src/widgets/text_editing_action.dart',
+          ),
+          contains('a: text input'),
+        );
       });
 
       test('animation label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/animation'),
-            contains('a: animation'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/animation'),
+          contains('a: animation'),
+        );
       });
 
       test('scrolling label applied', () {
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/sliver.dart'),
-            contains('f: scrolling'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/material/scrollbar.dart'),
-            contains('f: scrolling'));
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/rendering/viewport.dart'),
-            contains('f: scrolling'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/widgets/sliver.dart'),
+          contains('f: scrolling'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/material/scrollbar.dart'),
+          contains('f: scrolling'),
+        );
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/flutter/lib/src/rendering/viewport.dart'),
+          contains('f: scrolling'),
+        );
       });
 
       test('integration_test label is/isn\'t applied', () {
         // Label does not apply to integration tests outside of the
         // integration_test package.
         expect(
-            GithubWebhookSubscription.getLabelsForFrameworkPath(
-                'dev/integration_tests/web_e2e_tests/test_driver/text_editing_integration.dart'),
-            <String>{'team', 'a: text input'});
+          GithubWebhookSubscription.getLabelsForFrameworkPath(
+            'dev/integration_tests/web_e2e_tests/test_driver/text_editing_integration.dart',
+          ),
+          <String>{'team', 'a: text input'},
+        );
         // Label applies to integration_test package
-        expect(GithubWebhookSubscription.getLabelsForFrameworkPath('packages/integration_test/lib/common.dart'),
-            contains('integration_test'));
+        expect(
+          GithubWebhookSubscription.getLabelsForFrameworkPath('packages/integration_test/lib/common.dart'),
+          contains('integration_test'),
+        );
       });
     });
 
@@ -531,43 +631,59 @@
       });
 
       test('platform-android applied for Android embedder', () {
-        expect(GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/android/RIsForRhubarbPie.java'),
-            contains('platform-android'));
+        expect(
+          GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/android/RIsForRhubarbPie.java'),
+          contains('platform-android'),
+        );
       });
 
       test('platform-ios and platform-macos applied for common Darwin code', () {
-        expect(GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/darwin/common/ThinkDifferent.mm'),
-            containsAll(<String>['platform-ios', 'platform-macos']));
+        expect(
+          GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/darwin/common/ThinkDifferent.mm'),
+          containsAll(<String>['platform-ios', 'platform-macos']),
+        );
       });
 
       test('platform-ios and platform-ios applied for iOS embedder', () {
-        expect(GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/darwin/ios/BackButton.mm'),
-            contains('platform-ios'));
+        expect(
+          GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/darwin/ios/BackButton.mm'),
+          contains('platform-ios'),
+        );
       });
 
       test('platform-macos applied for macOS embedder', () {
-        expect(GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/darwin/macos/PhysicalEscapeKey.mm'),
-            contains('platform-macos'));
+        expect(
+          GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/darwin/macos/PhysicalEscapeKey.mm'),
+          contains('platform-macos'),
+        );
       });
 
       test('platform-fuchsia applied for fuchsia embedder', () {
-        expect(GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/fuchsia/spell_checker.cc'),
-            contains('platform-fuchsia'));
+        expect(
+          GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/fuchsia/spell_checker.cc'),
+          contains('platform-fuchsia'),
+        );
       });
 
       test('platform-linux applied for linux embedder', () {
-        expect(GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/linux/systemd_integration.cc'),
-            contains('platform-linux'));
+        expect(
+          GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/linux/systemd_integration.cc'),
+          contains('platform-linux'),
+        );
       });
 
       test('platform-windows applied for windows embedder', () {
-        expect(GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/windows/start_menu.cc'),
-            contains('platform-windows'));
+        expect(
+          GithubWebhookSubscription.getLabelsForEnginePath('shell/platform/windows/start_menu.cc'),
+          contains('platform-windows'),
+        );
       });
 
       test('platform-web applied for web paths', () {
         expect(
-            GithubWebhookSubscription.getLabelsForEnginePath('lib/web_ui/shadow_dom.dart'), contains('platform-web'));
+          GithubWebhookSubscription.getLabelsForEnginePath('lib/web_ui/shadow_dom.dart'),
+          contains('platform-web'),
+        );
         expect(GithubWebhookSubscription.getLabelsForEnginePath('web_sdk/'), contains('platform-web'));
       });
     });
@@ -654,21 +770,25 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.flutterSlug,
-        issueNumber,
-        <String>['framework'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.flutterSlug,
+          issueNumber,
+          <String>['framework'],
+        ),
+      ).called(1);
 
-      verify(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      ).called(1);
     });
 
     group("Auto-roller accounts do not label Framework PR with test label or comment.", () {
-      Set<String> inputs = {
+      final Set<String> inputs = {
         'skia-flutter-autoroll',
         'dependabot',
       };
@@ -699,17 +819,21 @@
 
           await tester.post(webhook);
 
-          verify(issuesService.addLabelsToIssue(
-            slug,
-            issueNumber,
-            <String>['framework'],
-          )).called(1);
+          verify(
+            issuesService.addLabelsToIssue(
+              slug,
+              issueNumber,
+              <String>['framework'],
+            ),
+          ).called(1);
 
-          verifyNever(issuesService.createComment(
-            slug,
-            issueNumber,
-            argThat(contains(config.missingTestsPullRequestMessageValue)),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              issueNumber,
+              argThat(contains(config.missingTestsPullRequestMessageValue)),
+            ),
+          );
         });
       }
     });
@@ -738,17 +862,21 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['framework'],
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['framework'],
+        ),
+      );
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework does not label PR with no tests label if file is test exempt', () async {
@@ -774,17 +902,21 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['framework'],
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['framework'],
+        ),
+      );
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework labels PRs, comment if no tests including hit_test.dart file', () async {
@@ -813,17 +945,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['framework', 'f: gestures'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['framework', 'f: gestures'],
+        ),
+      ).called(1);
 
-      verify(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      ).called(1);
     });
 
     test('Framework labels PRs, no dart files', () async {
@@ -843,17 +979,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['framework'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['framework'],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        any,
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          any,
+        ),
+      );
     });
 
     test('Framework labels PRs, no comment if tests', () async {
@@ -882,29 +1022,33 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>[
-          'framework',
-          'a: accessibility',
-          'tool',
-          'a: tests',
-          'd: examples',
-          'team',
-          'team: gallery',
-          'engine',
-          'f: cupertino',
-          'f: material design',
-          'a: internationalization',
-        ],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>[
+            'framework',
+            'a: accessibility',
+            'tool',
+            'a: tests',
+            'd: examples',
+            'team',
+            'team: gallery',
+            'engine',
+            'f: cupertino',
+            'f: material design',
+            'a: internationalization',
+          ],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework labels dart fix PRs, no comment if tests', () async {
@@ -925,17 +1069,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['team', 'tech-debt', 'framework', 'f: material design'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['team', 'tech-debt', 'framework', 'f: material design'],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework labels bot PR, no comment', () async {
@@ -957,17 +1105,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['tool', 'framework', 'a: tests', 'team', 'tech-debt', 'team: flakes'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['tool', 'framework', 'a: tests', 'team', 'tech-debt', 'team: flakes'],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework labels deletion only PR, no test request', () async {
@@ -991,18 +1143,22 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['framework'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['framework'],
+        ),
+      ).called(1);
 
       // The PR here is only deleting code, so no test comment.
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('PR with additions and deletions is commented and labeled', () async {
@@ -1026,17 +1182,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['framework'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['framework'],
+        ),
+      ).called(1);
 
-      verify(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      ).called(1);
     });
 
     test('Framework no comment if code has only devicelab test', () async {
@@ -1057,11 +1217,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework no comment if only dev bots or devicelab changed', () async {
@@ -1079,11 +1241,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework no comment if only .gitignore changed', () async {
@@ -1099,11 +1263,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        any,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          any,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework no test comment if Objective-C test changed', () async {
@@ -1122,11 +1288,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework no comment if only AUTHORS changed', () async {
@@ -1144,11 +1312,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework no comment if only ci.yaml and cirrus.yml changed', () async {
@@ -1169,11 +1339,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework no comment if only analysis options changed', () async {
@@ -1189,11 +1361,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework no comment if only CODEOWNERS changed', () async {
@@ -1209,11 +1383,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework no comment if only comments changed', () async {
@@ -1246,11 +1422,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework labels PRs, no comment if tests (dev/bots/test.dart)', () async {
@@ -1274,11 +1452,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework labels PRs, no comment if tests (dev/bots/analyze.dart)', () async {
@@ -1303,11 +1483,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Framework labels PRs, apply label but no comment when rolling engine version', () async {
@@ -1332,17 +1514,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.flutterSlug,
-        issueNumber,
-        <String>['engine'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.flutterSlug,
+          issueNumber,
+          <String>['engine'],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Engine labels PRs, comment and labels if no tests', () async {
@@ -1369,27 +1555,33 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['platform-ios'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['platform-ios'],
+        ),
+      ).called(1);
 
-      verify(issuesService.createComment(
-        slug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          slug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      ).called(1);
 
-      verify(issuesService.addLabelsToIssue(
-        slug,
-        issueNumber,
-        <String>['needs tests'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          slug,
+          issueNumber,
+          <String>['needs tests'],
+        ),
+      ).called(1);
     });
 
     group("Auto-roller accounts do not label Engine PR with test label or comment.", () {
-      Set<String> inputs = {
+      final Set<String> inputs = {
         'engine-flutter-autoroll',
         'dependabot',
       };
@@ -1419,23 +1611,29 @@
 
           await tester.post(webhook);
 
-          verify(issuesService.addLabelsToIssue(
-            Config.engineSlug,
-            issueNumber,
-            <String>['platform-ios'],
-          )).called(1);
+          verify(
+            issuesService.addLabelsToIssue(
+              Config.engineSlug,
+              issueNumber,
+              <String>['platform-ios'],
+            ),
+          ).called(1);
 
-          verifyNever(issuesService.createComment(
-            Config.engineSlug,
-            issueNumber,
-            argThat(contains(config.missingTestsPullRequestMessageValue)),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              Config.engineSlug,
+              issueNumber,
+              argThat(contains(config.missingTestsPullRequestMessageValue)),
+            ),
+          );
 
-          verifyNever(issuesService.addLabelsToIssue(
-            Config.engineSlug,
-            issueNumber,
-            <String>['needs tests'],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              Config.engineSlug,
+              issueNumber,
+              <String>['needs tests'],
+            ),
+          );
         });
       }
     });
@@ -1464,23 +1662,29 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.addLabelsToIssue(
-        Config.engineSlug,
-        issueNumber,
-        <String>['platform-ios'],
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          Config.engineSlug,
+          issueNumber,
+          <String>['platform-ios'],
+        ),
+      );
 
-      verifyNever(issuesService.createComment(
-        Config.engineSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.engineSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
 
-      verifyNever(issuesService.addLabelsToIssue(
-        Config.engineSlug,
-        issueNumber,
-        <String>['needs tests'],
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          Config.engineSlug,
+          issueNumber,
+          <String>['needs tests'],
+        ),
+      );
     });
 
     test('Engine labels PRs, no code files', () async {
@@ -1501,17 +1705,21 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.addLabelsToIssue(
-        Config.engineSlug,
-        issueNumber,
-        any,
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          Config.engineSlug,
+          issueNumber,
+          any,
+        ),
+      );
 
-      verifyNever(issuesService.createComment(
-        Config.engineSlug,
-        issueNumber,
-        any,
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.engineSlug,
+          issueNumber,
+          any,
+        ),
+      );
     });
 
     test('Engine labels PRs, no comment if Java tests', () async {
@@ -1532,19 +1740,23 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.engineSlug,
-        issueNumber,
-        <String>[
-          'platform-android',
-        ],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.engineSlug,
+          issueNumber,
+          <String>[
+            'platform-android',
+          ],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        Config.engineSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.engineSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Engine labels PRs, no comment if cc tests', () async {
@@ -1565,17 +1777,21 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.addLabelsToIssue(
-        Config.engineSlug,
-        issueNumber,
-        any,
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          Config.engineSlug,
+          issueNumber,
+          any,
+        ),
+      );
 
-      verifyNever(issuesService.createComment(
-        Config.engineSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.engineSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Engine labels PRs, no comment if cc becnhmarks', () async {
@@ -1596,17 +1812,21 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.addLabelsToIssue(
-        Config.engineSlug,
-        issueNumber,
-        any,
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          Config.engineSlug,
+          issueNumber,
+          any,
+        ),
+      );
 
-      verifyNever(issuesService.createComment(
-        Config.engineSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.engineSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Engine labels PRs, no comments if pr is for release branches', () async {
@@ -1633,17 +1853,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.engineSlug,
-        issueNumber,
-        <String>['platform-ios'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.engineSlug,
+          issueNumber,
+          <String>['platform-ios'],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        Config.engineSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.engineSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Engine does not comment for comment-only changes', () async {
@@ -1679,11 +1903,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.engineSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.engineSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('No labels when only pubspec.yaml changes', () async {
@@ -1703,17 +1929,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.flutterSlug,
-        issueNumber,
-        <String>['team'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.flutterSlug,
+          issueNumber,
+          <String>['team'],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Plugins comments and labels if no tests and no patch info', () async {
@@ -1739,21 +1969,25 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      ).called(1);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.pluginsSlug,
-        issueNumber,
-        <String>['needs tests'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.pluginsSlug,
+          issueNumber,
+          <String>['needs tests'],
+        ),
+      ).called(1);
     });
 
     group('Plugins does not comment and label if author is an autoroller account.', () {
-      Set<String> inputs = {
+      final Set<String> inputs = {
         'engine-flutter-autoroll',
         'skia-flutter-autoroll',
         'dependabot',
@@ -1784,17 +2018,21 @@
 
           await tester.post(webhook);
 
-          verifyNever(issuesService.createComment(
-            Config.pluginsSlug,
-            issueNumber,
-            argThat(contains(config.missingTestsPullRequestMessageValue)),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              Config.pluginsSlug,
+              issueNumber,
+              argThat(contains(config.missingTestsPullRequestMessageValue)),
+            ),
+          );
 
-          verifyNever(issuesService.addLabelsToIssue(
-            Config.pluginsSlug,
-            issueNumber,
-            <String>['needs tests'],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              Config.pluginsSlug,
+              issueNumber,
+              <String>['needs tests'],
+            ),
+          );
         });
       }
     });
@@ -1823,17 +2061,21 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
 
-      verifyNever(issuesService.addLabelsToIssue(
-        Config.pluginsSlug,
-        issueNumber,
-        any,
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          Config.pluginsSlug,
+          issueNumber,
+          any,
+        ),
+      );
     });
 
     test('Plugins comments and labels for code change', () async {
@@ -1877,17 +2119,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      ).called(1);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.pluginsSlug,
-        issueNumber,
-        <String>['needs tests'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.pluginsSlug,
+          issueNumber,
+          <String>['needs tests'],
+        ),
+      ).called(1);
     });
 
     test('Plugins comments and labels for code removal with comment addition', () async {
@@ -1929,17 +2175,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      ).called(1);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.pluginsSlug,
-        issueNumber,
-        <String>['needs tests'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.pluginsSlug,
+          issueNumber,
+          <String>['needs tests'],
+        ),
+      ).called(1);
     });
 
     test('Plugins does not comment for comment-only changes', () async {
@@ -1975,11 +2225,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Plugins does not comment if Dart tests', () async {
@@ -1999,11 +2251,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Plugins does not comment if Android unit tests', () async {
@@ -2023,11 +2277,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Plugins does not comment if Android UI tests', () async {
@@ -2047,11 +2303,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Plugins does not comment if iOS/macOS unit tests', () async {
@@ -2071,11 +2329,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Plugins does not comment if iOS/macOS UI tests', () async {
@@ -2095,11 +2355,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Plugins does not comment if Windows tests', () async {
@@ -2119,11 +2381,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Plugins does not comment if Linux tests', () async {
@@ -2143,11 +2407,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.pluginsSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.pluginsSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Packages comments and labels if no tests', () async {
@@ -2172,17 +2438,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.createComment(
-        Config.packagesSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      )).called(1);
+      verify(
+        issuesService.createComment(
+          Config.packagesSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      ).called(1);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.packagesSlug,
-        issueNumber,
-        <String>['needs tests'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.packagesSlug,
+          issueNumber,
+          <String>['needs tests'],
+        ),
+      ).called(1);
     });
 
     test('Packages do not comment or label if pr is for release branches', () async {
@@ -2210,17 +2480,21 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.packagesSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.packagesSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
 
-      verifyNever(issuesService.addLabelsToIssue(
-        Config.packagesSlug,
-        issueNumber,
-        any,
-      ));
+      verifyNever(
+        issuesService.addLabelsToIssue(
+          Config.packagesSlug,
+          issueNumber,
+          any,
+        ),
+      );
     });
 
     test('Packages does not comment if Dart tests', () async {
@@ -2241,11 +2515,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.packagesSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.packagesSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Packages does not comment for custom test driver', () async {
@@ -2266,11 +2542,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.packagesSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.packagesSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Schedule tasks when pull request is closed and merged', () async {
@@ -2296,18 +2574,21 @@
         isDraft: true,
       );
 
-      when(pullRequestsService.listFiles(Config.flutterSlug, issueNumber))
-          .thenAnswer((_) => Stream<PullRequestFile>.value(
-                PullRequestFile()..filename = 'some_change.dart',
-              ));
+      when(pullRequestsService.listFiles(Config.flutterSlug, issueNumber)).thenAnswer(
+        (_) => Stream<PullRequestFile>.value(
+          PullRequestFile()..filename = 'some_change.dart',
+        ),
+      );
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Will not spawn comments if they have already been made.', () async {
@@ -2332,17 +2613,21 @@
 
       await tester.post(webhook);
 
-      verify(issuesService.addLabelsToIssue(
-        Config.flutterSlug,
-        issueNumber,
-        <String>['framework'],
-      )).called(1);
+      verify(
+        issuesService.addLabelsToIssue(
+          Config.flutterSlug,
+          issueNumber,
+          <String>['framework'],
+        ),
+      ).called(1);
 
-      verifyNever(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        argThat(contains(config.missingTestsPullRequestMessageValue)),
-      ));
+      verifyNever(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          argThat(contains(config.missingTestsPullRequestMessageValue)),
+        ),
+      );
     });
 
     test('Skips labeling or commenting on autorolls', () async {
@@ -2356,11 +2641,13 @@
 
       await tester.post(webhook);
 
-      verifyNever(issuesService.createComment(
-        any,
-        issueNumber,
-        any,
-      ));
+      verifyNever(
+        issuesService.createComment(
+          any,
+          issueNumber,
+          any,
+        ),
+      );
     });
 
     test('Comments on PR but does not schedule builds for unmergeable PRs', () async {
@@ -2373,11 +2660,13 @@
       );
 
       await tester.post(webhook);
-      verify(issuesService.createComment(
-        Config.flutterSlug,
-        issueNumber,
-        config.mergeConflictPullRequestMessage,
-      ));
+      verify(
+        issuesService.createComment(
+          Config.flutterSlug,
+          issueNumber,
+          config.mergeConflictPullRequestMessage,
+        ),
+      );
     });
 
     test('When synchronized, cancels existing builds and schedules new ones', () async {
@@ -2487,11 +2776,13 @@
           mergeable: false,
         );
         await tester.post(webhook);
-        verify(issuesService.createComment(
-          Config.flutterSlug,
-          issueNumber,
-          config.mergeConflictPullRequestMessage,
-        ));
+        verify(
+          issuesService.createComment(
+            Config.flutterSlug,
+            issueNumber,
+            config.mergeConflictPullRequestMessage,
+          ),
+        );
       });
 
       test('When synchronized, cancels existing builds and schedules new ones', () async {
diff --git a/app_dart/test/request_handlers/push_build_status_to_github_test.dart b/app_dart/test/request_handlers/push_build_status_to_github_test.dart
index ba8a4b5..17eff2f 100644
--- a/app_dart/test/request_handlers/push_build_status_to_github_test.dart
+++ b/app_dart/test/request_handlers/push_build_status_to_github_test.dart
@@ -115,10 +115,14 @@
       });
 
       test('only if pull request is for the default branch', () async {
-        when(pullRequestsService.list(any)).thenAnswer((_) => Stream<PullRequest>.value(generatePullRequest(
+        when(pullRequestsService.list(any)).thenAnswer(
+          (_) => Stream<PullRequest>.value(
+            generatePullRequest(
               id: 1,
               branch: 'flutter-2.15-candidate.3',
-            )));
+            ),
+          ),
+        );
         buildStatusService.cumulativeStatus = BuildStatus.success();
         await tester.get<Body>(handler);
         verifyNever(repositoriesService.createStatus(any, any, any));
diff --git a/app_dart/test/request_handlers/push_gold_status_to_github_test.dart b/app_dart/test/request_handlers/push_gold_status_to_github_test.dart
index c661743..fd66b03 100644
--- a/app_dart/test/request_handlers/push_gold_status_to_github_test.dart
+++ b/app_dart/test/request_handlers/push_gold_status_to_github_test.dart
@@ -160,7 +160,12 @@
       });
 
       GithubGoldStatusUpdate newStatusUpdate(
-          RepositorySlug slug, PullRequest pr, String statusUpdate, String sha, String description) {
+        RepositorySlug slug,
+        PullRequest pr,
+        String statusUpdate,
+        String sha,
+        String description,
+      ) {
         return GithubGoldStatusUpdate(
           key: db.emptyKey.append(GithubGoldStatusUpdate, id: pr.number),
           status: statusUpdate,
@@ -219,31 +224,39 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            flutterPr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
-          verifyNever(issuesService.addLabelsToIssue(
-            engineSlug,
-            enginePr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              flutterPr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              engineSlug,
+              enginePr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            flutterPr.number!,
-            argThat(contains(config.flutterGoldCommentID(flutterPr))),
-          ));
-          verifyNever(issuesService.createComment(
-            engineSlug,
-            enginePr.number!,
-            argThat(contains(config.flutterGoldCommentID(enginePr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              flutterPr.number!,
+              argThat(contains(config.flutterGoldCommentID(flutterPr))),
+            ),
+          );
+          verifyNever(
+            issuesService.createComment(
+              engineSlug,
+              enginePr.number!,
+              argThat(contains(config.flutterGoldCommentID(enginePr))),
+            ),
+          );
         });
 
         test('if there are no framework tests for this PR, exclude web builds', () async {
@@ -260,19 +273,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          );
         });
 
         test('same commit, checks running, last status running', () async {
@@ -301,19 +318,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          );
         });
 
         test('same commit, checks complete, last status complete', () async {
@@ -342,19 +363,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          );
         });
 
         test('same commit, checks complete, last status & gold status is running/awaiting triage, should not comment',
@@ -435,31 +460,39 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
-          verifyNever(issuesService.addLabelsToIssue(
-            engineSlug,
-            enginePr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              engineSlug,
+              enginePr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          ));
-          verifyNever(issuesService.createComment(
-            engineSlug,
-            enginePr.number!,
-            argThat(contains(config.flutterGoldCommentID(enginePr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          );
+          verifyNever(
+            issuesService.createComment(
+              engineSlug,
+              enginePr.number!,
+              argThat(contains(config.flutterGoldCommentID(enginePr))),
+            ),
+          );
         });
 
         test('does nothing for branches not staged to land on main/master', () async {
@@ -481,19 +514,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          );
         });
 
         test('does not post for draft PRs, does not query Gold', () async {
@@ -515,19 +552,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            any,
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              any,
+            ),
+          );
         });
 
         test('does not post for draft PRs, does not query Gold', () async {
@@ -549,19 +590,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            any,
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              any,
+            ),
+          );
         });
 
         test('does not post for stale PRs, does not query Gold, stale comment', () async {
@@ -591,19 +636,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels, should comment to update
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verify(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldStalePRValue)),
-          )).called(1);
+          verify(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldStalePRValue)),
+            ),
+          ).called(1);
         });
 
         test('will only comment once on stale PRs', () async {
@@ -633,19 +682,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            any,
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              any,
+            ),
+          );
         });
 
         test('will not fire off stale warning for non-framework PRs', () async {
@@ -675,19 +728,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            any,
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              any,
+            ),
+          );
         });
       });
 
@@ -723,31 +780,39 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            flutterPr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
-          verifyNever(issuesService.addLabelsToIssue(
-            engineSlug,
-            enginePr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              flutterPr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              engineSlug,
+              enginePr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            flutterPr.number!,
-            argThat(contains(config.flutterGoldCommentID(flutterPr))),
-          ));
-          verifyNever(issuesService.createComment(
-            engineSlug,
-            enginePr.number!,
-            argThat(contains(config.flutterGoldCommentID(enginePr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              flutterPr.number!,
+              argThat(contains(config.flutterGoldCommentID(flutterPr))),
+            ),
+          );
+          verifyNever(
+            issuesService.createComment(
+              engineSlug,
+              enginePr.number!,
+              argThat(contains(config.flutterGoldCommentID(enginePr))),
+            ),
+          );
         });
 
         test('new commit, checks complete, no changes detected', () async {
@@ -792,19 +857,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not label or comment
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          );
         });
 
         test('new commit, checks complete, change detected, should comment', () async {
@@ -856,19 +925,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should label and comment
-          verify(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          )).called(1);
+          verify(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          ).called(1);
 
-          verify(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          )).called(1);
+          verify(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          ).called(1);
         });
 
         test('same commit, checks complete, last status was waiting & gold status is needing triage, should comment',
@@ -921,19 +994,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should apply labels and make comment
-          verify(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          )).called(1);
+          verify(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          ).called(1);
 
-          verify(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          )).called(1);
+          verify(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          ).called(1);
         });
 
         test('uses shorter comment after first comment to reduce noise', () async {
@@ -985,29 +1062,37 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should apply labels and make comment
-          verify(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          )).called(1);
+          verify(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          ).called(1);
 
-          verify(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldFollowUpAlertValue)),
-          )).called(1);
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldInitialAlertValue)),
-          ));
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldAlertConstantValue)),
-          ));
+          verify(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldFollowUpAlertValue)),
+            ),
+          ).called(1);
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldInitialAlertValue)),
+            ),
+          );
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldAlertConstantValue)),
+            ),
+          );
         });
 
         test('same commit, checks complete, new status, should not comment', () async {
@@ -1059,19 +1144,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not label or comment
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          );
         });
 
         test('will inform contributor of unresolved check for ATF draft status', () async {
@@ -1099,19 +1188,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verify(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldDraftChangeValue)),
-          )).called(1);
+          verify(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldDraftChangeValue)),
+            ),
+          ).called(1);
         });
 
         test('will only inform contributor of unresolved check for ATF draft status once', () async {
@@ -1139,19 +1232,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldDraftChangeValue)),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldDraftChangeValue)),
+            ),
+          );
         });
 
         test('delivers pending state for failing checks, does not query Gold', () async {
@@ -1174,19 +1271,23 @@
           expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
           // Should not apply labels or make comments
-          verifyNever(issuesService.addLabelsToIssue(
-            slug,
-            pr.number!,
-            <String>[
-              kGoldenFileLabel,
-            ],
-          ));
+          verifyNever(
+            issuesService.addLabelsToIssue(
+              slug,
+              pr.number!,
+              <String>[
+                kGoldenFileLabel,
+              ],
+            ),
+          );
 
-          verifyNever(issuesService.createComment(
-            slug,
-            pr.number!,
-            argThat(contains(config.flutterGoldCommentID(pr))),
-          ));
+          verifyNever(
+            issuesService.createComment(
+              slug,
+              pr.number!,
+              argThat(contains(config.flutterGoldCommentID(pr))),
+            ),
+          );
         });
       });
 
@@ -1198,7 +1299,12 @@
           followUpPR,
         ];
         final GithubGoldStatusUpdate completedStatus = newStatusUpdate(
-            slug, completedPR, GithubGoldStatusUpdate.statusCompleted, 'abc', config.flutterGoldSuccessValue!);
+          slug,
+          completedPR,
+          GithubGoldStatusUpdate.statusCompleted,
+          'abc',
+          config.flutterGoldSuccessValue!,
+        );
         final GithubGoldStatusUpdate followUpStatus = newStatusUpdate(slug, followUpPR, '', '', '');
         db.values[completedStatus.key] = completedStatus;
         db.values[followUpStatus.key] = followUpStatus;
@@ -1279,19 +1385,23 @@
         expect(records.where((LogRecord record) => record.level == Level.SEVERE), isEmpty);
 
         // Should not apply labels or make comments
-        verifyNever(issuesService.addLabelsToIssue(
-          slug,
-          pr.number!,
-          <String>[
-            kGoldenFileLabel,
-          ],
-        ));
+        verifyNever(
+          issuesService.addLabelsToIssue(
+            slug,
+            pr.number!,
+            <String>[
+              kGoldenFileLabel,
+            ],
+          ),
+        );
 
-        verifyNever(issuesService.createComment(
-          slug,
-          pr.number!,
-          argThat(contains(config.flutterGoldCommentID(pr))),
-        ));
+        verifyNever(
+          issuesService.createComment(
+            slug,
+            pr.number!,
+            argThat(contains(config.flutterGoldCommentID(pr))),
+          ),
+        );
       });
 
       test('uses the correct Gold endpoint to get status', () async {
diff --git a/app_dart/test/request_handlers/refresh_cirrus_status_test.dart b/app_dart/test/request_handlers/refresh_cirrus_status_test.dart
index fab6ebc..a4dbc7c 100644
--- a/app_dart/test/request_handlers/refresh_cirrus_status_test.dart
+++ b/app_dart/test/request_handlers/refresh_cirrus_status_test.dart
@@ -8,7 +8,7 @@
 void main() {
   group('RefreshCirrusStatus', () {
     Map<String, dynamic>? data;
-    List<Map<String, dynamic>> tasks = <Map<String, dynamic>>[];
+    final List<Map<String, dynamic>> tasks = <Map<String, dynamic>>[];
     setUp(() {
       data = dataWithMultipleBuilds;
     });
diff --git a/app_dart/test/request_handlers/reset_prod_task_test.dart b/app_dart/test/request_handlers/reset_prod_task_test.dart
index 12737ec..f49830e 100644
--- a/app_dart/test/request_handlers/reset_prod_task_test.dart
+++ b/app_dart/test/request_handlers/reset_prod_task_test.dart
@@ -64,14 +64,16 @@
         'Key': config.keyHelper.encode(task.key),
       };
 
-      when(mockLuciBuildService.checkRerunBuilder(
-        commit: anyNamed('commit'),
-        datastore: anyNamed('datastore'),
-        task: anyNamed('task'),
-        target: anyNamed('target'),
-        tags: anyNamed('tags'),
-        ignoreChecks: true,
-      )).thenAnswer((_) async => true);
+      when(
+        mockLuciBuildService.checkRerunBuilder(
+          commit: anyNamed('commit'),
+          datastore: anyNamed('datastore'),
+          task: anyNamed('task'),
+          target: anyNamed('target'),
+          tags: anyNamed('tags'),
+          ignoreChecks: true,
+        ),
+      ).thenAnswer((_) async => true);
     });
     test('Schedule new task', () async {
       config.db.values[task.key] = task;
@@ -108,14 +110,16 @@
     });
 
     test('Fails if task is not rerun', () async {
-      when(mockLuciBuildService.checkRerunBuilder(
-        commit: anyNamed('commit'),
-        datastore: anyNamed('datastore'),
-        task: anyNamed('task'),
-        target: anyNamed('target'),
-        tags: anyNamed('tags'),
-        ignoreChecks: true,
-      )).thenAnswer((_) async => false);
+      when(
+        mockLuciBuildService.checkRerunBuilder(
+          commit: anyNamed('commit'),
+          datastore: anyNamed('datastore'),
+          task: anyNamed('task'),
+          target: anyNamed('target'),
+          tags: anyNamed('tags'),
+          ignoreChecks: true,
+        ),
+      ).thenAnswer((_) async => false);
       config.db.values[task.key] = task;
       config.db.values[commit.key] = commit;
       expect(() => tester.post(handler), throwsA(isA<InternalServerError>()));
diff --git a/app_dart/test/request_handlers/reset_try_task_test.dart b/app_dart/test/request_handlers/reset_try_task_test.dart
index 5b5a4da..5a6adbf 100644
--- a/app_dart/test/request_handlers/reset_try_task_test.dart
+++ b/app_dart/test/request_handlers/reset_try_task_test.dart
@@ -53,16 +53,20 @@
     });
 
     test('Empty repo', () async {
-      tester.request = FakeHttpRequest(queryParametersValue: <String, String>{
-        'pr': '123',
-      });
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          'pr': '123',
+        },
+      );
       expect(() => tester.get(handler), throwsA(isA<BadRequestException>()));
     });
 
     test('Empty pr', () async {
-      tester.request = FakeHttpRequest(queryParametersValue: <String, String>{
-        'repo': 'flutter',
-      });
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          'repo': 'flutter',
+        },
+      );
       expect(() => tester.get(handler), throwsA(isA<BadRequestException>()));
     });
 
@@ -74,10 +78,12 @@
           'check_suite': <String, dynamic>{'id': 2},
         });
       });
-      tester.request = FakeHttpRequest(queryParametersValue: <String, String>{
-        ResetTryTask.kRepoParam: 'flutter',
-        ResetTryTask.kPullRequestNumberParam: '123',
-      });
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          ResetTryTask.kRepoParam: 'flutter',
+          ResetTryTask.kPullRequestNumberParam: '123',
+        },
+      );
       expect(await tester.get(handler), Body.empty);
     });
 
diff --git a/app_dart/test/request_handlers/scheduler/batch_backfiller_test.dart b/app_dart/test/request_handlers/scheduler/batch_backfiller_test.dart
index cb77181..dfc70ec 100644
--- a/app_dart/test/request_handlers/scheduler/batch_backfiller_test.dart
+++ b/app_dart/test/request_handlers/scheduler/batch_backfiller_test.dart
@@ -50,7 +50,7 @@
     });
 
     test('does not backfill on completed task column', () async {
-      List<Task> allGreen = <Task>[
+      final List<Task> allGreen = <Task>[
         generateTask(1, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(2, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(3, name: 'Linux_android A', status: Task.statusSucceeded),
@@ -61,7 +61,7 @@
     });
 
     test('does not backfill when there is a running task', () async {
-      List<Task> middleTaskInProgress = <Task>[
+      final List<Task> middleTaskInProgress = <Task>[
         generateTask(1, name: 'Linux_android A', status: Task.statusNew),
         generateTask(2, name: 'Linux_android A', status: Task.statusInProgress),
         generateTask(3, name: 'Linux_android A', status: Task.statusNew),
@@ -72,7 +72,7 @@
     });
 
     test('backfills latest task', () async {
-      List<Task> allGray = <Task>[
+      final List<Task> allGray = <Task>[
         generateTask(1, name: 'Linux_android A', status: Task.statusNew),
         generateTask(2, name: 'Linux_android A', status: Task.statusNew),
         generateTask(3, name: 'Linux_android A', status: Task.statusNew),
@@ -86,7 +86,7 @@
     });
 
     test('backfills earlier failed task with higher priority', () async {
-      List<Task> allGray = <Task>[
+      final List<Task> allGray = <Task>[
         generateTask(1, name: 'Linux_android A', status: Task.statusNew),
         generateTask(2, name: 'Linux_android A', status: Task.statusNew),
         generateTask(3, name: 'Linux_android A', status: Task.statusFailed),
@@ -100,7 +100,7 @@
     });
 
     test('backfills older task', () async {
-      List<Task> oldestGray = <Task>[
+      final List<Task> oldestGray = <Task>[
         generateTask(1, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(2, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(3, name: 'Linux_android A', status: Task.statusNew),
@@ -111,7 +111,7 @@
     });
 
     test('updates task as in-progress after backfilling', () async {
-      List<Task> oldestGray = <Task>[
+      final List<Task> oldestGray = <Task>[
         generateTask(1, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(2, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(3, name: 'Linux_android A', status: Task.statusNew),
@@ -127,7 +127,7 @@
 
     test('skip scheduling builds if datastore commit fails', () async {
       db.commitException = true;
-      List<Task> oldestGray = <Task>[
+      final List<Task> oldestGray = <Task>[
         generateTask(1, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(2, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(3, name: 'Linux_android A', status: Task.statusNew),
@@ -140,7 +140,7 @@
     });
 
     test('backfills only column A when B does need backfill', () async {
-      List<Task> scheduleA = <Task>[
+      final List<Task> scheduleA = <Task>[
         // Linux_android A
         generateTask(1, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(2, name: 'Linux_android A', status: Task.statusSucceeded),
@@ -156,7 +156,7 @@
     });
 
     test('backfills both column A and B', () async {
-      List<Task> scheduleA = <Task>[
+      final List<Task> scheduleA = <Task>[
         // Linux_android A
         generateTask(1, name: 'Linux_android A', status: Task.statusSucceeded),
         generateTask(2, name: 'Linux_android A', status: Task.statusSucceeded),
diff --git a/app_dart/test/request_handlers/scheduler/request_subscription_test.dart b/app_dart/test/request_handlers/scheduler/request_subscription_test.dart
index 17bee33..0428343 100644
--- a/app_dart/test/request_handlers/scheduler/request_subscription_test.dart
+++ b/app_dart/test/request_handlers/scheduler/request_subscription_test.dart
@@ -73,15 +73,17 @@
 
       return const BatchResponse();
     });
-    const BatchRequest request = BatchRequest(requests: <Request>[
-      Request(
-        scheduleBuild: ScheduleBuildRequest(
-          builderId: BuilderId(
-            builder: 'Linux A',
+    const BatchRequest request = BatchRequest(
+      requests: <Request>[
+        Request(
+          scheduleBuild: ScheduleBuildRequest(
+            builderId: BuilderId(
+              builder: 'Linux A',
+            ),
           ),
         ),
-      ),
-    ]);
+      ],
+    );
     tester.message = push_message.PushMessage(data: base64Encode(utf8.encode(jsonEncode(request))));
     final Body body = await tester.post(handler);
     expect(body, Body.empty);
@@ -92,15 +94,17 @@
     when(buildBucketClient.batch(any)).thenAnswer((_) async {
       return const BatchResponse();
     });
-    const BatchRequest request = BatchRequest(requests: <Request>[
-      Request(
-        scheduleBuild: ScheduleBuildRequest(
-          builderId: BuilderId(
-            builder: 'Linux A',
+    const BatchRequest request = BatchRequest(
+      requests: <Request>[
+        Request(
+          scheduleBuild: ScheduleBuildRequest(
+            builderId: BuilderId(
+              builder: 'Linux A',
+            ),
           ),
         ),
-      ),
-    ]);
+      ],
+    );
     tester.message = push_message.PushMessage(data: base64Encode(utf8.encode(jsonEncode(request))));
     final Body body = await tester.post(handler);
     expect(body, isNotNull);
diff --git a/app_dart/test/request_handlers/update_branches_test.dart b/app_dart/test/request_handlers/update_branches_test.dart
index 5d39909..8a9d6ed 100644
--- a/app_dart/test/request_handlers/update_branches_test.dart
+++ b/app_dart/test/request_handlers/update_branches_test.dart
@@ -33,7 +33,7 @@
     late MockRepositoriesService mockRepositoriesService;
     final MockProcessManager processManager = MockProcessManager();
 
-    String stdoutResult = '72fe8a9ec3af4d76097f09a9c01bf31c62a942aa refs/heads/main';
+    const String stdoutResult = '72fe8a9ec3af4d76097f09a9c01bf31c62a942aa refs/heads/main';
     const String testBranchSha = '72fe8a9ec3af4d76097f09a9c01bf31c62a942aa';
 
     Future<T?> decodeHandlerBody<T>() async {
@@ -61,7 +61,7 @@
       );
 
       const String id = 'flutter/flutter/main';
-      int lastActivity = DateTime.tryParse("2019-05-15T15:20:56Z")!.millisecondsSinceEpoch;
+      final int lastActivity = DateTime.tryParse("2019-05-15T15:20:56Z")!.millisecondsSinceEpoch;
       final Key<String> branchKey = db.emptyKey.append<String>(Branch, id: id);
       final Branch currentBranch = Branch(
         key: branchKey,
@@ -73,14 +73,18 @@
     test('should not retrieve branches older than 2 months', () async {
       expect(db.values.values.whereType<Branch>().length, 1);
       when(mockRepositoriesService.getCommit(any, any)).thenAnswer((Invocation invocation) {
-        return Future<RepositoryCommit>.value(RepositoryCommit(
+        return Future<RepositoryCommit>.value(
+          RepositoryCommit(
             sha: testBranchSha,
             commit: GitCommit(
-                committer: GitCommitUser(
-              'dash',
-              'dash@google.com',
-              DateTime.now().subtract(const Duration(days: 90)),
-            ))));
+              committer: GitCommitUser(
+                'dash',
+                'dash@google.com',
+                DateTime.now().subtract(const Duration(days: 90)),
+              ),
+            ),
+          ),
+        );
       });
 
       final List<dynamic> result = (await decodeHandlerBody())!;
@@ -92,18 +96,22 @@
 
       // a recent commit is added for each of the 6 repos
       when(mockRepositoriesService.getCommit(any, any)).thenAnswer((Invocation invocation) {
-        return Future<RepositoryCommit>.value(RepositoryCommit(
+        return Future<RepositoryCommit>.value(
+          RepositoryCommit(
             sha: testBranchSha,
             commit: GitCommit(
-                committer: GitCommitUser(
-              'dash',
-              'dash@google.com',
-              DateTime.now(),
-            ))));
+              committer: GitCommitUser(
+                'dash',
+                'dash@google.com',
+                DateTime.now(),
+              ),
+            ),
+          ),
+        );
       });
 
       final List<dynamic> result = (await decodeHandlerBody())!;
-      List<String> repos = [];
+      final List<String> repos = [];
       for (dynamic k in result) {
         repos.add('${k['branch']['repository']}/${k['branch']['branch']}');
       }
@@ -116,14 +124,18 @@
       expect(db.values.values.whereType<Branch>().length, 1);
 
       when(mockRepositoriesService.getCommit(any, any)).thenAnswer((Invocation invocation) {
-        return Future<RepositoryCommit>.value(RepositoryCommit(
+        return Future<RepositoryCommit>.value(
+          RepositoryCommit(
             sha: testBranchSha,
             commit: GitCommit(
-                committer: GitCommitUser(
-              'dash',
-              'dash@google.com',
-              DateTime.tryParse('2020-05-15T15:20:56Z'),
-            ))));
+              committer: GitCommitUser(
+                'dash',
+                'dash@google.com',
+                DateTime.tryParse('2020-05-15T15:20:56Z'),
+              ),
+            ),
+          ),
+        );
       });
 
       final List<dynamic> result = (await decodeHandlerBody())!;
@@ -135,14 +147,18 @@
       when(processManager.runSync(any)).thenAnswer((Invocation invocation) => ProcessResult(1, -1, stdoutResult, ''));
 
       when(mockRepositoriesService.getCommit(any, any)).thenAnswer((Invocation invocation) {
-        return Future<RepositoryCommit>.value(RepositoryCommit(
+        return Future<RepositoryCommit>.value(
+          RepositoryCommit(
             sha: testBranchSha,
             commit: GitCommit(
-                committer: GitCommitUser(
-              'dash',
-              'dash@google.com',
-              DateTime.tryParse('2020-05-15T15:20:56Z'),
-            ))));
+              committer: GitCommitUser(
+                'dash',
+                'dash@google.com',
+                DateTime.tryParse('2020-05-15T15:20:56Z'),
+              ),
+            ),
+          ),
+        );
       });
 
       expect(() => decodeHandlerBody<List<dynamic>>(), throwsA(const TypeMatcher<FormatException>()));
diff --git a/app_dart/test/request_handlers/update_existing_flaky_issues_test.dart b/app_dart/test/request_handlers/update_existing_flaky_issues_test.dart
index d8267e7..1a3f395 100644
--- a/app_dart/test/request_handlers/update_existing_flaky_issues_test.dart
+++ b/app_dart/test/request_handlers/update_existing_flaky_issues_test.dart
@@ -57,12 +57,15 @@
       });
 
       // when gets the content of TESTOWNERS
-      when(mockRepositoriesService.getContents(
-        captureAny,
-        kTestOwnerPath,
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockRepositoriesService.getContents(
+          captureAny,
+          kTestOwnerPath,
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<RepositoryContents>.value(
-            RepositoryContents(file: GitHubFile(content: gitHubEncode(testOwnersContent))));
+          RepositoryContents(file: GitHubFile(content: gitHubEncode(testOwnersContent))),
+        );
       });
 
       when(mockGitHubClient.repositories).thenReturn(mockRepositoriesService);
@@ -115,11 +118,13 @@
       });
       // when firing github request.
       // This is for replacing labels.
-      when(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<Response>.value(Response('[]', 200));
       });
       final Map<String, dynamic> result = await utf8.decoder
@@ -135,11 +140,13 @@
       expect(captured[2], expectedSemanticsIntegrationTestIssueComment);
 
       // Verify labels are applied correctly.
-      captured = verify(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).captured;
+      captured = verify(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).captured;
       expect(captured.length, 3);
       expect(captured[0].toString(), 'PUT');
       expect(captured[1], '/repos/${Config.flutterSlug.fullName}/issues/$existingIssueNumber/labels');
@@ -180,11 +187,13 @@
       });
       // when firing github request.
       // This is for replacing labels.
-      when(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<Response>.value(Response('[]', 200));
       });
       final Map<String, dynamic> result = await utf8.decoder
@@ -200,11 +209,13 @@
       expect(captured[2], expectedSemanticsIntegrationTestIssueComment);
 
       // Verify labels are applied correctly.
-      captured = verify(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).captured;
+      captured = verify(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).captured;
       expect(captured.length, 3);
       expect(captured[0].toString(), 'PUT');
       expect(captured[1], '/repos/${Config.flutterSlug.fullName}/issues/$existingIssueNumber/labels');
@@ -245,11 +256,13 @@
       });
       // when firing github request.
       // This is for replacing labels.
-      when(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<Response>.value(Response('[]', 200));
       });
       final Map<String, dynamic> result = await utf8.decoder
@@ -268,11 +281,13 @@
       expect(captured[5], expectedStagingCiyamlTestIssueComment);
 
       // Verify labels are applied correctly.
-      captured = verify(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).captured;
+      captured = verify(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).captured;
       expect(captured.length, 6);
       expect(captured[0].toString(), 'PUT');
       expect(captured[1], '/repos/${Config.flutterSlug.fullName}/issues/$existingIssueNumber/labels');
@@ -312,11 +327,13 @@
       });
       // when firing github request.
       // This is for replacing labels.
-      when(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<Response>.value(Response('[]', 200));
       });
 
@@ -367,11 +384,13 @@
       });
       // when firing github request.
       // This is for replacing labels.
-      when(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).thenAnswer((Invocation invocation) {
+      when(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).thenAnswer((Invocation invocation) {
         return Future<Response>.value(Response('[]', 200));
       });
 
@@ -388,11 +407,13 @@
       expect(captured[2], expectedSemanticsIntegrationTestZeroFlakeIssueComment);
 
       // Verify labels are the same.
-      captured = verify(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      )).captured;
+      captured = verify(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      ).captured;
       expect(captured.length, 3);
       expect(captured[0].toString(), 'PUT');
       expect(captured[1], '/repos/${Config.flutterSlug.fullName}/issues/$existingIssueNumber/labels');
@@ -439,11 +460,13 @@
       verifyNever(mockIssuesService.createComment(captureAny, captureAny, captureAny));
 
       // Verify labels are the same.
-      verifyNever(mockGitHubClient.request(
-        captureAny,
-        captureAny,
-        body: captureAnyNamed('body'),
-      ));
+      verifyNever(
+        mockGitHubClient.request(
+          captureAny,
+          captureAny,
+          body: captureAnyNamed('body'),
+        ),
+      );
 
       expect(result['Status'], 'success');
     });
diff --git a/app_dart/test/request_handlers/update_existing_flaky_issues_test_data.dart b/app_dart/test/request_handlers/update_existing_flaky_issues_test_data.dart
index 5b3c821..d8e8446 100644
--- a/app_dart/test/request_handlers/update_existing_flaky_issues_test_data.dart
+++ b/app_dart/test/request_handlers/update_existing_flaky_issues_test_data.dart
@@ -224,13 +224,14 @@
         },
       ),
       pb.Target(
-          name: 'Mac_android ignore_myflakiness',
-          scheduler: pb.SchedulerSystem.luci,
-          presubmit: false,
-          properties: <String, String>{
-            'ignore_flakiness': 'true',
-            'tags': jsonEncode(['devicelab']),
-          }),
+        name: 'Mac_android ignore_myflakiness',
+        scheduler: pb.SchedulerSystem.luci,
+        presubmit: false,
+        properties: <String, String>{
+          'ignore_flakiness': 'true',
+          'tags': jsonEncode(['devicelab']),
+        },
+      ),
       pb.Target(
         name: 'Linux ci_yaml flutter roller',
         scheduler: pb.SchedulerSystem.luci,
diff --git a/app_dart/test/request_handlers/vacuum_github_commits_test.dart b/app_dart/test/request_handlers/vacuum_github_commits_test.dart
index 2cc308c..06f556c 100644
--- a/app_dart/test/request_handlers/vacuum_github_commits_test.dart
+++ b/app_dart/test/request_handlers/vacuum_github_commits_test.dart
@@ -45,21 +45,24 @@
         final GitCommit gitCommit = GitCommit()
           ..message = 'commit message'
           ..committer = committer;
-        commits.add(RepositoryCommit()
-          ..sha = sha
-          ..author = author
-          ..commit = gitCommit);
+        commits.add(
+          RepositoryCommit()
+            ..sha = sha
+            ..author = author
+            ..commit = gitCommit,
+        );
       }
       return commits;
     }
 
     Commit shaToCommit(String sha, String branch, RepositorySlug slug) {
       return Commit(
-          key: db.emptyKey.append(Commit, id: '${slug.fullName}/$branch/$sha'),
-          repository: slug.fullName,
-          sha: sha,
-          branch: branch,
-          timestamp: int.parse(sha));
+        key: db.emptyKey.append(Commit, id: '${slug.fullName}/$branch/$sha'),
+        repository: slug.fullName,
+        sha: sha,
+        branch: branch,
+        timestamp: int.parse(sha),
+      );
     }
 
     setUp(() {
diff --git a/app_dart/test/request_handling/api_request_handler_test.dart b/app_dart/test/request_handling/api_request_handler_test.dart
index a5a76ef..fc5dcf3 100644
--- a/app_dart/test/request_handling/api_request_handler_test.dart
+++ b/app_dart/test/request_handling/api_request_handler_test.dart
@@ -31,12 +31,15 @@
             log.fine(line);
           },
         );
-        runZoned<dynamic>(() {
-          return ss.fork(() {
-            ss.register(#appengine.logging, log);
-            return handler.service(request);
-          });
-        }, zoneSpecification: spec);
+        runZoned<dynamic>(
+          () {
+            return ss.fork(() {
+              ss.register(#appengine.logging, log);
+              return handler.service(request);
+            });
+          },
+          zoneSpecification: spec,
+        );
       });
     });
 
diff --git a/app_dart/test/request_handling/authentication_test.dart b/app_dart/test/request_handling/authentication_test.dart
index 5b0a932..20a375f 100644
--- a/app_dart/test/request_handling/authentication_test.dart
+++ b/app_dart/test/request_handling/authentication_test.dart
@@ -77,11 +77,12 @@
         config.oauthClientIdValue = 'client-id';
         request.headers.add('X-Flutter-IdToken', 'authenticated');
         await expectLater(
-            auth.authenticateToken(
-              token,
-              clientContext: FakeClientContext(),
-            ),
-            throwsA(isA<Unauthenticated>()));
+          auth.authenticateToken(
+            token,
+            clientContext: FakeClientContext(),
+          ),
+          throwsA(isA<Unauthenticated>()),
+        );
       });
 
       test('fails if tokenInfo returns invalid JSON', () async {
@@ -100,11 +101,12 @@
         );
         config.oauthClientIdValue = 'expected-client-id';
         await expectLater(
-            auth.authenticateToken(
-              token,
-              clientContext: FakeClientContext(),
-            ),
-            throwsA(isA<Unauthenticated>()));
+          auth.authenticateToken(
+            token,
+            clientContext: FakeClientContext(),
+          ),
+          throwsA(isA<Unauthenticated>()),
+        );
       });
 
       test('allows different aud for gcloud tokens with google accounts', () async {
@@ -115,11 +117,12 @@
         );
         config.oauthClientIdValue = 'expected-client-id';
         await expectLater(
-            auth.authenticateToken(
-              token,
-              clientContext: FakeClientContext(),
-            ),
-            throwsA(isA<Unauthenticated>()));
+          auth.authenticateToken(
+            token,
+            clientContext: FakeClientContext(),
+          ),
+          throwsA(isA<Unauthenticated>()),
+        );
       });
 
       test('succeeds for google.com auth user', () async {
@@ -142,11 +145,12 @@
             TokenInfo(audience: 'client-id', hostedDomain: 'gmail.com', email: 'abc@gmail.com', issued: DateTime.now());
         config.oauthClientIdValue = 'client-id';
         await expectLater(
-            auth.authenticateToken(
-              token,
-              clientContext: FakeClientContext(),
-            ),
-            throwsA(isA<Unauthenticated>()));
+          auth.authenticateToken(
+            token,
+            clientContext: FakeClientContext(),
+          ),
+          throwsA(isA<Unauthenticated>()),
+        );
       });
 
       test('succeeds for allowed non-Google auth users', () async {
diff --git a/app_dart/test/request_handling/cache_request_handler_test.dart b/app_dart/test/request_handling/cache_request_handler_test.dart
index 9936755..35484ae 100644
--- a/app_dart/test/request_handling/cache_request_handler_test.dart
+++ b/app_dart/test/request_handling/cache_request_handler_test.dart
@@ -27,9 +27,10 @@
     setUp(() async {
       config = FakeConfig();
       tester = RequestHandlerTester(
-          request: FakeHttpRequest(
-        path: testHttpPath,
-      ));
+        request: FakeHttpRequest(
+          path: testHttpPath,
+        ),
+      );
 
       cache = CacheService(inMemory: true);
     });
diff --git a/app_dart/test/request_handling/pubsub_authentication_test.dart b/app_dart/test/request_handling/pubsub_authentication_test.dart
index f7d5174..ba1170a 100644
--- a/app_dart/test/request_handling/pubsub_authentication_test.dart
+++ b/app_dart/test/request_handling/pubsub_authentication_test.dart
@@ -37,13 +37,15 @@
 
     for (String allowedAccount in Config.allowedPubsubServiceAccounts) {
       test('auth succeeds for $allowedAccount', () async {
-        httpClient = MockClient((_) async => http.Response(
-              _generateTokenResponse(allowedAccount),
-              HttpStatus.ok,
-              headers: <String, String>{
-                HttpHeaders.contentTypeHeader: 'application/json',
-              },
-            ));
+        httpClient = MockClient(
+          (_) async => http.Response(
+            _generateTokenResponse(allowedAccount),
+            HttpStatus.ok,
+            headers: <String, String>{
+              HttpHeaders.contentTypeHeader: 'application/json',
+            },
+          ),
+        );
         auth = PubsubAuthenticationProvider(
           config: config,
           clientContextProvider: () => clientContext,
@@ -58,13 +60,15 @@
     }
 
     test('auth fails with unauthorized service account', () async {
-      httpClient = MockClient((_) async => http.Response(
-            _generateTokenResponse('unauthorized@gmail.com'),
-            HttpStatus.ok,
-            headers: <String, String>{
-              HttpHeaders.contentTypeHeader: 'application/json',
-            },
-          ));
+      httpClient = MockClient(
+        (_) async => http.Response(
+          _generateTokenResponse('unauthorized@gmail.com'),
+          HttpStatus.ok,
+          headers: <String, String>{
+            HttpHeaders.contentTypeHeader: 'application/json',
+          },
+        ),
+      );
       auth = PubsubAuthenticationProvider(
         config: config,
         clientContextProvider: () => clientContext,
@@ -77,13 +81,15 @@
     });
 
     test('auth fails with invalid token', () async {
-      httpClient = MockClient((_) async => http.Response(
-            'Invalid token',
-            HttpStatus.unauthorized,
-            headers: <String, String>{
-              HttpHeaders.contentTypeHeader: 'application/json',
-            },
-          ));
+      httpClient = MockClient(
+        (_) async => http.Response(
+          'Invalid token',
+          HttpStatus.unauthorized,
+          headers: <String, String>{
+            HttpHeaders.contentTypeHeader: 'application/json',
+          },
+        ),
+      );
       auth = PubsubAuthenticationProvider(
         config: config,
         clientContextProvider: () => clientContext,
@@ -96,16 +102,18 @@
     });
 
     test('auth fails with expired token', () async {
-      httpClient = MockClient((_) async => http.Response(
-            _generateTokenResponse(
-              Config.allowedPubsubServiceAccounts.first,
-              expiresIn: -1,
-            ),
-            HttpStatus.ok,
-            headers: <String, String>{
-              HttpHeaders.contentTypeHeader: 'application/json',
-            },
-          ));
+      httpClient = MockClient(
+        (_) async => http.Response(
+          _generateTokenResponse(
+            Config.allowedPubsubServiceAccounts.first,
+            expiresIn: -1,
+          ),
+          HttpStatus.ok,
+          headers: <String, String>{
+            HttpHeaders.contentTypeHeader: 'application/json',
+          },
+        ),
+      );
       auth = PubsubAuthenticationProvider(
         config: config,
         clientContextProvider: () => clientContext,
diff --git a/app_dart/test/service/bigquery_test.dart b/app_dart/test/service/bigquery_test.dart
index fd1d943..8085fc0 100644
--- a/app_dart/test/service/bigquery_test.dart
+++ b/app_dart/test/service/bigquery_test.dart
@@ -58,7 +58,8 @@
     // When queries flaky data from BigQuery.
     when(jobsResource.query(captureAny, expectedProjectId)).thenAnswer((Invocation invocation) {
       return Future<QueryResponse>.value(
-          QueryResponse.fromJson(jsonDecode(jobNotCompleteResponse) as Map<dynamic, dynamic>));
+        QueryResponse.fromJson(jsonDecode(jobNotCompleteResponse) as Map<dynamic, dynamic>),
+      );
     });
     bool hasError = false;
     try {
@@ -74,7 +75,8 @@
     // When queries flaky data from BigQuery.
     when(jobsResource.query(captureAny, expectedProjectId)).thenAnswer((Invocation invocation) {
       return Future<QueryResponse>.value(
-          QueryResponse.fromJson(jsonDecode(semanticsIntegrationTestResponse) as Map<dynamic, dynamic>));
+        QueryResponse.fromJson(jsonDecode(semanticsIntegrationTestResponse) as Map<dynamic, dynamic>),
+      );
     });
     final List<BuilderStatistic> statisticList = await service.listBuilderStatistic(expectedProjectId);
     expect(statisticList.length, 1);
@@ -95,7 +97,8 @@
   test('return empty build list when bigquery returns no rows', () async {
     when(jobsResource.query(captureAny, expectedProjectId)).thenAnswer((Invocation invocation) {
       return Future<QueryResponse>.value(
-          QueryResponse.fromJson(jsonDecode(noRecordsResponse) as Map<dynamic, dynamic>));
+        QueryResponse.fromJson(jsonDecode(noRecordsResponse) as Map<dynamic, dynamic>),
+      );
     });
     final List<BuilderRecord> records =
         await service.listRecentBuildRecordsForBuilder(expectedProjectId, builder: 'test', limit: 10);
diff --git a/app_dart/test/service/branch_service_test.dart b/app_dart/test/service/branch_service_test.dart
index 883a0ec..084c2e2 100644
--- a/app_dart/test/service/branch_service_test.dart
+++ b/app_dart/test/service/branch_service_test.dart
@@ -70,7 +70,7 @@
       expect(db.values.values.whereType<Branch>().length, 0);
 
       const String id = 'flutter/flutter/flutter-2.12-candidate.4';
-      int lastActivity = DateTime.tryParse("2019-05-15T15:20:56Z")!.millisecondsSinceEpoch;
+      final int lastActivity = DateTime.tryParse("2019-05-15T15:20:56Z")!.millisecondsSinceEpoch;
       final Key<String> branchKey = db.emptyKey.append<String>(Branch, id: id);
       final Branch currentBranch = Branch(key: branchKey, lastActivity: lastActivity);
       db.values[currentBranch.key] = currentBranch;
@@ -89,7 +89,7 @@
       expect(db.values.values.whereType<Branch>().length, 0);
 
       const String id = 'flutter/flutter/flutter-2.12-candidate.4';
-      int lastActivity = DateTime.tryParse("2019-05-15T15:20:56Z")!.millisecondsSinceEpoch;
+      final int lastActivity = DateTime.tryParse("2019-05-15T15:20:56Z")!.millisecondsSinceEpoch;
       final Key<String> branchKey = db.emptyKey.append<String>(Branch, id: id);
       final Branch currentBranch = Branch(key: branchKey, lastActivity: lastActivity);
       db.values[currentBranch.key] = currentBranch;
@@ -100,8 +100,10 @@
       await branchService.handleCreateRequest(createEvent);
 
       expect(db.values.values.whereType<Branch>().length, 2);
-      expect(db.values.values.whereType<Branch>().map<String>((Branch b) => b.name),
-          containsAll(<String>['flutter-2.12-candidate.4', 'flutter-2.12-candidate.5']));
+      expect(
+        db.values.values.whereType<Branch>().map<String>((Branch b) => b.name),
+        containsAll(<String>['flutter-2.12-candidate.4', 'flutter-2.12-candidate.5']),
+      );
     });
   });
 
@@ -114,12 +116,13 @@
     });
 
     test('return beta, stable, and latest candidate branches', () async {
-      gh.Branch stableBranch = generateBranch(1, name: 'flutter-2.13-candidate.0', sha: '123stable');
-      gh.Branch betaBranch = generateBranch(2, name: 'flutter-3.2-candidate.5', sha: '456beta');
-      gh.Branch candidateBranch = generateBranch(3, name: 'flutter-3.4-candidate.5', sha: '789dev');
-      gh.Branch candidateBranchOne = generateBranch(4, name: 'flutter-3.3-candidate.9', sha: 'lagerZValue');
-      gh.Branch candidateBranchTwo = generateBranch(5, name: 'flutter-2.15-candidate.99', sha: 'superLargeYZvalue');
-      gh.Branch candidateBranchThree = generateBranch(6, name: 'flutter-0.5-candidate.0', sha: 'someZeroValues');
+      final gh.Branch stableBranch = generateBranch(1, name: 'flutter-2.13-candidate.0', sha: '123stable');
+      final gh.Branch betaBranch = generateBranch(2, name: 'flutter-3.2-candidate.5', sha: '456beta');
+      final gh.Branch candidateBranch = generateBranch(3, name: 'flutter-3.4-candidate.5', sha: '789dev');
+      final gh.Branch candidateBranchOne = generateBranch(4, name: 'flutter-3.3-candidate.9', sha: 'lagerZValue');
+      final gh.Branch candidateBranchTwo =
+          generateBranch(5, name: 'flutter-2.15-candidate.99', sha: 'superLargeYZvalue');
+      final gh.Branch candidateBranchThree = generateBranch(6, name: 'flutter-0.5-candidate.0', sha: 'someZeroValues');
 
       when(mockRepositoriesService.listBranches(any)).thenAnswer((Invocation invocation) {
         return Stream.fromIterable([
@@ -154,15 +157,19 @@
 
     test('does not create branch that already exists', () async {
       gerritService.branchesValue = <String>[branch];
-      expect(() async => branchService.branchFlutterRecipes(branch),
-          throwsExceptionWith<BadRequestException>('$branch already exists'));
+      expect(
+        () async => branchService.branchFlutterRecipes(branch),
+        throwsExceptionWith<BadRequestException>('$branch already exists'),
+      );
     });
 
     test('does not create branch if a good branch point cannot be found', () async {
       gerritService.commitsValue = <GerritCommit>[];
       githubService.listCommitsBranch = (String branch, int ts) => <gh.RepositoryCommit>[];
-      expect(() async => branchService.branchFlutterRecipes(branch),
-          throwsExceptionWith<InternalServerError>('Failed to find a revision to branch Flutter recipes for $branch'));
+      expect(
+        () async => branchService.branchFlutterRecipes(branch),
+        throwsExceptionWith<InternalServerError>('Failed to find a revision to branch Flutter recipes for $branch'),
+      );
     });
 
     test('creates branch', () async {
diff --git a/app_dart/test/service/build_status_provider_test.dart b/app_dart/test/service/build_status_provider_test.dart
index 283addd..846366a 100644
--- a/app_dart/test/service/build_status_provider_test.dart
+++ b/app_dart/test/service/build_status_provider_test.dart
@@ -201,11 +201,12 @@
         db.values[commit2.key] = commit2;
 
         final Task task1 = Task(
-            key: commit1.key.append(Task, id: 1),
-            commitKey: commit1.key,
-            name: 'task1',
-            status: Task.statusSucceeded,
-            stageName: 'stage1');
+          key: commit1.key.append(Task, id: 1),
+          commitKey: commit1.key,
+          name: 'task1',
+          status: Task.statusSucceeded,
+          stageName: 'stage1',
+        );
 
         db.values[task1.key] = task1;
 
diff --git a/app_dart/test/service/buildbucket_test.dart b/app_dart/test/service/buildbucket_test.dart
index b9eab76..b568910 100644
--- a/app_dart/test/service/buildbucket_test.dart
+++ b/app_dart/test/service/buildbucket_test.dart
@@ -141,22 +141,25 @@
     });
 
     test('BatchBuildRequest', () async {
-      const BatchRequest request = BatchRequest(requests: <Request>[
-        Request(
+      const BatchRequest request = BatchRequest(
+        requests: <Request>[
+          Request(
             scheduleBuild: ScheduleBuildRequest(
-          builderId: builderId,
-          experimental: Trinary.yes,
-          tags: <String, List<String>>{
-            'user_agent': <String>['flutter_cocoon'],
-            'flutter_pr': <String>['true', '1'],
-            'cipd_version': <String>['/refs/heads/main'],
-          },
-          properties: <String, String>{
-            'git_url': 'https://github.com/flutter/flutter',
-            'git_ref': 'refs/pull/1/head',
-          },
-        ))
-      ]);
+              builderId: builderId,
+              experimental: Trinary.yes,
+              tags: <String, List<String>>{
+                'user_agent': <String>['flutter_cocoon'],
+                'flutter_pr': <String>['true', '1'],
+                'cipd_version': <String>['/refs/heads/main'],
+              },
+              properties: <String, String>{
+                'git_url': 'https://github.com/flutter/flutter',
+                'git_ref': 'refs/pull/1/head',
+              },
+            ),
+          )
+        ],
+      );
 
       final BatchResponse response = await httpTest<BatchRequest, BatchResponse>(
         request,
@@ -175,13 +178,16 @@
     });
 
     test('Batch', () async {
-      const BatchRequest request = BatchRequest(requests: <Request>[
-        Request(
+      const BatchRequest request = BatchRequest(
+        requests: <Request>[
+          Request(
             getBuild: GetBuildRequest(
-          builderId: builderId,
-          buildNumber: 123,
-        ))
-      ]);
+              builderId: builderId,
+              buildNumber: 123,
+            ),
+          )
+        ],
+      );
 
       final BatchResponse response = await httpTest<BatchRequest, BatchResponse>(
         request,
diff --git a/app_dart/test/service/cache_service_test.dart b/app_dart/test/service/cache_service_test.dart
index 1dc4ec4..165d4ea 100644
--- a/app_dart/test/service/cache_service_test.dart
+++ b/app_dart/test/service/cache_service_test.dart
@@ -63,7 +63,8 @@
       final Entry<Uint8List> entry = FakeEntry();
       // Only on the first call do we want it to throw the exception.
       when(mockTestSubcache['does not matter']).thenAnswer(
-          (Invocation invocation) => getCallCount++ < 1 ? throw Exception('simulate stream sink error') : entry);
+        (Invocation invocation) => getCallCount++ < 1 ? throw Exception('simulate stream sink error') : entry,
+      );
 
       cache.cacheValue = mockMainCache;
 
@@ -80,8 +81,10 @@
       int getCallCount = 0;
       final Entry<Uint8List> entry = FakeEntry();
       // Always throw exception until max retries
-      when(mockTestSubcache['does not matter']).thenAnswer((Invocation invocation) =>
-          getCallCount++ < CacheService.maxCacheGetAttempts ? throw Exception('simulate stream sink error') : entry);
+      when(mockTestSubcache['does not matter']).thenAnswer(
+        (Invocation invocation) =>
+            getCallCount++ < CacheService.maxCacheGetAttempts ? throw Exception('simulate stream sink error') : entry,
+      );
 
       cache.cacheValue = mockMainCache;
 
diff --git a/app_dart/test/service/datastore_test.dart b/app_dart/test/service/datastore_test.dart
index 2fa08aa..333fd6c 100644
--- a/app_dart/test/service/datastore_test.dart
+++ b/app_dart/test/service/datastore_test.dart
@@ -201,10 +201,13 @@
     test('retriesOnGrpcError', () async {
       final Counter counter = Counter();
       try {
-        await runTransactionWithRetries(() async {
-          counter.increase();
-          throw GrpcError.aborted();
-        }, retryOptions: retryOptions);
+        await runTransactionWithRetries(
+          () async {
+            counter.increase();
+            throw GrpcError.aborted();
+          },
+          retryOptions: retryOptions,
+        );
       } catch (e) {
         expect(e, isA<GrpcError>());
       }
@@ -213,10 +216,13 @@
     test('retriesTransactionAbortedError', () async {
       final Counter counter = Counter();
       try {
-        await runTransactionWithRetries(() async {
-          counter.increase();
-          throw gcloud_datastore.TransactionAbortedError();
-        }, retryOptions: retryOptions);
+        await runTransactionWithRetries(
+          () async {
+            counter.increase();
+            throw gcloud_datastore.TransactionAbortedError();
+          },
+          retryOptions: retryOptions,
+        );
       } catch (e) {
         expect(e, isA<gcloud_datastore.TransactionAbortedError>());
       }
@@ -224,9 +230,12 @@
     });
     test('DoesNotRetryOnSuccess', () async {
       final Counter counter = Counter();
-      await runTransactionWithRetries(() async {
-        counter.increase();
-      }, retryOptions: retryOptions);
+      await runTransactionWithRetries(
+        () async {
+          counter.increase();
+        },
+        retryOptions: retryOptions,
+      );
       expect(counter.value(), equals(1));
     });
   });
diff --git a/app_dart/test/service/gerrit_service_test.dart b/app_dart/test/service/gerrit_service_test.dart
index e957355..80edcfd 100644
--- a/app_dart/test/service/gerrit_service_test.dart
+++ b/app_dart/test/service/gerrit_service_test.dart
@@ -94,7 +94,10 @@
       );
 
       await gerritService.createBranch(
-          Config.recipesSlug, 'flutter-2.13-candidate.0', '00439ab49a991db42595f14078adb9811a6f60c6');
+        Config.recipesSlug,
+        'flutter-2.13-candidate.0',
+        '00439ab49a991db42595f14078adb9811a6f60c6',
+      );
     });
 
     test('unexpected response', () async {
@@ -108,8 +111,10 @@
             FakeAuthClient(baseClient!),
         retryDelay: Duration.zero,
       );
-      expect(() async => await gerritService.createBranch(Config.recipesSlug, 'flutter-2.13-candidate.0', 'abc'),
-          throwsExceptionWith<InternalServerError>('Failed to create branch'));
+      expect(
+        () async => await gerritService.createBranch(Config.recipesSlug, 'flutter-2.13-candidate.0', 'abc'),
+        throwsExceptionWith<InternalServerError>('Failed to create branch'),
+      );
     });
 
     test('retries non-200 responses', () async {
@@ -132,7 +137,10 @@
         retryDelay: Duration.zero,
       );
       await gerritService.createBranch(
-          Config.recipesSlug, 'flutter-2.13-candidate.0', '00439ab49a991db42595f14078adb9811a6f60c6');
+        Config.recipesSlug,
+        'flutter-2.13-candidate.0',
+        '00439ab49a991db42595f14078adb9811a6f60c6',
+      );
       expect(attempts, 2);
     });
   });
diff --git a/app_dart/test/service/github_checks_service_test.dart b/app_dart/test/service/github_checks_service_test.dart
index 62a3c86..9161294 100644
--- a/app_dart/test/service/github_checks_service_test.dart
+++ b/app_dart/test/service/github_checks_service_test.dart
@@ -49,8 +49,8 @@
     );
     checkRun = github.CheckRun.fromJson(
       jsonDecode(
-              '{"name": "Cocoon", "id": 123, "external_id": "678", "status": "completed", "started_at": "2020-05-10T02:49:31Z", "head_sha": "the_sha", "check_suite": {"id": 456}}')
-          as Map<String, dynamic>,
+        '{"name": "Cocoon", "id": 123, "external_id": "678", "status": "completed", "started_at": "2020-05-10T02:49:31Z", "head_sha": "the_sha", "check_suite": {"id": 456}}',
+      ) as Map<String, dynamic>,
     );
     final Map<String, github.CheckRun> checkRuns = <String, github.CheckRun>{'Cocoon': checkRun};
     when(mockGithubChecksUtil.allCheckRuns(any, any)).thenAnswer((_) async {
@@ -66,12 +66,13 @@
           .thenAnswer((_) async => generateCheckRun(1));
       final PullRequest pullRequest = generatePullRequest(id: 758);
       await githubChecksService.handleCheckSuite(pullRequest, checkSuiteEvent, scheduler);
-      final List<Target> scheduledTargets = verify(mockLuciBuildService.scheduleTryBuilds(
-              targets: captureAnyNamed('targets'),
-              pullRequest: anyNamed('pullRequest'),
-              checkSuiteEvent: anyNamed('checkSuiteEvent')))
-          .captured
-          .single as List<Target>;
+      final List<Target> scheduledTargets = verify(
+        mockLuciBuildService.scheduleTryBuilds(
+          targets: captureAnyNamed('targets'),
+          pullRequest: anyNamed('pullRequest'),
+          checkSuiteEvent: anyNamed('checkSuiteEvent'),
+        ),
+      ).captured.single as List<Target>;
       final Iterable<String> scheduledTargetNames = scheduledTargets.map((Target target) => target.value.name);
       expect(scheduledTargetNames, <String>[
         'Linux A',
@@ -90,19 +91,24 @@
     });
     test('Userdata does not contain check_run_id', () async {
       final push_message.BuildPushMessage buildMessage = push_message.BuildPushMessage.fromJson(
-          jsonDecode(buildPushMessageJsonTemplate('{\\"retries\\": 1}')) as Map<String, dynamic>);
+        jsonDecode(buildPushMessageJsonTemplate('{\\"retries\\": 1}')) as Map<String, dynamic>,
+      );
       final bool success = await githubChecksService.updateCheckStatus(buildMessage, mockLuciBuildService, slug);
       expect(success, isFalse);
     });
     test('Userdata contain check_run_id', () async {
       when(mockGithubChecksUtil.getCheckRun(any, any, any)).thenAnswer((_) async => checkRun);
-      final push_message.BuildPushMessage buildPushMessage =
-          push_message.BuildPushMessage.fromJson(jsonDecode(buildPushMessageJsonTemplate('{\\"check_run_id\\": 1,'
+      final push_message.BuildPushMessage buildPushMessage = push_message.BuildPushMessage.fromJson(
+        jsonDecode(
+          buildPushMessageJsonTemplate('{\\"check_run_id\\": 1,'
               '\\"repo_owner\\": \\"flutter\\",'
-              '\\"repo_name\\": \\"cocoon\\"}')) as Map<String, dynamic>);
+              '\\"repo_name\\": \\"cocoon\\"}'),
+        ) as Map<String, dynamic>,
+      );
       await githubChecksService.updateCheckStatus(buildPushMessage, mockLuciBuildService, slug);
       expect(
-          verify(mockGithubChecksUtil.updateCheckRun(
+        verify(
+          mockGithubChecksUtil.updateCheckRun(
             any,
             any,
             captureAny,
@@ -110,8 +116,10 @@
             conclusion: anyNamed('conclusion'),
             detailsUrl: anyNamed('detailsUrl'),
             output: anyNamed('output'),
-          )).captured,
-          <github.CheckRun>[checkRun]);
+          ),
+        ).captured,
+        <github.CheckRun>[checkRun],
+      );
     });
   });
 
diff --git a/app_dart/test/service/github_service_test.dart b/app_dart/test/service/github_service_test.dart
index b74acde..104821a 100644
--- a/app_dart/test/service/github_service_test.dart
+++ b/app_dart/test/service/github_service_test.dart
@@ -36,14 +36,16 @@
     mockGitHub = MockGitHub();
     githubService = GithubService(mockGitHub);
     slug = RepositorySlug('flutter', 'flutter');
-    final PostExpectation<Future<http.Response>> whenGithubRequest = when(mockGitHub.request(
-      'GET',
-      '/repos/${slug.owner}/${slug.name}/commits',
-      headers: anyNamed('headers'),
-      params: anyNamed('params'),
-      body: anyNamed('body'),
-      statusCode: anyNamed('statusCode'),
-    ));
+    final PostExpectation<Future<http.Response>> whenGithubRequest = when(
+      mockGitHub.request(
+        'GET',
+        '/repos/${slug.owner}/${slug.name}/commits',
+        headers: anyNamed('headers'),
+        params: anyNamed('params'),
+        body: anyNamed('body'),
+        statusCode: anyNamed('statusCode'),
+      ),
+    );
     whenGithubRequest.thenAnswer((_) async {
       final List<dynamic> data = <dynamic>[];
       for (String sha in shas) {
diff --git a/app_dart/test/service/luci_build_service_test.dart b/app_dart/test/service/luci_build_service_test.dart
index 75d80d4..666f844 100644
--- a/app_dart/test/service/luci_build_service_test.dart
+++ b/app_dart/test/service/luci_build_service_test.dart
@@ -139,10 +139,12 @@
 
     test('with one rpc call', () async {
       when(mockBuildBucketClient.listBuilders(any)).thenAnswer((_) async {
-        return const ListBuildersResponse(builders: [
-          BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test1')),
-          BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test2')),
-        ]);
+        return const ListBuildersResponse(
+          builders: [
+            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test1')),
+            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test2')),
+          ],
+        );
       });
       final Set<String> builders = await service.getAvailableBuilderSet();
       expect(builders.length, 2);
@@ -154,15 +156,20 @@
       when(mockBuildBucketClient.listBuilders(any)).thenAnswer((_) async {
         retries++;
         if (retries == 0) {
-          return const ListBuildersResponse(builders: [
-            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test1')),
-            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test2')),
-          ], nextPageToken: 'token');
+          return const ListBuildersResponse(
+            builders: [
+              BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test1')),
+              BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test2')),
+            ],
+            nextPageToken: 'token',
+          );
         } else if (retries == 1) {
-          return const ListBuildersResponse(builders: [
-            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test3')),
-            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test4')),
-          ]);
+          return const ListBuildersResponse(
+            builders: [
+              BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test3')),
+              BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'test4')),
+            ],
+          );
         } else {
           return const ListBuildersResponse(builders: []);
         }
@@ -319,9 +326,11 @@
         targets: targets,
       );
       expect(
-          records.where((LogRecord record) =>
-              record.message.contains('Linux 1 has already been scheduled for this pull request')),
-          hasLength(1));
+        records.where(
+          (LogRecord record) => record.message.contains('Linux 1 has already been scheduled for this pull request'),
+        ),
+        hasLength(1),
+      );
     });
 
     test('try to schedule builds already passed', () async {
@@ -345,9 +354,11 @@
         targets: targets,
       );
       expect(
-          records.where((LogRecord record) =>
-              record.message.contains('Linux 1 has already been scheduled for this pull request')),
-          hasLength(1));
+        records.where(
+          (LogRecord record) => record.message.contains('Linux 1 has already been scheduled for this pull request'),
+        ),
+        hasLength(1),
+      );
     });
     test('try to schedule builds already scheduled', () async {
       when(mockBuildBucketClient.batch(any)).thenAnswer((_) async {
@@ -385,19 +396,21 @@
         );
       });
       await expectLater(
-          service.scheduleTryBuilds(
-            pullRequest: pullRequest,
-            targets: <Target>[],
-          ),
-          throwsA(isA<InternalServerError>()));
+        service.scheduleTryBuilds(
+          pullRequest: pullRequest,
+          targets: <Target>[],
+        ),
+        throwsA(isA<InternalServerError>()),
+      );
     });
     test('Try to schedule build on a unsupported repo', () async {
       expect(
-          () async => await service.scheduleTryBuilds(
-                targets: targets,
-                pullRequest: generatePullRequest(repo: 'nonsupported'),
-              ),
-          throwsA(const TypeMatcher<BadRequestException>()));
+        () async => await service.scheduleTryBuilds(
+          targets: targets,
+          pullRequest: generatePullRequest(repo: 'nonsupported'),
+        ),
+        throwsA(const TypeMatcher<BadRequestException>()),
+      );
     });
   });
 
@@ -416,14 +429,19 @@
     test('schedule postsubmit builds successfully', () async {
       final Commit commit = generateCommit(0);
       when(mockBuildBucketClient.listBuilders(any)).thenAnswer((_) async {
-        return const ListBuildersResponse(builders: [
-          BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux 1')),
-        ]);
+        return const ListBuildersResponse(
+          builders: [
+            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux 1')),
+          ],
+        );
       });
       final Tuple<Target, Task, int> toBeScheduled = Tuple<Target, Task, int>(
-        generateTarget(1, properties: <String, String>{
-          'os': 'debian-10.12',
-        }),
+        generateTarget(
+          1,
+          properties: <String, String>{
+            'os': 'debian-10.12',
+          },
+        ),
         generateTask(1),
         LuciBuildService.kDefaultPriority,
       );
@@ -459,8 +477,10 @@
         'cipdVersion': 'refs/heads/master',
       });
       expect(scheduleBuild.dimensions, isNotEmpty);
-      expect(scheduleBuild.dimensions!.singleWhere((RequestedDimension dimension) => dimension.key == 'os').value,
-          'debian-10.12');
+      expect(
+        scheduleBuild.dimensions!.singleWhere((RequestedDimension dimension) => dimension.key == 'os').value,
+        'debian-10.12',
+      );
     });
 
     test('schedule postsubmit builds with correct userData for checkRuns', () async {
@@ -468,16 +488,20 @@
           .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 1'));
       final Commit commit = generateCommit(0, repo: 'packages');
       when(mockBuildBucketClient.listBuilders(any)).thenAnswer((_) async {
-        return const ListBuildersResponse(builders: [
-          BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux 1')),
-        ]);
+        return const ListBuildersResponse(
+          builders: [
+            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux 1')),
+          ],
+        );
       });
       final Tuple<Target, Task, int> toBeScheduled = Tuple<Target, Task, int>(
-        generateTarget(1,
-            properties: <String, String>{
-              'os': 'debian-10.12',
-            },
-            slug: RepositorySlug('flutter', 'packages')),
+        generateTarget(
+          1,
+          properties: <String, String>{
+            'os': 'debian-10.12',
+          },
+          slug: RepositorySlug('flutter', 'packages'),
+        ),
         generateTask(1),
         LuciBuildService.kDefaultPriority,
       );
@@ -512,21 +536,29 @@
     test('Skip non-existing builder', () async {
       final Commit commit = generateCommit(0);
       when(mockBuildBucketClient.listBuilders(any)).thenAnswer((_) async {
-        return const ListBuildersResponse(builders: [
-          BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux 2')),
-        ]);
+        return const ListBuildersResponse(
+          builders: [
+            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux 2')),
+          ],
+        );
       });
       final Tuple<Target, Task, int> toBeScheduled1 = Tuple<Target, Task, int>(
-        generateTarget(1, properties: <String, String>{
-          'os': 'debian-10.12',
-        }),
+        generateTarget(
+          1,
+          properties: <String, String>{
+            'os': 'debian-10.12',
+          },
+        ),
         generateTask(1),
         LuciBuildService.kDefaultPriority,
       );
       final Tuple<Target, Task, int> toBeScheduled2 = Tuple<Target, Task, int>(
-        generateTarget(2, properties: <String, String>{
-          'os': 'debian-10.12',
-        }),
+        generateTarget(
+          2,
+          properties: <String, String>{
+            'os': 'debian-10.12',
+          },
+        ),
         generateTask(1),
         LuciBuildService.kDefaultPriority,
       );
@@ -584,16 +616,19 @@
         );
       });
       await service.cancelBuilds(pullRequest, 'new builds');
-      expect(verify(mockBuildBucketClient.batch(captureAny)).captured[1].requests[0].cancelBuild.toJson(),
-          json.decode('{"id": "998", "summaryMarkdown": "new builds"}'));
+      expect(
+        verify(mockBuildBucketClient.batch(captureAny)).captured[1].requests[0].cancelBuild.toJson(),
+        json.decode('{"id": "998", "summaryMarkdown": "new builds"}'),
+      );
     });
     test('Cancel builds from unsuported repo', () async {
       expect(
-          () async => await service.cancelBuilds(
-                generatePullRequest(repo: 'notsupported'),
-                'new builds',
-              ),
-          throwsA(const TypeMatcher<BadRequestException>()));
+        () async => await service.cancelBuilds(
+          generatePullRequest(repo: 'notsupported'),
+          'new builds',
+        ),
+        throwsA(const TypeMatcher<BadRequestException>()),
+      );
     });
   });
 
@@ -649,12 +684,14 @@
         buildBucketClient: mockBuildBucketClient,
         pubsub: pubsub,
       );
-      final Map<String, dynamic> json = jsonDecode(buildPushMessageString(
-        'COMPLETED',
-        result: 'FAILURE',
-        builderName: 'Linux Host Engine',
-        userData: '{}',
-      )) as Map<String, dynamic>;
+      final Map<String, dynamic> json = jsonDecode(
+        buildPushMessageString(
+          'COMPLETED',
+          result: 'FAILURE',
+          builderName: 'Linux Host Engine',
+          userData: '{}',
+        ),
+      ) as Map<String, dynamic>;
       buildPushMessage = push_message.BuildPushMessage.fromJson(json);
     });
 
diff --git a/app_dart/test/service/scheduler/graph_test.dart b/app_dart/test/service/scheduler/graph_test.dart
index cb763e9..5190d9c 100644
--- a/app_dart/test/service/scheduler/graph_test.dart
+++ b/app_dart/test/service/scheduler/graph_test.dart
@@ -48,15 +48,18 @@
   - name: A
     scheduler: dashatar
       ''') as YamlMap?;
-      expect(() {
-        final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()
-          ..mergeFromProto3Json(targetWithNonexistentScheduler);
-        CiYaml(
-          slug: Config.flutterSlug,
-          branch: Config.defaultBranch(Config.flutterSlug),
-          config: unCheckedSchedulerConfig,
-        ).config;
-      }, throwsA(isA<FormatException>()));
+      expect(
+        () {
+          final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()
+            ..mergeFromProto3Json(targetWithNonexistentScheduler);
+          CiYaml(
+            slug: Config.flutterSlug,
+            branch: Config.defaultBranch(Config.flutterSlug),
+            config: unCheckedSchedulerConfig,
+          ).config;
+        },
+        throwsA(isA<FormatException>()),
+      );
     });
 
     test('constructs graph with dependency chain', () {
@@ -141,18 +144,19 @@
       ''') as YamlMap?;
       final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()..mergeFromProto3Json(configWithCycle);
       expect(
-          () => CiYaml(
-                slug: Config.flutterSlug,
-                branch: Config.defaultBranch(Config.flutterSlug),
-                config: unCheckedSchedulerConfig,
-              ).config,
-          throwsA(
-            isA<FormatException>().having(
-              (FormatException e) => e.toString(),
-              'message',
-              contains('ERROR: A depends on B which does not exist'),
-            ),
-          ));
+        () => CiYaml(
+          slug: Config.flutterSlug,
+          branch: Config.defaultBranch(Config.flutterSlug),
+          config: unCheckedSchedulerConfig,
+        ).config,
+        throwsA(
+          isA<FormatException>().having(
+            (FormatException e) => e.toString(),
+            'message',
+            contains('ERROR: A depends on B which does not exist'),
+          ),
+        ),
+      );
     });
 
     test('fails when there are duplicate targets', () {
@@ -166,18 +170,19 @@
       final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()
         ..mergeFromProto3Json(configWithDuplicateTargets);
       expect(
-          () => CiYaml(
-                slug: Config.flutterSlug,
-                branch: Config.defaultBranch(Config.flutterSlug),
-                config: unCheckedSchedulerConfig,
-              ).config,
-          throwsA(
-            isA<FormatException>().having(
-              (FormatException e) => e.toString(),
-              'message',
-              contains('ERROR: A already exists in graph'),
-            ),
-          ));
+        () => CiYaml(
+          slug: Config.flutterSlug,
+          branch: Config.defaultBranch(Config.flutterSlug),
+          config: unCheckedSchedulerConfig,
+        ).config,
+        throwsA(
+          isA<FormatException>().having(
+            (FormatException e) => e.toString(),
+            'message',
+            contains('ERROR: A already exists in graph'),
+          ),
+        ),
+      );
     });
 
     test('fails when there are multiple dependencies', () {
@@ -195,18 +200,19 @@
       final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()
         ..mergeFromProto3Json(configWithMultipleDependencies);
       expect(
-          () => CiYaml(
-                slug: Config.flutterSlug,
-                branch: Config.defaultBranch(Config.flutterSlug),
-                config: unCheckedSchedulerConfig,
-              ).config,
-          throwsA(
-            isA<FormatException>().having(
-              (FormatException e) => e.toString(),
-              'message',
-              contains('ERROR: C has multiple dependencies which is not supported. Use only one dependency'),
-            ),
-          ));
+        () => CiYaml(
+          slug: Config.flutterSlug,
+          branch: Config.defaultBranch(Config.flutterSlug),
+          config: unCheckedSchedulerConfig,
+        ).config,
+        throwsA(
+          isA<FormatException>().having(
+            (FormatException e) => e.toString(),
+            'message',
+            contains('ERROR: C has multiple dependencies which is not supported. Use only one dependency'),
+          ),
+        ),
+      );
     });
 
     test('fails when dependency does not exist', () {
@@ -220,18 +226,19 @@
       ''') as YamlMap?;
       final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()..mergeFromProto3Json(configWithMissingTarget);
       expect(
-          () => CiYaml(
-                slug: Config.flutterSlug,
-                branch: Config.defaultBranch(Config.flutterSlug),
-                config: unCheckedSchedulerConfig,
-              ).config,
-          throwsA(
-            isA<FormatException>().having(
-              (FormatException e) => e.toString(),
-              'message',
-              contains('ERROR: A depends on B which does not exist'),
-            ),
-          ));
+        () => CiYaml(
+          slug: Config.flutterSlug,
+          branch: Config.defaultBranch(Config.flutterSlug),
+          config: unCheckedSchedulerConfig,
+        ).config,
+        throwsA(
+          isA<FormatException>().having(
+            (FormatException e) => e.toString(),
+            'message',
+            contains('ERROR: A depends on B which does not exist'),
+          ),
+        ),
+      );
     });
   });
 
@@ -239,7 +246,7 @@
     late CiYaml? totConfig;
 
     setUp(() {
-      YamlMap? totYaml = loadYaml('''
+      final YamlMap? totYaml = loadYaml('''
 enabled_branches:
   - master
 targets:
@@ -262,13 +269,14 @@
       ''') as YamlMap?;
       final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()..mergeFromProto3Json(currentYaml);
       expect(
-          () => CiYaml(
-                slug: Config.flutterSlug,
-                branch: Config.defaultBranch(Config.flutterSlug),
-                config: unCheckedSchedulerConfig,
-                totConfig: totConfig,
-              ),
-          returnsNormally);
+        () => CiYaml(
+          slug: Config.flutterSlug,
+          branch: Config.defaultBranch(Config.flutterSlug),
+          config: unCheckedSchedulerConfig,
+          totConfig: totConfig,
+        ),
+        returnsNormally,
+      );
     });
 
     test('succeed when new builder is marked with bringup:true ', () {
@@ -282,13 +290,14 @@
       ''') as YamlMap?;
       final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()..mergeFromProto3Json(currentYaml);
       expect(
-          () => CiYaml(
-                slug: Config.flutterSlug,
-                branch: Config.defaultBranch(Config.flutterSlug),
-                config: unCheckedSchedulerConfig,
-                totConfig: totConfig,
-              ),
-          returnsNormally);
+        () => CiYaml(
+          slug: Config.flutterSlug,
+          branch: Config.defaultBranch(Config.flutterSlug),
+          config: unCheckedSchedulerConfig,
+          totConfig: totConfig,
+        ),
+        returnsNormally,
+      );
     });
 
     test('fails when new builder is missing bringup:true ', () {
@@ -301,19 +310,20 @@
       ''') as YamlMap?;
       final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()..mergeFromProto3Json(currentYaml);
       expect(
-          () => CiYaml(
-                slug: Config.flutterSlug,
-                branch: Config.defaultBranch(Config.flutterSlug),
-                config: unCheckedSchedulerConfig,
-                totConfig: totConfig,
-              ),
-          throwsA(
-            isA<FormatException>().having(
-              (FormatException e) => e.toString(),
-              'message',
-              contains('ERROR: B is a new builder added. it needs to be marked bringup: true'),
-            ),
-          ));
+        () => CiYaml(
+          slug: Config.flutterSlug,
+          branch: Config.defaultBranch(Config.flutterSlug),
+          config: unCheckedSchedulerConfig,
+          totConfig: totConfig,
+        ),
+        throwsA(
+          isA<FormatException>().having(
+            (FormatException e) => e.toString(),
+            'message',
+            contains('ERROR: B is a new builder added. it needs to be marked bringup: true'),
+          ),
+        ),
+      );
     });
 
     test('fails when new builder has bringup set to false ', () {
@@ -327,19 +337,20 @@
       ''') as YamlMap?;
       final SchedulerConfig unCheckedSchedulerConfig = SchedulerConfig()..mergeFromProto3Json(currentYaml);
       expect(
-          () => CiYaml(
-                slug: Config.flutterSlug,
-                branch: Config.defaultBranch(Config.flutterSlug),
-                config: unCheckedSchedulerConfig,
-                totConfig: totConfig,
-              ),
-          throwsA(
-            isA<FormatException>().having(
-              (FormatException e) => e.toString(),
-              'message',
-              contains('ERROR: B is a new builder added. it needs to be marked bringup: true'),
-            ),
-          ));
+        () => CiYaml(
+          slug: Config.flutterSlug,
+          branch: Config.defaultBranch(Config.flutterSlug),
+          config: unCheckedSchedulerConfig,
+          totConfig: totConfig,
+        ),
+        throwsA(
+          isA<FormatException>().having(
+            (FormatException e) => e.toString(),
+            'message',
+            contains('ERROR: B is a new builder added. it needs to be marked bringup: true'),
+          ),
+        ),
+      );
     });
   });
 }
diff --git a/app_dart/test/service/scheduler/policy_test.dart b/app_dart/test/service/scheduler/policy_test.dart
index 7181e4a..4cd169a 100644
--- a/app_dart/test/service/scheduler/policy_test.dart
+++ b/app_dart/test/service/scheduler/policy_test.dart
@@ -68,19 +68,25 @@
     test('triggers if less tasks than batch size', () async {
       db.addOnQuery<Task>((Iterable<Task> results) => allPending);
       expect(
-          await policy.triggerPriority(task: generateTask(4), datastore: datastore), LuciBuildService.kDefaultPriority);
+        await policy.triggerPriority(task: generateTask(4), datastore: datastore),
+        LuciBuildService.kDefaultPriority,
+      );
     });
 
     test('triggers after batch size', () async {
       db.addOnQuery<Task>((Iterable<Task> results) => latestAllPending);
       expect(
-          await policy.triggerPriority(task: generateTask(7), datastore: datastore), LuciBuildService.kDefaultPriority);
+        await policy.triggerPriority(task: generateTask(7), datastore: datastore),
+        LuciBuildService.kDefaultPriority,
+      );
     });
 
     test('triggers with higher priority on recent failures', () async {
       db.addOnQuery<Task>((Iterable<Task> results) => latestFailed);
       expect(
-          await policy.triggerPriority(task: generateTask(7), datastore: datastore), LuciBuildService.kRerunPriority);
+        await policy.triggerPriority(task: generateTask(7), datastore: datastore),
+        LuciBuildService.kRerunPriority,
+      );
     });
 
     test('does not trigger when a test was recently scheduled', () async {
@@ -118,13 +124,17 @@
     test('triggers every task', () async {
       db.addOnQuery<Task>((Iterable<Task> results) => pending);
       expect(
-          await policy.triggerPriority(task: generateTask(2), datastore: datastore), LuciBuildService.kDefaultPriority);
+        await policy.triggerPriority(task: generateTask(2), datastore: datastore),
+        LuciBuildService.kDefaultPriority,
+      );
     });
 
     test('triggers with higher priority on recent failure', () async {
       db.addOnQuery<Task>((Iterable<Task> results) => latestFailed);
       expect(
-          await policy.triggerPriority(task: generateTask(2), datastore: datastore), LuciBuildService.kRerunPriority);
+        await policy.triggerPriority(task: generateTask(2), datastore: datastore),
+        LuciBuildService.kRerunPriority,
+      );
     });
   });
 }
diff --git a/app_dart/test/service/scheduler_test.dart b/app_dart/test/service/scheduler_test.dart
index 2de0703..940eb63 100644
--- a/app_dart/test/service/scheduler_test.dart
+++ b/app_dart/test/service/scheduler_test.dart
@@ -145,17 +145,18 @@
         String repo = 'flutter',
       }) {
         return List<Commit>.generate(
-            shas.length,
-            (int index) => Commit(
-                  author: 'Username',
-                  authorAvatarUrl: 'http://example.org/avatar.jpg',
-                  branch: 'master',
-                  key: db.emptyKey.append(Commit, id: 'flutter/$repo/master/${shas[index]}'),
-                  message: 'commit message',
-                  repository: 'flutter/$repo',
-                  sha: shas[index],
-                  timestamp: DateTime.fromMillisecondsSinceEpoch(int.parse(shas[index])).millisecondsSinceEpoch,
-                ));
+          shas.length,
+          (int index) => Commit(
+            author: 'Username',
+            authorAvatarUrl: 'http://example.org/avatar.jpg',
+            branch: 'master',
+            key: db.emptyKey.append(Commit, id: 'flutter/$repo/master/${shas[index]}'),
+            message: 'commit message',
+            repository: 'flutter/$repo',
+            sha: shas[index],
+            timestamp: DateTime.fromMillisecondsSinceEpoch(int.parse(shas[index])).millisecondsSinceEpoch,
+          ),
+        );
       }
 
       test('succeeds when GitHub returns no commits', () async {
@@ -230,9 +231,12 @@
 
       test('schedules cocoon based targets', () async {
         final MockLuciBuildService luciBuildService = MockLuciBuildService();
-        when(luciBuildService.schedulePostsubmitBuilds(
-                commit: anyNamed('commit'), toBeScheduled: captureAnyNamed('toBeScheduled')))
-            .thenAnswer((_) => Future<void>.value());
+        when(
+          luciBuildService.schedulePostsubmitBuilds(
+            commit: anyNamed('commit'),
+            toBeScheduled: captureAnyNamed('toBeScheduled'),
+          ),
+        ).thenAnswer((_) => Future<void>.value());
         buildStatusService =
             FakeBuildStatusService(commitStatuses: <CommitStatus>[CommitStatus(generateCommit(1), const <Stage>[])]);
         scheduler = Scheduler(
@@ -246,9 +250,12 @@
         );
 
         await scheduler.addCommits(createCommitList(<String>['1']));
-        final List<dynamic> captured = verify(luciBuildService.schedulePostsubmitBuilds(
-                commit: anyNamed('commit'), toBeScheduled: captureAnyNamed('toBeScheduled')))
-            .captured;
+        final List<dynamic> captured = verify(
+          luciBuildService.schedulePostsubmitBuilds(
+            commit: anyNamed('commit'),
+            toBeScheduled: captureAnyNamed('toBeScheduled'),
+          ),
+        ).captured;
         final List<dynamic> toBeScheduled = captured.first as List<dynamic>;
         expect(toBeScheduled.length, 2);
         final Iterable<Tuple<Target, Task, int>> tuples =
@@ -270,10 +277,12 @@
           pubsub: pubsub,
         );
         when(mockBuildBucketClient.listBuilders(any)).thenAnswer((_) async {
-          return const ListBuildersResponse(builders: [
-            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux A')),
-            BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux runIf')),
-          ]);
+          return const ListBuildersResponse(
+            builders: [
+              BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux A')),
+              BuilderItem(id: BuilderId(bucket: 'prod', project: 'flutter', builder: 'Linux runIf')),
+            ],
+          );
         });
         buildStatusService =
             FakeBuildStatusService(commitStatuses: <CommitStatus>[CommitStatus(generateCommit(1), const <Stage>[])]);
@@ -379,13 +388,15 @@
 
     group('process check run', () {
       test('rerequested ci.yaml check retriggers presubmit', () async {
-        when(mockGithubChecksUtil.createCheckRun(
-          any,
-          any,
-          any,
-          any,
-          output: anyNamed('output'),
-        )).thenAnswer((_) async {
+        when(
+          mockGithubChecksUtil.createCheckRun(
+            any,
+            any,
+            any,
+            any,
+            output: anyNamed('output'),
+          ),
+        ).thenAnswer((_) async {
           return CheckRun.fromJson(const <String, dynamic>{
             'id': 1,
             'started_at': '2020-05-10T02:49:31Z',
@@ -397,13 +408,15 @@
         checkRunEventJson['check_run']['name'] = Scheduler.kCiYamlCheckName;
         final cocoon_checks.CheckRunEvent checkRunEvent = cocoon_checks.CheckRunEvent.fromJson(checkRunEventJson);
         expect(await scheduler.processCheckRun(checkRunEvent), true);
-        verify(mockGithubChecksUtil.createCheckRun(
-          any,
-          any,
-          any,
-          Scheduler.kCiYamlCheckName,
-          output: anyNamed('output'),
-        ));
+        verify(
+          mockGithubChecksUtil.createCheckRun(
+            any,
+            any,
+            any,
+            Scheduler.kCiYamlCheckName,
+            output: anyNamed('output'),
+          ),
+        );
         // Verfies Linux A was created
         verify(mockGithubChecksUtil.createCheckRun(any, any, any, any)).called(1);
       });
@@ -443,7 +456,8 @@
       test('gets only enabled .ci.yaml builds', () async {
         httpClient = MockClient((http.Request request) async {
           if (request.url.path.contains('.ci.yaml')) {
-            return http.Response('''
+            return http.Response(
+              '''
 enabled_branches:
   - master
 targets:
@@ -469,46 +483,58 @@
     enabled_branches:
       - master
     presubmit: true
-          ''', 200);
+          ''',
+              200,
+            );
           }
           throw Exception('Failed to find ${request.url.path}');
         });
         final List<Target> presubmitTargets = await scheduler.getPresubmitTargets(pullRequest);
-        expect(presubmitTargets.map((Target target) => target.value.name).toList(),
-            containsAll(<String>['Linux A', 'Linux C']));
+        expect(
+          presubmitTargets.map((Target target) => target.value.name).toList(),
+          containsAll(<String>['Linux A', 'Linux C']),
+        );
       });
 
       test('checks for release branches', () async {
         const String branch = 'flutter-1.24-candidate.1';
         httpClient = MockClient((http.Request request) async {
           if (request.url.path.contains('.ci.yaml')) {
-            return http.Response('''
+            return http.Response(
+              '''
 enabled_branches:
   - master
 targets:
   - name: Linux A
     presubmit: true
     scheduler: luci
-          ''', 200);
+          ''',
+              200,
+            );
           }
           throw Exception('Failed to find ${request.url.path}');
         });
-        expect(scheduler.getPresubmitTargets(generatePullRequest(branch: branch)),
-            throwsA(predicate((Exception e) => e.toString().contains('$branch is not enabled'))));
+        expect(
+          scheduler.getPresubmitTargets(generatePullRequest(branch: branch)),
+          throwsA(predicate((Exception e) => e.toString().contains('$branch is not enabled'))),
+        );
       });
 
       test('checks for release branch regex', () async {
         const String branch = 'flutter-1.24-candidate.1';
         httpClient = MockClient((http.Request request) async {
           if (request.url.path.contains('.ci.yaml')) {
-            return http.Response('''
+            return http.Response(
+              '''
 enabled_branches:
   - main
   - flutter-\\d+.\\d+-candidate.\\d+
 targets:
   - name: Linux A
     scheduler: luci
-          ''', 200);
+          ''',
+              200,
+            );
           }
           throw Exception('Failed to find ${request.url.path}');
         });
@@ -524,8 +550,9 @@
           <dynamic>[
             Scheduler.kCiYamlCheckName,
             const CheckRunOutput(
-                title: Scheduler.kCiYamlCheckName,
-                summary: 'If this check is stuck pending, push an empty commit to retrigger the checks'),
+              title: Scheduler.kCiYamlCheckName,
+              summary: 'If this check is stuck pending, push an empty commit to retrigger the checks',
+            ),
             'Linux A',
             null,
             // Linux runIf is not run as this is for tip of tree and the files weren't affected
@@ -564,8 +591,9 @@
           <dynamic>[
             Scheduler.kCiYamlCheckName,
             const CheckRunOutput(
-                title: Scheduler.kCiYamlCheckName,
-                summary: 'If this check is stuck pending, push an empty commit to retrigger the checks'),
+              title: Scheduler.kCiYamlCheckName,
+              summary: 'If this check is stuck pending, push an empty commit to retrigger the checks',
+            ),
             'Linux A',
             null,
             // runIf requires a diff in dev, so an error will cause it to be triggered
@@ -586,8 +614,9 @@
           <dynamic>[
             Scheduler.kCiYamlCheckName,
             const CheckRunOutput(
-                title: Scheduler.kCiYamlCheckName,
-                summary: 'If this check is stuck pending, push an empty commit to retrigger the checks'),
+              title: Scheduler.kCiYamlCheckName,
+              summary: 'If this check is stuck pending, push an empty commit to retrigger the checks',
+            ),
             'Linux A',
             null,
             'Linux runIf',
@@ -601,12 +630,18 @@
             .thenAnswer((Invocation invocation) async => createCheckRun(id: 0));
         await scheduler.triggerPresubmitTargets(pullRequest: pullRequest);
         expect(
-            verify(mockGithubChecksUtil.updateCheckRun(any, any, any,
-                    status: captureAnyNamed('status'),
-                    conclusion: captureAnyNamed('conclusion'),
-                    output: anyNamed('output')))
-                .captured,
-            <dynamic>[CheckRunStatus.completed, CheckRunConclusion.success]);
+          verify(
+            mockGithubChecksUtil.updateCheckRun(
+              any,
+              any,
+              any,
+              status: captureAnyNamed('status'),
+              conclusion: captureAnyNamed('conclusion'),
+              output: anyNamed('output'),
+            ),
+          ).captured,
+          <dynamic>[CheckRunStatus.completed, CheckRunConclusion.success],
+        );
       });
 
       test('ci.yaml validation fails with empty config', () async {
@@ -618,30 +653,43 @@
         });
         await scheduler.triggerPresubmitTargets(pullRequest: pullRequest);
         expect(
-            verify(mockGithubChecksUtil.updateCheckRun(any, any, any,
-                    status: captureAnyNamed('status'),
-                    conclusion: captureAnyNamed('conclusion'),
-                    output: anyNamed('output')))
-                .captured,
-            <dynamic>[CheckRunStatus.completed, CheckRunConclusion.failure]);
+          verify(
+            mockGithubChecksUtil.updateCheckRun(
+              any,
+              any,
+              any,
+              status: captureAnyNamed('status'),
+              conclusion: captureAnyNamed('conclusion'),
+              output: anyNamed('output'),
+            ),
+          ).captured,
+          <dynamic>[CheckRunStatus.completed, CheckRunConclusion.failure],
+        );
       });
 
       test('ci.yaml validation fails on not enabled branch', () async {
         final PullRequest pullRequest = generatePullRequest(branch: 'not-valid');
         await scheduler.triggerPresubmitTargets(pullRequest: pullRequest);
         expect(
-            verify(mockGithubChecksUtil.updateCheckRun(any, any, any,
-                    status: captureAnyNamed('status'),
-                    conclusion: captureAnyNamed('conclusion'),
-                    output: anyNamed('output')))
-                .captured,
-            <dynamic>[CheckRunStatus.completed, CheckRunConclusion.failure]);
+          verify(
+            mockGithubChecksUtil.updateCheckRun(
+              any,
+              any,
+              any,
+              status: captureAnyNamed('status'),
+              conclusion: captureAnyNamed('conclusion'),
+              output: anyNamed('output'),
+            ),
+          ).captured,
+          <dynamic>[CheckRunStatus.completed, CheckRunConclusion.failure],
+        );
       });
 
       test('ci.yaml validation fails with config with unknown dependencies', () async {
         httpClient = MockClient((http.Request request) async {
           if (request.url.path.contains('.ci.yaml')) {
-            return http.Response('''
+            return http.Response(
+              '''
 enabled_branches:
   - master
 targets:
@@ -649,18 +697,26 @@
     builder: Linux A
     dependencies:
       - B
-          ''', 200);
+          ''',
+              200,
+            );
           }
           throw Exception('Failed to find ${request.url.path}');
         });
         await scheduler.triggerPresubmitTargets(pullRequest: pullRequest);
         expect(
-            verify(mockGithubChecksUtil.updateCheckRun(any, any, any,
-                    status: anyNamed('status'), conclusion: anyNamed('conclusion'), output: captureAnyNamed('output')))
-                .captured
-                .first
-                .text,
-            'FormatException: ERROR: A depends on B which does not exist');
+          verify(
+            mockGithubChecksUtil.updateCheckRun(
+              any,
+              any,
+              any,
+              status: anyNamed('status'),
+              conclusion: anyNamed('conclusion'),
+              output: captureAnyNamed('output'),
+            ),
+          ).captured.first.text,
+          'FormatException: ERROR: A depends on B which does not exist',
+        );
       });
 
       test('retries only triggers failed builds only', () async {
@@ -683,21 +739,23 @@
             pubsub: pubsub,
           ),
         );
-        when(mockBuildbucket.batch(any)).thenAnswer((_) async => BatchResponse(
-              responses: <Response>[
-                Response(
-                  searchBuilds: SearchBuildsResponse(
-                    builds: <Build>[
-                      generateBuild(1000, name: 'Linux', bucket: 'try'),
-                      generateBuild(2000, name: 'Linux Coverage', bucket: 'try'),
-                      generateBuild(3000, name: 'Mac', bucket: 'try', status: Status.scheduled),
-                      generateBuild(4000, name: 'Windows', bucket: 'try', status: Status.started),
-                      generateBuild(5000, name: 'Linux A', bucket: 'try', status: Status.failure)
-                    ],
-                  ),
+        when(mockBuildbucket.batch(any)).thenAnswer(
+          (_) async => BatchResponse(
+            responses: <Response>[
+              Response(
+                searchBuilds: SearchBuildsResponse(
+                  builds: <Build>[
+                    generateBuild(1000, name: 'Linux', bucket: 'try'),
+                    generateBuild(2000, name: 'Linux Coverage', bucket: 'try'),
+                    generateBuild(3000, name: 'Mac', bucket: 'try', status: Status.scheduled),
+                    generateBuild(4000, name: 'Windows', bucket: 'try', status: Status.started),
+                    generateBuild(5000, name: 'Linux A', bucket: 'try', status: Status.failure)
+                  ],
                 ),
-              ],
-            ));
+              ),
+            ],
+          ),
+        );
         when(mockBuildbucket.scheduleBuild(any))
             .thenAnswer((_) async => generateBuild(5001, name: 'Linux A', bucket: 'try', status: Status.scheduled));
         // Only Linux A should be retried
diff --git a/app_dart/test/src/bigquery/fake_tabledata_resource.dart b/app_dart/test/src/bigquery/fake_tabledata_resource.dart
index bd89751..9b7581f 100644
--- a/app_dart/test/src/bigquery/fake_tabledata_resource.dart
+++ b/app_dart/test/src/bigquery/fake_tabledata_resource.dart
@@ -13,15 +13,27 @@
   List<TableDataInsertAllRequestRows>? rows;
   @override
   Future<TableDataInsertAllResponse> insertAll(
-      TableDataInsertAllRequest request, String projectId, String datasetId, String tableId,
-      {String? $fields}) async {
+    TableDataInsertAllRequest request,
+    String projectId,
+    String datasetId,
+    String tableId, {
+    String? $fields,
+  }) async {
     rows = request.rows;
     return TableDataInsertAllResponse.fromJson(<String, String>{});
   }
 
   @override
-  Future<TableDataList> list(String projectId, String datasetId, String tableId,
-      {int? maxResults, String? selectedFields, String? startIndex, String? pageToken, String? $fields}) async {
+  Future<TableDataList> list(
+    String projectId,
+    String datasetId,
+    String tableId, {
+    int? maxResults,
+    String? selectedFields,
+    String? startIndex,
+    String? pageToken,
+    String? $fields,
+  }) async {
     final List<Map<String, Object>> tableRowList = <Map<String, Object>>[];
     for (TableDataInsertAllRequestRows tableDataInsertAllRequestRows in rows!) {
       final dynamic value = tableDataInsertAllRequestRows.json;
diff --git a/app_dart/test/src/datastore/fake_config.dart b/app_dart/test/src/datastore/fake_config.dart
index 0400751..7233616 100644
--- a/app_dart/test/src/datastore/fake_config.dart
+++ b/app_dart/test/src/datastore/fake_config.dart
@@ -286,11 +286,13 @@
     if (supportedBranchesValue == null) {
       throw Exception('Test must set suportedBranchesValue to be able to use Config.getBranches');
     }
-    return supportedBranchesValue!.map((String branch) => Branch(
-          key: db.emptyKey.append<String>(
-            Branch,
-            id: '${slug.fullName}/$branch',
-          ),
-        ));
+    return supportedBranchesValue!.map(
+      (String branch) => Branch(
+        key: db.emptyKey.append<String>(
+          Branch,
+          id: '${slug.fullName}/$branch',
+        ),
+      ),
+    );
   }
 }
diff --git a/app_dart/test/src/request_handling/api_request_handler_tester.dart b/app_dart/test/src/request_handling/api_request_handler_tester.dart
index ed40fb0..9c8d657 100644
--- a/app_dart/test/src/request_handling/api_request_handler_tester.dart
+++ b/app_dart/test/src/request_handling/api_request_handler_tester.dart
@@ -27,12 +27,15 @@
   @protected
   Future<T> run<T extends Body>(Future<T> Function() callback) {
     return super.run<T>(() {
-      return runZoned<Future<T>>(() {
-        return callback();
-      }, zoneValues: <RequestKey<dynamic>, Object>{
-        ApiKey.authContext: context,
-        ApiKey.requestData: requestData,
-      });
+      return runZoned<Future<T>>(
+        () {
+          return callback();
+        },
+        zoneValues: <RequestKey<dynamic>, Object>{
+          ApiKey.authContext: context,
+          ApiKey.requestData: requestData,
+        },
+      );
     });
   }
 }
diff --git a/app_dart/test/src/request_handling/no_auth_request_handler_tester.dart b/app_dart/test/src/request_handling/no_auth_request_handler_tester.dart
index e161bea..167ca66 100644
--- a/app_dart/test/src/request_handling/no_auth_request_handler_tester.dart
+++ b/app_dart/test/src/request_handling/no_auth_request_handler_tester.dart
@@ -23,11 +23,14 @@
   @protected
   Future<T> run<T extends Body>(Future<T> Function() callback) {
     return super.run<T>(() {
-      return runZoned<Future<T>>(() {
-        return callback();
-      }, zoneValues: <RequestKey<dynamic>, Object>{
-        NoAuthKey.requestData: requestData,
-      });
+      return runZoned<Future<T>>(
+        () {
+          return callback();
+        },
+        zoneValues: <RequestKey<dynamic>, Object>{
+          NoAuthKey.requestData: requestData,
+        },
+      );
     });
   }
 }
diff --git a/app_dart/test/src/request_handling/request_handler_tester.dart b/app_dart/test/src/request_handling/request_handler_tester.dart
index 8588b71..956b2a4 100644
--- a/app_dart/test/src/request_handling/request_handler_tester.dart
+++ b/app_dart/test/src/request_handling/request_handler_tester.dart
@@ -41,12 +41,15 @@
 
   @protected
   Future<T> run<T extends Body>(Future<T> Function() callback) {
-    return runZoned<Future<T>>(() {
-      return callback();
-    }, zoneValues: <RequestKey<dynamic>, Object?>{
-      RequestKey.request: request,
-      RequestKey.response: response,
-      RequestKey.httpClient: httpClient,
-    });
+    return runZoned<Future<T>>(
+      () {
+        return callback();
+      },
+      zoneValues: <RequestKey<dynamic>, Object?>{
+        RequestKey.request: request,
+        RequestKey.response: response,
+        RequestKey.httpClient: httpClient,
+      },
+    );
   }
 }
diff --git a/app_dart/test/src/request_handling/subscription_tester.dart b/app_dart/test/src/request_handling/subscription_tester.dart
index eb6c3ab..d6cf64f 100644
--- a/app_dart/test/src/request_handling/subscription_tester.dart
+++ b/app_dart/test/src/request_handling/subscription_tester.dart
@@ -28,12 +28,15 @@
   @protected
   Future<T> run<T extends Body>(Future<T> Function() callback) {
     return super.run<T>(() {
-      return runZoned<Future<T>>(() {
-        return callback();
-      }, zoneValues: <RequestKey<dynamic>, Object>{
-        ApiKey.authContext: context,
-        PubSubKey.message: message,
-      });
+      return runZoned<Future<T>>(
+        () {
+          return callback();
+        },
+        zoneValues: <RequestKey<dynamic>, Object>{
+          ApiKey.authContext: context,
+          PubSubKey.message: message,
+        },
+      );
     });
   }
 }
diff --git a/app_dart/test/src/service/fake_build_status_provider.dart b/app_dart/test/src/service/fake_build_status_provider.dart
index 64e10e3..1bc7cab 100644
--- a/app_dart/test/src/service/fake_build_status_provider.dart
+++ b/app_dart/test/src/service/fake_build_status_provider.dart
@@ -35,11 +35,15 @@
     }
     commitStatuses!.sort((CommitStatus a, CommitStatus b) => a.commit.timestamp!.compareTo(b.commit.timestamp!));
 
-    return Stream<CommitStatus>.fromIterable(commitStatuses!.where((CommitStatus commitStatus) =>
-        ((commitStatus.commit.timestamp == null || timestamp == null)
-            ? true
-            : commitStatus.commit.timestamp! < timestamp) &&
-        commitStatus.commit.branch == branch));
+    return Stream<CommitStatus>.fromIterable(
+      commitStatuses!.where(
+        (CommitStatus commitStatus) =>
+            ((commitStatus.commit.timestamp == null || timestamp == null)
+                ? true
+                : commitStatus.commit.timestamp! < timestamp) &&
+            commitStatus.commit.branch == branch,
+      ),
+    );
   }
 
   @override
diff --git a/app_dart/test/src/service/fake_buildbucket.dart b/app_dart/test/src/service/fake_buildbucket.dart
index 30384ad..b5b4bad 100644
--- a/app_dart/test/src/service/fake_buildbucket.dart
+++ b/app_dart/test/src/service/fake_buildbucket.dart
@@ -105,7 +105,8 @@
                 project: 'flutter',
                 builder: 'builder_abc',
               ),
-              summaryMarkdown: request.summaryMarkdown);
+              summaryMarkdown: request.summaryMarkdown,
+            );
 
   @override
   Future<Build> getBuild(
@@ -127,20 +128,22 @@
   }) async =>
       (listBuildersResponse != null)
           ? await listBuildersResponse!
-          : const ListBuildersResponse(builders: <BuilderItem>[
-              BuilderItem(
-                id: BuilderId(
-                  bucket: 'prod',
-                  project: 'flutter',
-                  builder: 'Linux_android A',
+          : const ListBuildersResponse(
+              builders: <BuilderItem>[
+                BuilderItem(
+                  id: BuilderId(
+                    bucket: 'prod',
+                    project: 'flutter',
+                    builder: 'Linux_android A',
+                  ),
                 ),
-              ),
-              BuilderItem(
-                id: BuilderId(
-                  bucket: 'prod',
-                  project: 'flutter',
-                  builder: 'Linux_android B',
-                ),
-              )
-            ]);
+                BuilderItem(
+                  id: BuilderId(
+                    bucket: 'prod',
+                    project: 'flutter',
+                    builder: 'Linux_android B',
+                  ),
+                )
+              ],
+            );
 }
diff --git a/app_dart/test/src/service/fake_gerrit_service.dart b/app_dart/test/src/service/fake_gerrit_service.dart
index 8229161..23a82d9 100644
--- a/app_dart/test/src/service/fake_gerrit_service.dart
+++ b/app_dart/test/src/service/fake_gerrit_service.dart
@@ -16,8 +16,9 @@
     this.branchesValue = _defaultBranches,
     this.commitsValue,
   }) : super(
-            httpClient:
-                MockClient((_) => throw const InternalServerError('FakeGerritService tried to make an http request')));
+          httpClient:
+              MockClient((_) => throw const InternalServerError('FakeGerritService tried to make an http request')),
+        );
 
   List<String> branchesValue;
   static const List<String> _defaultBranches = <String>['main'];
diff --git a/app_dart/test/src/service/fake_graphql_client.dart b/app_dart/test/src/service/fake_graphql_client.dart
index 342e9f8..9e1f9b2 100644
--- a/app_dart/test/src/service/fake_graphql_client.dart
+++ b/app_dart/test/src/service/fake_graphql_client.dart
@@ -89,8 +89,11 @@
   }
 
   @override
-  Future<QueryResult<T>> fetchMore<T>(FetchMoreOptions fetchMoreOptions,
-      {required QueryOptions<T> originalOptions, required QueryResult<T> previousResult}) {
+  Future<QueryResult<T>> fetchMore<T>(
+    FetchMoreOptions fetchMoreOptions, {
+    required QueryOptions<T> originalOptions,
+    required QueryResult<T> previousResult,
+  }) {
     throw UnimplementedError();
   }
 
diff --git a/app_dart/test/src/service/fake_scheduler.dart b/app_dart/test/src/service/fake_scheduler.dart
index 30c6c63..45a9958 100644
--- a/app_dart/test/src/service/fake_scheduler.dart
+++ b/app_dart/test/src/service/fake_scheduler.dart
@@ -74,42 +74,48 @@
 CiYaml exampleConfig = CiYaml(
   slug: Config.flutterSlug,
   branch: Config.defaultBranch(Config.flutterSlug),
-  config: pb.SchedulerConfig(enabledBranches: <String>[
-    Config.defaultBranch(Config.flutterSlug),
-  ], targets: <pb.Target>[
-    pb.Target(
-      name: 'Linux A',
-      scheduler: pb.SchedulerSystem.luci,
-    ),
-    pb.Target(
-      name: 'Mac A',
-      scheduler: pb.SchedulerSystem.luci,
-    ),
-    pb.Target(
-      name: 'Windows A',
-      scheduler: pb.SchedulerSystem.luci,
-    ),
-    pb.Target(
-      bringup: false,
-      name: 'Google Internal Roll',
-      presubmit: false,
-      postsubmit: true,
-      scheduler: pb.SchedulerSystem.google_internal,
-    ),
-  ]),
+  config: pb.SchedulerConfig(
+    enabledBranches: <String>[
+      Config.defaultBranch(Config.flutterSlug),
+    ],
+    targets: <pb.Target>[
+      pb.Target(
+        name: 'Linux A',
+        scheduler: pb.SchedulerSystem.luci,
+      ),
+      pb.Target(
+        name: 'Mac A',
+        scheduler: pb.SchedulerSystem.luci,
+      ),
+      pb.Target(
+        name: 'Windows A',
+        scheduler: pb.SchedulerSystem.luci,
+      ),
+      pb.Target(
+        bringup: false,
+        name: 'Google Internal Roll',
+        presubmit: false,
+        postsubmit: true,
+        scheduler: pb.SchedulerSystem.google_internal,
+      ),
+    ],
+  ),
 );
 
 CiYaml batchPolicyConfig = CiYaml(
   slug: Config.flutterSlug,
   branch: Config.defaultBranch(Config.flutterSlug),
-  config: pb.SchedulerConfig(enabledBranches: <String>[
-    Config.defaultBranch(Config.flutterSlug),
-  ], targets: <pb.Target>[
-    pb.Target(
-      name: 'Linux_android A',
-    ),
-    pb.Target(
-      name: 'Linux_android B',
-    ),
-  ]),
+  config: pb.SchedulerConfig(
+    enabledBranches: <String>[
+      Config.defaultBranch(Config.flutterSlug),
+    ],
+    targets: <pb.Target>[
+      pb.Target(
+        name: 'Linux_android A',
+      ),
+      pb.Target(
+        name: 'Linux_android B',
+      ),
+    ],
+  ),
 );
diff --git a/app_dart/test/src/utilities/entity_generators.dart b/app_dart/test/src/utilities/entity_generators.dart
index aa465b1..07b74fd 100644
--- a/app_dart/test/src/utilities/entity_generators.dart
+++ b/app_dart/test/src/utilities/entity_generators.dart
@@ -209,12 +209,13 @@
     number: number,
     mergedAt: mergedAt,
     base: github.PullRequestHead(
-        ref: branch,
-        repo: github.Repository(
-          fullName: 'flutter/$repo',
-          name: repo,
-          owner: github.UserInformation('flutter', 1, '', ''),
-        )),
+      ref: branch,
+      repo: github.Repository(
+        fullName: 'flutter/$repo',
+        name: repo,
+        owner: github.UserInformation('flutter', 1, '', ''),
+      ),
+    ),
     head: github.PullRequestHead(
       ref: branch,
       sha: sha,
diff --git a/app_dart/test/src/utilities/mocks.mocks.dart b/app_dart/test/src/utilities/mocks.mocks.dart
index e6cd2f1..273de43 100644
--- a/app_dart/test/src/utilities/mocks.mocks.dart
+++ b/app_dart/test/src/utilities/mocks.mocks.dart
@@ -5231,6 +5231,8 @@
     _i10.RepositorySlug? slug,
     int? number, {
     String? message,
+    _i10.MergeMethod? mergeMethod = _i10.MergeMethod.merge,
+    String? requestSha,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -5239,7 +5241,11 @@
             slug,
             number,
           ],
-          {#message: message},
+          {
+            #message: message,
+            #mergeMethod: mergeMethod,
+            #requestSha: requestSha,
+          },
         ),
         returnValue: _i17.Future<_i10.PullRequestMerge>.value(_FakePullRequestMerge_53(
           this,
@@ -5249,7 +5255,11 @@
               slug,
               number,
             ],
-            {#message: message},
+            {
+              #message: message,
+              #mergeMethod: mergeMethod,
+              #requestSha: requestSha,
+            },
           ),
         )),
       ) as _i17.Future<_i10.PullRequestMerge>);
diff --git a/app_dart/test/src/utilities/push_message.dart b/app_dart/test/src/utilities/push_message.dart
index 8bc384e..a267a44 100644
--- a/app_dart/test/src/utilities/push_message.dart
+++ b/app_dart/test/src/utilities/push_message.dart
@@ -63,15 +63,19 @@
   String? failureReason,
   String? userData,
 }) =>
-    base64.encode(utf8.encode(buildPushMessageString(
-      status,
-      result: result,
-      builderName: builderName,
-      urlParam: urlParam,
-      retries: retries,
-      failureReason: failureReason,
-      userData: userData,
-    )));
+    base64.encode(
+      utf8.encode(
+        buildPushMessageString(
+          status,
+          result: result,
+          builderName: builderName,
+          urlParam: urlParam,
+          retries: retries,
+          failureReason: failureReason,
+          userData: userData,
+        ),
+      ),
+    );
 
 String buildPushMessageJsonNoBuildset(
   String status, {
@@ -81,14 +85,18 @@
   int retries = 0,
   String? failureReason,
 }) =>
-    base64.encode(utf8.encode(buildPushMessageNoBuildsetString(
-      status,
-      result: result,
-      builderName: builderName,
-      urlParam: urlParam,
-      retries: retries,
-      failureReason: failureReason,
-    )));
+    base64.encode(
+      utf8.encode(
+        buildPushMessageNoBuildsetString(
+          status,
+          result: result,
+          builderName: builderName,
+          urlParam: urlParam,
+          retries: retries,
+          failureReason: failureReason,
+        ),
+      ),
+    );
 
 String buildPushMessageString(
   String status, {
@@ -142,12 +150,14 @@
 }''';
 }
 
-String buildPushMessageNoBuildsetString(String status,
-    {String? result,
-    String builderName = 'Linux Coverage',
-    String urlParam = '',
-    int retries = 0,
-    String? failureReason}) {
+String buildPushMessageNoBuildsetString(
+  String status, {
+  String? result,
+  String builderName = 'Linux Coverage',
+  String urlParam = '',
+  int retries = 0,
+  String? failureReason,
+}) {
   return '''{
   "build": {
     "bucket": "luci.flutter.prod",
diff --git a/app_dart/test/src/utilities/webhook_generators.dart b/app_dart/test/src/utilities/webhook_generators.dart
index 67f6429..a6f05cd 100644
--- a/app_dart/test/src/utilities/webhook_generators.dart
+++ b/app_dart/test/src/utilities/webhook_generators.dart
@@ -894,7 +894,8 @@
 }
 
 CreateEvent generateCreateBranchEvent(String branchName, String repository, {bool forked = false}) =>
-    CreateEvent.fromJson(jsonDecode('''
+    CreateEvent.fromJson(
+      jsonDecode('''
 {
   "ref": "$branchName",
   "ref_type": "branch",
@@ -1015,4 +1016,5 @@
     "type": "User",
     "site_admin": false
   }
-}''') as Map<String, dynamic>);
+}''') as Map<String, dynamic>,
+    );
diff --git a/auto_submit/analysis_options.yaml b/auto_submit/analysis_options.yaml
index 8801fbf..a200ec8 100644
--- a/auto_submit/analysis_options.yaml
+++ b/auto_submit/analysis_options.yaml
@@ -6,7 +6,4 @@
 
 linter:
   rules:
-    constant_identifier_names: false # we have all capitalized enums in check_for_waiting_pull_requests_test.dart
-    require_trailing_commas: true
-    unawaited_futures: true
-    prefer_final_fields: true
\ No newline at end of file
+    constant_identifier_names: false # we have all capitalized enums in check_for_waiting_pull_requests_test.dart
\ No newline at end of file
diff --git a/auto_submit/lib/request_handling/pubsub.dart b/auto_submit/lib/request_handling/pubsub.dart
index c448784..91367c2 100644
--- a/auto_submit/lib/request_handling/pubsub.dart
+++ b/auto_submit/lib/request_handling/pubsub.dart
@@ -49,7 +49,7 @@
       ],
     );
     final pubsub.PubsubApi pubsubApi = pubsub.PubsubApi(httpClient);
-    pubsub.PullRequest pullRequest = pubsub.PullRequest(maxMessages: maxMessages);
+    final pubsub.PullRequest pullRequest = pubsub.PullRequest(maxMessages: maxMessages);
     final pubsub.PullResponse pullResponse = await pubsubApi.projects.subscriptions
         .pull(pullRequest, 'projects/flutter-dashboard/subscriptions/$subscription');
     return pullResponse;
diff --git a/auto_submit/lib/requests/check_pull_request.dart b/auto_submit/lib/requests/check_pull_request.dart
index 2f882cd..8d126fd 100644
--- a/auto_submit/lib/requests/check_pull_request.dart
+++ b/auto_submit/lib/requests/check_pull_request.dart
@@ -44,7 +44,7 @@
       return Response.ok('No messages are pulled.');
     }
     log.info('Processing ${messageList.length} messages');
-    ValidationService validationService = ValidationService(config);
+    final ValidationService validationService = ValidationService(config);
     final List<Future<void>> futures = <Future<void>>[];
 
     for (pub.ReceivedMessage message in messageList) {
diff --git a/auto_submit/lib/requests/update_revert_issues.dart b/auto_submit/lib/requests/update_revert_issues.dart
index b311392..93f3ae8 100644
--- a/auto_submit/lib/requests/update_revert_issues.dart
+++ b/auto_submit/lib/requests/update_revert_issues.dart
@@ -56,7 +56,7 @@
     log.info('Processing review issue# ${revertRequestRecord.reviewIssueNumber}.');
     try {
       // Get the revert review issue.
-      Issue issue = await githubService.getIssue(
+      final Issue issue = await githubService.getIssue(
         slug: RepositorySlug(Config.flutter, Config.flutter),
         issueNumber: revertRequestRecord.reviewIssueNumber!,
       );
diff --git a/auto_submit/lib/service/approver_service.dart b/auto_submit/lib/service/approver_service.dart
index fec68c4..f8feeb7 100644
--- a/auto_submit/lib/service/approver_service.dart
+++ b/auto_submit/lib/service/approver_service.dart
@@ -62,7 +62,7 @@
     final gh.RepositorySlug slug = pullRequest.base!.repo!.slug();
     final gh.GitHub botClient = await config.createFlutterGitHubBotClient(slug);
 
-    Stream<gh.PullRequestReview> reviews = botClient.pullRequests.listReviews(slug, pullRequest.number!);
+    final Stream<gh.PullRequestReview> reviews = botClient.pullRequests.listReviews(slug, pullRequest.number!);
     await for (gh.PullRequestReview review in reviews) {
       if (review.user.login == 'fluttergithubbot' && review.state == 'APPROVED') {
         // Already approved.
diff --git a/auto_submit/lib/service/bigquery.dart b/auto_submit/lib/service/bigquery.dart
index 795caaa..133a3fe 100644
--- a/auto_submit/lib/service/bigquery.dart
+++ b/auto_submit/lib/service/bigquery.dart
@@ -357,7 +357,7 @@
       return <RevertRequestRecord>[];
     }
 
-    List<RevertRequestRecord> openReviewRequestIssues = [];
+    final List<RevertRequestRecord> openReviewRequestIssues = [];
     for (TableRow tableRow in tableRows) {
       openReviewRequestIssues.add(
         RevertRequestRecord(
diff --git a/auto_submit/lib/service/config.dart b/auto_submit/lib/service/config.dart
index 4806d3e..977c535 100644
--- a/auto_submit/lib/service/config.dart
+++ b/auto_submit/lib/service/config.dart
@@ -64,7 +64,7 @@
   }
 
   Future<GitHub> createGithubClient(RepositorySlug slug) async {
-    String token = await generateGithubToken(slug);
+    final String token = await generateGithubToken(slug);
     return GitHub(auth: Authentication.withToken(token));
   }
 
@@ -161,7 +161,7 @@
 
   Future<String> _generateGithubJwt() async {
     final String rawKey = await secretManager.get(kGithubKey);
-    StringBuffer sb = StringBuffer();
+    final StringBuffer sb = StringBuffer();
     sb.writeln(rawKey.substring(0, 32));
     sb.writeln(rawKey.substring(32, rawKey.length - 30).replaceAll(' ', '  \n'));
     sb.writeln(rawKey.substring(rawKey.length - 30, rawKey.length));
@@ -224,7 +224,7 @@
   }
 
   Future<Uint8List> _getValueFromSecretManager(String key) async {
-    String value = await secretManager.get(key);
+    final String value = await secretManager.get(key);
     return Uint8List.fromList(value.codeUnits);
   }
 }
diff --git a/auto_submit/lib/service/github_service.dart b/auto_submit/lib/service/github_service.dart
index 3eb16bb..471313c 100644
--- a/auto_submit/lib/service/github_service.dart
+++ b/auto_submit/lib/service/github_service.dart
@@ -55,7 +55,7 @@
       return listPullRequestFiles;
     }
 
-    Stream<PullRequestFile> pullRequestFiles = github.pullRequests.listFiles(slug, pullRequestId);
+    final Stream<PullRequestFile> pullRequestFiles = github.pullRequests.listFiles(slug, pullRequestId);
 
     await for (PullRequestFile file in pullRequestFiles) {
       listPullRequestFiles.add(file);
@@ -74,7 +74,7 @@
     List<String>? assignees,
     String? state,
   }) async {
-    IssueRequest issueRequest = IssueRequest(
+    final IssueRequest issueRequest = IssueRequest(
       title: title,
       body: body,
       labels: labels,
diff --git a/auto_submit/lib/service/validation_service.dart b/auto_submit/lib/service/validation_service.dart
index 42cee94..b4b68b3 100644
--- a/auto_submit/lib/service/validation_service.dart
+++ b/auto_submit/lib/service/validation_service.dart
@@ -140,7 +140,7 @@
     required String ackId,
     required PubSub pubsub,
   }) async {
-    List<ValidationResult> results = <ValidationResult>[];
+    final List<ValidationResult> results = <ValidationResult>[];
 
     /// Runs all the validation defined in the service.
     for (Validation validation in validations) {
@@ -397,7 +397,7 @@
     log.info('Updated pull request info: ${currentPullRequest.toString()}');
 
     // add a record for the pull request into our metrics tracking
-    PullRequestRecord pullRequestRecord = PullRequestRecord(
+    final PullRequestRecord pullRequestRecord = PullRequestRecord(
       organization: currentPullRequest.base!.repo!.slug().owner,
       repository: currentPullRequest.base!.repo!.slug().name,
       author: currentPullRequest.user!.login,
@@ -411,7 +411,7 @@
     log.info('Created pull request record: ${pullRequestRecord.toString()}');
 
     try {
-      BigqueryService bigqueryService = await config.createBigQueryService();
+      final BigqueryService bigqueryService = await config.createBigQueryService();
       await bigqueryService.insertPullRequestRecord(
         projectId: Config.flutterGcpProjectId,
         pullRequestRecord: pullRequestRecord,
@@ -432,12 +432,12 @@
     // Get the updated revert issue.
     final github.PullRequest currentPullRequest = await gitHubService.getPullRequest(slug, revertPullRequest.number!);
     // Get the original pull request issue.
-    String originalPullRequestLink = revertValidation!.extractLinkFromText(revertPullRequest.body)!;
-    int originalPullRequestNumber = int.parse(originalPullRequestLink.split('#').elementAt(1));
+    final String originalPullRequestLink = revertValidation!.extractLinkFromText(revertPullRequest.body)!;
+    final int originalPullRequestNumber = int.parse(originalPullRequestLink.split('#').elementAt(1));
     // return int.parse(linkSplit.elementAt(1));
     final github.PullRequest originalPullRequest = await gitHubService.getPullRequest(slug, originalPullRequestNumber);
 
-    RevertRequestRecord revertRequestRecord = RevertRequestRecord(
+    final RevertRequestRecord revertRequestRecord = RevertRequestRecord(
       organization: currentPullRequest.base!.repo!.slug().owner,
       repository: currentPullRequest.base!.repo!.slug().name,
       author: currentPullRequest.user!.login,
@@ -456,7 +456,7 @@
     );
 
     try {
-      BigqueryService bigqueryService = await config.createBigQueryService();
+      final BigqueryService bigqueryService = await config.createBigQueryService();
       await bigqueryService.insertRevertRequestRecord(
         projectId: Config.flutterGcpProjectId,
         revertRequestRecord: revertRequestRecord,
diff --git a/auto_submit/lib/validations/approval.dart b/auto_submit/lib/validations/approval.dart
index 77eeea6..fb06260 100644
--- a/auto_submit/lib/validations/approval.dart
+++ b/auto_submit/lib/validations/approval.dart
@@ -23,14 +23,14 @@
     final String authorAssociation = pullRequest.authorAssociation!;
     final String? author = pullRequest.author!.login;
     final List<ReviewNode> reviews = pullRequest.reviews!.nodes!;
-    bool approved = config.rollerAccounts.contains(author) ||
+    final bool approved = config.rollerAccounts.contains(author) ||
         _checkApproval(
           author,
           authorAssociation,
           reviews,
         );
 
-    String message = '- Please get at least one approved review if you are already '
+    const String message = '- Please get at least one approved review if you are already '
         'a member or two member reviews if you are not a member before re-applying this '
         'label. __Reviewers__: If you left a comment approving, please use '
         'the "approve" review action instead.';
diff --git a/auto_submit/lib/validations/change_requested.dart b/auto_submit/lib/validations/change_requested.dart
index cd675c1..1ce4982 100644
--- a/auto_submit/lib/validations/change_requested.dart
+++ b/auto_submit/lib/validations/change_requested.dart
@@ -52,7 +52,7 @@
     }
     final bool approved = (approvers.length > 1) && changeRequestAuthors.isEmpty;
     log.info('PR approved $approved, approvers: $approvers, change request authors: $changeRequestAuthors');
-    bool changesRequested = (approvers.length > 1) && changeRequestAuthors.isEmpty;
+    final bool changesRequested = (approvers.length > 1) && changeRequestAuthors.isEmpty;
 
     final StringBuffer buffer = StringBuffer();
     for (String? author in changeRequestAuthors) {
diff --git a/auto_submit/lib/validations/ci_successful.dart b/auto_submit/lib/validations/ci_successful.dart
index 61b21d9..4f78ad5 100644
--- a/auto_submit/lib/validations/ci_successful.dart
+++ b/auto_submit/lib/validations/ci_successful.dart
@@ -28,12 +28,12 @@
   /// Implements the CI build/tests validations.
   Future<ValidationResult> validate(QueryResult result, github.PullRequest messagePullRequest) async {
     bool allSuccess = true;
-    github.RepositorySlug slug = messagePullRequest.base!.repo!.slug();
+    final github.RepositorySlug slug = messagePullRequest.base!.repo!.slug();
     final PullRequest pullRequest = result.repository!.pullRequest!;
-    Set<FailureDetail> failures = <FailureDetail>{};
+    final Set<FailureDetail> failures = <FailureDetail>{};
 
-    List<ContextNode> statuses = <ContextNode>[];
-    Commit commit = pullRequest.commits!.nodes!.single.commit!;
+    final List<ContextNode> statuses = <ContextNode>[];
+    final Commit commit = pullRequest.commits!.nodes!.single.commit!;
 
     // Recently most of the repositories have migrated away of using the status
     // APIs and for those repos commit.status is null.
@@ -60,7 +60,7 @@
     final GithubService gitHubService = await config.createGithubService(slug);
     final String? sha = commit.oid;
 
-    List<github.CheckRun> checkRuns = <github.CheckRun>[];
+    final List<github.CheckRun> checkRuns = <github.CheckRun>[];
     if (messagePullRequest.head != null && sha != null) {
       checkRuns.addAll(await gitHubService.getCheckRuns(slug, sha));
     }
@@ -79,7 +79,8 @@
             'issues identified (or deflake) before re-applying this label.');
       }
     }
-    Action action = labelNames.contains(config.overrideTreeStatusLabel) ? Action.IGNORE_FAILURE : Action.REMOVE_LABEL;
+    final Action action =
+        labelNames.contains(config.overrideTreeStatusLabel) ? Action.IGNORE_FAILURE : Action.REMOVE_LABEL;
     return ValidationResult(allSuccess, action, buffer.toString());
   }
 
diff --git a/auto_submit/lib/validations/conflicting.dart b/auto_submit/lib/validations/conflicting.dart
index 77989b0..7d74e6d 100644
--- a/auto_submit/lib/validations/conflicting.dart
+++ b/auto_submit/lib/validations/conflicting.dart
@@ -17,8 +17,8 @@
   /// Implements the logic to validate if the PR is in a conflicting state.
   Future<ValidationResult> validate(QueryResult result, github.PullRequest messagePullRequest) async {
     // This is used to remove the bot label as it requires manual intervention.
-    bool result = !(messagePullRequest.mergeable == false);
-    String message = '- This commit is not mergeable and has conflicts. Please'
+    final bool result = !(messagePullRequest.mergeable == false);
+    const String message = '- This commit is not mergeable and has conflicts. Please'
         ' rebase your PR and fix all the conflicts.';
     return ValidationResult(result, Action.REMOVE_LABEL, message);
   }
diff --git a/auto_submit/lib/validations/empty_checks.dart b/auto_submit/lib/validations/empty_checks.dart
index 33e2819..819d207 100644
--- a/auto_submit/lib/validations/empty_checks.dart
+++ b/auto_submit/lib/validations/empty_checks.dart
@@ -18,13 +18,13 @@
 
   /// Implements the validation to verify the list of checks is not empty.
   Future<ValidationResult> validate(QueryResult result, github.PullRequest messagePullRequest) async {
-    github.RepositorySlug slug = messagePullRequest.base!.repo!.slug();
+    final github.RepositorySlug slug = messagePullRequest.base!.repo!.slug();
     final GithubService gitHubService = await config.createGithubService(slug);
     final PullRequest pullRequest = result.repository!.pullRequest!;
-    Commit commit = pullRequest.commits!.nodes!.single.commit!;
+    final Commit commit = pullRequest.commits!.nodes!.single.commit!;
     final String? sha = commit.oid;
-    List<github.CheckRun> checkRuns = await gitHubService.getCheckRuns(slug, sha!);
-    String message = '- This commit has no checks. Please check that ci.yaml validation has started'
+    final List<github.CheckRun> checkRuns = await gitHubService.getCheckRuns(slug, sha!);
+    const String message = '- This commit has no checks. Please check that ci.yaml validation has started'
         ' and there are multiple checks. If not, try uploading an empty commit.';
     return ValidationResult(checkRuns.isNotEmpty, Action.REMOVE_LABEL, message);
   }
diff --git a/auto_submit/lib/validations/revert.dart b/auto_submit/lib/validations/revert.dart
index 0677221..8ebab91 100644
--- a/auto_submit/lib/validations/revert.dart
+++ b/auto_submit/lib/validations/revert.dart
@@ -28,35 +28,35 @@
     final String authorAssociation = pullRequest.authorAssociation!;
     final String? author = pullRequest.author!.login;
     final auto.Commit commit = pullRequest.commits!.nodes!.single.commit!;
-    String? sha = commit.oid;
+    final String? sha = commit.oid;
 
     if (!isValidAuthor(author, authorAssociation)) {
-      String message = 'The author $author does not have permissions to make this request.';
+      final String message = 'The author $author does not have permissions to make this request.';
       log.info(message);
       return ValidationResult(false, Action.REMOVE_LABEL, message);
     }
 
-    bool? canMerge = messagePullRequest.mergeable;
+    final bool? canMerge = messagePullRequest.mergeable;
     if (canMerge == null || !canMerge) {
-      String message =
+      const String message =
           'This pull request cannot be merged due to conflicts. Please resolve conflicts and re-add the revert label.';
       log.info(message);
       return ValidationResult(false, Action.REMOVE_LABEL, message);
     }
 
-    String? pullRequestBody = messagePullRequest.body;
-    String? revertLink = extractLinkFromText(pullRequestBody);
+    final String? pullRequestBody = messagePullRequest.body;
+    final String? revertLink = extractLinkFromText(pullRequestBody);
     if (revertLink == null) {
-      String message =
+      const String message =
           'A reverts link could not be found or was formatted incorrectly. Format is \'Reverts owner/repo#id\'';
       log.info(message);
       return ValidationResult(false, Action.REMOVE_LABEL, message);
     }
 
-    github.RepositorySlug repositorySlug = _getSlugFromLink(revertLink);
-    GithubService githubService = await config.createGithubService(repositorySlug);
+    final github.RepositorySlug repositorySlug = _getSlugFromLink(revertLink);
+    final GithubService githubService = await config.createGithubService(repositorySlug);
 
-    bool requiredChecksCompleted = await waitForRequiredChecks(
+    final bool requiredChecksCompleted = await waitForRequiredChecks(
       githubService: githubService,
       slug: repositorySlug,
       sha: sha!,
@@ -71,10 +71,11 @@
       );
     }
 
-    int pullRequestId = _getPullRequestNumberFromLink(revertLink);
-    github.PullRequest requestToRevert = await githubService.getPullRequest(repositorySlug, pullRequestId);
+    final int pullRequestId = _getPullRequestNumberFromLink(revertLink);
+    final github.PullRequest requestToRevert = await githubService.getPullRequest(repositorySlug, pullRequestId);
 
-    bool requestsMatch = await githubService.comparePullRequests(repositorySlug, requestToRevert, messagePullRequest);
+    final bool requestsMatch =
+        await githubService.comparePullRequests(repositorySlug, requestToRevert, messagePullRequest);
 
     if (requestsMatch) {
       return ValidationResult(
@@ -103,7 +104,7 @@
       return null;
     }
     final RegExp regExp = RegExp(r'[Rr]everts[\s]+([-\.a-zA-Z_]+/[-\.a-zA-Z_]+#[0-9]+)', multiLine: true);
-    Iterable<RegExpMatch> matches = regExp.allMatches(bodyText);
+    final Iterable<RegExpMatch> matches = regExp.allMatches(bodyText);
 
     if (matches.isNotEmpty && matches.length == 1) {
       return matches.elementAt(0).group(1);
@@ -116,15 +117,15 @@
   /// Split a reverts link on the '#' then the '/' to get the parts of the repo
   /// slug. It is assumed that the link has the format flutter/repo#id.
   github.RepositorySlug _getSlugFromLink(String link) {
-    List<String> linkSplit = link.split('#');
-    List<String> slugSplit = linkSplit.elementAt(0).split('/');
+    final List<String> linkSplit = link.split('#');
+    final List<String> slugSplit = linkSplit.elementAt(0).split('/');
     return github.RepositorySlug(slugSplit.elementAt(0), slugSplit.elementAt(1));
   }
 
   /// Split a reverts link on the '#' to get the id part of the link.
   /// It is assumed that the link has the format flutter/repo#id.
   int _getPullRequestNumberFromLink(String link) {
-    List<String> linkSplit = link.split('#');
+    final List<String> linkSplit = link.split('#');
     return int.parse(linkSplit.elementAt(1));
   }
 
@@ -136,7 +137,7 @@
     required String sha,
     required List<String> checkNames,
   }) async {
-    List<github.CheckRun> targetCheckRuns = [];
+    final List<github.CheckRun> targetCheckRuns = [];
     for (var element in checkNames) {
       targetCheckRuns.addAll(
         await githubService.getCheckRunsFiltered(
@@ -180,7 +181,7 @@
   GithubService githubService,
   github.CheckRun targetCheckRun,
 ) async {
-  List<github.CheckRun> checkRuns = await githubService.getCheckRunsFiltered(
+  final List<github.CheckRun> checkRuns = await githubService.getCheckRunsFiltered(
     slug: slug,
     ref: targetCheckRun.headSha!,
     checkName: targetCheckRun.name,
diff --git a/auto_submit/test/model/auto_submit_query_result_test.dart b/auto_submit/test/model/auto_submit_query_result_test.dart
index c5cc118..abc4527 100644
--- a/auto_submit/test/model/auto_submit_query_result_test.dart
+++ b/auto_submit/test/model/auto_submit_query_result_test.dart
@@ -16,12 +16,12 @@
     });
 
     test('repository values', () async {
-      Repository repository = queryResult.repository!;
+      final Repository repository = queryResult.repository!;
       expect(repository.pullRequest, isNotNull);
     });
 
     test('pullRequest values', () async {
-      PullRequest pullRequest = queryResult.repository!.pullRequest!;
+      final PullRequest pullRequest = queryResult.repository!.pullRequest!;
       expect(pullRequest.author, isNotNull);
       expect(pullRequest.authorAssociation, 'MEMBER');
       expect(pullRequest.commits, isNotNull);
@@ -31,7 +31,7 @@
     });
 
     test('Author values', () async {
-      Author author = queryResult.repository!.pullRequest!.author!;
+      final Author author = queryResult.repository!.pullRequest!.author!;
       expect(author.login, 'author1');
     });
 
@@ -48,7 +48,7 @@
     test('Commits values', () async {
       final Commits commits = queryResult.repository!.pullRequest!.commits!;
       expect(commits.nodes, isNotNull);
-      CommitNode commitNode = commits.nodes!.first;
+      final CommitNode commitNode = commits.nodes!.first;
       expect(commitNode.commit, isNotNull);
       expect(commitNode.commit!.abbreviatedOid, '4009ecc');
       expect(commitNode.commit!.oid, '4009ecc0b6dbf5cb19cb97472147063e7368ec10');
diff --git a/auto_submit/test/model/pull_request_change_type.dart b/auto_submit/test/model/pull_request_change_type.dart
index 1545501..f611a28 100644
--- a/auto_submit/test/model/pull_request_change_type.dart
+++ b/auto_submit/test/model/pull_request_change_type.dart
@@ -6,7 +6,7 @@
 import 'package:test/test.dart';
 
 void main() {
-  List<String> expectedNames = ['change', 'revert'];
+  final List<String> expectedNames = ['change', 'revert'];
 
   test('Expected string value for enum is returned.', () {
     for (PullRequestChangeType prChangeType in PullRequestChangeType.values) {
diff --git a/auto_submit/test/request_handling/authentication_test.dart b/auto_submit/test/request_handling/authentication_test.dart
index 7e53caa..93cbbd5 100644
--- a/auto_submit/test/request_handling/authentication_test.dart
+++ b/auto_submit/test/request_handling/authentication_test.dart
@@ -22,7 +22,7 @@
     });
 
     test('succeeds for App Engine cronjobs', () async {
-      Map<String, String> header = {'X-Appengine-Cron': 'true'};
+      final Map<String, String> header = {'X-Appengine-Cron': 'true'};
       request = Request('POST', Uri.parse('http://localhost/'), headers: header);
       final bool result = await auth.authenticate(request);
       expect(result, true);
diff --git a/auto_submit/test/requests/check_pull_request_test.dart b/auto_submit/test/requests/check_pull_request_test.dart
index c4826c6..f21f959 100644
--- a/auto_submit/test/requests/check_pull_request_test.dart
+++ b/auto_submit/test/requests/check_pull_request_test.dart
@@ -242,7 +242,7 @@
         ),
       );
 
-      Map<int, RepositorySlug> expectedMergeRequestMap = {};
+      final Map<int, RepositorySlug> expectedMergeRequestMap = {};
       expectedMergeRequestMap[0] = RepositorySlug('flutter', 'flutter');
       expectedMergeRequestMap[1] = RepositorySlug('flutter', cocoonRepo);
 
diff --git a/auto_submit/test/requests/github_webhook_test.dart b/auto_submit/test/requests/github_webhook_test.dart
index 061520a..f686a4e 100644
--- a/auto_submit/test/requests/github_webhook_test.dart
+++ b/auto_submit/test/requests/github_webhook_test.dart
@@ -44,7 +44,7 @@
       final Response response = await githubWebhook.post(req);
       final String resBody = await response.readAsString();
       final reqBody = json.decode(resBody) as Map<String, dynamic>;
-      List<IssueLabel> labels = PullRequest.fromJson(reqBody['pull_request'] as Map<String, dynamic>).labels!;
+      final List<IssueLabel> labels = PullRequest.fromJson(reqBody['pull_request'] as Map<String, dynamic>).labels!;
       expect(labels[0].name, 'cla: yes');
       expect(labels[1].name, 'autosubmit');
     });
diff --git a/auto_submit/test/requests/update_revert_issues_test.dart b/auto_submit/test/requests/update_revert_issues_test.dart
index baf0196..da026f7 100644
--- a/auto_submit/test/requests/update_revert_issues_test.dart
+++ b/auto_submit/test/requests/update_revert_issues_test.dart
@@ -61,15 +61,15 @@
 
   group('Update issue tests.', () {
     test('Open issue is not updated.', () async {
-      User user = User(login: 'ricardoamador');
-      Issue issue = Issue(
+      final User user = User(login: 'ricardoamador');
+      final Issue issue = Issue(
         user: user,
         state: 'open',
       );
 
       fakeGithubService.githubIssueMock = issue;
 
-      RevertRequestRecord revertRequestRecord = RevertRequestRecord(
+      final RevertRequestRecord revertRequestRecord = RevertRequestRecord(
         reviewIssueAssignee: 'keyonghan',
         reviewIssueCreatedTimestamp: DateTime.now(),
         reviewIssueNumber: 1234,
@@ -81,7 +81,7 @@
         );
       });
 
-      bool result = await updateRevertReviews.updateIssue(
+      final bool result = await updateRevertReviews.updateIssue(
         revertRequestRecord: revertRequestRecord,
         bigqueryService: fakeBigqueryService,
         githubService: fakeGithubService,
@@ -91,8 +91,8 @@
     });
 
     test('Closed issue is updated.', () async {
-      User user = User(login: 'ricardoamador');
-      Issue issue = Issue(
+      final User user = User(login: 'ricardoamador');
+      final Issue issue = Issue(
         user: user,
         state: 'closed',
         closedAt: DateTime.now(),
@@ -102,7 +102,7 @@
 
       fakeGithubService.githubIssueMock = issue;
 
-      RevertRequestRecord revertRequestRecord = RevertRequestRecord(
+      final RevertRequestRecord revertRequestRecord = RevertRequestRecord(
         reviewIssueAssignee: 'keyonghan',
         reviewIssueCreatedTimestamp: DateTime.now(),
         reviewIssueNumber: 1234,
@@ -114,7 +114,7 @@
         );
       });
 
-      bool result = await updateRevertReviews.updateIssue(
+      final bool result = await updateRevertReviews.updateIssue(
         revertRequestRecord: revertRequestRecord,
         bigqueryService: fakeBigqueryService,
         githubService: fakeGithubService,
@@ -124,8 +124,8 @@
     });
 
     test('Closed issue is not updated on exception.', () async {
-      User user = User(login: 'ricardoamador');
-      Issue issue = Issue(
+      final User user = User(login: 'ricardoamador');
+      final Issue issue = Issue(
         user: user,
         state: 'closed',
         closedAt: DateTime.now(),
@@ -135,7 +135,7 @@
 
       fakeGithubService.githubIssueMock = issue;
 
-      RevertRequestRecord revertRequestRecord = RevertRequestRecord(
+      final RevertRequestRecord revertRequestRecord = RevertRequestRecord(
         reviewIssueAssignee: 'keyonghan',
         reviewIssueCreatedTimestamp: DateTime.now(),
         reviewIssueNumber: 1234,
@@ -145,7 +145,7 @@
         throw BigQueryException('Update of review issue 1234 did not complete.');
       });
 
-      bool result = await updateRevertReviews.updateIssue(
+      final bool result = await updateRevertReviews.updateIssue(
         revertRequestRecord: revertRequestRecord,
         bigqueryService: fakeBigqueryService,
         githubService: fakeGithubService,
@@ -163,9 +163,9 @@
         );
       });
 
-      Response response = await updateRevertReviews.get();
+      final Response response = await updateRevertReviews.get();
       expect(response.statusCode, 200);
-      String body = await response.readAsString(Encoding.getByName("UTF-8"));
+      final String body = await response.readAsString(Encoding.getByName("UTF-8"));
       expect(body, equals('No open revert reviews to update.'));
     });
   });
diff --git a/auto_submit/test/service/bigquery_test.dart b/auto_submit/test/service/bigquery_test.dart
index cda9ba3..1dc880b 100644
--- a/auto_submit/test/service/bigquery_test.dart
+++ b/auto_submit/test/service/bigquery_test.dart
@@ -201,7 +201,7 @@
       );
     });
 
-    PullRequestRecord pullRequestRecord = PullRequestRecord(
+    final PullRequestRecord pullRequestRecord = PullRequestRecord(
       prCreatedTimestamp: DateTime.fromMillisecondsSinceEpoch(123456789),
       prLandedTimestamp: DateTime.fromMillisecondsSinceEpoch(234567890),
       organization: 'flutter',
@@ -232,7 +232,7 @@
     });
 
     bool hasError = false;
-    PullRequestRecord pullRequestRecord = PullRequestRecord(
+    final PullRequestRecord pullRequestRecord = PullRequestRecord(
       prCreatedTimestamp: DateTime.fromMillisecondsSinceEpoch(123456789),
       prLandedTimestamp: DateTime.fromMillisecondsSinceEpoch(234567890),
       organization: 'flutter',
@@ -263,7 +263,7 @@
     });
 
     bool hasError = false;
-    PullRequestRecord pullRequestRecord = PullRequestRecord(
+    final PullRequestRecord pullRequestRecord = PullRequestRecord(
       prCreatedTimestamp: DateTime.fromMillisecondsSinceEpoch(123456789),
       prLandedTimestamp: DateTime.fromMillisecondsSinceEpoch(234567890),
       organization: 'flutter',
@@ -293,7 +293,7 @@
       );
     });
 
-    PullRequestRecord pullRequestRecord = await service.selectPullRequestRecordByPrNumber(
+    final PullRequestRecord pullRequestRecord = await service.selectPullRequestRecordByPrNumber(
       projectId: expectedProjectId,
       prNumber: 345,
       repository: 'cocoon',
@@ -454,7 +454,7 @@
       );
     });
 
-    RevertRequestRecord revertRequestRecord = RevertRequestRecord(
+    final RevertRequestRecord revertRequestRecord = RevertRequestRecord(
       organization: 'flutter',
       repository: 'cocoon',
       author: 'ricardoamador',
@@ -492,7 +492,7 @@
     });
 
     bool hasError = false;
-    RevertRequestRecord revertRequestRecord = RevertRequestRecord(
+    final RevertRequestRecord revertRequestRecord = RevertRequestRecord(
       organization: 'flutter',
       repository: 'cocoon',
       author: 'ricardoamador',
@@ -529,7 +529,7 @@
       );
     });
 
-    RevertRequestRecord revertRequestRecord = await service.selectRevertRequestByRevertPrNumber(
+    final RevertRequestRecord revertRequestRecord = await service.selectRevertRequestByRevertPrNumber(
       projectId: expectedProjectId,
       prNumber: 2048,
       repository: 'cocoon',
@@ -703,11 +703,12 @@
       );
     });
 
-    List<RevertRequestRecord> revertRequestRecordReviewsList = await service.selectOpenReviewRequestIssueRecordsList(
+    final List<RevertRequestRecord> revertRequestRecordReviewsList =
+        await service.selectOpenReviewRequestIssueRecordsList(
       projectId: expectedProjectId,
     );
 
-    RevertRequestRecord keyongRecord = RevertRequestRecord(
+    final RevertRequestRecord keyongRecord = RevertRequestRecord(
       reviewIssueAssignee: 'Keyonghan',
       reviewIssueNumber: 2048,
       reviewIssueCreatedTimestamp: DateTime.fromMillisecondsSinceEpoch(234567890),
@@ -715,7 +716,7 @@
       reviewIssueClosedBy: '',
     );
 
-    RevertRequestRecord caseyRecord = RevertRequestRecord(
+    final RevertRequestRecord caseyRecord = RevertRequestRecord(
       reviewIssueAssignee: 'caseyhillers',
       reviewIssueNumber: 2049,
       reviewIssueCreatedTimestamp: DateTime.fromMillisecondsSinceEpoch(234567890),
@@ -748,7 +749,8 @@
       );
     });
 
-    List<RevertRequestRecord> revertRequestRecordReviewsList = await service.selectOpenReviewRequestIssueRecordsList(
+    final List<RevertRequestRecord> revertRequestRecordReviewsList =
+        await service.selectOpenReviewRequestIssueRecordsList(
       projectId: expectedProjectId,
     );
 
diff --git a/auto_submit/test/service/config_test.dart b/auto_submit/test/service/config_test.dart
index fe91e7a..ac38022 100644
--- a/auto_submit/test/service/config_test.dart
+++ b/auto_submit/test/service/config_test.dart
@@ -52,7 +52,7 @@
     test('generateGithubToken pulls from cache', () async {
       const String configValue = 'githubToken';
       final Uint8List cachedValue = Uint8List.fromList(configValue.codeUnits);
-      Cache cache = Cache<dynamic>(cacheProvider).withPrefix('config');
+      final Cache cache = Cache<dynamic>(cacheProvider).withPrefix('config');
       await cache['githubToken-${flutterSlug.owner}'].set(
         cachedValue,
         const Duration(minutes: 1),
@@ -67,7 +67,7 @@
       final Uint8List flutterValue = Uint8List.fromList(flutterToken.codeUnits);
       const String testToken = 'testToken';
       final Uint8List testValue = Uint8List.fromList(testToken.codeUnits);
-      Cache cache = Cache<dynamic>(cacheProvider).withPrefix('config');
+      final Cache cache = Cache<dynamic>(cacheProvider).withPrefix('config');
       await cache['githubToken-${flutterSlug.owner}'].set(
         flutterValue,
         const Duration(minutes: 1),
@@ -77,8 +77,8 @@
         const Duration(minutes: 1),
       );
 
-      GitHub flutterClient = await config.createGithubClient(flutterSlug);
-      GitHub testClient = await config.createGithubClient(testSlug);
+      final GitHub flutterClient = await config.createGithubClient(flutterSlug);
+      final GitHub testClient = await config.createGithubClient(testSlug);
       expect(flutterClient.auth!.token!, flutterToken);
       expect(testClient.auth!.token!, testToken);
     });
diff --git a/auto_submit/test/service/github_service_test.dart b/auto_submit/test/service/github_service_test.dart
index 484b04b..6bfd46b 100644
--- a/auto_submit/test/service/github_service_test.dart
+++ b/auto_submit/test/service/github_service_test.dart
@@ -60,14 +60,14 @@
 
   test('Merges branch', () async {
     when(mockGitHubComparison.behindBy).thenReturn(10);
-    PullRequest pullRequest = generatePullRequest();
+    final PullRequest pullRequest = generatePullRequest();
     await githubService.autoMergeBranch(pullRequest);
     verify(mockResponse.statusCode).called(1);
   });
 
   test('Does not merge branch', () async {
     when(mockGitHubComparison.behindBy).thenReturn(9);
-    PullRequest pullRequest = generatePullRequest();
+    final PullRequest pullRequest = generatePullRequest();
     await githubService.autoMergeBranch(pullRequest);
     verifyNever(mockResponse.statusCode);
   });
diff --git a/auto_submit/test/service/validation_service_test.dart b/auto_submit/test/service/validation_service_test.dart
index 6c5ba14..3525826 100644
--- a/auto_submit/test/service/validation_service_test.dart
+++ b/auto_submit/test/service/validation_service_test.dart
@@ -154,7 +154,7 @@
       githubService.pullRequestMock = pullRequest;
 
       unawaited(pubsub.publish('auto-submit-queue-sub', pullRequest));
-      auto.QueryResult queryResult = createQueryResult(flutterRequest);
+      final auto.QueryResult queryResult = createQueryResult(flutterRequest);
 
       await validationService.processRevertRequest(
         config: config,
diff --git a/auto_submit/test/src/request_handling/fake_pubsub.dart b/auto_submit/test/src/request_handling/fake_pubsub.dart
index a89b198..75d5a4c 100644
--- a/auto_submit/test/src/request_handling/fake_pubsub.dart
+++ b/auto_submit/test/src/request_handling/fake_pubsub.dart
@@ -27,7 +27,7 @@
   @override
   Future<PullResponse> pull(String subscription, int maxMessages) async {
     // The list will be empty if there are no more messages available in the backlog.
-    List<ReceivedMessage> receivedMessages = <ReceivedMessage>[];
+    final List<ReceivedMessage> receivedMessages = <ReceivedMessage>[];
     iteration++;
     if (messagesQueue.isNotEmpty) {
       int i = iteration * messageSize;
diff --git a/auto_submit/test/src/service/fake_github_service.dart b/auto_submit/test/src/service/fake_github_service.dart
index e7e8e2d..0895ee5 100644
--- a/auto_submit/test/src/service/fake_github_service.dart
+++ b/auto_submit/test/src/service/fake_github_service.dart
@@ -105,7 +105,7 @@
   ) async {
     final rawBody = json.decode(checkRunsMock!) as Map<String, dynamic>;
     final List<dynamic> checkRunsBody = rawBody["check_runs"]! as List<dynamic>;
-    List<CheckRun> checkRuns = <CheckRun>[];
+    final List<CheckRun> checkRuns = <CheckRun>[];
     if ((checkRunsBody[0] as Map<String, dynamic>).isNotEmpty) {
       checkRuns.addAll(
         checkRunsBody.map((dynamic checkRun) => CheckRun.fromJson(checkRun as Map<String, dynamic>)).toList(),
@@ -122,9 +122,9 @@
     CheckRunStatus? status,
     CheckRunFilter? filter,
   }) async {
-    List<CheckRun> checkRuns = await getCheckRuns(slug, ref);
+    final List<CheckRun> checkRuns = await getCheckRuns(slug, ref);
     if (checkName != null) {
-      List<CheckRun> checkRunsFilteredByName = [];
+      final List<CheckRun> checkRunsFilteredByName = [];
       for (CheckRun checkRun in checkRuns) {
         if (checkRun.name == checkName) {
           checkRunsFilteredByName.add(checkRun);
@@ -200,12 +200,12 @@
       pullRequestData = pullRequestFilesJsonMock as String;
     }
 
-    List<PullRequestFile> pullRequestFileList = [];
+    final List<PullRequestFile> pullRequestFileList = [];
 
-    dynamic parsedList = jsonDecode(pullRequestData);
+    final dynamic parsedList = jsonDecode(pullRequestData);
 
     for (dynamic d in parsedList) {
-      PullRequestFile file = PullRequestFile.fromJson(d as Map<String, dynamic>);
+      final PullRequestFile file = PullRequestFile.fromJson(d as Map<String, dynamic>);
       pullRequestFileList.add(file);
     }
 
@@ -234,8 +234,8 @@
       return compareReturnValue;
     }
 
-    List<PullRequestFile> revertPullRequestFiles = await getPullRequestFiles(repositorySlug, revert);
-    List<PullRequestFile> currentPullRequestFiles = await getPullRequestFiles(repositorySlug, current);
+    final List<PullRequestFile> revertPullRequestFiles = await getPullRequestFiles(repositorySlug, revert);
+    final List<PullRequestFile> currentPullRequestFiles = await getPullRequestFiles(repositorySlug, current);
 
     return validateFileSetsAreEqual(revertPullRequestFiles, currentPullRequestFiles);
   }
@@ -268,7 +268,7 @@
     // At this point all the files are the same so we can iterate over one list to
     // compare changes.
     for (PullRequestFile pullRequestFile in changeList1) {
-      PullRequestFile pullRequestFileChangeList2 =
+      final PullRequestFile pullRequestFileChangeList2 =
           changeList2.firstWhere((element) => element.filename == pullRequestFile.filename);
       if (pullRequestFile.changesCount != pullRequestFileChangeList2.changesCount ||
           pullRequestFile.additionsCount != pullRequestFileChangeList2.deletionsCount ||
diff --git a/auto_submit/test/validations/ci_successful_test.dart b/auto_submit/test/validations/ci_successful_test.dart
index 68c472f..44fde06 100644
--- a/auto_submit/test/validations/ci_successful_test.dart
+++ b/auto_submit/test/validations/ci_successful_test.dart
@@ -24,16 +24,16 @@
   late FakeConfig config;
   FakeGithubService githubService = FakeGithubService();
   late FakeGraphQLClient githubGraphQLClient;
-  MockGitHub gitHub = MockGitHub();
+  final MockGitHub gitHub = MockGitHub();
   late github.RepositorySlug slug;
   late Set<FailureDetail> failures;
 
   List<ContextNode> getContextNodeListFromJson(final String repositoryStatuses) {
-    List<ContextNode> contextNodeList = [];
+    final List<ContextNode> contextNodeList = [];
 
-    Map<String, dynamic> contextNodeMap = jsonDecode(repositoryStatuses) as Map<String, dynamic>;
+    final Map<String, dynamic> contextNodeMap = jsonDecode(repositoryStatuses) as Map<String, dynamic>;
 
-    dynamic statuses = contextNodeMap['statuses'];
+    final dynamic statuses = contextNodeMap['statuses'];
     for (Map<String, dynamic> map in statuses) {
       contextNodeList.add(ContextNode.fromJson(map));
     }
@@ -60,7 +60,7 @@
     test('ValidateCheckRuns no failures for skipped conclusion.', () {
       githubService.checkRunsData = skippedCheckRunsMock;
       final Future<List<github.CheckRun>> checkRunFuture = githubService.getCheckRuns(slug, 'ref');
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       checkRunFuture.then((checkRuns) {
         expect(ciSuccessful.validateCheckRuns(slug, checkRuns, failures, allSuccess), isTrue);
@@ -71,7 +71,7 @@
     test('ValidateCheckRuns no failures for successful conclusion.', () {
       githubService.checkRunsData = checkRunsMock;
       final Future<List<github.CheckRun>> checkRunFuture = githubService.getCheckRuns(slug, 'ref');
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       checkRunFuture.then((checkRuns) {
         expect(ciSuccessful.validateCheckRuns(slug, checkRuns, failures, allSuccess), isTrue);
@@ -82,7 +82,7 @@
     test('ValidateCheckRuns no failure for status completed and neutral conclusion.', () {
       githubService.checkRunsData = neutralCheckRunsMock;
       final Future<List<github.CheckRun>> checkRunFuture = githubService.getCheckRuns(slug, 'ref');
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       checkRunFuture.then((checkRuns) {
         expect(ciSuccessful.validateCheckRuns(slug, checkRuns, failures, allSuccess), isTrue);
@@ -93,7 +93,7 @@
     test('ValidateCheckRuns failure detected on status completed no neutral conclusion.', () {
       githubService.checkRunsData = failedCheckRunsMock;
       final Future<List<github.CheckRun>> checkRunFuture = githubService.getCheckRuns(slug, 'ref');
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       checkRunFuture.then((checkRuns) {
         expect(ciSuccessful.validateCheckRuns(slug, checkRuns, failures, allSuccess), isFalse);
@@ -105,7 +105,7 @@
     test('ValidateCheckRuns succes with multiple successful check runs.', () {
       githubService.checkRunsData = multipleCheckRunsMock;
       final Future<List<github.CheckRun>> checkRunFuture = githubService.getCheckRuns(slug, 'ref');
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       checkRunFuture.then((checkRuns) {
         expect(ciSuccessful.validateCheckRuns(slug, checkRuns, failures, allSuccess), isTrue);
@@ -116,7 +116,7 @@
     test('ValidateCheckRuns failed with multiple check runs.', () {
       githubService.checkRunsData = multipleCheckRunsWithFailureMock;
       final Future<List<github.CheckRun>> checkRunFuture = githubService.getCheckRuns(slug, 'ref');
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       checkRunFuture.then((checkRuns) {
         expect(ciSuccessful.validateCheckRuns(slug, checkRuns, failures, allSuccess), isFalse);
@@ -130,7 +130,7 @@
       /// does not cause failure is a candidate to be temporarily ignored.
       githubService.checkRunsData = inprogressAndNotFailedCheckRunMock;
       final Future<List<github.CheckRun>> checkRunFuture = githubService.getCheckRuns(slug, 'ref');
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       checkRunFuture.then((checkRuns) {
         expect(ciSuccessful.validateCheckRuns(slug, checkRuns, failures, allSuccess), isFalse);
@@ -141,7 +141,7 @@
     test('ValidateCheckRuns allSuccess false is preserved.', () {
       githubService.checkRunsData = multipleCheckRunsWithFailureMock;
       final Future<List<github.CheckRun>> checkRunFuture = githubService.getCheckRuns(slug, 'ref');
-      bool allSuccess = false;
+      const bool allSuccess = false;
 
       checkRunFuture.then((checkRuns) {
         expect(ciSuccessful.validateCheckRuns(slug, checkRuns, failures, allSuccess), isFalse);
@@ -154,7 +154,7 @@
   group('validateStatuses', () {
     test('Validate successful statuses show as successful.', () {
       final List<ContextNode> contextNodeList = getContextNodeListFromJson(repositoryStatusesMock);
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       /// The status must be uppercase as the original code is expecting this.
       convertContextNodeStatuses(contextNodeList);
@@ -164,7 +164,7 @@
 
     test('Validate statuses that are not successful but do not cause failure.', () {
       final List<ContextNode> contextNodeList = getContextNodeListFromJson(failedAuthorsStatusesMock);
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       final List<String> labelNames = [];
       labelNames.add('warning: land on red to fix tree breakage');
@@ -177,7 +177,7 @@
 
     test('Validate failure statuses do not cause failure with not in authors control.', () {
       final List<ContextNode> contextNodeList = getContextNodeListFromJson(failedAuthorsStatusesMock);
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       final List<String> labelNames = [];
       labelNames.add('Compelling label');
@@ -190,7 +190,7 @@
 
     test('Validate failure statuses cause failures with not in authors control.', () {
       final List<ContextNode> contextNodeList = getContextNodeListFromJson(failedNonAuthorsStatusesMock);
-      bool allSuccess = true;
+      const bool allSuccess = true;
 
       final List<String> labelNames = [];
       labelNames.add('Compelling label');
@@ -204,7 +204,7 @@
 
     test('Validate failure statuses cause failures and preserves false allSuccess.', () {
       final List<ContextNode> contextNodeList = getContextNodeListFromJson(failedNonAuthorsStatusesMock);
-      bool allSuccess = false;
+      const bool allSuccess = false;
 
       final List<String> labelNames = [];
       labelNames.add('Compelling label');
@@ -225,7 +225,7 @@
 
       /// The status must be uppercase as the original code is expecting this.
       convertContextNodeStatuses(contextNodeList);
-      bool treeStatusFlag = ciSuccessful.treeStatusCheck(slug, contextNodeList);
+      final bool treeStatusFlag = ciSuccessful.treeStatusCheck(slug, contextNodeList);
       expect(treeStatusFlag, true);
     });
 
@@ -236,7 +236,7 @@
 
       /// The status must be uppercase as the original code is expecting this.
       convertContextNodeStatuses(contextNodeList);
-      bool treeStatusFlag = ciSuccessful.treeStatusCheck(slug, contextNodeList);
+      final bool treeStatusFlag = ciSuccessful.treeStatusCheck(slug, contextNodeList);
       expect(treeStatusFlag, true);
     });
 
@@ -246,7 +246,7 @@
 
       /// The status must be uppercase as the original code is expecting this.
       convertContextNodeStatuses(contextNodeList);
-      bool treeStatusFlag = ciSuccessful.treeStatusCheck(slug, contextNodeList);
+      final bool treeStatusFlag = ciSuccessful.treeStatusCheck(slug, contextNodeList);
       expect(treeStatusFlag, false);
     });
   });
@@ -373,7 +373,7 @@
     });
 
     test('returns correct message when validation fails', () async {
-      PullRequestHelper flutterRequest = PullRequestHelper(
+      final PullRequestHelper flutterRequest = PullRequestHelper(
         prNumber: 0,
         lastCommitHash: oid,
         reviews: <PullRequestReviewHelper>[],
@@ -381,7 +381,7 @@
 
       githubService.checkRunsData = failedCheckRunsMock;
       final github.PullRequest pullRequest = generatePullRequest(prNumber: 0, repoName: slug.name);
-      QueryResult queryResult = createQueryResult(flutterRequest);
+      final QueryResult queryResult = createQueryResult(flutterRequest);
 
       final ValidationResult validationResult = await ciSuccessful.validate(queryResult, pullRequest);
 
diff --git a/auto_submit/test/validations/revert_test.dart b/auto_submit/test/validations/revert_test.dart
index 9e72a3b..31e07ee 100644
--- a/auto_submit/test/validations/revert_test.dart
+++ b/auto_submit/test/validations/revert_test.dart
@@ -23,7 +23,7 @@
   late FakeConfig config;
   late FakeGithubService githubService;
   late FakeGraphQLClient githubGraphQLClient;
-  MockGitHub gitHub = MockGitHub();
+  final MockGitHub gitHub = MockGitHub();
   late Revert revert;
 
   /// Setup objects needed across test groups.
@@ -39,24 +39,24 @@
 
   group('Author validation tests.', () {
     test('Validate author association member is valid.', () {
-      String authorAssociation = 'MEMBER';
+      const String authorAssociation = 'MEMBER';
       assert(revert.isValidAuthor('octocat', authorAssociation));
     });
 
     test('Validate author association owner is valid.', () {
-      String authorAssociation = 'OWNER';
+      const String authorAssociation = 'OWNER';
       assert(revert.isValidAuthor('octocat', authorAssociation));
     });
 
     test('Validate author dependabot is valid.', () {
-      String author = 'dependabot';
-      String authorAssociation = 'NON_MEMBER';
+      const String author = 'dependabot';
+      const String authorAssociation = 'NON_MEMBER';
       assert(revert.isValidAuthor(author, authorAssociation));
     });
 
     test('Validate autoroller account is valid.', () {
-      String author = 'engine-flutter-autoroll';
-      String authorAssociation = 'CONTRIBUTOR';
+      const String author = 'engine-flutter-autoroll';
+      const String authorAssociation = 'CONTRIBUTOR';
       assert(revert.isValidAuthor(author, authorAssociation));
     });
   });
@@ -64,7 +64,7 @@
   group('Pattern matching for revert text link', () {
     test('Link extraction from description is successful.', () {
       // input, expected
-      Map<String, String> tests = <String, String>{};
+      final Map<String, String> tests = <String, String>{};
       tests['Reverts flutter/cocoon#123456'] = 'flutter/cocoon#123456';
       tests['Reverts    flutter/cocoon#123456'] = 'flutter/cocoon#123456';
       tests['Reverts flutter/flutter-intellij#123456'] = 'flutter/flutter-intellij#123456';
@@ -87,14 +87,14 @@
       tests['This some text to add flavor before reverts flutter/flutter#8888.'] = 'flutter/flutter#8888';
 
       tests.forEach((key, value) {
-        String? linkFound = revert.extractLinkFromText(key);
+        final String? linkFound = revert.extractLinkFromText(key);
         assert(linkFound != null);
         assert(linkFound == value);
       });
     });
 
     test('Link extraction from description returns null', () {
-      Map<String, String> tests = <String, String>{};
+      final Map<String, String> tests = <String, String>{};
       tests['Revert flutter/cocoon#123456'] = '';
       tests['revert flutter/cocoon#123456'] = '';
       tests['Reverts flutter/cocoon#'] = '';
@@ -110,7 +110,7 @@
       tests['This is some text flutter/flutter#456...44'] = '';
 
       tests.forEach((key, value) {
-        String? linkFound = revert.extractLinkFromText(key);
+        final String? linkFound = revert.extractLinkFromText(key);
         assert(linkFound == null);
       });
     });
@@ -118,26 +118,26 @@
 
   group('Validate Pull Requests.', () {
     test('Validation fails on author validation, returns error.', () async {
-      Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
+      final Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
       revertPullRequest.authorAssociation = 'CONTRIBUTOR';
       final Map<String, dynamic> queryResultJsonDecode =
           jsonDecode(queryResultRepositoryContributorJson) as Map<String, dynamic>;
       final QueryResult queryResult = QueryResult.fromJson(queryResultJsonDecode);
-      ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
+      final ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
       assert(!validationResult.result);
       assert(validationResult.action == Action.REMOVE_LABEL);
       assert(validationResult.message.contains(RegExp(r'The author.*does not have permissions to make this request.')));
     });
 
     test('Validation fails on merge conflict flag.', () async {
-      Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
+      final Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
       revertPullRequest.mergeable = false;
       final Map<String, dynamic> queryResultJsonDecode =
           jsonDecode(queryResultRepositoryOwnerJson) as Map<String, dynamic>;
       final QueryResult queryResult = QueryResult.fromJson(queryResultJsonDecode);
-      ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
+      final ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
       assert(!validationResult.result);
       assert(validationResult.action == Action.REMOVE_LABEL);
       assert(
@@ -147,13 +147,13 @@
     });
 
     test('Validation fails on malformed reverts link in the pr body.', () async {
-      Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
+      final Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
       revertPullRequest.body = 'Reverting flutter/cocoon#1234';
       final Map<String, dynamic> queryResultJsonDecode =
           jsonDecode(queryResultRepositoryOwnerJson) as Map<String, dynamic>;
       final QueryResult queryResult = QueryResult.fromJson(queryResultJsonDecode);
-      ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
+      final ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
       assert(!validationResult.result);
       assert(validationResult.action == Action.REMOVE_LABEL);
       assert(
@@ -163,14 +163,15 @@
     });
 
     test('Validation returns on checkRun that has not completed.', () async {
-      Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
+      final Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
       final Map<String, dynamic> queryResultJsonDecode =
           jsonDecode(queryResultRepositoryOwnerJson) as Map<String, dynamic>;
       final QueryResult queryResult = QueryResult.fromJson(queryResultJsonDecode);
 
-      Map<String, dynamic> originalPullRequestJsonMap = jsonDecode(originalPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest originalPullRequest = github.PullRequest.fromJson(originalPullRequestJsonMap);
+      final Map<String, dynamic> originalPullRequestJsonMap =
+          jsonDecode(originalPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest originalPullRequest = github.PullRequest.fromJson(originalPullRequestJsonMap);
       githubService.pullRequestData = originalPullRequest;
 
       // code gets the original file list then the current file list.
@@ -189,7 +190,7 @@
           maxAttempts: 1,
         ),
       );
-      ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
+      final ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
 
       expect(validationResult.result, isFalse);
       expect(validationResult.action, Action.IGNORE_TEMPORARILY);
@@ -197,14 +198,15 @@
     });
 
     test('Validation fails on pull request file lists not matching.', () async {
-      Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
+      final Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
       final Map<String, dynamic> queryResultJsonDecode =
           jsonDecode(queryResultRepositoryOwnerJson) as Map<String, dynamic>;
       final QueryResult queryResult = QueryResult.fromJson(queryResultJsonDecode);
 
-      Map<String, dynamic> originalPullRequestJsonMap = jsonDecode(originalPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest originalPullRequest = github.PullRequest.fromJson(originalPullRequestJsonMap);
+      final Map<String, dynamic> originalPullRequestJsonMap =
+          jsonDecode(originalPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest originalPullRequest = github.PullRequest.fromJson(originalPullRequestJsonMap);
       githubService.pullRequestData = originalPullRequest;
 
       // code gets the original file list then the current file list.
@@ -215,7 +217,7 @@
       // Need to set the mock checkRuns for required CheckRun validation
       githubService.checkRunsData = ciyamlCheckRun;
 
-      ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
+      final ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
       assert(!validationResult.result);
       assert(validationResult.action == Action.REMOVE_LABEL);
       assert(
@@ -225,14 +227,15 @@
     });
 
     test('Validation is successful.', () async {
-      Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
+      final Map<String, dynamic> pullRequestJsonMap = jsonDecode(revertPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest revertPullRequest = github.PullRequest.fromJson(pullRequestJsonMap);
       final Map<String, dynamic> queryResultJsonDecode =
           jsonDecode(queryResultRepositoryOwnerJson) as Map<String, dynamic>;
       final QueryResult queryResult = QueryResult.fromJson(queryResultJsonDecode);
 
-      Map<String, dynamic> originalPullRequestJsonMap = jsonDecode(originalPullRequestJson) as Map<String, dynamic>;
-      github.PullRequest originalPullRequest = github.PullRequest.fromJson(originalPullRequestJsonMap);
+      final Map<String, dynamic> originalPullRequestJsonMap =
+          jsonDecode(originalPullRequestJson) as Map<String, dynamic>;
+      final github.PullRequest originalPullRequest = github.PullRequest.fromJson(originalPullRequestJsonMap);
       githubService.pullRequestData = originalPullRequest;
 
       // code gets the original file list then the current file list.
@@ -243,7 +246,7 @@
       // Need to set the mock checkRuns for required CheckRun validation
       githubService.checkRunsData = ciyamlCheckRun;
 
-      ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
+      final ValidationResult validationResult = await revert.validate(queryResult, revertPullRequest);
       assert(validationResult.result);
       assert(validationResult.message == 'Revert request has been verified and will be queued for merge.');
     });
diff --git a/codesign/bin/codesign.dart b/codesign/bin/codesign.dart
index 053282c..937ac45 100644
--- a/codesign/bin/codesign.dart
+++ b/codesign/bin/codesign.dart
@@ -65,12 +65,16 @@
 Future<void> main(List<String> args) async {
   final ArgParser parser = ArgParser();
   parser
-    ..addFlag(kHelpFlag, help: 'Prints usage info.', callback: (bool value) {
-      if (value) {
-        stdout.write('${parser.usage}\n');
-        exit(1);
-      }
-    })
+    ..addFlag(
+      kHelpFlag,
+      help: 'Prints usage info.',
+      callback: (bool value) {
+        if (value) {
+          stdout.write('${parser.usage}\n');
+          exit(1);
+        }
+      },
+    )
     ..addOption(
       kCodesignCertNameOption,
       help: 'The name of the codesign certificate to be used when codesigning.'
diff --git a/codesign/lib/src/file_codesign_visitor.dart b/codesign/lib/src/file_codesign_visitor.dart
index 8581ef7..cacaea8 100644
--- a/codesign/lib/src/file_codesign_visitor.dart
+++ b/codesign/lib/src/file_codesign_visitor.dart
@@ -140,14 +140,14 @@
           'make sure you have provided codesign credentials in a file \n');
     }
 
-    String passwordLine = await fileSystem.file(passwordFilePath).readAsString();
-    List<String> parsedPasswordLine = passwordLine.split(":");
+    final String passwordLine = await fileSystem.file(passwordFilePath).readAsString();
+    final List<String> parsedPasswordLine = passwordLine.split(":");
     if (parsedPasswordLine.length != 2) {
       throw CodesignException('$passwordFilePath is not correctly formatted. \n'
           'please double check formatting \n');
     }
-    String passwordName = parsedPasswordLine[0];
-    String passwordValue = parsedPasswordLine[1];
+    final String passwordName = parsedPasswordLine[0];
+    final String passwordValue = parsedPasswordLine[1];
     if (!availablePasswords.containsKey(passwordName)) {
       throw CodesignException('$passwordName is not a password we can process. \n'
           'please double check passwords.txt \n');
@@ -246,7 +246,8 @@
     log.info('Visiting directory ${directory.absolute.path}');
     if (directoriesVisited.contains(directory.absolute.path)) {
       log.warning(
-          'Warning! You are visiting a directory that has been visited before, the directory is ${directory.absolute.path}');
+        'Warning! You are visiting a directory that has been visited before, the directory is ${directory.absolute.path}',
+      );
     }
     directoriesVisited.add(directory.absolute.path);
     final List<FileSystemEntity> entities = await directory.list().toList();
@@ -457,7 +458,8 @@
       final io.ProcessResult result = processManager.runSync(args);
       if (result.exitCode != 0) {
         throw CodesignException(
-            'Command "${args.join(' ')}" failed with exit code ${result.exitCode}\nStdout: ${result.stdout}\nStderr: ${result.stderr}');
+          'Command "${args.join(' ')}" failed with exit code ${result.exitCode}\nStdout: ${result.stdout}\nStderr: ${result.stderr}',
+        );
       }
 
       final String combinedOutput = (result.stdout as String) + (result.stderr as String);
diff --git a/codesign/test/file_codesign_visitor_test.dart b/codesign/test/file_codesign_visitor_test.dart
index 6a596d7..b717b33 100644
--- a/codesign/test/file_codesign_visitor_test.dart
+++ b/codesign/test/file_codesign_visitor_test.dart
@@ -129,10 +129,13 @@
           encoding: utf8,
         );
 
-      expect(() async {
-        await codesignVisitor.readPassword(appSpecificPasswordFilePath);
-        await fileSystem.file(appSpecificPasswordFilePath).delete();
-      }, returnsNormally);
+      expect(
+        () async {
+          await codesignVisitor.readPassword(appSpecificPasswordFilePath);
+          await fileSystem.file(appSpecificPasswordFilePath).delete();
+        },
+        returnsNormally,
+      );
     });
   });
 
@@ -378,7 +381,8 @@
       expect(
         messages,
         contains(
-            'The downloaded file is unzipped from ${rootDirectory.absolute.path}/downloads/remote_artifact.zip to ${rootDirectory.path}/single_artifact'),
+          'The downloaded file is unzipped from ${rootDirectory.absolute.path}/downloads/remote_artifact.zip to ${rootDirectory.path}/single_artifact',
+        ),
       );
       expect(
         messages,
@@ -395,17 +399,20 @@
       expect(
         messages,
         contains(
-            'uploading xcrun notarytool submit ${rootDirectory.absolute.path}/codesigned_zips/remote_artifact.zip --apple-id $randomString --password $randomString --team-id $randomString'),
+          'uploading xcrun notarytool submit ${rootDirectory.absolute.path}/codesigned_zips/remote_artifact.zip --apple-id $randomString --password $randomString --team-id $randomString',
+        ),
       );
       expect(
         messages,
         contains(
-            'RequestUUID for ${rootDirectory.absolute.path}/codesigned_zips/remote_artifact.zip is: $randomString'),
+          'RequestUUID for ${rootDirectory.absolute.path}/codesigned_zips/remote_artifact.zip is: $randomString',
+        ),
       );
       expect(
         messages,
         contains(
-            'checking notary status with xcrun notarytool info $randomString --password $randomString --apple-id $randomString --team-id $randomString'),
+          'checking notary status with xcrun notarytool info $randomString --password $randomString --apple-id $randomString --team-id $randomString',
+        ),
       );
       expect(
         messages,
@@ -535,15 +542,16 @@
       fileSystem.file(zipFileName).createSync(recursive: true);
       processManager.addCommands(<FakeCommand>[
         FakeCommand(
-            command: <String>[
-              'unzip',
-              '${rootDirectory.absolute.path}/remote_zip_2/zip_1',
-              '-d',
-              '${rootDirectory.absolute.path}/embedded_zip_${zipFileName.hashCode}',
-            ],
-            onRun: () => fileSystem
-              ..file('${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}/file_1').createSync(recursive: true)
-              ..file('${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}/file_2').createSync(recursive: true)),
+          command: <String>[
+            'unzip',
+            '${rootDirectory.absolute.path}/remote_zip_2/zip_1',
+            '-d',
+            '${rootDirectory.absolute.path}/embedded_zip_${zipFileName.hashCode}',
+          ],
+          onRun: () => fileSystem
+            ..file('${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}/file_1').createSync(recursive: true)
+            ..file('${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}/file_2').createSync(recursive: true),
+        ),
         FakeCommand(
           command: <String>[
             'file',
@@ -585,9 +593,11 @@
           .map((LogRecord record) => record.message)
           .toList();
       expect(
-          messages,
-          contains(
-              'The downloaded file is unzipped from ${rootDirectory.path}/remote_zip_2/zip_1 to ${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}'));
+        messages,
+        contains(
+          'The downloaded file is unzipped from ${rootDirectory.path}/remote_zip_2/zip_1 to ${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}',
+        ),
+      );
       expect(messages, contains('Visiting directory ${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}'));
       expect(messages, contains('Child file of directory embedded_zip_${zipFileName.hashCode} is file_1'));
       expect(messages, contains('Child file of directory embedded_zip_${zipFileName.hashCode} is file_2'));
@@ -617,15 +627,17 @@
               .directory('${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}')
               .createSync(recursive: true),
         ),
-        FakeCommand(command: <String>[
-          'zip',
-          '--symlinks',
-          '--recurse-paths',
-          '${rootDirectory.absolute.path}/remote_zip_4/folder_1/zip_1',
-          '.',
-          '--include',
-          '*'
-        ]),
+        FakeCommand(
+          command: <String>[
+            'zip',
+            '--symlinks',
+            '--recurse-paths',
+            '${rootDirectory.absolute.path}/remote_zip_4/folder_1/zip_1',
+            '.',
+            '--include',
+            '*'
+          ],
+        ),
       ]);
 
       await codesignVisitor.visitDirectory(
@@ -639,11 +651,15 @@
       expect(messages, contains('Visiting directory ${rootDirectory.absolute.path}/remote_zip_4'));
       expect(messages, contains('Visiting directory ${rootDirectory.absolute.path}/remote_zip_4/folder_1'));
       expect(
-          messages,
-          contains(
-              'The downloaded file is unzipped from ${rootDirectory.path}/remote_zip_4/folder_1/zip_1 to ${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}'));
+        messages,
+        contains(
+          'The downloaded file is unzipped from ${rootDirectory.path}/remote_zip_4/folder_1/zip_1 to ${rootDirectory.path}/embedded_zip_${zipFileName.hashCode}',
+        ),
+      );
       expect(
-          messages, contains('Visiting directory ${rootDirectory.absolute.path}/embedded_zip_${zipFileName.hashCode}'));
+        messages,
+        contains('Visiting directory ${rootDirectory.absolute.path}/embedded_zip_${zipFileName.hashCode}'),
+      );
     });
 
     test('throw exception when the same directory is visited', () async {
@@ -688,9 +704,11 @@
           .map((LogRecord record) => record.message)
           .toList();
       expect(
-          warnings,
-          contains(
-              'Warning! You are visiting a directory that has been visited before, the directory is ${rootDirectory.path}/parent_1/child_1'));
+        warnings,
+        contains(
+          'Warning! You are visiting a directory that has been visited before, the directory is ${rootDirectory.path}/parent_1/child_1',
+        ),
+      );
     });
 
     test('visitBinary codesigns binary with / without entitlement', () async {
@@ -835,19 +853,21 @@
       );
       expect(fileWithEntitlements.length, 3);
       expect(
-          fileWithEntitlements,
-          containsAll(<String>[
-            'file_a',
-            'file_b',
-            'file_c',
-          ]));
+        fileWithEntitlements,
+        containsAll(<String>[
+          'file_a',
+          'file_b',
+          'file_c',
+        ]),
+      );
       expect(fileWithoutEntitlements.length, 2);
       expect(
-          fileWithoutEntitlements,
-          containsAll(<String>[
-            'file_d',
-            'file_e',
-          ]));
+        fileWithoutEntitlements,
+        containsAll(<String>[
+          'file_d',
+          'file_e',
+        ]),
+      );
     });
 
     test('throw exception when configuration file is missing', () async {
@@ -867,20 +887,22 @@
       );
       expect(fileWithEntitlements.length, 3);
       expect(
-          fileWithEntitlements,
-          containsAll(<String>[
-            'file_a',
-            'file_b',
-            'file_c',
-          ]));
+        fileWithEntitlements,
+        containsAll(<String>[
+          'file_a',
+          'file_b',
+          'file_c',
+        ]),
+      );
       expect(
-          () => codesignVisitor.parseEntitlements(
-                fileSystem.directory('/Users/xilaizhang/Desktop/test_entitlement_2'),
-                false,
-              ),
-          throwsA(
-            isA<CodesignException>(),
-          ));
+        () => codesignVisitor.parseEntitlements(
+          fileSystem.directory('/Users/xilaizhang/Desktop/test_entitlement_2'),
+          false,
+        ),
+        throwsA(
+          isA<CodesignException>(),
+        ),
+      );
     });
   });
 
@@ -1415,8 +1437,10 @@
           .toSet();
       expect(
         messages,
-        isNot(contains('code signing dry run has completed, If you intend to upload the artifacts back to'
-            ' google cloud storage, please use the --dryrun=false flag to run code signing script.')),
+        isNot(
+          contains('code signing dry run has completed, If you intend to upload the artifacts back to'
+              ' google cloud storage, please use the --dryrun=false flag to run code signing script.'),
+        ),
       );
       expect(
         messages,
diff --git a/codesign/test/src/fake_process_manager.dart b/codesign/test/src/fake_process_manager.dart
index c3e111e..9aca69f 100644
--- a/codesign/test/src/fake_process_manager.dart
+++ b/codesign/test/src/fake_process_manager.dart
@@ -140,9 +140,11 @@
     if (_stderr == '') {
       stderr = const Stream<List<int>>.empty();
     } else if (outputFollowsExit) {
-      stderr = Stream<List<int>>.fromFuture(exitCode.then((_) {
-        return Future<List<int>>(() => utf8.encode(_stderr));
-      }));
+      stderr = Stream<List<int>>.fromFuture(
+        exitCode.then((_) {
+          return Future<List<int>>(() => utf8.encode(_stderr));
+        }),
+      );
     } else {
       stderr = Stream<List<int>>.value(utf8.encode(_stderr));
     }
@@ -150,9 +152,11 @@
     if (_stdout == '') {
       stdout = const Stream<List<int>>.empty();
     } else if (outputFollowsExit) {
-      stdout = Stream<List<int>>.fromFuture(exitCode.then((_) {
-        return Future<List<int>>(() => utf8.encode(_stdout));
-      }));
+      stdout = Stream<List<int>>.fromFuture(
+        exitCode.then((_) {
+          return Future<List<int>>(() => utf8.encode(_stdout));
+        }),
+      );
     } else {
       stdout = Stream<List<int>>.value(utf8.encode(_stdout));
     }
@@ -390,9 +394,12 @@
     Map<String, String>? environment,
     Encoding? encoding,
   ) {
-    expect(_commands, isNotEmpty,
-        reason: 'ProcessManager was told to execute $command (in $workingDirectory) '
-            'but the FakeProcessManager.list expected no more processes.');
+    expect(
+      _commands,
+      isNotEmpty,
+      reason: 'ProcessManager was told to execute $command (in $workingDirectory) '
+          'but the FakeProcessManager.list expected no more processes.',
+    );
     _commands.first._matches(command, workingDirectory, environment, encoding);
     return _commands.removeAt(0);
   }
@@ -433,6 +440,7 @@
   ) {
     final FakeProcessManager fakeProcessManager = item as FakeProcessManager;
     return description.add(
-        'has remaining expectations:\n${fakeProcessManager._remainingExpectations.map((FakeCommand command) => command.command).join('\n')}');
+      'has remaining expectations:\n${fakeProcessManager._remainingExpectations.map((FakeCommand command) => command.command).join('\n')}',
+    );
   }
 }
diff --git a/dashboard/lib/build_dashboard_page.dart b/dashboard/lib/build_dashboard_page.dart
index 2e82a55..53184a9 100644
--- a/dashboard/lib/build_dashboard_page.dart
+++ b/dashboard/lib/build_dashboard_page.dart
@@ -368,8 +368,8 @@
   @override
   Widget build(BuildContext context) {
     final bool isDark = Theme.of(context).brightness == Brightness.dark;
-    MediaQueryData queryData = MediaQuery.of(context);
-    double devicePixelRatio = queryData.devicePixelRatio;
+    final MediaQueryData queryData = MediaQuery.of(context);
+    final double devicePixelRatio = queryData.devicePixelRatio;
     _smallScreen = queryData.size.width * devicePixelRatio < screenWidthThreshold;
 
     /// Color of [AppBar] based on [buildState.isTreeBuilding].
diff --git a/dashboard/lib/logic/task_grid_filter.dart b/dashboard/lib/logic/task_grid_filter.dart
index e9a5153..e55f472 100644
--- a/dashboard/lib/logic/task_grid_filter.dart
+++ b/dashboard/lib/logic/task_grid_filter.dart
@@ -171,7 +171,7 @@
       return false;
     }
 
-    LinkedHashMap<String, bool> orderedOSFilter = LinkedHashMap<String, bool>.of({
+    final LinkedHashMap<String, bool> orderedOSFilter = LinkedHashMap<String, bool>.of({
       'ios': _allProperties['showiOS']?.value ?? false,
       'android': _allProperties['showAndroid']?.value ?? false,
       'mac': _allProperties['showMac']?.value ?? false,
diff --git a/dashboard/lib/service/dev_cocoon.dart b/dashboard/lib/service/dev_cocoon.dart
index db77b48..a811149 100644
--- a/dashboard/lib/service/dev_cocoon.dart
+++ b/dashboard/lib/service/dev_cocoon.dart
@@ -127,7 +127,7 @@
 
   @override
   Future<CocoonResponse<List<Branch>>> fetchFlutterBranches() async {
-    List<Branch> fakeBranches = <Branch>[];
+    final List<Branch> fakeBranches = <Branch>[];
     for (String repo in _repos) {
       fakeBranches.add(
         Branch()
diff --git a/dashboard/lib/state/build.dart b/dashboard/lib/state/build.dart
index f96af88..1d28b88 100644
--- a/dashboard/lib/state/build.dart
+++ b/dashboard/lib/state/build.dart
@@ -199,9 +199,9 @@
           _isTreeBuilding = response.data!.buildStatus == EnumBuildStatus.success;
           _failingTasks = response.data!.failingTasks;
           if (_isTreeBuilding == false) {
-            flutterAppIconsPlugin.setIcon(icon: 'favicon-failure.png');
+            unawaited(flutterAppIconsPlugin.setIcon(icon: 'favicon-failure.png'));
           } else {
-            flutterAppIconsPlugin.setIcon(icon: 'favicon.png');
+            unawaited(flutterAppIconsPlugin.setIcon(icon: 'favicon.png'));
           }
           notifyListeners();
         }
diff --git a/dashboard/test/utils/fake_build.dart b/dashboard/test/utils/fake_build.dart
index 93e94fd..89500eb 100644
--- a/dashboard/test/utils/fake_build.dart
+++ b/dashboard/test/utils/fake_build.dart
@@ -69,7 +69,7 @@
 
   @override
   List<Branch> get branches {
-    List<Branch> fakeBranches = <Branch>[];
+    final List<Branch> fakeBranches = <Branch>[];
     for (String repo in ['flutter', 'engine', 'cocoon']) {
       fakeBranches.add(
         Branch()
diff --git a/dashboard/test/widgets/task_grid_test.dart b/dashboard/test/widgets/task_grid_test.dart
index 91cce3e..ba819d1 100644
--- a/dashboard/test/widgets/task_grid_test.dart
+++ b/dashboard/test/widgets/task_grid_test.dart
@@ -588,7 +588,7 @@
   });
 
   testWidgets('TaskGrid shows icon for isTestFlaky tasks with multiple attempts', (WidgetTester tester) async {
-    Task taskA3 = Task()
+    final Task taskA3 = Task()
       ..stageName = 'A'
       ..builderName = '1'
       ..name = 'A'
@@ -596,7 +596,7 @@
       ..attempts = 3
       ..isTestFlaky = true;
 
-    Task taskB1 = Task()
+    final Task taskB1 = Task()
       ..stageName = 'B'
       ..builderName = '2'
       ..name = 'B'
@@ -635,9 +635,9 @@
     // check the order of the items. The flaky should be to the left and first.
     expect(find.byType(TaskGrid).first, findsAtLeastNWidgets(1));
 
-    LatticeScrollView latticeScrollView = tester.firstWidget(find.byType(LatticeScrollView));
-    List<List<LatticeCell>> cells = latticeScrollView.cells;
-    List<LatticeCell> myCells = cells.first;
+    final LatticeScrollView latticeScrollView = tester.firstWidget(find.byType(LatticeScrollView));
+    final List<List<LatticeCell>> cells = latticeScrollView.cells;
+    final List<LatticeCell> myCells = cells.first;
     expect(myCells.length, 3);
     myCells.removeAt(0); // the first element is the github author box.
     expect(myCells[0].taskName, 'A');
diff --git a/device_doctor/bin/main.dart b/device_doctor/bin/main.dart
index bbc32a8..0771574 100644
--- a/device_doctor/bin/main.dart
+++ b/device_doctor/bin/main.dart
@@ -38,22 +38,34 @@
 Future<void> main(List<String> args) async {
   final ArgParser parser = ArgParser();
   parser
-    ..addFlag('$helpFlag', help: 'Prints usage info.', abbr: 'h', callback: (bool value) {
-      if (value) {
-        stdout.write('${parser.usage}\n');
-        exit(1);
-      }
-    })
-    ..addOption('$actionFlag', help: 'Supported actions.', allowed: supportedOptions, allowedHelp: {
-      'healthcheck': 'Check device health status.',
-      'recovery': 'Clean up and reboot device.',
-      'properties': 'Return device properties/dimensions.'
-    })
+    ..addFlag(
+      '$helpFlag',
+      help: 'Prints usage info.',
+      abbr: 'h',
+      callback: (bool value) {
+        if (value) {
+          stdout.write('${parser.usage}\n');
+          exit(1);
+        }
+      },
+    )
+    ..addOption(
+      '$actionFlag',
+      help: 'Supported actions.',
+      allowed: supportedOptions,
+      allowedHelp: {
+        'healthcheck': 'Check device health status.',
+        'recovery': 'Clean up and reboot device.',
+        'properties': 'Return device properties/dimensions.'
+      },
+    )
     ..addOption('$outputFlag', help: 'Path to the output file')
-    ..addOption('$deviceOSFlag',
-        help: 'Supported device OS.',
-        allowed: supportedDeviceOS,
-        allowedHelp: {'android': 'Available for linux, mac, and windows.', 'ios': 'Available for mac.'});
+    ..addOption(
+      '$deviceOSFlag',
+      help: 'Supported device OS.',
+      allowed: supportedDeviceOS,
+      allowedHelp: {'android': 'Available for linux, mac, and windows.', 'ios': 'Available for mac.'},
+    );
 
   final ArgResults argResults = parser.parse(args);
   _action = argResults[actionFlag];
diff --git a/device_doctor/lib/src/android_device.dart b/device_doctor/lib/src/android_device.dart
index 8864955..1681a09 100644
--- a/device_doctor/lib/src/android_device.dart
+++ b/device_doctor/lib/src/android_device.dart
@@ -45,13 +45,13 @@
 
   Future<List<String>> _deviceListOutputWithRetries(Duration retryDuration, {ProcessManager? processManager}) async {
     const Duration deviceOutputTimeout = Duration(seconds: 15);
-    RetryOptions r = RetryOptions(
+    final RetryOptions r = RetryOptions(
       maxAttempts: 3,
       delayFactor: retryDuration,
     );
     return await r.retry(
       () async {
-        String result = await _deviceListOutput(deviceOutputTimeout, processManager: processManager);
+        final String result = await _deviceListOutput(deviceOutputTimeout, processManager: processManager);
         return result.trim().split('\n');
       },
       retryIf: (Exception e) => e is TimeoutException,
@@ -68,11 +68,13 @@
   }
 
   @override
-  Future<List<AndroidDevice>> discoverDevices(
-      {Duration retryDuration = const Duration(seconds: 10), ProcessManager? processManager}) async {
+  Future<List<AndroidDevice>> discoverDevices({
+    Duration retryDuration = const Duration(seconds: 10),
+    ProcessManager? processManager,
+  }) async {
     processManager ??= LocalProcessManager();
-    List<String> output = await _deviceListOutputWithRetries(retryDuration, processManager: processManager);
-    List<String> results = <String>[];
+    final List<String> output = await _deviceListOutputWithRetries(retryDuration, processManager: processManager);
+    final List<String> results = <String>[];
     for (String line in output) {
       // Skip lines like: * daemon started successfully *
       if (line.startsWith('* daemon ')) continue;
@@ -80,10 +82,10 @@
       if (line.startsWith('List of devices')) continue;
 
       if (_kDeviceRegex.hasMatch(line)) {
-        Match? match = _kDeviceRegex.firstMatch(line);
+        final Match? match = _kDeviceRegex.firstMatch(line);
 
-        String? deviceID = match?[1];
-        String? deviceState = match?[2];
+        final String? deviceID = match?[1];
+        final String? deviceState = match?[2];
 
         if (!const ['unauthorized', 'offline'].contains(deviceState)) {
           results.add(deviceID!);
@@ -150,8 +152,8 @@
     final Map<String, String> deviceProperties = <String, String>{};
     final Map<String, String> propertyMap = <String, String>{};
     LineSplitter.split(
-            await eval('adb', <String>['-s', device.deviceId!, 'shell', 'getprop'], processManager: processManager))
-        .forEach((String property) {
+      await eval('adb', <String>['-s', device.deviceId!, 'shell', 'getprop'], processManager: processManager),
+    ).forEach((String property) {
       final List<String> propertyList = property.replaceAll('[', '').replaceAll(']', '').split(': ');
 
       /// Deal with entries spanning only one line.
@@ -203,8 +205,10 @@
     HealthCheckResult healthCheckResult;
     try {
       final String result = await eval(
-          'adb', <String>['shell', 'dumpsys', 'power', '|', 'grep', 'mHoldingDisplaySuspendBlocker'],
-          processManager: processManager);
+        'adb',
+        <String>['shell', 'dumpsys', 'power', '|', 'grep', 'mHoldingDisplaySuspendBlocker'],
+        processManager: processManager,
+      );
       if (result.trim() == 'mHoldingDisplaySuspendBlocker=true') {
         healthCheckResult = HealthCheckResult.success(kScreenOnCheckKey);
       } else {
@@ -242,8 +246,10 @@
     HealthCheckResult healthCheckResult;
     try {
       final String result = await eval(
-          'adb', <String>['shell', 'settings', 'get', 'global', 'development_settings_enabled'],
-          processManager: processManager);
+        'adb',
+        <String>['shell', 'settings', 'get', 'global', 'development_settings_enabled'],
+        processManager: processManager,
+      );
       // The output of `development_settings_enabled` is `1` when developer mode is on.
       if (result == '1') {
         healthCheckResult = HealthCheckResult.success(kDeveloperModeCheckKey);
@@ -262,8 +268,11 @@
   Future<HealthCheckResult> screenRotationCheck({ProcessManager? processManager}) async {
     HealthCheckResult healthCheckResult;
     try {
-      final String result = await eval('adb', <String>['shell', 'settings', 'get', 'system', 'accelerometer_rotation'],
-          processManager: processManager);
+      final String result = await eval(
+        'adb',
+        <String>['shell', 'settings', 'get', 'system', 'accelerometer_rotation'],
+        processManager: processManager,
+      );
       // The output of `screensaver_enabled` is `0` when screensaver mode is off.
       if (result == '0') {
         healthCheckResult = HealthCheckResult.success(kScreenRotationCheckKey);
@@ -282,8 +291,11 @@
   Future<HealthCheckResult> screenSaverCheck({ProcessManager? processManager}) async {
     HealthCheckResult healthCheckResult;
     try {
-      final String result = await eval('adb', <String>['shell', 'settings', 'get', 'secure', 'screensaver_enabled'],
-          processManager: processManager);
+      final String result = await eval(
+        'adb',
+        <String>['shell', 'settings', 'get', 'secure', 'screensaver_enabled'],
+        processManager: processManager,
+      );
       // The output of `screensaver_enabled` is `0` when screensaver mode is off.
       if (result == '0') {
         healthCheckResult = HealthCheckResult.success(kScreenSaverCheckKey);
@@ -303,8 +315,11 @@
       // The battery level returns two rows. For example:
       //   level: 100
       //   mod level: -1
-      final String levelResults = await eval('adb', <String>['shell', 'dumpsys', 'battery', '|', 'grep', 'level'],
-          processManager: processManager);
+      final String levelResults = await eval(
+        'adb',
+        <String>['shell', 'dumpsys', 'battery', '|', 'grep', 'level'],
+        processManager: processManager,
+      );
       final RegExp levelRegExp = RegExp('level: (?<level>.+)');
       final RegExpMatch? match = levelRegExp.firstMatch(levelResults);
       final int level = int.parse(match!.namedGroup('level')!);
@@ -327,14 +342,19 @@
       // The battery temperature returns one row. For example:
       //  temperature: 240
       // It means 24°C.
-      final String tempResult = await eval('adb', <String>['shell', 'dumpsys', 'battery', '|', 'grep', 'temperature'],
-          processManager: processManager);
+      final String tempResult = await eval(
+        'adb',
+        <String>['shell', 'dumpsys', 'battery', '|', 'grep', 'temperature'],
+        processManager: processManager,
+      );
       final RegExp? tempRegExp = RegExp('temperature: (?<temperature>.+)');
       final RegExpMatch match = tempRegExp!.firstMatch(tempResult)!;
       final int temperature = int.parse(match.namedGroup('temperature')!);
       if (temperature > _kBatteryMaxTemperatureInCelsius * 10) {
-        healthCheckResult = HealthCheckResult.failure(kBatteryTemperatureCheckKey,
-            'Battery temperature (${(temperature * 0.1).toInt()}°C) is over $_kBatteryMaxTemperatureInCelsius°C');
+        healthCheckResult = HealthCheckResult.failure(
+          kBatteryTemperatureCheckKey,
+          'Battery temperature (${(temperature * 0.1).toInt()}°C) is over $_kBatteryMaxTemperatureInCelsius°C',
+        );
       } else {
         healthCheckResult = HealthCheckResult.success(kBatteryTemperatureCheckKey);
       }
@@ -373,8 +393,12 @@
   Future<bool> killProcesses({ProcessManager? processManager}) async {
     processManager ??= LocalProcessManager();
     String result;
-    result = await eval('adb', <String>['shell', 'dumpsys', 'activity', '|', 'grep', 'top-activity'],
-        canFail: true, processManager: processManager);
+    result = await eval(
+      'adb',
+      <String>['shell', 'dumpsys', 'activity', '|', 'grep', 'top-activity'],
+      canFail: true,
+      processManager: processManager,
+    );
 
     // Skip uninstalling process when no device is available or no application exists.
     if (result == 'adb: no devices/emulators found' || result.isEmpty) {
diff --git a/device_doctor/lib/src/health.dart b/device_doctor/lib/src/health.dart
index 599da5e..f1f9a27 100644
--- a/device_doctor/lib/src/health.dart
+++ b/device_doctor/lib/src/health.dart
@@ -30,7 +30,7 @@
 
   // Runs the single XCUITest in infra-dialog.
   await inDirectory(dialogDir, () async {
-    List<String> command =
+    final List<String> command =
         'xcrun xcodebuild -project infra-dialog.xcodeproj -scheme infra-dialog -destination -quiet id=$deviceId test'
             .split(' ');
     // By default the above command relies on automatic code signing, while on devicelab machines
@@ -41,8 +41,8 @@
       command.add("DEVELOPMENT_TEAM=${pl.environment['FLUTTER_XCODE_DEVELOPMENT_TEAM']}");
       command.add("PROVISIONING_PROFILE_SPECIFIER=${pl.environment['FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER']}");
     }
-    Process proc = await pm.start(command, workingDirectory: dialogDir.path);
-    int exitCode = await proc.exitCode;
+    final Process proc = await pm.start(command, workingDirectory: dialogDir.path);
+    final int exitCode = await proc.exitCode;
     if (exitCode != 0) {
       fail('Command "$command" failed with exit code $exitCode.');
     }
@@ -64,7 +64,7 @@
 
   @override
   String toString() {
-    StringBuffer buf = StringBuffer(name);
+    final StringBuffer buf = StringBuffer(name);
     buf.writeln(succeeded ? 'succeeded' : 'failed');
     if (details != null && details!.trim().isNotEmpty) {
       buf.writeln();
@@ -89,7 +89,7 @@
     healthcheckMap[kAttachedDeviceHealthcheckKey] = <String, dynamic>{'status': true, 'details': null};
   }
   for (String deviceID in deviceChecks.keys) {
-    List<HealthCheckResult> checks = deviceChecks[deviceID]!;
+    final List<HealthCheckResult> checks = deviceChecks[deviceID]!;
     for (HealthCheckResult healthCheckResult in checks) {
       final Map<String, dynamic> healthCheckResultMap = <String, dynamic>{
         'status': healthCheckResult.succeeded,
diff --git a/device_doctor/lib/src/host_utils.dart b/device_doctor/lib/src/host_utils.dart
index 97b62d9..b51006b 100644
--- a/device_doctor/lib/src/host_utils.dart
+++ b/device_doctor/lib/src/host_utils.dart
@@ -37,7 +37,7 @@
 List<String> runningProcessesOnWindows(String processName, {ProcessManager? processManager}) {
   processManager ??= LocalProcessManager();
   final ProcessResult result = processManager.runSync(<String>['powershell', 'Get-CimInstance', 'Win32_Process']);
-  List<String> pids = <String>[];
+  final List<String> pids = <String>[];
   if (result.exitCode == 0) {
     final String stdoutResult = result.stdout as String;
     for (String rawProcess in stdoutResult.split('\n')) {
diff --git a/device_doctor/lib/src/ios_debug_symbol_doctor.dart b/device_doctor/lib/src/ios_debug_symbol_doctor.dart
index 5db83bf..cc0e041 100644
--- a/device_doctor/lib/src/ios_debug_symbol_doctor.dart
+++ b/device_doctor/lib/src/ios_debug_symbol_doctor.dart
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'dart:async';
 import 'dart:convert';
 import 'dart:io' as io;
 
@@ -117,20 +118,24 @@
       '-W', // Wait for the opened application (Xcode) to close
       dashboardXcWorkspace.path,
     ]);
-    xcodeFuture.then((io.ProcessResult result) {
-      logger.info('Open closed...');
-      final String stdout = result.stdout.trim();
-      if (stdout.isNotEmpty) {
-        logger.info('stdout from `open`:\n$stdout\n');
-      }
-      final String stderr = result.stderr.trim();
-      if (stderr.isNotEmpty) {
-        logger.info('stderr from `open`:\n$stderr\n');
-      }
-      if (result.exitCode != 0) {
-        throw Exception('Failed opening Xcode!');
-      }
-    });
+
+    unawaited(
+      xcodeFuture.then((io.ProcessResult result) {
+        logger.info('Open closed...');
+        final String stdout = result.stdout.trim();
+        if (stdout.isNotEmpty) {
+          logger.info('stdout from `open`:\n$stdout\n');
+        }
+        final String stderr = result.stderr.trim();
+        if (stderr.isNotEmpty) {
+          logger.info('stderr from `open`:\n$stderr\n');
+        }
+        if (result.exitCode != 0) {
+          throw Exception('Failed opening Xcode!');
+        }
+      }),
+    );
+
     logger.info('Waiting for $timeoutSeconds seconds');
     await Future.delayed(timeout);
     logger.info('Waited for $timeoutSeconds seconds, now killing Xcode');
@@ -159,7 +164,7 @@
 
   /// Parse subset of JSON from `parseJson` associated with a particular XCDevice.
   factory XCDevice.fromMap(Map<String, Object?> map) {
-    Map<String, Object?>? error = map['error'] as Map<String, Object?>?;
+    final Map<String, Object?>? error = map['error'] as Map<String, Object?>?;
     // We should only specifically pattern match on known fatal errors, and
     // ignore the rest.
     bool validError = false;
diff --git a/device_doctor/lib/src/ios_device.dart b/device_doctor/lib/src/ios_device.dart
index 58b2301..0c860af 100644
--- a/device_doctor/lib/src/ios_device.dart
+++ b/device_doctor/lib/src/ios_device.dart
@@ -93,16 +93,23 @@
     HealthCheckResult healthCheckResult;
     try {
       final String? homeDir = Platform.environment['HOME'];
-      final String profile = await eval('ls', <String>['$homeDir/Library/MobileDevice/Provisioning\ Profiles'],
-          processManager: processManager);
+      final String profile = await eval(
+        'ls',
+        <String>['$homeDir/Library/MobileDevice/Provisioning\ Profiles'],
+        processManager: processManager,
+      );
       final String provisionFileContent = await eval(
-          'security', <String>['cms', '-D', '-i', '$homeDir/Library/MobileDevice/Provisioning\ Profiles/$profile'],
-          processManager: processManager);
+        'security',
+        <String>['cms', '-D', '-i', '$homeDir/Library/MobileDevice/Provisioning\ Profiles/$profile'],
+        processManager: processManager,
+      );
       if (provisionFileContent.contains(deviceId!)) {
         healthCheckResult = HealthCheckResult.success(kDeviceProvisioningProfileCheckKey);
       } else {
         healthCheckResult = HealthCheckResult.failure(
-            kDeviceProvisioningProfileCheckKey, 'device does not exist in the provisioning profile');
+          kDeviceProvisioningProfileCheckKey,
+          'device does not exist in the provisioning profile',
+        );
       }
     } on BuildFailedError catch (error) {
       healthCheckResult = HealthCheckResult.failure(kDeviceProvisioningProfileCheckKey, error.toString());
@@ -127,8 +134,10 @@
     HealthCheckResult healthCheckResult;
     try {
       final String batteryCheckResult = await eval(
-          'ideviceinfo', <String>['-q', 'com.apple.mobile.battery', '-k', 'BatteryCurrentCapacity'],
-          processManager: processManager);
+        'ideviceinfo',
+        <String>['-q', 'com.apple.mobile.battery', '-k', 'BatteryCurrentCapacity'],
+        processManager: processManager,
+      );
       final int level = int.parse(batteryCheckResult.isEmpty ? '0' : batteryCheckResult);
       if (level < _kBatteryMinLevel) {
         healthCheckResult =
diff --git a/device_doctor/lib/src/mac.dart b/device_doctor/lib/src/mac.dart
index 1530071..6555309 100644
--- a/device_doctor/lib/src/mac.dart
+++ b/device_doctor/lib/src/mac.dart
@@ -17,8 +17,10 @@
   HealthCheckResult healthCheckResult;
   try {
     final String user = await eval(
-        'defaults', <String>['read', '/Library/Preferences/com.apple.loginwindow', 'autoLoginUser'],
-        processManager: processManager);
+      'defaults',
+      <String>['read', '/Library/Preferences/com.apple.loginwindow', 'autoLoginUser'],
+      processManager: processManager,
+    );
     // User `swarming` is expected setup for Mac bot auto login.
     if (user == 'swarming') {
       healthCheckResult = HealthCheckResult.success(kUserAutoLoginCheckKey);
diff --git a/device_doctor/lib/src/utils.dart b/device_doctor/lib/src/utils.dart
index cab7fd1..bb27ace 100644
--- a/device_doctor/lib/src/utils.dart
+++ b/device_doctor/lib/src/utils.dart
@@ -44,13 +44,21 @@
 
 /// Creates a directory from the given path, or multiple path parts by joining
 /// them using OS-specific file path separator.
-Directory dir(String thePath,
-    [String? part2, String? part3, String? part4, String? part5, String? part6, String? part7, String? part8]) {
+Directory dir(
+  String thePath, [
+  String? part2,
+  String? part3,
+  String? part4,
+  String? part5,
+  String? part6,
+  String? part7,
+  String? part8,
+]) {
   return Directory(path.join(thePath, part2, part3, part4, part5, part6, part7, part8));
 }
 
 Future<dynamic> inDirectory(dynamic directory, Future<dynamic> action()) async {
-  String previousCwd = path.current;
+  final String previousCwd = path.current;
   try {
     cd(directory);
     return await action();
@@ -73,10 +81,13 @@
 }
 
 /// Starts a process for an executable command, and returns the processes.
-Future<Process> startProcess(String executable, List<String> arguments,
-    {Map<String, String>? env,
-    bool silent = false,
-    ProcessManager? processManager = const LocalProcessManager()}) async {
+Future<Process> startProcess(
+  String executable,
+  List<String> arguments, {
+  Map<String, String>? env,
+  bool silent = false,
+  ProcessManager? processManager = const LocalProcessManager(),
+}) async {
   late Process proc;
   try {
     proc = await processManager!
@@ -90,17 +101,21 @@
 /// Executes a command and returns its standard output as a String.
 ///
 /// Standard error is redirected to the current process' standard error stream.
-Future<String> eval(String executable, List<String> arguments,
-    {Map<String, String>? env,
-    bool canFail = false,
-    bool silent = false,
-    ProcessManager? processManager = const LocalProcessManager()}) async {
-  Process proc = await startProcess(executable, arguments, env: env, silent: silent, processManager: processManager);
+Future<String> eval(
+  String executable,
+  List<String> arguments, {
+  Map<String, String>? env,
+  bool canFail = false,
+  bool silent = false,
+  ProcessManager? processManager = const LocalProcessManager(),
+}) async {
+  final Process proc =
+      await startProcess(executable, arguments, env: env, silent: silent, processManager: processManager);
   proc.stderr.listen((List<int> data) {
     stderr.add(data);
   });
-  String output = await utf8.decodeStream(proc.stdout);
-  int exitCode = await proc.exitCode;
+  final String output = await utf8.decodeStream(proc.stdout);
+  final int exitCode = await proc.exitCode;
 
   if (exitCode != 0 && !canFail) fail('Executable $executable failed with exit code $exitCode.');
 
diff --git a/device_doctor/test/src/android_device_test.dart b/device_doctor/test/src/android_device_test.dart
index 2ab799a..028226e 100644
--- a/device_doctor/test/src/android_device_test.dart
+++ b/device_doctor/test/src/android_device_test.dart
@@ -30,7 +30,7 @@
     });
 
     test('deviceDiscovery no retries', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('List of devices attached');
       sb.writeln('ZY223JQNMR      device');
       output = <List<int>>[utf8.encode(sb.toString())];
@@ -38,8 +38,10 @@
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
 
-      List<Device> devices = await deviceDiscovery.discoverDevices(
-          retryDuration: const Duration(seconds: 0), processManager: processManager);
+      final List<Device> devices = await deviceDiscovery.discoverDevices(
+        retryDuration: const Duration(seconds: 0),
+        processManager: processManager,
+      );
       expect(devices.length, equals(1));
       expect(devices[0].deviceId, equals('ZY223JQNMR'));
     });
@@ -47,8 +49,10 @@
     test('deviceDiscovery fails', () async {
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => throw TimeoutException('test'));
-      expect(deviceDiscovery.discoverDevices(retryDuration: const Duration(seconds: 0), processManager: processManager),
-          throwsA(TypeMatcher<BuildFailedError>()));
+      expect(
+        deviceDiscovery.discoverDevices(retryDuration: const Duration(seconds: 0), processManager: processManager),
+        throwsA(TypeMatcher<BuildFailedError>()),
+      );
     });
   });
 
@@ -83,11 +87,14 @@
       ''';
       property_process = FakeProcess(0, out: <List<int>>[utf8.encode(output)]);
 
-      when(processManager.start(<Object>['adb', '-s', 'ZY223JQNMR', 'shell', 'getprop'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(property_process));
+      when(
+        processManager.start(
+          <Object>['adb', '-s', 'ZY223JQNMR', 'shell', 'getprop'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(property_process));
 
-      Map<String, String> deviceProperties = await deviceDiscovery
+      final Map<String, String> deviceProperties = await deviceDiscovery
           .getDeviceProperties(AndroidDevice(deviceId: 'ZY223JQNMR'), processManager: processManager);
 
       const Map<String, String> expectedProperties = <String, String>{
@@ -113,22 +120,26 @@
 
     test('returns success when adb power service is available', () async {
       process = FakeProcess(0);
-      when(processManager
-              .start(<Object>['adb', 'shell', 'dumpsys', 'power'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager
+            .start(<Object>['adb', 'shell', 'dumpsys', 'power'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.adbPowerServiceCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.adbPowerServiceCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
       expect(healthCheckResult.name, kAdbPowerServiceCheckKey);
     });
 
     test('returns failure when adb returns none 0 code', () async {
       process = FakeProcess(1);
-      when(processManager
-              .start(<Object>['adb', 'shell', 'dumpsys', 'power'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager
+            .start(<Object>['adb', 'shell', 'dumpsys', 'power'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.adbPowerServiceCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.adbPowerServiceCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kAdbPowerServiceCheckKey);
       expect(healthCheckResult.details, 'Executable adb failed with exit code 1.');
@@ -149,11 +160,15 @@
     test('returns success when developer mode is on', () async {
       output = <List<int>>[utf8.encode('1')];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'settings', 'get', 'global', 'development_settings_enabled'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'settings', 'get', 'global', 'development_settings_enabled'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.developerModeCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.developerModeCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
       expect(healthCheckResult.name, kDeveloperModeCheckKey);
     });
@@ -161,11 +176,15 @@
     test('returns failure when developer mode is off', () async {
       output = <List<int>>[utf8.encode('0')];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'settings', 'get', 'global', 'development_settings_enabled'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'settings', 'get', 'global', 'development_settings_enabled'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.developerModeCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.developerModeCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kDeveloperModeCheckKey);
       expect(healthCheckResult.details, 'developer mode is off');
@@ -174,11 +193,15 @@
     test('returns success when screensaver is off', () async {
       output = <List<int>>[utf8.encode('0')];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'settings', 'get', 'secure', 'screensaver_enabled'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'settings', 'get', 'secure', 'screensaver_enabled'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.screenSaverCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.screenSaverCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
       expect(healthCheckResult.name, kScreenSaverCheckKey);
     });
@@ -186,11 +209,15 @@
     test('returns failure when screensaver is on', () async {
       output = <List<int>>[utf8.encode('1')];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'settings', 'get', 'secure', 'screensaver_enabled'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'settings', 'get', 'secure', 'screensaver_enabled'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.screenSaverCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.screenSaverCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kScreenSaverCheckKey);
       expect(healthCheckResult.details, 'Screensaver is on');
@@ -198,11 +225,15 @@
 
     test('returns failure when adb return none 0 code', () async {
       process = FakeProcess(1);
-      when(processManager.start(<Object>['adb', 'shell', 'settings', 'get', 'global', 'development_settings_enabled'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'settings', 'get', 'global', 'development_settings_enabled'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.developerModeCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.developerModeCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kDeveloperModeCheckKey);
       expect(healthCheckResult.details, 'Executable adb failed with exit code 1.');
@@ -226,12 +257,14 @@
       ''';
       output = <List<int>>[utf8.encode(screenMessage)];
       process = FakeProcess(0, out: output);
-      when(processManager.start(
-              <Object>['adb', 'shell', 'dumpsys', 'power', '|', 'grep', 'mHoldingDisplaySuspendBlocker'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'power', '|', 'grep', 'mHoldingDisplaySuspendBlocker'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.screenOnCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.screenOnCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
       expect(healthCheckResult.name, kScreenOnCheckKey);
     });
@@ -242,12 +275,14 @@
       ''';
       output = <List<int>>[utf8.encode(screenMessage)];
       process = FakeProcess(0, out: output);
-      when(processManager.start(
-              <Object>['adb', 'shell', 'dumpsys', 'power', '|', 'grep', 'mHoldingDisplaySuspendBlocker'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'power', '|', 'grep', 'mHoldingDisplaySuspendBlocker'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.screenOnCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.screenOnCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kScreenOnCheckKey);
       expect(healthCheckResult.details, 'screen is off');
@@ -255,12 +290,14 @@
 
     test('returns failure when adb return non 0 code', () async {
       process = FakeProcess(1);
-      when(processManager.start(
-              <Object>['adb', 'shell', 'dumpsys', 'power', '|', 'grep', 'mHoldingDisplaySuspendBlocker'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'power', '|', 'grep', 'mHoldingDisplaySuspendBlocker'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.screenOnCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.screenOnCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kScreenOnCheckKey);
       expect(healthCheckResult.details, 'Executable adb failed with exit code 1.');
@@ -281,11 +318,15 @@
     test('returns success when rotation is disabled', () async {
       output = <List<int>>[utf8.encode('0')];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'settings', 'get', 'system', 'accelerometer_rotation'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'settings', 'get', 'system', 'accelerometer_rotation'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.screenRotationCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.screenRotationCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
       expect(healthCheckResult.name, kScreenRotationCheckKey);
     });
@@ -293,11 +334,15 @@
     test('returns failure when screen rotation is enabled', () async {
       output = <List<int>>[utf8.encode('1')];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'settings', 'get', 'system', 'accelerometer_rotation'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'settings', 'get', 'system', 'accelerometer_rotation'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.screenRotationCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.screenRotationCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kScreenRotationCheckKey);
       expect(healthCheckResult.details, 'Screen rotation is enabled');
@@ -322,12 +367,18 @@
       ];
       listProcess = FakeProcess(0, out: output);
       killProcess = FakeProcess(0);
-      when(processManager.start(<Object>['adb', 'shell', 'dumpsys', 'activity', '|', 'grep', 'top-activity'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(listProcess));
-      when(processManager.start(<Object>['adb', 'shell', 'am', 'force-stop', 'com.google.android.apps.nexuslauncher'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(killProcess));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'activity', '|', 'grep', 'top-activity'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(listProcess));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'am', 'force-stop', 'com.google.android.apps.nexuslauncher'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(killProcess));
 
       final bool result = await device.killProcesses(processManager: processManager);
       expect(result, true);
@@ -337,12 +388,18 @@
       output = <List<int>>[];
       listProcess = FakeProcess(0, out: output);
       killProcess = FakeProcess(0);
-      when(processManager.start(<Object>['adb', 'shell', 'dumpsys', 'activity', '|', 'grep', 'top-activity'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(listProcess));
-      when(processManager.start(<Object>['adb', 'shell', 'am', 'force-stop', 'com.google.android.apps.nexuslauncher'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(killProcess));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'activity', '|', 'grep', 'top-activity'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(listProcess));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'am', 'force-stop', 'com.google.android.apps.nexuslauncher'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(killProcess));
 
       final bool result = await device.killProcesses(processManager: processManager);
       expect(result, true);
@@ -354,12 +411,18 @@
       ];
       listProcess = FakeProcess(0, out: output);
       killProcess = FakeProcess(1);
-      when(processManager.start(<Object>['adb', 'shell', 'dumpsys', 'activity', '|', 'grep', 'top-activity'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(listProcess));
-      when(processManager.start(<Object>['adb', 'shell', 'am', 'force-stop', 'com.google.android.apps.nexuslauncher'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(killProcess));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'activity', '|', 'grep', 'top-activity'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(listProcess));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'am', 'force-stop', 'com.google.android.apps.nexuslauncher'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(killProcess));
 
       final bool result = await device.killProcesses(processManager: processManager);
       expect(result, false);
@@ -381,7 +444,8 @@
       when(processManager.start(<Object>['adb', 'kill-server'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.killAdbServerCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.killAdbServerCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
       expect(healthCheckResult.name, kKillAdbServerCheckKey);
     });
@@ -391,7 +455,8 @@
       when(processManager.start(<Object>['adb', 'kill-server'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.killAdbServerCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.killAdbServerCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kKillAdbServerCheckKey);
       expect(healthCheckResult.details, 'Executable adb failed with exit code 1.');
@@ -416,11 +481,15 @@
       ''';
       output = <List<int>>[utf8.encode(screenMessage)];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'dumpsys', 'battery', '|', 'grep', 'level'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'battery', '|', 'grep', 'level'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.batteryLevelCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.batteryLevelCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
       expect(healthCheckResult.name, kBatteryLevelCheckKey);
     });
@@ -432,11 +501,15 @@
       ''';
       output = <List<int>>[utf8.encode(screenMessage)];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'dumpsys', 'battery', '|', 'grep', 'level'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'battery', '|', 'grep', 'level'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult = await deviceDiscovery.batteryLevelCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.batteryLevelCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kBatteryLevelCheckKey);
       expect(healthCheckResult.details, 'Battery level (10) is below 15');
@@ -460,11 +533,14 @@
       ''';
       output = <List<int>>[utf8.encode(screenMessage)];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'dumpsys', 'battery', '|', 'grep', 'temperature'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'battery', '|', 'grep', 'temperature'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult =
+      final HealthCheckResult healthCheckResult =
           await deviceDiscovery.batteryTemperatureCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
       expect(healthCheckResult.name, kBatteryTemperatureCheckKey);
@@ -476,11 +552,14 @@
       ''';
       output = <List<int>>[utf8.encode(screenMessage)];
       process = FakeProcess(0, out: output);
-      when(processManager.start(<Object>['adb', 'shell', 'dumpsys', 'battery', '|', 'grep', 'temperature'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager.start(
+          <Object>['adb', 'shell', 'dumpsys', 'battery', '|', 'grep', 'temperature'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(process));
 
-      HealthCheckResult healthCheckResult =
+      final HealthCheckResult healthCheckResult =
           await deviceDiscovery.batteryTemperatureCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kBatteryTemperatureCheckKey);
diff --git a/device_doctor/test/src/health_test.dart b/device_doctor/test/src/health_test.dart
index ca0f835..1b9fa9e 100644
--- a/device_doctor/test/src/health_test.dart
+++ b/device_doctor/test/src/health_test.dart
@@ -22,30 +22,32 @@
     });
 
     test('succeeded', () async {
-      Process proc = FakeProcess(0);
+      final Process proc = FakeProcess(0);
       when(pm.start(any, workingDirectory: anyNamed('workingDirectory'))).thenAnswer((_) => Future.value(proc));
 
-      HealthCheckResult res = await closeIosDialog(pm: pm);
+      final HealthCheckResult res = await closeIosDialog(pm: pm);
 
       expect(res.succeeded, isTrue);
     });
 
     test('succeeded with code signing overwrite', () async {
-      Process proc = FakeProcess(0);
+      final Process proc = FakeProcess(0);
       when(pm.start(any, workingDirectory: anyNamed('workingDirectory'))).thenAnswer((_) => Future.value(proc));
-      platform.Platform pl = platform.FakePlatform(environment: <String, String>{
-        'FLUTTER_XCODE_CODE_SIGN_STYLE': 'Manual',
-        'FLUTTER_XCODE_DEVELOPMENT_TEAM': 'S8QB4VV633',
-        'FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER': 'a name with space',
-      });
+      final platform.Platform pl = platform.FakePlatform(
+        environment: <String, String>{
+          'FLUTTER_XCODE_CODE_SIGN_STYLE': 'Manual',
+          'FLUTTER_XCODE_DEVELOPMENT_TEAM': 'S8QB4VV633',
+          'FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER': 'a name with space',
+        },
+      );
 
-      HealthCheckResult res = await closeIosDialog(pm: pm, pl: pl);
+      final HealthCheckResult res = await closeIosDialog(pm: pm, pl: pl);
 
       expect(res.succeeded, isTrue);
     });
 
     test('failed', () async {
-      Process proc = FakeProcess(123);
+      final Process proc = FakeProcess(123);
       when(pm.start(any, workingDirectory: anyNamed('workingDirectory'))).thenAnswer((_) => Future.value(proc));
 
       expect(
@@ -55,7 +57,7 @@
     });
 
     test('tool is not found', () async {
-      Process proc = FakeProcess(123);
+      final Process proc = FakeProcess(123);
       when(pm.start(any, workingDirectory: anyNamed('workingDirectory'))).thenAnswer((_) => Future.value(proc));
 
       expect(
diff --git a/device_doctor/test/src/host_utils_test.dart b/device_doctor/test/src/host_utils_test.dart
index b95118f..7e29d50 100644
--- a/device_doctor/test/src/host_utils_test.dart
+++ b/device_doctor/test/src/host_utils_test.dart
@@ -23,7 +23,7 @@
       output = '123 abc';
       when(processManager.runSync(<String>['powershell', 'Get-CimInstance', 'Win32_Process']))
           .thenAnswer((_) => ProcessResult(1, 0, output, 'def'));
-      List<String> processes = runningProcessesOnWindows('abc', processManager: processManager);
+      final List<String> processes = runningProcessesOnWindows('abc', processManager: processManager);
       expect(processes, equals(<String>['123']));
     });
 
@@ -31,7 +31,7 @@
       output = '123 abc\n 456 abc\n 789 def';
       when(processManager.runSync(<String>['powershell', 'Get-CimInstance', 'Win32_Process']))
           .thenAnswer((_) => ProcessResult(1, 0, output, 'def'));
-      List<String> processes = runningProcessesOnWindows('abc', processManager: processManager);
+      final List<String> processes = runningProcessesOnWindows('abc', processManager: processManager);
       expect(processes, equals(<String>['123', '456']));
     });
 
@@ -39,7 +39,7 @@
       output = '123 def';
       when(processManager.runSync(<String>['powershell', 'Get-CimInstance', 'Win32_Process']))
           .thenAnswer((_) => ProcessResult(1, 0, output, 'def'));
-      List<String> processes = runningProcessesOnWindows('abc', processManager: processManager);
+      final List<String> processes = runningProcessesOnWindows('abc', processManager: processManager);
       expect(processes, equals(<String>[]));
     });
   });
diff --git a/device_doctor/test/src/ios_debug_symbol_doctor_test.dart b/device_doctor/test/src/ios_debug_symbol_doctor_test.dart
index e1ddfb2..b4567cb 100644
--- a/device_doctor/test/src/ios_debug_symbol_doctor_test.dart
+++ b/device_doctor/test/src/ios_debug_symbol_doctor_test.dart
@@ -110,12 +110,13 @@
       });
       expect(result, isTrue);
       expect(
-          logger.logs[Level.INFO],
-          containsAllInOrder(<String>[
-            'Launching Xcode...',
-            'Waiting for 300 seconds',
-            'Waited for 300 seconds, now killing Xcode',
-          ]));
+        logger.logs[Level.INFO],
+        containsAllInOrder(<String>[
+          'Launching Xcode...',
+          'Waiting for 300 seconds',
+          'Waited for 300 seconds, now killing Xcode',
+        ]),
+      );
     });
   });
 }
diff --git a/device_doctor/test/src/ios_device_test.dart b/device_doctor/test/src/ios_device_test.dart
index 9b041e5..675433c 100644
--- a/device_doctor/test/src/ios_device_test.dart
+++ b/device_doctor/test/src/ios_device_test.dart
@@ -31,17 +31,17 @@
     test('deviceDiscovery', () async {
       deviceDiscovery.outputs = <dynamic>[''];
       expect(await deviceDiscovery.discoverDevices(), isEmpty);
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('abcdefg');
       deviceDiscovery.outputs = <dynamic>[sb.toString()];
-      List<Device> devices = await deviceDiscovery.discoverDevices();
+      final List<Device> devices = await deviceDiscovery.discoverDevices();
       expect(devices.length, equals(1));
       expect(devices[0].deviceId, equals('abcdefg'));
     });
 
     test('checkDevices without device', () async {
       deviceDiscovery.outputs = <dynamic>[''];
-      Map<String, List<HealthCheckResult>> results = await deviceDiscovery.checkDevices();
+      final Map<String, List<HealthCheckResult>> results = await deviceDiscovery.checkDevices();
       await expectLater(results.keys.length, 0);
     });
 
@@ -89,7 +89,8 @@
       process = FakeProcess(0);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.keychainUnlockCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.keychainUnlockCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
     });
 
@@ -97,40 +98,41 @@
       process = FakeProcess(1);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.keychainUnlockCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult =
+          await deviceDiscovery.keychainUnlockCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kKeychainUnlockCheckKey);
       expect(healthCheckResult.details, 'Executable ${kUnlockLoginKeychain} failed with exit code 1.');
     });
 
     test('Cert check - success', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('1) abcdefg "Apple Development: Flutter Devicelab (hijklmn)"');
       sb.writeln('1 valid identities found');
       output = <List<int>>[utf8.encode(sb.toString())];
       process = FakeProcess(0, out: output);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
     });
 
     test('Cert check - failure without target certificate', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('abcdefg');
       sb.writeln('hijklmn');
       output = <List<int>>[utf8.encode(sb.toString())];
       process = FakeProcess(0, out: output);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kCertCheckKey);
       expect(healthCheckResult.details, sb.toString().trim());
     });
 
     test('Cert check - failure with multiple certificates', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('1) abcdefg "Apple Development: Flutter Devicelab (hijklmn)"');
 
       sb.writeln('1) opqrst "uvwxyz"');
@@ -139,21 +141,21 @@
       process = FakeProcess(0, out: output);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kCertCheckKey);
       expect(healthCheckResult.details, sb.toString().trim());
     });
 
     test('Cert check - failure with revoked certificates', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('1) abcdefg "Apple Development: Flutter Devicelab (hijklmn)" (CSSMERR_TP_CERT_REVOKED)');
       sb.writeln('1 valid identities found');
       output = <List<int>>[utf8.encode(sb.toString())];
       process = FakeProcess(0, out: output);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kCertCheckKey);
       expect(healthCheckResult.details, sb.toString().trim());
@@ -163,31 +165,31 @@
       process = FakeProcess(1);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.certCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kCertCheckKey);
       expect(healthCheckResult.details, 'Executable security failed with exit code 1.');
     });
 
     test('Device pair check - success', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('SUCCESS: Validated pairing with device abcdefg-hijklmn');
       output = <List<int>>[utf8.encode(sb.toString())];
       process = FakeProcess(0, out: output);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.devicePairCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.devicePairCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
     });
 
     test('Device pair check - failure', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('abcdefg');
       output = <List<int>>[utf8.encode(sb.toString())];
       process = FakeProcess(0, out: output);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.devicePairCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.devicePairCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kDevicePairCheckKey);
       expect(healthCheckResult.details, sb.toString().trim());
@@ -197,7 +199,7 @@
       process = FakeProcess(1);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      HealthCheckResult healthCheckResult = await deviceDiscovery.devicePairCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await deviceDiscovery.devicePairCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kDevicePairCheckKey);
       expect(healthCheckResult.details, 'Executable idevicepair failed with exit code 1.');
@@ -209,12 +211,12 @@
       List<List<int>> lsOutput;
       List<List<int>> securityOutput;
       test('success', () async {
-        String fileName = 'abcdefg';
+        const String fileName = 'abcdefg';
         lsOutput = <List<int>>[utf8.encode(fileName)];
         lsProcess = FakeProcess(0, out: lsOutput);
 
-        String deviceID = 'deviceId';
-        String profileContent = '''<array>
+        const String deviceID = 'deviceId';
+        const String profileContent = '''<array>
         <string>test1</string>
         <string>$deviceID</string>
         <string>test2</string>
@@ -224,31 +226,32 @@
         securityProcess = FakeProcess(0, out: securityOutput);
 
         final String? homeDir = Platform.environment['HOME'];
-        when(processManager.start(<Object>['ls', '$homeDir/Library/MobileDevice/Provisioning\ Profiles'],
-                workingDirectory: anyNamed('workingDirectory')))
-            .thenAnswer((_) => Future.value(lsProcess));
-        when(processManager.start(<Object>[
-          'security',
-          'cms',
-          '-D',
-          '-i',
-          '$homeDir/Library/MobileDevice/Provisioning\ Profiles/$fileName'
-        ], workingDirectory: anyNamed('workingDirectory')))
-            .thenAnswer((_) => Future.value(securityProcess));
+        when(
+          processManager.start(
+            <Object>['ls', '$homeDir/Library/MobileDevice/Provisioning\ Profiles'],
+            workingDirectory: anyNamed('workingDirectory'),
+          ),
+        ).thenAnswer((_) => Future.value(lsProcess));
+        when(
+          processManager.start(
+            <Object>['security', 'cms', '-D', '-i', '$homeDir/Library/MobileDevice/Provisioning\ Profiles/$fileName'],
+            workingDirectory: anyNamed('workingDirectory'),
+          ),
+        ).thenAnswer((_) => Future.value(securityProcess));
 
-        HealthCheckResult healthCheckResult =
+        final HealthCheckResult healthCheckResult =
             await deviceDiscovery.deviceProvisioningProfileCheck(deviceID, processManager: processManager);
         expect(healthCheckResult.succeeded, true);
         expect(healthCheckResult.name, kDeviceProvisioningProfileCheckKey);
       });
 
       test('deviceId does not exist', () async {
-        String fileName = 'abcdefg';
+        const String fileName = 'abcdefg';
         lsOutput = <List<int>>[utf8.encode(fileName)];
         lsProcess = FakeProcess(0, out: lsOutput);
 
-        String deviceID = 'deviceId';
-        String profileContent = '''<array>
+        const String deviceID = 'deviceId';
+        const String profileContent = '''<array>
         <string>test1</string>
         <string>test2</string>
         </array>
@@ -257,19 +260,20 @@
         securityProcess = FakeProcess(0, out: securityOutput);
 
         final String? homeDir = Platform.environment['HOME'];
-        when(processManager.start(<Object>['ls', '$homeDir/Library/MobileDevice/Provisioning\ Profiles'],
-                workingDirectory: anyNamed('workingDirectory')))
-            .thenAnswer((_) => Future.value(lsProcess));
-        when(processManager.start(<Object>[
-          'security',
-          'cms',
-          '-D',
-          '-i',
-          '$homeDir/Library/MobileDevice/Provisioning\ Profiles/$fileName'
-        ], workingDirectory: anyNamed('workingDirectory')))
-            .thenAnswer((_) => Future.value(securityProcess));
+        when(
+          processManager.start(
+            <Object>['ls', '$homeDir/Library/MobileDevice/Provisioning\ Profiles'],
+            workingDirectory: anyNamed('workingDirectory'),
+          ),
+        ).thenAnswer((_) => Future.value(lsProcess));
+        when(
+          processManager.start(
+            <Object>['security', 'cms', '-D', '-i', '$homeDir/Library/MobileDevice/Provisioning\ Profiles/$fileName'],
+            workingDirectory: anyNamed('workingDirectory'),
+          ),
+        ).thenAnswer((_) => Future.value(securityProcess));
 
-        HealthCheckResult healthCheckResult =
+        final HealthCheckResult healthCheckResult =
             await deviceDiscovery.deviceProvisioningProfileCheck(deviceID, processManager: processManager);
         expect(healthCheckResult.succeeded, false);
         expect(healthCheckResult.name, kDeviceProvisioningProfileCheckKey);
@@ -281,31 +285,37 @@
       Process process;
       List<List<int>> output;
       test('battery level is okay', () async {
-        String batteryLevel = '100';
+        const String batteryLevel = '100';
         output = <List<int>>[utf8.encode(batteryLevel)];
         process = FakeProcess(0, out: output);
 
-        when(processManager.start(
-                <Object>['ideviceinfo', '-q', 'com.apple.mobile.battery', '-k', 'BatteryCurrentCapacity'],
-                workingDirectory: anyNamed('workingDirectory')))
-            .thenAnswer((_) => Future.value(process));
+        when(
+          processManager.start(
+            <Object>['ideviceinfo', '-q', 'com.apple.mobile.battery', '-k', 'BatteryCurrentCapacity'],
+            workingDirectory: anyNamed('workingDirectory'),
+          ),
+        ).thenAnswer((_) => Future.value(process));
 
-        HealthCheckResult healthCheckResult = await deviceDiscovery.batteryLevelCheck(processManager: processManager);
+        final HealthCheckResult healthCheckResult =
+            await deviceDiscovery.batteryLevelCheck(processManager: processManager);
         expect(healthCheckResult.succeeded, true);
         expect(healthCheckResult.name, kBatteryLevelCheckKey);
       });
 
       test('battery level is below minLevel', () async {
-        String batteryLevel = '10';
+        const String batteryLevel = '10';
         output = <List<int>>[utf8.encode(batteryLevel)];
         process = FakeProcess(0, out: output);
 
-        when(processManager.start(
-                <Object>['ideviceinfo', '-q', 'com.apple.mobile.battery', '-k', 'BatteryCurrentCapacity'],
-                workingDirectory: anyNamed('workingDirectory')))
-            .thenAnswer((_) => Future.value(process));
+        when(
+          processManager.start(
+            <Object>['ideviceinfo', '-q', 'com.apple.mobile.battery', '-k', 'BatteryCurrentCapacity'],
+            workingDirectory: anyNamed('workingDirectory'),
+          ),
+        ).thenAnswer((_) => Future.value(process));
 
-        HealthCheckResult healthCheckResult = await deviceDiscovery.batteryLevelCheck(processManager: processManager);
+        final HealthCheckResult healthCheckResult =
+            await deviceDiscovery.batteryLevelCheck(processManager: processManager);
         expect(healthCheckResult.succeeded, false);
         expect(healthCheckResult.name, kBatteryLevelCheckKey);
         expect(healthCheckResult.details, 'Battery level ($batteryLevel) is below 15');
@@ -328,14 +338,15 @@
     test('device restart - success', () async {
       idevicediagnosticsPath = '/abc/def/idevicediagnostics';
       whichProcess = FakeProcess(0, out: <List<int>>[utf8.encode(idevicediagnosticsPath)]);
-      when(processManager
-              .start(<String>['which', 'idevicediagnostics'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(whichProcess));
+      when(
+        processManager.start(<String>['which', 'idevicediagnostics'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(whichProcess));
       process = FakeProcess(0);
       device = IosDevice(deviceId: 'abc');
-      when(processManager
-              .start(<Object>[idevicediagnosticsPath, 'restart'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager
+            .start(<Object>[idevicediagnosticsPath, 'restart'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(process));
       final bool result = await device.restart_device(processManager: processManager);
       expect(result, isTrue);
     });
@@ -343,14 +354,15 @@
     test('device restart - failure', () async {
       idevicediagnosticsPath = '/abc/def/idevicediagnostics';
       whichProcess = FakeProcess(0, out: <List<int>>[utf8.encode(idevicediagnosticsPath)]);
-      when(processManager
-              .start(<String>['which', 'idevicediagnostics'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(whichProcess));
+      when(
+        processManager.start(<String>['which', 'idevicediagnostics'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(whichProcess));
       process = FakeProcess(1);
       device = IosDevice(deviceId: 'abc');
-      when(processManager
-              .start(<Object>[idevicediagnosticsPath, 'restart'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process));
+      when(
+        processManager
+            .start(<Object>[idevicediagnosticsPath, 'restart'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(process));
       final bool result = await device.restart_device(processManager: processManager);
       expect(result, isFalse);
     });
@@ -420,12 +432,14 @@
           .thenAnswer((_) => Future.value(whichProcess));
       when(processManager.start(<Object>[ideviceinstallerPath, '-l'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      when(processManager
-              .start(<Object>[ideviceinstallerPath, '-U', 'abc'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process_uninstall));
-      when(processManager
-              .start(<Object>[ideviceinstallerPath, '-U', 'jkl'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process_uninstall));
+      when(
+        processManager
+            .start(<Object>[ideviceinstallerPath, '-U', 'abc'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(process_uninstall));
+      when(
+        processManager
+            .start(<Object>[ideviceinstallerPath, '-U', 'jkl'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(process_uninstall));
 
       output = '''CFBundleIdentifier, CFBundleVersion, CFBundleDisplayName
         abc, def, ghi
@@ -447,17 +461,19 @@
         jkl, mno, pqr
         ''';
       process = FakeProcess(0, out: <List<int>>[utf8.encode(output)]);
-      Process process_uninstall = FakeProcess(0);
+      final Process process_uninstall = FakeProcess(0);
       when(processManager.start(<String>['which', 'ideviceinstaller'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(whichProcess));
       when(processManager.start(<Object>[ideviceinstallerPath, '-l'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
-      when(processManager
-              .start(<Object>[ideviceinstallerPath, '-U', 'abc'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process_uninstall));
-      when(processManager
-              .start(<Object>[ideviceinstallerPath, '-U', 'jkl'], workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(process_uninstall));
+      when(
+        processManager
+            .start(<Object>[ideviceinstallerPath, '-U', 'abc'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(process_uninstall));
+      when(
+        processManager
+            .start(<Object>[ideviceinstallerPath, '-U', 'jkl'], workingDirectory: anyNamed('workingDirectory')),
+      ).thenAnswer((_) => Future.value(process_uninstall));
 
       final bool result = await device.uninstall_applications(processManager: processManager);
       expect(result, isTrue);
@@ -482,7 +498,7 @@
           .thenAnswer((_) => Future.value(processWhichIdeviceID));
       when(processManager.start(<String>['/test/idevice_id', '-l'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(processIdeviceID));
-      String deviceId = await deviceDiscovery.deviceListOutput(processManager: processManager);
+      final String deviceId = await deviceDiscovery.deviceListOutput(processManager: processManager);
       expect(deviceId, 'abc');
     });
   });
diff --git a/device_doctor/test/src/mac_test.dart b/device_doctor/test/src/mac_test.dart
index f0b4c16..f004038 100644
--- a/device_doctor/test/src/mac_test.dart
+++ b/device_doctor/test/src/mac_test.dart
@@ -29,7 +29,7 @@
           .thenAnswer((_) => Future.value(process));
       output = <List<int>>[utf8.encode('swarming')];
       process = FakeProcess(0, out: output);
-      HealthCheckResult healthCheckResult = await userAutoLoginCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await userAutoLoginCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, true);
     });
 
@@ -37,7 +37,7 @@
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
       process = FakeProcess(1);
-      HealthCheckResult healthCheckResult = await userAutoLoginCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await userAutoLoginCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kUserAutoLoginCheckKey);
       expect(healthCheckResult.details, 'Executable defaults failed with exit code 1.');
@@ -48,7 +48,7 @@
           .thenAnswer((_) => Future.value(process));
       output = <List<int>>[utf8.encode('test')];
       process = FakeProcess(0, out: output);
-      HealthCheckResult healthCheckResult = await userAutoLoginCheck(processManager: processManager);
+      final HealthCheckResult healthCheckResult = await userAutoLoginCheck(processManager: processManager);
       expect(healthCheckResult.succeeded, false);
       expect(healthCheckResult.name, kUserAutoLoginCheckKey);
       expect(healthCheckResult.details, 'swarming user is not setup for auto login');
diff --git a/device_doctor/test/src/utils.dart b/device_doctor/test/src/utils.dart
index dd1379c..6a6ccf8 100644
--- a/device_doctor/test/src/utils.dart
+++ b/device_doctor/test/src/utils.dart
@@ -22,8 +22,10 @@
     bool runInShell = false,
     ProcessStartMode mode = ProcessStartMode.normal,
   }) {
-    return super.noSuchMethod(Invocation.method(#start, [command], {#workingDirectory: workingDirectory}),
-        returnValue: Future<Process>.value(FakeProcess(0)));
+    return super.noSuchMethod(
+      Invocation.method(#start, [command], {#workingDirectory: workingDirectory}),
+      returnValue: Future<Process>.value(FakeProcess(0)),
+    );
   }
 
   @override
@@ -55,14 +57,15 @@
 }
 
 class FakeProcess extends Fake implements Process {
-  FakeProcess(int exitCode,
-      {List<List<int>>? err = const [
-        <int>[1, 2, 3]
-      ],
-      List<List<int>>? out = const [
-        <int>[1, 2, 3]
-      ]})
-      : _exitCode = exitCode,
+  FakeProcess(
+    int exitCode, {
+    List<List<int>>? err = const [
+      <int>[1, 2, 3]
+    ],
+    List<List<int>>? out = const [
+      <int>[1, 2, 3]
+    ],
+  })  : _exitCode = exitCode,
         _err = err,
         _out = out;
 
diff --git a/device_doctor/test/src/utils_test.dart b/device_doctor/test/src/utils_test.dart
index f80f164..7114a6f 100644
--- a/device_doctor/test/src/utils_test.dart
+++ b/device_doctor/test/src/utils_test.dart
@@ -36,14 +36,14 @@
     });
 
     test('validate process', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('abc');
       output = <List<int>>[utf8.encode(sb.toString())];
-      Process process = FakeProcess(123, out: output);
+      final Process process = FakeProcess(123, out: output);
       when(processManager.start(any, workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
 
-      Process proc = await startProcess('abc', <String>['a', 'b', 'c'], processManager: processManager);
+      final Process proc = await startProcess('abc', <String>['a', 'b', 'c'], processManager: processManager);
       expect(proc, process);
     });
   });
@@ -58,7 +58,7 @@
     });
 
     test('exit code 0', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('abc');
       output = <List<int>>[utf8.encode(sb.toString())];
       process = FakeProcess(0, out: output);
@@ -69,7 +69,7 @@
     });
 
     test('exit code not 0', () async {
-      StringBuffer sb = StringBuffer();
+      final StringBuffer sb = StringBuffer();
       sb.writeln('List of devices attached');
       sb.writeln('ZY223JQNMR      device');
       output = <List<int>>[utf8.encode(sb.toString())];
@@ -90,24 +90,27 @@
     });
 
     test('returns path when binary does not exist by default but exists in M1 homebrew bin', () async {
-      String path = '$kM1BrewBinPath/ideviceinstaller';
+      final String path = '$kM1BrewBinPath/ideviceinstaller';
       output = <List<int>>[utf8.encode(path)];
-      Process processM1 = FakeProcess(0, out: output);
-      Process processDefault = FakeProcess(1, out: <List<int>>[]);
+      final Process processM1 = FakeProcess(0, out: output);
+      final Process processDefault = FakeProcess(1, out: <List<int>>[]);
       when(processManager.start(<String>['which', 'ideviceinstaller'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(processDefault));
-      when(processManager.start(<String>['which', '$kM1BrewBinPath/ideviceinstaller'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(processM1));
+      when(
+        processManager.start(
+          <String>['which', '$kM1BrewBinPath/ideviceinstaller'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(processM1));
 
       final String result = await getMacBinaryPath('ideviceinstaller', processManager: processManager);
       expect(result, '$kM1BrewBinPath/ideviceinstaller');
     });
 
     test('returns path when binary exists by default', () async {
-      String path = '/abc/def/ideviceinstaller';
+      const String path = '/abc/def/ideviceinstaller';
       output = <List<int>>[utf8.encode(path)];
-      Process process = FakeProcess(0, out: output);
+      final Process process = FakeProcess(0, out: output);
       when(processManager.start(<String>['which', 'ideviceinstaller'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(process));
 
@@ -116,13 +119,16 @@
     });
 
     test('throws exception when binary does not exist in any location', () async {
-      Process processM1 = FakeProcess(1, out: <List<int>>[]);
-      Process processDefault = FakeProcess(1, out: <List<int>>[]);
+      final Process processM1 = FakeProcess(1, out: <List<int>>[]);
+      final Process processDefault = FakeProcess(1, out: <List<int>>[]);
       when(processManager.start(<String>['which', 'ideviceinstaller'], workingDirectory: anyNamed('workingDirectory')))
           .thenAnswer((_) => Future.value(processDefault));
-      when(processManager.start(<String>['which', '$kM1BrewBinPath/ideviceinstaller'],
-              workingDirectory: anyNamed('workingDirectory')))
-          .thenAnswer((_) => Future.value(processM1));
+      when(
+        processManager.start(
+          <String>['which', '$kM1BrewBinPath/ideviceinstaller'],
+          workingDirectory: anyNamed('workingDirectory'),
+        ),
+      ).thenAnswer((_) => Future.value(processM1));
 
       expect(
         getMacBinaryPath('ideviceinstaller', processManager: processManager),
diff --git a/licenses/check_licenses.dart b/licenses/check_licenses.dart
index eb7e02f..3a9ae9c 100644
--- a/licenses/check_licenses.dart
+++ b/licenses/check_licenses.dart
@@ -24,7 +24,7 @@
 }
 
 Future<void> run(List<String> arguments) async {
-  String cocoonPath = path.join(path.dirname(Platform.script.path), '..');
+  final String cocoonPath = path.join(path.dirname(Platform.script.path), '..');
   print('$clock Root path: $cocoonPath');
   print('$clock Licenses...');
   await verifyNoMissingLicense(cocoonPath);
@@ -40,37 +40,93 @@
 Future<void> verifyNoMissingLicense(String workingDirectory, {bool checkMinimums = true}) async {
   final int? overrideMinimumMatches = checkMinimums ? null : 0;
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'dart', overrideMinimumMatches ?? 2000, _generateLicense('// '));
+    workingDirectory,
+    'dart',
+    overrideMinimumMatches ?? 2000,
+    _generateLicense('// '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'java', overrideMinimumMatches ?? 39, _generateLicense('// '));
+    workingDirectory,
+    'java',
+    overrideMinimumMatches ?? 39,
+    _generateLicense('// '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'h', overrideMinimumMatches ?? 30, _generateLicense('// '));
+    workingDirectory,
+    'h',
+    overrideMinimumMatches ?? 30,
+    _generateLicense('// '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'm', overrideMinimumMatches ?? 30, _generateLicense('// '));
+    workingDirectory,
+    'm',
+    overrideMinimumMatches ?? 30,
+    _generateLicense('// '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'swift', overrideMinimumMatches ?? 10, _generateLicense('// '));
+    workingDirectory,
+    'swift',
+    overrideMinimumMatches ?? 10,
+    _generateLicense('// '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'gradle', overrideMinimumMatches ?? 100, _generateLicense('// '));
+    workingDirectory,
+    'gradle',
+    overrideMinimumMatches ?? 100,
+    _generateLicense('// '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'gn', overrideMinimumMatches ?? 0, _generateLicense('# '));
+    workingDirectory,
+    'gn',
+    overrideMinimumMatches ?? 0,
+    _generateLicense('# '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'Dockerfile', overrideMinimumMatches ?? 1, _generateLicense('# '));
+    workingDirectory,
+    'Dockerfile',
+    overrideMinimumMatches ?? 1,
+    _generateLicense('# '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'sh', overrideMinimumMatches ?? 1, '#!/bin/bash\n' + _generateLicense('# '));
+    workingDirectory,
+    'sh',
+    overrideMinimumMatches ?? 1,
+    '#!/bin/bash\n' + _generateLicense('# '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'bat', overrideMinimumMatches ?? 1, _generateLicense(':: '));
+    workingDirectory,
+    'bat',
+    overrideMinimumMatches ?? 1,
+    _generateLicense(':: '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'ps1', overrideMinimumMatches ?? 1, _generateLicense('# '));
+    workingDirectory,
+    'ps1',
+    overrideMinimumMatches ?? 1,
+    _generateLicense('# '),
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'html', overrideMinimumMatches ?? 1, '<!-- ${_generateLicense('')} -->',
-      trailingBlank: false);
+    workingDirectory,
+    'html',
+    overrideMinimumMatches ?? 1,
+    '<!-- ${_generateLicense('')} -->',
+    trailingBlank: false,
+  );
   await _verifyNoMissingLicenseForExtension(
-      workingDirectory, 'xml', overrideMinimumMatches ?? 1, '<!-- ${_generateLicense('')} -->');
+    workingDirectory,
+    'xml',
+    overrideMinimumMatches ?? 1,
+    '<!-- ${_generateLicense('')} -->',
+  );
 }
 
 Future<void> _verifyNoMissingLicenseForExtension(
-    String workingDirectory, String extension, int minimumMatches, String license,
-    {bool trailingBlank = true}) async {
+  String workingDirectory,
+  String extension,
+  int minimumMatches,
+  String license, {
+  bool trailingBlank = true,
+}) async {
   assert(!license.endsWith('\n'));
   final String licensePattern = license + '\n' + (trailingBlank ? '\n' : '');
   final List<String> errors = <String>[];
@@ -129,8 +185,10 @@
       pending.addAll(entity.listSync());
     }
   }
-  assert(matches >= minimumMatches,
-      'Expected to find at least $minimumMatches files with extension ".$extension" in "$workingDirectory", but only found $matches.');
+  assert(
+    matches >= minimumMatches,
+    'Expected to find at least $minimumMatches files with extension ".$extension" in "$workingDirectory", but only found $matches.',
+  );
 }
 
 bool _isPartOfAppTemplate(Directory directory) {
diff --git a/test_utilities/bin/global_test_runner.dart b/test_utilities/bin/global_test_runner.dart
index 30511b0..142ae14 100755
--- a/test_utilities/bin/global_test_runner.dart
+++ b/test_utilities/bin/global_test_runner.dart
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'dart:async';
 import 'dart:io';
 import 'package:args/args.dart';
 import 'package:yaml/yaml.dart';
@@ -9,32 +10,34 @@
 
 // Runs all the configured tests for cocoon repo.
 Future<Null> main(List<String> rawArgs) async {
-  ArgParser argParser = ArgParser()..addOption('tests-file', abbr: 't', defaultsTo: '../tests.yaml');
-  ArgResults args = argParser.parse(rawArgs);
+  final ArgParser argParser = ArgParser()..addOption('tests-file', abbr: 't', defaultsTo: '../tests.yaml');
+  final ArgResults args = argParser.parse(rawArgs);
 
   // Load tests yaml file.
-  File file = File(args['tests-file']);
-  var doc = loadYaml(file.readAsStringSync());
+  final File file = File(args['tests-file']);
+  final doc = loadYaml(file.readAsStringSync());
   // Execute the tests
-  String baseDir = normalize(join(dirname(Platform.script.toFilePath()), '..', '..'));
-  String prepareScriptPath = join(baseDir, 'test_utilities', 'bin', 'prepare_environment.sh');
+  final String baseDir = normalize(join(dirname(Platform.script.toFilePath()), '..', '..'));
+  final String prepareScriptPath = join(baseDir, 'test_utilities', 'bin', 'prepare_environment.sh');
   await runShellCommand(<String>[prepareScriptPath], 'prepare environment');
   doc['tasks'].forEach((task) async {
-    String scriptPath = join(baseDir, task['script']);
-    String taskPath = join(baseDir, task['task']);
+    final String scriptPath = join(baseDir, task['script']);
+    final String taskPath = join(baseDir, task['task']);
     await runShellCommand(<String>[scriptPath, taskPath], task['task']);
   });
 }
 
 void runShellCommand(List<String> args, String taskName) async {
-  Process.run('sh', args).then((result) {
-    stdout.writeln('.. stdout ..');
-    stdout.writeln(result.stdout);
-    stdout.writeln('.. stderr ..');
-    stderr.writeln(result.stderr);
-    if (result.exitCode != 0) {
-      stderr.writeln('There were failures running tests from $taskName');
-      exit(result.exitCode);
-    }
-  });
+  unawaited(
+    Process.run('sh', args).then((result) {
+      stdout.writeln('.. stdout ..');
+      stdout.writeln(result.stdout);
+      stdout.writeln('.. stderr ..');
+      stderr.writeln(result.stderr);
+      if (result.exitCode != 0) {
+        stderr.writeln('There were failures running tests from $taskName');
+        exit(result.exitCode);
+      }
+    }),
+  );
 }
