diff --git a/app_dart/bin/gae_server.dart b/app_dart/bin/gae_server.dart
index 378f1f2..29ff48d 100644
--- a/app_dart/bin/gae_server.dart
+++ b/app_dart/bin/gae_server.dart
@@ -7,7 +7,11 @@
 import 'package:appengine/appengine.dart';
 import 'package:cocoon_service/cocoon_service.dart';
 import 'package:cocoon_service/server.dart';
+import 'package:cocoon_service/src/service/build_bucket_v2_client.dart';
 import 'package:cocoon_service/src/service/commit_service.dart';
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart';
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
 import 'package:gcloud/db.dart';
 
 Future<void> main() async {
@@ -18,15 +22,28 @@
     final Config config = Config(dbService, cache);
     final AuthenticationProvider authProvider = AuthenticationProvider(config: config);
     final AuthenticationProvider swarmingAuthProvider = SwarmingAuthenticationProvider(config: config);
+
     final BuildBucketClient buildBucketClient = BuildBucketClient(
       accessTokenService: AccessTokenService.defaultProvider(config),
     );
 
+    final BuildBucketV2Client buildBucketV2Client = BuildBucketV2Client(
+      accessTokenService: AccessTokenService.defaultProvider(config),
+    );
+
     /// LUCI service class to communicate with buildBucket service.
     final LuciBuildService luciBuildService = LuciBuildService(
       config: config,
       cache: cache,
       buildBucketClient: buildBucketClient,
+      buildBucketV2Client: buildBucketV2Client,
+      pubsub: const PubSub(),
+    );
+
+    final LuciBuildServiceV2 luciBuildServiceV2 = LuciBuildServiceV2(
+      config: config,
+      cache: cache,
+      buildBucketV2Client: buildBucketV2Client,
       pubsub: const PubSub(),
     );
 
@@ -35,6 +52,10 @@
       config,
     );
 
+    final GithubChecksServiceV2 githubChecksServiceV2 = GithubChecksServiceV2(
+      config,
+    );
+
     // Gerrit service class to communicate with GoB.
     final GerritService gerritService = GerritService(config: config);
 
@@ -46,6 +67,13 @@
       luciBuildService: luciBuildService,
     );
 
+    final SchedulerV2 schedulerV2 = SchedulerV2(
+      cache: cache,
+      config: config,
+      githubChecksService: githubChecksServiceV2,
+      luciBuildService: luciBuildServiceV2,
+    );
+
     final BranchService branchService = BranchService(
       config: config,
       gerritService: gerritService,
@@ -59,10 +87,14 @@
       authProvider: authProvider,
       branchService: branchService,
       buildBucketClient: buildBucketClient,
+      buildBucketV2Client: buildBucketV2Client,
       gerritService: gerritService,
       scheduler: scheduler,
+      schedulerV2: schedulerV2,
       luciBuildService: luciBuildService,
+      luciBuildServiceV2: luciBuildServiceV2,
       githubChecksService: githubChecksService,
+      githubChecksServiceV2: githubChecksServiceV2,
       commitService: commitService,
       swarmingAuthProvider: swarmingAuthProvider,
     );
diff --git a/app_dart/bin/local_server.dart b/app_dart/bin/local_server.dart
index 0bd8bc1..db9cff1 100644
--- a/app_dart/bin/local_server.dart
+++ b/app_dart/bin/local_server.dart
@@ -8,8 +8,12 @@
 import 'package:cocoon_service/cocoon_service.dart';
 import 'package:cocoon_service/server.dart';
 import 'package:cocoon_service/src/model/appengine/cocoon_config.dart';
+import 'package:cocoon_service/src/service/build_bucket_v2_client.dart';
 import 'package:cocoon_service/src/service/commit_service.dart';
 import 'package:cocoon_service/src/service/datastore.dart';
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart';
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
 import 'package:gcloud/db.dart';
 
 import '../test/src/datastore/fake_datastore.dart';
@@ -25,15 +29,28 @@
   final Config config = Config(dbService, cache);
   final AuthenticationProvider authProvider = AuthenticationProvider(config: config);
   final AuthenticationProvider swarmingAuthProvider = SwarmingAuthenticationProvider(config: config);
+
   final BuildBucketClient buildBucketClient = BuildBucketClient(
     accessTokenService: AccessTokenService.defaultProvider(config),
   );
 
+  final BuildBucketV2Client buildBucketV2Client = BuildBucketV2Client(
+    accessTokenService: AccessTokenService.defaultProvider(config),
+  );
+
   /// LUCI service class to communicate with buildBucket service.
   final LuciBuildService luciBuildService = LuciBuildService(
     config: config,
     cache: cache,
     buildBucketClient: buildBucketClient,
+    buildBucketV2Client: buildBucketV2Client,
+    pubsub: const PubSub(),
+  );
+
+  final LuciBuildServiceV2 luciBuildServiceV2 = LuciBuildServiceV2(
+    config: config,
+    cache: cache,
+    buildBucketV2Client: buildBucketV2Client,
     pubsub: const PubSub(),
   );
 
@@ -42,6 +59,10 @@
     config,
   );
 
+  final GithubChecksServiceV2 githubChecksServiceV2 = GithubChecksServiceV2(
+    config,
+  );
+
   // Gerrit service class to communicate with GoB.
   final GerritService gerritService = GerritService(config: config);
 
@@ -53,6 +74,13 @@
     luciBuildService: luciBuildService,
   );
 
+  final SchedulerV2 schedulerV2 = SchedulerV2(
+    cache: cache,
+    config: config,
+    githubChecksService: githubChecksServiceV2,
+    luciBuildService: luciBuildServiceV2,
+  );
+
   final BranchService branchService = BranchService(
     config: config,
     gerritService: gerritService,
@@ -66,10 +94,14 @@
     authProvider: authProvider,
     branchService: branchService,
     buildBucketClient: buildBucketClient,
+    buildBucketV2Client: buildBucketV2Client,
     gerritService: gerritService,
     scheduler: scheduler,
+    schedulerV2: schedulerV2,
     luciBuildService: luciBuildService,
+    luciBuildServiceV2: luciBuildServiceV2,
     githubChecksService: githubChecksService,
+    githubChecksServiceV2: githubChecksServiceV2,
     commitService: commitService,
     swarmingAuthProvider: swarmingAuthProvider,
   );
diff --git a/app_dart/lib/server.dart b/app_dart/lib/server.dart
index 540a3e4..fa5495f 100644
--- a/app_dart/lib/server.dart
+++ b/app_dart/lib/server.dart
@@ -6,7 +6,18 @@
 import 'dart:math';
 
 import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/request_handlers/postsubmit_luci_subscription_v2.dart';
+import 'package:cocoon_service/src/request_handlers/presubmit_luci_subscription_v2.dart';
+import 'package:cocoon_service/src/request_handlers/reset_prod_task_v2.dart';
+import 'package:cocoon_service/src/request_handlers/reset_try_task_v2.dart';
+import 'package:cocoon_service/src/request_handlers/scheduler/batch_backfiller_v2.dart';
+import 'package:cocoon_service/src/request_handlers/scheduler/scheduler_request_subscription.dart';
+import 'package:cocoon_service/src/request_handlers/vacuum_github_commits_v2.dart';
+import 'package:cocoon_service/src/service/build_bucket_v2_client.dart';
 import 'package:cocoon_service/src/service/commit_service.dart';
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart';
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
 
 typedef Server = Future<void> Function(HttpRequest);
 
@@ -18,11 +29,15 @@
   required AuthenticationProvider swarmingAuthProvider,
   required BranchService branchService,
   required BuildBucketClient buildBucketClient,
+  required BuildBucketV2Client buildBucketV2Client,
   required LuciBuildService luciBuildService,
+  required LuciBuildServiceV2 luciBuildServiceV2,
   required GithubChecksService githubChecksService,
+  required GithubChecksServiceV2 githubChecksServiceV2,
   required CommitService commitService,
   required GerritService gerritService,
   required Scheduler scheduler,
+  required SchedulerV2 schedulerV2,
 }) {
   final Map<String, RequestHandler<dynamic>> handlers = <String, RequestHandler<dynamic>>{
     '/api/check_flaky_builders': CheckFlakyBuilders(
@@ -37,7 +52,7 @@
     '/api/dart-internal-subscription': DartInternalSubscription(
       cache: cache,
       config: config,
-      buildBucketClient: buildBucketClient,
+      buildBucketV2Client: buildBucketV2Client,
     ),
     '/api/file_flaky_issue_and_pr': FileFlakyIssueAndPR(
       config: config,
@@ -65,24 +80,36 @@
       config: config,
       cache: cache,
       gerritService: gerritService,
-      githubChecksService: githubChecksService,
       scheduler: scheduler,
+      schedulerV2: schedulerV2,
       commitService: commitService,
     ),
     '/api/presubmit-luci-subscription': PresubmitLuciSubscription(
       cache: cache,
       config: config,
-      buildBucketClient: buildBucketClient,
       luciBuildService: luciBuildService,
       githubChecksService: githubChecksService,
       scheduler: scheduler,
     ),
+    '/api/v2/presubmit-luci-subscription': PresubmitLuciSubscriptionV2(
+      cache: cache,
+      config: config,
+      luciBuildService: luciBuildServiceV2,
+      githubChecksService: githubChecksServiceV2,
+      scheduler: schedulerV2,
+    ),
     '/api/postsubmit-luci-subscription': PostsubmitLuciSubscription(
       cache: cache,
       config: config,
       scheduler: scheduler,
       githubChecksService: githubChecksService,
     ),
+    '/api/v2/postsubmit-luci-subscription': PostsubmitLuciSubscriptionV2(
+      cache: cache,
+      config: config,
+      scheduler: schedulerV2,
+      githubChecksService: githubChecksServiceV2,
+    ),
     '/api/push-build-status-to-github': PushBuildStatusToGithub(
       config: config,
       authenticationProvider: authProvider,
@@ -91,26 +118,47 @@
       config: config,
       authenticationProvider: authProvider,
     ),
+    // I do not believe these recieve a build message.
     '/api/reset-prod-task': ResetProdTask(
       config: config,
       authenticationProvider: authProvider,
       luciBuildService: luciBuildService,
       scheduler: scheduler,
     ),
+    '/api/v2/reset-prod-task': ResetProdTaskV2(
+      config: config,
+      authenticationProvider: authProvider,
+      luciBuildService: luciBuildServiceV2,
+      scheduler: schedulerV2,
+    ),
     '/api/reset-try-task': ResetTryTask(
       config: config,
       authenticationProvider: authProvider,
       scheduler: scheduler,
     ),
+    '/api/v2/reset-try-task': ResetTryTaskV2(
+      config: config,
+      authenticationProvider: authProvider,
+      scheduler: schedulerV2,
+    ),
     '/api/scheduler/batch-backfiller': BatchBackfiller(
       config: config,
       scheduler: scheduler,
     ),
+    '/api/v2/scheduler/batch-backfiller': BatchBackfillerV2(
+      config: config,
+      scheduler: schedulerV2,
+    ),
     '/api/scheduler/batch-request-subscription': SchedulerRequestSubscription(
       cache: cache,
       config: config,
       buildBucketClient: buildBucketClient,
     ),
+    '/api/v2/scheduler/batch-request-subscription': SchedulerRequestSubscriptionV2(
+      cache: cache,
+      config: config,
+      buildBucketClient: buildBucketV2Client,
+    ),
     '/api/scheduler/vacuum-stale-tasks': VacuumStaleTasks(
       config: config,
     ),
@@ -144,6 +192,11 @@
       authenticationProvider: authProvider,
       scheduler: scheduler,
     ),
+    '/api/v2/vacuum-github-commits': VacuumGithubCommitsV2(
+      config: config,
+      authenticationProvider: authProvider,
+      scheduler: schedulerV2,
+    ),
 
     /// Returns status of the framework tree.
     ///
diff --git a/app_dart/lib/src/request_handlers/dart_internal_subscription.dart b/app_dart/lib/src/request_handlers/dart_internal_subscription.dart
index 4c12be2..35a12e5 100644
--- a/app_dart/lib/src/request_handlers/dart_internal_subscription.dart
+++ b/app_dart/lib/src/request_handlers/dart_internal_subscription.dart
@@ -2,16 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// import 'package:cocoon_service/src/model/luci/buildbucket.dart';
 import 'dart:convert';
-
-import 'package:cocoon_service/src/model/luci/buildbucket.dart';
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:fixnum/fixnum.dart';
 import 'package:googleapis/firestore/v1.dart';
 import 'package:meta/meta.dart';
 
 import '../../cocoon_service.dart';
 import '../model/appengine/task.dart';
 import '../model/firestore/task.dart' as firestore;
-import '../request_handling/subscription_handler.dart';
+import '../request_handling/subscription_handler_v2.dart';
+import '../service/build_bucket_v2_client.dart';
 import '../service/datastore.dart';
 import '../service/logging.dart';
 
@@ -24,18 +26,18 @@
 /// The PubSub subscription is set up here:
 /// https://console.cloud.google.com/cloudpubsub/subscription/detail/dart-internal-build-results-sub?project=flutter-dashboard
 @immutable
-class DartInternalSubscription extends SubscriptionHandler {
+class DartInternalSubscription extends SubscriptionHandlerV2 {
   /// Creates an endpoint for listening for dart-internal build results.
   /// The message should contain a single buildbucket id
   const DartInternalSubscription({
     required super.cache,
     required super.config,
     super.authProvider,
-    required this.buildBucketClient,
+    required this.buildBucketV2Client,
     @visibleForTesting this.datastoreProvider = DatastoreService.defaultProvider,
   }) : super(subscriptionName: 'dart-internal-build-results-sub');
 
-  final BuildBucketClient buildBucketClient;
+  final BuildBucketV2Client buildBucketV2Client;
   final DatastoreServiceProvider datastoreProvider;
 
   @override
@@ -47,17 +49,19 @@
       return Body.empty;
     }
 
-    final dynamic buildData = json.decode(message.data!);
-    log.info('Build data json: $buildData');
+    // This looks to be like we are simply getting the build and not the top level
+    // buildsPubSub message.
+    final Map<String, dynamic> jsonBuildMap = json.decode(message.data!);
 
-    if (buildData['build'] == null) {
+    if (jsonBuildMap['build'] == null) {
       log.info('no build information in message');
       return Body.empty;
     }
 
-    final String project = buildData['build']['builder']['project'];
-    final String bucket = buildData['build']['builder']['bucket'];
-    final String builder = buildData['build']['builder']['builder'];
+    final String project = jsonBuildMap['build']['builder']['project'];
+    final String bucket = jsonBuildMap['build']['builder']['bucket'];
+    final String builder = jsonBuildMap['build']['builder']['builder'];
+    final Int64 buildId = Int64.parseInt(jsonBuildMap['build']['id']);
 
     // This should already be covered by the pubsub filter, but adding an additional check
     // to ensure we don't process builds that aren't from dart-internal/flutter.
@@ -76,28 +80,31 @@
       return Body.empty;
     }
 
-    final String buildbucketId = buildData['build']['id'];
-    log.info('Creating build request object with build id $buildbucketId');
-    final GetBuildRequest request = GetBuildRequest(
-      id: buildbucketId,
+    log.info('Creating build request object with build id $buildId');
+
+    final bbv2.GetBuildRequest getBuildRequest = bbv2.GetBuildRequest(
+      id: buildId,
     );
 
     log.info(
-      'Calling buildbucket api to get build data for build $buildbucketId',
+      'Calling buildbucket api to get build data for build $buildId',
     );
-    final Build build = await buildBucketClient.getBuild(request);
+
+    final bbv2.Build existingBuild = await buildBucketV2Client.getBuild(getBuildRequest);
+
+    log.info('Got back existing builder with name: ${existingBuild.builder.builder}');
 
     log.info('Checking for existing task in datastore');
-    final Task? existingTask = await datastore.getTaskFromBuildbucketBuild(build);
+    final Task? existingTask = await datastore.getTaskFromBuildbucketV2Build(existingBuild);
 
     late Task taskToInsert;
     if (existingTask != null) {
-      log.info('Updating Task from existing Task');
-      existingTask.updateFromBuildbucketBuild(build);
+      log.info('Updating Task from existing Build');
+      existingTask.updateFromBuildbucketV2Build(existingBuild);
       taskToInsert = existingTask;
     } else {
       log.info('Creating Task from Buildbucket result');
-      taskToInsert = await Task.fromBuildbucketBuild(build, datastore);
+      taskToInsert = await Task.fromBuildbucketV2Build(existingBuild, datastore);
     }
 
     log.info('Inserting Task into the datastore: ${taskToInsert.toString()}');
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 1b94f14..24704e7 100644
--- a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart
+++ b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart
@@ -5,6 +5,8 @@
 import 'dart:convert';
 
 import 'package:cocoon_service/src/service/commit_service.dart';
+import 'package:cocoon_service/src/service/scheduler.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
 import 'package:github/github.dart';
 import 'package:github/hooks.dart';
 import 'package:meta/meta.dart';
@@ -18,9 +20,7 @@
 import '../../service/config.dart';
 import '../../service/datastore.dart';
 import '../../service/gerrit_service.dart';
-import '../../service/github_checks_service.dart';
 import '../../service/logging.dart';
-import '../../service/scheduler.dart';
 
 // Filenames which are not actually tests.
 const List<String> kNotActuallyATest = <String>[
@@ -68,14 +68,17 @@
     required super.cache,
     required super.config,
     required this.scheduler,
+    required this.schedulerV2,
     required this.gerritService,
     required this.commitService,
-    this.githubChecksService,
     this.datastoreProvider = DatastoreService.defaultProvider,
     super.authProvider,
+    // Gets the initial github events from this sub after the webhook uploads them.
   }) : super(subscriptionName: 'github-webhooks-sub');
 
   /// Cocoon scheduler to trigger tasks against changes from GitHub.
+  final SchedulerV2 schedulerV2;
+
   final Scheduler scheduler;
 
   /// To verify whether a commit was mirrored to GoB.
@@ -84,9 +87,6 @@
   /// Used to handle push events and create commits based on those events.
   final CommitService commitService;
 
-  /// To provide build status updates to GitHub pull requests.
-  final GithubChecksService? githubChecksService;
-
   final DatastoreServiceProvider datastoreProvider;
 
   @override
@@ -107,7 +107,7 @@
       case 'check_run':
         final Map<String, dynamic> event = jsonDecode(webhook.payload) as Map<String, dynamic>;
         final cocoon_checks.CheckRunEvent checkRunEvent = cocoon_checks.CheckRunEvent.fromJson(event);
-        if (await scheduler.processCheckRun(checkRunEvent) == false) {
+        if (await schedulerV2.processCheckRun(checkRunEvent) == false) {
           throw InternalServerError('Failed to process check_run event. checkRunEvent: $checkRunEvent');
         }
         break;
@@ -164,7 +164,7 @@
         // If it was closed without merging, cancel any outstanding tryjobs.
         // We'll leave unfinished jobs if it was merged since we care about those
         // results.
-        await scheduler.cancelPreSubmitTargets(
+        await schedulerV2.cancelPreSubmitTargets(
           pullRequest: pr,
           reason: (!pr.merged!) ? 'Pull request closed' : 'Pull request merged',
         );
@@ -173,7 +173,7 @@
           log.fine('Pull request ${pr.number} was closed and merged.');
           if (await _commitExistsInGob(pr)) {
             log.fine('Merged commit was found on GoB mirror. Scheduling postsubmit tasks...');
-            return scheduler.addPullRequest(pr);
+            return schedulerV2.addPullRequest(pr);
           }
           throw InternalServerError(
             '${pr.mergeCommitSha!} was not found on GoB. Failing so this event can be retried...',
@@ -246,7 +246,7 @@
       return;
     }
 
-    await scheduler.triggerPresubmitTargets(pullRequest: pr);
+    await schedulerV2.triggerPresubmitTargets(pullRequest: pr);
   }
 
   /// Release tooling generates cherrypick pull requests that should be granted an approval.
diff --git a/app_dart/lib/src/request_handlers/postsubmit_luci_subscription_v2.dart b/app_dart/lib/src/request_handlers/postsubmit_luci_subscription_v2.dart
new file mode 100644
index 0000000..866187d
--- /dev/null
+++ b/app_dart/lib/src/request_handlers/postsubmit_luci_subscription_v2.dart
@@ -0,0 +1,174 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/ci_yaml.dart';
+import 'package:cocoon_service/src/model/luci/user_data.dart';
+import 'package:gcloud/db.dart';
+import 'package:googleapis/firestore/v1.dart' hide Status;
+import 'package:meta/meta.dart';
+
+import '../model/appengine/commit.dart';
+import '../model/appengine/task.dart';
+import '../model/firestore/task.dart' as firestore;
+import '../request_handling/body.dart';
+import '../request_handling/exceptions.dart';
+import '../request_handling/subscription_handler_v2.dart';
+import '../service/datastore.dart';
+import '../service/firestore.dart';
+import '../service/logging.dart';
+import '../service/github_checks_service_v2.dart';
+import '../service/scheduler_v2.dart';
+
+/// An endpoint for listening to build updates for postsubmit builds.
+///
+/// The PubSub subscription is set up here:
+/// https://cloud.google.com/cloudpubsub/subscription/detail/build-bucket-postsubmit-sub?project=flutter-dashboard&tab=overview
+///
+/// This endpoint is responsible for updating Datastore with the result of builds from LUCI.
+@immutable
+class PostsubmitLuciSubscriptionV2 extends SubscriptionHandlerV2 {
+  /// Creates an endpoint for listening to LUCI status updates.
+  const PostsubmitLuciSubscriptionV2({
+    required super.cache,
+    required super.config,
+    super.authProvider,
+    @visibleForTesting this.datastoreProvider = DatastoreService.defaultProvider,
+    required this.scheduler,
+    required this.githubChecksService,
+  }) : super(subscriptionName: 'build-bucket-postsubmit-sub');
+
+  final DatastoreServiceProvider datastoreProvider;
+  final SchedulerV2 scheduler;
+  final GithubChecksServiceV2 githubChecksService;
+
+  @override
+  Future<Body> post() async {
+    if (message.data == null) {
+      log.info('no data in message');
+      return Body.empty;
+    }
+
+    final DatastoreService datastore = datastoreProvider(config.db);
+    final FirestoreService firestoreService = await config.createFirestoreService();
+
+    final bbv2.PubSubCallBack pubSubCallBack = bbv2.PubSubCallBack();
+    pubSubCallBack.mergeFromProto3Json(jsonDecode(message.data!) as Map<String, dynamic>);
+    final bbv2.BuildsV2PubSub buildsV2PubSub = pubSubCallBack.buildPubsub;
+
+    Map<String, dynamic> userDataMap = <String, dynamic>{};
+    try {
+      userDataMap = json.decode(String.fromCharCodes(pubSubCallBack.userData));
+      log.info('User data was not base64 encoded.');
+    } on FormatException {
+      userDataMap = UserData.decodeUserDataBytes(pubSubCallBack.userData);
+      log.info('Decoding base64 encoded user data.');
+    }
+
+    // collect userData
+    if (userDataMap.isEmpty) {
+      log.info('User data is empty');
+      return Body.empty;
+    }
+
+    log.fine('userData=$userDataMap');
+
+    if (!buildsV2PubSub.hasBuild()) {
+      log.warning('No build was found in message.');
+      return Body.empty;
+    }
+
+    final bbv2.Build build = buildsV2PubSub.build;
+    // Note that result is no longer present in the output.
+    log.fine('Updating buildId=${build.id} for result=${build.status}');
+
+    log.info('build ${build.toProto3Json()}');
+
+    final String? rawTaskKey = userDataMap['task_key'] as String?;
+    final String? rawCommitKey = userDataMap['commit_key'] as String?;
+    final String? taskDocumentName = userDataMap['firestore_task_document_name'] as String?;
+    if (taskDocumentName == null) {
+      throw const BadRequestException('userData does not contain firestore_task_document_name');
+    }
+
+    final Key<String> commitKey = Key<String>(Key<dynamic>.emptyKey(Partition(null)), Commit, rawCommitKey);
+    Task? task;
+    firestore.Task? firestoreTask;
+    log.info('Looking up task document $kDatabase/documents/${firestore.kTaskCollectionId}/$taskDocumentName...');
+    final int taskId = int.parse(rawTaskKey!);
+    final Key<int> taskKey = Key<int>(commitKey, Task, taskId);
+    task = await datastore.lookupByValue<Task>(taskKey);
+    firestoreTask = await firestore.Task.fromFirestore(
+      firestoreService: firestoreService,
+      documentName: '$kDatabase/documents/${firestore.kTaskCollectionId}/$taskDocumentName',
+    );
+    log.info('Found $firestoreTask');
+
+    if (_shouldUpdateTask(build, firestoreTask)) {
+      final String oldTaskStatus = firestoreTask.status;
+      firestoreTask.updateFromBuildV2(build);
+
+      log.info('Updated firestore task $firestoreTask');
+
+      task.updateFromBuildbucketV2Build(build);
+      await datastore.insert(<Task>[task]);
+      final List<Write> writes = documentsToWrites([firestoreTask], exists: true);
+      await firestoreService.batchWriteDocuments(BatchWriteRequest(writes: writes), kDatabase);
+      log.fine('Updated datastore from $oldTaskStatus to ${firestoreTask.status}');
+    } else {
+      log.fine('skip processing for build with status scheduled or task with status finished.');
+    }
+
+    final Commit commit = await datastore.lookupByValue<Commit>(commitKey);
+    final CiYaml ciYaml = await scheduler.getCiYaml(commit);
+    final List<Target> postsubmitTargets = ciYaml.postsubmitTargets;
+    if (!postsubmitTargets.any((element) => element.value.name == firestoreTask!.taskName)) {
+      log.warning('Target ${firestoreTask.taskName} has been deleted from TOT. Skip updating.');
+      return Body.empty;
+    }
+    final Target target =
+        postsubmitTargets.singleWhere((Target target) => target.value.name == firestoreTask!.taskName);
+    if (firestoreTask.status == firestore.Task.statusFailed ||
+        firestoreTask.status == firestore.Task.statusInfraFailure ||
+        firestoreTask.status == firestore.Task.statusCancelled) {
+      log.fine('Trying to auto-retry...');
+      final bool retried = await scheduler.luciBuildService.checkRerunBuilder(
+        commit: commit,
+        target: target,
+        task: task,
+        datastore: datastore,
+        taskDocument: firestoreTask,
+        firestoreService: firestoreService,
+      );
+      log.info('Retried: $retried');
+    }
+
+    // Only update GitHub checks if target is not bringup
+    if (target.value.bringup == false && config.postsubmitSupportedRepos.contains(target.slug)) {
+      log.info('Updating check status for ${target.getTestName}');
+      await githubChecksService.updateCheckStatus(
+        build: build,
+        userDataMap: userDataMap,
+        luciBuildService: scheduler.luciBuildService,
+        slug: commit.slug,
+      );
+    }
+
+    return Body.empty;
+  }
+
+  // No need to update task in datastore if
+  // 1) the build is `scheduled`. Task is marked as `In Progress`
+  //    whenever scheduled, either from scheduler/backfiller/rerun. We need to update
+  //    task in datastore only for
+  //    a) `started`: update info like builder number.
+  //    b) `completed`: update info like status.
+  // 2) the task is already completed.
+  //    The task may have been marked as completed from test framework via update-task-status API.
+  bool _shouldUpdateTask(bbv2.Build build, firestore.Task task) {
+    return build.status != bbv2.Status.SCHEDULED && !firestore.Task.finishedStatusValues.contains(task.status);
+  }
+}
diff --git a/app_dart/lib/src/request_handlers/presubmit_luci_subscription.dart b/app_dart/lib/src/request_handlers/presubmit_luci_subscription.dart
index 8049eb2..ecdba75 100644
--- a/app_dart/lib/src/request_handlers/presubmit_luci_subscription.dart
+++ b/app_dart/lib/src/request_handlers/presubmit_luci_subscription.dart
@@ -12,7 +12,6 @@
 import '../request_handling/authentication.dart';
 import '../request_handling/body.dart';
 import '../request_handling/subscription_handler.dart';
-import '../service/buildbucket.dart';
 import '../service/config.dart';
 import '../service/github_checks_service.dart';
 import '../service/logging.dart';
@@ -37,14 +36,12 @@
   const PresubmitLuciSubscription({
     required super.cache,
     required super.config,
-    required this.buildBucketClient,
     required this.scheduler,
     required this.luciBuildService,
     required this.githubChecksService,
     AuthenticationProvider? authProvider,
   }) : super(subscriptionName: 'github-updater');
 
-  final BuildBucketClient buildBucketClient;
   final LuciBuildService luciBuildService;
   final GithubChecksService githubChecksService;
   final Scheduler scheduler;
@@ -96,13 +93,6 @@
     return Body.empty;
   }
 
-  /// Gets target's allowed reschedule attempt.
-  ///
-  /// Each target can define their own allowed max number of reschedule attemp, and it
-  /// is defined as a property `presubmit_max_attempts`.
-  ///
-  /// If not property is defined, the target doesn't allow a reschedule after failures.
-  /// Typically the property will be used for targets that are likely flaky.
   Future<int> _getMaxAttempt(
     BuildPushMessage buildPushMessage,
     RepositorySlug slug,
diff --git a/app_dart/lib/src/request_handlers/presubmit_luci_subscription_v2.dart b/app_dart/lib/src/request_handlers/presubmit_luci_subscription_v2.dart
new file mode 100644
index 0000000..5964a01
--- /dev/null
+++ b/app_dart/lib/src/request_handlers/presubmit_luci_subscription_v2.dart
@@ -0,0 +1,168 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/src/model/luci/user_data.dart';
+import 'package:cocoon_service/src/request_handling/subscription_handler_v2.dart';
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart';
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
+import 'package:github/github.dart';
+import 'package:meta/meta.dart';
+
+import '../model/appengine/commit.dart';
+import '../model/ci_yaml/ci_yaml.dart';
+import '../model/ci_yaml/target.dart';
+import '../request_handling/authentication.dart';
+import '../request_handling/body.dart';
+import '../service/config.dart';
+import '../service/logging.dart';
+
+/// An endpoint for listening to LUCI status updates for scheduled builds.
+///
+/// [ScheduleBuildRequest.notify] property is set to tell LUCI to use this
+/// PubSub topic. LUCI then publishes updates about build status to that topic,
+/// which we listen to on the github-updater subscription. When new messages
+/// arrive, they are posted to this web service.
+///
+/// The PubSub subscription is set up here:
+/// https://console.cloud.google.com/cloudpubsub/subscription/detail/build-bucket-presubmit-sub?project=flutter-dashboard
+///
+/// This endpoint is responsible for updating GitHub with the status of
+/// completed builds from LUCI.
+@immutable
+class PresubmitLuciSubscriptionV2 extends SubscriptionHandlerV2 {
+  /// Creates an endpoint for listening to LUCI status updates.
+  const PresubmitLuciSubscriptionV2({
+    required super.cache,
+    required super.config,
+    required this.scheduler,
+    required this.luciBuildService,
+    required this.githubChecksService,
+    AuthenticationProvider? authProvider,
+  }) : super(subscriptionName: 'build-bucket-presubmit-sub');
+
+  final LuciBuildServiceV2 luciBuildService;
+  final GithubChecksServiceV2 githubChecksService;
+  final SchedulerV2 scheduler;
+
+  @override
+  Future<Body> post() async {
+    if (message.data == null) {
+      log.info('no data in message');
+      return Body.empty;
+    }
+
+    final bbv2.PubSubCallBack pubSubCallBack = bbv2.PubSubCallBack();
+    pubSubCallBack.mergeFromProto3Json(jsonDecode(message.data!) as Map<String, dynamic>);
+
+    final bbv2.BuildsV2PubSub buildsV2PubSub = pubSubCallBack.buildPubsub;
+
+    if (!buildsV2PubSub.hasBuild()) {
+      log.info('no build information in message');
+      return Body.empty;
+    }
+
+    final bbv2.Build build = buildsV2PubSub.build;
+
+    final String builderName = build.builder.builder;
+
+    final List<bbv2.StringPair> tags = build.tags;
+
+    log.fine('Available tags: ${tags.toString()}');
+
+    // Skip status update if we can not get the sha tag.
+    if (tags.where((element) => element.key == 'buildset').isEmpty) {
+      log.warning('Buildset tag not included, skipping Status Updates');
+      return Body.empty;
+    }
+
+    log.fine('Setting status (${build.status.toString()}) for $builderName');
+
+    if (!pubSubCallBack.hasUserData()) {
+      log.info('No user data was found in this request');
+      return Body.empty;
+    }
+
+    Map<String, dynamic> userDataMap = <String, dynamic>{};
+    try {
+      userDataMap = json.decode(String.fromCharCodes(pubSubCallBack.userData));
+      log.info('User data was not base64 encoded.');
+    } on FormatException {
+      userDataMap = UserData.decodeUserDataBytes(pubSubCallBack.userData);
+      log.info('Decoding base64 encoded user data.');
+    }
+
+    if (userDataMap.containsKey('repo_owner') && userDataMap.containsKey('repo_name')) {
+      final RepositorySlug slug =
+          RepositorySlug(userDataMap['repo_owner'] as String, userDataMap['repo_name'] as String);
+
+      bool rescheduled = false;
+      if (githubChecksService.taskFailed(build.status)) {
+        final int currentAttempt = githubChecksService.currentAttempt(tags);
+        final int maxAttempt = await _getMaxAttemptV2(
+          userDataMap,
+          slug,
+          builderName,
+        );
+        if (currentAttempt < maxAttempt) {
+          rescheduled = true;
+          log.fine('Rerunning failed task: $builderName');
+          await luciBuildService.rescheduleBuild(
+            builderName: builderName,
+            build: build,
+            rescheduleAttempt: currentAttempt + 1,
+            userDataMap: userDataMap,
+          );
+        }
+      }
+      await githubChecksService.updateCheckStatus(
+        build: build,
+        userDataMap: userDataMap,
+        luciBuildService: luciBuildService,
+        slug: slug,
+        rescheduled: rescheduled,
+      );
+    } else {
+      log.info('This repo does not support checks API');
+    }
+    return Body.empty;
+  }
+
+  Future<int> _getMaxAttemptV2(
+    Map<String, dynamic> userData,
+    RepositorySlug slug,
+    String builderName,
+  ) async {
+    final Commit commit = Commit(
+      branch: userData['commit_branch'] as String,
+      repository: slug.fullName,
+      sha: userData['commit_sha'] as String,
+    );
+    late CiYaml ciYaml;
+    if (commit.branch == Config.defaultBranch(commit.slug)) {
+      ciYaml = await scheduler.getCiYaml(commit, validate: true);
+    } else {
+      ciYaml = await scheduler.getCiYaml(commit);
+    }
+
+    // Do not block on the target not found.
+    if (!ciYaml.presubmitTargets.any((element) => element.value.name == builderName)) {
+      // do not reschedule
+      log.warning('Did not find builder with name: $builderName in ciYaml for ${commit.sha}');
+      final List<String> availableBuilderList = ciYaml.presubmitTargets.map((Target e) => e.value.name).toList();
+      log.warning('ciYaml presubmit targets found: $availableBuilderList');
+      return 1;
+    }
+
+    final Target target = ciYaml.presubmitTargets.where((element) => element.value.name == builderName).single;
+    final Map<String, Object> properties = target.getProperties();
+    if (!properties.containsKey('presubmit_max_attempts')) {
+      return 1;
+    }
+    return properties['presubmit_max_attempts'] as int;
+  }
+}
diff --git a/app_dart/lib/src/request_handlers/reset_prod_task.dart b/app_dart/lib/src/request_handlers/reset_prod_task.dart
index 402a372..f6bae84 100644
--- a/app_dart/lib/src/request_handlers/reset_prod_task.dart
+++ b/app_dart/lib/src/request_handlers/reset_prod_task.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 
+import 'package:cocoon_service/cocoon_service.dart';
 import 'package:gcloud/db.dart';
 import 'package:github/github.dart';
 import 'package:meta/meta.dart';
@@ -16,13 +17,8 @@
 import '../model/ci_yaml/target.dart';
 import '../model/google/token_info.dart';
 import '../request_handling/api_request_handler.dart';
-import '../request_handling/body.dart';
 import '../request_handling/exceptions.dart';
-import '../service/config.dart';
 import '../service/datastore.dart';
-import '../service/firestore.dart';
-import '../service/luci_build_service.dart';
-import '../service/scheduler.dart';
 import '../service/logging.dart';
 
 /// Reruns a postsubmit LUCI build.
@@ -88,7 +84,7 @@
         gitBranch: branch!,
         sha: sha!,
       );
-      final tasks = await datastore.db.query<Task>(ancestorKey: commitKey).run().toList();
+      final List<Task> tasks = await datastore.db.query<Task>(ancestorKey: commitKey).run().toList();
       final List<Future<void>> futures = <Future<void>>[];
       for (final Task task in tasks) {
         if (!Task.taskFailStatusSet.contains(task.status)) continue;
@@ -161,12 +157,16 @@
       final int currentAttempt = task.attempts!;
       taskDocumentName = '$kDatabase/documents/${firestore.kTaskCollectionId}/${sha}_${taskName}_$currentAttempt';
     }
-    taskDocument =
-        await firestore.Task.fromFirestore(firestoreService: firestoreService, documentName: taskDocumentName);
+    taskDocument = await firestore.Task.fromFirestore(
+      firestoreService: firestoreService,
+      documentName: taskDocumentName,
+    );
+
     final Map<String, List<String>> tags = <String, List<String>>{
       'triggered_by': <String>[email],
       'trigger_type': <String>['manual_retry'],
     };
+
     final bool isRerunning = await luciBuildService.checkRerunBuilder(
       commit: commit,
       task: task,
diff --git a/app_dart/lib/src/request_handlers/reset_prod_task_v2.dart b/app_dart/lib/src/request_handlers/reset_prod_task_v2.dart
new file mode 100644
index 0000000..ce25a1a
--- /dev/null
+++ b/app_dart/lib/src/request_handlers/reset_prod_task_v2.dart
@@ -0,0 +1,226 @@
+// Copyright 2020 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
+import 'package:gcloud/db.dart';
+import 'package:github/github.dart';
+import 'package:meta/meta.dart';
+
+import '../model/appengine/commit.dart';
+import '../model/appengine/key_helper.dart';
+import '../model/appengine/task.dart';
+import '../model/firestore/task.dart' as firestore;
+import '../model/ci_yaml/ci_yaml.dart';
+import '../model/ci_yaml/target.dart';
+import '../model/google/token_info.dart';
+import '../request_handling/api_request_handler.dart';
+import '../request_handling/body.dart';
+import '../request_handling/exceptions.dart';
+import '../service/config.dart';
+import '../service/datastore.dart';
+import '../service/firestore.dart';
+
+/// Reruns a postsubmit LUCI build.
+///
+/// Expects either [taskKeyParam] or a set of params that give enough detail to lookup a task in datastore.
+@immutable
+class ResetProdTaskV2 extends ApiRequestHandler<Body> {
+  const ResetProdTaskV2({
+    required super.config,
+    required super.authenticationProvider,
+    required this.luciBuildService,
+    required this.scheduler,
+    @visibleForTesting DatastoreServiceProvider? datastoreProvider,
+  }) : datastoreProvider = datastoreProvider ?? DatastoreService.defaultProvider;
+
+  final DatastoreServiceProvider datastoreProvider;
+  final LuciBuildServiceV2 luciBuildService;
+  final SchedulerV2 scheduler;
+
+  static const String branchParam = 'Branch';
+  static const String taskKeyParam = 'Key';
+  static const String ownerParam = 'Owner';
+  static const String repoParam = 'Repo';
+  static const String commitShaParam = 'Commit';
+  static const String taskDocumentNameParam = 'taskDocumentName';
+
+  /// Name of the task to be retried.
+  ///
+  /// If "all" is given, all failed tasks will be retried. This enables
+  /// oncalls to quickly recover a commit without the tedium of the UI.
+  static const String taskParam = 'Task';
+
+  @override
+  Future<Body> post() async {
+    final DatastoreService datastore = datastoreProvider(config.db);
+    final FirestoreService firestoreService = await config.createFirestoreService();
+    final String? encodedKey = requestData![taskKeyParam] as String?;
+    String? branch = requestData![branchParam] as String?;
+    final String owner = requestData![ownerParam] as String? ?? 'flutter';
+    final String? repo = requestData![repoParam] as String?;
+    final String? sha = requestData![commitShaParam] as String?;
+    final TokenInfo token = await tokenInfo(request!);
+    final String? taskName = requestData![taskParam] as String?;
+    // When Frontend is switched to Firstore, the task document name will be passed over.
+    final String? taskDocumentName = requestData![taskDocumentNameParam] as String?;
+
+    RepositorySlug? slug;
+    if (encodedKey != null && encodedKey.isNotEmpty) {
+      // Check params required for dashboard.
+      checkRequiredParameters(<String>[taskKeyParam]);
+    } else {
+      // Checks params required when this API is called with curl.
+      checkRequiredParameters(<String>[commitShaParam, taskParam, repoParam]);
+      slug = RepositorySlug(owner, repo!);
+      branch ??= Config.defaultBranch(slug);
+    }
+
+    if (taskName == 'all') {
+      final Key<String> commitKey = Commit.createKey(
+        db: datastore.db,
+        slug: slug!,
+        gitBranch: branch!,
+        sha: sha!,
+      );
+      final List<Task> tasks = await datastore.db.query<Task>(ancestorKey: commitKey).run().toList();
+      final List<Future<void>> futures = <Future<void>>[];
+      for (final Task task in tasks) {
+        if (!Task.taskFailStatusSet.contains(task.status)) continue;
+        futures.add(
+          rerun(
+            datastore: datastore,
+            firestoreService: firestoreService,
+            branch: branch,
+            sha: sha,
+            taskName: task.name,
+            slug: slug,
+            email: token.email!,
+          ),
+        );
+      }
+      await Future.wait(futures);
+    } else {
+      await rerun(
+        datastore: datastore,
+        firestoreService: firestoreService,
+        encodedKey: encodedKey,
+        branch: branch,
+        sha: sha,
+        taskName: taskName,
+        taskDocumentName: taskDocumentName,
+        slug: slug,
+        email: token.email!,
+        ignoreChecks: true,
+      );
+    }
+
+    return Body.empty;
+  }
+
+  Future<void> rerun({
+    required DatastoreService datastore,
+    required FirestoreService firestoreService,
+    String? encodedKey,
+    String? branch,
+    String? sha,
+    String? taskName,
+    RepositorySlug? slug,
+    String? taskDocumentName,
+    required String email,
+    bool ignoreChecks = false,
+  }) async {
+    // Prepares Datastore task.
+    final Task task = await _getTaskFromNamedParams(
+      datastore: datastore,
+      encodedKey: encodedKey,
+      branch: branch,
+      name: taskName,
+      sha: sha,
+      slug: slug,
+    );
+    final Commit commit = await _getCommitFromTask(datastore, task);
+    sha ??= commit.id!.split('/').last;
+    taskName ??= task.name;
+
+    final CiYaml ciYaml = await scheduler.getCiYaml(commit);
+    final Target target = ciYaml.postsubmitTargets.singleWhere((Target target) => target.value.name == task.name);
+
+    // Prepares Firestore task.
+    firestore.Task? taskDocument;
+    if (taskDocumentName == null) {
+      final int currentAttempt = task.attempts!;
+      taskDocumentName = '$kDatabase/documents/${firestore.kTaskCollectionId}/${sha}_${taskName}_$currentAttempt';
+    }
+    taskDocument = await firestore.Task.fromFirestore(
+      firestoreService: firestoreService,
+      documentName: taskDocumentName,
+    );
+
+    final List<bbv2.StringPair> tags = <bbv2.StringPair>[
+      bbv2.StringPair(
+        key: 'triggered_by',
+        value: email,
+      ),
+      bbv2.StringPair(
+        key: 'trigger_type',
+        value: 'manual_retry',
+      ),
+    ];
+
+    final bool isRerunning = await luciBuildService.checkRerunBuilder(
+      commit: commit,
+      task: task,
+      target: target,
+      datastore: datastore,
+      tags: tags,
+      ignoreChecks: ignoreChecks,
+      firestoreService: firestoreService,
+      taskDocument: taskDocument,
+    );
+
+    // For human retries from the dashboard, notify if a task failed to rerun.
+    if (ignoreChecks && isRerunning == false) {
+      throw InternalServerError('Failed to rerun $taskName');
+    }
+  }
+
+  /// Retrieve [Task] from [DatastoreService] from either an encoded key or commit + task name info.
+  ///
+  /// If [encodedKey] is passed, [KeyHelper] will decode it directly and return the associated entity.
+  ///
+  /// Otherwise, [name], [branch], [sha], and [slug] must be passed to find the [Task].
+  Future<Task> _getTaskFromNamedParams({
+    required DatastoreService datastore,
+    String? encodedKey,
+    String? branch,
+    String? name,
+    String? sha,
+    RepositorySlug? slug,
+  }) async {
+    if (encodedKey != null && encodedKey.isNotEmpty) {
+      final Key<int> key = config.keyHelper.decode(encodedKey) as Key<int>;
+      return datastore.lookupByValue<Task>(key);
+    }
+    final Key<String> commitKey = Commit.createKey(
+      db: datastore.db,
+      slug: slug!,
+      gitBranch: branch!,
+      sha: sha!,
+    );
+    return Task.fromDatastore(
+      datastore: datastore,
+      commitKey: commitKey,
+      name: name!,
+    );
+  }
+
+  /// Returns the [Commit] associated with [Task].
+  Future<Commit> _getCommitFromTask(DatastoreService datastore, Task task) async {
+    return (await datastore.lookupByKey<Commit>(<Key<dynamic>>[task.parentKey!])).single!;
+  }
+}
diff --git a/app_dart/lib/src/request_handlers/reset_try_task_v2.dart b/app_dart/lib/src/request_handlers/reset_try_task_v2.dart
new file mode 100644
index 0000000..3278b18
--- /dev/null
+++ b/app_dart/lib/src/request_handlers/reset_try_task_v2.dart
@@ -0,0 +1,62 @@
+// Copyright 2020 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
+import 'package:github/github.dart';
+import 'package:meta/meta.dart';
+
+import '../../cocoon_service.dart';
+import '../request_handling/api_request_handler.dart';
+import '../request_handling/exceptions.dart';
+
+/// Runs all the applicable tasks for a given PR and commit hash. This will be
+/// used to unblock rollers when creating a new commit is not possible.
+@immutable
+class ResetTryTaskV2 extends ApiRequestHandler<Body> {
+  const ResetTryTaskV2({
+    required super.config,
+    required super.authenticationProvider,
+    required this.scheduler,
+  });
+
+  final SchedulerV2 scheduler;
+
+  static const String kOwnerParam = 'owner';
+  static const String kRepoParam = 'repo';
+  static const String kPullRequestNumberParam = 'pr';
+  static const String kBuilderParam = 'builders';
+
+  @override
+  Future<Body> get() async {
+    checkRequiredQueryParameters(<String>[kRepoParam, kPullRequestNumberParam]);
+    final String owner = request!.uri.queryParameters[kOwnerParam] ?? 'flutter';
+    final String repo = request!.uri.queryParameters[kRepoParam]!;
+    final String pr = request!.uri.queryParameters[kPullRequestNumberParam]!;
+    final String builders = request!.uri.queryParameters[kBuilderParam] ?? '';
+    final List<String> builderList = getBuilderList(builders);
+
+    final int? prNumber = int.tryParse(pr);
+    if (prNumber == null) {
+      throw const BadRequestException('$kPullRequestNumberParam must be a number');
+    }
+    final RepositorySlug slug = RepositorySlug(owner, repo);
+    final GitHub github = await config.createGitHubClient(slug: slug);
+    final PullRequest pullRequest = await github.pullRequests.get(slug, prNumber);
+    await scheduler.triggerPresubmitTargets(pullRequest: pullRequest, builderTriggerList: builderList);
+    return Body.empty;
+  }
+
+  /// Parses [builders] to a String list.
+  ///
+  /// The [builders] parameter is expecting comma joined string, e.g. 'builder1, builder2'.
+  /// Returns an empty list if no [builders] is specified.
+  List<String> getBuilderList(String builders) {
+    if (builders.isEmpty) {
+      return <String>[];
+    }
+    return builders.split(',').map((String builder) => builder.trim()).toList();
+  }
+}
diff --git a/app_dart/lib/src/request_handlers/scheduler/batch_backfiller_v2.dart b/app_dart/lib/src/request_handlers/scheduler/batch_backfiller_v2.dart
new file mode 100644
index 0000000..8a9710c
--- /dev/null
+++ b/app_dart/lib/src/request_handlers/scheduler/batch_backfiller_v2.dart
@@ -0,0 +1,261 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/model/appengine/task.dart';
+import 'package:cocoon_service/src/model/firestore/task.dart' as firestore;
+import 'package:cocoon_service/src/service/datastore.dart';
+import 'package:cocoon_service/src/service/scheduler/policy.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
+import 'package:gcloud/db.dart';
+import 'package:github/github.dart';
+import 'package:googleapis/firestore/v1.dart';
+import 'package:meta/meta.dart';
+import 'package:retry/retry.dart';
+
+import '../../model/ci_yaml/ci_yaml.dart';
+import '../../model/ci_yaml/target.dart';
+import '../../request_handling/exceptions.dart';
+import '../../service/logging.dart';
+
+/// Cron request handler for scheduling targets when capacity becomes available.
+///
+/// Targets that have a [BatchPolicy] need to have backfilling enabled to ensure that ToT is always being tested.
+@immutable
+class BatchBackfillerV2 extends RequestHandler {
+  /// Creates a subscription for sending BuildBucket requests.
+  const BatchBackfillerV2({
+    required super.config,
+    required this.scheduler,
+    @visibleForTesting this.datastoreProvider = DatastoreService.defaultProvider,
+  });
+
+  final DatastoreServiceProvider datastoreProvider;
+  final SchedulerV2 scheduler;
+
+  @override
+  Future<Body> get() async {
+    final List<Future<void>> futures = <Future<void>>[];
+
+    for (RepositorySlug slug in config.supportedRepos) {
+      futures.add(backfillRepository(slug));
+    }
+
+    // Process all repos asynchronously
+    await Future.wait<void>(futures);
+
+    return Body.empty;
+  }
+
+  Future<void> backfillRepository(RepositorySlug slug) async {
+    final DatastoreService datastore = datastoreProvider(config.db);
+    final List<FullTask> tasks =
+        await (datastore.queryRecentTasks(slug: slug, commitLimit: config.backfillerCommitLimit)).toList();
+
+    // Construct Task columns to scan for backfilling
+    final Map<String, List<FullTask>> taskMap = <String, List<FullTask>>{};
+    for (FullTask fullTask in tasks) {
+      if (taskMap.containsKey(fullTask.task.name)) {
+        taskMap[fullTask.task.name]!.add(fullTask);
+      } else {
+        taskMap[fullTask.task.name!] = <FullTask>[fullTask];
+      }
+    }
+
+    // Check if should be scheduled (there is no yellow runs). Run the most recent gray.
+    List<Tuple<Target, FullTask, int>> backfill = <Tuple<Target, FullTask, int>>[];
+    for (List<FullTask> taskColumn in taskMap.values) {
+      final FullTask task = taskColumn.first;
+      final CiYaml ciYaml = await scheduler.getCiYaml(task.commit);
+      final List<Target> ciYamlTargets = ciYaml.backfillTargets;
+      // Skips scheduling if the task is not in TOT commit anymore.
+      final bool taskInToT = ciYamlTargets.map((Target target) => target.value.name).toList().contains(task.task.name);
+      if (!taskInToT) {
+        continue;
+      }
+      final Target target = ciYamlTargets.singleWhere((target) => target.value.name == task.task.name);
+      if (target.schedulerPolicy is! BatchPolicy) {
+        continue;
+      }
+      final FullTask? backfillTask = _backfillTask(target, taskColumn);
+      final int? priority = backfillPriority(taskColumn.map((e) => e.task).toList());
+      if (priority != null && backfillTask != null) {
+        backfill.add(Tuple<Target, FullTask, int>(target, backfillTask, priority));
+      }
+    }
+
+    // Get the number of targets to be backfilled in each cycle.
+    backfill = getFilteredBackfill(backfill);
+
+    log.fine('Backfilling ${backfill.length} builds');
+    log.fine(backfill.map<String>((Tuple<Target, FullTask, int> tuple) => tuple.first.value.name));
+
+    // Update tasks status as in progress to avoid duplicate scheduling.
+    final List<Task> backfillTasks = backfill.map((Tuple<Target, FullTask, int> tuple) => tuple.second.task).toList();
+    try {
+      await datastore.withTransaction<void>((Transaction transaction) async {
+        transaction.queueMutations(inserts: backfillTasks);
+        await transaction.commit();
+        log.fine(
+          'Updated ${backfillTasks.length} tasks: ${backfillTasks.map((e) => e.name).toList()} when backfilling.',
+        );
+      });
+      // TODO(keyonghan): remove try catch logic after validated to work.
+      try {
+        await updateTaskDocuments(backfillTasks);
+      } catch (error) {
+        log.warning('Failed to update batch backfilled task documents in Firestore: $error');
+      }
+
+      // Schedule all builds asynchronously.
+      // Schedule after db updates to avoid duplicate scheduling when db update fails.
+      await _scheduleWithRetries(backfill);
+    } catch (error) {
+      log.severe('Failed to update tasks when backfilling: $error');
+    }
+  }
+
+  /// Updates task documents in Firestore.
+  Future<void> updateTaskDocuments(List<Task> tasks) async {
+    if (tasks.isEmpty) {
+      return;
+    }
+    final List<firestore.Task> taskDocuments = tasks.map((e) => firestore.taskToDocument(e)).toList();
+    final List<Write> writes = documentsToWrites(taskDocuments, exists: true);
+    final FirestoreService firestoreService = await config.createFirestoreService();
+    await firestoreService.writeViaTransaction(writes);
+  }
+
+  /// Filters [config.backfillerTargetLimit] targets to backfill.
+  ///
+  /// High priority targets will be guranteed to get back filled first. If more targets
+  /// than [config.backfillerTargetLimit], pick the limited number of targets after a
+  /// shuffle. This is to make sure all targets are picked with the same chance.
+  List<Tuple<Target, FullTask, int>> getFilteredBackfill(List<Tuple<Target, FullTask, int>> backfill) {
+    if (backfill.length <= config.backfillerTargetLimit) {
+      return backfill;
+    }
+    final List<Tuple<Target, FullTask, int>> filteredBackfill = <Tuple<Target, FullTask, int>>[];
+    final List<Tuple<Target, FullTask, int>> highPriorityBackfill =
+        backfill.where((element) => element.third == LuciBuildService.kRerunPriority).toList();
+    final List<Tuple<Target, FullTask, int>> normalPriorityBackfill =
+        backfill.where((element) => element.third != LuciBuildService.kRerunPriority).toList();
+    if (highPriorityBackfill.length >= config.backfillerTargetLimit) {
+      highPriorityBackfill.shuffle();
+      filteredBackfill.addAll(highPriorityBackfill.sublist(0, config.backfillerTargetLimit));
+    } else {
+      filteredBackfill.addAll(highPriorityBackfill);
+      normalPriorityBackfill.shuffle();
+      filteredBackfill
+          .addAll(normalPriorityBackfill.sublist(0, config.backfillerTargetLimit - highPriorityBackfill.length));
+    }
+    return filteredBackfill;
+  }
+
+  /// Schedules tasks with retry when hitting pub/sub server errors.
+  Future<void> _scheduleWithRetries(List<Tuple<Target, FullTask, int>> backfill) async {
+    const RetryOptions retryOptions = Config.schedulerRetry;
+    try {
+      await retryOptions.retry(
+        () async {
+          final List<List<Tuple<Target, Task, int>>> tupleLists =
+              await Future.wait<List<Tuple<Target, Task, int>>>(backfillRequestList(backfill));
+          if (tupleLists.any((List<Tuple<Target, Task, int>> tupleList) => tupleList.isNotEmpty)) {
+            final int nonEmptyListLenght = tupleLists.where((element) => element.isNotEmpty).toList().length;
+            log.info('Backfill fails and retry backfilling $nonEmptyListLenght targets.');
+            backfill = _updateBackfill(backfill, tupleLists);
+            throw InternalServerError('Failed to backfill ${backfill.length} targets.');
+          }
+        },
+        retryIf: (Exception e) => e is InternalServerError,
+      );
+    } catch (error) {
+      log.severe('Failed to backfill ${backfill.length} targets due to error: $error');
+    }
+  }
+
+  /// Updates the [backfill] list with those that fail to get scheduled.
+  ///
+  /// [tupleLists] maintains the same tuple order as those in [backfill].
+  /// Each element from [backfill] is encapsulated as a list in [tupleLists] to prepare for
+  /// [scheduler.luciBuildService.schedulePostsubmitBuilds].
+  List<Tuple<Target, FullTask, int>> _updateBackfill(
+    List<Tuple<Target, FullTask, int>> backfill,
+    List<List<Tuple<Target, Task, int>>> tupleLists,
+  ) {
+    final List<Tuple<Target, FullTask, int>> updatedBackfill = <Tuple<Target, FullTask, int>>[];
+    for (int i = 0; i < tupleLists.length; i++) {
+      if (tupleLists[i].isNotEmpty) {
+        updatedBackfill.add(backfill[i]);
+      }
+    }
+    return updatedBackfill;
+  }
+
+  /// Creates a list of backfill requests.
+  List<Future<List<Tuple<Target, Task, int>>>> backfillRequestList(List<Tuple<Target, FullTask, int>> backfill) {
+    final List<Future<List<Tuple<Target, Task, int>>>> futures = <Future<List<Tuple<Target, Task, int>>>>[];
+    for (Tuple<Target, FullTask, int> tuple in backfill) {
+      // TODO(chillers): The backfill priority is always going to be low. If this is a ToT task, we should run it at the default priority.
+      final Tuple<Target, Task, int> toBeScheduled = Tuple(
+        tuple.first,
+        tuple.second.task,
+        tuple.third,
+      );
+      futures.add(
+        scheduler.luciBuildService.schedulePostsubmitBuilds(
+          commit: tuple.second.commit,
+          toBeScheduled: [toBeScheduled],
+        ),
+      );
+    }
+
+    return futures;
+  }
+
+  /// Returns priority for back filled targets.
+  ///
+  /// Skips scheduling newly created targets whose available entries are
+  /// less than `BatchPolicy.kBatchSize`.
+  ///
+  /// Uses a higher priority if there is an earlier failed build. Otherwise,
+  /// uses default `LuciBuildService.kBackfillPriority`
+  int? backfillPriority(List<Task> tasks) {
+    if (tasks.length < BatchPolicy.kBatchSize) {
+      return null;
+    }
+    if (shouldRerunPriority(tasks, BatchPolicy.kBatchSize)) {
+      return LuciBuildService.kRerunPriority;
+    }
+    return LuciBuildService.kBackfillPriority;
+  }
+
+  /// Returns the most recent [FullTask] to backfill.
+  ///
+  /// A [FullTask] is only returned iff:
+  ///   1. There are no running builds (yellow)
+  ///   2. There are tasks that haven't been run (gray)
+  ///
+  /// This is naive, and doesn't rely on knowing the actual Flutter infra capacity.
+  ///
+  /// Otherwise, returns null indicating nothing should be backfilled.
+  FullTask? _backfillTask(Target target, List<FullTask> tasks) {
+    final List<FullTask> relevantTasks = tasks.where((FullTask task) => task.task.name == target.value.name).toList();
+    if (relevantTasks.any((FullTask task) => task.task.status == Task.statusInProgress)) {
+      // Don't schedule more builds where there is already a running task
+      return null;
+    }
+
+    final List<FullTask> backfillTask =
+        relevantTasks.where((FullTask task) => task.task.status == Task.statusNew).toList();
+    if (backfillTask.isEmpty) {
+      return null;
+    }
+
+    // First item in the list is guranteed to be most recent.
+    // Mark task as in progress to ensure it isn't scheduled over
+    backfillTask.first.task.status = Task.statusInProgress;
+    return backfillTask.first;
+  }
+}
diff --git a/app_dart/lib/src/request_handlers/scheduler/scheduler_request_subscription.dart b/app_dart/lib/src/request_handlers/scheduler/scheduler_request_subscription.dart
new file mode 100644
index 0000000..44f505b
--- /dev/null
+++ b/app_dart/lib/src/request_handlers/scheduler/scheduler_request_subscription.dart
@@ -0,0 +1,124 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:cocoon_service/src/request_handling/subscription_handler_v2.dart';
+import 'package:meta/meta.dart';
+import 'package:retry/retry.dart';
+
+import '../../../cocoon_service.dart';
+import '../../service/build_bucket_v2_client.dart';
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import '../../request_handling/exceptions.dart';
+import '../../service/logging.dart';
+
+/// Subscription for making requests to BuildBucket.
+///
+/// The PubSub subscription is set up here:
+/// https://console.cloud.google.com/cloudpubsub/subscription/detail/cocoon-scheduler-requests?project=flutter-dashboard
+///
+/// This endpoint allows Cocoon to defer BuildBucket requests off the main request loop. This is critical when new
+/// commits are pushed, and they can schedule 100+ builds at once.
+///
+/// This endpoint takes in a POST request with the JSON of a [bbv2.BatchRequest]. In practice, the
+/// [bbv2.BatchRequest] should contain a single request.
+@immutable
+class SchedulerRequestSubscriptionV2 extends SubscriptionHandlerV2 {
+  /// Creates a subscription for sending BuildBucket requests.
+  const SchedulerRequestSubscriptionV2({
+    required super.cache,
+    required super.config,
+    required this.buildBucketClient,
+    super.authProvider,
+    this.retryOptions = Config.schedulerRetry,
+  }) : super(subscriptionName: 'cocoon-scheduler-requests-sub');
+
+  final BuildBucketV2Client buildBucketClient;
+
+  final RetryOptions retryOptions;
+
+  @override
+  Future<Body> post() async {
+    if (message.data == null) {
+      log.info('no data in message');
+      throw const BadRequestException('no data in message');
+    }
+
+    // final String data = message.data!;
+    log.fine('attempting to read message ${message.data}');
+
+    final bbv2.BatchRequest batchRequest = bbv2.BatchRequest.create();
+
+    // Merge from json only works with the integer field names.
+    batchRequest.mergeFromProto3Json(jsonDecode(message.data!) as Map<String, dynamic>);
+
+    log.info('Read the following data: ${batchRequest.toProto3Json().toString()}');
+
+    /// Retry scheduling builds upto 3 times.
+    ///
+    /// Log error message when still failing after retry. Avoid endless rescheduling
+    /// by acking the pub/sub message without throwing an exception.
+    String? unscheduledBuilds;
+    try {
+      await retryOptions.retry(
+        () async {
+          final List<bbv2.BatchRequest_Request> requestsToRetry = await _sendBatchRequest(batchRequest);
+
+          // Make a copy of the requests that are passed in as if simply access the list
+          // we make changes for all instances.
+          final List<bbv2.BatchRequest_Request> requestListCopy = [];
+          requestListCopy.addAll(requestsToRetry);
+          batchRequest.requests.clear();
+          batchRequest.requests.addAll(requestListCopy);
+
+          unscheduledBuilds = requestsToRetry.map((e) => e.scheduleBuild.builder).toString();
+          if (requestsToRetry.isNotEmpty) {
+            throw InternalServerError('Failed to schedule builds: $unscheduledBuilds.');
+          }
+        },
+        retryIf: (Exception e) => e is InternalServerError,
+      );
+    } catch (e) {
+      log.warning('Failed to schedule builds on exception: $unscheduledBuilds.');
+      return Body.forString('Failed to schedule builds: $unscheduledBuilds.');
+    }
+
+    return Body.empty;
+  }
+
+  /// Returns [List<bbv2.BatchRequest_Request>] of requests that need to be retried.
+  Future<List<bbv2.BatchRequest_Request>> _sendBatchRequest(bbv2.BatchRequest request) async {
+    log.info('Sending batch request for ${request.toProto3Json().toString()}');
+
+    bbv2.BatchResponse response;
+    try {
+      response = await buildBucketClient.batch(request);
+    } catch (e) {
+      log.severe('Exception making batch Requests.');
+      rethrow;
+    }
+
+    log.info('Made ${request.requests.length} and received ${response.responses.length}');
+    log.info('Responses: ${response.responses}');
+
+    // By default, retry everything. Then remove requests with a verified response.
+    // THese are the requests in the batch request object. Just requests.
+    final List<bbv2.BatchRequest_Request> retry = request.requests;
+
+    for (bbv2.BatchResponse_Response batchResponseResponse in response.responses) {
+      if (batchResponseResponse.hasScheduleBuild()) {
+        retry.removeWhere((element) => batchResponseResponse.scheduleBuild.builder == element.scheduleBuild.builder);
+      } else {
+        log.warning('Response does not have schedule build: $batchResponseResponse');
+      }
+
+      if (batchResponseResponse.hasError() && batchResponseResponse.error.code != 0) {
+        log.info('Non-zero grpc code: $batchResponseResponse');
+      }
+    }
+
+    return retry;
+  }
+}
diff --git a/app_dart/lib/src/request_handlers/vacuum_github_commits_v2.dart b/app_dart/lib/src/request_handlers/vacuum_github_commits_v2.dart
new file mode 100644
index 0000000..b283e6e
--- /dev/null
+++ b/app_dart/lib/src/request_handlers/vacuum_github_commits_v2.dart
@@ -0,0 +1,121 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
+import 'package:gcloud/db.dart';
+import 'package:github/github.dart' as gh;
+import 'package:meta/meta.dart';
+import 'package:truncate/truncate.dart';
+
+import '../model/appengine/commit.dart';
+import '../request_handling/api_request_handler.dart';
+import '../request_handling/body.dart';
+import '../service/config.dart';
+import '../service/datastore.dart';
+import '../service/github_service.dart';
+import '../service/logging.dart';
+
+/// Query GitHub for commits from the past day and ensure they exist in datastore.
+@immutable
+class VacuumGithubCommitsV2 extends ApiRequestHandler<Body> {
+  const VacuumGithubCommitsV2({
+    required super.config,
+    required super.authenticationProvider,
+    required this.scheduler,
+    @visibleForTesting this.datastoreProvider = DatastoreService.defaultProvider,
+  });
+
+  final DatastoreServiceProvider datastoreProvider;
+
+  final SchedulerV2 scheduler;
+
+  static const String branchParam = 'branch';
+
+  @override
+  Future<Body> get() async {
+    final DatastoreService datastore = datastoreProvider(config.db);
+
+    for (gh.RepositorySlug slug in config.supportedRepos) {
+      final String branch = request!.uri.queryParameters[branchParam] ?? Config.defaultBranch(slug);
+      await _vacuumRepository(slug, datastore: datastore, branch: branch);
+    }
+
+    return Body.empty;
+  }
+
+  Future<void> _vacuumRepository(
+    gh.RepositorySlug slug, {
+    DatastoreService? datastore,
+    required String branch,
+  }) async {
+    final GithubService githubService = await config.createGithubService(slug);
+    final List<Commit> commits = await _vacuumBranch(
+      slug,
+      branch,
+      datastore: datastore,
+      githubService: githubService,
+    );
+    await scheduler.addCommits(commits);
+  }
+
+  Future<List<Commit>> _vacuumBranch(
+    gh.RepositorySlug slug,
+    String branch, {
+    DatastoreService? datastore,
+    required GithubService githubService,
+  }) async {
+    List<gh.RepositoryCommit> commits = <gh.RepositoryCommit>[];
+    // Sliding window of times to add commits from.
+    final DateTime queryAfter = DateTime.now().subtract(const Duration(days: 1));
+    final DateTime queryBefore = DateTime.now().subtract(const Duration(minutes: 3));
+    try {
+      log.fine('Listing commit for slug: $slug branch: $branch and msSinceEpoch: ${queryAfter.millisecondsSinceEpoch}');
+      commits = await githubService.listBranchedCommits(slug, branch, queryAfter.millisecondsSinceEpoch);
+      log.fine('Retrieved ${commits.length} commits from GitHub');
+      // 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,
+          )
+          .toList();
+    } on gh.GitHubError catch (error) {
+      log.severe('$error');
+    }
+
+    return _toDatastoreCommit(slug, commits, datastore, branch);
+  }
+
+  /// Convert [gh.RepositoryCommit] to Cocoon's [Commit] format.
+  Future<List<Commit>> _toDatastoreCommit(
+    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,
+        ),
+      );
+    }
+    return recentCommits;
+  }
+}
diff --git a/app_dart/lib/src/service/build_bucket_v2_client.dart b/app_dart/lib/src/service/build_bucket_v2_client.dart
index 70527ee..71fe175 100644
--- a/app_dart/lib/src/service/build_bucket_v2_client.dart
+++ b/app_dart/lib/src/service/build_bucket_v2_client.dart
@@ -70,7 +70,6 @@
 
     log.info('Making bbv2 request with path: $url and body: $request');
 
-    //TODO most likely have issues here:
     final http.Response response = await httpClient.post(
       url,
       body: request,
diff --git a/app_dart/lib/src/service/github_checks_service_v2.dart b/app_dart/lib/src/service/github_checks_service_v2.dart
new file mode 100644
index 0000000..f0fffe7
--- /dev/null
+++ b/app_dart/lib/src/service/github_checks_service_v2.dart
@@ -0,0 +1,261 @@
+// Copyright 2020 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
+import 'package:github/github.dart' as github;
+import 'package:github/hooks.dart';
+
+import '../foundation/github_checks_util.dart';
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'config.dart';
+import 'github_service.dart';
+import 'logging.dart';
+import 'luci_build_service_v2.dart';
+
+const String kGithubSummary = '''
+**[Understanding a LUCI build failure](https://github.com/flutter/flutter/wiki/Understanding-a-LUCI-build-failure)**
+
+''';
+
+final List<bbv2.Status> terminalStatuses = [
+  bbv2.Status.CANCELED,
+  bbv2.Status.FAILURE,
+  bbv2.Status.INFRA_FAILURE,
+  bbv2.Status.SUCCESS,
+];
+
+/// Controls triggering builds and updating their status in the Github UI.
+class GithubChecksServiceV2 {
+  GithubChecksServiceV2(
+    this.config, {
+    GithubChecksUtil? githubChecksUtil,
+  }) : githubChecksUtil = githubChecksUtil ?? const GithubChecksUtil();
+
+  Config config;
+  GithubChecksUtil githubChecksUtil;
+
+  static Set<github.CheckRunConclusion> failedStatesSet = <github.CheckRunConclusion>{
+    github.CheckRunConclusion.cancelled,
+    github.CheckRunConclusion.failure,
+  };
+
+  /// Takes a [CheckSuiteEvent] and trigger all the relevant builds if this is a
+  /// new commit or only failed builds if the event was generated by a click on
+  /// the re-run all button in the Github UI.
+  /// Relevant API docs:
+  ///   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,
+    SchedulerV2 scheduler,
+  ) async {
+    switch (checkSuiteEvent.action) {
+      case 'requested':
+        // Trigger all try builders.
+        log.info('Check suite request for pull request ${pullRequest.number}, ${pullRequest.title}');
+        await scheduler.triggerPresubmitTargets(
+          pullRequest: pullRequest,
+        );
+        break;
+      case 'rerequested':
+        log.info('Check suite re-request for pull request ${pullRequest.number}, ${pullRequest.title}');
+        pullRequest.head = github.PullRequestHead(sha: checkSuiteEvent.checkSuite?.headSha);
+        return scheduler.retryPresubmitTargets(
+          pullRequest: pullRequest,
+          checkSuiteEvent: checkSuiteEvent,
+        );
+    }
+  }
+
+  /// Updates the Github build status using a [BuildPushMessage] sent by LUCI in
+  /// a pub/sub notification.
+  /// Relevant APIs:
+  ///   https://docs.github.com/en/rest/reference/checks#update-a-check-run
+  Future<bool> updateCheckStatus({
+    required bbv2.Build build,
+    required Map<String, dynamic> userDataMap,
+    required LuciBuildServiceV2 luciBuildService,
+    required github.RepositorySlug slug,
+    bool rescheduled = false,
+  }) async {
+    if (userDataMap.isEmpty) {
+      return false;
+    }
+
+    if (!userDataMap.containsKey('check_run_id') ||
+        !userDataMap.containsKey('repo_owner') ||
+        !userDataMap.containsKey('repo_name')) {
+      log.severe(
+        'UserData did not contain check_run_id,'
+        'repo_owner, or repo_name: $userDataMap',
+      );
+      return false;
+    }
+
+    github.CheckRunStatus status = statusForResult(build.status);
+    log.info('status for build ${build.id} is ${status.value}');
+
+    // Only `id` and `name` in the CheckRun are needed.
+    // Instead of making an API call to get the details of each check run, we
+    // generate the check run with only necessary info.
+    final github.CheckRun checkRun = github.CheckRun.fromJson({
+      'id': userDataMap['check_run_id'] as int?,
+      'status': status,
+      'check_suite': const {'id': null},
+      'started_at': build.startTime.toDateTime().toString(),
+      'conclusion': null,
+      'name': build.builder.builder,
+    });
+
+    github.CheckRunConclusion? conclusion =
+        (terminalStatuses.contains(build.status)) ? conclusionForResult(build.status) : null;
+    log.info('conclusion for build ${build.id} is ${(conclusion != null) ? conclusion.value : null}');
+
+    final String url = 'https://cr-buildbucket.appspot.com/build/${build.id}';
+    github.CheckRunOutput? output;
+    // If status has completed with failure then provide more details.
+    if (taskFailed(build.status)) {
+      log.info('failed presubmit task, ${build.id} has failed, status = ${build.status.toString()}');
+      if (rescheduled) {
+        status = github.CheckRunStatus.queued;
+        conclusion = null;
+        output = github.CheckRunOutput(
+          title: checkRun.name!,
+          summary: 'Note: this is an auto rerun. The timestamp above is based on the first attempt of this check run.',
+        );
+      } else {
+        // summaryMarkdown should be present
+        final bbv2.Build buildbucketBuild = await luciBuildService.getBuildById(
+          build.id,
+          buildMask: bbv2.BuildMask(
+            // Need to use allFields as there is a bug with fieldMask and summaryMarkdown.
+            allFields: true,
+          ),
+        );
+        output = github.CheckRunOutput(
+          title: checkRun.name!,
+          summary: getGithubSummary(buildbucketBuild.summaryMarkdown),
+        );
+        log.fine('Updating check run with output: [${output.toJson().toString()}]');
+      }
+    }
+    await githubChecksUtil.updateCheckRun(
+      config,
+      slug,
+      checkRun,
+      status: status,
+      conclusion: conclusion,
+      detailsUrl: url,
+      output: output,
+    );
+    return true;
+  }
+
+  /// Check if task has completed with failure.
+  bool taskFailed(bbv2.Status status) {
+    final github.CheckRunStatus checkRunStatus = statusForResult(status);
+    final github.CheckRunConclusion conclusion = conclusionForResult(status);
+    return (checkRunStatus == github.CheckRunStatus.completed) && failedStatesSet.contains(conclusion);
+  }
+
+  /// Returns current reschedule attempt.
+  ///
+  /// It returns 1 if this is the first run, and +1 with each reschedule.
+  int currentAttempt(final List<bbv2.StringPair> tags) {
+    final bbv2.StringPair attempt = tags.firstWhere(
+      (element) => element.key == 'current_attempt',
+      orElse: () => bbv2.StringPair().createEmptyInstance(),
+    );
+    if (!attempt.hasKey()) {
+      return 1;
+    } else {
+      return int.parse(attempt.value);
+    }
+  }
+
+  /// Appends triage wiki page to `summaryMarkdown` from LUCI build so that people can easily
+  /// reference from github check run page.
+  String getGithubSummary(String? summary) {
+    if (summary == null) {
+      return '${kGithubSummary}Empty summaryMarkdown';
+    }
+    // This is an imposed GitHub limit
+    const int checkSummaryLimit = 65535;
+    // This is to give buffer room incase GitHub lowers the amount.
+    const int checkSummaryBufferLimit = checkSummaryLimit - 10000 - kGithubSummary.length;
+    // Return the last [checkSummaryBufferLimit] characters as they are likely the most relevant.
+    if (summary.length > checkSummaryBufferLimit) {
+      final String truncatedSummary = summary.substring(summary.length - checkSummaryBufferLimit);
+      summary = '[TRUNCATED...] $truncatedSummary';
+    }
+    return '$kGithubSummary$summary';
+  }
+
+  /// Relevant APIs:
+  ///   https://developer.github.com/v3/checks/runs/#check-runs
+  github.CheckRunConclusion conclusionForResult(bbv2.Status status) {
+    if (status == bbv2.Status.CANCELED || status == bbv2.Status.FAILURE || status == bbv2.Status.INFRA_FAILURE) {
+      return github.CheckRunConclusion.failure;
+    } else if (status == bbv2.Status.SUCCESS) {
+      return github.CheckRunConclusion.success;
+    } else {
+      // Now that result is gone this is a non terminal step.
+      return github.CheckRunConclusion.empty;
+    }
+  }
+
+  /// Transforms a [push_message.Status] to a [github.CheckRunStatus].
+  /// Relevant APIs:
+  ///   https://developer.github.com/v3/checks/runs/#check-runs
+  // TODO temporary as this needs to be adjusted as a COMPLETED state is no longer
+  // a valid state from buildbucket v2.
+  github.CheckRunStatus statusForResult(bbv2.Status status) {
+    // ignore: exhaustive_cases
+    switch (status) {
+      case bbv2.Status.SUCCESS:
+      case bbv2.Status.FAILURE:
+      case bbv2.Status.CANCELED:
+      case bbv2.Status.INFRA_FAILURE:
+        return github.CheckRunStatus.completed;
+      case bbv2.Status.SCHEDULED:
+        return github.CheckRunStatus.queued;
+      case bbv2.Status.STARTED:
+        return github.CheckRunStatus.inProgress;
+      default:
+        throw StateError('unreachable');
+    }
+  }
+
+  /// Given a [headSha] and [checkSuiteId], finds the [PullRequest] that matches.
+  Future<github.PullRequest?> findMatchingPullRequest(
+    github.RepositorySlug slug,
+    String headSha,
+    int checkSuiteId,
+  ) async {
+    final GithubService githubService = await config.createDefaultGitHubService();
+
+    // There could be multiple PRs that have the same [headSha] commit.
+    final List<github.Issue> prIssues = await githubService.searchIssuesAndPRs(slug, '$headSha type:pr');
+
+    for (final prIssue in prIssues) {
+      final int prNumber = prIssue.number;
+
+      // Each PR can have multiple check suites.
+      final List<github.CheckSuite> checkSuites = await githubChecksUtil.listCheckSuitesForRef(
+        githubService.github,
+        slug,
+        ref: 'refs/pull/$prNumber/head',
+      );
+
+      // Use check suite ID equality to verify that we have iterated to the correct PR.
+      final bool doesPrIncludeMatchingCheckSuite = checkSuites.any((checkSuite) => checkSuite.id! == checkSuiteId);
+      if (doesPrIncludeMatchingCheckSuite) {
+        return githubService.getPullRequest(slug, prNumber);
+      }
+    }
+
+    return null;
+  }
+}
diff --git a/app_dart/lib/src/service/luci_build_service.dart b/app_dart/lib/src/service/luci_build_service.dart
index 25f42e6..a96fe71 100644
--- a/app_dart/lib/src/service/luci_build_service.dart
+++ b/app_dart/lib/src/service/luci_build_service.dart
@@ -8,10 +8,11 @@
 import 'dart:typed_data';
 
 import 'package:cocoon_service/cocoon_service.dart';
+import 'package:fixnum/fixnum.dart';
 import 'package:github/github.dart' as github;
 import 'package:github/hooks.dart';
 import 'package:googleapis/firestore/v1.dart' hide Status;
-import 'package:googleapis/pubsub/v1.dart';
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
 
 import '../foundation/github_checks_util.dart';
 import '../model/appengine/commit.dart';
@@ -20,10 +21,11 @@
 import '../model/firestore/task.dart' as firestore;
 import '../model/ci_yaml/target.dart';
 import '../model/github/checks.dart' as cocoon_checks;
-import '../model/luci/buildbucket.dart';
 import '../model/luci/push_message.dart' as push_message;
+import '../model/luci/buildbucket.dart';
 import '../service/datastore.dart';
 import '../service/logging.dart';
+import 'build_bucket_v2_client.dart';
 import 'exceptions.dart';
 import 'github_service.dart';
 
@@ -35,6 +37,7 @@
     required this.config,
     required this.cache,
     required this.buildBucketClient,
+    required this.buildBucketV2Client,
     GithubChecksUtil? githubChecksUtil,
     GerritService? gerritService,
     this.pubsub = const PubSub(),
@@ -42,6 +45,7 @@
         gerritService = gerritService ?? GerritService(config: config);
 
   BuildBucketClient buildBucketClient;
+  BuildBucketV2Client buildBucketV2Client;
   final CacheService cache;
   Config config;
   GithubChecksUtil githubChecksUtil;
@@ -49,7 +53,11 @@
 
   final PubSub pubsub;
 
-  static const Set<Status> failStatusSet = <Status>{Status.canceled, Status.failure, Status.infraFailure};
+  static const Set<Status> failStatusSet = <Status>{
+    Status.canceled,
+    Status.failure,
+    Status.infraFailure,
+  };
 
   static const int kBackfillPriority = 35;
   static const int kDefaultPriority = 30;
@@ -64,6 +72,7 @@
   /// Name of the subcache to store luci build related values in redis.
   static const String subCacheName = 'luci';
 
+  // the Request objects here are the BatchRequest object in bbv2.
   /// Shards [rows] into several sublists of size [maxEntityGroups].
   Future<List<List<Request>>> shard(List<Request> requests, int max) async {
     final List<List<Request>> shards = <List<Request>>[];
@@ -73,7 +82,10 @@
     return shards;
   }
 
-  /// Returns an Iterable of try BuildBucket build for a given Github [slug], [sha], [builderName].
+  /// Fetches an Iterable of try BuildBucket [Build]s.
+  ///
+  /// Returns a list of BuildBucket [Build]s for a given Github [slug], [sha],
+  /// and [builderName].
   Future<Iterable<Build>> getTryBuilds(
     github.RepositorySlug slug,
     String sha,
@@ -86,7 +98,31 @@
     return getBuilds(slug, sha, builderName, 'try', tags);
   }
 
-  /// Returns an Iterable of try Buildbucket [Build]s for a given [PullRequest].
+  /// Fetches an Iterable of try BuildBucket V2 [Build]s.
+  ///
+  /// Returns a list of BuildBucket [Build]s for a given Github [slug], [sha],
+  /// and [builderName].
+  Future<Iterable<bbv2.Build>> getTryBuildsV2(
+    github.RepositorySlug slug,
+    String sha,
+    String? builderName,
+  ) async {
+    final List<bbv2.StringPair> tags = [
+      bbv2.StringPair(key: 'buildset', value: 'sha/git/$sha'),
+      bbv2.StringPair(key: 'user_agent', value: 'flutter-cocoon'),
+    ];
+    return getBuildsV2(
+      slug,
+      sha,
+      builderName,
+      'try',
+      tags,
+    );
+  }
+
+  /// Fetches an Iterable of try BuildBucket [Build]s.
+  ///
+  /// Returns a list of BuildBucket [Build]s for a given Github [PullRequest].
   Future<Iterable<Build>> getTryBuildsByPullRequest(
     github.PullRequest pullRequest,
   ) async {
@@ -99,8 +135,32 @@
     return getBuilds(slug, null, null, 'try', tags);
   }
 
-  /// Returns an Iterable of prod BuildBucket build for a given Github [slug], [commitSha],
-  /// [builderName] and [repo].
+  /// Fetches an Iterable of try BuildBucket V2 [Build]s.
+  ///
+  /// Returns a list of BuildBucket V2 [Build]s for a given Github
+  /// [PullRequest].
+  Future<Iterable<bbv2.Build>> getTryBuildsByPullRequestV2(
+    github.PullRequest pullRequest,
+  ) async {
+    final github.RepositorySlug slug = pullRequest.base!.repo!.slug();
+    final List<bbv2.StringPair> tags = [
+      bbv2.StringPair(key: 'buildset', value: 'pr/git/${pullRequest.number}'),
+      bbv2.StringPair(key: 'github_link', value: 'https://github.com/${slug.fullName}/pull/${pullRequest.number}'),
+      bbv2.StringPair(key: 'user_agent', value: 'flutter-cocoon'),
+    ];
+    return getBuildsV2(
+      slug,
+      null,
+      null,
+      'try',
+      tags,
+    );
+  }
+
+  /// Fetches an Iterable of prod BuildBucket [Build]s.
+  ///
+  /// Returns an Iterable of prod BuildBucket [Build]s for a given Github
+  /// [slug], [sha], and [builderName].
   Future<Iterable<Build>> getProdBuilds(
     github.RepositorySlug slug,
     String commitSha,
@@ -110,8 +170,10 @@
     return getBuilds(slug, commitSha, builderName, 'prod', tags);
   }
 
-  /// Returns an iterable of BuildBucket builds for a given Github [slug], [commitSha],
-  /// [builderName], [bucket] and [tags].
+  /// Fetches an Iterable of try BuildBucket [Build]s.
+  ///
+  /// Returns an iterable of try BuildBucket [Build]s for a given Github [slug],
+  /// [sha], [builderName], [bucket], and [tags].
   Future<Iterable<Build>> getBuilds(
     github.RepositorySlug? slug,
     String? commitSha,
@@ -150,6 +212,62 @@
     return builds;
   }
 
+  Future<Iterable<bbv2.Build>> getBuildsV2(
+    github.RepositorySlug? slug,
+    String? commitSha,
+    String? builderName,
+    String bucket,
+    List<bbv2.StringPair> tags,
+  ) async {
+    // These paths are fields in the Build message.
+    final bbv2.FieldMask fieldMask = bbv2.FieldMask(
+      paths: {
+        'id',
+        'builder',
+        'tags',
+        'status',
+        'input.properties',
+      },
+    );
+
+    final bbv2.BuildMask buildMask = bbv2.BuildMask(fields: fieldMask);
+
+    final bbv2.BuildPredicate buildPredicate = bbv2.BuildPredicate(
+      builder: bbv2.BuilderID(
+        project: 'flutter',
+        bucket: bucket,
+        builder: builderName,
+      ),
+      tags: tags,
+    );
+
+    final bbv2.SearchBuildsRequest searchBuildsRequest = bbv2.SearchBuildsRequest(
+      predicate: buildPredicate,
+      mask: buildMask,
+    );
+
+    // Need to create one of these for each request in the batch.
+    final bbv2.BatchRequest_Request batchRequestRequest = bbv2.BatchRequest_Request(
+      searchBuilds: searchBuildsRequest,
+    );
+
+    final bbv2.BatchResponse batchResponse = await buildBucketV2Client.batch(
+      bbv2.BatchRequest(
+        requests: {batchRequestRequest},
+      ),
+    );
+
+    log.info('Reponses from get builds batch request = ${batchResponse.responses.length}');
+    for (bbv2.BatchResponse_Response response in batchResponse.responses) {
+      log.info('Found a response: ${response.toString()}');
+    }
+
+    final Iterable<bbv2.Build> builds = batchResponse.responses
+        .map((bbv2.BatchResponse_Response response) => response.searchBuilds)
+        .expand((bbv2.SearchBuildsResponse? response) => response!.builds);
+    return builds;
+  }
+
   /// Schedules presubmit [targets] on BuildBucket for [pullRequest].
   Future<List<Target>> scheduleTryBuilds({
     required List<Target> targets,
@@ -232,6 +350,7 @@
   /// Cancels all the current builds on [pullRequest] with [reason].
   ///
   /// Builds are queried based on the [RepositorySlug] and pull request number.
+  //
   Future<void> cancelBuilds(github.PullRequest pullRequest, String reason) async {
     log.info(
       'Attempting to cancel builds for pullrequest ${pullRequest.base!.repo!.fullName}/${pullRequest.number}',
@@ -266,6 +385,40 @@
     }
   }
 
+  Future<void> cancelBuildsV2(github.PullRequest pullRequest, String reason) async {
+    log.info(
+      'Attempting to cancel builds (v2) for pullrequest ${pullRequest.base!.repo!.fullName}/${pullRequest.number}',
+    );
+
+    final Iterable<bbv2.Build> builds = await getTryBuildsByPullRequestV2(pullRequest);
+    log.info('Found ${builds.length} builds.');
+
+    if (builds.isEmpty) {
+      log.warning('No builds were found for pull request ${pullRequest.base!.repo!.fullName}.');
+      return;
+    }
+
+    final List<bbv2.BatchRequest_Request> requests = <bbv2.BatchRequest_Request>[];
+    for (bbv2.Build build in builds) {
+      if (build.status == bbv2.Status.SCHEDULED || build.status == bbv2.Status.STARTED) {
+        // Scheduled status includes scheduled and pending tasks.
+        log.info('Cancelling build with build id ${build.id}.');
+        requests.add(
+          bbv2.BatchRequest_Request(
+            cancelBuild: bbv2.CancelBuildRequest(
+              id: build.id,
+              summaryMarkdown: reason,
+            ),
+          ),
+        );
+      }
+    }
+
+    if (requests.isNotEmpty) {
+      await buildBucketV2Client.batch(bbv2.BatchRequest(requests: requests));
+    }
+  }
+
   /// Filters [builders] to only those that failed on [pullRequest].
   Future<List<Build?>> failedBuilds(
     github.PullRequest pullRequest,
@@ -422,6 +575,12 @@
     return buildBucketClient.getBuild(request);
   }
 
+  // TODO
+  Future<bbv2.Build> getBuildByIdV2(Int64 id, {bbv2.BuildMask? buildMask}) async {
+    final bbv2.GetBuildRequest request = bbv2.GetBuildRequest(id: id, mask: buildMask);
+    return buildBucketV2Client.getBuild(request);
+  }
+
   /// Gets builder list whose config is pre-defined in LUCI.
   ///
   /// Returns cache if existing. Otherwise make the RPC call to fetch list.
diff --git a/app_dart/lib/src/service/luci_build_service_v2.dart b/app_dart/lib/src/service/luci_build_service_v2.dart
new file mode 100644
index 0000000..af7a1fb
--- /dev/null
+++ b/app_dart/lib/src/service/luci_build_service_v2.dart
@@ -0,0 +1,1023 @@
+// Copyright 2020 The Flutter Authors. All rights reserved.
+// 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:math';
+import 'dart:typed_data';
+
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:collection/collection.dart';
+import 'package:fixnum/fixnum.dart';
+import 'package:github/github.dart' as github;
+import 'package:github/hooks.dart';
+import 'package:googleapis/firestore/v1.dart' hide Status;
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+
+import '../foundation/github_checks_util.dart';
+import '../model/appengine/commit.dart';
+import '../model/appengine/task.dart';
+import '../model/firestore/commit.dart' as firestore_commit;
+import '../model/firestore/task.dart' as firestore;
+import '../model/ci_yaml/target.dart';
+import '../model/github/checks.dart' as cocoon_checks;
+import '../model/luci/buildbucket.dart'; // targets use their own RequestedDimension which is defined here for some reason.
+import '../model/luci/user_data.dart';
+import '../service/datastore.dart';
+import '../service/logging.dart';
+import 'build_bucket_v2_client.dart';
+import 'exceptions.dart';
+import 'github_service.dart';
+
+/// Class to interact with LUCI buildbucket to get, trigger
+/// and cancel builds for github repos. It uses [config.luciTryBuilders] to
+/// get the list of available builders.
+class LuciBuildServiceV2 {
+  LuciBuildServiceV2({
+    required this.config,
+    required this.cache,
+    required this.buildBucketV2Client,
+    GithubChecksUtil? githubChecksUtil,
+    GerritService? gerritService,
+    this.pubsub = const PubSub(),
+  })  : githubChecksUtil = githubChecksUtil ?? const GithubChecksUtil(),
+        gerritService = gerritService ?? GerritService(config: config);
+
+  BuildBucketV2Client buildBucketV2Client;
+  final CacheService cache;
+  Config config;
+  GithubChecksUtil githubChecksUtil;
+  GerritService gerritService;
+
+  final PubSub pubsub;
+
+  static const Set<bbv2.Status> failStatusSet = <bbv2.Status>{
+    bbv2.Status.CANCELED,
+    bbv2.Status.FAILURE,
+    bbv2.Status.INFRA_FAILURE,
+  };
+
+  static const int kBackfillPriority = 35;
+  static const int kDefaultPriority = 30;
+  static const int kRerunPriority = 29;
+
+  /// Github labels have a max length of 100, so conserve chars here.
+  /// This is currently used by packages repo only.
+  /// See: https://github.com/flutter/flutter/issues/130076
+  static const String githubBuildLabelPrefix = 'override:';
+  static const String propertiesGithubBuildLabelName = 'overrides';
+
+  /// Name of the subcache to store luci build related values in redis.
+  static const String subCacheName = 'luci';
+
+  // the Request objects here are the BatchRequest object in bbv2.
+  /// Shards [rows] into several sublists of size [maxEntityGroups].
+  Future<List<List<bbv2.BatchRequest_Request>>> shard({
+    required List<bbv2.BatchRequest_Request> requests,
+    required int maxShardSize,
+  }) async {
+    final List<List<bbv2.BatchRequest_Request>> shards = [];
+    for (int i = 0; i < requests.length; i += maxShardSize) {
+      shards.add(requests.sublist(i, i + min<int>(requests.length - i, maxShardSize)));
+    }
+    return shards;
+  }
+
+  /// Fetches an Iterable of try BuildBucket [Build]s.
+  ///
+  /// Returns a list of BuildBucket [Build]s for a given Github [slug], [sha],
+  /// and [builderName].
+  Future<Iterable<bbv2.Build>> getTryBuilds({
+    required github.RepositorySlug slug,
+    required String sha,
+    String? builderName,
+  }) async {
+    final List<bbv2.StringPair> tags = [
+      bbv2.StringPair(
+        key: 'buildset',
+        value: 'sha/git/$sha',
+      ),
+      bbv2.StringPair(
+        key: 'user_agent',
+        value: 'flutter-cocoon',
+      ),
+    ];
+    return getBuilds(
+      slug: slug,
+      commitSha: sha,
+      builderName: builderName,
+      bucket: 'try',
+      tags: tags,
+    );
+  }
+
+  /// Fetches an Iterable of try BuildBucket [Build]s.
+  ///
+  /// Returns a list of BuildBucket [Build]s for a given Github [PullRequest].
+  Future<Iterable<bbv2.Build>> getTryBuildsByPullRequest({
+    required github.PullRequest pullRequest,
+  }) async {
+    final github.RepositorySlug slug = pullRequest.base!.repo!.slug();
+    final List<bbv2.StringPair> tags = [
+      bbv2.StringPair(
+        key: 'buildset',
+        value: 'pr/git/${pullRequest.number}',
+      ),
+      bbv2.StringPair(
+        key: 'github_link',
+        value: 'https://github.com/${slug.fullName}/pull/${pullRequest.number}',
+      ),
+      bbv2.StringPair(
+        key: 'user_agent',
+        value: 'flutter-cocoon',
+      ),
+    ];
+    return getBuilds(
+      slug: slug,
+      commitSha: null,
+      builderName: null,
+      bucket: 'try',
+      tags: tags,
+    );
+  }
+
+  /// Fetches an Iterable of prod BuildBucket [Build]s.
+  ///
+  /// Returns an Iterable of prod BuildBucket [Build]s for a given Github
+  /// [slug], [sha], and [builderName].
+  Future<Iterable<bbv2.Build>> getProdBuilds({
+    required github.RepositorySlug slug,
+    required String commitSha,
+    String? builderName,
+  }) async {
+    final List<bbv2.StringPair> tags = [];
+    return getBuilds(
+      slug: slug,
+      commitSha: commitSha,
+      builderName: builderName,
+      bucket: 'prod',
+      tags: tags,
+    );
+  }
+
+  /// Fetches an Iterable of try BuildBucket [Build]s.
+  ///
+  /// Returns an iterable of try BuildBucket [Build]s for a given Github [slug],
+  /// [sha], [builderName], [bucket], and [tags].
+  Future<Iterable<bbv2.Build>> getBuilds({
+    required github.RepositorySlug? slug,
+    required String? commitSha,
+    required String? builderName,
+    required String bucket,
+    required List<bbv2.StringPair> tags,
+  }) async {
+    final bbv2.FieldMask fieldMask = bbv2.FieldMask(
+      paths: {
+        'id',
+        'builder',
+        'tags',
+        'status',
+        'input.properties',
+      },
+    );
+
+    final bbv2.BuildMask buildMask = bbv2.BuildMask(fields: fieldMask);
+
+    final bbv2.BuildPredicate buildPredicate = bbv2.BuildPredicate(
+      builder: bbv2.BuilderID(
+        project: 'flutter',
+        bucket: bucket,
+        builder: builderName,
+      ),
+      tags: tags,
+    );
+
+    final bbv2.SearchBuildsRequest searchBuildsRequest = bbv2.SearchBuildsRequest(
+      predicate: buildPredicate,
+      mask: buildMask,
+    );
+
+    // Need to create one of these for each request in the batch.
+    final bbv2.BatchRequest_Request batchRequestRequest = bbv2.BatchRequest_Request(
+      searchBuilds: searchBuildsRequest,
+    );
+
+    final bbv2.BatchResponse batchResponse = await buildBucketV2Client.batch(
+      bbv2.BatchRequest(
+        requests: {batchRequestRequest},
+      ),
+    );
+
+    log.info('Reponses from get builds batch request = ${batchResponse.responses.length}');
+    for (bbv2.BatchResponse_Response response in batchResponse.responses) {
+      log.info('Found a response: ${response.toString()}');
+    }
+
+    final Iterable<bbv2.Build> builds = batchResponse.responses
+        .map((bbv2.BatchResponse_Response response) => response.searchBuilds)
+        .expand((bbv2.SearchBuildsResponse? response) => response!.builds);
+    return builds;
+  }
+
+  /// Schedules presubmit [targets] on BuildBucket for [pullRequest].
+  Future<List<Target>> scheduleTryBuilds({
+    required List<Target> targets,
+    required github.PullRequest pullRequest,
+    CheckSuiteEvent? checkSuiteEvent,
+  }) async {
+    if (targets.isEmpty) {
+      return targets;
+    }
+
+    // final bbv2.BatchRequest batchRequest = bbv2.BatchRequest().createEmptyInstance();
+    final List<bbv2.BatchRequest_Request> batchRequestList = [];
+    final List<String> branches = await gerritService.branches(
+      'flutter-review.googlesource.com',
+      'recipes',
+      filterRegex: 'flutter-.*|fuchsia.*',
+    );
+    log.info('Available release branches: $branches');
+
+    final String sha = pullRequest.head!.sha!;
+    String cipdVersion = 'refs/heads/${pullRequest.base!.ref!}';
+    cipdVersion = branches.contains(cipdVersion) ? cipdVersion : config.defaultRecipeBundleRef;
+
+    for (Target target in targets) {
+      final github.CheckRun checkRun = await githubChecksUtil.createCheckRun(
+        config,
+        target.slug,
+        sha,
+        target.value.name,
+      );
+
+      final github.RepositorySlug slug = pullRequest.base!.repo!.slug();
+
+      final Map<String, dynamic> userData = <String, dynamic>{
+        'builder_name': target.value.name,
+        'check_run_id': checkRun.id,
+        'commit_sha': sha,
+        'commit_branch': pullRequest.base!.ref!.replaceAll('refs/heads/', ''),
+      };
+
+      final List<bbv2.StringPair> tags = [
+        bbv2.StringPair(
+          key: 'github_checkrun',
+          value: checkRun.id.toString(),
+        ),
+      ];
+
+      final Map<String, Object> properties = target.getProperties();
+      properties.putIfAbsent(
+        'git_branch',
+        () => pullRequest.base!.ref!.replaceAll('refs/heads/', ''),
+      );
+
+      // final String json = jsonEncode(properties);
+      final bbv2.Struct struct = bbv2.Struct.create();
+      struct.mergeFromProto3Json(properties);
+
+      final List<String>? labels = extractPrefixedLabels(
+        issueLabels: pullRequest.labels,
+        prefix: githubBuildLabelPrefix,
+      );
+
+      if (labels != null && labels.isNotEmpty) {
+        properties[propertiesGithubBuildLabelName] = labels;
+      }
+
+      // Convert from target RequestedDimensions to bbv2.RequestedDimensions.
+      final List<RequestedDimension> targetDimensions = target.getDimensions();
+      final List<bbv2.RequestedDimension> requestedDimensions = <bbv2.RequestedDimension>[];
+      for (RequestedDimension requestedDimension in targetDimensions) {
+        requestedDimensions.add(bbv2.RequestedDimension(key: requestedDimension.key, value: requestedDimension.value));
+      }
+
+      batchRequestList.add(
+        bbv2.BatchRequest_Request(
+          scheduleBuild: await _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: requestedDimensions,
+          ),
+        ),
+      );
+    }
+
+    final Iterable<List<bbv2.BatchRequest_Request>> requestPartitions = await shard(
+      requests: batchRequestList,
+      maxShardSize: config.schedulingShardSize,
+    );
+    for (List<bbv2.BatchRequest_Request> requestPartition in requestPartitions) {
+      final bbv2.BatchRequest batchRequest = bbv2.BatchRequest(requests: requestPartition);
+      await pubsub.publish('cocoon-scheduler-requests', batchRequest.toProto3Json());
+    }
+
+    return targets;
+  }
+
+  /// Cancels all the current builds on [pullRequest] with [reason].
+  ///
+  /// Builds are queried based on the [RepositorySlug] and pull request number.
+  //
+  Future<void> cancelBuilds({
+    required github.PullRequest pullRequest,
+    required String reason,
+  }) async {
+    log.info(
+      'Attempting to cancel builds (v2) for pullrequest ${pullRequest.base!.repo!.fullName}/${pullRequest.number}',
+    );
+
+    final Iterable<bbv2.Build> builds = await getTryBuildsByPullRequest(pullRequest: pullRequest);
+    log.info('Found ${builds.length} builds.');
+
+    if (builds.isEmpty) {
+      log.warning('No builds were found for pull request ${pullRequest.base!.repo!.fullName}.');
+      return;
+    }
+
+    final List<bbv2.BatchRequest_Request> requests = <bbv2.BatchRequest_Request>[];
+    for (bbv2.Build build in builds) {
+      if (build.status == bbv2.Status.SCHEDULED || build.status == bbv2.Status.STARTED) {
+        // Scheduled status includes scheduled and pending tasks.
+        log.info('Cancelling build with build id ${build.id}.');
+        requests.add(
+          bbv2.BatchRequest_Request(
+            cancelBuild: bbv2.CancelBuildRequest(
+              id: build.id,
+              summaryMarkdown: reason,
+            ),
+          ),
+        );
+      }
+    }
+
+    if (requests.isNotEmpty) {
+      await buildBucketV2Client.batch(bbv2.BatchRequest(requests: requests));
+    }
+  }
+
+  /// Filters [builders] to only those that failed on [pullRequest].
+  Future<List<bbv2.Build?>> failedBuilds({
+    required github.PullRequest pullRequest,
+    required List<Target> targets,
+  }) async {
+    final Iterable<bbv2.Build> builds = await getTryBuilds(
+      slug: pullRequest.base!.repo!.slug(),
+      sha: pullRequest.head!.sha!,
+      builderName: null,
+    );
+    final Iterable<String> builderNames = targets.map((Target target) => target.value.name);
+    // Return only builds that exist in the configuration file.
+    final Iterable<bbv2.Build?> failedBuilds =
+        builds.where((bbv2.Build? build) => failStatusSet.contains(build!.status));
+    final Iterable<bbv2.Build?> expectedFailedBuilds =
+        failedBuilds.where((bbv2.Build? build) => builderNames.contains(build!.builder.builder));
+    return expectedFailedBuilds.toList();
+  }
+
+  /// Sends [ScheduleBuildRequest] using information from a given build's
+  /// [BuildPushMessage].
+  ///
+  /// The buildset, user_agent, and github_link tags are applied to match the
+  /// original build. The build properties and user data from the original build
+  /// are also preserved.
+  ///
+  /// The [currentAttempt] is used to track the number of current build attempt.
+  Future<bbv2.Build> rescheduleBuild({
+    required String builderName,
+    required bbv2.Build build,
+    required int rescheduleAttempt,
+    required Map<String, dynamic> userDataMap,
+  }) async {
+    final List<bbv2.StringPair> tags = build.tags;
+    // need to replace the current_attempt
+    bbv2.StringPair attempt;
+    final (int, bbv2.StringPair)? record =
+        tags.indexed.firstWhereOrNull((element) => element.$2.key == 'current_attempt');
+    if (record == null) {
+      attempt = bbv2.StringPair(
+        key: 'current_attempt',
+        value: rescheduleAttempt.toString(),
+      );
+    } else {
+      attempt = tags.removeAt(record.$1);
+      attempt.value = rescheduleAttempt.toString();
+    }
+    tags.add(attempt);
+
+    return buildBucketV2Client.scheduleBuild(
+      bbv2.ScheduleBuildRequest(
+        builder: build.builder,
+        tags: tags,
+        properties: build.input.properties,
+        notify: bbv2.NotificationConfig(
+          pubsubTopic: 'projects/flutter-dashboard/topics/build-bucket-presubmit',
+          userData: UserData.encodeUserDataToBytes(userDataMap),
+        ),
+      ),
+    );
+  }
+
+  /// Sends presubmit [ScheduleBuildRequest] for a pull request using [checkRunEvent].
+  ///
+  /// Returns the [bbv2.Build] returned by scheduleBuildRequest.
+  Future<bbv2.Build> reschedulePresubmitBuildUsingCheckRunEvent({
+    required cocoon_checks.CheckRunEvent checkRunEvent,
+  }) async {
+    final github.RepositorySlug slug = checkRunEvent.repository!.slug();
+
+    final String sha = checkRunEvent.checkRun!.headSha!;
+    final String checkName = checkRunEvent.checkRun!.name!;
+
+    final github.CheckRun githubCheckRun = await githubChecksUtil.createCheckRun(
+      config,
+      slug,
+      sha,
+      checkName,
+    );
+
+    final Iterable<bbv2.Build> builds = await getTryBuilds(
+      slug: slug,
+      sha: sha,
+      builderName: checkName,
+    );
+    if (builds.isEmpty) {
+      throw NoBuildFoundException('Unable to find try build.');
+    }
+
+    final bbv2.Build build = builds.first;
+
+    // Assumes that the tags are already defined.
+    final List<bbv2.StringPair> tags = build.tags;
+    final String prString =
+        tags.firstWhere((element) => element.key == 'buildset' && element.value.startsWith('pr/git')).value;
+    final String cipdVersion = tags.firstWhere((element) => element.key == 'cipd_version').value;
+    final String githubLink = tags.firstWhere((element) => element.key == 'github_link').value;
+
+    final String repoName = githubLink.split('/')[4];
+    final String branch = Config.defaultBranch(github.RepositorySlug('flutter', repoName));
+    final int prNumber = int.parse(prString.split('/')[2]);
+
+    final Map<String, dynamic> userData = <String, dynamic>{
+      'check_run_id': githubCheckRun.id,
+      'commit_branch': branch,
+      'commit_sha': sha,
+    };
+
+    final bbv2.Struct propertiesStruct =
+        (build.input.hasProperties()) ? build.input.properties : bbv2.Struct().createEmptyInstance();
+    final Map<String, Object?> properties = propertiesStruct.toProto3Json() as Map<String, Object?>;
+    final GithubService githubService = await config.createGithubService(slug);
+
+    final List<github.IssueLabel> issueLabels = await githubService.getIssueLabels(
+      slug,
+      prNumber,
+    );
+    final List<String>? labels = extractPrefixedLabels(
+      issueLabels: issueLabels,
+      prefix: githubBuildLabelPrefix,
+    );
+
+    if (labels != null && labels.isNotEmpty) {
+      properties[propertiesGithubBuildLabelName] = labels;
+    }
+
+    final bbv2.ScheduleBuildRequest scheduleBuildRequest = await _createPresubmitScheduleBuild(
+      slug: slug,
+      sha: sha,
+      checkName: checkName,
+      pullRequestNumber: prNumber,
+      cipdVersion: cipdVersion,
+      properties: properties,
+      userData: userData,
+    );
+
+    final bbv2.Build scheduleBuild = await buildBucketV2Client.scheduleBuild(scheduleBuildRequest);
+    final String buildUrl = 'https://ci.chromium.org/ui/b/${scheduleBuild.id}';
+    await githubChecksUtil.updateCheckRun(config, slug, githubCheckRun, detailsUrl: buildUrl);
+    return scheduleBuild;
+  }
+
+  /// Collect any label whose name is prefixed by the prefix [String].
+  ///
+  /// Returns a [List] of prefixed label names as [String]s.
+  List<String>? extractPrefixedLabels({
+    List<github.IssueLabel>? issueLabels,
+    required String prefix,
+  }) {
+    return issueLabels?.where((label) => label.name.startsWith(prefix)).map((obj) => obj.name).toList();
+  }
+
+  /// Sends postsubmit [ScheduleBuildRequest] for a commit using [checkRunEvent], [Commit], [Task], and [Target].
+  ///
+  /// Returns the [bbv2.Build] returned by scheduleBuildRequest.
+  Future<bbv2.Build> reschedulePostsubmitBuildUsingCheckRunEvent(
+    cocoon_checks.CheckRunEvent checkRunEvent, {
+    required Commit commit,
+    required Task task,
+    required Target target,
+  }) async {
+    final github.RepositorySlug slug = checkRunEvent.repository!.slug();
+    final String sha = checkRunEvent.checkRun!.headSha!;
+    final String checkName = checkRunEvent.checkRun!.name!;
+
+    final Iterable<bbv2.Build> builds = await getProdBuilds(
+      slug: slug,
+      commitSha: sha,
+      builderName: checkName,
+    );
+    if (builds.isEmpty) {
+      throw NoBuildFoundException('Unable to find prod build.');
+    }
+
+    final bbv2.Build build = builds.first;
+
+    // get it as a struct first and convert it.
+    final bbv2.Struct propertiesStruct = build.input.properties;
+    final Map<String, Object> properties = propertiesStruct.toProto3Json() as Map<String, Object>;
+
+    // final Map<String, Object>? properties = build.input.properties;
+    log.info('input ${build.input} properties $properties');
+
+    final bbv2.ScheduleBuildRequest scheduleBuildRequest = await _createPostsubmitScheduleBuild(
+      commit: commit,
+      target: target,
+      task: task,
+      properties: properties,
+    );
+    final bbv2.Build scheduleBuild = await buildBucketV2Client.scheduleBuild(scheduleBuildRequest);
+    return scheduleBuild;
+  }
+
+  /// Gets [bbv2.Build] using its [id] and passing the additional
+  /// fields to be populated in the response.
+  Future<bbv2.Build> getBuildById(
+    Int64 id, {
+    bbv2.BuildMask? buildMask,
+  }) async {
+    final bbv2.GetBuildRequest request = bbv2.GetBuildRequest(
+      id: id,
+      mask: buildMask,
+    );
+    return buildBucketV2Client.getBuild(request);
+  }
+
+  /// Gets builder list whose config is pre-defined in LUCI.
+  ///
+  /// Returns cache if existing. Otherwise make the RPC call to fetch list.
+  Future<Set<String>> getAvailableBuilderSet({
+    String project = 'flutter',
+    String bucket = 'prod',
+  }) async {
+    final Uint8List? cacheValue = await cache.getOrCreate(
+      subCacheName,
+      'builderlist',
+      createFn: () => _getAvailableBuilderSet(
+        project: project,
+        bucket: bucket,
+      ),
+      // New commit triggering tasks should be finished within 5 mins.
+      // The batch backfiller's execution frequency is also 5 mins.
+      ttl: const Duration(minutes: 5),
+    );
+
+    return Set.from(String.fromCharCodes(cacheValue!).split(','));
+  }
+
+  /// Returns cache if existing, otherwise makes the RPC call to fetch list.
+  ///
+  /// Use [token] to make sure obtain all the list by calling RPC multiple times.
+  Future<Uint8List> _getAvailableBuilderSet({
+    String project = 'flutter',
+    String bucket = 'prod',
+  }) async {
+    log.info('No cached value for builderList, start fetching via the rpc call.');
+    final Set<String> availableBuilderSet = <String>{};
+    bool hasToken = true;
+    String? token;
+    do {
+      final bbv2.ListBuildersResponse listBuildersResponse = await buildBucketV2Client.listBuilders(
+        bbv2.ListBuildersRequest(
+          project: project,
+          bucket: bucket,
+          pageToken: token,
+        ),
+      );
+      final List<String> availableBuilderList = listBuildersResponse.builders.map((e) => e.id.builder).toList();
+      availableBuilderSet.addAll(<String>{...availableBuilderList});
+      hasToken = listBuildersResponse.hasNextPageToken();
+      if (hasToken) {
+        token = listBuildersResponse.nextPageToken;
+      }
+    } while (hasToken && token != null);
+    final String joinedBuilderSet = availableBuilderSet.toList().join(',');
+    log.info('successfully fetched the builderSet: $joinedBuilderSet');
+    return Uint8List.fromList(joinedBuilderSet.codeUnits);
+  }
+
+  /// Schedules list of post-submit builds deferring work to [schedulePostsubmitBuild].
+  ///
+  /// Returns empty list if all targets are successfully published to pub/sub. Otherwise,
+  /// returns the original list.
+  Future<List<Tuple<Target, Task, int>>> schedulePostsubmitBuilds({
+    required Commit commit,
+    required List<Tuple<Target, Task, int>> toBeScheduled,
+  }) async {
+    if (toBeScheduled.isEmpty) {
+      log.fine('Skipping schedulePostsubmitBuilds as there are no targets to be scheduled by Cocoon');
+      return toBeScheduled;
+    }
+    final List<bbv2.BatchRequest_Request> buildRequests = [];
+    // bbv2.BatchRequest_Request batchRequest_Request = bbv2.BatchRequest_Request();
+
+    Set<String> availableBuilderSet;
+    try {
+      availableBuilderSet = await getAvailableBuilderSet(
+        project: 'flutter',
+        bucket: 'prod',
+      );
+    } catch (error) {
+      log.severe('Failed to get buildbucket builder list due to $error');
+      return toBeScheduled;
+    }
+    log.info('Available builder list: $availableBuilderSet');
+    for (Tuple<Target, Task, int> tuple in toBeScheduled) {
+      // Non-existing builder target will be skipped from scheduling.
+      if (!availableBuilderSet.contains(tuple.first.value.name)) {
+        log.warning('Found no available builder for ${tuple.first.value.name}, commit ${commit.sha}');
+        continue;
+      }
+      log.info('create postsubmit schedule request for target: ${tuple.first.value} in commit ${commit.sha}');
+      final bbv2.ScheduleBuildRequest scheduleBuildRequest = await _createPostsubmitScheduleBuild(
+        commit: commit,
+        target: tuple.first,
+        task: tuple.second,
+        priority: tuple.third,
+      );
+      buildRequests.add(bbv2.BatchRequest_Request(scheduleBuild: scheduleBuildRequest));
+      log.info('created postsubmit schedule request for target: ${tuple.first.value} in commit ${commit.sha}');
+    }
+
+    final bbv2.BatchRequest batchRequest = bbv2.BatchRequest(requests: buildRequests);
+    log.fine(batchRequest);
+    List<String> messageIds;
+
+    try {
+      messageIds = await pubsub.publish('cocoon-scheduler-requests', batchRequest.toProto3Json());
+      log.info('Published $messageIds for commit ${commit.sha}');
+    } catch (error) {
+      log.severe('Failed to publish message to pub/sub due to $error');
+      return toBeScheduled;
+    }
+    log.info('Published a request with ${buildRequests.length} builds');
+    return <Tuple<Target, Task, int>>[];
+  }
+
+  /// Create a Presubmit ScheduleBuildRequest using the [slug], [sha], and
+  /// [checkName] for the provided [build] with the provided [checkRunId].
+  Future<bbv2.ScheduleBuildRequest> _createPresubmitScheduleBuild({
+    required github.RepositorySlug slug,
+    required String sha,
+    required String checkName,
+    required int pullRequestNumber,
+    required String cipdVersion,
+    Map<String, Object?>? properties,
+    List<bbv2.StringPair>? tags,
+    Map<String, dynamic>? userData,
+    List<bbv2.RequestedDimension>? dimensions,
+  }) async {
+    final Map<String, dynamic> processedUserData = userData ?? <String, dynamic>{};
+    processedUserData['repo_owner'] = slug.owner;
+    processedUserData['repo_name'] = slug.name;
+    processedUserData['user_agent'] = 'flutter-cocoon';
+
+    final bbv2.BuilderID builderId = bbv2.BuilderID.create();
+    builderId.bucket = 'try';
+    builderId.project = 'flutter';
+    builderId.builder = checkName;
+
+    // Add the builderId.
+    final bbv2.ScheduleBuildRequest scheduleBuildRequest = bbv2.ScheduleBuildRequest.create();
+    scheduleBuildRequest.builder = builderId;
+
+    final List<String> fields = [
+      'id',
+      'builder',
+      'number',
+      'status',
+      'tags',
+    ];
+    final bbv2.FieldMask fieldMask = bbv2.FieldMask(paths: fields);
+    final bbv2.BuildMask buildMask = bbv2.BuildMask(fields: fieldMask);
+    scheduleBuildRequest.mask = buildMask;
+
+    // Set the executable.
+    final bbv2.Executable executable = bbv2.Executable(cipdVersion: cipdVersion);
+    scheduleBuildRequest.exe = executable;
+
+    // Add the dimensions to the instance.
+    final List<bbv2.RequestedDimension> instanceDimensions = scheduleBuildRequest.dimensions;
+    instanceDimensions.addAll(dimensions ?? []);
+
+    // Create the notification configuration for pubsub processing.
+    final bbv2.NotificationConfig notificationConfig = bbv2.NotificationConfig().createEmptyInstance();
+    notificationConfig.pubsubTopic = 'projects/flutter-dashboard/topics/build-bucket-presubmit';
+    notificationConfig.userData = UserData.encodeUserDataToBytes(processedUserData)!;
+    scheduleBuildRequest.notify = notificationConfig;
+
+    // Add tags to the instance.
+    final List<bbv2.StringPair> processTags = tags ?? <bbv2.StringPair>[];
+    processTags.add(
+      bbv2.StringPair(
+        key: 'buildset',
+        value: 'pr/git/$pullRequestNumber',
+      ),
+    );
+    processTags.add(
+      bbv2.StringPair(
+        key: 'buildset',
+        value: 'sha/git/$sha',
+      ),
+    );
+    processTags.add(
+      bbv2.StringPair(
+        key: 'user_agent',
+        value: 'flutter-cocoon',
+      ),
+    );
+    processTags.add(
+      bbv2.StringPair(
+        key: 'github_link',
+        value: 'https://github.com/${slug.owner}/${slug.name}/pull/$pullRequestNumber',
+      ),
+    );
+    processTags.add(
+      bbv2.StringPair(
+        key: 'cipd_version',
+        value: cipdVersion,
+      ),
+    );
+    final List<bbv2.StringPair> instanceTags = scheduleBuildRequest.tags;
+    instanceTags.addAll(processTags);
+
+    properties ??= {};
+    properties['git_url'] = 'https://github.com/${slug.owner}/${slug.name}';
+    properties['git_ref'] = 'refs/pull/$pullRequestNumber/head';
+    properties['exe_cipd_version'] = cipdVersion;
+
+    final bbv2.Struct propertiesStruct = bbv2.Struct.create();
+    propertiesStruct.mergeFromProto3Json(properties);
+
+    scheduleBuildRequest.properties = propertiesStruct;
+
+    return scheduleBuildRequest;
+  }
+
+  /// Creates a [ScheduleBuildRequest] for [target] and [task] against [commit].
+  ///
+  /// By default, build [priority] is increased for release branches.
+  Future<bbv2.ScheduleBuildRequest> _createPostsubmitScheduleBuild({
+    required Commit commit,
+    required Target target,
+    required Task task,
+    Map<String, Object>? properties,
+    List<bbv2.StringPair>? tags,
+    int priority = kDefaultPriority,
+  }) async {
+    log.info('Creating postsubmit schedule builder for ${target.value.name} on commit ${commit.sha}');
+    tags ??= [];
+    tags.addAll([
+      bbv2.StringPair(
+        key: 'buildset',
+        value: 'commit/git/${commit.sha}',
+      ),
+      bbv2.StringPair(
+        key: 'buildset',
+        value: 'commit/gitiles/flutter.googlesource.com/mirrors/${commit.slug.name}/+/${commit.sha}',
+      ),
+    ]);
+
+    final String commitKey = task.parentKey!.id.toString();
+    final String taskKey = task.key.id.toString();
+    log.info('Scheduling builder: ${target.value.name} for commit ${commit.sha}');
+    log.info('Task commit_key: $commitKey for task name: ${task.name}');
+    log.info('Task task_key: $taskKey for task name: ${task.name}');
+
+    final Map<String, dynamic> rawUserData = <String, dynamic>{
+      'commit_key': commitKey,
+      'task_key': taskKey,
+      'firestore_commit_document_name': commit.sha,
+    };
+
+    // Creates post submit checkrun only for unflaky targets from [config.postsubmitSupportedRepos].
+    if (!target.value.bringup && config.postsubmitSupportedRepos.contains(target.slug)) {
+      await createPostsubmitCheckRun(
+        commit,
+        target,
+        rawUserData,
+      );
+    }
+
+    tags.add(
+      bbv2.StringPair(
+        key: 'user_agent',
+        value: 'flutter-cocoon',
+      ),
+    );
+    // Tag `scheduler_job_id` is needed when calling buildbucket search build API.
+    tags.add(
+      bbv2.StringPair(
+        key: 'scheduler_job_id',
+        value: 'flutter/${target.value.name}',
+      ),
+    );
+    // Default attempt is the initial attempt, which is 1.
+    final bbv2.StringPair? attemptTag = tags.singleWhereOrNull((tag) => tag.key == 'current_attempt');
+    if (attemptTag == null) {
+      tags.add(
+        bbv2.StringPair(
+          key: 'current_attempt',
+          value: '1',
+        ),
+      );
+    }
+
+    final String currentAttemptStr = tags.firstWhere((tag) => tag.key == 'current_attempt').value;
+    rawUserData['firestore_task_document_name'] = '${commit.sha}_${task.name}_$currentAttemptStr';
+
+    final Map<String, Object> processedProperties = target.getProperties();
+    processedProperties.addAll(properties ?? <String, Object>{});
+    processedProperties['git_branch'] = commit.branch!;
+    final String cipdExe = 'refs/heads/${commit.branch}';
+    processedProperties['exe_cipd_version'] = cipdExe;
+
+    final bbv2.Struct propertiesStruct = bbv2.Struct.create();
+    propertiesStruct.mergeFromProto3Json(processedProperties);
+
+    // Convert from target RequestedDimensions to bbv2.RequestedDimensions.
+    final List<RequestedDimension> targetDimensions = target.getDimensions();
+    final List<bbv2.RequestedDimension> requestedDimensions = <bbv2.RequestedDimension>[];
+    for (RequestedDimension requestedDimension in targetDimensions) {
+      requestedDimensions.add(bbv2.RequestedDimension(key: requestedDimension.key, value: requestedDimension.value));
+    }
+
+    final bbv2.Executable executable = bbv2.Executable(cipdVersion: cipdExe);
+
+    log.info('Constructing the postsubmit schedule build request for ${target.value.name} on commit ${commit.sha}.');
+
+    return bbv2.ScheduleBuildRequest(
+      builder: bbv2.BuilderID(
+        project: 'flutter',
+        bucket: target.getBucket(),
+        builder: target.value.name,
+      ),
+      dimensions: requestedDimensions,
+      exe: executable,
+      gitilesCommit: bbv2.GitilesCommit(
+        project: 'mirrors/${commit.slug.name}',
+        host: 'flutter.googlesource.com',
+        ref: 'refs/heads/${commit.branch}',
+        id: commit.sha,
+      ),
+      notify: bbv2.NotificationConfig(
+        pubsubTopic: 'projects/flutter-dashboard/topics/build-bucket-postsubmit',
+        userData: UserData.encodeUserDataToBytes(rawUserData),
+      ),
+      tags: tags,
+      properties: propertiesStruct,
+      priority: priority,
+    );
+  }
+
+  /// Creates postsubmit check runs for prod targets in supported repositories.
+  Future<void> createPostsubmitCheckRun(
+    Commit commit,
+    Target target,
+    Map<String, dynamic> rawUserData,
+  ) async {
+    final github.CheckRun checkRun = await githubChecksUtil.createCheckRun(
+      config,
+      target.slug,
+      commit.sha!,
+      target.value.name,
+    );
+    rawUserData['check_run_id'] = checkRun.id;
+    rawUserData['commit_sha'] = commit.sha;
+    rawUserData['commit_branch'] = commit.branch;
+    rawUserData['builder_name'] = target.value.name;
+    rawUserData['repo_owner'] = target.slug.owner;
+    rawUserData['repo_name'] = target.slug.name;
+  }
+
+  /// Check to auto-rerun TOT test failures.
+  ///
+  /// A builder will be retried if:
+  ///   1. It has been tried below the max retry limit
+  ///   2. It is for the tip of tree
+  ///   3. The last known status is not green
+  ///   4. [ignoreChecks] is false. This allows manual reruns to bypass the Cocoon state.
+  Future<bool> checkRerunBuilder({
+    required Commit commit,
+    required Target target,
+    required Task task,
+    required DatastoreService datastore,
+    required firestore.Task taskDocument,
+    required FirestoreService firestoreService,
+    List<bbv2.StringPair>? tags,
+    bool ignoreChecks = false,
+  }) async {
+    if (ignoreChecks == false && await _shouldRerunBuilderFirestore(taskDocument, firestoreService) == false) {
+      return false;
+    }
+
+    log.info('Rerun builder: ${target.value.name} for commit ${commit.sha}');
+    tags ??= <bbv2.StringPair>[];
+    final bbv2.StringPair? triggerTag =
+        tags.singleWhereOrNull((element) => element.key == 'trigger_type' && element.value == 'auto_retry');
+    if (triggerTag == null) {
+      tags.add(
+        bbv2.StringPair(
+          key: 'trigger_type',
+          value: 'auto_retry',
+        ),
+      );
+    }
+
+    try {
+      // Updates task status in Datastore.
+      task.attempts = (task.attempts ?? 0) + 1;
+      // Mark task as in progress to ensure it isn't scheduled over
+      task.status = Task.statusInProgress;
+      await datastore.insert(<Task>[task]);
+
+      // Updates task status in Firestore.
+      final int newAttempt = int.parse(taskDocument.name!.split('_').last) + 1;
+      tags.add(bbv2.StringPair(key: 'current_attempt', value: newAttempt.toString()));
+      taskDocument.resetAsRetry(attempt: newAttempt);
+      taskDocument.setStatus(firestore.Task.statusInProgress);
+      final List<Write> writes = documentsToWrites([taskDocument], exists: false);
+      await firestoreService.batchWriteDocuments(BatchWriteRequest(writes: writes), kDatabase);
+    } catch (error) {
+      log.severe(
+        'updating task ${taskDocument.taskName} of commit ${taskDocument.commitSha} failure: $error. Skipping rescheduling.',
+      );
+      return false;
+    }
+
+    final bbv2.BatchRequest request = bbv2.BatchRequest(
+      requests: <bbv2.BatchRequest_Request>[
+        bbv2.BatchRequest_Request(
+          scheduleBuild: await _createPostsubmitScheduleBuild(
+            commit: commit,
+            target: target,
+            task: task,
+            priority: kRerunPriority,
+            properties: Config.defaultProperties,
+            tags: tags,
+          ),
+        ),
+      ],
+    );
+
+    await pubsub.publish(
+      'cocoon-scheduler-requests',
+      request.toProto3Json(),
+    );
+
+    return true;
+  }
+
+  /// Check if a builder should be rerun.
+  ///
+  /// A rerun happens when a build fails, the retry number hasn't reached the limit, and the build is on TOT.
+  Future<bool> _shouldRerunBuilderFirestore(firestore.Task task, FirestoreService firestoreService) async {
+    if (!firestore.Task.taskFailStatusSet.contains(task.status)) {
+      return false;
+    }
+    final int retries = task.attempts ?? 1;
+    if (retries > config.maxLuciTaskRetries) {
+      log.warning('Max retries reached');
+      return false;
+    }
+
+    final String commitDocumentName = '$kDatabase/documents/${firestore_commit.kCommitCollectionId}/${task.commitSha}';
+    final firestore_commit.Commit currentCommit = await firestore_commit.Commit.fromFirestore(
+      firestoreService: firestoreService,
+      documentName: commitDocumentName,
+    );
+    final List<firestore_commit.Commit> commitList = await firestoreService.queryRecentCommits(
+      limit: 1,
+      slug: currentCommit.slug,
+      branch: currentCommit.branch,
+    );
+    final firestore_commit.Commit latestCommit = commitList.single;
+    return latestCommit.sha == currentCommit.sha;
+  }
+}
diff --git a/app_dart/lib/src/service/scheduler.dart b/app_dart/lib/src/service/scheduler.dart
index 2e88d1e..27a7925 100644
--- a/app_dart/lib/src/service/scheduler.dart
+++ b/app_dart/lib/src/service/scheduler.dart
@@ -5,6 +5,7 @@
 import 'dart:math';
 import 'dart:typed_data';
 
+import 'package:cocoon_service/src/model/luci/buildbucket.dart';
 import 'package:cocoon_service/src/service/exceptions.dart';
 import 'package:cocoon_service/src/service/build_status_provider.dart';
 import 'package:cocoon_service/src/service/scheduler/policy.dart';
@@ -27,7 +28,6 @@
 import '../model/ci_yaml/ci_yaml.dart';
 import '../model/ci_yaml/target.dart';
 import '../model/github/checks.dart' as cocoon_checks;
-import '../model/luci/buildbucket.dart';
 import '../model/proto/internal/scheduler.pb.dart' as pb;
 import '../service/logging.dart';
 import 'cache_service.dart';
@@ -297,6 +297,14 @@
     await luciBuildService.cancelBuilds(pullRequest, reason);
   }
 
+  Future<void> cancelPreSubmitTargetsV2({
+    required PullRequest pullRequest,
+    String reason = 'Newer commit available',
+  }) async {
+    log.info('Cancelling presubmit targets with buildbucket v2.');
+    await luciBuildService.cancelBuildsV2(pullRequest, reason);
+  }
+
   /// Schedule presubmit targets against a pull request.
   ///
   /// Cancels all existing targets then schedules the targets.
@@ -310,7 +318,7 @@
   }) async {
     // Always cancel running builds so we don't ever schedule duplicates.
     log.info('Attempting to cancel existing presubmit targets for ${pullRequest.number}');
-    await cancelPreSubmitTargets(
+    await cancelPreSubmitTargetsV2(
       pullRequest: pullRequest,
       reason: reason,
     );
@@ -560,6 +568,7 @@
 
             if (commit == null) {
               log.fine('Rescheduling presubmit build.');
+              // Does not do anything with the returned build oddly.
               await luciBuildService.reschedulePresubmitBuildUsingCheckRunEvent(checkRunEvent);
             } else {
               log.fine('Rescheduling postsubmit build.');
diff --git a/app_dart/lib/src/service/scheduler_v2.dart b/app_dart/lib/src/service/scheduler_v2.dart
new file mode 100644
index 0000000..ab11d24
--- /dev/null
+++ b/app_dart/lib/src/service/scheduler_v2.dart
@@ -0,0 +1,666 @@
+// Copyright 2021 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:math';
+import 'dart:typed_data';
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/src/service/exceptions.dart';
+import 'package:cocoon_service/src/service/build_status_provider.dart';
+import 'package:cocoon_service/src/service/scheduler/policy.dart';
+import 'package:gcloud/db.dart';
+import 'package:github/github.dart';
+import 'package:github/hooks.dart';
+import 'package:googleapis/bigquery/v2.dart';
+import 'package:googleapis/firestore/v1.dart';
+import 'package:retry/retry.dart';
+import 'package:truncate/truncate.dart';
+import 'package:yaml/yaml.dart';
+
+import '../foundation/providers.dart';
+import '../foundation/typedefs.dart';
+import '../foundation/utils.dart';
+import '../model/appengine/commit.dart';
+import '../model/appengine/task.dart';
+import '../model/firestore/commit.dart' as firestore_commmit;
+import '../model/firestore/task.dart' as firestore;
+import '../model/ci_yaml/ci_yaml.dart';
+import '../model/ci_yaml/target.dart';
+import '../model/github/checks.dart' as cocoon_checks;
+import '../model/proto/internal/scheduler.pb.dart' as pb;
+import '../service/logging.dart';
+import 'cache_service.dart';
+import 'config.dart';
+import 'datastore.dart';
+import 'firestore.dart';
+import 'github_checks_service_v2.dart';
+import 'github_service.dart';
+import 'luci_build_service_v2.dart';
+
+/// Scheduler service to validate all commits to supported Flutter repositories.
+///
+/// Scheduler responsibilties include:
+///   1. Tracking commits in Cocoon
+///   2. Ensuring commits are validated (via scheduling tasks against commits)
+///   3. Retry mechanisms for tasks
+class SchedulerV2 {
+  SchedulerV2({
+    required this.cache,
+    required this.config,
+    required this.githubChecksService,
+    required this.luciBuildService,
+    this.datastoreProvider = DatastoreService.defaultProvider,
+    this.httpClientProvider = Providers.freshHttpClient,
+    this.buildStatusProvider = BuildStatusService.defaultProvider,
+  });
+
+  final BuildStatusServiceProvider buildStatusProvider;
+  final CacheService cache;
+  final Config config;
+  final DatastoreServiceProvider datastoreProvider;
+  final GithubChecksServiceV2 githubChecksService;
+  final HttpClientProvider httpClientProvider;
+
+  late DatastoreService datastore;
+  late FirestoreService firestoreService;
+  LuciBuildServiceV2 luciBuildService;
+
+  /// Name of the subcache to store scheduler related values in redis.
+  static const String subcacheName = 'scheduler';
+
+  static const String kCiYamlCheckName = 'ci.yaml validation';
+
+  /// Ensure [commits] exist in Cocoon.
+  ///
+  /// If [Commit] does not exist in Datastore:
+  ///   * Write it to datastore
+  ///   * Schedule tasks listed in its scheduler config
+  /// Otherwise, ignore it.
+  Future<void> addCommits(List<Commit> commits) async {
+    datastore = datastoreProvider(config.db);
+    final List<Commit> newCommits = await _getMissingCommits(commits);
+    log.fine('Found ${newCommits.length} new commits on GitHub');
+    for (Commit commit in newCommits) {
+      await _addCommit(commit);
+    }
+  }
+
+  /// Schedule tasks against [PullRequest].
+  ///
+  /// If [PullRequest] was merged, schedule prod tasks against it.
+  /// Otherwise if it is presubmit, schedule try tasks against it.
+  Future<void> addPullRequest(PullRequest pr) async {
+    datastore = datastoreProvider(config.db);
+    // TODO(chillers): Support triggering on presubmit. https://github.com/flutter/flutter/issues/77858
+    if (!pr.merged!) {
+      log.warning('Only pull requests that were closed and merged should have tasks scheduled');
+      return;
+    }
+
+    final String fullRepo = pr.base!.repo!.fullName;
+    final String? branch = pr.base!.ref;
+    final String sha = pr.mergeCommitSha!;
+
+    final String id = '$fullRepo/$branch/$sha';
+    final Key<String> key = datastore.db.emptyKey.append<String>(Commit, id: id);
+    final Commit mergedCommit = Commit(
+      author: pr.user!.login!,
+      authorAvatarUrl: pr.user!.avatarUrl!,
+      branch: branch,
+      key: key,
+      // The field has a max length of 1500 so ensure the commit message is not longer.
+      message: truncate(pr.title!, 1490, omission: '...'),
+      repository: fullRepo,
+      sha: sha,
+      timestamp: pr.mergedAt!.millisecondsSinceEpoch,
+    );
+
+    if (await _commitExistsInDatastore(mergedCommit)) {
+      log.fine('$sha already exists in datastore. Scheduling skipped.');
+      return;
+    }
+
+    log.fine('Scheduling $sha via GitHub webhook');
+    await _addCommit(mergedCommit);
+  }
+
+  /// Processes postsubmit tasks.
+  Future<void> _addCommit(Commit commit) async {
+    if (!config.supportedRepos.contains(commit.slug)) {
+      log.fine('Skipping ${commit.id} as repo is not supported');
+      return;
+    }
+
+    final CiYaml ciYaml = await getCiYaml(commit);
+
+    final List<Target> initialTargets = ciYaml.getInitialTargets(ciYaml.postsubmitTargets);
+    final List<Task> tasks = targetsToTask(commit, initialTargets).toList();
+
+    final List<Tuple<Target, Task, int>> toBeScheduled = <Tuple<Target, Task, int>>[];
+    for (Target target in initialTargets) {
+      final Task task = tasks.singleWhere((Task task) => task.name == target.value.name);
+      SchedulerPolicy policy = target.schedulerPolicy;
+      // Release branches should run every task
+      if (Config.defaultBranch(commit.slug) != commit.branch) {
+        policy = GuaranteedPolicy();
+      }
+      final int? priority = await policy.triggerPriority(task: task, datastore: datastore);
+      if (priority != null) {
+        // Mark task as in progress to ensure it isn't scheduled over
+        task.status = Task.statusInProgress;
+        toBeScheduled.add(Tuple<Target, Task, int>(target, task, priority));
+      }
+    }
+
+    // Datastore must be written to generate task keys
+    try {
+      await datastore.withTransaction<void>((Transaction transaction) async {
+        transaction.queueMutations(inserts: <Commit>[commit]);
+        transaction.queueMutations(inserts: tasks);
+        await transaction.commit();
+        log.fine('Committed ${tasks.length} new tasks for commit ${commit.sha!}');
+      });
+    } catch (error) {
+      log.severe('Failed to add commit ${commit.sha!}: $error');
+    }
+
+    final firestore_commmit.Commit commitDocument = firestore_commmit.commitToCommitDocument(commit);
+    final List<firestore.Task> taskDocuments = firestore.targetsToTaskDocuments(commit, initialTargets);
+    final List<Write> writes = documentsToWrites([...taskDocuments, commitDocument], exists: false);
+    final FirestoreService firestoreService = await config.createFirestoreService();
+    // TODO(keyonghan): remove try catch logic after validated to work.
+    try {
+      await firestoreService.writeViaTransaction(writes);
+    } catch (error) {
+      log.warning('Failed to add to Firestore: $error');
+    }
+
+    await _batchScheduleBuilds(commit, toBeScheduled);
+    await _uploadToBigQuery(commit);
+  }
+
+  /// Schedule all builds in batch requests instead of a single request.
+  ///
+  /// Each batch request contains [Config.batchSize] builds to be scheduled.
+  Future<void> _batchScheduleBuilds(Commit commit, List<Tuple<Target, Task, int>> toBeScheduled) async {
+    log.info('Batching ${toBeScheduled.length} for ${commit.sha}');
+    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)),
+        ),
+      );
+    }
+    await Future.wait<void>(futures);
+  }
+
+  /// Return subset of [commits] not stored in Datastore.
+  Future<List<Commit>> _getMissingCommits(List<Commit> commits) async {
+    final List<Commit> newCommits = <Commit>[];
+    // Ensure commits are sorted from newest to oldest (descending order)
+    commits.sort((Commit a, Commit b) => b.timestamp!.compareTo(a.timestamp!));
+    for (Commit commit in commits) {
+      // Cocoon may randomly drop commits, so check the entire list.
+      if (!await _commitExistsInDatastore(commit)) {
+        newCommits.add(commit);
+      }
+    }
+
+    // Reverses commits to be in order of oldest to newest.
+    return newCommits;
+  }
+
+  /// Whether [Commit] already exists in [datastore].
+  ///
+  /// Datastore is Cocoon's source of truth for what commits have been scheduled.
+  /// Since webhooks or cron jobs can schedule commits, we must verify a commit
+  /// has not already been scheduled.
+  Future<bool> _commitExistsInDatastore(Commit commit) async {
+    try {
+      await datastore.db.lookupValue<Commit>(commit.key);
+    } on KeyNotFoundException {
+      return false;
+    }
+    return true;
+  }
+
+  /// Process and filters ciyaml.
+  Future<CiYaml> getCiYaml(
+    Commit commit, {
+    bool validate = false,
+  }) async {
+    final Commit totCommit = await generateTotCommit(slug: commit.slug, branch: Config.defaultBranch(commit.slug));
+    final CiYaml totYaml = await _getCiYaml(totCommit);
+    return _getCiYaml(commit, totCiYaml: totYaml, validate: validate);
+  }
+
+  /// Load in memory the `.ci.yaml`.
+  Future<CiYaml> _getCiYaml(
+    Commit commit, {
+    CiYaml? totCiYaml,
+    bool validate = false,
+    RetryOptions retryOptions = const RetryOptions(delayFactor: Duration(seconds: 2), maxAttempts: 4),
+  }) async {
+    String ciPath;
+    ciPath = '${commit.repository}/${commit.sha!}/$kCiYamlPath';
+    final Uint8List ciYamlBytes = (await cache.getOrCreate(
+      subcacheName,
+      ciPath,
+      createFn: () => _downloadCiYaml(
+        commit,
+        ciPath,
+        retryOptions: retryOptions,
+      ),
+      ttl: const Duration(hours: 1),
+    ))!;
+    final pb.SchedulerConfig schedulerConfig = pb.SchedulerConfig.fromBuffer(ciYamlBytes);
+    log.fine('Retrieved .ci.yaml for $ciPath');
+    // If totCiYaml is not null, we assume upper level function has verified that current branch is not a release branch.
+    return CiYaml(
+      config: schedulerConfig,
+      slug: commit.slug,
+      branch: commit.branch!,
+      totConfig: totCiYaml,
+      validate: validate,
+    );
+  }
+
+  /// Get `.ci.yaml` from GitHub, and store the bytes in redis for future retrieval.
+  ///
+  /// If GitHub returns [HttpStatus.notFound], an empty config will be inserted assuming
+  /// that commit does not support the scheduler config file.
+  Future<Uint8List> _downloadCiYaml(
+    Commit commit,
+    String ciPath, {
+    RetryOptions retryOptions = const RetryOptions(maxAttempts: 3),
+  }) async {
+    final String configContent = await githubFileContent(
+      commit.slug,
+      '.ci.yaml',
+      httpClientProvider: httpClientProvider,
+      ref: commit.sha!,
+      retryOptions: retryOptions,
+    );
+    final YamlMap configYaml = loadYaml(configContent) as YamlMap;
+    final pb.SchedulerConfig schedulerConfig = pb.SchedulerConfig()..mergeFromProto3Json(configYaml);
+    return schedulerConfig.writeToBuffer();
+  }
+
+  /// Cancel all incomplete targets against a pull request.
+  Future<void> cancelPreSubmitTargets({
+    required PullRequest pullRequest,
+    String reason = 'Newer commit available',
+  }) async {
+    log.info('Cancelling presubmit targets with buildbucket v2.');
+    await luciBuildService.cancelBuilds(
+      pullRequest: pullRequest,
+      reason: reason,
+    );
+  }
+
+  /// Schedule presubmit targets against a pull request.
+  ///
+  /// Cancels all existing targets then schedules the targets.
+  ///
+  /// Schedules a [kCiYamlCheckName] to validate [CiYaml] is valid and all builds were able to be triggered.
+  /// If [builderTriggerList] is specified, then trigger only those targets.
+  Future<void> triggerPresubmitTargets({
+    required PullRequest pullRequest,
+    String reason = 'Newer commit available',
+    List<String>? builderTriggerList,
+  }) async {
+    // Always cancel running builds so we don't ever schedule duplicates.
+    log.info('Attempting to cancel existing presubmit targets for ${pullRequest.number}');
+    await cancelPreSubmitTargets(
+      pullRequest: pullRequest,
+      reason: reason,
+    );
+
+    log.info('Creating ciYaml validation check run for ${pullRequest.number}');
+    final CheckRun ciValidationCheckRun = await githubChecksService.githubChecksUtil.createCheckRun(
+      config,
+      pullRequest.base!.repo!.slug(),
+      pullRequest.head!.sha!,
+      kCiYamlCheckName,
+      output: const CheckRunOutput(
+        title: kCiYamlCheckName,
+        summary: 'If this check is stuck pending, push an empty commit to retrigger the checks',
+      ),
+    );
+
+    log.info('Creating presubmit targets for ${pullRequest.number}');
+    final RepositorySlug slug = pullRequest.base!.repo!.slug();
+    dynamic exception;
+    try {
+      // Both the author and label should be checked to make sure that no one is
+      // attempting to get a pull request without check through.
+      if (pullRequest.user!.login == config.autosubmitBot &&
+          pullRequest.labels!.any((element) => element.name == Config.revertOfLabel)) {
+        log.info('Skipping generating the full set of checks for revert request.');
+      } else {
+        final List<Target> presubmitTargets = await getPresubmitTargets(pullRequest);
+        final List<Target> presubmitTriggerTargets = getTriggerList(presubmitTargets, builderTriggerList);
+        await luciBuildService.scheduleTryBuilds(
+          targets: presubmitTriggerTargets,
+          pullRequest: pullRequest,
+        );
+      }
+    } on FormatException catch (error, backtrace) {
+      log.warning('FormatException encountered when scheduling presubmit targets for ${pullRequest.number}');
+      log.warning(backtrace.toString());
+      exception = error;
+    } catch (error, backtrace) {
+      log.warning('Exception encountered when scheduling presubmit targets for ${pullRequest.number}');
+      log.warning(backtrace.toString());
+      exception = error;
+    }
+
+    // Update validate ci.yaml check
+    log.info('Updating ci.yaml validation check for ${pullRequest.number}');
+    if (exception == null) {
+      // Success in validating ci.yaml
+      log.info('ci.yaml validation check was successful for ${pullRequest.number}');
+      await githubChecksService.githubChecksUtil.updateCheckRun(
+        config,
+        slug,
+        ciValidationCheckRun,
+        status: CheckRunStatus.completed,
+        conclusion: CheckRunConclusion.success,
+      );
+    } else {
+      log.warning('Marking PR #${pullRequest.number} $kCiYamlCheckName as failed');
+      log.warning(exception.toString());
+      // Failure when validating ci.yaml
+      await githubChecksService.githubChecksUtil.updateCheckRun(
+        config,
+        slug,
+        ciValidationCheckRun,
+        status: CheckRunStatus.completed,
+        conclusion: CheckRunConclusion.failure,
+        output: CheckRunOutput(
+          title: kCiYamlCheckName,
+          summary: '.ci.yaml has failures',
+          text: exception.toString(),
+        ),
+      );
+    }
+    log.info(
+      '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].
+  /// Otherwise, return [presubmitTarget].
+  List<Target> getTriggerList(
+    List<Target> presubmitTarget,
+    List<String>? builderTriggerList,
+  ) {
+    if (builderTriggerList != null && builderTriggerList.isNotEmpty) {
+      return presubmitTarget.where((Target target) => builderTriggerList.contains(target.value.name)).toList();
+    }
+    return presubmitTarget;
+  }
+
+  /// Given a pull request event, retry all failed LUCI checks.
+  ///
+  /// 1. Aggregate .ci.yaml and try_builders.json presubmit builds.
+  /// 2. Get failed LUCI builds for this pull request at [commitSha].
+  /// 3. Rerun the failed builds that also have a failed check status.
+  Future<void> retryPresubmitTargets({
+    required PullRequest pullRequest,
+    required CheckSuiteEvent checkSuiteEvent,
+  }) async {
+    final GitHub githubClient = await config.createGitHubClient(pullRequest: pullRequest);
+    final Map<String, CheckRun> checkRuns = await githubChecksService.githubChecksUtil.allCheckRuns(
+      githubClient,
+      checkSuiteEvent,
+    );
+    final List<Target> presubmitTargets = await getPresubmitTargets(pullRequest);
+    final List<bbv2.Build?> failedBuilds =
+        await luciBuildService.failedBuilds(pullRequest: pullRequest, targets: presubmitTargets);
+    for (bbv2.Build? build in failedBuilds) {
+      final CheckRun checkRun = checkRuns[build!.builder.builder]!;
+
+      if (checkRun.status != CheckRunStatus.completed) {
+        // Check run is still in progress, do not retry.
+        continue;
+      }
+
+      await luciBuildService.scheduleTryBuilds(
+        targets: presubmitTargets.where((Target target) => build.builder.builder == target.value.name).toList(),
+        pullRequest: pullRequest,
+        checkSuiteEvent: checkSuiteEvent,
+      );
+    }
+  }
+
+  /// Get LUCI presubmit builders from .ci.yaml.
+  ///
+  /// Filters targets with runIf, matching them to the diff of [pullRequest].
+  ///
+  /// In the case there is an issue getting the diff from GitHub, all targets are returned.
+  Future<List<Target>> getPresubmitTargets(PullRequest pullRequest) async {
+    final Commit commit = Commit(
+      branch: pullRequest.base!.ref,
+      repository: pullRequest.base!.repo!.fullName,
+      sha: pullRequest.head!.sha,
+    );
+    late CiYaml ciYaml;
+    log.info('Attempting to read presubmit targets from ci.yaml for ${pullRequest.number}');
+    if (commit.branch == Config.defaultBranch(commit.slug)) {
+      ciYaml = await getCiYaml(commit, validate: true);
+    } else {
+      ciYaml = await getCiYaml(commit);
+    }
+    log.info('ci.yaml loaded successfully.');
+    log.info('Collecting presubmit targets for ${pullRequest.number}');
+
+    // Filter out schedulers targets with schedulers different than luci or cocoon.
+    final List<Target> presubmitTargets = ciYaml.presubmitTargets
+        .where(
+          (Target target) =>
+              target.value.scheduler == pb.SchedulerSystem.luci || target.value.scheduler == pb.SchedulerSystem.cocoon,
+        )
+        .toList();
+
+    // See https://github.com/flutter/flutter/issues/138430.
+    final includePostsubmitAsPresubmit = _includePostsubmitAsPresubmit(ciYaml, pullRequest);
+    if (includePostsubmitAsPresubmit) {
+      log.info('Including postsubmit targets as presubmit for ${pullRequest.number}');
+
+      for (Target target in ciYaml.postsubmitTargets) {
+        // We don't want to include a presubmit twice
+        // We don't want to run the builder_cache target as a presubmit
+        if (!target.value.presubmit && !target.value.properties.containsKey('cache_name')) {
+          presubmitTargets.add(target);
+        }
+      }
+    }
+
+    log.info('Collected ${presubmitTargets.length} presubmit targets.');
+    // Release branches should run every test.
+    if (pullRequest.base!.ref != Config.defaultBranch(pullRequest.base!.repo!.slug())) {
+      log.info('Release branch found, scheduling all targets for ${pullRequest.number}');
+      return presubmitTargets;
+    }
+    if (includePostsubmitAsPresubmit) {
+      log.info('Postsubmit targets included as presubmit, scheduling all targets for ${pullRequest.number}');
+      return presubmitTargets;
+    }
+
+    // Filter builders based on the PR diff
+    final GithubService githubService = await config.createGithubService(commit.slug);
+    List<String> files = <String>[];
+    try {
+      files = await githubService.listFiles(pullRequest);
+    } on GitHubError catch (error) {
+      log.warning(error);
+      log.warning('Unable to get diff for pullRequest=$pullRequest');
+      log.warning('Running all targets');
+      return presubmitTargets.toList();
+    }
+    return getTargetsToRun(presubmitTargets, files);
+  }
+
+  /// Returns `true` if [ciYaml.postsubmitTargets] should be ran during presubmit.
+  static bool _includePostsubmitAsPresubmit(CiYaml ciYaml, PullRequest pullRequest) {
+    // Only allow this for flutter/engine.
+    // See https://github.com/flutter/cocoon/pull/3256#issuecomment-1811624351.
+    if (ciYaml.slug != Config.engineSlug) {
+      return false;
+    }
+    if (pullRequest.labels?.any((label) => label.name.contains('test: all')) ?? false) {
+      return true;
+    }
+    return false;
+  }
+
+  /// Reschedules a failed build using a [CheckRunEvent]. The CheckRunEvent is
+  /// generated when someone clicks the re-run button from a failed build from
+  /// the Github UI.
+  ///
+  /// If the rerequested check is for [kCiYamlCheckName], all presubmit jobs are retried.
+  /// Otherwise, the specific check will be retried.
+  ///
+  /// Relevant APIs:
+  ///   https://developer.github.com/v3/checks/runs/#check-runs-and-requested-actions
+  Future<bool> processCheckRun(cocoon_checks.CheckRunEvent checkRunEvent) async {
+    switch (checkRunEvent.action) {
+      case 'rerequested':
+        log.fine('Rerun requested by GitHub user: ${checkRunEvent.sender?.login}');
+        final String? name = checkRunEvent.checkRun!.name;
+        bool success = false;
+        if (name == kCiYamlCheckName) {
+          // The CheckRunEvent.checkRun.pullRequests array is empty for this
+          // event, so we need to find the matching pull request.
+          final RepositorySlug slug = checkRunEvent.repository!.slug();
+          final String headSha = checkRunEvent.checkRun!.headSha!;
+          final int checkSuiteId = checkRunEvent.checkRun!.checkSuite!.id!;
+          final PullRequest? pullRequest =
+              await githubChecksService.findMatchingPullRequest(slug, headSha, checkSuiteId);
+          if (pullRequest != null) {
+            log.fine('Matched PR: ${pullRequest.number} Repo: ${slug.fullName}');
+            await triggerPresubmitTargets(pullRequest: pullRequest);
+            success = true;
+          } else {
+            log.warning('No matching PR found for head_sha in check run event.');
+          }
+        } else {
+          try {
+            final RepositorySlug slug = checkRunEvent.repository!.slug();
+            final String gitBranch = checkRunEvent.checkRun!.checkSuite!.headBranch ?? Config.defaultBranch(slug);
+            final String sha = checkRunEvent.checkRun!.headSha!;
+
+            // Only merged commits are added to the datastore. If a matching commit is found, this must be a postsubmit checkrun.
+            datastore = datastoreProvider(config.db);
+            final Key<String> commitKey =
+                Commit.createKey(db: datastore.db, slug: slug, gitBranch: gitBranch, sha: sha);
+            Commit? commit;
+            try {
+              commit = await Commit.fromDatastore(datastore: datastore, key: commitKey);
+              log.fine('Commit found in datastore.');
+            } on KeyNotFoundException {
+              log.fine('Commit not found in datastore.');
+            }
+
+            if (commit == null) {
+              log.fine('Rescheduling presubmit build.');
+              // Does not do anything with the returned build oddly.
+              await luciBuildService.reschedulePresubmitBuildUsingCheckRunEvent(checkRunEvent: checkRunEvent);
+            } else {
+              log.fine('Rescheduling postsubmit build.');
+              final String checkName = checkRunEvent.checkRun!.name!;
+              final Task task = await Task.fromDatastore(datastore: datastore, commitKey: commitKey, name: checkName);
+              final CiYaml ciYaml = await getCiYaml(commit);
+              final Target target =
+                  ciYaml.postsubmitTargets.singleWhere((Target target) => target.value.name == task.name);
+              await luciBuildService.reschedulePostsubmitBuildUsingCheckRunEvent(
+                checkRunEvent,
+                commit: commit,
+                task: task,
+                target: target,
+              );
+            }
+
+            success = true;
+          } on NoBuildFoundException {
+            log.warning('No build found to reschedule.');
+          }
+        }
+
+        log.fine('CheckName: $name State: $success');
+        return success;
+    }
+
+    return true;
+  }
+
+  /// Push [Commit] to BigQuery as part of the infra metrics dashboards.
+  Future<void> _uploadToBigQuery(Commit commit) async {
+    const String projectId = 'flutter-dashboard';
+    const String dataset = 'cocoon';
+    const String table = 'Checklist';
+
+    log.info('Uploading commit ${commit.sha} info to bigquery.');
+
+    final TabledataResource tabledataResource = await config.createTabledataResourceApi();
+    final List<Map<String, Object>> tableDataInsertAllRequestRows = <Map<String, Object>>[];
+
+    /// Consolidate [commits] together
+    ///
+    /// Prepare for bigquery [insertAll]
+    tableDataInsertAllRequestRows.add(<String, Object>{
+      'json': <String, Object?>{
+        'ID': commit.id,
+        'CreateTimestamp': commit.timestamp,
+        'FlutterRepositoryPath': commit.repository,
+        'CommitSha': commit.sha!,
+        'CommitAuthorLogin': commit.author,
+        'CommitAuthorAvatarURL': commit.authorAvatarUrl,
+        'CommitMessage': commit.message,
+        'Branch': commit.branch,
+      },
+    });
+
+    /// Final [rows] to be inserted to [BigQuery]
+    final TableDataInsertAllRequest rows =
+        TableDataInsertAllRequest.fromJson(<String, Object>{'rows': tableDataInsertAllRequestRows});
+
+    /// Insert [commits] to [BigQuery]
+    try {
+      if (rows.rows == null) {
+        log.warning('Rows to be inserted is null');
+      } else {
+        log.info('Inserting ${rows.rows!.length} into big query for ${commit.sha}');
+      }
+      await tabledataResource.insertAll(rows, projectId, dataset, table);
+    } on ApiRequestError {
+      log.warning('Failed to add commits to BigQuery: $ApiRequestError');
+    }
+  }
+
+  /// Returns the tip of tree [Commit] using specified [branch] and [RepositorySlug].
+  ///
+  /// A tip of tree [Commit] is used to help generate the tip of tree [CiYaml].
+  /// The generated tip of tree [CiYaml] will be compared against Presubmit Targets in current [CiYaml],
+  /// to ensure new targets without `bringup: true` label are not added into the build.
+  Future<Commit> generateTotCommit({required String branch, required RepositorySlug slug}) async {
+    datastore = datastoreProvider(config.db);
+    firestoreService = await config.createFirestoreService();
+    final BuildStatusService buildStatusService = buildStatusProvider(datastore, firestoreService);
+    final Commit totCommit = (await buildStatusService
+            .retrieveCommitStatus(
+              limit: 1,
+              branch: branch,
+              slug: slug,
+            )
+            .map<Commit>((CommitStatus status) => status.commit)
+            .toList())
+        .single;
+
+    return totCommit;
+  }
+}
diff --git a/app_dart/test/request_handlers/dart_internal_subscription_test.dart b/app_dart/test/request_handlers/dart_internal_subscription_test.dart
index ebbcdfb..8863695 100644
--- a/app_dart/test/request_handlers/dart_internal_subscription_test.dart
+++ b/app_dart/test/request_handlers/dart_internal_subscription_test.dart
@@ -2,13 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'dart:convert';
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
 import 'package:cocoon_service/cocoon_service.dart';
 import 'package:cocoon_service/src/model/appengine/commit.dart';
 import 'package:cocoon_service/src/model/appengine/task.dart';
 import 'package:cocoon_service/src/model/firestore/task.dart' as firestore;
-import 'package:cocoon_service/src/model/luci/buildbucket.dart';
-import 'package:cocoon_service/src/model/luci/push_message.dart' as push;
+import 'package:cocoon_service/src/model/luci/pubsub_message_v2.dart';
 import 'package:cocoon_service/src/service/datastore.dart';
+import 'package:fixnum/fixnum.dart';
 import 'package:gcloud/db.dart';
 import 'package:googleapis/firestore/v1.dart' hide Status;
 import 'package:mockito/mockito.dart';
@@ -17,53 +20,86 @@
 import '../src/datastore/fake_config.dart';
 import '../src/request_handling/fake_authentication.dart';
 import '../src/request_handling/fake_http.dart';
-import '../src/request_handling/subscription_tester.dart';
+import '../src/request_handling/subscription_v2_tester.dart';
 import '../src/utilities/entity_generators.dart';
 import '../src/utilities/mocks.dart';
 
 void main() {
+  // Omit the timestamps for expect purposes.
+  const String buildJson = '''
+{
+  "id": "8766855135863637953",
+  "builder": {
+    "project": "dart-internal",
+    "bucket": "flutter",
+    "builder": "Linux packaging_release_builder"
+  },
+  "number": 123456,
+  "status": "SUCCESS",
+  "input": {
+    "gitilesCommit": {
+      "project": "flutter/flutter",
+      "id": "HASH12345",
+      "ref": "refs/heads/test-branch"
+    }
+  }
+}
+''';
+
+  const String buildMessageJson = '''
+{
+  "build": {
+    "id": "8766855135863637953",
+    "builder": {
+      "project": "dart-internal",
+      "bucket": "flutter",
+      "builder": "Linux packaging_release_builder"
+    },
+    "number": 123456,
+    "status": "SUCCESS",
+    "input": {
+      "gitilesCommit": {
+        "project": "flutter/flutter",
+        "id": "HASH12345",
+        "ref": "refs/heads/test-branch"
+      }
+    }
+  }
+}
+''';
+
   late DartInternalSubscription handler;
   late FakeConfig config;
   late FakeHttpRequest request;
-  late MockBuildBucketClient buildBucketClient;
-  late SubscriptionTester tester;
+  late MockBuildBucketV2Client buildBucketV2Client;
+  late SubscriptionV2Tester tester;
   late MockFirestoreService mockFirestoreService;
   late Commit commit;
-  final DateTime startTime = DateTime(2023, 1, 1, 0, 0, 0);
-  final DateTime endTime = DateTime(2023, 1, 1, 0, 14, 23);
+
+  // ignore: unused_local_variable
   const String project = 'dart-internal';
   const String bucket = 'flutter';
   const String builder = 'Linux packaging_release_builder';
-  const int buildId = 123456;
+  const int buildNumber = 123456;
+  // ignore: unused_local_variable
+  final Int64 buildId = Int64(8766855135863637953);
   const String fakeHash = 'HASH12345';
   const String fakeBranch = 'test-branch';
-  const String fakePubsubMessage = '''
-    {
-      "build": {
-        "id": "$buildId",
-        "builder": {
-          "project": "$project",
-          "bucket": "$bucket",
-          "builder": "$builder"
-        }
-      }
-    }
-  ''';
 
   setUp(() async {
     mockFirestoreService = MockFirestoreService();
     config = FakeConfig(firestoreService: mockFirestoreService);
-    buildBucketClient = MockBuildBucketClient();
+    buildBucketV2Client = MockBuildBucketV2Client();
     handler = DartInternalSubscription(
       cache: CacheService(inMemory: true),
       config: config,
       authProvider: FakeAuthenticationProvider(),
-      buildBucketClient: buildBucketClient,
+      buildBucketV2Client: buildBucketV2Client,
       datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
     );
     request = FakeHttpRequest();
 
-    tester = SubscriptionTester(
+    tester = SubscriptionV2Tester(
       request: request,
     );
 
@@ -76,27 +112,20 @@
       timestamp: 0,
     );
 
-    final Build fakeBuild = Build(
-      builderId: const BuilderId(project: project, bucket: bucket, builder: builder),
-      number: buildId,
-      id: 'fake-build-id',
-      status: Status.success,
-      startTime: startTime,
-      endTime: endTime,
-      input: const Input(
-        gitilesCommit: GitilesCommit(
-          project: 'flutter/flutter',
-          hash: fakeHash,
-          ref: 'refs/heads/$fakeBranch',
-        ),
-      ),
-    );
+    // final bbv2.PubSubCallBack pubSubCallBackTest = bbv2.PubSubCallBack();
+    // pubSubCallBackTest.mergeFromProto3Json(jsonDecode(message));
+    final bbv2.Build build = bbv2.Build().createEmptyInstance();
+    build.mergeFromProto3Json(jsonDecode(buildJson) as Map<String, dynamic>);
+
+    const PushMessageV2 pushMessageV2 = PushMessageV2(data: buildJson, messageId: '798274983');
+    tester.message = pushMessageV2;
+
     when(
-      buildBucketClient.getBuild(
+      buildBucketV2Client.getBuild(
         any,
         buildBucketUri: 'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
       ),
-    ).thenAnswer((_) => Future<Build>.value(fakeBuild));
+    ).thenAnswer((_) => Future<bbv2.Build>.value(build));
 
     final List<Commit> datastoreCommit = <Commit>[commit];
     await config.db.commit(inserts: datastoreCommit);
@@ -111,12 +140,12 @@
     ).thenAnswer((Invocation invocation) {
       return Future<BatchWriteResponse>.value(BatchWriteResponse());
     });
-    tester.message = const push.PushMessage(data: fakePubsubMessage);
+    tester.message = const PushMessageV2(data: buildMessageJson);
 
     await tester.post(handler);
 
     verify(
-      buildBucketClient.getBuild(any),
+      buildBucketV2Client.getBuild(any),
     ).called(1);
 
     // This is used for testing to pull the data out of the "datastore" so that
@@ -124,7 +153,7 @@
     late Task taskInDb;
     late Commit commitInDb;
     config.db.values.forEach((k, v) {
-      if (v is Task && v.buildNumberList == buildId.toString()) {
+      if (v is Task && v.buildNumberList == buildNumber.toString()) {
         taskInDb = v;
       }
       if (v is Commit) {
@@ -146,16 +175,13 @@
     // Ensure the task in the db is exactly what we expect
     final Task expectedTask = Task(
       attempts: 1,
-      buildNumber: buildId,
-      buildNumberList: buildId.toString(),
+      buildNumber: buildNumber,
+      buildNumberList: buildNumber.toString(),
       builderName: builder,
       commitKey: commitInDb.key,
-      createTimestamp: startTime.millisecondsSinceEpoch,
-      endTimestamp: endTime.millisecondsSinceEpoch,
       luciBucket: bucket,
       name: builder,
       stageName: 'dart-internal',
-      startTimestamp: startTime.millisecondsSinceEpoch,
       status: 'Succeeded',
       key: commit.key.append(Task),
       timeoutInMinutes: 0,
@@ -194,12 +220,9 @@
       buildNumberList: existingTaskId.toString(),
       builderName: builder,
       commitKey: commit.key,
-      createTimestamp: startTime.millisecondsSinceEpoch,
-      endTimestamp: endTime.millisecondsSinceEpoch,
       luciBucket: bucket,
       name: builder,
       stageName: 'dart-internal',
-      startTimestamp: startTime.millisecondsSinceEpoch,
       status: 'Succeeded',
       key: commit.key.append(Task),
       timeoutInMinutes: 0,
@@ -210,17 +233,18 @@
     final List<Task> datastoreCommit = <Task>[fakeTask];
     await config.db.commit(inserts: datastoreCommit);
 
-    tester.message = const push.PushMessage(data: fakePubsubMessage);
+    const PushMessageV2 pushMessageV2 = PushMessageV2(data: buildMessageJson, messageId: '798274983');
+    tester.message = pushMessageV2;
 
     await tester.post(handler);
 
     verify(
-      buildBucketClient.getBuild(any),
+      buildBucketV2Client.getBuild(any),
     ).called(1);
 
     // This is used for testing to pull the data out of the "datastore" so that
     // we can verify what was saved.
-    final String expectedBuilderList = '${existingTaskId.toString()},${buildId.toString()}';
+    final String expectedBuilderList = '${existingTaskId.toString()},${buildNumber.toString()}';
     late Task taskInDb;
     late Commit commitInDb;
     config.db.values.forEach((k, v) {
@@ -246,16 +270,13 @@
     // Ensure the task in the db is exactly what we expect
     final Task expectedTask = Task(
       attempts: 2,
-      buildNumber: buildId,
+      buildNumber: buildNumber,
       buildNumberList: expectedBuilderList,
       builderName: builder,
       commitKey: commitInDb.key,
-      createTimestamp: startTime.millisecondsSinceEpoch,
-      endTimestamp: endTime.millisecondsSinceEpoch,
       luciBucket: bucket,
       name: builder,
       stageName: 'dart-internal',
-      startTimestamp: startTime.millisecondsSinceEpoch,
       status: 'Succeeded',
       key: commit.key.append(Task),
       timeoutInMinutes: 0,
@@ -278,67 +299,93 @@
     expect(insertedTaskDocument.status, expectedTask.status);
   });
 
-  test('ignores null message', () async {
-    tester.message = const push.PushMessage(data: null);
-    expect(await tester.post(handler), equals(Body.empty));
-  });
-
   test('ignores message with empty build data', () async {
-    tester.message = const push.PushMessage(data: '{}');
+    tester.message = const PushMessageV2();
     expect(await tester.post(handler), equals(Body.empty));
   });
 
+  // // TODO create a construction method for this to simplify testing.
   test('ignores message not from flutter bucket', () async {
-    tester.message = const push.PushMessage(
-      data: '''
-    {
-      "build": {
-        "id": "$buildId",
-        "builder": {
-          "project": "$project",
-          "bucket": "dart",
-          "builder": "$builder"
-        }
+    const String dartMessage = '''
+{
+  "build": {
+    "id": "8766855135863637953",
+    "builder": {
+      "project": "dart-internal",
+      "bucket": "dart",
+      "builder": "Linux packaging_release_builder"
+    },
+    "number": 123456,
+    "status": "SUCCESS",
+    "input": {
+      "gitilesCommit": {
+        "project":"flutter/flutter",
+        "id":"HASH12345",
+        "ref":"refs/heads/test-branch"
       }
     }
-    ''',
-    );
+  }
+}
+''';
+
+    const PushMessageV2 pushMessageV2 = PushMessageV2(data: dartMessage, messageId: '798274983');
+    tester.message = pushMessageV2;
     expect(await tester.post(handler), equals(Body.empty));
   });
 
   test('ignores message not from dart-internal project', () async {
-    tester.message = const push.PushMessage(
-      data: '''
-    {
-      "build": {
-        "id": "$buildId",
-        "builder": {
-          "project": "different-project",
-          "bucket": "$bucket",
-          "builder": "$builder"
-        }
+    const String unsupportedProjectMessage = '''
+{
+  "build": {
+    "id": "8766855135863637953",
+    "builder": {
+      "project": "unsupported-project",
+      "bucket": "dart",
+      "builder": "Linux packaging_release_builder"
+    },
+    "number": 123456,
+    "status": "SUCCESS",
+    "input": {
+      "gitilesCommit": {
+        "project": "flutter/flutter",
+        "id": "HASH12345",
+        "ref": "refs/heads/test-branch"
       }
     }
-    ''',
-    );
+  }
+}
+''';
+
+    const PushMessageV2 pushMessageV2 = PushMessageV2(data: unsupportedProjectMessage, messageId: '798274983');
+    tester.message = pushMessageV2;
     expect(await tester.post(handler), equals(Body.empty));
   });
 
   test('ignores message not from an accepted builder', () async {
-    tester.message = const push.PushMessage(
-      data: '''
-    {
-      "build": {
-        "id": "$buildId",
-        "builder": {
-          "project": "different-project",
-          "bucket": "$bucket",
-          "builder": "different-builder"
-        }
+    const String unknownBuilderMessage = '''
+{
+  "build": {
+    "id": "8766855135863637953",
+    "builder": {
+      "project": "dart-internal",
+      "bucket": "dart",
+      "builder": "different builder"
+    },
+    "number": 123456,
+    "status": "SUCCESS",
+    "input": {
+      "gitilesCommit": {
+        "project": "flutter/flutter",
+        "id": "HASH12345",
+        "ref": "refs/heads/test-branch"
       }
     }
-    ''',
-    );
+  }
+}
+''';
+
+    const PushMessageV2 pushMessageV2 = PushMessageV2(data: unknownBuilderMessage, messageId: '798274983');
+    tester.message = pushMessageV2;
     expect(await tester.post(handler), equals(Body.empty));
   });
 }
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 50c7336..48506c9 100644
--- a/app_dart/test/request_handlers/github/webhook_subscription_test.dart
+++ b/app_dart/test/request_handlers/github/webhook_subscription_test.dart
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+
 import 'package:cocoon_service/src/model/appengine/commit.dart';
 import 'package:cocoon_service/src/model/luci/buildbucket.dart';
 import 'package:cocoon_service/src/model/luci/push_message.dart' as pm;
@@ -19,10 +21,12 @@
 import '../../src/datastore/fake_datastore.dart';
 import '../../src/request_handling/fake_http.dart';
 import '../../src/request_handling/subscription_tester.dart';
+import '../../src/service/fake_build_bucket_v2_client.dart';
 import '../../src/service/fake_buildbucket.dart';
 import '../../src/service/fake_github_service.dart';
 import '../../src/service/fake_gerrit_service.dart';
 import '../../src/service/fake_scheduler.dart';
+import '../../src/service/fake_scheduler_v2.dart';
 import '../../src/utilities/entity_generators.dart';
 import '../../src/utilities/mocks.dart';
 import '../../src/utilities/webhook_generators.dart';
@@ -30,17 +34,18 @@
 void main() {
   late GithubWebhookSubscription webhook;
   late FakeBuildBucketClient fakeBuildBucketClient;
+  late FakeBuildBucketV2Client fakeBuildBucketV2Client;
   late FakeConfig config;
   late FakeDatastoreDB db;
   late FakeGithubService githubService;
   late FakeHttpRequest request;
   late FakeScheduler scheduler;
+  late FakeSchedulerV2 schedulerV2;
   late FakeGerritService gerritService;
   late MockCommitService commitService;
   late MockGitHub gitHubClient;
   late MockFirestoreService mockFirestoreService;
   late MockGithubChecksUtil mockGithubChecksUtil;
-  late MockGithubChecksService mockGithubChecksService;
   late MockIssuesService issuesService;
   late MockPullRequestsService pullRequestsService;
   late SubscriptionTester tester;
@@ -89,15 +94,17 @@
     when(pullRequestsService.edit(any, any, title: anyNamed('title'), state: anyNamed('state'), base: anyNamed('base')))
         .thenAnswer((_) async => PullRequest());
     fakeBuildBucketClient = FakeBuildBucketClient();
+    fakeBuildBucketV2Client = FakeBuildBucketV2Client();
     mockGithubChecksUtil = MockGithubChecksUtil();
     scheduler = FakeScheduler(
       config: config,
       buildbucket: fakeBuildBucketClient,
       githubChecksUtil: mockGithubChecksUtil,
     );
+    schedulerV2 =
+        FakeSchedulerV2(config: config, buildbucket: fakeBuildBucketV2Client, githubChecksUtil: mockGithubChecksUtil);
     tester = SubscriptionTester(request: request);
 
-    mockGithubChecksService = MockGithubChecksService();
     when(gitHubClient.issues).thenReturn(issuesService);
     when(gitHubClient.pullRequests).thenReturn(pullRequestsService);
     when(mockGithubChecksUtil.createCheckRun(any, any, any, any, output: anyNamed('output'))).thenAnswer((_) async {
@@ -114,8 +121,8 @@
       cache: CacheService(inMemory: true),
       datastoreProvider: (_) => DatastoreService(config.db, 5),
       gerritService: gerritService,
-      githubChecksService: mockGithubChecksService,
       scheduler: scheduler,
+      schedulerV2: schedulerV2,
       commitService: commitService,
     );
   });
@@ -250,9 +257,9 @@
       );
 
       await tester.post(webhook);
-
-      expect(scheduler.cancelPreSubmitTargetsCallCnt, 1);
-      expect(scheduler.addPullRequestCallCnt, 0);
+      // TODO this is v2 to route event temporarily from v1 to v2.
+      expect(schedulerV2.cancelPreSubmitTargetsCallCnt, 1);
+      expect(schedulerV2.addPullRequestCallCnt, 0);
     });
 
     test('Acts on closed, cancels presubmit targets, add pr for postsubmit target create', () async {
@@ -269,8 +276,8 @@
 
       await tester.post(webhook);
 
-      expect(scheduler.cancelPreSubmitTargetsCallCnt, 1);
-      expect(scheduler.addPullRequestCallCnt, 1);
+      expect(schedulerV2.cancelPreSubmitTargetsCallCnt, 1);
+      expect(schedulerV2.addPullRequestCallCnt, 1);
     });
 
     test('Acts on opened against master when default is main', () async {
@@ -315,8 +322,8 @@
         ),
       ).called(1);
 
-      expect(scheduler.triggerPresubmitTargetsCallCount, 1);
-      scheduler.resetTriggerPresubmitTargetsCallCount();
+      expect(schedulerV2.triggerPresubmitTargetsCallCount, 1);
+      schedulerV2.resetTriggerPresubmitTargetsCallCount();
     });
 
     test('Acts on edited against master when default is main', () async {
@@ -362,8 +369,8 @@
         ),
       ).called(1);
 
-      expect(scheduler.triggerPresubmitTargetsCallCount, 1);
-      scheduler.resetTriggerPresubmitTargetsCallCount();
+      expect(schedulerV2.triggerPresubmitTargetsCallCount, 1);
+      schedulerV2.resetTriggerPresubmitTargetsCallCount();
     });
 
     // We already schedule checks when a draft is opened, don't need to re-test
@@ -397,23 +404,24 @@
         number: issueNumber,
         isDraft: true,
       );
+
       bool batchRequestCalled = false;
 
-      Future<BatchResponse> getBatchResponse() async {
+      Future<bbv2.BatchResponse> getBatchResponse() async {
         batchRequestCalled = true;
-        return BatchResponse(
-          responses: <Response>[
-            Response(
-              searchBuilds: SearchBuildsResponse(
-                builds: <Build>[
-                  generateBuild(999, name: 'Linux', status: Status.ended),
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[
+                  bbv2.Build(number: 999, builder: bbv2.BuilderID(builder: 'Linux'), status: bbv2.Status.SUCCESS),
                 ],
               ),
             ),
-            Response(
-              searchBuilds: SearchBuildsResponse(
-                builds: <Build>[
-                  generateBuild(998, name: 'Linux', status: Status.ended),
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[
+                  bbv2.Build(number: 998, builder: bbv2.BuilderID(builder: 'Linux'), status: bbv2.Status.SUCCESS),
                 ],
               ),
             ),
@@ -421,12 +429,12 @@
         );
       }
 
-      fakeBuildBucketClient.batchResponse = getBatchResponse;
+      fakeBuildBucketV2Client.batchResponse = getBatchResponse;
 
       await tester.post(webhook);
 
       expect(batchRequestCalled, isTrue);
-      expect(scheduler.cancelPreSubmitTargetsCallCnt, 1);
+      expect(schedulerV2.cancelPreSubmitTargetsCallCnt, 1);
     });
 
     test('Does nothing against cherry pick PR', () async {
@@ -2188,21 +2196,22 @@
     test('When synchronized, cancels existing builds and schedules new ones', () async {
       const int issueNumber = 12345;
       bool batchRequestCalled = false;
-      Future<BatchResponse> getBatchResponse() async {
+
+      Future<bbv2.BatchResponse> getBatchResponse() async {
         batchRequestCalled = true;
-        return BatchResponse(
-          responses: <Response>[
-            Response(
-              searchBuilds: SearchBuildsResponse(
-                builds: <Build>[
-                  generateBuild(999, name: 'Linux', status: Status.ended),
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[
+                  bbv2.Build(number: 999, builder: bbv2.BuilderID(builder: 'Linux'), status: bbv2.Status.SUCCESS),
                 ],
               ),
             ),
-            Response(
-              searchBuilds: SearchBuildsResponse(
-                builds: <Build>[
-                  generateBuild(998, name: 'Linux', status: Status.ended),
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[
+                  bbv2.Build(number: 998, builder: bbv2.BuilderID(builder: 'Linux'), status: bbv2.Status.SUCCESS),
                 ],
               ),
             ),
@@ -2210,7 +2219,7 @@
         );
       }
 
-      fakeBuildBucketClient.batchResponse = getBatchResponse;
+      fakeBuildBucketV2Client.batchResponse = getBatchResponse;
 
       tester.message = generateGithubWebhookMessage(
         action: 'synchronize',
diff --git a/app_dart/test/request_handlers/postsubmit_luci_subscription_v2_test.dart b/app_dart/test/request_handlers/postsubmit_luci_subscription_v2_test.dart
new file mode 100644
index 0000000..e4e3cda
--- /dev/null
+++ b/app_dart/test/request_handlers/postsubmit_luci_subscription_v2_test.dart
@@ -0,0 +1,582 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/model/appengine/commit.dart';
+import 'package:cocoon_service/src/model/appengine/task.dart';
+import 'package:cocoon_service/src/model/firestore/commit.dart' as firestore_commit;
+import 'package:cocoon_service/src/model/firestore/task.dart' as firestore;
+import 'package:cocoon_service/src/request_handlers/postsubmit_luci_subscription_v2.dart';
+import 'package:cocoon_service/src/request_handling/exceptions.dart';
+import 'package:cocoon_service/src/service/datastore.dart';
+import 'package:googleapis/firestore/v1.dart';
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+import '../src/datastore/fake_config.dart';
+import '../src/request_handling/fake_authentication.dart';
+import '../src/request_handling/fake_http.dart';
+import '../src/request_handling/subscription_v2_tester.dart';
+import '../src/service/fake_luci_build_service_v2.dart';
+import '../src/service/fake_scheduler_v2.dart';
+import '../src/utilities/build_bucket_v2_messages.dart';
+import '../src/utilities/entity_generators.dart';
+import '../src/utilities/mocks.dart';
+import 'package:fixnum/fixnum.dart';
+
+void main() {
+  late PostsubmitLuciSubscriptionV2 handler;
+  late FakeConfig config;
+  late FakeHttpRequest request;
+  late MockFirestoreService mockFirestoreService;
+  late SubscriptionV2Tester tester;
+  late MockGithubChecksServiceV2 mockGithubChecksService;
+  late MockGithubChecksUtil mockGithubChecksUtil;
+  late FakeSchedulerV2 scheduler;
+  firestore.Task? firestoreTask;
+  firestore_commit.Commit? firestoreCommit;
+  late int attempt;
+
+  setUp(() async {
+    firestoreTask = null;
+    attempt = 0;
+    mockGithubChecksUtil = MockGithubChecksUtil();
+    mockFirestoreService = MockFirestoreService();
+    config = FakeConfig(
+      maxLuciTaskRetriesValue: 3,
+      firestoreService: mockFirestoreService,
+    );
+    mockGithubChecksService = MockGithubChecksServiceV2();
+    when(mockGithubChecksService.githubChecksUtil).thenReturn(mockGithubChecksUtil);
+    when(mockGithubChecksUtil.createCheckRun(any, any, any, any, output: anyNamed('output')))
+        .thenAnswer((_) async => generateCheckRun(1, name: 'Linux A'));
+    when(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).thenAnswer((_) async => true);
+    when(
+      mockFirestoreService.getDocument(
+        captureAny,
+      ),
+    ).thenAnswer((Invocation invocation) {
+      attempt++;
+      if (attempt == 1) {
+        return Future<Document>.value(
+          firestoreTask,
+        );
+      } else {
+        return Future<Document>.value(
+          firestoreCommit,
+        );
+      }
+    });
+    when(
+      mockFirestoreService.queryRecentCommits(
+        limit: captureAnyNamed('limit'),
+        slug: captureAnyNamed('slug'),
+        branch: captureAnyNamed('branch'),
+      ),
+    ).thenAnswer((Invocation invocation) {
+      return Future<List<firestore_commit.Commit>>.value(
+        <firestore_commit.Commit>[firestoreCommit!],
+      );
+    });
+    // when(
+    //   mockFirestoreService.getDocument(
+    //     'projects/flutter-dashboard/databases/cocoon/documents/tasks/87f88734747805589f2131753620d61b22922822_Linux A_1',
+    //   ),
+    // ).thenAnswer((Invocation invocation) {
+    //   return Future<Document>.value(
+    //     firestoreCommit,
+    //   );
+    // });
+    when(
+      mockFirestoreService.batchWriteDocuments(
+        captureAny,
+        captureAny,
+      ),
+    ).thenAnswer((Invocation invocation) {
+      return Future<BatchWriteResponse>.value(BatchWriteResponse());
+    });
+    final FakeLuciBuildServiceV2 luciBuildService = FakeLuciBuildServiceV2(
+      config: config,
+      githubChecksUtil: mockGithubChecksUtil,
+    );
+    scheduler = FakeSchedulerV2(
+      ciYaml: exampleConfig,
+      config: config,
+      luciBuildService: luciBuildService,
+    );
+    handler = PostsubmitLuciSubscriptionV2(
+      cache: CacheService(inMemory: true),
+      config: config,
+      authProvider: FakeAuthenticationProvider(),
+      githubChecksService: mockGithubChecksService,
+      datastoreProvider: (_) => DatastoreService(config.db, 5),
+      scheduler: scheduler,
+    );
+    request = FakeHttpRequest();
+
+    tester = SubscriptionV2Tester(
+      request: request,
+    );
+  });
+
+  test('throws exception when task document name is not in message', () async {
+    const Map<String, dynamic> userDataMap = {
+      'commit_key': 'flutter/main/abc123',
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: '',
+      userData: userDataMap,
+    );
+
+    expect(() => tester.post(handler), throwsA(isA<BadRequestException>()));
+  });
+
+  test('updates task based on message', () async {
+    firestoreTask = generateFirestoreTask(1, attempts: 2, name: 'Linux A');
+    when(mockGithubChecksService.currentAttempt(any)).thenAnswer((_) => 2);
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux A',
+      parent: commit,
+    );
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      userData: userDataMap,
+    );
+
+    config.db.values[commit.key] = commit;
+    config.db.values[task.key] = task;
+
+    expect(task.status, Task.statusNew);
+    expect(task.endTimestamp, 0);
+
+    // Firestore checks before API call.
+    expect(firestoreTask!.status, Task.statusNew);
+    expect(firestoreTask!.buildNumber, null);
+
+    await tester.post(handler);
+
+    expect(task.status, Task.statusSucceeded);
+    expect(task.endTimestamp, 1697672824674);
+
+    // Firestore checks after API call.
+    final List<dynamic> captured = verify(mockFirestoreService.batchWriteDocuments(captureAny, captureAny)).captured;
+    expect(captured.length, 2);
+    final BatchWriteRequest batchWriteRequest = captured[0] as BatchWriteRequest;
+    expect(batchWriteRequest.writes!.length, 1);
+    final Document updatedDocument = batchWriteRequest.writes![0].update!;
+    expect(updatedDocument.name, firestoreTask!.name);
+    expect(firestoreTask!.status, Task.statusSucceeded);
+    expect(firestoreTask!.buildNumber, 259942);
+  });
+
+  test('skips task processing when build is with scheduled status', () async {
+    firestoreTask = generateFirestoreTask(1, name: 'Linux A', status: firestore.Task.statusInProgress);
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux A',
+      parent: commit,
+      status: Task.statusInProgress,
+    );
+    config.db.values[task.key] = task;
+    config.db.values[commit.key] = commit;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SCHEDULED,
+      builder: 'Linux A',
+      userData: userDataMap,
+    );
+
+    expect(firestoreTask!.status, firestore.Task.statusInProgress);
+    expect(firestoreTask!.attempts, 1);
+    expect(await tester.post(handler), Body.empty);
+    expect(firestoreTask!.status, firestore.Task.statusInProgress);
+  });
+
+  test('skips task processing when task has already finished', () async {
+    firestoreTask = generateFirestoreTask(1, name: 'Linux A', status: firestore.Task.statusSucceeded);
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux A',
+      parent: commit,
+      status: Task.statusSucceeded,
+    );
+    config.db.values[task.key] = task;
+    config.db.values[commit.key] = commit;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.STARTED,
+      builder: 'Linux A',
+      userData: userDataMap,
+    );
+
+    expect(task.status, Task.statusSucceeded);
+    expect(task.attempts, 1);
+    expect(await tester.post(handler), Body.empty);
+    expect(task.status, Task.statusSucceeded);
+  });
+
+  test('skips task processing when target has been deleted', () async {
+    firestoreTask = generateFirestoreTask(1, name: 'Linux B', status: firestore.Task.statusSucceeded);
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux B',
+      parent: commit,
+      status: Task.statusSucceeded,
+    );
+    config.db.values[task.key] = task;
+    config.db.values[commit.key] = commit;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.STARTED,
+      builder: 'Linux B',
+      userData: userDataMap,
+    );
+
+    expect(task.status, Task.statusSucceeded);
+    expect(task.attempts, 1);
+    expect(await tester.post(handler), Body.empty);
+  });
+
+  test('does not fail on empty user data', () async {
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux A',
+    );
+    expect(await tester.post(handler), Body.empty);
+  });
+
+  test('on failed builds auto-rerun the build', () async {
+    firestoreTask = generateFirestoreTask(
+      1,
+      name: 'Linux A',
+      status: firestore.Task.statusFailed,
+      commitSha: '87f88734747805589f2131753620d61b22922822',
+    );
+    firestoreCommit = generateFirestoreCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux A',
+      parent: commit,
+      status: Task.statusFailed,
+    );
+    config.db.values[task.key] = task;
+    config.db.values[commit.key] = commit;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.FAILURE,
+      builder: 'Linux A',
+      userData: userDataMap,
+    );
+
+    expect(firestoreTask!.status, firestore.Task.statusFailed);
+    expect(firestoreTask!.attempts, 1);
+    expect(await tester.post(handler), Body.empty);
+    final List<dynamic> captured = verify(mockFirestoreService.batchWriteDocuments(captureAny, captureAny)).captured;
+    expect(captured.length, 2);
+    final BatchWriteRequest batchWriteRequest = captured[0] as BatchWriteRequest;
+    expect(batchWriteRequest.writes!.length, 1);
+    final Document insertedTaskDocument = batchWriteRequest.writes![0].update!;
+    final firestore.Task resultTask = firestore.Task.fromDocument(taskDocument: insertedTaskDocument);
+    expect(resultTask.status, firestore.Task.statusInProgress);
+    expect(resultTask.attempts, 2);
+  });
+
+  test('on canceled builds auto-rerun the build if they timed out', () async {
+    firestoreTask = generateFirestoreTask(
+      1,
+      name: 'Linux A',
+      status: firestore.Task.statusInfraFailure,
+      commitSha: '87f88734747805589f2131753620d61b22922822',
+    );
+    firestoreCommit = generateFirestoreCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux A',
+      parent: commit,
+      status: Task.statusInfraFailure,
+    );
+    config.db.values[task.key] = task;
+    config.db.values[commit.key] = commit;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.CANCELED,
+      builder: 'Linux A',
+      userData: userDataMap,
+    );
+
+    expect(firestoreTask!.status, firestore.Task.statusInfraFailure);
+    expect(firestoreTask!.attempts, 1);
+    expect(await tester.post(handler), Body.empty);
+    final List<dynamic> captured = verify(mockFirestoreService.batchWriteDocuments(captureAny, captureAny)).captured;
+    expect(captured.length, 2);
+    final BatchWriteRequest batchWriteRequest = captured[0] as BatchWriteRequest;
+    expect(batchWriteRequest.writes!.length, 1);
+    final Document insertedTaskDocument = batchWriteRequest.writes![0].update!;
+    final firestore.Task resultTask = firestore.Task.fromDocument(taskDocument: insertedTaskDocument);
+    expect(resultTask.status, firestore.Task.statusInProgress);
+    expect(resultTask.attempts, 2);
+  });
+
+  test('on builds resulting in an infra failure auto-rerun the build if they timed out', () async {
+    firestoreTask = generateFirestoreTask(
+      1,
+      name: 'Linux A',
+      status: firestore.Task.statusInfraFailure,
+      commitSha: '87f88734747805589f2131753620d61b22922822',
+    );
+    firestoreCommit = generateFirestoreCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux A',
+      parent: commit,
+      status: Task.statusInfraFailure,
+    );
+    config.db.values[task.key] = task;
+    config.db.values[commit.key] = commit;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.INFRA_FAILURE,
+      builder: 'Linux A',
+      userData: userDataMap,
+    );
+
+    expect(task.status, Task.statusInfraFailure);
+    expect(task.attempts, 1);
+    expect(await tester.post(handler), Body.empty);
+    final List<dynamic> captured = verify(mockFirestoreService.batchWriteDocuments(captureAny, captureAny)).captured;
+    expect(captured.length, 2);
+    final BatchWriteRequest batchWriteRequest = captured[0] as BatchWriteRequest;
+    expect(batchWriteRequest.writes!.length, 1);
+    final Document insertedTaskDocument = batchWriteRequest.writes![0].update!;
+    final firestore.Task resultTask = firestore.Task.fromDocument(taskDocument: insertedTaskDocument);
+    expect(resultTask.status, firestore.Task.statusInProgress);
+    expect(resultTask.attempts, 2);
+  });
+
+  test('non-bringup target updates check run', () async {
+    firestoreTask = generateFirestoreTask(1, name: 'Linux nonbringup');
+    scheduler.ciYaml = nonBringupPackagesConfig;
+    when(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).thenAnswer((_) async => true);
+    when(mockGithubChecksService.currentAttempt(any)).thenAnswer((_) => 2);
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822', repo: 'packages');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux nonbringup',
+      parent: commit,
+    );
+    config.db.values[commit.key] = commit;
+    config.db.values[task.key] = task;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux A',
+      userData: userDataMap,
+    );
+
+    await tester.post(handler);
+    verify(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).called(1);
+  });
+
+  test('bringup target does not update check run', () async {
+    firestoreTask = generateFirestoreTask(1, name: 'Linux bringup');
+    scheduler.ciYaml = bringupPackagesConfig;
+    when(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).thenAnswer((_) async => true);
+    when(mockGithubChecksService.currentAttempt(any)).thenAnswer((_) => 2);
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux bringup',
+      parent: commit,
+    );
+    config.db.values[commit.key] = commit;
+    config.db.values[task.key] = task;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux bringup',
+      userData: userDataMap,
+    );
+
+    await tester.post(handler);
+    verifyNever(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    );
+  });
+
+  test('unsupported repo target does not update check run', () async {
+    scheduler.ciYaml = unsupportedPostsubmitCheckrunConfig;
+    when(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).thenAnswer((_) async => true);
+    when(mockGithubChecksService.currentAttempt(any)).thenAnswer((_) => 2);
+    firestoreTask = generateFirestoreTask(1, attempts: 2, name: 'Linux flutter');
+
+    final Commit commit = generateCommit(1, sha: '87f88734747805589f2131753620d61b22922822');
+    final Task task = generateTask(
+      4507531199512576,
+      name: 'Linux flutter',
+      parent: commit,
+    );
+    config.db.values[commit.key] = commit;
+    config.db.values[task.key] = task;
+    final String taskDocumentName = '${commit.sha}_${task.name}_${task.attempts}';
+
+    final Map<String, dynamic> userDataMap = {
+      'task_key': '${task.key.id}',
+      'commit_key': '${task.key.parent?.id}',
+      'firestore_commit_document_name': commit.sha,
+      'firestore_task_document_name': taskDocumentName,
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux bringup',
+      userData: userDataMap,
+    );
+
+    await tester.post(handler);
+    verifyNever(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    );
+  });
+}
diff --git a/app_dart/test/request_handlers/presubmit_luci_subscription_test.dart b/app_dart/test/request_handlers/presubmit_luci_subscription_test.dart
index 87e7cb7..013d88b 100644
--- a/app_dart/test/request_handlers/presubmit_luci_subscription_test.dart
+++ b/app_dart/test/request_handlers/presubmit_luci_subscription_test.dart
@@ -12,7 +12,6 @@
 import '../src/request_handling/fake_authentication.dart';
 import '../src/request_handling/fake_http.dart';
 import '../src/request_handling/subscription_tester.dart';
-import '../src/service/fake_buildbucket.dart';
 import '../src/service/fake_luci_build_service.dart';
 import '../src/service/fake_scheduler.dart';
 import '../src/utilities/mocks.dart';
@@ -22,7 +21,6 @@
 
 void main() {
   late PresubmitLuciSubscription handler;
-  late FakeBuildBucketClient buildbucket;
   late FakeConfig config;
   late MockGitHub mockGitHubClient;
   late FakeHttpRequest request;
@@ -34,7 +32,6 @@
 
   setUp(() async {
     config = FakeConfig();
-    buildbucket = FakeBuildBucketClient();
     mockLuciBuildService = MockLuciBuildService();
 
     mockGithubChecksService = MockGithubChecksService();
@@ -46,7 +43,6 @@
     handler = PresubmitLuciSubscription(
       cache: CacheService(inMemory: true),
       config: config,
-      buildBucketClient: buildbucket,
       luciBuildService: FakeLuciBuildService(config: config),
       githubChecksService: mockGithubChecksService,
       authProvider: FakeAuthenticationProvider(),
diff --git a/app_dart/test/request_handlers/presubmit_luci_subscription_v2_test.dart b/app_dart/test/request_handlers/presubmit_luci_subscription_v2_test.dart
new file mode 100644
index 0000000..4c21446
--- /dev/null
+++ b/app_dart/test/request_handlers/presubmit_luci_subscription_v2_test.dart
@@ -0,0 +1,303 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/request_handlers/presubmit_luci_subscription_v2.dart';
+import 'package:fixnum/fixnum.dart';
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+import '../src/datastore/fake_config.dart';
+import '../src/request_handling/fake_authentication.dart';
+import '../src/request_handling/fake_http.dart';
+import '../src/request_handling/subscription_v2_tester.dart';
+import '../src/service/fake_luci_build_service_v2.dart';
+import '../src/service/fake_scheduler_v2.dart';
+import '../src/utilities/build_bucket_v2_messages.dart';
+import '../src/utilities/mocks.dart';
+
+const String ref = 'deadbeef';
+
+void main() {
+  late PresubmitLuciSubscriptionV2 handler;
+  late FakeConfig config;
+  late MockGitHub mockGitHubClient;
+  late FakeHttpRequest request;
+  late SubscriptionV2Tester tester;
+  late MockRepositoriesService mockRepositoriesService;
+  late MockGithubChecksServiceV2 mockGithubChecksService;
+  late MockLuciBuildServiceV2 mockLuciBuildService;
+  late FakeSchedulerV2 scheduler;
+
+  setUp(() async {
+    config = FakeConfig();
+    mockLuciBuildService = MockLuciBuildServiceV2();
+
+    mockGithubChecksService = MockGithubChecksServiceV2();
+    scheduler = FakeSchedulerV2(
+      ciYaml: examplePresubmitRescheduleConfig,
+      config: config,
+      luciBuildService: mockLuciBuildService,
+    );
+
+    handler = PresubmitLuciSubscriptionV2(
+      cache: CacheService(inMemory: true),
+      config: config,
+      luciBuildService: FakeLuciBuildServiceV2(config: config),
+      githubChecksService: mockGithubChecksService,
+      authProvider: FakeAuthenticationProvider(),
+      scheduler: scheduler,
+    );
+    request = FakeHttpRequest();
+
+    tester = SubscriptionV2Tester(
+      request: request,
+    );
+
+    mockGitHubClient = MockGitHub();
+    mockRepositoriesService = MockRepositoriesService();
+    when(mockGitHubClient.repositories).thenReturn(mockRepositoriesService);
+    config.githubClient = mockGitHubClient;
+  });
+
+  test('Requests without repo_owner and repo_name do not update checks', () async {
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux Host Engine',
+      addBuildSet: false,
+    );
+
+    await tester.post(handler);
+
+    verifyNever(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    );
+  });
+
+  test('Requests with repo_owner and repo_name update checks', () async {
+    when(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).thenAnswer((_) async => true);
+
+    when(mockGithubChecksService.taskFailed(any)).thenAnswer((_) => false);
+
+    const Map<String, dynamic> userDataMap = {
+      'repo_owner': 'flutter',
+      'repo_name': 'cocoon',
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux Host Engine',
+      userData: userDataMap,
+    );
+
+    await tester.post(handler);
+    verify(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).called(1);
+  });
+
+  test('Requests when task failed but no need to reschedule', () async {
+    when(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).thenAnswer((_) async => true);
+    when(mockGithubChecksService.taskFailed(any)).thenAnswer((_) => true);
+    when(mockGithubChecksService.currentAttempt(any)).thenAnswer((_) => 1);
+
+    const Map<String, dynamic> userDataMap = {
+      'repo_owner': 'flutter',
+      'commit_branch': 'main',
+      'commit_sha': 'abc',
+      'repo_name': 'flutter',
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux A',
+      userData: userDataMap,
+    );
+
+    final bbv2.BuildsV2PubSub buildsV2PubSub = createBuild(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux A',
+    );
+
+    when(
+      mockLuciBuildService.rescheduleBuild(
+        build: buildsV2PubSub.build,
+        builderName: 'Linux Coverage',
+        rescheduleAttempt: 0,
+        userDataMap: userDataMap,
+      ),
+    ).thenAnswer(
+      (_) async => bbv2.Build(
+        id: Int64(8905920700440101120),
+        builder: bbv2.BuilderID(bucket: 'luci.flutter.prod', project: 'flutter', builder: 'Linux Coverage'),
+      ),
+    );
+
+    await tester.post(handler);
+    verifyNever(
+      mockLuciBuildService.rescheduleBuild(
+        build: buildsV2PubSub.build,
+        builderName: 'Linux Coverage',
+        rescheduleAttempt: 0,
+        userDataMap: userDataMap,
+      ),
+    );
+    verify(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+      ),
+    ).called(1);
+  });
+
+  test('Requests when task failed but need to reschedule', () async {
+    when(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+        rescheduled: true,
+      ),
+    ).thenAnswer((_) async => true);
+    when(mockGithubChecksService.taskFailed(any)).thenAnswer((_) => true);
+    when(mockGithubChecksService.currentAttempt(any)).thenAnswer((_) => 0);
+
+    const Map<String, dynamic> userDataMap = {
+      'repo_owner': 'flutter',
+      'commit_branch': 'main',
+      'commit_sha': 'abc',
+      'repo_name': 'flutter',
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux B',
+      userData: userDataMap,
+    );
+
+    final bbv2.BuildsV2PubSub buildsV2PubSub = createBuild(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux A',
+    );
+
+    when(
+      mockLuciBuildService.rescheduleBuild(
+        build: buildsV2PubSub.build,
+        builderName: 'Linux Coverage',
+        rescheduleAttempt: 1,
+        userDataMap: userDataMap,
+      ),
+    ).thenAnswer(
+      (_) async => bbv2.Build(
+        id: Int64(8905920700440101120),
+        builder: bbv2.BuilderID(bucket: 'luci.flutter.prod', project: 'flutter', builder: 'Linux B'),
+      ),
+    );
+    await tester.post(handler);
+    verifyNever(
+      mockLuciBuildService.rescheduleBuild(
+        build: buildsV2PubSub.build,
+        builderName: 'Linux Coverage',
+        rescheduleAttempt: 1,
+        userDataMap: userDataMap,
+      ),
+    );
+    verify(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+        rescheduled: true,
+      ),
+    ).called(1);
+  });
+
+  test('Build not rescheduled if not found in ciYaml list.', () async {
+    when(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+        rescheduled: false,
+      ),
+    ).thenAnswer((_) async => true);
+    when(mockGithubChecksService.taskFailed(any)).thenAnswer((_) => true);
+    when(mockGithubChecksService.currentAttempt(any)).thenAnswer((_) => 1);
+
+    const Map<String, dynamic> userDataMap = {
+      'repo_owner': 'flutter',
+      'commit_branch': 'main',
+      'commit_sha': 'abc',
+      'repo_name': 'flutter',
+    };
+
+    tester.message = createPushMessageV2(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux C',
+      userData: userDataMap,
+    );
+
+    final bbv2.BuildsV2PubSub buildsV2PubSub = createBuild(
+      Int64(1),
+      status: bbv2.Status.SUCCESS,
+      builder: 'Linux C',
+    );
+
+    await tester.post(handler);
+    verifyNever(
+      mockLuciBuildService.rescheduleBuild(
+        build: buildsV2PubSub.build,
+        builderName: 'Linux C',
+        userDataMap: userDataMap,
+        rescheduleAttempt: 1,
+      ),
+    );
+    verify(
+      mockGithubChecksService.updateCheckStatus(
+        build: anyNamed('build'),
+        userDataMap: anyNamed('userDataMap'),
+        luciBuildService: anyNamed('luciBuildService'),
+        slug: anyNamed('slug'),
+        rescheduled: false,
+      ),
+    ).called(1);
+  });
+}
diff --git a/app_dart/test/request_handlers/reset_prod_task_v2_test.dart b/app_dart/test/request_handlers/reset_prod_task_v2_test.dart
new file mode 100644
index 0000000..9d34494
--- /dev/null
+++ b/app_dart/test/request_handlers/reset_prod_task_v2_test.dart
@@ -0,0 +1,230 @@
+// Copyright 2020 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/model/appengine/commit.dart';
+import 'package:cocoon_service/src/model/appengine/task.dart';
+import 'package:cocoon_service/src/model/firestore/task.dart' as firestore;
+import 'package:cocoon_service/src/request_handlers/reset_prod_task_v2.dart';
+import 'package:cocoon_service/src/request_handling/exceptions.dart';
+import 'package:googleapis/firestore/v1.dart';
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+import '../src/datastore/fake_config.dart';
+import '../src/datastore/fake_datastore.dart';
+import '../src/request_handling/api_request_handler_tester.dart';
+import '../src/request_handling/fake_authentication.dart';
+import '../src/service/fake_scheduler_v2.dart';
+import '../src/utilities/entity_generators.dart';
+import '../src/utilities/mocks.dart';
+
+void main() {
+  group('ResetProdTask', () {
+    FakeClientContext clientContext;
+    late ResetProdTaskV2 handler;
+    late FakeConfig config;
+    FakeKeyHelper keyHelper;
+    late MockLuciBuildServiceV2 mockLuciBuildService;
+    late MockFirestoreService mockFirestoreService;
+    late ApiRequestHandlerTester tester;
+    late Commit commit;
+    late Task task;
+    final firestore.Task firestoreTask = generateFirestoreTask(1, attempts: 1);
+
+    setUp(() {
+      final FakeDatastoreDB datastoreDB = FakeDatastoreDB();
+      clientContext = FakeClientContext();
+      mockFirestoreService = MockFirestoreService();
+      clientContext.isDevelopmentEnvironment = false;
+      keyHelper = FakeKeyHelper(applicationContext: clientContext.applicationContext);
+      config = FakeConfig(
+        dbValue: datastoreDB,
+        keyHelperValue: keyHelper,
+        supportedBranchesValue: <String>[
+          Config.defaultBranch(Config.flutterSlug),
+        ],
+        firestoreService: mockFirestoreService,
+      );
+      final FakeAuthenticatedContext authContext = FakeAuthenticatedContext(clientContext: clientContext);
+      tester = ApiRequestHandlerTester(context: authContext);
+      mockLuciBuildService = MockLuciBuildServiceV2();
+      handler = ResetProdTaskV2(
+        config: config,
+        authenticationProvider: FakeAuthenticationProvider(clientContext: clientContext),
+        luciBuildService: mockLuciBuildService,
+        scheduler: FakeSchedulerV2(
+          config: config,
+          ciYaml: exampleConfig,
+        ),
+      );
+      commit = generateCommit(1);
+      task = generateTask(
+        1,
+        name: 'Linux A',
+        parent: commit,
+        status: Task.statusFailed,
+      );
+      tester.requestData = <String, dynamic>{
+        'Key': config.keyHelper.encode(task.key),
+      };
+
+      when(
+        mockFirestoreService.getDocument(
+          captureAny,
+        ),
+      ).thenAnswer((Invocation invocation) {
+        return Future<Document>.value(
+          firestoreTask,
+        );
+      });
+
+      when(
+        mockLuciBuildService.checkRerunBuilder(
+          commit: anyNamed('commit'),
+          datastore: anyNamed('datastore'),
+          task: anyNamed('task'),
+          target: anyNamed('target'),
+          tags: anyNamed('tags'),
+          ignoreChecks: anyNamed('ignoreChecks'),
+          firestoreService: mockFirestoreService,
+          taskDocument: anyNamed('taskDocument'),
+        ),
+      ).thenAnswer((_) async => true);
+    });
+    test('Schedule new task', () async {
+      config.db.values[task.key] = task;
+      config.db.values[commit.key] = commit;
+      expect(await tester.post(handler), Body.empty);
+
+      final List<dynamic> captured = verify(mockFirestoreService.getDocument(captureAny)).captured;
+      expect(captured.length, 1);
+      final String documentName = captured[0] as String;
+      expect(
+        documentName,
+        '$kDatabase/documents/${firestore.kTaskCollectionId}/${commit.sha}_${task.name}_${task.attempts}',
+      );
+    });
+
+    test('schedule new task when task document is aviable', () async {
+      config.db.values[task.key] = task;
+      config.db.values[commit.key] = commit;
+      tester.requestData = <String, dynamic>{
+        'taskDocumentName':
+            '$kDatabase/documents/${firestore.kTaskCollectionId}/${commit.sha}_${task.name}_${task.attempts}}',
+        'Commit': commit.sha,
+        'Task': task.name,
+        'Repo': commit.slug.name,
+      };
+      expect(await tester.post(handler), Body.empty);
+    });
+
+    test('Re-schedule passing all the parameters', () async {
+      config.db.values[task.key] = task;
+      config.db.values[commit.key] = commit;
+      tester.requestData = <String, dynamic>{
+        'Commit': commit.sha,
+        'Task': task.name,
+        'Repo': commit.slug.name,
+      };
+      expect(await tester.post(handler), Body.empty);
+      verify(
+        mockLuciBuildService.checkRerunBuilder(
+          commit: anyNamed('commit'),
+          datastore: anyNamed('datastore'),
+          task: anyNamed('task'),
+          target: anyNamed('target'),
+          tags: anyNamed('tags'),
+          ignoreChecks: true,
+          firestoreService: mockFirestoreService,
+          taskDocument: anyNamed('taskDocument'),
+        ),
+      ).called(1);
+    });
+
+    test('Rerun all failed tasks when task name is all', () async {
+      final Task taskA = generateTask(2, name: 'Linux A', parent: commit, status: Task.statusFailed);
+      final Task taskB = generateTask(3, name: 'Mac A', parent: commit, status: Task.statusFailed);
+      config.db.values[taskA.key] = taskA;
+      config.db.values[taskB.key] = taskB;
+      config.db.values[commit.key] = commit;
+      tester.requestData = <String, dynamic>{
+        'Commit': commit.sha,
+        'Task': 'all',
+        'Repo': commit.slug.name,
+      };
+      expect(await tester.post(handler), Body.empty);
+      verify(
+        mockLuciBuildService.checkRerunBuilder(
+          commit: anyNamed('commit'),
+          datastore: anyNamed('datastore'),
+          task: anyNamed('task'),
+          target: anyNamed('target'),
+          tags: anyNamed('tags'),
+          ignoreChecks: false,
+          firestoreService: mockFirestoreService,
+          taskDocument: anyNamed('taskDocument'),
+        ),
+      ).called(2);
+    });
+
+    test('Rerun all runs nothing when everything is passed', () async {
+      final Task task = generateTask(2, name: 'Windows A', parent: commit, status: Task.statusSucceeded);
+      config.db.values[task.key] = task;
+      config.db.values[commit.key] = commit;
+      tester.requestData = <String, dynamic>{
+        'Commit': commit.sha,
+        'Task': 'all',
+        'Repo': commit.slug.name,
+      };
+      expect(await tester.post(handler), Body.empty);
+      verifyNever(
+        mockLuciBuildService.checkRerunBuilder(
+          commit: anyNamed('commit'),
+          datastore: anyNamed('datastore'),
+          task: anyNamed('task'),
+          target: anyNamed('target'),
+          tags: anyNamed('tags'),
+          firestoreService: anyNamed('firestoreService'),
+          taskDocument: anyNamed('taskDocument'),
+          ignoreChecks: false,
+        ),
+      );
+    });
+
+    test('Re-schedule without any parameters raises exception', () async {
+      tester.requestData = <String, dynamic>{};
+      expect(() => tester.post(handler), throwsA(isA<BadRequestException>()));
+    });
+
+    test('Re-schedule existing task even though taskName is missing in the task', () async {
+      config.db.values[task.key] = task;
+      config.db.values[commit.key] = commit;
+      expect(await tester.post(handler), Body.empty);
+    });
+
+    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,
+          firestoreService: mockFirestoreService,
+          taskDocument: anyNamed('taskDocument'),
+        ),
+      ).thenAnswer((_) async => false);
+      config.db.values[task.key] = task;
+      config.db.values[commit.key] = commit;
+      expect(() => tester.post(handler), throwsA(isA<InternalServerError>()));
+    });
+
+    test('Fails if commit does not exist', () async {
+      config.db.values[task.key] = task;
+      expect(() => tester.post(handler), throwsA(isA<StateError>()));
+    });
+  });
+}
diff --git a/app_dart/test/request_handlers/reset_try_task_v2_test.dart b/app_dart/test/request_handlers/reset_try_task_v2_test.dart
new file mode 100644
index 0000000..f383f9d
--- /dev/null
+++ b/app_dart/test/request_handlers/reset_try_task_v2_test.dart
@@ -0,0 +1,99 @@
+// Copyright 2020 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/src/request_handlers/reset_try_task_v2.dart';
+import 'package:cocoon_service/src/request_handling/body.dart';
+import 'package:cocoon_service/src/request_handling/exceptions.dart';
+import 'package:github/github.dart';
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+import '../src/datastore/fake_config.dart';
+import '../src/request_handling/api_request_handler_tester.dart';
+import '../src/request_handling/fake_authentication.dart';
+import '../src/request_handling/fake_http.dart';
+import '../src/service/fake_github_service.dart';
+import '../src/service/fake_scheduler_v2.dart';
+import '../src/utilities/entity_generators.dart';
+import '../src/utilities/mocks.dart';
+
+void main() {
+  group('ResetTryTask', () {
+    late ApiRequestHandlerTester tester;
+    FakeClientContext clientContext;
+    late ResetTryTaskV2 handler;
+    late FakeConfig config;
+    FakeSchedulerV2 fakeScheduler;
+    FakeAuthenticatedContext authContext;
+    MockGitHub mockGithub;
+    MockPullRequestsService mockPullRequestsService;
+    late MockGithubChecksUtil mockGithubChecksUtil;
+
+    setUp(() {
+      clientContext = FakeClientContext();
+      clientContext.isDevelopmentEnvironment = false;
+      authContext = FakeAuthenticatedContext(clientContext: clientContext);
+      mockGithub = MockGitHub();
+      mockPullRequestsService = MockPullRequestsService();
+      config = FakeConfig(githubClient: mockGithub, githubService: FakeGithubService());
+      mockGithubChecksUtil = MockGithubChecksUtil();
+      tester = ApiRequestHandlerTester(context: authContext);
+      fakeScheduler = FakeSchedulerV2(
+        config: config,
+        githubChecksUtil: mockGithubChecksUtil,
+      );
+      handler = ResetTryTaskV2(
+        config: config,
+        authenticationProvider: FakeAuthenticationProvider(clientContext: clientContext),
+        scheduler: fakeScheduler,
+      );
+      when(mockGithub.pullRequests).thenReturn(mockPullRequestsService);
+      when(mockPullRequestsService.get(any, 123)).thenAnswer((_) async => generatePullRequest(id: 123));
+    });
+
+    test('Empty repo', () async {
+      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',
+        },
+      );
+      expect(() => tester.get(handler), throwsA(isA<BadRequestException>()));
+    });
+
+    test('Trigger builds if all parameters are correct', () 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',
+          'check_suite': <String, dynamic>{'id': 2},
+        });
+      });
+      tester.request = FakeHttpRequest(
+        queryParametersValue: <String, String>{
+          ResetTryTaskV2.kRepoParam: 'flutter',
+          ResetTryTaskV2.kPullRequestNumberParam: '123',
+        },
+      );
+      expect(await tester.get(handler), Body.empty);
+    });
+
+    test('Parses empty builder correctly', () {
+      final List<String> builders = handler.getBuilderList('');
+      expect(builders.isEmpty, true);
+    });
+
+    test('Parses non-empty builder correctly', () {
+      expect(handler.getBuilderList('a, b, c'), <String>['a', 'b', 'c']);
+    });
+  });
+}
diff --git a/app_dart/test/request_handlers/scheduler/batch_backfiller_v2_test.dart b/app_dart/test/request_handlers/scheduler/batch_backfiller_v2_test.dart
new file mode 100644
index 0000000..f7d75f9
--- /dev/null
+++ b/app_dart/test/request_handlers/scheduler/batch_backfiller_v2_test.dart
@@ -0,0 +1,327 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/model/appengine/commit.dart';
+import 'package:cocoon_service/src/model/appengine/task.dart';
+import 'package:cocoon_service/src/model/firestore/task.dart' as firestore;
+import 'package:cocoon_service/src/model/ci_yaml/target.dart';
+import 'package:cocoon_service/src/request_handlers/scheduler/batch_backfiller_v2.dart';
+import 'package:googleapis/firestore/v1.dart';
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+import '../../src/datastore/fake_config.dart';
+import '../../src/datastore/fake_datastore.dart';
+import '../../src/request_handling/fake_pubsub.dart';
+import '../../src/request_handling/request_handler_tester.dart';
+import '../../src/service/fake_luci_build_service_v2.dart';
+import '../../src/service/fake_scheduler_v2.dart';
+import '../../src/utilities/entity_generators.dart';
+import '../../src/utilities/mocks.dart';
+
+final List<Commit> commits = <Commit>[
+  generateCommit(3),
+  generateCommit(2),
+  generateCommit(1),
+];
+
+void main() {
+  late BatchBackfillerV2 handler;
+  late RequestHandlerTester tester;
+  late FakeDatastoreDB db;
+  late FakePubSub pubsub;
+  late FakeSchedulerV2 scheduler;
+  late MockGithubChecksUtil mockGithubChecksUtil;
+  late Config config;
+  late MockFirestoreService mockFirestoreService;
+
+  group('BatchBackfiller', () {
+    setUp(() async {
+      mockFirestoreService = MockFirestoreService();
+
+      db = FakeDatastoreDB()..addOnQuery<Commit>((Iterable<Commit> results) => commits);
+
+      config = FakeConfig(
+        dbValue: db,
+        backfillerTargetLimitValue: 2,
+        firestoreService: mockFirestoreService,
+      );
+
+      pubsub = FakePubSub();
+
+      mockGithubChecksUtil = MockGithubChecksUtil();
+
+      when(
+        mockGithubChecksUtil.createCheckRun(
+          any,
+          any,
+          any,
+          any,
+          output: anyNamed('output'),
+        ),
+      ).thenAnswer((_) async => generateCheckRun(1));
+
+      when(
+        mockFirestoreService.writeViaTransaction(
+          captureAny,
+        ),
+      ).thenAnswer((Invocation invocation) {
+        return Future<CommitResponse>.value(CommitResponse());
+      });
+
+      scheduler = FakeSchedulerV2(
+        config: config,
+        ciYaml: batchPolicyConfig,
+        githubChecksUtil: mockGithubChecksUtil,
+        luciBuildService: FakeLuciBuildServiceV2(
+          config: config,
+          pubsub: pubsub,
+          githubChecksUtil: mockGithubChecksUtil,
+        ),
+      );
+
+      handler = BatchBackfillerV2(
+        config: config,
+        scheduler: scheduler,
+      );
+
+      tester = RequestHandlerTester();
+    });
+
+    test('does not backfill on completed task column', () async {
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => allGreen);
+      await tester.get(handler);
+      expect(pubsub.messages, isEmpty);
+    });
+
+    test('does not backfill when there is a running task', () async {
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => middleTaskInProgress);
+      await tester.get(handler);
+      expect(pubsub.messages, isEmpty);
+    });
+
+    test('does not backfill when task does not exist in TOT', () async {
+      scheduler = FakeSchedulerV2(
+        config: config,
+        ciYaml: notInToTConfig,
+        githubChecksUtil: mockGithubChecksUtil,
+        luciBuildService: FakeLuciBuildServiceV2(
+          config: config,
+          pubsub: pubsub,
+          githubChecksUtil: mockGithubChecksUtil,
+        ),
+      );
+      handler = BatchBackfillerV2(
+        config: config,
+        scheduler: scheduler,
+      );
+      final List<Task> allGray = <Task>[
+        generateTask(1, name: 'Linux_android B', status: Task.statusNew),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => allGray);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 0);
+    });
+
+    test('backfills latest task', () async {
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => allGray);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 1);
+
+      final bbv2.BatchRequest batchRequest = bbv2.BatchRequest.create();
+      batchRequest.mergeFromProto3Json(pubsub.messages.first);
+
+      final bbv2.ScheduleBuildRequest scheduleBuildRequest = batchRequest.requests.first.scheduleBuild;
+
+      expect(scheduleBuildRequest.priority, LuciBuildService.kBackfillPriority);
+    });
+
+    test('does not backfill targets when number of available tasks is less than BatchPolicy.kBatchSize', () async {
+      final List<Task> scheduleA = <Task>[
+        generateTask(1, name: 'Linux_android A', status: Task.statusNew),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => scheduleA);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 0);
+    });
+
+    test('backfills earlier failed task with higher priority', () async {
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => allGray);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 1);
+
+      final bbv2.BatchRequest batchRequest = bbv2.BatchRequest.create();
+      batchRequest.mergeFromProto3Json(pubsub.messages.first);
+
+      final bbv2.ScheduleBuildRequest scheduleBuildRequest = batchRequest.requests.first.scheduleBuild;
+
+      expect(scheduleBuildRequest.priority, LuciBuildService.kRerunPriority);
+    });
+
+    test('backfills task successfully with retry', () async {
+      pubsub.exceptionFlag = true;
+      pubsub.exceptionRepetition = 1;
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => allGray);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 1);
+
+      final bbv2.BatchRequest batchRequest = bbv2.BatchRequest.create();
+      batchRequest.mergeFromProto3Json(pubsub.messages.first);
+
+      final bbv2.ScheduleBuildRequest scheduleBuildRequest = batchRequest.requests.first.scheduleBuild;
+
+      expect(scheduleBuildRequest.priority, LuciBuildService.kRerunPriority);
+    });
+
+    test('fails to backfill tasks when retry limit is hit', () async {
+      pubsub.exceptionFlag = true;
+      pubsub.exceptionRepetition = 3;
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => allGray);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 0);
+    });
+
+    test('backfills older task', () async {
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => oldestGray);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 1);
+    });
+
+    test('updates task as in-progress after backfilling', () async {
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => oldestGray);
+      final Task task = oldestGray[2];
+      expect(db.values.length, 0);
+      expect(task.status, Task.statusNew);
+      await tester.get(handler);
+      expect(db.values.length, 1);
+      expect(task.status, Task.statusInProgress);
+
+      final List<dynamic> captured = verify(mockFirestoreService.writeViaTransaction(captureAny)).captured;
+      expect(captured.length, 1);
+      final List<Write> commitResponse = captured[0] as List<Write>;
+      expect(commitResponse.length, 1);
+      final firestore.Task taskDocuemnt = firestore.Task.fromDocument(taskDocument: commitResponse[0].update!);
+      expect(taskDocuemnt.status, firestore.Task.statusInProgress);
+    });
+
+    test('skip scheduling builds if datastore commit fails', () async {
+      db.commitException = true;
+      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),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => oldestGray);
+      expect(db.values.length, 0);
+      await tester.get(handler);
+      expect(db.values.length, 0);
+      expect(pubsub.messages.length, 0);
+    });
+
+    test('backfills only column A when B does not need backfill', () async {
+      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),
+        generateTask(3, name: 'Linux_android A', status: Task.statusNew),
+        // Linux_android B
+        generateTask(1, name: 'Linux_android B', status: Task.statusSucceeded),
+        generateTask(2, name: 'Linux_android B', status: Task.statusSucceeded),
+        generateTask(3, name: 'Linux_android B', status: Task.statusSucceeded),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => scheduleA);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 1);
+    });
+
+    test('backfills both column A and B', () async {
+      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),
+        generateTask(3, name: 'Linux_android A', status: Task.statusNew),
+        // Linux_android B
+        generateTask(1, name: 'Linux_android B', status: Task.statusSucceeded),
+        generateTask(2, name: 'Linux_android B', status: Task.statusSucceeded),
+        generateTask(3, name: 'Linux_android B', status: Task.statusNew),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => scheduleA);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 2);
+    });
+
+    test('backfills limited targets when number of available targets exceeds backfillerTargetLimit ', () async {
+      final List<Task> scheduleA = <Task>[
+        // Linux_android A
+        generateTask(1, name: 'Linux_android A', status: Task.statusNew),
+        generateTask(2, name: 'Linux_android A', status: Task.statusNew),
+        // Linux_android B
+        generateTask(1, name: 'Linux_android B', status: Task.statusNew),
+        generateTask(2, name: 'Linux_android B', status: Task.statusNew),
+        // Linux_android C
+        generateTask(1, name: 'Linux_android C', status: Task.statusNew),
+        generateTask(2, name: 'Linux_android C', status: Task.statusNew),
+      ];
+      db.addOnQuery<Task>((Iterable<Task> results) => scheduleA);
+      await tester.get(handler);
+      expect(pubsub.messages.length, 2);
+    });
+
+    group('getFilteredBackfill', () {
+      test('backfills high priorty targets first', () async {
+        final List<Tuple<Target, FullTask, int>> backfill = <Tuple<Target, FullTask, int>>[
+          Tuple(generateTarget(1), FullTask(generateTask(1), generateCommit(1)), LuciBuildService.kRerunPriority),
+          Tuple(generateTarget(2), FullTask(generateTask(2), generateCommit(2)), LuciBuildService.kBackfillPriority),
+          Tuple(generateTarget(3), FullTask(generateTask(3), generateCommit(3)), LuciBuildService.kRerunPriority),
+        ];
+        final List<Tuple<Target, FullTask, int>> filteredBackfill = handler.getFilteredBackfill(backfill);
+        expect(filteredBackfill.length, 2);
+        expect(filteredBackfill[0].third, LuciBuildService.kRerunPriority);
+        expect(filteredBackfill[1].third, LuciBuildService.kRerunPriority);
+      });
+    });
+  });
+}
diff --git a/app_dart/test/request_handlers/scheduler/scheduler_request_subscription_test.dart b/app_dart/test/request_handlers/scheduler/scheduler_request_subscription_test.dart
new file mode 100644
index 0000000..eeadaf6
--- /dev/null
+++ b/app_dart/test/request_handlers/scheduler/scheduler_request_subscription_test.dart
@@ -0,0 +1,163 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/model/luci/pubsub_message_v2.dart';
+import 'package:cocoon_service/src/request_handlers/scheduler/scheduler_request_subscription.dart';
+import 'package:cocoon_service/src/request_handling/exceptions.dart';
+import 'package:fixnum/fixnum.dart';
+import 'package:mockito/mockito.dart';
+import 'package:retry/retry.dart';
+import 'package:test/test.dart';
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+
+import '../../src/datastore/fake_config.dart';
+import '../../src/request_handling/fake_authentication.dart';
+import '../../src/request_handling/fake_http.dart';
+import '../../src/request_handling/subscription_v2_tester.dart';
+import '../../src/utilities/mocks.dart';
+
+void main() {
+  late SchedulerRequestSubscriptionV2 handler;
+  late SubscriptionV2Tester tester;
+
+  late MockBuildBucketV2Client buildBucketV2Client;
+
+  setUp(() async {
+    buildBucketV2Client = MockBuildBucketV2Client();
+    handler = SchedulerRequestSubscriptionV2(
+      cache: CacheService(inMemory: true),
+      config: FakeConfig(),
+      authProvider: FakeAuthenticationProvider(),
+      buildBucketClient: buildBucketV2Client,
+      retryOptions: const RetryOptions(
+        maxAttempts: 3,
+        maxDelay: Duration.zero,
+      ),
+    );
+
+    tester = SubscriptionV2Tester(
+      request: FakeHttpRequest(),
+    );
+  });
+
+  test('throws exception when BatchRequest cannot be decoded', () async {
+    tester.message = const PushMessageV2();
+    expect(() => tester.post(handler), throwsA(isA<BadRequestException>()));
+  });
+
+  test('schedules request to buildbucket using v2', () async {
+    final bbv2.BuilderID responseBuilderID = bbv2.BuilderID();
+    responseBuilderID.builder = 'Linux A';
+
+    final bbv2.Build responseBuild = bbv2.Build();
+    responseBuild.id = Int64(12345);
+    responseBuild.builder = responseBuilderID;
+
+    // has a list of BatchResponse_Response
+    final bbv2.BatchResponse batchResponse = bbv2.BatchResponse();
+    final bbv2.BatchResponse_Response batchResponseResponse = bbv2.BatchResponse_Response();
+    batchResponseResponse.scheduleBuild = responseBuild;
+    batchResponse.responses.add(batchResponseResponse);
+
+    when(buildBucketV2Client.batch(any)).thenAnswer((_) async => batchResponse);
+
+    // We cannot construct the object manually with the protos as we cannot write out
+    // the json with all the required double quotes and testing fails.
+    const String messageData = '''
+{
+  "requests": [
+    {
+      "scheduleBuild": {
+        "builder": {
+          "builder": "Linux A"
+        }
+      }
+    }
+  ]
+}
+''';
+
+    const PushMessageV2 pushMessageV2 = PushMessageV2(data: messageData, messageId: '798274983');
+    tester.message = pushMessageV2;
+    final Body body = await tester.post(handler);
+    expect(body, Body.empty);
+  });
+
+  test('retries schedule build if no response comes back', () async {
+    final bbv2.BuilderID responseBuilderID = bbv2.BuilderID();
+    responseBuilderID.builder = 'Linux A';
+
+    final bbv2.Build responseBuild = bbv2.Build();
+    responseBuild.id = Int64(12345);
+    responseBuild.builder = responseBuilderID;
+
+    // has a list of BatchResponse_Response
+    final bbv2.BatchResponse batchResponse = bbv2.BatchResponse();
+
+    final bbv2.BatchResponse_Response batchResponseResponse = bbv2.BatchResponse_Response();
+    batchResponseResponse.scheduleBuild = responseBuild;
+
+    batchResponse.responses.add(batchResponseResponse);
+
+    int attempt = 0;
+
+    when(buildBucketV2Client.batch(any)).thenAnswer((_) async {
+      attempt += 1;
+      if (attempt == 2) {
+        return batchResponse;
+      }
+
+      return bbv2.BatchResponse().createEmptyInstance();
+    });
+
+    const String messageData = '''
+{
+  "requests": [
+    {
+      "scheduleBuild": {
+        "builder": {
+          "builder": "Linux A"
+        }
+      }
+    }
+  ]
+}
+''';
+
+    const PushMessageV2 pushMessageV2 = PushMessageV2(data: messageData, messageId: '798274983');
+    tester.message = pushMessageV2;
+    final Body body = await tester.post(handler);
+
+    expect(body, Body.empty);
+    expect(verify(buildBucketV2Client.batch(any)).callCount, 2);
+  });
+
+  test('acking message and logging error when no response comes back after retry limit', () async {
+    when(buildBucketV2Client.batch(any)).thenAnswer((_) async {
+      return bbv2.BatchResponse().createEmptyInstance();
+    });
+
+    const String messageData = '''
+{
+  "requests": [
+    {
+      "scheduleBuild": {
+        "builder": {
+          "builder": "Linux A"
+        }
+      }
+    }
+  ]
+}
+''';
+
+    const PushMessageV2 pushMessageV2 = PushMessageV2(data: messageData, messageId: '798274983');
+    tester.message = pushMessageV2;
+    final Body body = await tester.post(handler);
+
+    expect(body, isNotNull);
+    expect(verify(buildBucketV2Client.batch(any)).callCount, 3);
+  });
+}
diff --git a/app_dart/test/request_handlers/vacuum_github_commits_v2_test.dart b/app_dart/test/request_handlers/vacuum_github_commits_v2_test.dart
new file mode 100644
index 0000000..8041d61
--- /dev/null
+++ b/app_dart/test/request_handlers/vacuum_github_commits_v2_test.dart
@@ -0,0 +1,185 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/src/model/appengine/commit.dart';
+import 'package:cocoon_service/src/request_handlers/vacuum_github_commits_v2.dart';
+import 'package:cocoon_service/src/request_handling/body.dart';
+import 'package:cocoon_service/src/service/config.dart';
+import 'package:cocoon_service/src/service/datastore.dart';
+import 'package:gcloud/db.dart' as gcloud_db;
+import 'package:gcloud/db.dart';
+import 'package:github/github.dart';
+import 'package:googleapis/bigquery/v2.dart';
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+import '../src/datastore/fake_config.dart';
+import '../src/datastore/fake_datastore.dart';
+import '../src/request_handling/api_request_handler_tester.dart';
+import '../src/request_handling/fake_authentication.dart';
+import '../src/service/fake_github_service.dart';
+import '../src/service/fake_scheduler_v2.dart';
+import '../src/utilities/mocks.dart';
+
+void main() {
+  group('VacuumGithubCommits', () {
+    late FakeConfig config;
+    FakeAuthenticationProvider auth;
+    late FakeDatastoreDB db;
+    FakeSchedulerV2 scheduler;
+    late ApiRequestHandlerTester tester;
+    late MockFirestoreService mockFirestoreService;
+    late VacuumGithubCommitsV2 handler;
+
+    late List<String> githubCommits;
+    late int yieldedCommitCount;
+
+    List<RepositoryCommit> commitList() {
+      final List<RepositoryCommit> commits = <RepositoryCommit>[];
+      for (String sha in githubCommits) {
+        final User author = User()
+          ..login = 'Username'
+          ..avatarUrl = 'http://example.org/avatar.jpg';
+        final GitCommitUser committer =
+            GitCommitUser('Username', 'Username@abc.com', DateTime.fromMillisecondsSinceEpoch(int.parse(sha)));
+        final GitCommit gitCommit = GitCommit()
+          ..message = 'commit message'
+          ..committer = committer;
+        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),
+      );
+    }
+
+    setUp(() {
+      final MockRepositoriesService repositories = MockRepositoriesService();
+      final FakeGithubService githubService = FakeGithubService();
+      final MockTabledataResource tabledataResourceApi = MockTabledataResource();
+      mockFirestoreService = MockFirestoreService();
+      when(tabledataResourceApi.insertAll(any, any, any, any)).thenAnswer((_) async {
+        return TableDataInsertAllResponse();
+      });
+
+      yieldedCommitCount = 0;
+      db = FakeDatastoreDB();
+      config = FakeConfig(
+        tabledataResource: tabledataResourceApi,
+        githubService: githubService,
+        firestoreService: mockFirestoreService,
+        dbValue: db,
+        supportedBranchesValue: <String>[
+          'master',
+          'main',
+        ],
+        supportedReposValue: <RepositorySlug>{
+          Config.cocoonSlug,
+          Config.engineSlug,
+          Config.flutterSlug,
+          Config.packagesSlug,
+        },
+      );
+
+      auth = FakeAuthenticationProvider();
+      scheduler = FakeSchedulerV2(
+        config: config,
+        ciYaml: exampleConfig,
+      );
+      tester = ApiRequestHandlerTester();
+      handler = VacuumGithubCommitsV2(
+        config: config,
+        authenticationProvider: auth,
+        datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
+        scheduler: scheduler,
+      );
+
+      githubService.listCommitsBranch = (String branch, int hours) {
+        return commitList();
+      };
+
+      when(githubService.github.repositories).thenReturn(repositories);
+    });
+
+    test('succeeds when GitHub returns no commits', () async {
+      githubCommits = <String>[];
+      config.supportedBranchesValue = <String>['master'];
+      final Body body = await tester.get<Body>(handler);
+      expect(yieldedCommitCount, 0);
+      expect(db.values, isEmpty);
+      expect(await body.serialize().toList(), isEmpty);
+    });
+
+    test('does not fail on empty commit list', () async {
+      githubCommits = <String>[];
+      expect(db.values.values.whereType<Commit>().length, 0);
+      await tester.get<Body>(handler);
+      expect(db.values.values.whereType<Commit>().length, 0);
+    });
+
+    test('does not add recent commits', () async {
+      githubCommits = <String>['${DateTime.now().millisecondsSinceEpoch}'];
+
+      expect(db.values.values.whereType<Commit>().length, 0);
+      await tester.get<Body>(handler);
+      expect(db.values.values.whereType<Commit>().length, 0);
+    });
+
+    test('inserts all relevant fields of the commit', () async {
+      githubCommits = <String>['1'];
+      expect(db.values.values.whereType<Commit>().length, 0);
+      await tester.get<Body>(handler);
+      expect(db.values.values.whereType<Commit>().length, config.supportedRepos.length);
+      final List<Commit> commits = db.values.values.whereType<Commit>().toList();
+      final Commit commit = commits.first;
+      expect(commit.repository, 'flutter/cocoon');
+      expect(commit.branch, 'main');
+      expect(commit.sha, '1');
+      expect(commit.timestamp, 1);
+      expect(commit.author, 'Username');
+      expect(commit.authorAvatarUrl, 'http://example.org/avatar.jpg');
+      expect(commit.message, 'commit message');
+      expect(commits[1].repository, Config.engineSlug.fullName);
+      expect(commits[2].repository, Config.flutterSlug.fullName);
+    });
+
+    test('skips commits for which transaction commit fails', () async {
+      githubCommits = <String>['2', '3', '4'];
+
+      /// This test is simulating an existing branch, which must already
+      /// have at least one commit in the datastore.
+      final Commit commit = shaToCommit('1', 'main', Config.engineSlug);
+      db.values[commit.key] = commit;
+
+      db.onCommit = (List<gcloud_db.Model<dynamic>> inserts, List<gcloud_db.Key<dynamic>> deletes) {
+        if (inserts.whereType<Commit>().where((Commit commit) => commit.sha == '3').isNotEmpty) {
+          throw StateError('Commit failed');
+        }
+      };
+      final Body body = await tester.get<Body>(handler);
+
+      /// The +1 is coming from the engine repository and manually added commit on the top of this test.
+      expect(db.values.values.whereType<Commit>().length, 8 + 1); // 2 commits for 4 repos
+      expect(db.values.values.whereType<Commit>().map<String>(toSha), containsAll(<String>['1', '2', '4']));
+      expect(db.values.values.whereType<Commit>().map<int>(toTimestamp), containsAll(<int>[1, 2, 4]));
+      expect(await body.serialize().toList(), isEmpty);
+    });
+  });
+}
+
+String toSha(Commit commit) => commit.sha!;
+
+int toTimestamp(Commit commit) => commit.timestamp!;
diff --git a/app_dart/test/server_test.dart b/app_dart/test/server_test.dart
index addb63d..80c9746 100644
--- a/app_dart/test/server_test.dart
+++ b/app_dart/test/server_test.dart
@@ -5,14 +5,18 @@
 import 'package:cocoon_service/cocoon_service.dart';
 import 'package:cocoon_service/server.dart';
 import 'package:cocoon_service/src/service/commit_service.dart';
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart';
 import 'package:test/test.dart';
 
 import 'src/datastore/fake_config.dart';
 import 'src/request_handling/fake_authentication.dart';
+import 'src/service/fake_build_bucket_v2_client.dart';
 import 'src/service/fake_buildbucket.dart';
 import 'src/service/fake_gerrit_service.dart';
 import 'src/service/fake_luci_build_service.dart';
+import 'src/service/fake_luci_build_service_v2.dart';
 import 'src/service/fake_scheduler.dart';
+import 'src/service/fake_scheduler_v2.dart';
 
 void main() {
   test('verify server can be created', () {
@@ -25,11 +29,15 @@
       swarmingAuthProvider: FakeAuthenticationProvider(),
       branchService: BranchService(config: FakeConfig(), gerritService: FakeGerritService()),
       buildBucketClient: FakeBuildBucketClient(),
+      buildBucketV2Client: FakeBuildBucketV2Client(),
       luciBuildService: FakeLuciBuildService(config: FakeConfig()),
+      luciBuildServiceV2: FakeLuciBuildServiceV2(config: FakeConfig()),
       githubChecksService: GithubChecksService(FakeConfig()),
+      githubChecksServiceV2: GithubChecksServiceV2(FakeConfig()),
       commitService: CommitService(config: FakeConfig()),
       gerritService: FakeGerritService(),
       scheduler: FakeScheduler(config: FakeConfig()),
+      schedulerV2: FakeSchedulerV2(config: FakeConfig()),
     );
   });
 }
diff --git a/app_dart/test/service/luci_build_service_test.dart b/app_dart/test/service/luci_build_service_test.dart
index ac7d5b8..a31b2f0 100644
--- a/app_dart/test/service/luci_build_service_test.dart
+++ b/app_dart/test/service/luci_build_service_test.dart
@@ -36,6 +36,7 @@
   late FakeConfig config;
   FakeGithubService githubService;
   late MockBuildBucketClient mockBuildBucketClient;
+  late MockBuildBucketV2Client mockBuildBucketV2Client;
   late LuciBuildService service;
   late RepositorySlug slug;
   late MockGithubChecksUtil mockGithubChecksUtil = MockGithubChecksUtil();
@@ -55,11 +56,13 @@
       githubService = FakeGithubService();
       config = FakeConfig(githubService: githubService);
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: config,
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         gerritService: FakeGerritService(),
         pubsub: pubsub,
       );
@@ -151,11 +154,13 @@
       githubService = FakeGithubService();
       config = FakeConfig(githubService: githubService);
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: config,
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         gerritService: FakeGerritService(),
         pubsub: pubsub,
       );
@@ -214,11 +219,13 @@
       githubService = FakeGithubService();
       config = FakeConfig(githubService: githubService);
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: config,
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         pubsub: pubsub,
       );
       slug = RepositorySlug('flutter', 'cocoon');
@@ -276,12 +283,14 @@
       githubService = FakeGithubService();
       config = FakeConfig(githubService: githubService);
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       mockGithubChecksUtil = MockGithubChecksUtil();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: config,
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         githubChecksUtil: mockGithubChecksUtil,
         gerritService: FakeGerritService(branchesValue: <String>['master']),
         pubsub: pubsub,
@@ -412,11 +421,13 @@
     setUp(() {
       cache = CacheService(inMemory: true);
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: FakeConfig(),
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         githubChecksUtil: mockGithubChecksUtil,
         pubsub: pubsub,
       );
@@ -706,11 +717,13 @@
     setUp(() {
       cache = CacheService(inMemory: true);
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: FakeConfig(),
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         githubChecksUtil: mockGithubChecksUtil,
         pubsub: pubsub,
       );
@@ -780,11 +793,13 @@
       cache = CacheService(inMemory: true);
       config = FakeConfig();
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: config,
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         pubsub: pubsub,
       );
       slug = RepositorySlug('flutter', 'cocoon');
@@ -832,11 +847,13 @@
       githubService = FakeGithubService();
       config = FakeConfig(githubService: githubService);
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: config,
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         pubsub: pubsub,
       );
       slug = RepositorySlug('flutter', 'flutter');
@@ -878,11 +895,13 @@
       cache = CacheService(inMemory: true);
       config = FakeConfig();
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       pubsub = FakePubSub();
       service = LuciBuildService(
         config: config,
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         pubsub: pubsub,
       );
       final Map<String, dynamic> json = jsonDecode(
@@ -930,6 +949,7 @@
       firestoreTask = null;
       firestoreCommit = null;
       mockBuildBucketClient = MockBuildBucketClient();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
       mockGithubChecksUtil = MockGithubChecksUtil();
       mockFirestoreService = MockFirestoreService();
       when(mockGithubChecksUtil.createCheckRun(any, any, any, any, output: anyNamed('output')))
@@ -967,6 +987,7 @@
         config: config,
         cache: cache,
         buildBucketClient: mockBuildBucketClient,
+        buildBucketV2Client: mockBuildBucketV2Client,
         githubChecksUtil: mockGithubChecksUtil,
         pubsub: pubsub,
       );
diff --git a/app_dart/test/service/luci_build_service_v2_test.dart b/app_dart/test/service/luci_build_service_v2_test.dart
new file mode 100644
index 0000000..766405c
--- /dev/null
+++ b/app_dart/test/service/luci_build_service_v2_test.dart
@@ -0,0 +1,1249 @@
+// Copyright 2020 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:core';
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/model/appengine/commit.dart';
+import 'package:cocoon_service/src/model/appengine/task.dart';
+import 'package:cocoon_service/src/model/firestore/commit.dart' as firestore_commit;
+import 'package:cocoon_service/src/model/firestore/task.dart' as firestore;
+import 'package:cocoon_service/src/model/ci_yaml/target.dart';
+import 'package:cocoon_service/src/model/github/checks.dart' as cocoon_checks;
+import 'package:cocoon_service/src/model/luci/user_data.dart';
+import 'package:cocoon_service/src/service/exceptions.dart';
+import 'package:cocoon_service/src/service/datastore.dart';
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
+import 'package:fixnum/fixnum.dart';
+import 'package:gcloud/datastore.dart';
+import 'package:github/github.dart';
+import 'package:googleapis/firestore/v1.dart' hide Status;
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+import '../src/datastore/fake_config.dart';
+import '../src/request_handling/fake_pubsub.dart';
+import '../src/service/fake_gerrit_service.dart';
+import '../src/service/fake_github_service.dart';
+import '../src/utilities/build_bucket_v2_messages.dart';
+import '../src/utilities/entity_generators.dart';
+import '../src/utilities/mocks.dart';
+import '../src/utilities/webhook_generators.dart';
+
+void main() {
+  late CacheService cache;
+  late FakeConfig config;
+  FakeGithubService githubService;
+  late MockBuildBucketV2Client mockBuildBucketV2Client;
+  late LuciBuildServiceV2 service;
+  late RepositorySlug slug;
+  late MockGithubChecksUtil mockGithubChecksUtil = MockGithubChecksUtil();
+  late FakePubSub pubsub;
+
+  final List<Target> targets = <Target>[
+    generateTarget(1, properties: <String, String>{'os': 'abc'}),
+  ];
+  final PullRequest pullRequest = generatePullRequest(id: 1, repo: 'cocoon');
+
+  group('getBuilds', () {
+    final bbv2.Build macBuild = generateBbv2Build(Int64(998), name: 'Mac', status: bbv2.Status.STARTED);
+    final bbv2.Build linuxBuild =
+        generateBbv2Build(Int64(998), name: 'Linux', bucket: 'try', status: bbv2.Status.STARTED);
+
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      githubService = FakeGithubService();
+      config = FakeConfig(githubService: githubService);
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: config,
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        gerritService: FakeGerritService(),
+        pubsub: pubsub,
+      );
+      slug = RepositorySlug('flutter', 'cocoon');
+    });
+
+    test('Null build', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[macBuild],
+              ),
+            ),
+          ],
+        );
+      });
+      final Iterable<bbv2.Build> builds = await service.getTryBuilds(
+        slug: Config.flutterSlug,
+        sha: 'shasha',
+        builderName: 'abcd',
+      );
+      expect(builds.first, macBuild);
+    });
+
+    test('Existing prod build', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[],
+              ),
+            ),
+          ],
+        );
+      });
+      final Iterable<bbv2.Build> builds = await service.getProdBuilds(
+        slug: slug,
+        commitSha: 'commit123',
+        builderName: 'abcd',
+      );
+      expect(builds, isEmpty);
+    });
+
+    test('Existing try build', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[linuxBuild],
+              ),
+            ),
+          ],
+        );
+      });
+      final Iterable<bbv2.Build> builds = await service.getTryBuilds(
+        slug: Config.flutterSlug,
+        sha: 'shasha',
+        builderName: 'abcd',
+      );
+      expect(builds.first, linuxBuild);
+    });
+
+    test('Existing try build by pull request', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[linuxBuild],
+              ),
+            ),
+          ],
+        );
+      });
+      final Iterable<bbv2.Build> builds = await service.getTryBuildsByPullRequest(
+        pullRequest: PullRequest(
+          id: 998,
+          base: PullRequestHead(repo: Repository(fullName: 'flutter/cocoon')),
+        ),
+      );
+      expect(builds.first, linuxBuild);
+    });
+  });
+
+  group('getBuilders', () {
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      githubService = FakeGithubService();
+      config = FakeConfig(githubService: githubService);
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: config,
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        gerritService: FakeGerritService(),
+        pubsub: pubsub,
+      );
+      slug = RepositorySlug('flutter', 'flutter');
+    });
+
+    test('with one rpc call', () async {
+      when(mockBuildBucketV2Client.listBuilders(any)).thenAnswer((_) async {
+        return bbv2.ListBuildersResponse(
+          builders: [
+            bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'test1')),
+            bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'test2')),
+          ],
+        );
+      });
+      final Set<String> builders = await service.getAvailableBuilderSet();
+      expect(builders.length, 2);
+      expect(builders.contains('test1'), isTrue);
+    });
+
+    test('with more than one rpc calls', () async {
+      int retries = -1;
+      when(mockBuildBucketV2Client.listBuilders(any)).thenAnswer((_) async {
+        retries++;
+        if (retries == 0) {
+          return bbv2.ListBuildersResponse(
+            builders: [
+              bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'test1')),
+              bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'test2')),
+            ],
+            nextPageToken: 'token',
+          );
+        } else if (retries == 1) {
+          return bbv2.ListBuildersResponse(
+            builders: [
+              bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'test3')),
+              bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'test4')),
+            ],
+          );
+        } else {
+          return bbv2.ListBuildersResponse(builders: []);
+        }
+      });
+      final Set<String> builders = await service.getAvailableBuilderSet();
+      expect(builders.length, 4);
+      expect(builders, <String>{'test1', 'test2', 'test3', 'test4'});
+    });
+  });
+
+  group('buildsForRepositoryAndPr', () {
+    final bbv2.Build macBuild = generateBbv2Build(Int64(999), name: 'Mac', status: bbv2.Status.STARTED);
+    final bbv2.Build linuxBuild = generateBbv2Build(Int64(998), name: 'Linux', status: bbv2.Status.STARTED);
+
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      githubService = FakeGithubService();
+      config = FakeConfig(githubService: githubService);
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: config,
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        pubsub: pubsub,
+      );
+      slug = RepositorySlug('flutter', 'cocoon');
+    });
+
+    test('Empty responses are handled correctly', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[],
+              ),
+            ),
+          ],
+        );
+      });
+      final Iterable<bbv2.Build> builds = await service.getTryBuilds(
+        slug: RepositorySlug.full(pullRequest.base!.repo!.fullName),
+        sha: pullRequest.head!.sha!,
+        builderName: null,
+      );
+      expect(builds, isEmpty);
+    });
+
+    test('Response returning a couple of builds', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[macBuild],
+              ),
+            ),
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[linuxBuild],
+              ),
+            ),
+          ],
+        );
+      });
+      final Iterable<bbv2.Build> builds = await service.getTryBuilds(
+        slug: RepositorySlug.full(pullRequest.base!.repo!.fullName),
+        sha: pullRequest.head!.sha!,
+        builderName: null,
+      );
+      expect(builds, equals(<bbv2.Build>{macBuild, linuxBuild}));
+    });
+  });
+
+  group('scheduleBuilds', () {
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      githubService = FakeGithubService();
+      config = FakeConfig(githubService: githubService);
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      mockGithubChecksUtil = MockGithubChecksUtil();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: config,
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        githubChecksUtil: mockGithubChecksUtil,
+        gerritService: FakeGerritService(branchesValue: <String>['master']),
+        pubsub: pubsub,
+      );
+      slug = RepositorySlug('flutter', 'cocoon');
+    });
+
+    test('schedule try builds successfully', () async {
+      final PullRequest pullRequest = generatePullRequest();
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              scheduleBuild: generateBbv2Build(Int64(1)),
+            ),
+          ],
+        );
+      });
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any))
+          .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 1'));
+      final List<Target> scheduledTargets = await service.scheduleTryBuilds(
+        pullRequest: pullRequest,
+        targets: targets,
+      );
+
+      final Iterable<String> scheduledTargetNames = scheduledTargets.map((Target target) => target.value.name);
+      expect(scheduledTargetNames, <String>['Linux 1']);
+
+      final bbv2.BatchRequest batchRequest = bbv2.BatchRequest().createEmptyInstance();
+      batchRequest.mergeFromProto3Json(pubsub.messages.single);
+      expect(batchRequest.requests.single.scheduleBuild, isNotNull);
+
+      final bbv2.ScheduleBuildRequest scheduleBuild = batchRequest.requests.single.scheduleBuild;
+      expect(scheduleBuild.builder.bucket, 'try');
+      expect(scheduleBuild.builder.builder, 'Linux 1');
+      expect(scheduleBuild.notify.pubsubTopic, 'projects/flutter-dashboard/topics/build-bucket-presubmit');
+
+      final Map<String, dynamic> userDataMap = UserData.decodeUserDataBytes(scheduleBuild.notify.userData);
+
+      expect(userDataMap, <String, dynamic>{
+        'repo_owner': 'flutter',
+        'repo_name': 'flutter',
+        'user_agent': 'flutter-cocoon',
+        'check_run_id': 1,
+        'commit_sha': 'abc',
+        'commit_branch': 'master',
+        'builder_name': 'Linux 1',
+      });
+
+      final Map<String, bbv2.Value> properties = scheduleBuild.properties.fields;
+      final List<bbv2.RequestedDimension> dimensions = scheduleBuild.dimensions;
+      expect(properties, <String, bbv2.Value>{
+        'os': bbv2.Value(stringValue: 'abc'),
+        'dependencies': bbv2.Value(listValue: bbv2.ListValue()),
+        'bringup': bbv2.Value(boolValue: false),
+        'git_branch': bbv2.Value(stringValue: 'master'),
+        'git_url': bbv2.Value(stringValue: 'https://github.com/flutter/flutter'),
+        'git_ref': bbv2.Value(stringValue: 'refs/pull/123/head'),
+        'exe_cipd_version': bbv2.Value(stringValue: 'refs/heads/main'),
+        'recipe': bbv2.Value(stringValue: 'devicelab/devicelab'),
+      });
+      expect(dimensions.length, 1);
+      expect(dimensions[0].key, 'os');
+      expect(dimensions[0].value, 'abc');
+    });
+
+    test('schedule try builds with github build labels successfully', () async {
+      final PullRequest pullRequest = generatePullRequest();
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              scheduleBuild: generateBbv2Build(Int64(1)),
+            ),
+          ],
+        );
+      });
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any))
+          .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 1'));
+      final List<Target> scheduledTargets = await service.scheduleTryBuilds(
+        pullRequest: pullRequest,
+        targets: targets,
+      );
+      final Iterable<String> scheduledTargetNames = scheduledTargets.map((Target target) => target.value.name);
+      expect(scheduledTargetNames, <String>['Linux 1']);
+
+      final bbv2.BatchRequest batchRequest = bbv2.BatchRequest().createEmptyInstance();
+      batchRequest.mergeFromProto3Json(pubsub.messages.single);
+      expect(batchRequest.requests.single.scheduleBuild, isNotNull);
+
+      final bbv2.ScheduleBuildRequest scheduleBuild = batchRequest.requests.single.scheduleBuild;
+      expect(scheduleBuild.builder.bucket, 'try');
+      expect(scheduleBuild.builder.builder, 'Linux 1');
+      expect(scheduleBuild.notify.pubsubTopic, 'projects/flutter-dashboard/topics/build-bucket-presubmit');
+
+      final Map<String, dynamic> userDataMap = UserData.decodeUserDataBytes(scheduleBuild.notify.userData);
+
+      expect(userDataMap, <String, dynamic>{
+        'repo_owner': 'flutter',
+        'repo_name': 'flutter',
+        'user_agent': 'flutter-cocoon',
+        'check_run_id': 1,
+        'commit_sha': 'abc',
+        'commit_branch': 'master',
+        'builder_name': 'Linux 1',
+      });
+
+      final Map<String, bbv2.Value> properties = scheduleBuild.properties.fields;
+      final List<bbv2.RequestedDimension> dimensions = scheduleBuild.dimensions;
+      expect(properties, <String, bbv2.Value>{
+        'os': bbv2.Value(stringValue: 'abc'),
+        'dependencies': bbv2.Value(listValue: bbv2.ListValue()),
+        'bringup': bbv2.Value(boolValue: false),
+        'git_branch': bbv2.Value(stringValue: 'master'),
+        'git_url': bbv2.Value(stringValue: 'https://github.com/flutter/flutter'),
+        'git_ref': bbv2.Value(stringValue: 'refs/pull/123/head'),
+        'exe_cipd_version': bbv2.Value(stringValue: 'refs/heads/main'),
+        'recipe': bbv2.Value(stringValue: 'devicelab/devicelab'),
+      });
+      expect(dimensions.length, 1);
+      expect(dimensions[0].key, 'os');
+      expect(dimensions[0].value, 'abc');
+    });
+
+    test('Schedule builds no-ops when targets list is empty', () async {
+      await service.scheduleTryBuilds(
+        pullRequest: pullRequest,
+        targets: <Target>[],
+      );
+      verifyNever(mockGithubChecksUtil.createCheckRun(any, any, any, any));
+    });
+  });
+
+  group('schedulePostsubmitBuilds', () {
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: FakeConfig(),
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        githubChecksUtil: mockGithubChecksUtil,
+        pubsub: pubsub,
+      );
+    });
+
+    test('schedule packages postsubmit builds successfully', () async {
+      final Commit commit = generateCommit(0);
+      when(mockGithubChecksUtil.createCheckRun(any, Config.packagesSlug, any, 'Linux 1'))
+          .thenAnswer((_) async => generateCheckRun(1));
+      when(mockBuildBucketV2Client.listBuilders(any)).thenAnswer((_) async {
+        return bbv2.ListBuildersResponse(
+          builders: [
+            bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'Linux 1')),
+          ],
+        );
+      });
+      final Tuple<Target, Task, int> toBeScheduled = Tuple<Target, Task, int>(
+        generateTarget(
+          1,
+          properties: <String, String>{
+            'recipe': 'devicelab/devicelab',
+            'os': 'debian-10.12',
+          },
+          slug: Config.packagesSlug,
+        ),
+        generateTask(1),
+        LuciBuildServiceV2.kDefaultPriority,
+      );
+      await service.schedulePostsubmitBuilds(
+        commit: commit,
+        toBeScheduled: <Tuple<Target, Task, int>>[
+          toBeScheduled,
+        ],
+      );
+      // Only one batch request should be published
+      expect(pubsub.messages.length, 1);
+
+      final bbv2.BatchRequest request = bbv2.BatchRequest().createEmptyInstance();
+      request.mergeFromProto3Json(pubsub.messages.single);
+      expect(request.requests.single.scheduleBuild, isNotNull);
+
+      final bbv2.ScheduleBuildRequest scheduleBuild = request.requests.single.scheduleBuild;
+      expect(scheduleBuild.builder.bucket, 'prod');
+      expect(scheduleBuild.builder.builder, 'Linux 1');
+      expect(scheduleBuild.notify.pubsubTopic, 'projects/flutter-dashboard/topics/build-bucket-postsubmit');
+
+      final Map<String, dynamic> userDataMap = UserData.decodeUserDataBytes(scheduleBuild.notify.userData);
+
+      expect(userDataMap, <String, dynamic>{
+        'commit_key': 'flutter/flutter/master/1',
+        'task_key': '1',
+        'check_run_id': 1,
+        'commit_sha': '0',
+        'commit_branch': 'master',
+        'builder_name': 'Linux 1',
+        'repo_owner': 'flutter',
+        'repo_name': 'packages',
+        'firestore_commit_document_name': '0',
+        'firestore_task_document_name': '0_task1_1',
+      });
+
+      final Map<String, bbv2.Value> properties = scheduleBuild.properties.fields;
+      expect(properties, <String, bbv2.Value>{
+        'dependencies': bbv2.Value(listValue: bbv2.ListValue()),
+        'bringup': bbv2.Value(boolValue: false),
+        'git_branch': bbv2.Value(stringValue: 'master'),
+        'exe_cipd_version': bbv2.Value(stringValue: 'refs/heads/master'),
+        'os': bbv2.Value(stringValue: 'debian-10.12'),
+        'recipe': bbv2.Value(stringValue: 'devicelab/devicelab'),
+      });
+
+      expect(scheduleBuild.exe, bbv2.Executable(cipdVersion: 'refs/heads/master'));
+      expect(scheduleBuild.dimensions, isNotEmpty);
+      expect(
+        scheduleBuild.dimensions.singleWhere((bbv2.RequestedDimension dimension) => dimension.key == 'os').value,
+        'debian-10.12',
+      );
+    });
+
+    test('schedule postsubmit builds with correct userData for checkRuns', () async {
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any))
+          .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 1'));
+      final Commit commit = generateCommit(0, repo: 'packages');
+      when(mockBuildBucketV2Client.listBuilders(any)).thenAnswer((_) async {
+        return bbv2.ListBuildersResponse(
+          builders: [
+            bbv2.BuilderItem(id: bbv2.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'),
+        ),
+        generateTask(1),
+        LuciBuildServiceV2.kDefaultPriority,
+      );
+      await service.schedulePostsubmitBuilds(
+        commit: commit,
+        toBeScheduled: <Tuple<Target, Task, int>>[
+          toBeScheduled,
+        ],
+      );
+      // Only one batch request should be published
+      expect(pubsub.messages.length, 1);
+
+      final bbv2.BatchRequest request = bbv2.BatchRequest().createEmptyInstance();
+      request.mergeFromProto3Json(pubsub.messages.single);
+      expect(request.requests.single.scheduleBuild, isNotNull);
+
+      final bbv2.ScheduleBuildRequest scheduleBuild = request.requests.single.scheduleBuild;
+      expect(scheduleBuild.builder.bucket, 'prod');
+      expect(scheduleBuild.builder.builder, 'Linux 1');
+      expect(scheduleBuild.notify.pubsubTopic, 'projects/flutter-dashboard/topics/build-bucket-postsubmit');
+
+      final Map<String, dynamic> userData = UserData.decodeUserDataBytes(scheduleBuild.notify.userData);
+
+      expect(userData, <String, dynamic>{
+        'commit_key': 'flutter/flutter/master/1',
+        'task_key': '1',
+        'check_run_id': 1,
+        'commit_sha': '0',
+        'commit_branch': 'master',
+        'builder_name': 'Linux 1',
+        'repo_owner': 'flutter',
+        'repo_name': 'packages',
+        'firestore_commit_document_name': '0',
+        'firestore_task_document_name': '0_task1_1',
+      });
+    });
+
+    test('return the orignal list when hitting buildbucket exception', () async {
+      final Commit commit = generateCommit(0, repo: 'packages');
+      when(mockBuildBucketV2Client.listBuilders(any)).thenAnswer((_) async {
+        throw const BuildBucketException(1, 'error');
+      });
+      final Tuple<Target, Task, int> toBeScheduled = Tuple<Target, Task, int>(
+        generateTarget(
+          1,
+          properties: <String, String>{
+            'os': 'debian-10.12',
+          },
+          slug: RepositorySlug('flutter', 'packages'),
+        ),
+        generateTask(1),
+        LuciBuildServiceV2.kDefaultPriority,
+      );
+      final List<Tuple<Target, Task, int>> results = await service.schedulePostsubmitBuilds(
+        commit: commit,
+        toBeScheduled: <Tuple<Target, Task, int>>[
+          toBeScheduled,
+        ],
+      );
+      expect(results, <Tuple<Target, Task, int>>[
+        toBeScheduled,
+      ]);
+    });
+
+    test('reschedule using checkrun event fails gracefully', () async {
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any))
+          .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 1'));
+
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[],
+              ),
+            ),
+          ],
+        );
+      });
+
+      final pushMessage = generateCheckRunEvent(action: 'created', numberOfPullRequests: 1);
+      final Map<String, dynamic> jsonMap = json.decode(pushMessage.data!);
+      final Map<String, dynamic> jsonSubMap = json.decode(jsonMap['2']);
+      final cocoon_checks.CheckRunEvent checkRunEvent = cocoon_checks.CheckRunEvent.fromJson(jsonSubMap);
+
+      expect(
+        () async => service.reschedulePostsubmitBuildUsingCheckRunEvent(
+          checkRunEvent,
+          commit: generateCommit(0),
+          task: generateTask(0),
+          target: generateTarget(0),
+        ),
+        throwsA(const TypeMatcher<NoBuildFoundException>()),
+      );
+    });
+
+    test('do not create postsubmit checkrun for bringup: true target', () async {
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any))
+          .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 1'));
+      final Commit commit = generateCommit(0, repo: Config.packagesSlug.name);
+      when(mockBuildBucketV2Client.listBuilders(any)).thenAnswer((_) async {
+        return bbv2.ListBuildersResponse(
+          builders: [
+            bbv2.BuilderItem(id: bbv2.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',
+          },
+          bringup: true,
+          slug: Config.packagesSlug,
+        ),
+        generateTask(1, parent: commit),
+        LuciBuildServiceV2.kDefaultPriority,
+      );
+      await service.schedulePostsubmitBuilds(
+        commit: commit,
+        toBeScheduled: <Tuple<Target, Task, int>>[
+          toBeScheduled,
+        ],
+      );
+      // Only one batch request should be published
+      expect(pubsub.messages.length, 1);
+
+      final bbv2.BatchRequest request = bbv2.BatchRequest().createEmptyInstance();
+      request.mergeFromProto3Json(pubsub.messages.single);
+      expect(request.requests.single.scheduleBuild, isNotNull);
+
+      final bbv2.ScheduleBuildRequest scheduleBuild = request.requests.single.scheduleBuild;
+      expect(scheduleBuild.builder.bucket, 'staging');
+      expect(scheduleBuild.builder.builder, 'Linux 1');
+      expect(scheduleBuild.notify.pubsubTopic, 'projects/flutter-dashboard/topics/build-bucket-postsubmit');
+      final Map<String, dynamic> userData = UserData.decodeUserDataBytes(scheduleBuild.notify.userData);
+      // No check run related data.
+      expect(userData, <String, dynamic>{
+        'commit_key': 'flutter/packages/master/0',
+        'task_key': '1',
+        'firestore_commit_document_name': '0',
+        'firestore_task_document_name': '0_task1_1',
+      });
+    });
+
+    test('Skip non-existing builder', () async {
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any))
+          .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 1'));
+      final Commit commit = generateCommit(0);
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any))
+          .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 2'));
+      when(mockBuildBucketV2Client.listBuilders(any)).thenAnswer((_) async {
+        return bbv2.ListBuildersResponse(
+          builders: [
+            bbv2.BuilderItem(id: bbv2.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',
+          },
+        ),
+        generateTask(1),
+        LuciBuildService.kDefaultPriority,
+      );
+      final Tuple<Target, Task, int> toBeScheduled2 = Tuple<Target, Task, int>(
+        generateTarget(
+          2,
+          properties: <String, String>{
+            'os': 'debian-10.12',
+          },
+        ),
+        generateTask(1),
+        LuciBuildService.kDefaultPriority,
+      );
+      await service.schedulePostsubmitBuilds(
+        commit: commit,
+        toBeScheduled: <Tuple<Target, Task, int>>[
+          toBeScheduled1,
+          toBeScheduled2,
+        ],
+      );
+      expect(pubsub.messages.length, 1);
+      final bbv2.BatchRequest request = bbv2.BatchRequest().createEmptyInstance();
+      request.mergeFromProto3Json(pubsub.messages.single);
+      // Only existing builder: `Linux 2` is scheduled.
+      expect(request.requests.length, 1);
+      expect(request.requests.single.scheduleBuild, isNotNull);
+      final bbv2.ScheduleBuildRequest scheduleBuild = request.requests.single.scheduleBuild;
+      expect(scheduleBuild.builder.bucket, 'prod');
+      expect(scheduleBuild.builder.builder, 'Linux 2');
+    });
+  });
+
+  group('schedulePresubmitBuilds', () {
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: FakeConfig(),
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        githubChecksUtil: mockGithubChecksUtil,
+        pubsub: pubsub,
+      );
+    });
+
+    test('reschedule using checkrun event', () async {
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any))
+          .thenAnswer((_) async => generateCheckRun(1, name: 'Linux 1'));
+
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[
+                  generateBbv2Build(
+                    Int64(1),
+                    name: 'Linux',
+                    status: bbv2.Status.ENDED_MASK,
+                    tags: <bbv2.StringPair>[
+                      bbv2.StringPair(key: 'buildset', value: 'pr/git/123'),
+                      bbv2.StringPair(key: 'cipd_version', value: 'refs/heads/main'),
+                      bbv2.StringPair(key: 'github_link', value: 'https://github.com/flutter/flutter/pull/1'),
+                    ],
+                    input: bbv2.Build_Input(properties: bbv2.Struct(fields: {'test': bbv2.Value(stringValue: 'abc')})),
+                  ),
+                ],
+              ),
+            ),
+          ],
+        );
+      });
+      when(mockBuildBucketV2Client.scheduleBuild(any)).thenAnswer((_) async => generateBbv2Build(Int64(1)));
+
+      final pushMessage = generateCheckRunEvent(action: 'created', numberOfPullRequests: 1);
+      final Map<String, dynamic> jsonMap = json.decode(pushMessage.data!);
+      final Map<String, dynamic> jsonSubMap = json.decode(jsonMap['2']);
+      final cocoon_checks.CheckRunEvent checkRunEvent = cocoon_checks.CheckRunEvent.fromJson(jsonSubMap);
+
+      await service.reschedulePresubmitBuildUsingCheckRunEvent(
+        checkRunEvent: checkRunEvent,
+      );
+
+      final List<dynamic> captured = verify(
+        mockBuildBucketV2Client.scheduleBuild(
+          captureAny,
+        ),
+      ).captured;
+      expect(captured.length, 1);
+
+      final bbv2.ScheduleBuildRequest scheduleBuildRequest = captured[0] as bbv2.ScheduleBuildRequest;
+
+      final Map<String, dynamic> userData = UserData.decodeUserDataBytes(scheduleBuildRequest.notify.userData);
+
+      expect(userData, <String, dynamic>{
+        'check_run_id': 1,
+        'commit_branch': 'master',
+        'commit_sha': 'ec26c3e57ca3a959ca5aad62de7213c562f8c821',
+        'repo_owner': 'flutter',
+        'repo_name': 'flutter',
+        'user_agent': 'flutter-cocoon',
+      });
+
+      final Map<String, dynamic> expectedProperties = {};
+      expectedProperties['overrides'] = ['override: test'];
+      final bbv2.Struct propertiesStruct = bbv2.Struct().createEmptyInstance();
+      propertiesStruct.mergeFromProto3Json(expectedProperties);
+
+      final Map<String, bbv2.Value> properties = scheduleBuildRequest.properties.fields;
+      expect(properties['overrides'], propertiesStruct.fields['overrides']);
+    });
+  });
+
+  group('cancelBuilds', () {
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      config = FakeConfig();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: config,
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        pubsub: pubsub,
+      );
+      slug = RepositorySlug('flutter', 'cocoon');
+    });
+
+    test('Cancel builds when build list is empty', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[],
+        );
+      });
+      await service.cancelBuilds(pullRequest: pullRequest, reason: 'new builds');
+      // This is okay, it is getting called twice when it runs cancel builds
+      // because the call is no longer being short-circuited. It calls batch in
+      // tryBuildsForPullRequest and it calls in the top level cancelBuilds
+      // function.
+      verify(mockBuildBucketV2Client.batch(any)).called(1);
+    });
+
+    test('Cancel builds that are scheduled', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[
+                  generateBbv2Build(Int64(998), name: 'Linux', status: bbv2.Status.STARTED),
+                ],
+              ),
+            ),
+          ],
+        );
+      });
+      await service.cancelBuilds(pullRequest: pullRequest, reason: 'new builds');
+
+      final List<dynamic> captured = verify(
+        mockBuildBucketV2Client.batch(
+          captureAny,
+        ),
+      ).captured;
+
+      final List<bbv2.BatchRequest_Request> capturedBatchRequests = [];
+      for (dynamic cap in captured) {
+        capturedBatchRequests.add((cap as bbv2.BatchRequest).requests.first);
+      }
+
+      final bbv2.SearchBuildsRequest searchBuildRequest =
+          capturedBatchRequests.firstWhere((req) => req.hasSearchBuilds()).searchBuilds;
+      final bbv2.CancelBuildRequest cancelBuildRequest =
+          capturedBatchRequests.firstWhere((req) => req.hasCancelBuild()).cancelBuild;
+      expect(searchBuildRequest, isNotNull);
+      expect(cancelBuildRequest, isNotNull);
+
+      expect(cancelBuildRequest.id, Int64(998));
+      expect(cancelBuildRequest.summaryMarkdown, 'new builds');
+    });
+  });
+
+  group('failedBuilds', () {
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      githubService = FakeGithubService();
+      config = FakeConfig(githubService: githubService);
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: config,
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        pubsub: pubsub,
+      );
+      slug = RepositorySlug('flutter', 'flutter');
+    });
+
+    test('Failed builds from an empty list', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[],
+        );
+      });
+      final List<bbv2.Build?> result = await service.failedBuilds(pullRequest: pullRequest, targets: <Target>[]);
+      expect(result, isEmpty);
+    });
+
+    test('Failed builds from a list of builds with failures', () async {
+      when(mockBuildBucketV2Client.batch(any)).thenAnswer((_) async {
+        return bbv2.BatchResponse(
+          responses: <bbv2.BatchResponse_Response>[
+            bbv2.BatchResponse_Response(
+              searchBuilds: bbv2.SearchBuildsResponse(
+                builds: <bbv2.Build>[
+                  generateBbv2Build(Int64(998), name: 'Linux 1', status: bbv2.Status.FAILURE),
+                ],
+              ),
+            ),
+          ],
+        );
+      });
+      final List<bbv2.Build?> result =
+          await service.failedBuilds(pullRequest: pullRequest, targets: <Target>[generateTarget(1)]);
+      expect(result, hasLength(1));
+    });
+  });
+
+  group('rescheduleBuild', () {
+    late bbv2.BuildsV2PubSub rescheduleBuild;
+
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      config = FakeConfig();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: config,
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        pubsub: pubsub,
+      );
+      rescheduleBuild = createBuild(Int64(1), status: bbv2.Status.FAILURE, builder: 'Linux Host Engine');
+    });
+
+    test('Reschedule an existing build', () async {
+      when(mockBuildBucketV2Client.scheduleBuild(any)).thenAnswer((_) async => generateBbv2Build(Int64(1)));
+      final build = await service.rescheduleBuild(
+        builderName: 'mybuild',
+        build: rescheduleBuild.build,
+        rescheduleAttempt: 2,
+        userDataMap: {},
+      );
+      expect(build.id, Int64(1));
+      expect(build.status, bbv2.Status.SUCCESS);
+      final List<dynamic> captured = verify(mockBuildBucketV2Client.scheduleBuild(captureAny)).captured;
+      expect(captured.length, 1);
+
+      final bbv2.ScheduleBuildRequest scheduleBuildRequest = captured[0];
+      expect(scheduleBuildRequest, isNotNull);
+      final List<bbv2.StringPair> tags = scheduleBuildRequest.tags;
+      final bbv2.StringPair attemptPair = tags.firstWhere((element) => element.key == 'current_attempt');
+      expect(attemptPair.value, '2');
+    });
+  });
+
+  group('checkRerunBuilder', () {
+    late Commit commit;
+    late Commit totCommit;
+    late DatastoreService datastore;
+    late MockGithubChecksUtil mockGithubChecksUtil;
+    late MockFirestoreService mockFirestoreService;
+    firestore.Task? firestoreTask;
+    firestore_commit.Commit? firestoreCommit;
+    setUp(() {
+      cache = CacheService(inMemory: true);
+      config = FakeConfig();
+      firestoreTask = null;
+      firestoreCommit = null;
+      mockGithubChecksUtil = MockGithubChecksUtil();
+      mockFirestoreService = MockFirestoreService();
+      mockBuildBucketV2Client = MockBuildBucketV2Client();
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any, output: anyNamed('output')))
+          .thenAnswer((realInvocation) async => generateCheckRun(1));
+      when(
+        mockFirestoreService.batchWriteDocuments(
+          captureAny,
+          captureAny,
+        ),
+      ).thenAnswer((Invocation invocation) {
+        return Future<BatchWriteResponse>.value(BatchWriteResponse());
+      });
+      when(
+        mockFirestoreService.getDocument(
+          captureAny,
+        ),
+      ).thenAnswer((Invocation invocation) {
+        return Future<firestore_commit.Commit>.value(
+          firestoreCommit,
+        );
+      });
+      when(
+        mockFirestoreService.queryRecentCommits(
+          limit: captureAnyNamed('limit'),
+          slug: captureAnyNamed('slug'),
+          branch: captureAnyNamed('branch'),
+        ),
+      ).thenAnswer((Invocation invocation) {
+        return Future<List<firestore_commit.Commit>>.value(
+          <firestore_commit.Commit>[firestoreCommit!],
+        );
+      });
+      pubsub = FakePubSub();
+      service = LuciBuildServiceV2(
+        config: config,
+        cache: cache,
+        buildBucketV2Client: mockBuildBucketV2Client,
+        githubChecksUtil: mockGithubChecksUtil,
+        pubsub: pubsub,
+      );
+      datastore = DatastoreService(config.db, 5);
+    });
+
+    test('Pass repo and properties correctly', () async {
+      firestoreTask = generateFirestoreTask(1, attempts: 1, status: firestore.Task.statusFailed);
+      firestoreCommit = generateFirestoreCommit(1);
+      totCommit = generateCommit(1, repo: 'engine', branch: 'main');
+      config.db.values[totCommit.key] = totCommit;
+      config.maxLuciTaskRetriesValue = 1;
+      final Task task = generateTask(
+        1,
+        status: Task.statusFailed,
+        parent: totCommit,
+        buildNumber: 1,
+      );
+      final Target target = generateTarget(1);
+      expect(task.attempts, 1);
+      expect(task.status, Task.statusFailed);
+      final bool rerunFlag = await service.checkRerunBuilder(
+        commit: totCommit,
+        task: task,
+        target: target,
+        datastore: datastore,
+        firestoreService: mockFirestoreService,
+        taskDocument: firestoreTask!,
+      );
+      expect(pubsub.messages.length, 1);
+
+      final bbv2.BatchRequest request = bbv2.BatchRequest().createEmptyInstance();
+      request.mergeFromProto3Json(pubsub.messages.single);
+      expect(request, isNotNull);
+      final bbv2.ScheduleBuildRequest scheduleBuildRequest = request.requests.first.scheduleBuild;
+
+      final Map<String, bbv2.Value> properties = scheduleBuildRequest.properties.fields;
+      for (String key in Config.defaultProperties.keys) {
+        expect(properties.containsKey(key), true);
+      }
+      expect(scheduleBuildRequest.priority, LuciBuildService.kRerunPriority);
+      expect(scheduleBuildRequest.gitilesCommit.project, 'mirrors/engine');
+      expect(scheduleBuildRequest.tags.firstWhere((tag) => tag.key == 'trigger_type').value, 'auto_retry');
+      expect(rerunFlag, isTrue);
+      expect(task.attempts, 2);
+      expect(task.status, Task.statusInProgress);
+    });
+
+    test('Rerun a test failed builder', () async {
+      firestoreTask = generateFirestoreTask(1, attempts: 1, status: firestore.Task.statusFailed);
+      firestoreCommit = generateFirestoreCommit(1);
+      totCommit = generateCommit(1);
+      config.db.values[totCommit.key] = totCommit;
+      config.maxLuciTaskRetriesValue = 1;
+      final Task task = generateTask(
+        1,
+        status: Task.statusFailed,
+        parent: totCommit,
+        buildNumber: 1,
+      );
+      final Target target = generateTarget(1);
+      final bool rerunFlag = await service.checkRerunBuilder(
+        commit: totCommit,
+        task: task,
+        target: target,
+        datastore: datastore,
+        firestoreService: mockFirestoreService,
+        taskDocument: firestoreTask!,
+      );
+      expect(rerunFlag, isTrue);
+    });
+
+    test('Rerun an infra failed builder', () async {
+      firestoreTask = generateFirestoreTask(1, attempts: 1, status: firestore.Task.statusInfraFailure);
+      firestoreCommit = generateFirestoreCommit(1);
+      totCommit = generateCommit(1);
+      config.db.values[totCommit.key] = totCommit;
+      config.maxLuciTaskRetriesValue = 1;
+      final Task task = generateTask(
+        1,
+        status: Task.statusInfraFailure,
+        parent: totCommit,
+        buildNumber: 1,
+      );
+      final Target target = generateTarget(1);
+      final bool rerunFlag = await service.checkRerunBuilder(
+        commit: totCommit,
+        task: task,
+        target: target,
+        datastore: datastore,
+        firestoreService: mockFirestoreService,
+        taskDocument: firestoreTask!,
+      );
+      expect(rerunFlag, isTrue);
+    });
+
+    test('Skip rerun a failed test when task status update hit exception', () async {
+      firestoreTask = generateFirestoreTask(1, attempts: 1, status: firestore.Task.statusInfraFailure);
+      when(
+        mockFirestoreService.batchWriteDocuments(
+          captureAny,
+          captureAny,
+        ),
+      ).thenAnswer((Invocation invocation) {
+        throw InternalError();
+      });
+      firestoreCommit = generateFirestoreCommit(1);
+      totCommit = generateCommit(1);
+      config.db.values[totCommit.key] = totCommit;
+      config.maxLuciTaskRetriesValue = 1;
+      final Task task = generateTask(
+        1,
+        status: Task.statusFailed,
+        parent: totCommit,
+        buildNumber: 1,
+      );
+      final Target target = generateTarget(1);
+      final bool rerunFlag = await service.checkRerunBuilder(
+        commit: totCommit,
+        task: task,
+        target: target,
+        datastore: datastore,
+        firestoreService: mockFirestoreService,
+        taskDocument: firestoreTask!,
+      );
+      expect(rerunFlag, isFalse);
+      expect(pubsub.messages.length, 0);
+    });
+
+    test('Do not rerun a successful builder', () async {
+      firestoreTask = generateFirestoreTask(1, attempts: 1);
+      totCommit = generateCommit(1);
+      config.db.values[totCommit.key] = totCommit;
+      config.maxLuciTaskRetriesValue = 1;
+      final Task task = generateTask(
+        1,
+        status: Task.statusSucceeded,
+        parent: totCommit,
+        buildNumber: 1,
+      );
+      final Target target = generateTarget(1);
+      final bool rerunFlag = await service.checkRerunBuilder(
+        commit: totCommit,
+        task: task,
+        target: target,
+        datastore: datastore,
+        firestoreService: mockFirestoreService,
+        taskDocument: firestoreTask!,
+      );
+      expect(rerunFlag, isFalse);
+    });
+
+    test('Do not rerun a builder exceeding retry limit', () async {
+      firestoreTask = generateFirestoreTask(1, attempts: 1);
+      totCommit = generateCommit(1);
+      config.db.values[totCommit.key] = totCommit;
+      config.maxLuciTaskRetriesValue = 1;
+      final Task task = generateTask(
+        1,
+        status: Task.statusInfraFailure,
+        parent: totCommit,
+        buildNumber: 1,
+        attempts: 2,
+      );
+      final Target target = generateTarget(1);
+      final bool rerunFlag = await service.checkRerunBuilder(
+        commit: totCommit,
+        task: task,
+        target: target,
+        datastore: datastore,
+        firestoreService: mockFirestoreService,
+        taskDocument: firestoreTask!,
+      );
+      expect(rerunFlag, isFalse);
+    });
+
+    test('Do not rerun a builder when not tip of tree', () async {
+      firestoreTask = generateFirestoreTask(1, attempts: 1);
+      totCommit = generateCommit(2, sha: 'def');
+      commit = generateCommit(1, sha: 'abc');
+      config.db.values[totCommit.key] = totCommit;
+      config.db.values[commit.key] = commit;
+      config.maxLuciTaskRetriesValue = 1;
+      final Task task = generateTask(
+        1,
+        status: Task.statusInfraFailure,
+        parent: commit,
+        buildNumber: 1,
+      );
+      final Target target = generateTarget(1);
+      final bool rerunFlag = await service.checkRerunBuilder(
+        commit: commit,
+        task: task,
+        target: target,
+        datastore: datastore,
+        firestoreService: mockFirestoreService,
+        taskDocument: firestoreTask!,
+      );
+      expect(rerunFlag, isFalse);
+    });
+
+    test('insert retried task document to firestore', () async {
+      firestoreTask = generateFirestoreTask(1, attempts: 1, status: firestore.Task.statusInfraFailure);
+      firestoreCommit = generateFirestoreCommit(1);
+      totCommit = generateCommit(1);
+      config.db.values[totCommit.key] = totCommit;
+      config.maxLuciTaskRetriesValue = 1;
+      final Task task = generateTask(
+        1,
+        status: Task.statusInfraFailure,
+        parent: totCommit,
+        buildNumber: 1,
+      );
+      final Target target = generateTarget(1);
+      expect(firestoreTask!.attempts, 1);
+      final bool rerunFlag = await service.checkRerunBuilder(
+        commit: totCommit,
+        task: task,
+        target: target,
+        datastore: datastore,
+        firestoreService: mockFirestoreService,
+        taskDocument: firestoreTask!,
+      );
+      expect(rerunFlag, isTrue);
+
+      expect(firestoreTask!.attempts, 2);
+      final List<dynamic> captured = verify(mockFirestoreService.batchWriteDocuments(captureAny, captureAny)).captured;
+      expect(captured.length, 2);
+      final BatchWriteRequest batchWriteRequest = captured[0] as BatchWriteRequest;
+      expect(batchWriteRequest.writes!.length, 1);
+      final Document insertedTaskDocument = batchWriteRequest.writes![0].update!;
+      expect(insertedTaskDocument, firestoreTask);
+      expect(firestoreTask!.status, firestore.Task.statusInProgress);
+    });
+  });
+}
diff --git a/app_dart/test/service/scheduler_test.dart b/app_dart/test/service/scheduler_test.dart
index 83935e8..115d616 100644
--- a/app_dart/test/service/scheduler_test.dart
+++ b/app_dart/test/service/scheduler_test.dart
@@ -1195,6 +1195,7 @@
 
       test('retries only triggers failed builds only', () async {
         final MockBuildBucketClient mockBuildbucket = MockBuildBucketClient();
+        final MockBuildBucketV2Client mockBuildBucketV2Client = MockBuildBucketV2Client();
         buildStatusService =
             FakeBuildStatusService(commitStatuses: <CommitStatus>[CommitStatus(generateCommit(1), const <Stage>[])]);
         final FakePubSub pubsub = FakePubSub();
@@ -1209,6 +1210,7 @@
             config: config,
             githubChecksUtil: mockGithubChecksUtil,
             buildbucket: mockBuildbucket,
+            buildBucketV2Client: mockBuildBucketV2Client,
             gerritService: FakeGerritService(branchesValue: <String>['master']),
             pubsub: pubsub,
           ),
diff --git a/app_dart/test/service/scheduler_v2_test.dart b/app_dart/test/service/scheduler_v2_test.dart
new file mode 100644
index 0000000..a09cf12
--- /dev/null
+++ b/app_dart/test/service/scheduler_v2_test.dart
@@ -0,0 +1,1377 @@
+// Copyright 2021 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/src/foundation/utils.dart';
+import 'package:cocoon_service/src/model/appengine/commit.dart';
+import 'package:cocoon_service/src/model/appengine/stage.dart';
+import 'package:cocoon_service/src/model/appengine/task.dart';
+import 'package:cocoon_service/src/model/ci_yaml/target.dart';
+import 'package:cocoon_service/src/model/github/checks.dart' as cocoon_checks;
+import 'package:cocoon_service/src/service/build_status_provider.dart';
+import 'package:cocoon_service/src/service/cache_service.dart';
+import 'package:cocoon_service/src/service/config.dart';
+import 'package:cocoon_service/src/service/datastore.dart';
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart';
+import 'package:cocoon_service/src/service/scheduler.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
+import 'package:gcloud/db.dart' as gcloud_db;
+import 'package:gcloud/db.dart';
+import 'package:github/github.dart';
+import 'package:googleapis/bigquery/v2.dart';
+import 'package:googleapis/firestore/v1.dart' hide Status;
+import 'package:http/http.dart' as http;
+import 'package:http/testing.dart';
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+import '../model/github/checks_test_data.dart';
+import '../src/datastore/fake_config.dart';
+import '../src/datastore/fake_datastore.dart';
+import '../src/service/fake_build_status_provider.dart';
+import '../src/request_handling/fake_pubsub.dart';
+import '../src/service/fake_gerrit_service.dart';
+import '../src/service/fake_github_service.dart';
+import '../src/service/fake_luci_build_service_v2.dart';
+import '../src/utilities/entity_generators.dart';
+import '../src/utilities/mocks.dart';
+
+const String singleCiYaml = r'''
+enabled_branches:
+  - master
+  - main
+  - flutter-\d+\.\d+-candidate\.\d+
+targets:
+  - name: Linux A
+    properties:
+      custom: abc
+  - name: Linux B
+    enabled_branches:
+      - stable
+    scheduler: luci
+  - name: Linux runIf
+    runIf:
+      - .ci.yaml
+      - dev/**
+  - name: Google Internal Roll
+    postsubmit: true
+    presubmit: false
+    scheduler: google_internal
+''';
+
+void main() {
+  late CacheService cache;
+  late FakeConfig config;
+  late FakeDatastoreDB db;
+  late FakeBuildStatusService buildStatusService;
+  late MockClient httpClient;
+  late MockFirestoreService mockFirestoreService;
+  late MockGithubChecksUtil mockGithubChecksUtil;
+  late SchedulerV2 scheduler;
+
+  final PullRequest pullRequest = generatePullRequest(id: 42);
+
+  Commit shaToCommit(String sha, {String branch = 'master'}) {
+    return Commit(
+      key: db.emptyKey.append(Commit, id: 'flutter/flutter/$branch/$sha'),
+      repository: 'flutter/flutter',
+      sha: sha,
+      branch: branch,
+      timestamp: int.parse(sha),
+    );
+  }
+
+  group('Scheduler', () {
+    setUp(() {
+      final MockTabledataResource tabledataResource = MockTabledataResource();
+      when(tabledataResource.insertAll(any, any, any, any)).thenAnswer((_) async {
+        return TableDataInsertAllResponse();
+      });
+
+      cache = CacheService(inMemory: true);
+      db = FakeDatastoreDB();
+      mockFirestoreService = MockFirestoreService();
+      buildStatusService = FakeBuildStatusService(
+        commitStatuses: <CommitStatus>[
+          CommitStatus(generateCommit(1), const <Stage>[]),
+          CommitStatus(generateCommit(1, branch: 'main', repo: Config.engineSlug.name), const <Stage>[]),
+        ],
+      );
+      config = FakeConfig(
+        tabledataResource: tabledataResource,
+        dbValue: db,
+        githubService: FakeGithubService(),
+        githubClient: MockGitHub(),
+        firestoreService: mockFirestoreService,
+        supportedReposValue: <RepositorySlug>{
+          Config.engineSlug,
+          Config.flutterSlug,
+        },
+      );
+      httpClient = MockClient((http.Request request) async {
+        if (request.url.path.contains('.ci.yaml')) {
+          return http.Response(singleCiYaml, 200);
+        }
+        throw Exception('Failed to find ${request.url.path}');
+      });
+
+      mockGithubChecksUtil = MockGithubChecksUtil();
+      // Generate check runs based on the name hash code
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any, output: anyNamed('output')))
+          .thenAnswer((Invocation invocation) async => generateCheckRun(invocation.positionalArguments[2].hashCode));
+      scheduler = SchedulerV2(
+        cache: cache,
+        config: config,
+        datastoreProvider: (DatastoreDB db) => DatastoreService(db, 2),
+        buildStatusProvider: (_, __) => buildStatusService,
+        githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+        httpClientProvider: () => httpClient,
+        luciBuildService: FakeLuciBuildServiceV2(
+          config: config,
+          githubChecksUtil: mockGithubChecksUtil,
+          gerritService: FakeGerritService(
+            branchesValue: <String>['master', 'main'],
+          ),
+        ),
+      );
+
+      when(mockGithubChecksUtil.createCheckRun(any, any, any, any)).thenAnswer((_) async {
+        return CheckRun.fromJson(const <String, dynamic>{
+          'id': 1,
+          'started_at': '2020-05-10T02:49:31Z',
+          'check_suite': <String, dynamic>{'id': 2},
+        });
+      });
+    });
+
+    group('add commits', () {
+      final FakePubSub pubsub = FakePubSub();
+      List<Commit> createCommitList(
+        List<String> shas, {
+        String repo = 'flutter',
+        String branch = 'master',
+      }) {
+        return List<Commit>.generate(
+          shas.length,
+          (int index) => Commit(
+            author: 'Username',
+            authorAvatarUrl: 'http://example.org/avatar.jpg',
+            branch: branch,
+            key: db.emptyKey.append(Commit, id: 'flutter/$repo/$branch/${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 {
+        await scheduler.addCommits(<Commit>[]);
+        expect(db.values, isEmpty);
+      });
+
+      test('inserts all relevant fields of the commit', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        config.supportedBranchesValue = <String>['master'];
+        expect(db.values.values.whereType<Commit>().length, 0);
+        await scheduler.addCommits(createCommitList(<String>['1']));
+        expect(db.values.values.whereType<Commit>().length, 1);
+        final Commit commit = db.values.values.whereType<Commit>().single;
+        expect(commit.repository, 'flutter/flutter');
+        expect(commit.branch, 'master');
+        expect(commit.sha, '1');
+        expect(commit.timestamp, 1);
+        expect(commit.author, 'Username');
+        expect(commit.authorAvatarUrl, 'http://example.org/avatar.jpg');
+        expect(commit.message, 'commit message');
+      });
+
+      test('skips scheduling for unsupported repos', () async {
+        config.supportedBranchesValue = <String>['master'];
+        await scheduler.addCommits(createCommitList(<String>['1'], repo: 'not-supported'));
+        expect(db.values.values.whereType<Commit>().length, 0);
+      });
+
+      test('skips commits for which transaction commit fails', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        config.supportedBranchesValue = <String>['master'];
+
+        // Existing commits should not be duplicated.
+        final Commit commit = shaToCommit('1');
+        db.values[commit.key] = commit;
+
+        db.onCommit = (List<gcloud_db.Model<dynamic>> inserts, List<gcloud_db.Key<dynamic>> deletes) {
+          if (inserts.whereType<Commit>().where((Commit commit) => commit.sha == '3').isNotEmpty) {
+            throw StateError('Commit failed');
+          }
+        };
+        // Commits are expect from newest to oldest timestamps
+        await scheduler.addCommits(createCommitList(<String>['2', '3', '4']));
+        expect(db.values.values.whereType<Commit>().length, 3);
+        // The 2 new commits are scheduled 3 tasks, existing commit has none.
+        expect(db.values.values.whereType<Task>().length, 2 * 3);
+        // Check commits were added, but 3 was not
+        expect(db.values.values.whereType<Commit>().map<String>(toSha), containsAll(<String>['1', '2', '4']));
+        expect(db.values.values.whereType<Commit>().map<String>(toSha), isNot(contains('3')));
+      });
+
+      test('skips commits for which task transaction fails', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        config.supportedBranchesValue = <String>['master'];
+
+        // Existing commits should not be duplicated.
+        final Commit commit = shaToCommit('1');
+        db.values[commit.key] = commit;
+
+        db.onCommit = (List<gcloud_db.Model<dynamic>> inserts, List<gcloud_db.Key<dynamic>> deletes) {
+          if (inserts.whereType<Task>().where((Task task) => task.createTimestamp == 3).isNotEmpty) {
+            throw StateError('Task failed');
+          }
+        };
+        // Commits are expect from newest to oldest timestamps
+        await scheduler.addCommits(createCommitList(<String>['2', '3', '4']));
+        expect(db.values.values.whereType<Commit>().length, 3);
+        // The 2 new commits are scheduled 3 tasks, existing commit has none.
+        expect(db.values.values.whereType<Task>().length, 2 * 3);
+        // Check commits were added, but 3 was not
+        expect(db.values.values.whereType<Commit>().map<String>(toSha), containsAll(<String>['1', '2', '4']));
+        expect(db.values.values.whereType<Commit>().map<String>(toSha), isNot(contains('3')));
+      });
+
+      test('schedules cocoon based targets', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        final MockLuciBuildServiceV2 luciBuildService = MockLuciBuildServiceV2();
+        when(
+          luciBuildService.schedulePostsubmitBuilds(
+            commit: anyNamed('commit'),
+            toBeScheduled: captureAnyNamed('toBeScheduled'),
+          ),
+        ).thenAnswer((_) => Future<List<Tuple<Target, Task, int>>>.value(<Tuple<Target, Task, int>>[]));
+        buildStatusService = FakeBuildStatusService(
+          commitStatuses: <CommitStatus>[
+            CommitStatus(generateCommit(1, repo: 'engine', branch: 'main'), const <Stage>[]),
+          ],
+        );
+        scheduler = SchedulerV2(
+          cache: cache,
+          config: config,
+          buildStatusProvider: (_, __) => buildStatusService,
+          datastoreProvider: (DatastoreDB db) => DatastoreService(db, 2),
+          githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+          httpClientProvider: () => httpClient,
+          luciBuildService: luciBuildService,
+        );
+
+        await scheduler.addCommits(createCommitList(<String>['1'], repo: 'engine', branch: 'main'));
+        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 =
+            toBeScheduled.map((dynamic tuple) => tuple as Tuple<Target, Task, int>);
+        final Iterable<String> scheduledTargetNames =
+            tuples.map((Tuple<Target, Task, int> tuple) => tuple.second.name!);
+        expect(scheduledTargetNames, ['Linux A', 'Linux runIf']);
+        // Tasks triggered by cocoon are marked as in progress
+        final Iterable<Task> tasks = db.values.values.whereType<Task>();
+        expect(tasks.singleWhere((Task task) => task.name == 'Linux A').status, Task.statusInProgress);
+      });
+
+      test('schedules cocoon based targets - multiple batch requests', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        final MockBuildBucketV2Client mockBuildBucketV2Client = MockBuildBucketV2Client();
+        final FakeLuciBuildServiceV2 luciBuildServiceV2 = FakeLuciBuildServiceV2(
+          config: config,
+          buildBucketV2Client: mockBuildBucketV2Client,
+          gerritService: FakeGerritService(),
+          githubChecksUtil: mockGithubChecksUtil,
+          pubsub: pubsub,
+        );
+        when(mockGithubChecksUtil.createCheckRun(any, any, any, any, output: anyNamed('output')))
+            .thenAnswer((_) async => generateCheckRun(1, name: 'Linux A'));
+
+        when(mockBuildBucketV2Client.listBuilders(any)).thenAnswer((_) async {
+          return bbv2.ListBuildersResponse(
+            builders: [
+              bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'Linux A')),
+              bbv2.BuilderItem(id: bbv2.BuilderID(bucket: 'prod', project: 'flutter', builder: 'Linux runIf')),
+            ],
+          );
+        });
+        buildStatusService = FakeBuildStatusService(
+          commitStatuses: <CommitStatus>[
+            CommitStatus(generateCommit(1, repo: 'engine', branch: 'main'), const <Stage>[]),
+          ],
+        );
+        config.batchSizeValue = 1;
+        scheduler = SchedulerV2(
+          cache: cache,
+          config: config,
+          buildStatusProvider: (_, __) => buildStatusService,
+          datastoreProvider: (DatastoreDB db) => DatastoreService(db, 2),
+          githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+          httpClientProvider: () => httpClient,
+          luciBuildService: luciBuildServiceV2,
+        );
+
+        await scheduler.addCommits(createCommitList(<String>['1'], repo: 'engine', branch: 'main'));
+        expect(pubsub.messages.length, 2);
+      });
+    });
+
+    group('add pull request', () {
+      test('creates expected commit', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        final PullRequest mergedPr = generatePullRequest();
+        await scheduler.addPullRequest(mergedPr);
+
+        expect(db.values.values.whereType<Commit>().length, 1);
+        final Commit commit = db.values.values.whereType<Commit>().single;
+        expect(commit.repository, 'flutter/flutter');
+        expect(commit.branch, 'master');
+        expect(commit.sha, 'abc');
+        expect(commit.timestamp, 1);
+        expect(commit.author, 'dash');
+        expect(commit.authorAvatarUrl, 'dashatar');
+        expect(commit.message, 'example message');
+
+        final List<dynamic> captured = verify(mockFirestoreService.writeViaTransaction(captureAny)).captured;
+        expect(captured.length, 1);
+        final List<Write> commitResponse = captured[0] as List<Write>;
+        expect(commitResponse.length, 4);
+      });
+
+      test('schedules tasks against merged PRs', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        final PullRequest mergedPr = generatePullRequest();
+        await scheduler.addPullRequest(mergedPr);
+
+        expect(db.values.values.whereType<Commit>().length, 1);
+        expect(db.values.values.whereType<Task>().length, 3);
+      });
+
+      test('guarantees scheduling of tasks against merged release branch PR', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        final PullRequest mergedPr = generatePullRequest(branch: 'flutter-3.2-candidate.5');
+        await scheduler.addPullRequest(mergedPr);
+
+        expect(db.values.values.whereType<Commit>().length, 1);
+        expect(db.values.values.whereType<Task>().length, 3);
+        // Ensure all tasks have been marked in progress
+        expect(db.values.values.whereType<Task>().where((Task task) => task.status == Task.statusNew), isEmpty);
+      });
+
+      test('guarantees scheduling of tasks against merged engine PR', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        final PullRequest mergedPr = generatePullRequest(
+          repo: Config.engineSlug.name,
+          branch: Config.defaultBranch(Config.engineSlug),
+        );
+        await scheduler.addPullRequest(mergedPr);
+
+        expect(db.values.values.whereType<Commit>().length, 1);
+        expect(db.values.values.whereType<Task>().length, 3);
+        // Ensure all tasks under cocoon scheduler have been marked in progress
+        expect(db.values.values.whereType<Task>().where((Task task) => task.status == Task.statusInProgress).length, 2);
+      });
+
+      test('Release candidate branch commit filters builders not in default branch', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        const String totCiYaml = r'''
+enabled_branches:
+  - main
+  - flutter-\d+\.\d+-candidate\.\d+
+targets:
+  - name: Linux A
+    properties:
+      custom: abc
+''';
+        httpClient = MockClient((http.Request request) async {
+          if (request.url.path == '/flutter/engine/abc/.ci.yaml') {
+            return http.Response(totCiYaml, HttpStatus.ok);
+          }
+          if (request.url.path == '/flutter/engine/1/.ci.yaml') {
+            return http.Response(singleCiYaml, HttpStatus.ok);
+          }
+          print(request.url.path);
+          throw Exception('Failed to find ${request.url.path}');
+        });
+        scheduler = SchedulerV2(
+          cache: cache,
+          config: config,
+          datastoreProvider: (DatastoreDB db) => DatastoreService(db, 2),
+          buildStatusProvider: (_, __) => buildStatusService,
+          githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+          httpClientProvider: () => httpClient,
+          luciBuildService: FakeLuciBuildServiceV2(
+            config: config,
+            githubChecksUtil: mockGithubChecksUtil,
+            gerritService: FakeGerritService(
+              branchesValue: <String>['master', 'main'],
+            ),
+          ),
+        );
+
+        final PullRequest mergedPr = generatePullRequest(
+          repo: Config.engineSlug.name,
+          branch: 'flutter-3.10-candidate.1',
+        );
+        await scheduler.addPullRequest(mergedPr);
+
+        final List<Task> tasks = db.values.values.whereType<Task>().toList();
+        expect(db.values.values.whereType<Commit>().length, 1);
+        expect(tasks, hasLength(1));
+        expect(tasks.first.name, 'Linux A');
+        // Ensure all tasks under cocoon scheduler have been marked in progress
+        expect(db.values.values.whereType<Task>().where((Task task) => task.status == Task.statusInProgress).length, 1);
+      });
+
+      test('does not schedule tasks against non-merged PRs', () async {
+        final PullRequest notMergedPr = generatePullRequest(merged: false);
+        await scheduler.addPullRequest(notMergedPr);
+
+        expect(db.values.values.whereType<Commit>().map<String>(toSha).length, 0);
+        expect(db.values.values.whereType<Task>().length, 0);
+      });
+
+      test('does not schedule tasks against already added PRs', () async {
+        // Existing commits should not be duplicated.
+        final Commit commit = shaToCommit('1');
+        db.values[commit.key] = commit;
+
+        final PullRequest alreadyLandedPr = generatePullRequest(sha: '1');
+        await scheduler.addPullRequest(alreadyLandedPr);
+
+        expect(db.values.values.whereType<Commit>().map<String>(toSha).length, 1);
+        // No tasks should be scheduled as that is done on commit insert.
+        expect(db.values.values.whereType<Task>().length, 0);
+      });
+
+      test('creates expected commit from release branch PR', () async {
+        when(
+          mockFirestoreService.writeViaTransaction(
+            captureAny,
+          ),
+        ).thenAnswer((Invocation invocation) {
+          return Future<CommitResponse>.value(CommitResponse());
+        });
+        final PullRequest mergedPr = generatePullRequest(branch: '1.26');
+        await scheduler.addPullRequest(mergedPr);
+
+        expect(db.values.values.whereType<Commit>().length, 1);
+        final Commit commit = db.values.values.whereType<Commit>().single;
+        expect(commit.repository, 'flutter/flutter');
+        expect(commit.branch, '1.26');
+        expect(commit.sha, 'abc');
+        expect(commit.timestamp, 1);
+        expect(commit.author, 'dash');
+        expect(commit.authorAvatarUrl, 'dashatar');
+        expect(commit.message, 'example message');
+      });
+    });
+
+    group('process check run', () {
+      test('rerequested ci.yaml check retriggers presubmit', () async {
+        final MockGithubService mockGithubService = MockGithubService();
+        final MockGitHub mockGithubClient = MockGitHub();
+        buildStatusService =
+            FakeBuildStatusService(commitStatuses: <CommitStatus>[CommitStatus(generateCommit(1), const <Stage>[])]);
+        config = FakeConfig(
+          githubService: mockGithubService,
+          firestoreService: mockFirestoreService,
+        );
+        scheduler = SchedulerV2(
+          cache: cache,
+          config: config,
+          buildStatusProvider: (_, __) => buildStatusService,
+          githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+          httpClientProvider: () => httpClient,
+          luciBuildService: FakeLuciBuildServiceV2(
+            config: config,
+            githubChecksUtil: mockGithubChecksUtil,
+          ),
+        );
+        when(mockGithubService.github).thenReturn(mockGithubClient);
+        when(mockGithubService.searchIssuesAndPRs(any, any, sort: anyNamed('sort'), pages: anyNamed('pages')))
+            .thenAnswer((_) async => [generateIssue(3)]);
+        when(mockGithubChecksUtil.listCheckSuitesForRef(any, any, ref: anyNamed('ref'))).thenAnswer(
+          (_) async => [
+            // From check_run.check_suite.id in [checkRunString].
+            generateCheckSuite(668083231),
+          ],
+        );
+        when(mockGithubService.getPullRequest(any, any)).thenAnswer((_) async => generatePullRequest());
+        when(mockGithubService.listFiles(any)).thenAnswer((_) async => ['abc/def']);
+        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',
+            'name': Scheduler.kCiYamlCheckName,
+            'check_suite': <String, dynamic>{'id': 2},
+          });
+        });
+        final Map<String, dynamic> checkRunEventJson = jsonDecode(checkRunString) as Map<String, dynamic>;
+        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'),
+          ),
+        );
+        // Verfies Linux A was created
+        verify(mockGithubChecksUtil.createCheckRun(any, any, any, any)).called(1);
+      });
+
+      // test('rerequested presubmit check triggers presubmit build', () async {
+      //   // Note that we're not inserting any commits into the db, because
+      //   // only postsubmit commits are stored in the datastore.
+      //   config = FakeConfig(dbValue: db);
+      //   db = FakeDatastoreDB();
+
+      //   // Set up mock buildbucket to validate which bucket is requested.
+      //   final MockBuildBucketV2Client mockBuildbucket = MockBuildBucketV2Client();
+
+      //   when(mockBuildbucket.batch(any)).thenAnswer((i) async {
+      //     return FakeBuildBucketV2Client().batch(i.positionalArguments[0]);
+      //   });
+
+      //   when(mockBuildbucket.scheduleBuild(any, buildBucketUri: anyNamed('buildBucketUri')))
+      //       .thenAnswer((realInvocation) async {
+      //     final ScheduleBuildRequest scheduleBuildRequest = realInvocation.positionalArguments[0];
+      //     // Ensure this is an attempt to schedule a presubmit build by
+      //     // verifying that bucket == 'try'.
+      //     expect(scheduleBuildRequest.builderId.bucket, equals('try'));
+      //     return bbv2.Build(builder: bbv2.BuilderID(), id: Int64());
+      //   });
+
+      //   scheduler = SchedulerV2(
+      //     cache: cache,
+      //     config: config,
+      //     githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+      //     luciBuildService: FakeLuciBuildServiceV2(
+      //       config: config,
+      //       githubChecksUtil: mockGithubChecksUtil,
+      //       buildBucketV2Client: mockBuildbucket,
+      //     ),
+      //   );
+
+      //   final cocoon_checks.CheckRunEvent checkRunEvent = cocoon_checks.CheckRunEvent.fromJson(
+      //     jsonDecode(checkRunString) as Map<String, dynamic>,
+      //   );
+
+      //   expect(await scheduler.processCheckRun(checkRunEvent), true);
+
+      //   verify(mockBuildbucket.scheduleBuild(any, buildBucketUri: anyNamed('buildBucketUri'))).called(1);
+      //   verify(mockGithubChecksUtil.createCheckRun(any, any, any, any)).called(1);
+      // });
+
+//       test('rerequested postsubmit check triggers postsubmit build', () async {
+//         // Set up datastore with postsubmit entities matching [checkRunString].
+//         db = FakeDatastoreDB();
+//         config = FakeConfig(
+//           dbValue: db,
+//           postsubmitSupportedReposValue: {RepositorySlug('abc', 'cocoon')},
+//           firestoreService: mockFirestoreService,
+//         );
+//         final Commit commit = generateCommit(
+//           1,
+//           sha: '66d6bd9a3f79a36fe4f5178ccefbc781488a596c',
+//           branch: 'independent_agent',
+//           owner: 'abc',
+//           repo: 'cocoon',
+//         );
+//         final Commit commitToT = generateCommit(
+//           1,
+//           sha: '66d6bd9a3f79a36fe4f5178ccefbc781488a592c',
+//           branch: 'master',
+//           owner: 'abc',
+//           repo: 'cocoon',
+//         );
+//         config.db.values[commit.key] = commit;
+//         config.db.values[commitToT.key] = commitToT;
+//         final Task task = generateTask(1, name: 'test1', parent: commit);
+//         config.db.values[task.key] = task;
+
+//         // Set up ci.yaml with task name and branch name from [checkRunString].
+//         httpClient = MockClient((http.Request request) async {
+//           if (request.url.path.contains('.ci.yaml')) {
+//             return http.Response(
+//               r'''
+// enabled_branches:
+//   - independent_agent
+//   - master
+// targets:
+//   - name: test1
+// ''',
+//               200,
+//             );
+//           }
+//           throw Exception('Failed to find ${request.url.path}');
+//         });
+
+//         // Set up mock buildbucket to validate which bucket is requested.
+//         final MockBuildBucketV2Client mockBuildbucket = MockBuildBucketV2Client();
+//         when(mockBuildbucket.batch(any)).thenAnswer((i) async {
+//           return FakeBuildBucketV2Client().batch(i.positionalArguments[0]);
+//         });
+//         when(mockBuildbucket.scheduleBuild(any, buildBucketUri: anyNamed('buildBucketUri')))
+//             .thenAnswer((realInvocation) async {
+//           final ScheduleBuildRequest scheduleBuildRequest = realInvocation.positionalArguments[0];
+//           // Ensure this is an attempt to schedule a postsubmit build by
+//           // verifying that bucket == 'prod'.
+//           expect(scheduleBuildRequest.builderId.bucket, equals('prod'));
+//           return bbv2.Build(builder: bbv2.BuilderID(), id: Int64());
+//         });
+
+//         scheduler = SchedulerV2(
+//           cache: cache,
+//           config: config,
+//           githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+//           httpClientProvider: () => httpClient,
+//           luciBuildService: FakeLuciBuildServiceV2(
+//             config: config,
+//             githubChecksUtil: mockGithubChecksUtil,
+//             buildBucketV2Client: mockBuildbucket,
+//             gerritService: FakeGerritService(
+//               branchesValue: <String>['master', 'main'],
+//             ),
+//           ),
+//         );
+//         final cocoon_checks.CheckRunEvent checkRunEvent = cocoon_checks.CheckRunEvent.fromJson(
+//           jsonDecode(checkRunString) as Map<String, dynamic>,
+//         );
+//         expect(await scheduler.processCheckRun(checkRunEvent), true);
+//         verify(mockBuildbucket.scheduleBuild(any, buildBucketUri: anyNamed('buildBucketUri'))).called(1);
+//         verify(mockGithubChecksUtil.createCheckRun(any, any, any, any)).called(1);
+//       });
+
+      // test('rerequested does not fail on empty pull request list', () async {
+      //   when(mockGithubChecksUtil.createCheckRun(any, any, any, any)).thenAnswer((_) async {
+      //     return CheckRun.fromJson(const <String, dynamic>{
+      //       'id': 1,
+      //       'started_at': '2020-05-10T02:49:31Z',
+      //       'check_suite': <String, dynamic>{'id': 2},
+      //     });
+      //   });
+      //   final cocoon_checks.CheckRunEvent checkRunEvent = cocoon_checks.CheckRunEvent.fromJson(
+      //     jsonDecode(checkRunWithEmptyPullRequests) as Map<String, dynamic>,
+      //   );
+      //   expect(await scheduler.processCheckRun(checkRunEvent), true);
+      //   verify(mockGithubChecksUtil.createCheckRun(any, any, any, any)).called(1);
+      // });
+    });
+
+    group('presubmit', () {
+      test('gets only enabled .ci.yaml builds', () async {
+        httpClient = MockClient((http.Request request) async {
+          if (request.url.path.contains('.ci.yaml')) {
+            return http.Response(
+              '''
+enabled_branches:
+  - master
+targets:
+  - name: Linux A
+    presubmit: true
+    scheduler: luci
+  - name: Linux B
+    scheduler: luci
+    enabled_branches:
+      - stable
+    presubmit: true
+  - name: Linux C
+    scheduler: luci
+    enabled_branches:
+      - master
+    presubmit: true
+  - name: Linux D
+    scheduler: luci
+    bringup: true
+    presubmit: true
+  - name: Google-internal roll
+    scheduler: google_internal
+    enabled_branches:
+      - master
+    presubmit: true
+          ''',
+              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']),
+        );
+      });
+
+      group('treats postsubmit as presubmit if a label is present', () {
+        final IssueLabel runAllTests = IssueLabel(name: 'test: all');
+        setUp(() async {
+          httpClient = MockClient((http.Request request) async {
+            if (request.url.path.contains('.ci.yaml')) {
+              return http.Response(
+                '''
+  enabled_branches:
+    - main
+    - master
+  targets:
+    - name: Linux Presubmit
+      presubmit: true
+      scheduler: luci
+    - name: Linux Conditional Presubmit (runIf)
+      presubmit: true
+      scheduler: luci
+      runIf:
+        - .ci.yaml
+        - DEPS
+        - dev/run_if/**
+    - name: Linux Conditional Presubmit (runIfNot)
+      presubmit: true
+      scheduler: luci
+      runIfNot:
+        - dev/run_if_not/**
+    - name: Linux Postsubmit
+      presubmit: false
+      scheduler: luci
+    - name: Linux Cache
+      presubmit: false
+      scheduler: luci
+      properties:
+        cache_name: "builder"
+  ''',
+                200,
+              );
+            }
+            throw Exception('Failed to find ${request.url.path}');
+          });
+        });
+
+        test('with a specific label in the flutter/engine repo', () async {
+          final enginePr = generatePullRequest(
+            branch: Config.defaultBranch(Config.engineSlug),
+            labels: <IssueLabel>[runAllTests],
+            repo: Config.engineSlug.name,
+          );
+          final List<Target> presubmitTargets = await scheduler.getPresubmitTargets(enginePr);
+          expect(
+            presubmitTargets.map((Target target) => target.value.name).toList(),
+            <String>[
+              // Always runs.
+              'Linux Presubmit',
+              // test: all label is present, so runIf is skipped.
+              'Linux Conditional Presubmit (runIf)',
+              'Linux Conditional Presubmit (runIfNot)',
+              // test: all label is present, so postsubmit is treated as presubmit.
+              'Linux Postsubmit',
+            ],
+          );
+        });
+
+        test('with a specific label in the flutter/flutter repo', () async {
+          final frameworkPr = generatePullRequest(
+            branch: Config.defaultBranch(Config.flutterSlug),
+            labels: <IssueLabel>[runAllTests],
+            repo: Config.flutterSlug.name,
+          );
+          final List<Target> presubmitTargets = await scheduler.getPresubmitTargets(frameworkPr);
+          expect(
+            presubmitTargets.map((Target target) => target.value.name).toList(),
+            <String>[
+              // Always runs.
+              'Linux Presubmit',
+              'Linux Conditional Presubmit (runIfNot)',
+            ],
+          );
+        });
+
+        test('without a specific label', () async {
+          final enginePr = generatePullRequest(
+            branch: Config.defaultBranch(Config.engineSlug),
+            labels: <IssueLabel>[],
+            repo: Config.engineSlug.name,
+          );
+          final List<Target> presubmitTargets = await scheduler.getPresubmitTargets(enginePr);
+          expect(
+            presubmitTargets.map((Target target) => target.value.name).toList(),
+            (<String>[
+              // Always runs.
+              'Linux Presubmit',
+              'Linux Conditional Presubmit (runIfNot)',
+            ]),
+          );
+        });
+      });
+
+      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(
+              '''
+enabled_branches:
+  - master
+targets:
+  - name: Linux A
+    presubmit: true
+    scheduler: luci
+          ''',
+              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'))),
+        );
+      });
+
+      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(
+              '''
+enabled_branches:
+  - main
+  - master
+  - flutter-\\d+.\\d+-candidate.\\d+
+targets:
+  - name: Linux A
+    scheduler: luci
+          ''',
+              200,
+            );
+          }
+          throw Exception('Failed to find ${request.url.path}');
+        });
+        final List<Target> targets = await scheduler.getPresubmitTargets(generatePullRequest(branch: branch));
+        expect(targets.single.value.name, 'Linux A');
+      });
+
+      test('triggers expected presubmit build checks', () async {
+        await scheduler.triggerPresubmitTargets(pullRequest: pullRequest);
+        expect(
+          verify(mockGithubChecksUtil.createCheckRun(any, any, any, captureAny, output: captureAnyNamed('output')))
+              .captured,
+          <dynamic>[
+            Scheduler.kCiYamlCheckName,
+            const CheckRunOutput(
+              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
+          ],
+        );
+      });
+
+      test('Do not schedule other targets on revert request.', () async {
+        final PullRequest releasePullRequest = generatePullRequest(
+          labels: [IssueLabel(name: 'revert of')],
+        );
+
+        releasePullRequest.user = User(login: 'auto-submit[bot]');
+
+        await scheduler.triggerPresubmitTargets(pullRequest: releasePullRequest);
+        expect(
+          verify(mockGithubChecksUtil.createCheckRun(any, any, any, captureAny, output: captureAnyNamed('output')))
+              .captured,
+          <dynamic>[
+            Scheduler.kCiYamlCheckName,
+            // No other targets should be created.
+            const CheckRunOutput(
+              title: Scheduler.kCiYamlCheckName,
+              summary: 'If this check is stuck pending, push an empty commit to retrigger the checks',
+            ),
+          ],
+        );
+      });
+
+      test('filters out presubmit targets that do not exist in main and do not filter targets not in main', () async {
+        const String singleCiYaml = r'''
+enabled_branches:
+  - master
+  - main
+  - flutter-\d+\.\d+-candidate\.\d+
+targets:
+  - name: Linux A
+    properties:
+      custom: abc
+  - name: Linux B
+    enabled_branches:
+      - flutter-\d+\.\d+-candidate\.\d+
+    scheduler: luci
+  - name: Linux C
+    enabled_branches:
+      - main
+      - flutter-\d+\.\d+-candidate\.\d+
+    scheduler: luci
+''';
+        const String totCiYaml = r'''
+enabled_branches:
+  - main
+  - flutter-\d+\.\d+-candidate\.\d+
+targets:
+  - name: Linux A
+    bringup: true
+    properties:
+      custom: abc
+''';
+        httpClient = MockClient((http.Request request) async {
+          if (request.url.path == '/flutter/engine/1/.ci.yaml') {
+            return http.Response(totCiYaml, HttpStatus.ok);
+          }
+          if (request.url.path == '/flutter/engine/abc/.ci.yaml') {
+            return http.Response(singleCiYaml, HttpStatus.ok);
+          }
+          print(request.url.path);
+          throw Exception('Failed to find ${request.url.path}');
+        });
+        scheduler = SchedulerV2(
+          cache: cache,
+          config: config,
+          datastoreProvider: (DatastoreDB db) => DatastoreService(db, 2),
+          buildStatusProvider: (_, __) => buildStatusService,
+          githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+          httpClientProvider: () => httpClient,
+          luciBuildService: FakeLuciBuildServiceV2(
+            config: config,
+            githubChecksUtil: mockGithubChecksUtil,
+            gerritService: FakeGerritService(
+              branchesValue: <String>['master', 'main'],
+            ),
+          ),
+        );
+        final PullRequest pr = generatePullRequest(
+          repo: Config.engineSlug.name,
+          branch: 'flutter-3.10-candidate.1',
+        );
+        final List<Target> targets = await scheduler.getPresubmitTargets(pr);
+        expect(
+          targets.map((Target target) => target.value.name).toList(),
+          containsAll(<String>['Linux A', 'Linux B']),
+        );
+      });
+
+      test('triggers all presubmit build checks when diff cannot be found', () async {
+        final MockGithubService mockGithubService = MockGithubService();
+        when(mockGithubService.listFiles(pullRequest))
+            .thenThrow(GitHubError(GitHub(), 'Requested Resource was Not Found'));
+        buildStatusService =
+            FakeBuildStatusService(commitStatuses: <CommitStatus>[CommitStatus(generateCommit(1), const <Stage>[])]);
+        scheduler = SchedulerV2(
+          cache: cache,
+          config: FakeConfig(
+            // tabledataResource: tabledataResource,
+            dbValue: db,
+            githubService: mockGithubService,
+            githubClient: MockGitHub(),
+            firestoreService: mockFirestoreService,
+          ),
+          buildStatusProvider: (_, __) => buildStatusService,
+          datastoreProvider: (DatastoreDB db) => DatastoreService(db, 2),
+          githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+          httpClientProvider: () => httpClient,
+          luciBuildService: FakeLuciBuildServiceV2(
+            config: config,
+            githubChecksUtil: mockGithubChecksUtil,
+            gerritService: FakeGerritService(branchesValue: <String>['master']),
+          ),
+        );
+        await scheduler.triggerPresubmitTargets(pullRequest: pullRequest);
+        expect(
+          verify(mockGithubChecksUtil.createCheckRun(any, any, any, captureAny, output: captureAnyNamed('output')))
+              .captured,
+          <dynamic>[
+            Scheduler.kCiYamlCheckName,
+            const CheckRunOutput(
+              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
+            'Linux runIf',
+            null,
+          ],
+        );
+      });
+
+      test('triggers all presubmit targets on release branch pull request', () async {
+        final PullRequest releasePullRequest = generatePullRequest(
+          branch: 'flutter-1.24-candidate.1',
+        );
+        await scheduler.triggerPresubmitTargets(pullRequest: releasePullRequest);
+        expect(
+          verify(mockGithubChecksUtil.createCheckRun(any, any, any, captureAny, output: captureAnyNamed('output')))
+              .captured,
+          <dynamic>[
+            Scheduler.kCiYamlCheckName,
+            const CheckRunOutput(
+              title: Scheduler.kCiYamlCheckName,
+              summary: 'If this check is stuck pending, push an empty commit to retrigger the checks',
+            ),
+            'Linux A',
+            null,
+            'Linux runIf',
+            null,
+          ],
+        );
+      });
+
+      test('ci.yaml validation passes with default config', () async {
+        when(mockGithubChecksUtil.getCheckRun(any, any, any))
+            .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],
+        );
+      });
+
+      test('ci.yaml validation fails with empty config', () async {
+        httpClient = MockClient((http.Request request) async {
+          if (request.url.path.contains('.ci.yaml')) {
+            return http.Response('', 200);
+          }
+          throw Exception('Failed to find ${request.url.path}');
+        });
+        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],
+        );
+      });
+
+      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],
+        );
+      });
+
+      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(
+              '''
+enabled_branches:
+  - master
+targets:
+  - name: A
+    builder: Linux A
+    dependencies:
+      - B
+          ''',
+              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',
+        );
+      });
+
+      // test('retries only triggers failed builds only', () async {
+      //   final MockBuildBucketV2Client mockBuildbucket = MockBuildBucketV2Client();
+      //   buildStatusService =
+      //       FakeBuildStatusService(commitStatuses: <CommitStatus>[CommitStatus(generateCommit(1), const <Stage>[])]);
+      //   final FakePubSub pubsub = FakePubSub();
+      //   scheduler = SchedulerV2(
+      //     cache: cache,
+      //     config: config,
+      //     datastoreProvider: (DatastoreDB db) => DatastoreService(db, 2),
+      //     githubChecksService: GithubChecksServiceV2(config, githubChecksUtil: mockGithubChecksUtil),
+      //     buildStatusProvider: (_, __) => buildStatusService,
+      //     httpClientProvider: () => httpClient,
+      //     luciBuildService: FakeLuciBuildServiceV2(
+      //       config: config,
+      //       githubChecksUtil: mockGithubChecksUtil,
+      //       buildBucketV2Client: mockBuildbucket,
+      //       gerritService: FakeGerritService(branchesValue: <String>['master']),
+      //       pubsub: pubsub,
+      //     ),
+      //   );
+      //   when(mockBuildbucket.batch(any)).thenAnswer(
+      //     (_) async => bbv2.BatchResponse(
+      //       responses: <bbv2.BatchResponse_Response>[
+      //         bbv2.BatchResponse_Response(
+      //           searchBuilds: bbv2.SearchBuildsResponse(
+      //             builds: <bbv2.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
+      //   final Map<String, CheckRun> checkRuns = <String, CheckRun>{
+      //     'Linux': createCheckRun(name: 'Linux', id: 100),
+      //     'Linux Coverage': createCheckRun(name: 'Linux Coverage', id: 200),
+      //     'Mac': createCheckRun(name: 'Mac', id: 300, status: CheckRunStatus.queued),
+      //     'Windows': createCheckRun(name: 'Windows', id: 400, status: CheckRunStatus.inProgress),
+      //     'Linux A': createCheckRun(name: 'Linux A', id: 500),
+      //   };
+      //   when(mockGithubChecksUtil.allCheckRuns(any, any)).thenAnswer((_) async {
+      //     return checkRuns;
+      //   });
+
+      //   final CheckSuiteEvent checkSuiteEvent =
+      //       CheckSuiteEvent.fromJson(jsonDecode(checkSuiteTemplate('rerequested')) as Map<String, dynamic>);
+      //   await scheduler.retryPresubmitTargets(
+      //     pullRequest: pullRequest,
+      //     checkSuiteEvent: checkSuiteEvent,
+      //   );
+
+      //   expect(pubsub.messages.length, 1);
+      //   final BatchRequest batchRequest = pubsub.messages.single as BatchRequest;
+      //   expect(batchRequest.requests!.length, 1);
+      //   // Schedule build should have been sent
+      //   expect(batchRequest.requests!.single.scheduleBuild, isNotNull);
+      //   final ScheduleBuildRequest scheduleBuildRequest = batchRequest.requests!.single.scheduleBuild!;
+      //   // Verify expected parameters to schedule build
+      //   expect(scheduleBuildRequest.builderId.builder, 'Linux A');
+      //   expect(scheduleBuildRequest.properties!['custom'], 'abc');
+      // });
+
+      // test('pass github_build_label to properties', () async {
+      //   final MockBuildBucketClient mockBuildbucket = MockBuildBucketClient();
+      //   buildStatusService =
+      //       FakeBuildStatusService(commitStatuses: <CommitStatus>[CommitStatus(generateCommit(1), const <Stage>[])]);
+      //   final FakePubSub pubsub = FakePubSub();
+      //   scheduler = Scheduler(
+      //     cache: cache,
+      //     config: config,
+      //     datastoreProvider: (DatastoreDB db) => DatastoreService(db, 2),
+      //     githubChecksService: GithubChecksService(config, githubChecksUtil: mockGithubChecksUtil),
+      //     buildStatusProvider: (_, __) => buildStatusService,
+      //     httpClientProvider: () => httpClient,
+      //     luciBuildService: FakeLuciBuildService(
+      //       config: config,
+      //       githubChecksUtil: mockGithubChecksUtil,
+      //       buildbucket: mockBuildbucket,
+      //       gerritService: FakeGerritService(branchesValue: <String>['master']),
+      //       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.scheduleBuild(any))
+      //       .thenAnswer((_) async => generateBuild(5001, name: 'Linux A', bucket: 'try', status: Status.scheduled));
+      //   // Only Linux A should be retried
+      //   final Map<String, CheckRun> checkRuns = <String, CheckRun>{
+      //     'Linux': createCheckRun(name: 'Linux', id: 100),
+      //     'Linux Coverage': createCheckRun(name: 'Linux Coverage', id: 200),
+      //     'Mac': createCheckRun(name: 'Mac', id: 300, status: CheckRunStatus.queued),
+      //     'Windows': createCheckRun(name: 'Windows', id: 400, status: CheckRunStatus.inProgress),
+      //     'Linux A': createCheckRun(name: 'Linux A', id: 500),
+      //   };
+      //   when(mockGithubChecksUtil.allCheckRuns(any, any)).thenAnswer((_) async {
+      //     return checkRuns;
+      //   });
+
+      //   final CheckSuiteEvent checkSuiteEvent =
+      //       CheckSuiteEvent.fromJson(jsonDecode(checkSuiteTemplate('rerequested')) as Map<String, dynamic>);
+      //   await scheduler.retryPresubmitTargets(
+      //     pullRequest: pullRequest,
+      //     checkSuiteEvent: checkSuiteEvent,
+      //   );
+
+      //   expect(pubsub.messages.length, 1);
+      //   final BatchRequest batchRequest = pubsub.messages.single as BatchRequest;
+      //   expect(batchRequest.requests!.length, 1);
+      //   // Schedule build should have been sent
+      //   expect(batchRequest.requests!.single.scheduleBuild, isNotNull);
+      //   final ScheduleBuildRequest scheduleBuildRequest = batchRequest.requests!.single.scheduleBuild!;
+      //   // Verify expected parameters to schedule build
+      //   expect(scheduleBuildRequest.builderId.builder, 'Linux A');
+      //   expect(scheduleBuildRequest.properties!['custom'], 'abc');
+      // });
+
+      test('triggers only specificed targets', () async {
+        final List<Target> presubmitTargets = <Target>[generateTarget(1), generateTarget(2)];
+        final List<Target> presubmitTriggerTargets = scheduler.getTriggerList(presubmitTargets, <String>['Linux 1']);
+        expect(presubmitTriggerTargets.length, 1);
+      });
+
+      test('triggers all presubmit targets when trigger list is null', () async {
+        final List<Target> presubmitTargets = <Target>[generateTarget(1), generateTarget(2)];
+        final List<Target> presubmitTriggerTargets = scheduler.getTriggerList(presubmitTargets, null);
+        expect(presubmitTriggerTargets.length, 2);
+      });
+
+      test('triggers all presubmit targets when trigger list is empty', () async {
+        final List<Target> presubmitTargets = <Target>[generateTarget(1), generateTarget(2)];
+        final List<Target> presubmitTriggerTargets = scheduler.getTriggerList(presubmitTargets, <String>[]);
+        expect(presubmitTriggerTargets.length, 2);
+      });
+
+      test('triggers only targets that are contained in the trigger list', () async {
+        final List<Target> presubmitTargets = <Target>[generateTarget(1), generateTarget(2)];
+        final List<Target> presubmitTriggerTargets =
+            scheduler.getTriggerList(presubmitTargets, <String>['Linux 1', 'Linux 3']);
+        expect(presubmitTriggerTargets.length, 1);
+        expect(presubmitTargets[0].value.name, 'Linux 1');
+      });
+    });
+  });
+}
+
+CheckRun createCheckRun({String? name, required int id, CheckRunStatus status = CheckRunStatus.completed}) {
+  final int externalId = id * 2;
+  final String checkRunJson =
+      '{"name": "$name", "id": $id, "external_id": "{$externalId}", "status": "$status", "started_at": "2020-05-10T02:49:31Z", "head_sha": "the_sha", "check_suite": {"id": 456}}';
+  return CheckRun.fromJson(jsonDecode(checkRunJson) as Map<String, dynamic>);
+}
+
+String toSha(Commit commit) => commit.sha!;
+
+int toTimestamp(Commit commit) => commit.timestamp!;
diff --git a/app_dart/test/src/service/fake_luci_build_service.dart b/app_dart/test/src/service/fake_luci_build_service.dart
index 6650085..196447a 100644
--- a/app_dart/test/src/service/fake_luci_build_service.dart
+++ b/app_dart/test/src/service/fake_luci_build_service.dart
@@ -4,6 +4,7 @@
 
 import 'package:cocoon_service/src/foundation/github_checks_util.dart';
 import 'package:cocoon_service/src/request_handling/pubsub.dart';
+import 'package:cocoon_service/src/service/build_bucket_v2_client.dart';
 import 'package:cocoon_service/src/service/buildbucket.dart';
 import 'package:cocoon_service/src/service/cache_service.dart';
 import 'package:cocoon_service/src/service/gerrit_service.dart';
@@ -11,6 +12,7 @@
 
 import '../request_handling/fake_pubsub.dart';
 import '../utilities/mocks.dart';
+import 'fake_build_bucket_v2_client.dart';
 import 'fake_buildbucket.dart';
 import 'fake_gerrit_service.dart';
 
@@ -19,12 +21,14 @@
   FakeLuciBuildService({
     required super.config,
     BuildBucketClient? buildbucket,
+    BuildBucketV2Client? buildBucketV2Client,
     GithubChecksUtil? githubChecksUtil,
     GerritService? gerritService,
     PubSub? pubsub,
   }) : super(
           cache: CacheService(inMemory: true),
           buildBucketClient: buildbucket ?? FakeBuildBucketClient(),
+          buildBucketV2Client: buildBucketV2Client ?? FakeBuildBucketV2Client(),
           githubChecksUtil: githubChecksUtil ?? MockGithubChecksUtil(),
           gerritService: gerritService ?? FakeGerritService(),
           pubsub: pubsub ?? FakePubSub(),
diff --git a/app_dart/test/src/service/fake_luci_build_service_v2.dart b/app_dart/test/src/service/fake_luci_build_service_v2.dart
new file mode 100644
index 0000000..9e1e8ce
--- /dev/null
+++ b/app_dart/test/src/service/fake_luci_build_service_v2.dart
@@ -0,0 +1,32 @@
+// Copyright 2021 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/src/foundation/github_checks_util.dart';
+import 'package:cocoon_service/src/request_handling/pubsub.dart';
+import 'package:cocoon_service/src/service/build_bucket_v2_client.dart';
+import 'package:cocoon_service/src/service/cache_service.dart';
+import 'package:cocoon_service/src/service/gerrit_service.dart';
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
+
+import '../request_handling/fake_pubsub.dart';
+import '../utilities/mocks.dart';
+import 'fake_build_bucket_v2_client.dart';
+import 'fake_gerrit_service.dart';
+
+/// Fake [LuciBuildService] for use in tests.
+class FakeLuciBuildServiceV2 extends LuciBuildServiceV2 {
+  FakeLuciBuildServiceV2({
+    required super.config,
+    BuildBucketV2Client? buildBucketV2Client,
+    GithubChecksUtil? githubChecksUtil,
+    GerritService? gerritService,
+    PubSub? pubsub,
+  }) : super(
+          cache: CacheService(inMemory: true),
+          buildBucketV2Client: buildBucketV2Client ?? FakeBuildBucketV2Client(),
+          githubChecksUtil: githubChecksUtil ?? MockGithubChecksUtil(),
+          gerritService: gerritService ?? FakeGerritService(),
+          pubsub: pubsub ?? FakePubSub(),
+        );
+}
diff --git a/app_dart/test/src/service/fake_scheduler_v2.dart b/app_dart/test/src/service/fake_scheduler_v2.dart
new file mode 100644
index 0000000..d185218
--- /dev/null
+++ b/app_dart/test/src/service/fake_scheduler_v2.dart
@@ -0,0 +1,307 @@
+// Copyright 2021 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/src/foundation/github_checks_util.dart';
+import 'package:cocoon_service/src/model/appengine/commit.dart';
+import 'package:cocoon_service/src/model/ci_yaml/ci_yaml.dart';
+import 'package:cocoon_service/src/model/proto/protos.dart' as pb;
+import 'package:cocoon_service/src/service/build_bucket_v2_client.dart';
+import 'package:cocoon_service/src/service/cache_service.dart';
+import 'package:cocoon_service/src/service/config.dart';
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart';
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
+import 'package:cocoon_service/src/service/scheduler.dart';
+import 'package:cocoon_service/src/service/scheduler_v2.dart';
+import 'package:github/github.dart';
+import 'package:retry/retry.dart';
+
+import '../utilities/entity_generators.dart';
+import 'fake_luci_build_service_v2.dart';
+
+/// Fake for [Scheduler] to use for tests that rely on it.
+class FakeSchedulerV2 extends SchedulerV2 {
+  FakeSchedulerV2({
+    this.ciYaml,
+    LuciBuildServiceV2? luciBuildService,
+    BuildBucketV2Client? buildbucket,
+    required super.config,
+    GithubChecksUtil? githubChecksUtil,
+  }) : super(
+          cache: CacheService(inMemory: true),
+          githubChecksService: GithubChecksServiceV2(
+            config,
+            githubChecksUtil: githubChecksUtil,
+          ),
+          luciBuildService: luciBuildService ??
+              FakeLuciBuildServiceV2(
+                config: config,
+                buildBucketV2Client: buildbucket,
+                githubChecksUtil: githubChecksUtil,
+              ),
+        );
+
+  final CiYaml _defaultConfig = emptyConfig;
+
+  /// [CiYaml] value to be injected on [getCiYaml].
+  CiYaml? ciYaml;
+
+  @override
+  Future<CiYaml> getCiYaml(
+    Commit commit, {
+    CiYaml? totCiYaml,
+    RetryOptions? retryOptions,
+    bool validate = false,
+  }) async =>
+      ciYaml ?? _defaultConfig;
+
+  @override
+  Future<Commit> generateTotCommit({required String branch, required RepositorySlug slug}) async {
+    return generateCommit(1);
+  }
+
+  int cancelPreSubmitTargetsCallCnt = 0;
+
+  int get cancelPreSubmitTargetsCallCount => cancelPreSubmitTargetsCallCnt;
+
+  void resetCancelPreSubmitTargetsCallCount() => cancelPreSubmitTargetsCallCnt = 0;
+
+  @override
+  Future<void> cancelPreSubmitTargets({
+    required PullRequest pullRequest,
+    String reason = 'Newer commit available',
+  }) async {
+    await super.cancelPreSubmitTargets(pullRequest: pullRequest);
+    cancelPreSubmitTargetsCallCnt++;
+  }
+
+  int triggerPresubmitTargetsCnt = 0;
+
+  int get triggerPresubmitTargetsCallCount => triggerPresubmitTargetsCnt;
+
+  void resetTriggerPresubmitTargetsCallCount() => triggerPresubmitTargetsCnt = 0;
+
+  @override
+  Future<void> triggerPresubmitTargets({
+    required PullRequest pullRequest,
+    String reason = 'Newer commit available',
+    List<String>? builderTriggerList,
+  }) async {
+    await super.triggerPresubmitTargets(pullRequest: pullRequest);
+    triggerPresubmitTargetsCnt++;
+  }
+
+  int addPullRequestCallCnt = 0;
+
+  int get addPullRequestCallCount {
+    return addPullRequestCallCnt;
+  }
+
+  void resetAddPullRequestCallCount() {
+    addPullRequestCallCnt = 0;
+  }
+
+  @override
+  Future<void> addPullRequest(
+    PullRequest pr,
+  ) async {
+    await super.addPullRequest(pr);
+    addPullRequestCallCnt++;
+  }
+}
+
+final CiYaml emptyConfig = 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,
+      ),
+    ],
+  ),
+);
+
+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(
+        name: 'Google Internal Roll',
+        presubmit: false,
+        postsubmit: true,
+        scheduler: pb.SchedulerSystem.google_internal,
+      ),
+    ],
+  ),
+);
+
+CiYaml exampleBackfillConfig = 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,
+        postsubmit: true,
+        properties: {'backfill': 'true'},
+      ),
+      pb.Target(
+        name: 'Mac A',
+        scheduler: pb.SchedulerSystem.luci,
+        postsubmit: true,
+      ),
+      pb.Target(
+        name: 'Windows A',
+        scheduler: pb.SchedulerSystem.luci,
+        postsubmit: true,
+        properties: {'backfill': 'false'},
+      ),
+    ],
+  ),
+);
+
+CiYaml examplePresubmitRescheduleConfig = 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',
+      ),
+      pb.Target(
+        name: 'Linux B',
+        postsubmit: true,
+        properties: {'presubmit_retry': '1'},
+      ),
+    ],
+  ),
+);
+
+final 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',
+      ),
+      pb.Target(
+        name: 'Linux_android C',
+      ),
+    ],
+  ),
+);
+
+final CiYaml unsupportedPostsubmitCheckrunConfig = 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 flutter',
+      ),
+    ],
+  ),
+);
+
+final CiYaml nonBringupPackagesConfig = CiYaml(
+  slug: Config.packagesSlug,
+  branch: Config.defaultBranch(Config.packagesSlug),
+  config: pb.SchedulerConfig(
+    enabledBranches: <String>[
+      Config.defaultBranch(Config.packagesSlug),
+    ],
+    targets: <pb.Target>[
+      pb.Target(
+        name: 'Linux nonbringup',
+      ),
+    ],
+  ),
+);
+
+final CiYaml bringupPackagesConfig = CiYaml(
+  slug: Config.packagesSlug,
+  branch: Config.defaultBranch(Config.packagesSlug),
+  config: pb.SchedulerConfig(
+    enabledBranches: <String>[
+      Config.defaultBranch(Config.packagesSlug),
+    ],
+    targets: <pb.Target>[
+      pb.Target(
+        name: 'Linux bringup',
+        bringup: true,
+      ),
+    ],
+  ),
+);
+
+final CiYaml totCiYaml = 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 B',
+      ),
+      pb.Target(
+        name: 'Linux_android C',
+      ),
+    ],
+  ),
+);
+
+final CiYaml notInToTConfig = 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',
+      ),
+    ],
+  ),
+  totConfig: totCiYaml,
+);
diff --git a/app_dart/test/src/utilities/build_bucket_v2_messages.dart b/app_dart/test/src/utilities/build_bucket_v2_messages.dart
new file mode 100644
index 0000000..8b6a812
--- /dev/null
+++ b/app_dart/test/src/utilities/build_bucket_v2_messages.dart
@@ -0,0 +1,1654 @@
+// Copyright 2024 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
+import 'package:cocoon_service/src/model/luci/pubsub_message_v2.dart';
+import 'package:cocoon_service/src/model/luci/user_data.dart';
+import 'package:fixnum/fixnum.dart';
+
+PushMessageV2 createPushMessageV2(
+  Int64 id, {
+  String? project = 'flutter',
+  String? bucket = 'try',
+  String? builder = 'Windows Engine Drone',
+  int? number = 259942,
+  bbv2.Status? status = bbv2.Status.SCHEDULED,
+  Map<String, dynamic>? userData = const {},
+  bool? addBuildSet = true,
+}) {
+  final bbv2.PubSubCallBack pubSubCallBack = createPubSubCallBack(
+    id,
+    project: project,
+    bucket: bucket,
+    builder: builder,
+    number: number,
+    status: status,
+    userData: userData,
+    addBuildSet: addBuildSet,
+  );
+
+  final Map<String, dynamic> pubSubCallBackMap = pubSubCallBack.toProto3Json() as Map<String, dynamic>;
+
+  final String pubSubCallBackString = jsonEncode(pubSubCallBackMap);
+
+  return PushMessageV2(data: pubSubCallBackString);
+}
+
+bbv2.PubSubCallBack createPubSubCallBack(
+  Int64 id, {
+  String? project = 'flutter',
+  String? bucket = 'try',
+  String? builder = 'Windows Engine Drone',
+  int? number = 259942,
+  bbv2.Status? status = bbv2.Status.SCHEDULED,
+  Map<String, dynamic>? userData = const {},
+  bool? addBuildSet = true,
+}) {
+  // this contains BuildsV2PubSub and UserData (List<int>).
+  final bbv2.BuildsV2PubSub buildsV2PubSub = createBuild(
+    id,
+    project: project,
+    bucket: bucket,
+    builder: builder,
+    number: number,
+    status: status,
+    addBuildSet: addBuildSet,
+  );
+  final List<int>? userDataBytes = UserData.encodeUserDataToBytes(userData!);
+  return bbv2.PubSubCallBack(buildPubsub: buildsV2PubSub, userData: userDataBytes);
+}
+
+bbv2.BuildsV2PubSub createBuild(
+  Int64 id, {
+  String? project = 'flutter',
+  String? bucket = 'try',
+  String? builder = 'Windows Engine Drone',
+  int? number = 259942,
+  bbv2.Status? status = bbv2.Status.SCHEDULED,
+  bool? addBuildSet = true,
+}) {
+  final bbv2.BuildsV2PubSub build = bbv2.BuildsV2PubSub().createEmptyInstance();
+  build.mergeFromProto3Json(
+    jsonDecode(
+      createBuildString(
+        id,
+        project: project,
+        bucket: bucket,
+        builder: builder,
+        number: number,
+        status: status,
+        addBuildSet: addBuildSet,
+      ),
+    ) as Map<String, dynamic>,
+  );
+  return build;
+}
+
+String createBuildString(
+  Int64 id, {
+  String? project = 'flutter',
+  String? bucket = 'try',
+  String? builder = 'Windows Engine Drone',
+  int? number = 259942,
+  bbv2.Status? status = bbv2.Status.SCHEDULED,
+  bool? addBuildSet = true,
+}) {
+  return '''
+  {
+  "build":
+    {
+      "id": "$id",
+      "builder": {
+        "project": "$project",
+        "bucket": "$bucket",
+        "builder": "$builder"
+      },
+      "number": $number,
+      "createdBy": "user:flutter-try-builder@chops-service-accounts.iam.gserviceaccount.com",
+      "createTime": "2023-10-18T23:40:43.480388983Z",
+      "startTime": "2023-10-18T23:40:45.692900Z",
+      "updateTime": "2023-10-18T23:47:04.674226745Z",
+      "endTime": "2023-10-18T23:47:04.674226745Z",
+      "status": "$status",
+      "input": {
+        "properties": {
+          "\$flutter/goma": {
+            "server": "rbe-prod1.endpoints.fuchsia-infra-goma-prod.cloud.goog"
+          },
+          "\$flutter/rbe": {
+            "instance": "projects/flutter-rbe-prod/instances/default",
+            "platform": "container-image=docker://gcr.io/cloud-marketplace/google/debian11@sha256:69e2789c9f3d28c6a0f13b25062c240ee7772be1f5e6d41bb4680b63eae6b304"
+          },
+          "\$kitchen": {
+            "emulate_gce": true
+          },
+          "\$recipe_engine/isolated": {
+            "server": "https://isolateserver.appspot.com"
+          },
+          "\$recipe_engine/path": {
+            "cache_dir": "C:cache",
+            "temp_dir": "C:t"
+          },
+          "\$recipe_engine/swarming": {
+            "server": "https://chromium-swarm.appspot.com"
+          },
+          "add_recipes_cq": true,
+          "bot_id": "flutter-try-windows-us-central1-f-16-8a9p",
+          "bringup": false,
+          "build": {
+            "archives": [
+              {
+                "base_path": "out/host_release_arm64/zip_archives/",
+                "include_paths": [
+                  "out/host_release_arm64/zip_archives/windows-arm64-release/windows-arm64-flutter.zip"
+                ],
+                "name": "host_profile_arm64",
+                "realm": "production",
+                "type": "gcs"
+              }
+            ],
+            "drone_dimensions": [
+              "device_type=none",
+              "os=Windows-10"
+            ],
+            "gclient_variables": {
+              "download_android_deps": false
+            },
+            "generators": {},
+            "gn": [
+              "--runtime-mode",
+              "release",
+              "--no-lto",
+              "--windows-cpu",
+              "arm64"
+            ],
+            "name": "host_release_arm64",
+            "ninja": {
+              "config": "host_release_arm64",
+              "targets": [
+                "windows",
+                "gen_snapshot",
+                "flutter/build/archives:windows_flutter"
+              ]
+            },
+            "recipe": "engine_v2/builder"
+          },
+          "build_android_aot": false,
+          "build_android_debug": false,
+          "build_android_jit_release": false,
+          "build_android_vulkan": false,
+          "build_fuchsia": false,
+          "build_host": false,
+          "build_ios": false,
+          "buildnumber": 13882,
+          "clobber": false,
+          "config_name": "windows_arm_host_engine",
+          "device_type": "none",
+          "exe_cipd_version": "refs/heads/main",
+          "gclient_variables": {
+            "download_android_deps": false
+          },
+          "gcs_goldens_bucket": "",
+          "git_branch": "main",
+          "git_ref": "refs/pull/47066/head",
+          "git_repo": "engine",
+          "git_url": "https://github.com/flutter/engine",
+          "gold_tryjob": true,
+          "goma_jobs": "200",
+          "ios_debug": false,
+          "ios_profile": false,
+          "ios_release": false,
+          "mastername": "client.flutter",
+          "no_lto": true,
+          "os": "Windows-10",
+          "rbe_jobs": "200",
+          "recipe": "engine_v2/builder",
+          "upload_packages": false,
+          "use_cas": true
+        },
+        "experiments": [
+          "luci.buildbucket.agent.cipd_installation",
+          "luci.buildbucket.agent.start_build",
+          "luci.buildbucket.backend_go",
+          "luci.buildbucket.bbagent_getbuild",
+          "luci.buildbucket.bq_exporter_go",
+          "luci.buildbucket.parent_tracking",
+          "luci.buildbucket.use_bbagent",
+          "luci.recipes.use_python3"
+        ]
+      },
+      "output": {
+        "properties": {
+          "git_cache_epoch": "1687554665",
+          "got_engine_revision": "4d97460a271ceab7335b4e22110df77e9d3fd9a7"
+        },
+        "logs": [
+          {
+            "name": "stdout",
+            "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/stdout",
+            "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/stdout"
+          },
+          {
+            "name": "stderr",
+            "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/stderr",
+            "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/stderr"
+          }
+        ],
+        "status": "STARTED"
+      },
+      "steps": [
+        {
+          "name": "setup_build",
+          "startTime": "2023-10-18T23:41:10.699537Z",
+          "endTime": "2023-10-18T23:41:10.709056Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "run_recipe",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_build/run_recipe",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_build/run_recipe"
+            },
+            {
+              "name": "memory_profile",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_build/memory_profile",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_build/memory_profile"
+            },
+            {
+              "name": "logging",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_build/logging",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_build/logging"
+            }
+          ],
+          "summaryMarkdown": "running recipe: \\"engine_v2/builder\\" with Python 3.8.10"
+        },
+        {
+          "name": "Clobber build output",
+          "startTime": "2023-10-18T23:41:10.710867Z",
+          "endTime": "2023-10-18T23:41:11.094743Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Clobber_build_output/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Clobber_build_output/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Clobber_build_output/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Clobber_build_output/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Clobber_build_output/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Clobber_build_output/stdout"
+            }
+          ]
+        },
+        {
+          "name": "Ensure checkout cache",
+          "startTime": "2023-10-18T23:41:11.095676Z",
+          "endTime": "2023-10-18T23:41:11.223466Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Ensure_checkout_cache/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Ensure_checkout_cache/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Ensure_checkout_cache/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Ensure_checkout_cache/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Ensure_checkout_cache/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Ensure_checkout_cache/stdout"
+            }
+          ]
+        },
+        {
+          "name": "Enable long path support",
+          "startTime": "2023-10-18T23:41:11.224518Z",
+          "endTime": "2023-10-18T23:41:11.573466Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "Enable long path support|Run long path support script",
+          "startTime": "2023-10-18T23:41:11.225300Z",
+          "endTime": "2023-10-18T23:41:11.573466Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Enable_long_path_support/Run_long_path_support_script/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Enable_long_path_support/Run_long_path_support_script/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Enable_long_path_support/Run_long_path_support_script/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Enable_long_path_support/Run_long_path_support_script/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Enable_long_path_support/Run_long_path_support_script/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Enable_long_path_support/Run_long_path_support_script/stdout"
+            }
+          ]
+        },
+        {
+          "name": "Empty C:cache/git",
+          "startTime": "2023-10-18T23:41:11.575710Z",
+          "endTime": "2023-10-18T23:41:11.713322Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_git/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_git/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_git/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_git/execution_details"
+            },
+            {
+              "name": "stderr",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_git/stderr",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_git/stderr"
+            },
+            {
+              "name": "listdir",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_git/listdir",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_git/listdir"
+            }
+          ]
+        },
+        {
+          "name": "Empty C:cache/builder",
+          "startTime": "2023-10-18T23:41:11.713646Z",
+          "endTime": "2023-10-18T23:41:11.862582Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_builder/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_builder/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_builder/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_builder/execution_details"
+            },
+            {
+              "name": "stderr",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_builder/stderr",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_builder/stderr"
+            },
+            {
+              "name": "listdir",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_builder/listdir",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Empty_C:_b_s_w_ir_cache_builder/listdir"
+            }
+          ]
+        },
+        {
+          "name": "copy win_toolchain_metadata",
+          "startTime": "2023-10-18T23:41:11.863620Z",
+          "endTime": "2023-10-18T23:41:12.005728Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/copy_win_toolchain_metadata/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/copy_win_toolchain_metadata/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/copy_win_toolchain_metadata/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/copy_win_toolchain_metadata/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/copy_win_toolchain_metadata/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/copy_win_toolchain_metadata/stdout"
+            }
+          ]
+        },
+        {
+          "name": "read win toolchain metadata",
+          "startTime": "2023-10-18T23:41:12.006719Z",
+          "endTime": "2023-10-18T23:41:12.129104Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/read_win_toolchain_metadata/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/read_win_toolchain_metadata/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/read_win_toolchain_metadata/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/read_win_toolchain_metadata/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/read_win_toolchain_metadata/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/read_win_toolchain_metadata/stdout"
+            },
+            {
+              "name": "data.json",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/read_win_toolchain_metadata/data.json",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/read_win_toolchain_metadata/data.json"
+            }
+          ]
+        },
+        {
+          "name": "Checkout source code",
+          "startTime": "2023-10-18T23:41:12.129104Z",
+          "endTime": "2023-10-18T23:43:41.719117Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "Checkout source code|bot_update",
+          "startTime": "2023-10-18T23:41:12.174050Z",
+          "endTime": "2023-10-18T23:43:02.007547Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/bot_update/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/bot_update/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/bot_update/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/bot_update/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/bot_update/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/bot_update/stdout"
+            },
+            {
+              "name": "json.output",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/bot_update/json.output",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/bot_update/json.output"
+            }
+          ],
+          "summaryMarkdown": "[82GB/498GB used (16%)]"
+        },
+        {
+          "name": "Checkout source code|gclient runhooks",
+          "startTime": "2023-10-18T23:43:02.007547Z",
+          "endTime": "2023-10-18T23:43:41.465210Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/gclient_runhooks/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/gclient_runhooks/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/gclient_runhooks/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/gclient_runhooks/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/gclient_runhooks/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/gclient_runhooks/stdout"
+            }
+          ]
+        },
+        {
+          "name": "Checkout source code|copy win_toolchain_metadata",
+          "startTime": "2023-10-18T23:43:41.465210Z",
+          "endTime": "2023-10-18T23:43:41.594714Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/copy_win_toolchain_metadata/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/copy_win_toolchain_metadata/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/copy_win_toolchain_metadata/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/copy_win_toolchain_metadata/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/copy_win_toolchain_metadata/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/copy_win_toolchain_metadata/stdout"
+            }
+          ]
+        },
+        {
+          "name": "Checkout source code|read win toolchain metadata",
+          "startTime": "2023-10-18T23:43:41.595635Z",
+          "endTime": "2023-10-18T23:43:41.718896Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/read_win_toolchain_metadata/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/read_win_toolchain_metadata/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/read_win_toolchain_metadata/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/read_win_toolchain_metadata/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/read_win_toolchain_metadata/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/read_win_toolchain_metadata/stdout"
+            },
+            {
+              "name": "data.json",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/read_win_toolchain_metadata/data.json",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/Checkout_source_code/read_win_toolchain_metadata/data.json"
+            }
+          ]
+        },
+        {
+          "name": "ensure goma",
+          "startTime": "2023-10-18T23:43:41.719922Z",
+          "endTime": "2023-10-18T23:43:41.846305Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "ensure goma|ensure_installed",
+          "startTime": "2023-10-18T23:43:41.721089Z",
+          "endTime": "2023-10-18T23:43:41.846179Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/ensure_goma/ensure_installed/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/ensure_goma/ensure_installed/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/ensure_goma/ensure_installed/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/ensure_goma/ensure_installed/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/ensure_goma/ensure_installed/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/ensure_goma/ensure_installed/stdout"
+            },
+            {
+              "name": "json.output",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/ensure_goma/ensure_installed/json.output",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/ensure_goma/ensure_installed/json.output"
+            }
+          ]
+        },
+        {
+          "name": "setup goma",
+          "startTime": "2023-10-18T23:43:41.846366Z",
+          "endTime": "2023-10-18T23:43:47.675164Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "setup goma|ensure cpython3",
+          "startTime": "2023-10-18T23:43:41.846366Z",
+          "endTime": "2023-10-18T23:43:46.120490Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "setup goma|ensure cpython3|read manifest",
+          "startTime": "2023-10-18T23:43:41.847844Z",
+          "endTime": "2023-10-18T23:43:41.973087Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/read_manifest/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/read_manifest/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/read_manifest/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/read_manifest/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/read_manifest/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/read_manifest/stdout"
+            },
+            {
+              "name": "tool_manifest.json",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/read_manifest/tool_manifest.json",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/read_manifest/tool_manifest.json"
+            }
+          ]
+        },
+        {
+          "name": "setup goma|ensure cpython3|install infra/3pp/tools/cpython3",
+          "startTime": "2023-10-18T23:43:42.157406Z",
+          "endTime": "2023-10-18T23:43:46.119514Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "setup goma|ensure cpython3|install infra/3pp/tools/cpython3|ensure package directory",
+          "startTime": "2023-10-18T23:43:42.157406Z",
+          "endTime": "2023-10-18T23:43:42.293267Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_package_directory/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_package_directory/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_package_directory/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_package_directory/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_package_directory/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_package_directory/stdout"
+            }
+          ]
+        },
+        {
+          "name": "setup goma|ensure cpython3|install infra/3pp/tools/cpython3|ensure_installed",
+          "startTime": "2023-10-18T23:43:42.294156Z",
+          "endTime": "2023-10-18T23:43:46.119514Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_installed/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_installed/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_installed/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_installed/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_installed/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_installed/stdout"
+            },
+            {
+              "name": "json.output",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_installed/json.output",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/ensure_cpython3/install_infra_3pp_tools_cpython3/ensure_installed/json.output"
+            }
+          ]
+        },
+        {
+          "name": "setup goma|start goma",
+          "startTime": "2023-10-18T23:43:46.121466Z",
+          "endTime": "2023-10-18T23:43:47.675164Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/start_goma/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/start_goma/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/start_goma/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/start_goma/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/start_goma/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma/start_goma/stdout"
+            }
+          ]
+        },
+        {
+          "name": "gn --runtime-mode release --no-lto --windows-cpu arm64",
+          "startTime": "2023-10-18T23:43:47.677090Z",
+          "endTime": "2023-10-18T23:43:51.922997Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/gn_--runtime-mode_release_--no-lto_--windows-cpu_arm64/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/gn_--runtime-mode_release_--no-lto_--windows-cpu_arm64/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/gn_--runtime-mode_release_--no-lto_--windows-cpu_arm64/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/gn_--runtime-mode_release_--no-lto_--windows-cpu_arm64/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/gn_--runtime-mode_release_--no-lto_--windows-cpu_arm64/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/gn_--runtime-mode_release_--no-lto_--windows-cpu_arm64/stdout"
+            }
+          ]
+        },
+        {
+          "name": "teardown goma",
+          "startTime": "2023-10-18T23:43:51.922997Z",
+          "endTime": "2023-10-18T23:43:56.540194Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "teardown goma|goma jsonstatus",
+          "startTime": "2023-10-18T23:43:51.924849Z",
+          "endTime": "2023-10-18T23:43:52.281422Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_jsonstatus/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_jsonstatus/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_jsonstatus/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_jsonstatus/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_jsonstatus/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_jsonstatus/stdout"
+            },
+            {
+              "name": "json.output",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_jsonstatus/json.output",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_jsonstatus/json.output"
+            }
+          ]
+        },
+        {
+          "name": "teardown goma|goma stats",
+          "startTime": "2023-10-18T23:43:52.281422Z",
+          "endTime": "2023-10-18T23:43:52.598735Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_stats/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_stats/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_stats/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_stats/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_stats/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/goma_stats/stdout"
+            }
+          ]
+        },
+        {
+          "name": "teardown goma|stop goma",
+          "startTime": "2023-10-18T23:43:52.599129Z",
+          "endTime": "2023-10-18T23:43:55.348252Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/stop_goma/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/stop_goma/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/stop_goma/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/stop_goma/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/stop_goma/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/stop_goma/stdout"
+            }
+          ]
+        },
+        {
+          "name": "teardown goma|read goma_stats.json",
+          "startTime": "2023-10-18T23:43:55.348819Z",
+          "endTime": "2023-10-18T23:43:55.472990Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/read_goma_stats.json/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/read_goma_stats.json/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/read_goma_stats.json/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/read_goma_stats.json/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/read_goma_stats.json/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/read_goma_stats.json/stdout"
+            },
+            {
+              "name": "json.output",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/read_goma_stats.json/json.output",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/read_goma_stats.json/json.output"
+            }
+          ]
+        },
+        {
+          "name": "teardown goma|ensure bqupload",
+          "startTime": "2023-10-18T23:43:55.472990Z",
+          "endTime": "2023-10-18T23:43:56.157092Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "teardown goma|ensure bqupload|read manifest",
+          "startTime": "2023-10-18T23:43:55.473991Z",
+          "endTime": "2023-10-18T23:43:55.599246Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/read_manifest/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/read_manifest/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/read_manifest/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/read_manifest/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/read_manifest/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/read_manifest/stdout"
+            },
+            {
+              "name": "tool_manifest.json",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/read_manifest/tool_manifest.json",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/read_manifest/tool_manifest.json"
+            }
+          ]
+        },
+        {
+          "name": "teardown goma|ensure bqupload|install infra/tools/bqupload",
+          "startTime": "2023-10-18T23:43:55.606847Z",
+          "endTime": "2023-10-18T23:43:56.157092Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "teardown goma|ensure bqupload|install infra/tools/bqupload|ensure package directory",
+          "startTime": "2023-10-18T23:43:55.607934Z",
+          "endTime": "2023-10-18T23:43:55.729687Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_package_directory/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_package_directory/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_package_directory/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_package_directory/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_package_directory/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_package_directory/stdout"
+            }
+          ]
+        },
+        {
+          "name": "teardown goma|ensure bqupload|install infra/tools/bqupload|ensure_installed",
+          "startTime": "2023-10-18T23:43:55.730870Z",
+          "endTime": "2023-10-18T23:43:56.157092Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_installed/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_installed/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_installed/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_installed/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_installed/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_installed/stdout"
+            },
+            {
+              "name": "json.output",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_installed/json.output",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/ensure_bqupload/install_infra_tools_bqupload/ensure_installed/json.output"
+            }
+          ]
+        },
+        {
+          "name": "teardown goma|upload goma stats to bigquery",
+          "startTime": "2023-10-18T23:43:56.158075Z",
+          "endTime": "2023-10-18T23:43:56.540194Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/upload_goma_stats_to_bigquery/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/upload_goma_stats_to_bigquery/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/upload_goma_stats_to_bigquery/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/upload_goma_stats_to_bigquery/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/upload_goma_stats_to_bigquery/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/teardown_goma/upload_goma_stats_to_bigquery/stdout"
+            }
+          ]
+        },
+        {
+          "name": "setup goma (2)",
+          "startTime": "2023-10-18T23:43:56.541475Z",
+          "endTime": "2023-10-18T23:43:57.337570Z",
+          "status": "SUCCESS"
+        },
+        {
+          "name": "setup goma (2)|start goma",
+          "startTime": "2023-10-18T23:43:56.542723Z",
+          "endTime": "2023-10-18T23:43:57.337252Z",
+          "status": "SUCCESS",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma__2_/start_goma/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma__2_/start_goma/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma__2_/start_goma/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma__2_/start_goma/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma__2_/start_goma/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/setup_goma__2_/start_goma/stdout"
+            }
+          ]
+        },
+        {
+          "name": "build host_release_arm64 windows gen_snapshot flutter/build/archives:windows_flutter",
+          "startTime": "2023-10-18T23:43:57.338625Z",
+          "status": "STARTED",
+          "logs": [
+            {
+              "name": "\$debug",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/build_host_release_arm64_windows_gen_snapshot_flutter_build_archives:windows_flutter/l_debug",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/build_host_release_arm64_windows_gen_snapshot_flutter_build_archives:windows_flutter/l_debug"
+            },
+            {
+              "name": "execution details",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/build_host_release_arm64_windows_gen_snapshot_flutter_build_archives:windows_flutter/execution_details",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/build_host_release_arm64_windows_gen_snapshot_flutter_build_archives:windows_flutter/execution_details"
+            },
+            {
+              "name": "stdout",
+              "viewUrl": "https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/build_host_release_arm64_windows_gen_snapshot_flutter_build_archives:windows_flutter/stdout",
+              "url": "logdog://logs.chromium.org/flutter/buildbucket/cr-buildbucket/8766855135863637953/+/u/build_host_release_arm64_windows_gen_snapshot_flutter_build_archives:windows_flutter/stdout"
+            }
+          ]
+        }
+      ],
+      "infra": {
+        "buildbucket": {
+          "requestedProperties": {
+            "\$flutter/goma": {
+              "server": "rbe-prod1.endpoints.fuchsia-infra-goma-prod.cloud.goog"
+            },
+            "\$flutter/rbe": {
+              "instance": "projects/flutter-rbe-prod/instances/default",
+              "platform": "container-image=docker://gcr.io/cloud-marketplace/google/debian11@sha256:69e2789c9f3d28c6a0f13b25062c240ee7772be1f5e6d41bb4680b63eae6b304"
+            },
+            "\$kitchen": {
+              "emulate_gce": true
+            },
+            "\$recipe_engine/isolated": {
+              "server": "https://isolateserver.appspot.com"
+            },
+            "\$recipe_engine/path": {
+              "cache_dir": "C:cache",
+              "temp_dir": "C:t"
+            },
+            "\$recipe_engine/swarming": {
+              "server": "https://chromium-swarm.appspot.com"
+            },
+            "add_recipes_cq": true,
+            "bot_id": "flutter-try-windows-us-central1-f-16-8a9p",
+            "bringup": false,
+            "build": {
+              "archives": [
+                {
+                  "base_path": "out/host_release_arm64/zip_archives/",
+                  "include_paths": [
+                    "out/host_release_arm64/zip_archives/windows-arm64-release/windows-arm64-flutter.zip"
+                  ],
+                  "name": "host_profile_arm64",
+                  "realm": "production",
+                  "type": "gcs"
+                }
+              ],
+              "drone_dimensions": [
+                "device_type=none",
+                "os=Windows-10"
+              ],
+              "gclient_variables": {
+                "download_android_deps": false
+              },
+              "generators": {},
+              "gn": [
+                "--runtime-mode",
+                "release",
+                "--no-lto",
+                "--windows-cpu",
+                "arm64"
+              ],
+              "name": "host_release_arm64",
+              "ninja": {
+                "config": "host_release_arm64",
+                "targets": [
+                  "windows",
+                  "gen_snapshot",
+                  "flutter/build/archives:windows_flutter"
+                ]
+              },
+              "recipe": "engine_v2/builder"
+            },
+            "build_android_aot": false,
+            "build_android_debug": false,
+            "build_android_jit_release": false,
+            "build_android_vulkan": false,
+            "build_fuchsia": false,
+            "build_host": false,
+            "build_ios": false,
+            "buildnumber": 13882,
+            "clobber": false,
+            "config_name": "windows_arm_host_engine",
+            "device_type": "none",
+            "exe_cipd_version": "refs/heads/main",
+            "gclient_variables": {
+              "download_android_deps": false
+            },
+            "gcs_goldens_bucket": "",
+            "git_branch": "main",
+            "git_ref": "refs/pull/47066/head",
+            "git_repo": "engine",
+            "git_url": "https://github.com/flutter/engine",
+            "gold_tryjob": true,
+            "goma_jobs": "200",
+            "ios_debug": false,
+            "ios_profile": false,
+            "ios_release": false,
+            "mastername": "client.flutter",
+            "no_lto": true,
+            "os": "Windows-10",
+            "rbe_jobs": "200",
+            "recipe": "engine_v2/builder",
+            "upload_packages": false,
+            "use_cas": true
+          },
+          "requestedDimensions": [
+            {
+              "key": "device_type",
+              "value": "none"
+            },
+            {
+              "key": "os",
+              "value": "Windows-10"
+            }
+          ],
+          "hostname": "cr-buildbucket.appspot.com",
+          "experimentReasons": {
+            "luci.best_effort_platform": "EXPERIMENT_REASON_GLOBAL_DEFAULT",
+            "luci.buildbucket.agent.cipd_installation": "EXPERIMENT_REASON_GLOBAL_DEFAULT",
+            "luci.buildbucket.agent.start_build": "EXPERIMENT_REASON_GLOBAL_DEFAULT",
+            "luci.buildbucket.backend_go": "EXPERIMENT_REASON_GLOBAL_DEFAULT",
+            "luci.buildbucket.bbagent_getbuild": "EXPERIMENT_REASON_GLOBAL_DEFAULT",
+            "luci.buildbucket.bq_exporter_go": "EXPERIMENT_REASON_GLOBAL_DEFAULT",
+            "luci.buildbucket.canary_software": "EXPERIMENT_REASON_GLOBAL_DEFAULT",
+            "luci.buildbucket.parent_tracking": "EXPERIMENT_REASON_REQUESTED",
+            "luci.buildbucket.use_bbagent": "EXPERIMENT_REASON_BUILDER_CONFIG",
+            "luci.buildbucket.use_bbagent_race": "EXPERIMENT_REASON_GLOBAL_DEFAULT",
+            "luci.non_production": "EXPERIMENT_REASON_REQUESTED",
+            "luci.recipes.use_python3": "EXPERIMENT_REASON_BUILDER_CONFIG"
+          },
+          "agent": {
+            "input": {
+              "data": {
+                "bbagent_utility_packages": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "infra/tools/luci/cas/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      }
+                    ]
+                  },
+                  "onPath": [
+                    "bbagent_utility_packages",
+                    "bbagent_utility_packages/bin"
+                  ]
+                },
+                "cipd_bin_packages": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "infra/3pp/tools/git/\${platform}",
+                        "version": "version:2@2.42.0.chromium.11"
+                      },
+                      {
+                        "package": "infra/tools/git/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      },
+                      {
+                        "package": "infra/tools/luci/git-credential-luci/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      },
+                      {
+                        "package": "infra/tools/luci/docker-credential-luci/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      },
+                      {
+                        "package": "infra/tools/luci/vpython3/\${platform}",
+                        "version": "git_revision:7c18303a74d8a6ae4bb3aae9de8f659cc8a6c571"
+                      },
+                      {
+                        "package": "infra/tools/luci/lucicfg/\${platform}",
+                        "version": "git_revision:34ddbb29b2632cdcec7648a40a9e0150ad33fd6c"
+                      },
+                      {
+                        "package": "infra/tools/luci-auth/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      },
+                      {
+                        "package": "infra/tools/bb/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      },
+                      {
+                        "package": "infra/tools/cloudtail/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      },
+                      {
+                        "package": "infra/tools/prpc/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      },
+                      {
+                        "package": "infra/tools/rdb/\${platform}",
+                        "version": "git_revision:ec494f363fdfd8cdd5926baad4508d562b7353d4"
+                      },
+                      {
+                        "package": "infra/tools/luci/led/\${platform}",
+                        "version": "git_revision:0bb208f2de6f3e9c698b70a33cd01c6de9985db2"
+                      }
+                    ]
+                  },
+                  "onPath": [
+                    "cipd_bin_packages",
+                    "cipd_bin_packages/bin"
+                  ]
+                },
+                "cipd_bin_packages/cpython3": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "infra/3pp/tools/cpython3/\$platform",
+                        "version": "version:2@3.8.10.chromium.26"
+                      }
+                    ]
+                  },
+                  "onPath": [
+                    "cipd_bin_packages/cpython3",
+                    "cipd_bin_packages/cpython3/bin"
+                  ]
+                },
+                "kitchen-checkout": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "flutter/recipe_bundles/flutter.googlesource.com/recipes",
+                        "version": "refs/heads/main"
+                      }
+                    ]
+                  }
+                }
+              }
+            },
+            "output": {
+              "resolvedData": {
+                "": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "infra/tools/luci/bbagent/windows-amd64",
+                        "version": "CWZTz-PPn4V6PQOLwboppTkVcHpDBw4mbSFdFzSCVZ8C"
+                      }
+                    ]
+                  }
+                },
+                "bbagent_utility_packages": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "infra/tools/luci/cas/windows-amd64",
+                        "version": "GLca2xxHU1T7i8mC6CIQaVHYTpBsIgbfg461-p9auHgC"
+                      }
+                    ]
+                  }
+                },
+                "cipd_bin_packages": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "infra/3pp/tools/git/windows-amd64",
+                        "version": "nUmXIMXMWYpRRL5G_imH9ylYe8OuFrw8E8E-aQqNniQC"
+                      },
+                      {
+                        "package": "infra/tools/git/windows-amd64",
+                        "version": "k9xBg8ePL7uiVWiSpRNiuwhZvIFXw9To1-Y7zmGLEsoC"
+                      },
+                      {
+                        "package": "infra/tools/luci/git-credential-luci/windows-amd64",
+                        "version": "wTYHK_9ozzrCAhNvSJQ2aNh4Xj_WdSZH8z_iPGygl1EC"
+                      },
+                      {
+                        "package": "infra/tools/luci/docker-credential-luci/windows-amd64",
+                        "version": "TkZdTN7vFH_togft9p4cUxn0aO3uvwCX2KCpCimlN0cC"
+                      },
+                      {
+                        "package": "infra/tools/luci/vpython3/windows-amd64",
+                        "version": "1JfARK50t0eNaL62bEi837AkuEnOCDAenGnpGcVplFUC"
+                      },
+                      {
+                        "package": "infra/tools/luci/lucicfg/windows-amd64",
+                        "version": "cWjTUBeuuKTpxum2UgieF5Gpk7maDGMWzGLrxPrIVBcC"
+                      },
+                      {
+                        "package": "infra/tools/luci-auth/windows-amd64",
+                        "version": "aIJRax7rJxdMLPUzrI7z7Semi5aWdt5LNaogSG72ke8C"
+                      },
+                      {
+                        "package": "infra/tools/bb/windows-amd64",
+                        "version": "AJCTgGxzUFvFWEY7pC3huf3BQJCRdE3dr06fqyD6_3sC"
+                      },
+                      {
+                        "package": "infra/tools/cloudtail/windows-amd64",
+                        "version": "wkrKDMSgJA6K4j1y5UkoGT8RJr2xcYqrRGd7EkpsamgC"
+                      },
+                      {
+                        "package": "infra/tools/prpc/windows-amd64",
+                        "version": "uVp8B8Ebw_buQCapgLcKbbABtQOBXTP69BZ-hiRjstIC"
+                      },
+                      {
+                        "package": "infra/tools/rdb/windows-amd64",
+                        "version": "LpQ6w9adpEItDPjyzrdc9JkgmySUqjIoawxM6XchQAwC"
+                      },
+                      {
+                        "package": "infra/tools/luci/led/windows-amd64",
+                        "version": "GUOxVDh_JsTrFpG8smahZzLBlOyWsiJBMfWm5RWm6qEC"
+                      }
+                    ]
+                  }
+                },
+                "cipd_bin_packages/cpython3": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "infra/3pp/tools/cpython3/windows-amd64",
+                        "version": "55_vUpmQ9RyBMmHoJvSChlnlP07QjmvRaFAG4q4AF-QC"
+                      }
+                    ]
+                  }
+                },
+                "kitchen-checkout": {
+                  "cipd": {
+                    "specs": [
+                      {
+                        "package": "flutter/recipe_bundles/flutter.googlesource.com/recipes",
+                        "version": "y0oPD122qjmiYkrkpcIhZ0GZSeBgKYUHpiRAUuEAjGcC"
+                      }
+                    ]
+                  }
+                }
+              },
+              "status": "SUCCESS",
+              "agentPlatform": "windows-amd64",
+              "totalDuration": "17s"
+            },
+            "source": {
+              "cipd": {
+                "package": "infra/tools/luci/bbagent/\$platform",
+                "version": "git_revision:d210fcc40e0faaaf5b0a8bf57a8db5bfe1638c33"
+              }
+            },
+            "purposes": {
+              "bbagent_utility_packages": "PURPOSE_BBAGENT_UTILITY",
+              "kitchen-checkout": "PURPOSE_EXE_PAYLOAD"
+            }
+          },
+          "knownPublicGerritHosts": [
+            "android.googlesource.com",
+            "aomedia.googlesource.com",
+            "boringssl.googlesource.com",
+            "chromium.googlesource.com",
+            "dart.googlesource.com",
+            "dawn.googlesource.com",
+            "fuchsia.googlesource.com",
+            "gn.googlesource.com",
+            "go.googlesource.com",
+            "llvm.googlesource.com",
+            "pdfium.googlesource.com",
+            "quiche.googlesource.com",
+            "skia.googlesource.com",
+            "swiftshader.googlesource.com",
+            "webrtc.googlesource.com"
+          ],
+          "buildNumber": true
+        },
+        "swarming": {
+          "hostname": "chromium-swarm.appspot.com",
+          "taskId": "655dfb42a28dbe10",
+          "parentRunId": "655df9add49f7311",
+          "taskServiceAccount": "flutter-try-builder@chops-service-accounts.iam.gserviceaccount.com",
+          "priority": 30,
+          "taskDimensions": [
+            {
+              "key": "device_type",
+              "value": "none"
+            },
+            {
+              "key": "os",
+              "value": "Windows-10"
+            },
+            {
+              "key": "pool",
+              "value": "luci.flutter.try"
+            }
+          ],
+          "botDimensions": [
+            {
+              "key": "bot_config",
+              "value": "bot_config.py"
+            },
+            {
+              "key": "caches",
+              "value": "engine_main_builder"
+            },
+            {
+              "key": "caches",
+              "value": "engine_main_git"
+            },
+            {
+              "key": "caches",
+              "value": "flutter_main_android_sdk_version_33v6_legacy"
+            },
+            {
+              "key": "caches",
+              "value": "flutter_main_certs_version_9563bb"
+            },
+            {
+              "key": "caches",
+              "value": "flutter_main_chrome_and_driver_version_119_0_6045_9_legacy"
+            },
+            {
+              "key": "caches",
+              "value": "flutter_main_open_jdk_version_11_legacy"
+            },
+            {
+              "key": "caches",
+              "value": "goma_v2"
+            },
+            {
+              "key": "caches",
+              "value": "packages_main_certs_version_9563bb"
+            },
+            {
+              "key": "caches",
+              "value": "vpython"
+            },
+            {
+              "key": "cipd_platform",
+              "value": "windows-amd64"
+            },
+            {
+              "key": "cores",
+              "value": "16"
+            },
+            {
+              "key": "cpu",
+              "value": "x86"
+            },
+            {
+              "key": "cpu",
+              "value": "x86-64"
+            },
+            {
+              "key": "cpu",
+              "value": "x86-64-Broadwell_GCE"
+            },
+            {
+              "key": "device_os",
+              "value": "none"
+            },
+            {
+              "key": "device_type",
+              "value": "none"
+            },
+            {
+              "key": "display_attached",
+              "value": "0"
+            },
+            {
+              "key": "gce",
+              "value": "1"
+            },
+            {
+              "key": "gcp",
+              "value": "flutter-machines-prod"
+            },
+            {
+              "key": "gpu",
+              "value": "none"
+            },
+            {
+              "key": "id",
+              "value": "flutter-try-flutterprj-windows-us-central1-b-1-602w"
+            },
+            {
+              "key": "image",
+              "value": "chrome-win10-22h2-23101200-2b28f7ecb56"
+            },
+            {
+              "key": "inside_docker",
+              "value": "0"
+            },
+            {
+              "key": "integrity",
+              "value": "high"
+            },
+            {
+              "key": "locale",
+              "value": "en_US.cp1252"
+            },
+            {
+              "key": "machine_type",
+              "value": "e2-highmem-16"
+            },
+            {
+              "key": "os",
+              "value": "Windows"
+            },
+            {
+              "key": "os",
+              "value": "Windows-10"
+            },
+            {
+              "key": "os",
+              "value": "Windows-10-19045"
+            },
+            {
+              "key": "os",
+              "value": "Windows-10-19045.2006"
+            },
+            {
+              "key": "pool",
+              "value": "luci.flutter.try"
+            },
+            {
+              "key": "python",
+              "value": "3"
+            },
+            {
+              "key": "python",
+              "value": "3.8"
+            },
+            {
+              "key": "python",
+              "value": "3.8.9"
+            },
+            {
+              "key": "server_version",
+              "value": "7419-34ac013"
+            },
+            {
+              "key": "ssd",
+              "value": "1"
+            },
+            {
+              "key": "visual_studio_version",
+              "value": "16.0"
+            },
+            {
+              "key": "windows_client_version",
+              "value": "10"
+            },
+            {
+              "key": "zone",
+              "value": "us"
+            },
+            {
+              "key": "zone",
+              "value": "us-central"
+            },
+            {
+              "key": "zone",
+              "value": "us-central1"
+            },
+            {
+              "key": "zone",
+              "value": "us-central1-b"
+            }
+          ],
+          "caches": [
+            {
+              "name": "pub_cache",
+              "path": ".pub-cache"
+            },
+            {
+              "name": "engine_main_builder",
+              "path": "builder"
+            },
+            {
+              "name": "engine_main_git",
+              "path": "git"
+            },
+            {
+              "name": "goma_v2",
+              "path": "goma"
+            },
+            {
+              "name": "engine_main_open_jdk_version_11_legacy",
+              "path": "java"
+            },
+            {
+              "name": "engine_main_open_jdk_version_11",
+              "path": "open_jdk"
+            },
+            {
+              "name": "vpython",
+              "path": "vpython",
+              "envVar": "VPYTHON_VIRTUALENV_ROOT"
+            }
+          ]
+        },
+        "logdog": {
+          "hostname": "logs.chromium.org",
+          "project": "flutter",
+          "prefix": "buildbucket/cr-buildbucket/8766855135863637953"
+        },
+        "resultdb": {
+          "hostname": "results.api.cr.dev"
+        },
+        "bbagent": {
+          "payloadPath": "kitchen-checkout",
+          "cacheDir": "cache"
+        }
+      },
+      "tags": [
+        {
+          "key": "build_address",
+          "value": "luci.flutter.prod/$builder/1698"
+        },
+        {
+          "key": "builder",
+          "value": "$builder"
+        },
+        ${addBuildSet! ? '''
+        {
+          "key": "buildset",
+          "value": "pr/git/47066"
+        },
+        {
+          "key": "buildset",
+          "value": "sha/git/4d97460a271ceab7335b4e22110df77e9d3fd9a7"
+        },
+        ''' : ''}
+        {
+          "key": "parent_buildbucket_id",
+          "value": "8766855244016195329"
+        },
+        {
+          "key": "parent_task_id",
+          "value": "655df9add49f7311"
+        },
+        {
+          "key": "user_agent",
+          "value": "recipe"
+        },
+        {
+          "key": "current_attempt",
+          "value": "1"
+        }
+      ],
+      "exe": {
+        "cipdPackage": "flutter/recipe_bundles/flutter.googlesource.com/recipes",
+        "cipdVersion": "refs/heads/main",
+        "cmd": [
+          "luciexe"
+        ]
+      },
+      "schedulingTimeout": "21600s",
+      "executionTimeout": "3600s",
+      "gracePeriod": "30s",
+      "ancestorIds": [
+        "8766855244016195329"
+      ]
+    }
+}
+''';
+}
diff --git a/app_dart/test/src/utilities/entity_generators.dart b/app_dart/test/src/utilities/entity_generators.dart
index 7b9eab8..07db685 100644
--- a/app_dart/test/src/utilities/entity_generators.dart
+++ b/app_dart/test/src/utilities/entity_generators.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 'package:buildbucket/buildbucket_pb.dart' as bbv2;
 import 'package:cocoon_service/ci_yaml.dart';
 import 'package:cocoon_service/src/model/appengine/commit.dart';
 import 'package:cocoon_service/src/model/appengine/task.dart';
@@ -14,6 +15,7 @@
 import 'package:cocoon_service/src/model/luci/buildbucket.dart';
 import 'package:cocoon_service/src/model/luci/push_message.dart' as push_message;
 import 'package:cocoon_service/src/model/proto/protos.dart' as pb;
+import 'package:fixnum/fixnum.dart';
 import 'package:gcloud/db.dart';
 import 'package:googleapis/firestore/v1.dart' hide Status;
 import 'package:github/github.dart' as github;
@@ -269,6 +271,28 @@
       input: input,
     );
 
+bbv2.Build generateBbv2Build(
+  Int64 i, {
+  String bucket = 'prod',
+  String name = 'Linux test_builder',
+  bbv2.Status status = bbv2.Status.SUCCESS,
+  Iterable<bbv2.StringPair>? tags,
+  bbv2.Build_Input? input,
+  int buildNumber = 1,
+}) =>
+    bbv2.Build(
+      id: i,
+      builder: bbv2.BuilderID(
+        project: 'flutter',
+        bucket: bucket,
+        builder: name,
+      ),
+      status: status,
+      tags: tags,
+      number: buildNumber,
+      input: input,
+    );
+
 push_message.Build generatePushMessageBuild(
   int i, {
   String bucket = 'prod',
diff --git a/app_dart/test/src/utilities/mocks.dart b/app_dart/test/src/utilities/mocks.dart
index 42a4b1c..37e7318 100644
--- a/app_dart/test/src/utilities/mocks.dart
+++ b/app_dart/test/src/utilities/mocks.dart
@@ -12,13 +12,16 @@
 import 'package:cocoon_service/src/service/bigquery.dart';
 import 'package:cocoon_service/src/service/branch_service.dart';
 import 'package:cocoon_service/src/service/buildbucket.dart';
+import 'package:cocoon_service/src/service/build_bucket_v2_client.dart';
 import 'package:cocoon_service/src/service/commit_service.dart';
 import 'package:cocoon_service/src/service/config.dart';
 import 'package:cocoon_service/src/service/datastore.dart';
 import 'package:cocoon_service/src/service/firestore.dart';
 import 'package:cocoon_service/src/service/github_checks_service.dart';
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart';
 import 'package:cocoon_service/src/service/github_service.dart';
 import 'package:cocoon_service/src/service/luci_build_service.dart';
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart';
 import 'package:github/github.dart';
 import 'package:googleapis/bigquery/v2.dart';
 import 'package:googleapis_auth/googleapis_auth.dart';
@@ -66,6 +69,7 @@
     BigqueryService,
     BranchService,
     BuildBucketClient,
+    BuildBucketV2Client,
     CommitService,
     Config,
     DatastoreService,
@@ -73,6 +77,7 @@
     FirestoreService,
     IssuesService,
     GithubChecksService,
+    GithubChecksServiceV2,
     GithubChecksUtil,
     GithubService,
     GitService,
@@ -82,6 +87,7 @@
     HttpClientResponse,
     JobsResource,
     LuciBuildService,
+    LuciBuildServiceV2,
     ProcessManager,
     PullRequestsService,
     RepositoriesService,
diff --git a/app_dart/test/src/utilities/mocks.mocks.dart b/app_dart/test/src/utilities/mocks.mocks.dart
index 8b60c90..969603f 100644
--- a/app_dart/test/src/utilities/mocks.mocks.dart
+++ b/app_dart/test/src/utilities/mocks.mocks.dart
@@ -3,53 +3,59 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i20;
-import 'dart:convert' as _i26;
-import 'dart:io' as _i25;
-import 'dart:typed_data' as _i38;
+import 'dart:async' as _i21;
+import 'dart:convert' as _i27;
+import 'dart:io' as _i26;
+import 'dart:typed_data' as _i40;
 
-import 'package:appengine/appengine.dart' as _i10;
-import 'package:cocoon_service/cocoon_service.dart' as _i15;
-import 'package:cocoon_service/src/foundation/github_checks_util.dart' as _i24;
-import 'package:cocoon_service/src/model/appengine/branch.dart' as _i33;
-import 'package:cocoon_service/src/model/appengine/commit.dart' as _i34;
-import 'package:cocoon_service/src/model/appengine/github_build_status_update.dart' as _i18;
-import 'package:cocoon_service/src/model/appengine/github_gold_status_update.dart' as _i19;
-import 'package:cocoon_service/src/model/appengine/key_helper.dart' as _i12;
-import 'package:cocoon_service/src/model/appengine/stage.dart' as _i36;
-import 'package:cocoon_service/src/model/appengine/task.dart' as _i35;
-import 'package:cocoon_service/src/model/ci_yaml/target.dart' as _i42;
-import 'package:cocoon_service/src/model/firestore/commit.dart' as _i39;
-import 'package:cocoon_service/src/model/firestore/github_build_status.dart' as _i23;
-import 'package:cocoon_service/src/model/firestore/github_gold_status.dart' as _i22;
-import 'package:cocoon_service/src/model/firestore/task.dart' as _i40;
-import 'package:cocoon_service/src/model/github/checks.dart' as _i43;
+import 'package:appengine/appengine.dart' as _i11;
+import 'package:buildbucket/buildbucket_pb.dart' as _i9;
+import 'package:cocoon_service/cocoon_service.dart' as _i16;
+import 'package:cocoon_service/src/foundation/github_checks_util.dart' as _i25;
+import 'package:cocoon_service/src/model/appengine/branch.dart' as _i35;
+import 'package:cocoon_service/src/model/appengine/commit.dart' as _i36;
+import 'package:cocoon_service/src/model/appengine/github_build_status_update.dart' as _i19;
+import 'package:cocoon_service/src/model/appengine/github_gold_status_update.dart' as _i20;
+import 'package:cocoon_service/src/model/appengine/key_helper.dart' as _i13;
+import 'package:cocoon_service/src/model/appengine/stage.dart' as _i38;
+import 'package:cocoon_service/src/model/appengine/task.dart' as _i37;
+import 'package:cocoon_service/src/model/ci_yaml/target.dart' as _i47;
+import 'package:cocoon_service/src/model/firestore/commit.dart' as _i41;
+import 'package:cocoon_service/src/model/firestore/github_build_status.dart' as _i24;
+import 'package:cocoon_service/src/model/firestore/github_gold_status.dart' as _i23;
+import 'package:cocoon_service/src/model/firestore/task.dart' as _i42;
+import 'package:cocoon_service/src/model/github/checks.dart' as _i48;
 import 'package:cocoon_service/src/model/luci/buildbucket.dart' as _i8;
-import 'package:cocoon_service/src/model/luci/push_message.dart' as _i41;
+import 'package:cocoon_service/src/model/luci/push_message.dart' as _i43;
 import 'package:cocoon_service/src/service/access_client_provider.dart' as _i5;
-import 'package:cocoon_service/src/service/access_token_provider.dart' as _i28;
-import 'package:cocoon_service/src/service/bigquery.dart' as _i16;
-import 'package:cocoon_service/src/service/commit_service.dart' as _i31;
+import 'package:cocoon_service/src/service/access_token_provider.dart' as _i30;
+import 'package:cocoon_service/src/service/bigquery.dart' as _i17;
+import 'package:cocoon_service/src/service/build_bucket_v2_client.dart' as _i28;
+import 'package:cocoon_service/src/service/commit_service.dart' as _i33;
 import 'package:cocoon_service/src/service/config.dart' as _i3;
-import 'package:cocoon_service/src/service/datastore.dart' as _i9;
+import 'package:cocoon_service/src/service/datastore.dart' as _i10;
 import 'package:cocoon_service/src/service/gerrit_service.dart' as _i7;
-import 'package:cocoon_service/src/service/github_service.dart' as _i17;
-import 'package:gcloud/db.dart' as _i11;
-import 'package:github/github.dart' as _i13;
-import 'package:github/hooks.dart' as _i32;
+import 'package:cocoon_service/src/service/github_checks_service_v2.dart' as _i44;
+import 'package:cocoon_service/src/service/github_service.dart' as _i18;
+import 'package:cocoon_service/src/service/luci_build_service_v2.dart' as _i46;
+import 'package:cocoon_service/src/service/scheduler_v2.dart' as _i45;
+import 'package:fixnum/fixnum.dart' as _i49;
+import 'package:gcloud/db.dart' as _i12;
+import 'package:github/github.dart' as _i14;
+import 'package:github/hooks.dart' as _i34;
 import 'package:googleapis/bigquery/v2.dart' as _i6;
-import 'package:googleapis/firestore/v1.dart' as _i21;
+import 'package:googleapis/firestore/v1.dart' as _i22;
 import 'package:googleapis_auth/auth_io.dart' as _i4;
-import 'package:graphql/client.dart' as _i14;
+import 'package:graphql/client.dart' as _i15;
 import 'package:http/http.dart' as _i2;
 import 'package:mockito/mockito.dart' as _i1;
-import 'package:mockito/src/dummies.dart' as _i30;
-import 'package:neat_cache/neat_cache.dart' as _i27;
-import 'package:process/src/interface/process_manager.dart' as _i44;
-import 'package:retry/retry.dart' as _i29;
+import 'package:mockito/src/dummies.dart' as _i32;
+import 'package:neat_cache/neat_cache.dart' as _i29;
+import 'package:process/src/interface/process_manager.dart' as _i50;
+import 'package:retry/retry.dart' as _i31;
 
-import '../../service/cache_service_test.dart' as _i37;
-import 'mocks.dart' as _i45;
+import '../../service/cache_service_test.dart' as _i39;
+import 'mocks.dart' as _i51;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -174,8 +180,8 @@
         );
 }
 
-class _FakeDatastoreService_11 extends _i1.SmartFake implements _i9.DatastoreService {
-  _FakeDatastoreService_11(
+class _FakeBuild_11 extends _i1.SmartFake implements _i9.Build {
+  _FakeBuild_11(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -184,8 +190,8 @@
         );
 }
 
-class _FakeLogging_12 extends _i1.SmartFake implements _i10.Logging {
-  _FakeLogging_12(
+class _FakeSearchBuildsResponse_12 extends _i1.SmartFake implements _i9.SearchBuildsResponse {
+  _FakeSearchBuildsResponse_12(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -194,8 +200,8 @@
         );
 }
 
-class _FakeDatastoreDB_13 extends _i1.SmartFake implements _i11.DatastoreDB {
-  _FakeDatastoreDB_13(
+class _FakeBatchResponse_13 extends _i1.SmartFake implements _i9.BatchResponse {
+  _FakeBatchResponse_13(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -204,8 +210,8 @@
         );
 }
 
-class _FakeKeyHelper_14 extends _i1.SmartFake implements _i12.KeyHelper {
-  _FakeKeyHelper_14(
+class _FakeListBuildersResponse_14 extends _i1.SmartFake implements _i9.ListBuildersResponse {
+  _FakeListBuildersResponse_14(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -214,8 +220,8 @@
         );
 }
 
-class _FakeDuration_15 extends _i1.SmartFake implements Duration {
-  _FakeDuration_15(
+class _FakeDatastoreService_15 extends _i1.SmartFake implements _i10.DatastoreService {
+  _FakeDatastoreService_15(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -224,8 +230,8 @@
         );
 }
 
-class _FakeGitHub_16 extends _i1.SmartFake implements _i13.GitHub {
-  _FakeGitHub_16(
+class _FakeLogging_16 extends _i1.SmartFake implements _i11.Logging {
+  _FakeLogging_16(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -234,8 +240,8 @@
         );
 }
 
-class _FakeGraphQLClient_17 extends _i1.SmartFake implements _i14.GraphQLClient {
-  _FakeGraphQLClient_17(
+class _FakeDatastoreDB_17 extends _i1.SmartFake implements _i12.DatastoreDB {
+  _FakeDatastoreDB_17(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -244,8 +250,8 @@
         );
 }
 
-class _FakeFirestoreService_18 extends _i1.SmartFake implements _i15.FirestoreService {
-  _FakeFirestoreService_18(
+class _FakeKeyHelper_18 extends _i1.SmartFake implements _i13.KeyHelper {
+  _FakeKeyHelper_18(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -254,8 +260,8 @@
         );
 }
 
-class _FakeBigqueryService_19 extends _i1.SmartFake implements _i16.BigqueryService {
-  _FakeBigqueryService_19(
+class _FakeDuration_19 extends _i1.SmartFake implements Duration {
+  _FakeDuration_19(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -264,8 +270,8 @@
         );
 }
 
-class _FakeGithubService_20 extends _i1.SmartFake implements _i17.GithubService {
-  _FakeGithubService_20(
+class _FakeGitHub_20 extends _i1.SmartFake implements _i14.GitHub {
+  _FakeGitHub_20(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -274,8 +280,8 @@
         );
 }
 
-class _FakeGithubBuildStatusUpdate_21 extends _i1.SmartFake implements _i18.GithubBuildStatusUpdate {
-  _FakeGithubBuildStatusUpdate_21(
+class _FakeGraphQLClient_21 extends _i1.SmartFake implements _i15.GraphQLClient {
+  _FakeGraphQLClient_21(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -284,8 +290,8 @@
         );
 }
 
-class _FakeGithubGoldStatusUpdate_22 extends _i1.SmartFake implements _i19.GithubGoldStatusUpdate {
-  _FakeGithubGoldStatusUpdate_22(
+class _FakeFirestoreService_22 extends _i1.SmartFake implements _i16.FirestoreService {
+  _FakeFirestoreService_22(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -294,8 +300,8 @@
         );
 }
 
-class _FakeFuture_23<T1> extends _i1.SmartFake implements _i20.Future<T1> {
-  _FakeFuture_23(
+class _FakeBigqueryService_23 extends _i1.SmartFake implements _i17.BigqueryService {
+  _FakeBigqueryService_23(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -304,9 +310,8 @@
         );
 }
 
-class _FakeProjectsDatabasesDocumentsResource_24 extends _i1.SmartFake
-    implements _i21.ProjectsDatabasesDocumentsResource {
-  _FakeProjectsDatabasesDocumentsResource_24(
+class _FakeGithubService_24 extends _i1.SmartFake implements _i18.GithubService {
+  _FakeGithubService_24(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -315,8 +320,8 @@
         );
 }
 
-class _FakeDocument_25 extends _i1.SmartFake implements _i21.Document {
-  _FakeDocument_25(
+class _FakeGithubBuildStatusUpdate_25 extends _i1.SmartFake implements _i19.GithubBuildStatusUpdate {
+  _FakeGithubBuildStatusUpdate_25(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -325,8 +330,8 @@
         );
 }
 
-class _FakeBatchWriteResponse_26 extends _i1.SmartFake implements _i21.BatchWriteResponse {
-  _FakeBatchWriteResponse_26(
+class _FakeGithubGoldStatusUpdate_26 extends _i1.SmartFake implements _i20.GithubGoldStatusUpdate {
+  _FakeGithubGoldStatusUpdate_26(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -335,8 +340,8 @@
         );
 }
 
-class _FakeCommitResponse_27 extends _i1.SmartFake implements _i21.CommitResponse {
-  _FakeCommitResponse_27(
+class _FakeFuture_27<T1> extends _i1.SmartFake implements _i21.Future<T1> {
+  _FakeFuture_27(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -345,8 +350,9 @@
         );
 }
 
-class _FakeGithubGoldStatus_28 extends _i1.SmartFake implements _i22.GithubGoldStatus {
-  _FakeGithubGoldStatus_28(
+class _FakeProjectsDatabasesDocumentsResource_28 extends _i1.SmartFake
+    implements _i22.ProjectsDatabasesDocumentsResource {
+  _FakeProjectsDatabasesDocumentsResource_28(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -355,8 +361,8 @@
         );
 }
 
-class _FakeGithubBuildStatus_29 extends _i1.SmartFake implements _i23.GithubBuildStatus {
-  _FakeGithubBuildStatus_29(
+class _FakeDocument_29 extends _i1.SmartFake implements _i22.Document {
+  _FakeDocument_29(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -365,8 +371,8 @@
         );
 }
 
-class _FakeValue_30 extends _i1.SmartFake implements _i21.Value {
-  _FakeValue_30(
+class _FakeBatchWriteResponse_30 extends _i1.SmartFake implements _i22.BatchWriteResponse {
+  _FakeBatchWriteResponse_30(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -375,8 +381,8 @@
         );
 }
 
-class _FakeFilter_31 extends _i1.SmartFake implements _i21.Filter {
-  _FakeFilter_31(
+class _FakeCommitResponse_31 extends _i1.SmartFake implements _i22.CommitResponse {
+  _FakeCommitResponse_31(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -385,8 +391,8 @@
         );
 }
 
-class _FakeIssue_32 extends _i1.SmartFake implements _i13.Issue {
-  _FakeIssue_32(
+class _FakeGithubGoldStatus_32 extends _i1.SmartFake implements _i23.GithubGoldStatus {
+  _FakeGithubGoldStatus_32(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -395,8 +401,8 @@
         );
 }
 
-class _FakeIssueComment_33 extends _i1.SmartFake implements _i13.IssueComment {
-  _FakeIssueComment_33(
+class _FakeGithubBuildStatus_33 extends _i1.SmartFake implements _i24.GithubBuildStatus {
+  _FakeGithubBuildStatus_33(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -405,8 +411,8 @@
         );
 }
 
-class _FakeIssueLabel_34 extends _i1.SmartFake implements _i13.IssueLabel {
-  _FakeIssueLabel_34(
+class _FakeValue_34 extends _i1.SmartFake implements _i22.Value {
+  _FakeValue_34(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -415,8 +421,8 @@
         );
 }
 
-class _FakeMilestone_35 extends _i1.SmartFake implements _i13.Milestone {
-  _FakeMilestone_35(
+class _FakeFilter_35 extends _i1.SmartFake implements _i22.Filter {
+  _FakeFilter_35(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -425,8 +431,8 @@
         );
 }
 
-class _FakeGithubChecksUtil_36 extends _i1.SmartFake implements _i24.GithubChecksUtil {
-  _FakeGithubChecksUtil_36(
+class _FakeIssue_36 extends _i1.SmartFake implements _i14.Issue {
+  _FakeIssue_36(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -435,8 +441,8 @@
         );
 }
 
-class _FakeCheckRunConclusion_37 extends _i1.SmartFake implements _i13.CheckRunConclusion {
-  _FakeCheckRunConclusion_37(
+class _FakeIssueComment_37 extends _i1.SmartFake implements _i14.IssueComment {
+  _FakeIssueComment_37(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -445,8 +451,8 @@
         );
 }
 
-class _FakeCheckRunStatus_38 extends _i1.SmartFake implements _i13.CheckRunStatus {
-  _FakeCheckRunStatus_38(
+class _FakeIssueLabel_38 extends _i1.SmartFake implements _i14.IssueLabel {
+  _FakeIssueLabel_38(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -455,8 +461,8 @@
         );
 }
 
-class _FakeCheckSuite_39 extends _i1.SmartFake implements _i13.CheckSuite {
-  _FakeCheckSuite_39(
+class _FakeMilestone_39 extends _i1.SmartFake implements _i14.Milestone {
+  _FakeMilestone_39(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -465,8 +471,8 @@
         );
 }
 
-class _FakeCheckRun_40 extends _i1.SmartFake implements _i13.CheckRun {
-  _FakeCheckRun_40(
+class _FakeGithubChecksUtil_40 extends _i1.SmartFake implements _i25.GithubChecksUtil {
+  _FakeGithubChecksUtil_40(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -475,8 +481,8 @@
         );
 }
 
-class _FakePullRequest_41 extends _i1.SmartFake implements _i13.PullRequest {
-  _FakePullRequest_41(
+class _FakeCheckRunConclusion_41 extends _i1.SmartFake implements _i14.CheckRunConclusion {
+  _FakeCheckRunConclusion_41(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -485,8 +491,8 @@
         );
 }
 
-class _FakeGitReference_42 extends _i1.SmartFake implements _i13.GitReference {
-  _FakeGitReference_42(
+class _FakeCheckRunStatus_42 extends _i1.SmartFake implements _i14.CheckRunStatus {
+  _FakeCheckRunStatus_42(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -495,8 +501,8 @@
         );
 }
 
-class _FakeRateLimit_43 extends _i1.SmartFake implements _i13.RateLimit {
-  _FakeRateLimit_43(
+class _FakeCheckSuite_43 extends _i1.SmartFake implements _i14.CheckSuite {
+  _FakeCheckSuite_43(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -505,8 +511,8 @@
         );
 }
 
-class _FakeGitBlob_44 extends _i1.SmartFake implements _i13.GitBlob {
-  _FakeGitBlob_44(
+class _FakeCheckRun_44 extends _i1.SmartFake implements _i14.CheckRun {
+  _FakeCheckRun_44(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -515,8 +521,8 @@
         );
 }
 
-class _FakeGitCommit_45 extends _i1.SmartFake implements _i13.GitCommit {
-  _FakeGitCommit_45(
+class _FakePullRequest_45 extends _i1.SmartFake implements _i14.PullRequest {
+  _FakePullRequest_45(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -525,8 +531,8 @@
         );
 }
 
-class _FakeGitTag_46 extends _i1.SmartFake implements _i13.GitTag {
-  _FakeGitTag_46(
+class _FakeGitReference_46 extends _i1.SmartFake implements _i14.GitReference {
+  _FakeGitReference_46(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -535,8 +541,8 @@
         );
 }
 
-class _FakeGitTree_47 extends _i1.SmartFake implements _i13.GitTree {
-  _FakeGitTree_47(
+class _FakeRateLimit_47 extends _i1.SmartFake implements _i14.RateLimit {
+  _FakeRateLimit_47(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -545,8 +551,8 @@
         );
 }
 
-class _FakeDefaultPolicies_48 extends _i1.SmartFake implements _i14.DefaultPolicies {
-  _FakeDefaultPolicies_48(
+class _FakeGitBlob_48 extends _i1.SmartFake implements _i14.GitBlob {
+  _FakeGitBlob_48(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -555,8 +561,8 @@
         );
 }
 
-class _FakeLink_49 extends _i1.SmartFake implements _i14.Link {
-  _FakeLink_49(
+class _FakeGitCommit_49 extends _i1.SmartFake implements _i14.GitCommit {
+  _FakeGitCommit_49(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -565,8 +571,8 @@
         );
 }
 
-class _FakeGraphQLCache_50 extends _i1.SmartFake implements _i14.GraphQLCache {
-  _FakeGraphQLCache_50(
+class _FakeGitTag_50 extends _i1.SmartFake implements _i14.GitTag {
+  _FakeGitTag_50(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -575,8 +581,8 @@
         );
 }
 
-class _FakeQueryManager_51 extends _i1.SmartFake implements _i14.QueryManager {
-  _FakeQueryManager_51(
+class _FakeGitTree_51 extends _i1.SmartFake implements _i14.GitTree {
+  _FakeGitTree_51(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -585,8 +591,8 @@
         );
 }
 
-class _FakeObservableQuery_52<TParsed1> extends _i1.SmartFake implements _i14.ObservableQuery<TParsed1> {
-  _FakeObservableQuery_52(
+class _FakeDefaultPolicies_52 extends _i1.SmartFake implements _i15.DefaultPolicies {
+  _FakeDefaultPolicies_52(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -595,8 +601,8 @@
         );
 }
 
-class _FakeQueryResult_53<TParsed1 extends Object?> extends _i1.SmartFake implements _i14.QueryResult<TParsed1> {
-  _FakeQueryResult_53(
+class _FakeLink_53 extends _i1.SmartFake implements _i15.Link {
+  _FakeLink_53(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -605,8 +611,8 @@
         );
 }
 
-class _FakeHttpClientRequest_54 extends _i1.SmartFake implements _i25.HttpClientRequest {
-  _FakeHttpClientRequest_54(
+class _FakeGraphQLCache_54 extends _i1.SmartFake implements _i15.GraphQLCache {
+  _FakeGraphQLCache_54(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -615,8 +621,8 @@
         );
 }
 
-class _FakeUri_55 extends _i1.SmartFake implements Uri {
-  _FakeUri_55(
+class _FakeQueryManager_55 extends _i1.SmartFake implements _i15.QueryManager {
+  _FakeQueryManager_55(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -625,8 +631,58 @@
         );
 }
 
-class _FakeHttpHeaders_56 extends _i1.SmartFake implements _i25.HttpHeaders {
-  _FakeHttpHeaders_56(
+class _FakeObservableQuery_56<TParsed1> extends _i1.SmartFake implements _i15.ObservableQuery<TParsed1> {
+  _FakeObservableQuery_56(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeQueryResult_57<TParsed1 extends Object?> extends _i1.SmartFake implements _i15.QueryResult<TParsed1> {
+  _FakeQueryResult_57(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeHttpClientRequest_58 extends _i1.SmartFake implements _i26.HttpClientRequest {
+  _FakeHttpClientRequest_58(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeUri_59 extends _i1.SmartFake implements Uri {
+  _FakeUri_59(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeHttpHeaders_60 extends _i1.SmartFake implements _i26.HttpHeaders {
+  _FakeHttpHeaders_60(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeHttpClientResponse_61 extends _i1.SmartFake implements _i26.HttpClientResponse {
+  _FakeHttpClientResponse_61(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -635,8 +691,8 @@
         );
 }
 
-class _FakeHttpClientResponse_57 extends _i1.SmartFake implements _i25.HttpClientResponse {
-  _FakeHttpClientResponse_57(
+class _FakeEncoding_62 extends _i1.SmartFake implements _i27.Encoding {
+  _FakeEncoding_62(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -645,8 +701,8 @@
         );
 }
 
-class _FakeEncoding_58 extends _i1.SmartFake implements _i26.Encoding {
-  _FakeEncoding_58(
+class _FakeSocket_63 extends _i1.SmartFake implements _i26.Socket {
+  _FakeSocket_63(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -655,8 +711,8 @@
         );
 }
 
-class _FakeSocket_59 extends _i1.SmartFake implements _i25.Socket {
-  _FakeSocket_59(
+class _FakeStreamSubscription_64<T> extends _i1.SmartFake implements _i21.StreamSubscription<T> {
+  _FakeStreamSubscription_64(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -665,8 +721,8 @@
         );
 }
 
-class _FakeStreamSubscription_60<T> extends _i1.SmartFake implements _i20.StreamSubscription<T> {
-  _FakeStreamSubscription_60(
+class _FakeJobCancelResponse_65 extends _i1.SmartFake implements _i6.JobCancelResponse {
+  _FakeJobCancelResponse_65(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -675,8 +731,8 @@
         );
 }
 
-class _FakeJobCancelResponse_61 extends _i1.SmartFake implements _i6.JobCancelResponse {
-  _FakeJobCancelResponse_61(
+class _FakeJob_66 extends _i1.SmartFake implements _i6.Job {
+  _FakeJob_66(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -685,8 +741,8 @@
         );
 }
 
-class _FakeJob_62 extends _i1.SmartFake implements _i6.Job {
-  _FakeJob_62(
+class _FakeGetQueryResultsResponse_67 extends _i1.SmartFake implements _i6.GetQueryResultsResponse {
+  _FakeGetQueryResultsResponse_67(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -695,8 +751,8 @@
         );
 }
 
-class _FakeGetQueryResultsResponse_63 extends _i1.SmartFake implements _i6.GetQueryResultsResponse {
-  _FakeGetQueryResultsResponse_63(
+class _FakeJobList_68 extends _i1.SmartFake implements _i6.JobList {
+  _FakeJobList_68(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -705,8 +761,8 @@
         );
 }
 
-class _FakeJobList_64 extends _i1.SmartFake implements _i6.JobList {
-  _FakeJobList_64(
+class _FakeQueryResponse_69 extends _i1.SmartFake implements _i6.QueryResponse {
+  _FakeQueryResponse_69(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -715,8 +771,8 @@
         );
 }
 
-class _FakeQueryResponse_65 extends _i1.SmartFake implements _i6.QueryResponse {
-  _FakeQueryResponse_65(
+class _FakeBuildBucketClient_70 extends _i1.SmartFake implements _i16.BuildBucketClient {
+  _FakeBuildBucketClient_70(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -725,8 +781,8 @@
         );
 }
 
-class _FakeBuildBucketClient_66 extends _i1.SmartFake implements _i15.BuildBucketClient {
-  _FakeBuildBucketClient_66(
+class _FakeBuildBucketV2Client_71 extends _i1.SmartFake implements _i28.BuildBucketV2Client {
+  _FakeBuildBucketV2Client_71(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -735,8 +791,8 @@
         );
 }
 
-class _FakeCacheService_67 extends _i1.SmartFake implements _i15.CacheService {
-  _FakeCacheService_67(
+class _FakeCacheService_72 extends _i1.SmartFake implements _i16.CacheService {
+  _FakeCacheService_72(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -745,8 +801,8 @@
         );
 }
 
-class _FakePubSub_68 extends _i1.SmartFake implements _i15.PubSub {
-  _FakePubSub_68(
+class _FakePubSub_73 extends _i1.SmartFake implements _i16.PubSub {
+  _FakePubSub_73(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -755,8 +811,8 @@
         );
 }
 
-class _FakeProcess_69 extends _i1.SmartFake implements _i25.Process {
-  _FakeProcess_69(
+class _FakeProcess_74 extends _i1.SmartFake implements _i26.Process {
+  _FakeProcess_74(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -765,8 +821,8 @@
         );
 }
 
-class _FakePullRequestMerge_70 extends _i1.SmartFake implements _i13.PullRequestMerge {
-  _FakePullRequestMerge_70(
+class _FakePullRequestMerge_75 extends _i1.SmartFake implements _i14.PullRequestMerge {
+  _FakePullRequestMerge_75(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -775,8 +831,8 @@
         );
 }
 
-class _FakePullRequestComment_71 extends _i1.SmartFake implements _i13.PullRequestComment {
-  _FakePullRequestComment_71(
+class _FakePullRequestComment_76 extends _i1.SmartFake implements _i14.PullRequestComment {
+  _FakePullRequestComment_76(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -785,8 +841,8 @@
         );
 }
 
-class _FakePullRequestReview_72 extends _i1.SmartFake implements _i13.PullRequestReview {
-  _FakePullRequestReview_72(
+class _FakePullRequestReview_77 extends _i1.SmartFake implements _i14.PullRequestReview {
+  _FakePullRequestReview_77(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -795,8 +851,8 @@
         );
 }
 
-class _FakeRepository_73 extends _i1.SmartFake implements _i13.Repository {
-  _FakeRepository_73(
+class _FakeRepository_78 extends _i1.SmartFake implements _i14.Repository {
+  _FakeRepository_78(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -805,8 +861,8 @@
         );
 }
 
-class _FakeLicenseDetails_74 extends _i1.SmartFake implements _i13.LicenseDetails {
-  _FakeLicenseDetails_74(
+class _FakeLicenseDetails_79 extends _i1.SmartFake implements _i14.LicenseDetails {
+  _FakeLicenseDetails_79(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -815,8 +871,8 @@
         );
 }
 
-class _FakeLanguageBreakdown_75 extends _i1.SmartFake implements _i13.LanguageBreakdown {
-  _FakeLanguageBreakdown_75(
+class _FakeLanguageBreakdown_80 extends _i1.SmartFake implements _i14.LanguageBreakdown {
+  _FakeLanguageBreakdown_80(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -825,8 +881,8 @@
         );
 }
 
-class _FakeBranch_76 extends _i1.SmartFake implements _i13.Branch {
-  _FakeBranch_76(
+class _FakeBranch_81 extends _i1.SmartFake implements _i14.Branch {
+  _FakeBranch_81(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -835,8 +891,8 @@
         );
 }
 
-class _FakeCommitComment_77 extends _i1.SmartFake implements _i13.CommitComment {
-  _FakeCommitComment_77(
+class _FakeCommitComment_82 extends _i1.SmartFake implements _i14.CommitComment {
+  _FakeCommitComment_82(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -845,8 +901,8 @@
         );
 }
 
-class _FakeRepositoryCommit_78 extends _i1.SmartFake implements _i13.RepositoryCommit {
-  _FakeRepositoryCommit_78(
+class _FakeRepositoryCommit_83 extends _i1.SmartFake implements _i14.RepositoryCommit {
+  _FakeRepositoryCommit_83(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -855,8 +911,8 @@
         );
 }
 
-class _FakeGitHubComparison_79 extends _i1.SmartFake implements _i13.GitHubComparison {
-  _FakeGitHubComparison_79(
+class _FakeGitHubComparison_84 extends _i1.SmartFake implements _i14.GitHubComparison {
+  _FakeGitHubComparison_84(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -865,8 +921,8 @@
         );
 }
 
-class _FakeGitHubFile_80 extends _i1.SmartFake implements _i13.GitHubFile {
-  _FakeGitHubFile_80(
+class _FakeGitHubFile_85 extends _i1.SmartFake implements _i14.GitHubFile {
+  _FakeGitHubFile_85(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -875,8 +931,8 @@
         );
 }
 
-class _FakeRepositoryContents_81 extends _i1.SmartFake implements _i13.RepositoryContents {
-  _FakeRepositoryContents_81(
+class _FakeRepositoryContents_86 extends _i1.SmartFake implements _i14.RepositoryContents {
+  _FakeRepositoryContents_86(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -885,8 +941,8 @@
         );
 }
 
-class _FakeContentCreation_82 extends _i1.SmartFake implements _i13.ContentCreation {
-  _FakeContentCreation_82(
+class _FakeContentCreation_87 extends _i1.SmartFake implements _i14.ContentCreation {
+  _FakeContentCreation_87(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -895,8 +951,8 @@
         );
 }
 
-class _FakeHook_83 extends _i1.SmartFake implements _i13.Hook {
-  _FakeHook_83(
+class _FakeHook_88 extends _i1.SmartFake implements _i14.Hook {
+  _FakeHook_88(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -905,8 +961,8 @@
         );
 }
 
-class _FakePublicKey_84 extends _i1.SmartFake implements _i13.PublicKey {
-  _FakePublicKey_84(
+class _FakePublicKey_89 extends _i1.SmartFake implements _i14.PublicKey {
+  _FakePublicKey_89(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -915,8 +971,8 @@
         );
 }
 
-class _FakeRepositoryPages_85 extends _i1.SmartFake implements _i13.RepositoryPages {
-  _FakeRepositoryPages_85(
+class _FakeRepositoryPages_90 extends _i1.SmartFake implements _i14.RepositoryPages {
+  _FakeRepositoryPages_90(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -925,8 +981,8 @@
         );
 }
 
-class _FakePageBuild_86 extends _i1.SmartFake implements _i13.PageBuild {
-  _FakePageBuild_86(
+class _FakePageBuild_91 extends _i1.SmartFake implements _i14.PageBuild {
+  _FakePageBuild_91(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -935,8 +991,8 @@
         );
 }
 
-class _FakeRelease_87 extends _i1.SmartFake implements _i13.Release {
-  _FakeRelease_87(
+class _FakeRelease_92 extends _i1.SmartFake implements _i14.Release {
+  _FakeRelease_92(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -945,8 +1001,8 @@
         );
 }
 
-class _FakeReleaseAsset_88 extends _i1.SmartFake implements _i13.ReleaseAsset {
-  _FakeReleaseAsset_88(
+class _FakeReleaseAsset_93 extends _i1.SmartFake implements _i14.ReleaseAsset {
+  _FakeReleaseAsset_93(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -955,8 +1011,8 @@
         );
 }
 
-class _FakeContributorParticipation_89 extends _i1.SmartFake implements _i13.ContributorParticipation {
-  _FakeContributorParticipation_89(
+class _FakeContributorParticipation_94 extends _i1.SmartFake implements _i14.ContributorParticipation {
+  _FakeContributorParticipation_94(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -965,8 +1021,8 @@
         );
 }
 
-class _FakeRepositoryStatus_90 extends _i1.SmartFake implements _i13.RepositoryStatus {
-  _FakeRepositoryStatus_90(
+class _FakeRepositoryStatus_95 extends _i1.SmartFake implements _i14.RepositoryStatus {
+  _FakeRepositoryStatus_95(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -975,8 +1031,8 @@
         );
 }
 
-class _FakeCombinedRepositoryStatus_91 extends _i1.SmartFake implements _i13.CombinedRepositoryStatus {
-  _FakeCombinedRepositoryStatus_91(
+class _FakeCombinedRepositoryStatus_96 extends _i1.SmartFake implements _i14.CombinedRepositoryStatus {
+  _FakeCombinedRepositoryStatus_96(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -985,8 +1041,8 @@
         );
 }
 
-class _FakeReleaseNotes_92 extends _i1.SmartFake implements _i13.ReleaseNotes {
-  _FakeReleaseNotes_92(
+class _FakeReleaseNotes_97 extends _i1.SmartFake implements _i14.ReleaseNotes {
+  _FakeReleaseNotes_97(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -995,8 +1051,8 @@
         );
 }
 
-class _FakeTableDataInsertAllResponse_93 extends _i1.SmartFake implements _i6.TableDataInsertAllResponse {
-  _FakeTableDataInsertAllResponse_93(
+class _FakeTableDataInsertAllResponse_98 extends _i1.SmartFake implements _i6.TableDataInsertAllResponse {
+  _FakeTableDataInsertAllResponse_98(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1005,8 +1061,8 @@
         );
 }
 
-class _FakeTableDataList_94 extends _i1.SmartFake implements _i6.TableDataList {
-  _FakeTableDataList_94(
+class _FakeTableDataList_99 extends _i1.SmartFake implements _i6.TableDataList {
+  _FakeTableDataList_99(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1015,8 +1071,8 @@
         );
 }
 
-class _FakeUser_95 extends _i1.SmartFake implements _i13.User {
-  _FakeUser_95(
+class _FakeUser_100 extends _i1.SmartFake implements _i14.User {
+  _FakeUser_100(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1025,8 +1081,8 @@
         );
 }
 
-class _FakeCurrentUser_96 extends _i1.SmartFake implements _i13.CurrentUser {
-  _FakeCurrentUser_96(
+class _FakeCurrentUser_101 extends _i1.SmartFake implements _i14.CurrentUser {
+  _FakeCurrentUser_101(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1035,8 +1091,8 @@
         );
 }
 
-class _FakeEntry_97<T> extends _i1.SmartFake implements _i27.Entry<T> {
-  _FakeEntry_97(
+class _FakeEntry_102<T> extends _i1.SmartFake implements _i29.Entry<T> {
+  _FakeEntry_102(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1045,8 +1101,8 @@
         );
 }
 
-class _FakeCache_98<T> extends _i1.SmartFake implements _i27.Cache<T> {
-  _FakeCache_98(
+class _FakeCache_103<T> extends _i1.SmartFake implements _i29.Cache<T> {
+  _FakeCache_103(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1055,8 +1111,8 @@
         );
 }
 
-class _FakeAuthentication_99 extends _i1.SmartFake implements _i13.Authentication {
-  _FakeAuthentication_99(
+class _FakeAuthentication_104 extends _i1.SmartFake implements _i14.Authentication {
+  _FakeAuthentication_104(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1065,8 +1121,8 @@
         );
 }
 
-class _FakeActivityService_100 extends _i1.SmartFake implements _i13.ActivityService {
-  _FakeActivityService_100(
+class _FakeActivityService_105 extends _i1.SmartFake implements _i14.ActivityService {
+  _FakeActivityService_105(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1075,8 +1131,8 @@
         );
 }
 
-class _FakeAuthorizationsService_101 extends _i1.SmartFake implements _i13.AuthorizationsService {
-  _FakeAuthorizationsService_101(
+class _FakeAuthorizationsService_106 extends _i1.SmartFake implements _i14.AuthorizationsService {
+  _FakeAuthorizationsService_106(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1085,8 +1141,8 @@
         );
 }
 
-class _FakeGistsService_102 extends _i1.SmartFake implements _i13.GistsService {
-  _FakeGistsService_102(
+class _FakeGistsService_107 extends _i1.SmartFake implements _i14.GistsService {
+  _FakeGistsService_107(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1095,8 +1151,8 @@
         );
 }
 
-class _FakeGitService_103 extends _i1.SmartFake implements _i13.GitService {
-  _FakeGitService_103(
+class _FakeGitService_108 extends _i1.SmartFake implements _i14.GitService {
+  _FakeGitService_108(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1105,8 +1161,8 @@
         );
 }
 
-class _FakeIssuesService_104 extends _i1.SmartFake implements _i13.IssuesService {
-  _FakeIssuesService_104(
+class _FakeIssuesService_109 extends _i1.SmartFake implements _i14.IssuesService {
+  _FakeIssuesService_109(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1115,8 +1171,8 @@
         );
 }
 
-class _FakeMiscService_105 extends _i1.SmartFake implements _i13.MiscService {
-  _FakeMiscService_105(
+class _FakeMiscService_110 extends _i1.SmartFake implements _i14.MiscService {
+  _FakeMiscService_110(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1125,8 +1181,8 @@
         );
 }
 
-class _FakeOrganizationsService_106 extends _i1.SmartFake implements _i13.OrganizationsService {
-  _FakeOrganizationsService_106(
+class _FakeOrganizationsService_111 extends _i1.SmartFake implements _i14.OrganizationsService {
+  _FakeOrganizationsService_111(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1135,8 +1191,8 @@
         );
 }
 
-class _FakePullRequestsService_107 extends _i1.SmartFake implements _i13.PullRequestsService {
-  _FakePullRequestsService_107(
+class _FakePullRequestsService_112 extends _i1.SmartFake implements _i14.PullRequestsService {
+  _FakePullRequestsService_112(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1145,8 +1201,8 @@
         );
 }
 
-class _FakeRepositoriesService_108 extends _i1.SmartFake implements _i13.RepositoriesService {
-  _FakeRepositoriesService_108(
+class _FakeRepositoriesService_113 extends _i1.SmartFake implements _i14.RepositoriesService {
+  _FakeRepositoriesService_113(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1155,8 +1211,8 @@
         );
 }
 
-class _FakeSearchService_109 extends _i1.SmartFake implements _i13.SearchService {
-  _FakeSearchService_109(
+class _FakeSearchService_114 extends _i1.SmartFake implements _i14.SearchService {
+  _FakeSearchService_114(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1165,8 +1221,8 @@
         );
 }
 
-class _FakeUrlShortenerService_110 extends _i1.SmartFake implements _i13.UrlShortenerService {
-  _FakeUrlShortenerService_110(
+class _FakeUrlShortenerService_115 extends _i1.SmartFake implements _i14.UrlShortenerService {
+  _FakeUrlShortenerService_115(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1175,8 +1231,8 @@
         );
 }
 
-class _FakeUsersService_111 extends _i1.SmartFake implements _i13.UsersService {
-  _FakeUsersService_111(
+class _FakeUsersService_116 extends _i1.SmartFake implements _i14.UsersService {
+  _FakeUsersService_116(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1185,8 +1241,8 @@
         );
 }
 
-class _FakeChecksService_112 extends _i1.SmartFake implements _i13.ChecksService {
-  _FakeChecksService_112(
+class _FakeChecksService_117 extends _i1.SmartFake implements _i14.ChecksService {
+  _FakeChecksService_117(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1195,8 +1251,8 @@
         );
 }
 
-class _FakeResponse_113 extends _i1.SmartFake implements _i2.Response {
-  _FakeResponse_113(
+class _FakeResponse_118 extends _i1.SmartFake implements _i2.Response {
+  _FakeResponse_118(
     Object parent,
     Invocation parentInvocation,
   ) : super(
@@ -1214,7 +1270,7 @@
   }
 
   @override
-  _i20.Future<_i2.Client> createAccessClient({
+  _i21.Future<_i2.Client> createAccessClient({
     List<String>? scopes = const [r'https://www.googleapis.com/auth/cloud-platform'],
     _i2.Client? baseClient,
   }) =>
@@ -1227,7 +1283,7 @@
             #baseClient: baseClient,
           },
         ),
-        returnValue: _i20.Future<_i2.Client>.value(_FakeClient_0(
+        returnValue: _i21.Future<_i2.Client>.value(_FakeClient_0(
           this,
           Invocation.method(
             #createAccessClient,
@@ -1238,13 +1294,13 @@
             },
           ),
         )),
-      ) as _i20.Future<_i2.Client>);
+      ) as _i21.Future<_i2.Client>);
 }
 
 /// A class which mocks [AccessTokenService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockAccessTokenService extends _i1.Mock implements _i28.AccessTokenService {
+class MockAccessTokenService extends _i1.Mock implements _i30.AccessTokenService {
   MockAccessTokenService() {
     _i1.throwOnMissingStub(this);
   }
@@ -1259,25 +1315,25 @@
       ) as _i3.Config);
 
   @override
-  _i20.Future<_i4.AccessToken> createAccessToken() => (super.noSuchMethod(
+  _i21.Future<_i4.AccessToken> createAccessToken() => (super.noSuchMethod(
         Invocation.method(
           #createAccessToken,
           [],
         ),
-        returnValue: _i20.Future<_i4.AccessToken>.value(_FakeAccessToken_2(
+        returnValue: _i21.Future<_i4.AccessToken>.value(_FakeAccessToken_2(
           this,
           Invocation.method(
             #createAccessToken,
             [],
           ),
         )),
-      ) as _i20.Future<_i4.AccessToken>);
+      ) as _i21.Future<_i4.AccessToken>);
 }
 
 /// A class which mocks [BigqueryService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBigqueryService extends _i1.Mock implements _i16.BigqueryService {
+class MockBigqueryService extends _i1.Mock implements _i17.BigqueryService {
   MockBigqueryService() {
     _i1.throwOnMissingStub(this);
   }
@@ -1292,37 +1348,37 @@
       ) as _i5.AccessClientProvider);
 
   @override
-  _i20.Future<_i6.TabledataResource> defaultTabledata() => (super.noSuchMethod(
+  _i21.Future<_i6.TabledataResource> defaultTabledata() => (super.noSuchMethod(
         Invocation.method(
           #defaultTabledata,
           [],
         ),
-        returnValue: _i20.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
+        returnValue: _i21.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
           this,
           Invocation.method(
             #defaultTabledata,
             [],
           ),
         )),
-      ) as _i20.Future<_i6.TabledataResource>);
+      ) as _i21.Future<_i6.TabledataResource>);
 
   @override
-  _i20.Future<_i6.JobsResource> defaultJobs() => (super.noSuchMethod(
+  _i21.Future<_i6.JobsResource> defaultJobs() => (super.noSuchMethod(
         Invocation.method(
           #defaultJobs,
           [],
         ),
-        returnValue: _i20.Future<_i6.JobsResource>.value(_FakeJobsResource_5(
+        returnValue: _i21.Future<_i6.JobsResource>.value(_FakeJobsResource_5(
           this,
           Invocation.method(
             #defaultJobs,
             [],
           ),
         )),
-      ) as _i20.Future<_i6.JobsResource>);
+      ) as _i21.Future<_i6.JobsResource>);
 
   @override
-  _i20.Future<List<_i16.BuilderStatistic>> listBuilderStatistic(
+  _i21.Future<List<_i17.BuilderStatistic>> listBuilderStatistic(
     String? projectId, {
     int? limit = 100,
     String? bucket = r'prod',
@@ -1336,11 +1392,11 @@
             #bucket: bucket,
           },
         ),
-        returnValue: _i20.Future<List<_i16.BuilderStatistic>>.value(<_i16.BuilderStatistic>[]),
-      ) as _i20.Future<List<_i16.BuilderStatistic>>);
+        returnValue: _i21.Future<List<_i17.BuilderStatistic>>.value(<_i17.BuilderStatistic>[]),
+      ) as _i21.Future<List<_i17.BuilderStatistic>>);
 
   @override
-  _i20.Future<List<_i16.BuilderRecord>> listRecentBuildRecordsForBuilder(
+  _i21.Future<List<_i17.BuilderRecord>> listRecentBuildRecordsForBuilder(
     String? projectId, {
     String? builder,
     int? limit,
@@ -1354,14 +1410,14 @@
             #limit: limit,
           },
         ),
-        returnValue: _i20.Future<List<_i16.BuilderRecord>>.value(<_i16.BuilderRecord>[]),
-      ) as _i20.Future<List<_i16.BuilderRecord>>);
+        returnValue: _i21.Future<List<_i17.BuilderRecord>>.value(<_i17.BuilderRecord>[]),
+      ) as _i21.Future<List<_i17.BuilderRecord>>);
 }
 
 /// A class which mocks [BranchService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBranchService extends _i1.Mock implements _i15.BranchService {
+class MockBranchService extends _i1.Mock implements _i16.BranchService {
   MockBranchService() {
     _i1.throwOnMissingStub(this);
   }
@@ -1385,16 +1441,16 @@
       ) as _i7.GerritService);
 
   @override
-  _i29.RetryOptions get retryOptions => (super.noSuchMethod(
+  _i31.RetryOptions get retryOptions => (super.noSuchMethod(
         Invocation.getter(#retryOptions),
-        returnValue: _i30.dummyValue<_i29.RetryOptions>(
+        returnValue: _i32.dummyValue<_i31.RetryOptions>(
           this,
           Invocation.getter(#retryOptions),
         ),
-      ) as _i29.RetryOptions);
+      ) as _i31.RetryOptions);
 
   @override
-  _i20.Future<void> branchFlutterRecipes(
+  _i21.Future<void> branchFlutterRecipes(
     String? branch,
     String? engineSha,
   ) =>
@@ -1406,14 +1462,14 @@
             engineSha,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<List<Map<String, String>>> getReleaseBranches({
-    required _i17.GithubService? githubService,
-    required _i13.RepositorySlug? slug,
+  _i21.Future<List<Map<String, String>>> getReleaseBranches({
+    required _i18.GithubService? githubService,
+    required _i14.RepositorySlug? slug,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1424,15 +1480,15 @@
             #slug: slug,
           },
         ),
-        returnValue: _i20.Future<List<Map<String, String>>>.value(<Map<String, String>>[]),
-      ) as _i20.Future<List<Map<String, String>>>);
+        returnValue: _i21.Future<List<Map<String, String>>>.value(<Map<String, String>>[]),
+      ) as _i21.Future<List<Map<String, String>>>);
 }
 
 /// A class which mocks [BuildBucketClient].
 ///
 /// See the documentation for Mockito's code generation for more information.
 // ignore: must_be_immutable
-class MockBuildBucketClient extends _i1.Mock implements _i15.BuildBucketClient {
+class MockBuildBucketClient extends _i1.Mock implements _i16.BuildBucketClient {
   MockBuildBucketClient() {
     _i1.throwOnMissingStub(this);
   }
@@ -1440,7 +1496,7 @@
   @override
   String get buildBucketBuildUri => (super.noSuchMethod(
         Invocation.getter(#buildBucketBuildUri),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#buildBucketBuildUri),
         ),
@@ -1449,7 +1505,7 @@
   @override
   String get buildBucketBuilderUri => (super.noSuchMethod(
         Invocation.getter(#buildBucketBuilderUri),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#buildBucketBuilderUri),
         ),
@@ -1465,7 +1521,7 @@
       ) as _i2.Client);
 
   @override
-  _i20.Future<_i8.Build> scheduleBuild(
+  _i21.Future<_i8.Build> scheduleBuild(
     _i8.ScheduleBuildRequest? request, {
     String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
@@ -1475,7 +1531,7 @@
           [request],
           {#buildBucketUri: buildBucketUri},
         ),
-        returnValue: _i20.Future<_i8.Build>.value(_FakeBuild_7(
+        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
           this,
           Invocation.method(
             #scheduleBuild,
@@ -1483,10 +1539,10 @@
             {#buildBucketUri: buildBucketUri},
           ),
         )),
-      ) as _i20.Future<_i8.Build>);
+      ) as _i21.Future<_i8.Build>);
 
   @override
-  _i20.Future<_i8.SearchBuildsResponse> searchBuilds(
+  _i21.Future<_i8.SearchBuildsResponse> searchBuilds(
     _i8.SearchBuildsRequest? request, {
     String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
@@ -1496,7 +1552,7 @@
           [request],
           {#buildBucketUri: buildBucketUri},
         ),
-        returnValue: _i20.Future<_i8.SearchBuildsResponse>.value(_FakeSearchBuildsResponse_8(
+        returnValue: _i21.Future<_i8.SearchBuildsResponse>.value(_FakeSearchBuildsResponse_8(
           this,
           Invocation.method(
             #searchBuilds,
@@ -1504,10 +1560,10 @@
             {#buildBucketUri: buildBucketUri},
           ),
         )),
-      ) as _i20.Future<_i8.SearchBuildsResponse>);
+      ) as _i21.Future<_i8.SearchBuildsResponse>);
 
   @override
-  _i20.Future<_i8.BatchResponse> batch(
+  _i21.Future<_i8.BatchResponse> batch(
     _i8.BatchRequest? request, {
     String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
@@ -1517,7 +1573,7 @@
           [request],
           {#buildBucketUri: buildBucketUri},
         ),
-        returnValue: _i20.Future<_i8.BatchResponse>.value(_FakeBatchResponse_9(
+        returnValue: _i21.Future<_i8.BatchResponse>.value(_FakeBatchResponse_9(
           this,
           Invocation.method(
             #batch,
@@ -1525,10 +1581,10 @@
             {#buildBucketUri: buildBucketUri},
           ),
         )),
-      ) as _i20.Future<_i8.BatchResponse>);
+      ) as _i21.Future<_i8.BatchResponse>);
 
   @override
-  _i20.Future<_i8.Build> cancelBuild(
+  _i21.Future<_i8.Build> cancelBuild(
     _i8.CancelBuildRequest? request, {
     String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
@@ -1538,7 +1594,7 @@
           [request],
           {#buildBucketUri: buildBucketUri},
         ),
-        returnValue: _i20.Future<_i8.Build>.value(_FakeBuild_7(
+        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
           this,
           Invocation.method(
             #cancelBuild,
@@ -1546,10 +1602,10 @@
             {#buildBucketUri: buildBucketUri},
           ),
         )),
-      ) as _i20.Future<_i8.Build>);
+      ) as _i21.Future<_i8.Build>);
 
   @override
-  _i20.Future<_i8.Build> getBuild(
+  _i21.Future<_i8.Build> getBuild(
     _i8.GetBuildRequest? request, {
     String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
@@ -1559,7 +1615,7 @@
           [request],
           {#buildBucketUri: buildBucketUri},
         ),
-        returnValue: _i20.Future<_i8.Build>.value(_FakeBuild_7(
+        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
           this,
           Invocation.method(
             #getBuild,
@@ -1567,10 +1623,10 @@
             {#buildBucketUri: buildBucketUri},
           ),
         )),
-      ) as _i20.Future<_i8.Build>);
+      ) as _i21.Future<_i8.Build>);
 
   @override
-  _i20.Future<_i8.ListBuildersResponse> listBuilders(
+  _i21.Future<_i8.ListBuildersResponse> listBuilders(
     _i8.ListBuildersRequest? request, {
     String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builders',
   }) =>
@@ -1580,7 +1636,7 @@
           [request],
           {#buildBucketUri: buildBucketUri},
         ),
-        returnValue: _i20.Future<_i8.ListBuildersResponse>.value(_FakeListBuildersResponse_10(
+        returnValue: _i21.Future<_i8.ListBuildersResponse>.value(_FakeListBuildersResponse_10(
           this,
           Invocation.method(
             #listBuilders,
@@ -1588,7 +1644,179 @@
             {#buildBucketUri: buildBucketUri},
           ),
         )),
-      ) as _i20.Future<_i8.ListBuildersResponse>);
+      ) as _i21.Future<_i8.ListBuildersResponse>);
+
+  @override
+  void close() => super.noSuchMethod(
+        Invocation.method(
+          #close,
+          [],
+        ),
+        returnValueForMissingStub: null,
+      );
+}
+
+/// A class which mocks [BuildBucketV2Client].
+///
+/// See the documentation for Mockito's code generation for more information.
+// ignore: must_be_immutable
+class MockBuildBucketV2Client extends _i1.Mock implements _i28.BuildBucketV2Client {
+  MockBuildBucketV2Client() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  String get buildBucketBuildUri => (super.noSuchMethod(
+        Invocation.getter(#buildBucketBuildUri),
+        returnValue: _i32.dummyValue<String>(
+          this,
+          Invocation.getter(#buildBucketBuildUri),
+        ),
+      ) as String);
+
+  @override
+  String get buildBucketBuilderUri => (super.noSuchMethod(
+        Invocation.getter(#buildBucketBuilderUri),
+        returnValue: _i32.dummyValue<String>(
+          this,
+          Invocation.getter(#buildBucketBuilderUri),
+        ),
+      ) as String);
+
+  @override
+  _i2.Client get httpClient => (super.noSuchMethod(
+        Invocation.getter(#httpClient),
+        returnValue: _FakeClient_0(
+          this,
+          Invocation.getter(#httpClient),
+        ),
+      ) as _i2.Client);
+
+  @override
+  _i21.Future<_i9.Build> scheduleBuild(
+    _i9.ScheduleBuildRequest? request, {
+    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #scheduleBuild,
+          [request],
+          {#buildBucketUri: buildBucketUri},
+        ),
+        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
+          this,
+          Invocation.method(
+            #scheduleBuild,
+            [request],
+            {#buildBucketUri: buildBucketUri},
+          ),
+        )),
+      ) as _i21.Future<_i9.Build>);
+
+  @override
+  _i21.Future<_i9.SearchBuildsResponse> searchBuilds(
+    _i9.SearchBuildsRequest? request, {
+    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #searchBuilds,
+          [request],
+          {#buildBucketUri: buildBucketUri},
+        ),
+        returnValue: _i21.Future<_i9.SearchBuildsResponse>.value(_FakeSearchBuildsResponse_12(
+          this,
+          Invocation.method(
+            #searchBuilds,
+            [request],
+            {#buildBucketUri: buildBucketUri},
+          ),
+        )),
+      ) as _i21.Future<_i9.SearchBuildsResponse>);
+
+  @override
+  _i21.Future<_i9.BatchResponse> batch(
+    _i9.BatchRequest? request, {
+    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #batch,
+          [request],
+          {#buildBucketUri: buildBucketUri},
+        ),
+        returnValue: _i21.Future<_i9.BatchResponse>.value(_FakeBatchResponse_13(
+          this,
+          Invocation.method(
+            #batch,
+            [request],
+            {#buildBucketUri: buildBucketUri},
+          ),
+        )),
+      ) as _i21.Future<_i9.BatchResponse>);
+
+  @override
+  _i21.Future<_i9.Build> cancelBuild(
+    _i9.CancelBuildRequest? request, {
+    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #cancelBuild,
+          [request],
+          {#buildBucketUri: buildBucketUri},
+        ),
+        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
+          this,
+          Invocation.method(
+            #cancelBuild,
+            [request],
+            {#buildBucketUri: buildBucketUri},
+          ),
+        )),
+      ) as _i21.Future<_i9.Build>);
+
+  @override
+  _i21.Future<_i9.Build> getBuild(
+    _i9.GetBuildRequest? request, {
+    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getBuild,
+          [request],
+          {#buildBucketUri: buildBucketUri},
+        ),
+        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
+          this,
+          Invocation.method(
+            #getBuild,
+            [request],
+            {#buildBucketUri: buildBucketUri},
+          ),
+        )),
+      ) as _i21.Future<_i9.Build>);
+
+  @override
+  _i21.Future<_i9.ListBuildersResponse> listBuilders(
+    _i9.ListBuildersRequest? request, {
+    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builders',
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listBuilders,
+          [request],
+          {#buildBucketUri: buildBucketUri},
+        ),
+        returnValue: _i21.Future<_i9.ListBuildersResponse>.value(_FakeListBuildersResponse_14(
+          this,
+          Invocation.method(
+            #listBuilders,
+            [request],
+            {#buildBucketUri: buildBucketUri},
+          ),
+        )),
+      ) as _i21.Future<_i9.ListBuildersResponse>);
 
   @override
   void close() => super.noSuchMethod(
@@ -1603,7 +1831,7 @@
 /// A class which mocks [CommitService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockCommitService extends _i1.Mock implements _i31.CommitService {
+class MockCommitService extends _i1.Mock implements _i33.CommitService {
   MockCommitService() {
     _i1.throwOnMissingStub(this);
   }
@@ -1618,33 +1846,33 @@
       ) as _i3.Config);
 
   @override
-  _i9.DatastoreServiceProvider get datastoreProvider => (super.noSuchMethod(
+  _i10.DatastoreServiceProvider get datastoreProvider => (super.noSuchMethod(
         Invocation.getter(#datastoreProvider),
-        returnValue: (_i11.DatastoreDB db) => _FakeDatastoreService_11(
+        returnValue: (_i12.DatastoreDB db) => _FakeDatastoreService_15(
           this,
           Invocation.getter(#datastoreProvider),
         ),
-      ) as _i9.DatastoreServiceProvider);
+      ) as _i10.DatastoreServiceProvider);
 
   @override
-  _i20.Future<void> handleCreateGithubRequest(_i32.CreateEvent? createEvent) => (super.noSuchMethod(
+  _i21.Future<void> handleCreateGithubRequest(_i34.CreateEvent? createEvent) => (super.noSuchMethod(
         Invocation.method(
           #handleCreateGithubRequest,
           [createEvent],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<void> handlePushGithubRequest(Map<String, dynamic>? pushEvent) => (super.noSuchMethod(
+  _i21.Future<void> handlePushGithubRequest(Map<String, dynamic>? pushEvent) => (super.noSuchMethod(
         Invocation.method(
           #handlePushGithubRequest,
           [pushEvent],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 }
 
 /// A class which mocks [Config].
@@ -1656,94 +1884,94 @@
   }
 
   @override
-  Set<_i13.RepositorySlug> get supportedRepos => (super.noSuchMethod(
+  Set<_i14.RepositorySlug> get supportedRepos => (super.noSuchMethod(
         Invocation.getter(#supportedRepos),
-        returnValue: <_i13.RepositorySlug>{},
-      ) as Set<_i13.RepositorySlug>);
+        returnValue: <_i14.RepositorySlug>{},
+      ) as Set<_i14.RepositorySlug>);
 
   @override
-  Set<_i13.RepositorySlug> get postsubmitSupportedRepos => (super.noSuchMethod(
+  Set<_i14.RepositorySlug> get postsubmitSupportedRepos => (super.noSuchMethod(
         Invocation.getter(#postsubmitSupportedRepos),
-        returnValue: <_i13.RepositorySlug>{},
-      ) as Set<_i13.RepositorySlug>);
+        returnValue: <_i14.RepositorySlug>{},
+      ) as Set<_i14.RepositorySlug>);
 
   @override
   String get autosubmitBot => (super.noSuchMethod(
         Invocation.getter(#autosubmitBot),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#autosubmitBot),
         ),
       ) as String);
 
   @override
-  _i10.Logging get loggingService => (super.noSuchMethod(
+  _i11.Logging get loggingService => (super.noSuchMethod(
         Invocation.getter(#loggingService),
-        returnValue: _FakeLogging_12(
+        returnValue: _FakeLogging_16(
           this,
           Invocation.getter(#loggingService),
         ),
-      ) as _i10.Logging);
+      ) as _i11.Logging);
 
   @override
-  _i20.Future<String> get githubPrivateKey => (super.noSuchMethod(
+  _i21.Future<String> get githubPrivateKey => (super.noSuchMethod(
         Invocation.getter(#githubPrivateKey),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.getter(#githubPrivateKey),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<String> get overrideTreeStatusLabel => (super.noSuchMethod(
+  _i21.Future<String> get overrideTreeStatusLabel => (super.noSuchMethod(
         Invocation.getter(#overrideTreeStatusLabel),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.getter(#overrideTreeStatusLabel),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<String> get githubPublicKey => (super.noSuchMethod(
+  _i21.Future<String> get githubPublicKey => (super.noSuchMethod(
         Invocation.getter(#githubPublicKey),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.getter(#githubPublicKey),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<String> get githubAppId => (super.noSuchMethod(
+  _i21.Future<String> get githubAppId => (super.noSuchMethod(
         Invocation.getter(#githubAppId),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.getter(#githubAppId),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<Map<String, dynamic>> get githubAppInstallations => (super.noSuchMethod(
+  _i21.Future<Map<String, dynamic>> get githubAppInstallations => (super.noSuchMethod(
         Invocation.getter(#githubAppInstallations),
-        returnValue: _i20.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
-      ) as _i20.Future<Map<String, dynamic>>);
+        returnValue: _i21.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
+      ) as _i21.Future<Map<String, dynamic>>);
 
   @override
   String get defaultRecipeBundleRef => (super.noSuchMethod(
         Invocation.getter(#defaultRecipeBundleRef),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#defaultRecipeBundleRef),
         ),
       ) as String);
 
   @override
-  _i11.DatastoreDB get db => (super.noSuchMethod(
+  _i12.DatastoreDB get db => (super.noSuchMethod(
         Invocation.getter(#db),
-        returnValue: _FakeDatastoreDB_13(
+        returnValue: _FakeDatastoreDB_17(
           this,
           Invocation.getter(#db),
         ),
-      ) as _i11.DatastoreDB);
+      ) as _i12.DatastoreDB);
 
   @override
   int get schedulingShardSize => (super.noSuchMethod(
@@ -1776,42 +2004,42 @@
       ) as int);
 
   @override
-  _i20.Future<List<String>> get releaseAccounts => (super.noSuchMethod(
+  _i21.Future<List<String>> get releaseAccounts => (super.noSuchMethod(
         Invocation.getter(#releaseAccounts),
-        returnValue: _i20.Future<List<String>>.value(<String>[]),
-      ) as _i20.Future<List<String>>);
+        returnValue: _i21.Future<List<String>>.value(<String>[]),
+      ) as _i21.Future<List<String>>);
 
   @override
-  _i20.Future<String> get oauthClientId => (super.noSuchMethod(
+  _i21.Future<String> get oauthClientId => (super.noSuchMethod(
         Invocation.getter(#oauthClientId),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.getter(#oauthClientId),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<String> get frobWebhookKey => (super.noSuchMethod(
+  _i21.Future<String> get frobWebhookKey => (super.noSuchMethod(
         Invocation.getter(#frobWebhookKey),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.getter(#frobWebhookKey),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<String> get githubOAuthToken => (super.noSuchMethod(
+  _i21.Future<String> get githubOAuthToken => (super.noSuchMethod(
         Invocation.getter(#githubOAuthToken),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.getter(#githubOAuthToken),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
   String get wrongBaseBranchPullRequestMessage => (super.noSuchMethod(
         Invocation.getter(#wrongBaseBranchPullRequestMessage),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#wrongBaseBranchPullRequestMessage),
         ),
@@ -1820,25 +2048,25 @@
   @override
   String get releaseBranchPullRequestMessage => (super.noSuchMethod(
         Invocation.getter(#releaseBranchPullRequestMessage),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#releaseBranchPullRequestMessage),
         ),
       ) as String);
 
   @override
-  _i20.Future<String> get webhookKey => (super.noSuchMethod(
+  _i21.Future<String> get webhookKey => (super.noSuchMethod(
         Invocation.getter(#webhookKey),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.getter(#webhookKey),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
   String get mergeConflictPullRequestMessage => (super.noSuchMethod(
         Invocation.getter(#mergeConflictPullRequestMessage),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#mergeConflictPullRequestMessage),
         ),
@@ -1847,7 +2075,7 @@
   @override
   String get missingTestsPullRequestMessage => (super.noSuchMethod(
         Invocation.getter(#missingTestsPullRequestMessage),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#missingTestsPullRequestMessage),
         ),
@@ -1856,7 +2084,7 @@
   @override
   String get flutterGoldPending => (super.noSuchMethod(
         Invocation.getter(#flutterGoldPending),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#flutterGoldPending),
         ),
@@ -1865,7 +2093,7 @@
   @override
   String get flutterGoldSuccess => (super.noSuchMethod(
         Invocation.getter(#flutterGoldSuccess),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#flutterGoldSuccess),
         ),
@@ -1874,7 +2102,7 @@
   @override
   String get flutterGoldChanges => (super.noSuchMethod(
         Invocation.getter(#flutterGoldChanges),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#flutterGoldChanges),
         ),
@@ -1883,7 +2111,7 @@
   @override
   String get flutterGoldStalePR => (super.noSuchMethod(
         Invocation.getter(#flutterGoldStalePR),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#flutterGoldStalePR),
         ),
@@ -1892,7 +2120,7 @@
   @override
   String get flutterGoldDraftChange => (super.noSuchMethod(
         Invocation.getter(#flutterGoldDraftChange),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#flutterGoldDraftChange),
         ),
@@ -1917,13 +2145,13 @@
       ) as int);
 
   @override
-  _i12.KeyHelper get keyHelper => (super.noSuchMethod(
+  _i13.KeyHelper get keyHelper => (super.noSuchMethod(
         Invocation.getter(#keyHelper),
-        returnValue: _FakeKeyHelper_14(
+        returnValue: _FakeKeyHelper_18(
           this,
           Invocation.getter(#keyHelper),
         ),
-      ) as _i12.KeyHelper);
+      ) as _i13.KeyHelper);
 
   @override
   int get maxRecords => (super.noSuchMethod(
@@ -1934,7 +2162,7 @@
   @override
   Duration get githubRequestDelay => (super.noSuchMethod(
         Invocation.getter(#githubRequestDelay),
-        returnValue: _FakeDuration_15(
+        returnValue: _FakeDuration_19(
           this,
           Invocation.getter(#githubRequestDelay),
         ),
@@ -1943,7 +2171,7 @@
   @override
   String get flutterBuild => (super.noSuchMethod(
         Invocation.getter(#flutterBuild),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#flutterBuild),
         ),
@@ -1952,7 +2180,7 @@
   @override
   String get flutterBuildDescription => (super.noSuchMethod(
         Invocation.getter(#flutterBuildDescription),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#flutterBuildDescription),
         ),
@@ -1961,7 +2189,7 @@
   @override
   String get waitingForTreeToGoGreenLabelName => (super.noSuchMethod(
         Invocation.getter(#waitingForTreeToGoGreenLabelName),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#waitingForTreeToGoGreenLabelName),
         ),
@@ -1974,13 +2202,13 @@
       ) as Set<String>);
 
   @override
-  _i20.Future<Iterable<_i33.Branch>> getBranches(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<Iterable<_i35.Branch>> getBranches(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #getBranches,
           [slug],
         ),
-        returnValue: _i20.Future<Iterable<_i33.Branch>>.value(<_i33.Branch>[]),
-      ) as _i20.Future<Iterable<_i33.Branch>>);
+        returnValue: _i21.Future<Iterable<_i35.Branch>>.value(<_i35.Branch>[]),
+      ) as _i21.Future<Iterable<_i35.Branch>>);
 
   @override
   String wrongHeadBranchPullRequestMessage(String? branch) => (super.noSuchMethod(
@@ -1988,7 +2216,7 @@
           #wrongHeadBranchPullRequestMessage,
           [branch],
         ),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.method(
             #wrongHeadBranchPullRequestMessage,
@@ -2003,7 +2231,7 @@
           #flutterGoldInitialAlert,
           [url],
         ),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.method(
             #flutterGoldInitialAlert,
@@ -2018,7 +2246,7 @@
           #flutterGoldFollowUpAlert,
           [url],
         ),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.method(
             #flutterGoldFollowUpAlert,
@@ -2028,12 +2256,12 @@
       ) as String);
 
   @override
-  String flutterGoldAlertConstant(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  String flutterGoldAlertConstant(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #flutterGoldAlertConstant,
           [slug],
         ),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.method(
             #flutterGoldAlertConstant,
@@ -2043,12 +2271,12 @@
       ) as String);
 
   @override
-  String flutterGoldCommentID(_i13.PullRequest? pr) => (super.noSuchMethod(
+  String flutterGoldCommentID(_i14.PullRequest? pr) => (super.noSuchMethod(
         Invocation.method(
           #flutterGoldCommentID,
           [pr],
         ),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.method(
             #flutterGoldCommentID,
@@ -2058,39 +2286,39 @@
       ) as String);
 
   @override
-  _i20.Future<String> generateJsonWebToken() => (super.noSuchMethod(
+  _i21.Future<String> generateJsonWebToken() => (super.noSuchMethod(
         Invocation.method(
           #generateJsonWebToken,
           [],
         ),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.method(
             #generateJsonWebToken,
             [],
           ),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<String> generateGithubToken(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<String> generateGithubToken(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #generateGithubToken,
           [slug],
         ),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.method(
             #generateGithubToken,
             [slug],
           ),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<_i13.GitHub> createGitHubClient({
-    _i13.PullRequest? pullRequest,
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitHub> createGitHubClient({
+    _i14.PullRequest? pullRequest,
+    _i14.RepositorySlug? slug,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2101,7 +2329,7 @@
             #slug: slug,
           },
         ),
-        returnValue: _i20.Future<_i13.GitHub>.value(_FakeGitHub_16(
+        returnValue: _i21.Future<_i14.GitHub>.value(_FakeGitHub_20(
           this,
           Invocation.method(
             #createGitHubClient,
@@ -2112,134 +2340,134 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.GitHub>);
+      ) as _i21.Future<_i14.GitHub>);
 
   @override
-  _i13.GitHub createGitHubClientWithToken(String? token) => (super.noSuchMethod(
+  _i14.GitHub createGitHubClientWithToken(String? token) => (super.noSuchMethod(
         Invocation.method(
           #createGitHubClientWithToken,
           [token],
         ),
-        returnValue: _FakeGitHub_16(
+        returnValue: _FakeGitHub_20(
           this,
           Invocation.method(
             #createGitHubClientWithToken,
             [token],
           ),
         ),
-      ) as _i13.GitHub);
+      ) as _i14.GitHub);
 
   @override
-  _i20.Future<_i14.GraphQLClient> createGitHubGraphQLClient() => (super.noSuchMethod(
+  _i21.Future<_i15.GraphQLClient> createGitHubGraphQLClient() => (super.noSuchMethod(
         Invocation.method(
           #createGitHubGraphQLClient,
           [],
         ),
-        returnValue: _i20.Future<_i14.GraphQLClient>.value(_FakeGraphQLClient_17(
+        returnValue: _i21.Future<_i15.GraphQLClient>.value(_FakeGraphQLClient_21(
           this,
           Invocation.method(
             #createGitHubGraphQLClient,
             [],
           ),
         )),
-      ) as _i20.Future<_i14.GraphQLClient>);
+      ) as _i21.Future<_i15.GraphQLClient>);
 
   @override
-  _i20.Future<_i15.FirestoreService> createFirestoreService() => (super.noSuchMethod(
+  _i21.Future<_i16.FirestoreService> createFirestoreService() => (super.noSuchMethod(
         Invocation.method(
           #createFirestoreService,
           [],
         ),
-        returnValue: _i20.Future<_i15.FirestoreService>.value(_FakeFirestoreService_18(
+        returnValue: _i21.Future<_i16.FirestoreService>.value(_FakeFirestoreService_22(
           this,
           Invocation.method(
             #createFirestoreService,
             [],
           ),
         )),
-      ) as _i20.Future<_i15.FirestoreService>);
+      ) as _i21.Future<_i16.FirestoreService>);
 
   @override
-  _i20.Future<_i16.BigqueryService> createBigQueryService() => (super.noSuchMethod(
+  _i21.Future<_i17.BigqueryService> createBigQueryService() => (super.noSuchMethod(
         Invocation.method(
           #createBigQueryService,
           [],
         ),
-        returnValue: _i20.Future<_i16.BigqueryService>.value(_FakeBigqueryService_19(
+        returnValue: _i21.Future<_i17.BigqueryService>.value(_FakeBigqueryService_23(
           this,
           Invocation.method(
             #createBigQueryService,
             [],
           ),
         )),
-      ) as _i20.Future<_i16.BigqueryService>);
+      ) as _i21.Future<_i17.BigqueryService>);
 
   @override
-  _i20.Future<_i6.TabledataResource> createTabledataResourceApi() => (super.noSuchMethod(
+  _i21.Future<_i6.TabledataResource> createTabledataResourceApi() => (super.noSuchMethod(
         Invocation.method(
           #createTabledataResourceApi,
           [],
         ),
-        returnValue: _i20.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
+        returnValue: _i21.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
           this,
           Invocation.method(
             #createTabledataResourceApi,
             [],
           ),
         )),
-      ) as _i20.Future<_i6.TabledataResource>);
+      ) as _i21.Future<_i6.TabledataResource>);
 
   @override
-  _i20.Future<_i17.GithubService> createDefaultGitHubService() => (super.noSuchMethod(
+  _i21.Future<_i18.GithubService> createDefaultGitHubService() => (super.noSuchMethod(
         Invocation.method(
           #createDefaultGitHubService,
           [],
         ),
-        returnValue: _i20.Future<_i17.GithubService>.value(_FakeGithubService_20(
+        returnValue: _i21.Future<_i18.GithubService>.value(_FakeGithubService_24(
           this,
           Invocation.method(
             #createDefaultGitHubService,
             [],
           ),
         )),
-      ) as _i20.Future<_i17.GithubService>);
+      ) as _i21.Future<_i18.GithubService>);
 
   @override
-  _i20.Future<_i17.GithubService> createGithubService(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<_i18.GithubService> createGithubService(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #createGithubService,
           [slug],
         ),
-        returnValue: _i20.Future<_i17.GithubService>.value(_FakeGithubService_20(
+        returnValue: _i21.Future<_i18.GithubService>.value(_FakeGithubService_24(
           this,
           Invocation.method(
             #createGithubService,
             [slug],
           ),
         )),
-      ) as _i20.Future<_i17.GithubService>);
+      ) as _i21.Future<_i18.GithubService>);
 
   @override
-  _i17.GithubService createGithubServiceWithToken(String? token) => (super.noSuchMethod(
+  _i18.GithubService createGithubServiceWithToken(String? token) => (super.noSuchMethod(
         Invocation.method(
           #createGithubServiceWithToken,
           [token],
         ),
-        returnValue: _FakeGithubService_20(
+        returnValue: _FakeGithubService_24(
           this,
           Invocation.method(
             #createGithubServiceWithToken,
             [token],
           ),
         ),
-      ) as _i17.GithubService);
+      ) as _i18.GithubService);
 }
 
 /// A class which mocks [DatastoreService].
 ///
 /// See the documentation for Mockito's code generation for more information.
 // ignore: must_be_immutable
-class MockDatastoreService extends _i1.Mock implements _i9.DatastoreService {
+class MockDatastoreService extends _i1.Mock implements _i10.DatastoreService {
   MockDatastoreService() {
     _i1.throwOnMissingStub(this);
   }
@@ -2251,29 +2479,29 @@
       ) as int);
 
   @override
-  _i11.DatastoreDB get db => (super.noSuchMethod(
+  _i12.DatastoreDB get db => (super.noSuchMethod(
         Invocation.getter(#db),
-        returnValue: _FakeDatastoreDB_13(
+        returnValue: _FakeDatastoreDB_17(
           this,
           Invocation.getter(#db),
         ),
-      ) as _i11.DatastoreDB);
+      ) as _i12.DatastoreDB);
 
   @override
-  _i29.RetryOptions get retryOptions => (super.noSuchMethod(
+  _i31.RetryOptions get retryOptions => (super.noSuchMethod(
         Invocation.getter(#retryOptions),
-        returnValue: _i30.dummyValue<_i29.RetryOptions>(
+        returnValue: _i32.dummyValue<_i31.RetryOptions>(
           this,
           Invocation.getter(#retryOptions),
         ),
-      ) as _i29.RetryOptions);
+      ) as _i31.RetryOptions);
 
   @override
-  _i20.Stream<_i34.Commit> queryRecentCommits({
+  _i21.Stream<_i36.Commit> queryRecentCommits({
     int? limit = 100,
     int? timestamp,
     String? branch,
-    required _i13.RepositorySlug? slug,
+    required _i14.RepositorySlug? slug,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2286,20 +2514,20 @@
             #slug: slug,
           },
         ),
-        returnValue: _i20.Stream<_i34.Commit>.empty(),
-      ) as _i20.Stream<_i34.Commit>);
+        returnValue: _i21.Stream<_i36.Commit>.empty(),
+      ) as _i21.Stream<_i36.Commit>);
 
   @override
-  _i20.Stream<_i33.Branch> queryBranches() => (super.noSuchMethod(
+  _i21.Stream<_i35.Branch> queryBranches() => (super.noSuchMethod(
         Invocation.method(
           #queryBranches,
           [],
         ),
-        returnValue: _i20.Stream<_i33.Branch>.empty(),
-      ) as _i20.Stream<_i33.Branch>);
+        returnValue: _i21.Stream<_i35.Branch>.empty(),
+      ) as _i21.Stream<_i35.Branch>);
 
   @override
-  _i20.Stream<_i35.Task> queryRecentTasksByName({
+  _i21.Stream<_i37.Task> queryRecentTasksByName({
     int? limit = 100,
     required String? name,
   }) =>
@@ -2312,15 +2540,15 @@
             #name: name,
           },
         ),
-        returnValue: _i20.Stream<_i35.Task>.empty(),
-      ) as _i20.Stream<_i35.Task>);
+        returnValue: _i21.Stream<_i37.Task>.empty(),
+      ) as _i21.Stream<_i37.Task>);
 
   @override
-  _i20.Stream<_i35.FullTask> queryRecentTasks({
+  _i21.Stream<_i37.FullTask> queryRecentTasks({
     String? taskName,
     int? commitLimit = 20,
     String? branch,
-    required _i13.RepositorySlug? slug,
+    required _i14.RepositorySlug? slug,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2333,22 +2561,22 @@
             #slug: slug,
           },
         ),
-        returnValue: _i20.Stream<_i35.FullTask>.empty(),
-      ) as _i20.Stream<_i35.FullTask>);
+        returnValue: _i21.Stream<_i37.FullTask>.empty(),
+      ) as _i21.Stream<_i37.FullTask>);
 
   @override
-  _i20.Future<List<_i36.Stage>> queryTasksGroupedByStage(_i34.Commit? commit) => (super.noSuchMethod(
+  _i21.Future<List<_i38.Stage>> queryTasksGroupedByStage(_i36.Commit? commit) => (super.noSuchMethod(
         Invocation.method(
           #queryTasksGroupedByStage,
           [commit],
         ),
-        returnValue: _i20.Future<List<_i36.Stage>>.value(<_i36.Stage>[]),
-      ) as _i20.Future<List<_i36.Stage>>);
+        returnValue: _i21.Future<List<_i38.Stage>>.value(<_i38.Stage>[]),
+      ) as _i21.Future<List<_i38.Stage>>);
 
   @override
-  _i20.Future<_i18.GithubBuildStatusUpdate> queryLastStatusUpdate(
-    _i13.RepositorySlug? slug,
-    _i13.PullRequest? pr,
+  _i21.Future<_i19.GithubBuildStatusUpdate> queryLastStatusUpdate(
+    _i14.RepositorySlug? slug,
+    _i14.PullRequest? pr,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2358,7 +2586,7 @@
             pr,
           ],
         ),
-        returnValue: _i20.Future<_i18.GithubBuildStatusUpdate>.value(_FakeGithubBuildStatusUpdate_21(
+        returnValue: _i21.Future<_i19.GithubBuildStatusUpdate>.value(_FakeGithubBuildStatusUpdate_25(
           this,
           Invocation.method(
             #queryLastStatusUpdate,
@@ -2368,12 +2596,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i18.GithubBuildStatusUpdate>);
+      ) as _i21.Future<_i19.GithubBuildStatusUpdate>);
 
   @override
-  _i20.Future<_i19.GithubGoldStatusUpdate> queryLastGoldUpdate(
-    _i13.RepositorySlug? slug,
-    _i13.PullRequest? pr,
+  _i21.Future<_i20.GithubGoldStatusUpdate> queryLastGoldUpdate(
+    _i14.RepositorySlug? slug,
+    _i14.PullRequest? pr,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2383,7 +2611,7 @@
             pr,
           ],
         ),
-        returnValue: _i20.Future<_i19.GithubGoldStatusUpdate>.value(_FakeGithubGoldStatusUpdate_22(
+        returnValue: _i21.Future<_i20.GithubGoldStatusUpdate>.value(_FakeGithubGoldStatusUpdate_26(
           this,
           Invocation.method(
             #queryLastGoldUpdate,
@@ -2393,40 +2621,40 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i19.GithubGoldStatusUpdate>);
+      ) as _i21.Future<_i20.GithubGoldStatusUpdate>);
 
   @override
-  _i20.Future<List<List<_i11.Model<dynamic>>>> shard(List<_i11.Model<dynamic>>? rows) => (super.noSuchMethod(
+  _i21.Future<List<List<_i12.Model<dynamic>>>> shard(List<_i12.Model<dynamic>>? rows) => (super.noSuchMethod(
         Invocation.method(
           #shard,
           [rows],
         ),
-        returnValue: _i20.Future<List<List<_i11.Model<dynamic>>>>.value(<List<_i11.Model<dynamic>>>[]),
-      ) as _i20.Future<List<List<_i11.Model<dynamic>>>>);
+        returnValue: _i21.Future<List<List<_i12.Model<dynamic>>>>.value(<List<_i12.Model<dynamic>>>[]),
+      ) as _i21.Future<List<List<_i12.Model<dynamic>>>>);
 
   @override
-  _i20.Future<void> insert(List<_i11.Model<dynamic>>? rows) => (super.noSuchMethod(
+  _i21.Future<void> insert(List<_i12.Model<dynamic>>? rows) => (super.noSuchMethod(
         Invocation.method(
           #insert,
           [rows],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<List<T?>> lookupByKey<T extends _i11.Model<dynamic>>(List<_i11.Key<dynamic>>? keys) =>
+  _i21.Future<List<T?>> lookupByKey<T extends _i12.Model<dynamic>>(List<_i12.Key<dynamic>>? keys) =>
       (super.noSuchMethod(
         Invocation.method(
           #lookupByKey,
           [keys],
         ),
-        returnValue: _i20.Future<List<T?>>.value(<T?>[]),
-      ) as _i20.Future<List<T?>>);
+        returnValue: _i21.Future<List<T?>>.value(<T?>[]),
+      ) as _i21.Future<List<T?>>);
 
   @override
-  _i20.Future<T> lookupByValue<T extends _i11.Model<dynamic>>(
-    _i11.Key<dynamic>? key, {
+  _i21.Future<T> lookupByValue<T extends _i12.Model<dynamic>>(
+    _i12.Key<dynamic>? key, {
     T Function()? orElse,
   }) =>
       (super.noSuchMethod(
@@ -2435,8 +2663,8 @@
           [key],
           {#orElse: orElse},
         ),
-        returnValue: _i30.ifNotNull(
-              _i30.dummyValueOrNull<T>(
+        returnValue: _i32.ifNotNull(
+              _i32.dummyValueOrNull<T>(
                 this,
                 Invocation.method(
                   #lookupByValue,
@@ -2444,9 +2672,9 @@
                   {#orElse: orElse},
                 ),
               ),
-              (T v) => _i20.Future<T>.value(v),
+              (T v) => _i21.Future<T>.value(v),
             ) ??
-            _FakeFuture_23<T>(
+            _FakeFuture_27<T>(
               this,
               Invocation.method(
                 #lookupByValue,
@@ -2454,19 +2682,19 @@
                 {#orElse: orElse},
               ),
             ),
-      ) as _i20.Future<T>);
+      ) as _i21.Future<T>);
 
   @override
-  _i20.Future<T?> withTransaction<T>(_i20.Future<T> Function(_i11.Transaction)? handler) => (super.noSuchMethod(
+  _i21.Future<T?> withTransaction<T>(_i21.Future<T> Function(_i12.Transaction)? handler) => (super.noSuchMethod(
         Invocation.method(
           #withTransaction,
           [handler],
         ),
-        returnValue: _i20.Future<T?>.value(),
-      ) as _i20.Future<T?>);
+        returnValue: _i21.Future<T?>.value(),
+      ) as _i21.Future<T?>);
 
   @override
-  _i20.Future<_i35.Task?> getTaskFromBuildbucketBuild(
+  _i21.Future<_i37.Task?> getTaskFromBuildbucketBuild(
     _i8.Build? build, {
     String? customName,
   }) =>
@@ -2476,26 +2704,40 @@
           [build],
           {#customName: customName},
         ),
-        returnValue: _i20.Future<_i35.Task?>.value(),
-      ) as _i20.Future<_i35.Task?>);
+        returnValue: _i21.Future<_i37.Task?>.value(),
+      ) as _i21.Future<_i37.Task?>);
+
+  @override
+  _i21.Future<_i37.Task?> getTaskFromBuildbucketV2Build(
+    _i9.Build? build, {
+    String? customName,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTaskFromBuildbucketV2Build,
+          [build],
+          {#customName: customName},
+        ),
+        returnValue: _i21.Future<_i37.Task?>.value(),
+      ) as _i21.Future<_i37.Task?>);
 }
 
 /// A class which mocks [FakeEntry].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockFakeEntry extends _i1.Mock implements _i37.FakeEntry {
+class MockFakeEntry extends _i1.Mock implements _i39.FakeEntry {
   MockFakeEntry() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i38.Uint8List get value => (super.noSuchMethod(
+  _i40.Uint8List get value => (super.noSuchMethod(
         Invocation.getter(#value),
-        returnValue: _i38.Uint8List(0),
-      ) as _i38.Uint8List);
+        returnValue: _i40.Uint8List(0),
+      ) as _i40.Uint8List);
 
   @override
-  set value(_i38.Uint8List? _value) => super.noSuchMethod(
+  set value(_i40.Uint8List? _value) => super.noSuchMethod(
         Invocation.setter(
           #value,
           _value,
@@ -2504,8 +2746,8 @@
       );
 
   @override
-  _i20.Future<_i38.Uint8List> get([
-    _i20.Future<_i38.Uint8List?> Function()? create,
+  _i21.Future<_i40.Uint8List> get([
+    _i21.Future<_i40.Uint8List?> Function()? create,
     Duration? ttl,
   ]) =>
       (super.noSuchMethod(
@@ -2516,23 +2758,23 @@
             ttl,
           ],
         ),
-        returnValue: _i20.Future<_i38.Uint8List>.value(_i38.Uint8List(0)),
-      ) as _i20.Future<_i38.Uint8List>);
+        returnValue: _i21.Future<_i40.Uint8List>.value(_i40.Uint8List(0)),
+      ) as _i21.Future<_i40.Uint8List>);
 
   @override
-  _i20.Future<void> purge({int? retries = 0}) => (super.noSuchMethod(
+  _i21.Future<void> purge({int? retries = 0}) => (super.noSuchMethod(
         Invocation.method(
           #purge,
           [],
           {#retries: retries},
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<_i38.Uint8List?> set(
-    _i38.Uint8List? value, [
+  _i21.Future<_i40.Uint8List?> set(
+    _i40.Uint8List? value, [
     Duration? ttl,
   ]) =>
       (super.noSuchMethod(
@@ -2543,14 +2785,14 @@
             ttl,
           ],
         ),
-        returnValue: _i20.Future<_i38.Uint8List?>.value(),
-      ) as _i20.Future<_i38.Uint8List?>);
+        returnValue: _i21.Future<_i40.Uint8List?>.value(),
+      ) as _i21.Future<_i40.Uint8List?>);
 }
 
 /// A class which mocks [FirestoreService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockFirestoreService extends _i1.Mock implements _i15.FirestoreService {
+class MockFirestoreService extends _i1.Mock implements _i16.FirestoreService {
   MockFirestoreService() {
     _i1.throwOnMissingStub(this);
   }
@@ -2565,39 +2807,39 @@
       ) as _i5.AccessClientProvider);
 
   @override
-  _i20.Future<_i21.ProjectsDatabasesDocumentsResource> documentResource() => (super.noSuchMethod(
+  _i21.Future<_i22.ProjectsDatabasesDocumentsResource> documentResource() => (super.noSuchMethod(
         Invocation.method(
           #documentResource,
           [],
         ),
         returnValue:
-            _i20.Future<_i21.ProjectsDatabasesDocumentsResource>.value(_FakeProjectsDatabasesDocumentsResource_24(
+            _i21.Future<_i22.ProjectsDatabasesDocumentsResource>.value(_FakeProjectsDatabasesDocumentsResource_28(
           this,
           Invocation.method(
             #documentResource,
             [],
           ),
         )),
-      ) as _i20.Future<_i21.ProjectsDatabasesDocumentsResource>);
+      ) as _i21.Future<_i22.ProjectsDatabasesDocumentsResource>);
 
   @override
-  _i20.Future<_i21.Document> getDocument(String? name) => (super.noSuchMethod(
+  _i21.Future<_i22.Document> getDocument(String? name) => (super.noSuchMethod(
         Invocation.method(
           #getDocument,
           [name],
         ),
-        returnValue: _i20.Future<_i21.Document>.value(_FakeDocument_25(
+        returnValue: _i21.Future<_i22.Document>.value(_FakeDocument_29(
           this,
           Invocation.method(
             #getDocument,
             [name],
           ),
         )),
-      ) as _i20.Future<_i21.Document>);
+      ) as _i21.Future<_i22.Document>);
 
   @override
-  _i20.Future<_i21.BatchWriteResponse> batchWriteDocuments(
-    _i21.BatchWriteRequest? request,
+  _i21.Future<_i22.BatchWriteResponse> batchWriteDocuments(
+    _i22.BatchWriteRequest? request,
     String? database,
   ) =>
       (super.noSuchMethod(
@@ -2608,7 +2850,7 @@
             database,
           ],
         ),
-        returnValue: _i20.Future<_i21.BatchWriteResponse>.value(_FakeBatchWriteResponse_26(
+        returnValue: _i21.Future<_i22.BatchWriteResponse>.value(_FakeBatchWriteResponse_30(
           this,
           Invocation.method(
             #batchWriteDocuments,
@@ -2618,29 +2860,29 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i21.BatchWriteResponse>);
+      ) as _i21.Future<_i22.BatchWriteResponse>);
 
   @override
-  _i20.Future<_i21.CommitResponse> writeViaTransaction(List<_i21.Write>? writes) => (super.noSuchMethod(
+  _i21.Future<_i22.CommitResponse> writeViaTransaction(List<_i22.Write>? writes) => (super.noSuchMethod(
         Invocation.method(
           #writeViaTransaction,
           [writes],
         ),
-        returnValue: _i20.Future<_i21.CommitResponse>.value(_FakeCommitResponse_27(
+        returnValue: _i21.Future<_i22.CommitResponse>.value(_FakeCommitResponse_31(
           this,
           Invocation.method(
             #writeViaTransaction,
             [writes],
           ),
         )),
-      ) as _i20.Future<_i21.CommitResponse>);
+      ) as _i21.Future<_i22.CommitResponse>);
 
   @override
-  _i20.Future<List<_i39.Commit>> queryRecentCommits({
+  _i21.Future<List<_i41.Commit>> queryRecentCommits({
     int? limit = 100,
     int? timestamp,
     String? branch,
-    required _i13.RepositorySlug? slug,
+    required _i14.RepositorySlug? slug,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2653,21 +2895,21 @@
             #slug: slug,
           },
         ),
-        returnValue: _i20.Future<List<_i39.Commit>>.value(<_i39.Commit>[]),
-      ) as _i20.Future<List<_i39.Commit>>);
+        returnValue: _i21.Future<List<_i41.Commit>>.value(<_i41.Commit>[]),
+      ) as _i21.Future<List<_i41.Commit>>);
 
   @override
-  _i20.Future<List<_i40.Task>> queryCommitTasks(String? commitSha) => (super.noSuchMethod(
+  _i21.Future<List<_i42.Task>> queryCommitTasks(String? commitSha) => (super.noSuchMethod(
         Invocation.method(
           #queryCommitTasks,
           [commitSha],
         ),
-        returnValue: _i20.Future<List<_i40.Task>>.value(<_i40.Task>[]),
-      ) as _i20.Future<List<_i40.Task>>);
+        returnValue: _i21.Future<List<_i42.Task>>.value(<_i42.Task>[]),
+      ) as _i21.Future<List<_i42.Task>>);
 
   @override
-  _i20.Future<_i22.GithubGoldStatus> queryLastGoldStatus(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i23.GithubGoldStatus> queryLastGoldStatus(
+    _i14.RepositorySlug? slug,
     int? prNumber,
   ) =>
       (super.noSuchMethod(
@@ -2678,7 +2920,7 @@
             prNumber,
           ],
         ),
-        returnValue: _i20.Future<_i22.GithubGoldStatus>.value(_FakeGithubGoldStatus_28(
+        returnValue: _i21.Future<_i23.GithubGoldStatus>.value(_FakeGithubGoldStatus_32(
           this,
           Invocation.method(
             #queryLastGoldStatus,
@@ -2688,11 +2930,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i22.GithubGoldStatus>);
+      ) as _i21.Future<_i23.GithubGoldStatus>);
 
   @override
-  _i20.Future<_i23.GithubBuildStatus> queryLastBuildStatus(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i24.GithubBuildStatus> queryLastBuildStatus(
+    _i14.RepositorySlug? slug,
     int? prNumber,
     String? head,
   ) =>
@@ -2705,7 +2947,7 @@
             head,
           ],
         ),
-        returnValue: _i20.Future<_i23.GithubBuildStatus>.value(_FakeGithubBuildStatus_29(
+        returnValue: _i21.Future<_i24.GithubBuildStatus>.value(_FakeGithubBuildStatus_33(
           this,
           Invocation.method(
             #queryLastBuildStatus,
@@ -2716,25 +2958,25 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i23.GithubBuildStatus>);
+      ) as _i21.Future<_i24.GithubBuildStatus>);
 
   @override
-  _i21.Value getValueFromFilter(Object? comparisonOject) => (super.noSuchMethod(
+  _i22.Value getValueFromFilter(Object? comparisonOject) => (super.noSuchMethod(
         Invocation.method(
           #getValueFromFilter,
           [comparisonOject],
         ),
-        returnValue: _FakeValue_30(
+        returnValue: _FakeValue_34(
           this,
           Invocation.method(
             #getValueFromFilter,
             [comparisonOject],
           ),
         ),
-      ) as _i21.Value);
+      ) as _i22.Value);
 
   @override
-  _i21.Filter generateFilter(
+  _i22.Filter generateFilter(
     Map<String, Object>? filterMap,
     String? compositeFilterOp,
   ) =>
@@ -2746,7 +2988,7 @@
             compositeFilterOp,
           ],
         ),
-        returnValue: _FakeFilter_31(
+        returnValue: _FakeFilter_35(
           this,
           Invocation.method(
             #generateFilter,
@@ -2756,10 +2998,10 @@
             ],
           ),
         ),
-      ) as _i21.Filter);
+      ) as _i22.Filter);
 
   @override
-  _i20.Future<List<_i21.Document>> query(
+  _i21.Future<List<_i22.Document>> query(
     String? collectionId,
     Map<String, Object>? filterMap, {
     int? limit,
@@ -2779,39 +3021,39 @@
             #compositeFilterOp: compositeFilterOp,
           },
         ),
-        returnValue: _i20.Future<List<_i21.Document>>.value(<_i21.Document>[]),
-      ) as _i20.Future<List<_i21.Document>>);
+        returnValue: _i21.Future<List<_i22.Document>>.value(<_i22.Document>[]),
+      ) as _i21.Future<List<_i22.Document>>);
 
   @override
-  List<_i21.Document> documentsFromQueryResponse(List<_i21.RunQueryResponseElement>? runQueryResponseElements) =>
+  List<_i22.Document> documentsFromQueryResponse(List<_i22.RunQueryResponseElement>? runQueryResponseElements) =>
       (super.noSuchMethod(
         Invocation.method(
           #documentsFromQueryResponse,
           [runQueryResponseElements],
         ),
-        returnValue: <_i21.Document>[],
-      ) as List<_i21.Document>);
+        returnValue: <_i22.Document>[],
+      ) as List<_i22.Document>);
 }
 
 /// A class which mocks [IssuesService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockIssuesService extends _i1.Mock implements _i13.IssuesService {
+class MockIssuesService extends _i1.Mock implements _i14.IssuesService {
   MockIssuesService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i13.GitHub get github => (super.noSuchMethod(
+  _i14.GitHub get github => (super.noSuchMethod(
         Invocation.getter(#github),
-        returnValue: _FakeGitHub_16(
+        returnValue: _FakeGitHub_20(
           this,
           Invocation.getter(#github),
         ),
-      ) as _i13.GitHub);
+      ) as _i14.GitHub);
 
   @override
-  _i20.Stream<_i13.Issue> listAll({
+  _i21.Stream<_i14.Issue> listAll({
     int? milestoneNumber,
     String? state,
     String? direction,
@@ -2834,11 +3076,11 @@
             #labels: labels,
           },
         ),
-        returnValue: _i20.Stream<_i13.Issue>.empty(),
-      ) as _i20.Stream<_i13.Issue>);
+        returnValue: _i21.Stream<_i14.Issue>.empty(),
+      ) as _i21.Stream<_i14.Issue>);
 
   @override
-  _i20.Stream<_i13.Issue> listByUser({
+  _i21.Stream<_i14.Issue> listByUser({
     int? milestoneNumber,
     String? state,
     String? direction,
@@ -2861,11 +3103,11 @@
             #labels: labels,
           },
         ),
-        returnValue: _i20.Stream<_i13.Issue>.empty(),
-      ) as _i20.Stream<_i13.Issue>);
+        returnValue: _i21.Stream<_i14.Issue>.empty(),
+      ) as _i21.Stream<_i14.Issue>);
 
   @override
-  _i20.Stream<_i13.Issue> listByOrg(
+  _i21.Stream<_i14.Issue> listByOrg(
     String? org, {
     int? milestoneNumber,
     String? state,
@@ -2889,12 +3131,12 @@
             #labels: labels,
           },
         ),
-        returnValue: _i20.Stream<_i13.Issue>.empty(),
-      ) as _i20.Stream<_i13.Issue>);
+        returnValue: _i21.Stream<_i14.Issue>.empty(),
+      ) as _i21.Stream<_i14.Issue>);
 
   @override
-  _i20.Stream<_i13.Issue> listByRepo(
-    _i13.RepositorySlug? slug, {
+  _i21.Stream<_i14.Issue> listByRepo(
+    _i14.RepositorySlug? slug, {
     int? milestoneNumber,
     String? state,
     String? direction,
@@ -2917,14 +3159,14 @@
             #labels: labels,
           },
         ),
-        returnValue: _i20.Stream<_i13.Issue>.empty(),
-      ) as _i20.Stream<_i13.Issue>);
+        returnValue: _i21.Stream<_i14.Issue>.empty(),
+      ) as _i21.Stream<_i14.Issue>);
 
   @override
-  _i20.Stream<_i13.Reaction> listReactions(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.Reaction> listReactions(
+    _i14.RepositorySlug? slug,
     int? issueNumber, {
-    _i13.ReactionType? content,
+    _i14.ReactionType? content,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2935,14 +3177,14 @@
           ],
           {#content: content},
         ),
-        returnValue: _i20.Stream<_i13.Reaction>.empty(),
-      ) as _i20.Stream<_i13.Reaction>);
+        returnValue: _i21.Stream<_i14.Reaction>.empty(),
+      ) as _i21.Stream<_i14.Reaction>);
 
   @override
-  _i20.Future<_i13.Issue> edit(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.Issue> edit(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
-    _i13.IssueRequest? issue,
+    _i14.IssueRequest? issue,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -2953,7 +3195,7 @@
             issue,
           ],
         ),
-        returnValue: _i20.Future<_i13.Issue>.value(_FakeIssue_32(
+        returnValue: _i21.Future<_i14.Issue>.value(_FakeIssue_36(
           this,
           Invocation.method(
             #edit,
@@ -2964,11 +3206,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Issue>);
+      ) as _i21.Future<_i14.Issue>);
 
   @override
-  _i20.Future<_i13.Issue> get(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.Issue> get(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
   ) =>
       (super.noSuchMethod(
@@ -2979,7 +3221,7 @@
             issueNumber,
           ],
         ),
-        returnValue: _i20.Future<_i13.Issue>.value(_FakeIssue_32(
+        returnValue: _i21.Future<_i14.Issue>.value(_FakeIssue_36(
           this,
           Invocation.method(
             #get,
@@ -2989,12 +3231,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Issue>);
+      ) as _i21.Future<_i14.Issue>);
 
   @override
-  _i20.Future<_i13.Issue> create(
-    _i13.RepositorySlug? slug,
-    _i13.IssueRequest? issue,
+  _i21.Future<_i14.Issue> create(
+    _i14.RepositorySlug? slug,
+    _i14.IssueRequest? issue,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3004,7 +3246,7 @@
             issue,
           ],
         ),
-        returnValue: _i20.Future<_i13.Issue>.value(_FakeIssue_32(
+        returnValue: _i21.Future<_i14.Issue>.value(_FakeIssue_36(
           this,
           Invocation.method(
             #create,
@@ -3014,20 +3256,20 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Issue>);
+      ) as _i21.Future<_i14.Issue>);
 
   @override
-  _i20.Stream<_i13.User> listAssignees(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.User> listAssignees(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listAssignees,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.User>.empty(),
-      ) as _i20.Stream<_i13.User>);
+        returnValue: _i21.Stream<_i14.User>.empty(),
+      ) as _i21.Stream<_i14.User>);
 
   @override
-  _i20.Future<bool> isAssignee(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> isAssignee(
+    _i14.RepositorySlug? slug,
     String? repoName,
   ) =>
       (super.noSuchMethod(
@@ -3038,12 +3280,12 @@
             repoName,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.IssueComment> listCommentsByIssue(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.IssueComment> listCommentsByIssue(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
   ) =>
       (super.noSuchMethod(
@@ -3054,21 +3296,21 @@
             issueNumber,
           ],
         ),
-        returnValue: _i20.Stream<_i13.IssueComment>.empty(),
-      ) as _i20.Stream<_i13.IssueComment>);
+        returnValue: _i21.Stream<_i14.IssueComment>.empty(),
+      ) as _i21.Stream<_i14.IssueComment>);
 
   @override
-  _i20.Stream<_i13.IssueComment> listCommentsByRepo(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.IssueComment> listCommentsByRepo(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listCommentsByRepo,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.IssueComment>.empty(),
-      ) as _i20.Stream<_i13.IssueComment>);
+        returnValue: _i21.Stream<_i14.IssueComment>.empty(),
+      ) as _i21.Stream<_i14.IssueComment>);
 
   @override
-  _i20.Future<_i13.IssueComment> getComment(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.IssueComment> getComment(
+    _i14.RepositorySlug? slug,
     int? id,
   ) =>
       (super.noSuchMethod(
@@ -3079,7 +3321,7 @@
             id,
           ],
         ),
-        returnValue: _i20.Future<_i13.IssueComment>.value(_FakeIssueComment_33(
+        returnValue: _i21.Future<_i14.IssueComment>.value(_FakeIssueComment_37(
           this,
           Invocation.method(
             #getComment,
@@ -3089,11 +3331,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.IssueComment>);
+      ) as _i21.Future<_i14.IssueComment>);
 
   @override
-  _i20.Future<_i13.IssueComment> createComment(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.IssueComment> createComment(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
     String? body,
   ) =>
@@ -3106,7 +3348,7 @@
             body,
           ],
         ),
-        returnValue: _i20.Future<_i13.IssueComment>.value(_FakeIssueComment_33(
+        returnValue: _i21.Future<_i14.IssueComment>.value(_FakeIssueComment_37(
           this,
           Invocation.method(
             #createComment,
@@ -3117,11 +3359,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.IssueComment>);
+      ) as _i21.Future<_i14.IssueComment>);
 
   @override
-  _i20.Future<_i13.IssueComment> updateComment(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.IssueComment> updateComment(
+    _i14.RepositorySlug? slug,
     int? id,
     String? body,
   ) =>
@@ -3134,7 +3376,7 @@
             body,
           ],
         ),
-        returnValue: _i20.Future<_i13.IssueComment>.value(_FakeIssueComment_33(
+        returnValue: _i21.Future<_i14.IssueComment>.value(_FakeIssueComment_37(
           this,
           Invocation.method(
             #updateComment,
@@ -3145,11 +3387,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.IssueComment>);
+      ) as _i21.Future<_i14.IssueComment>);
 
   @override
-  _i20.Future<bool> deleteComment(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> deleteComment(
+    _i14.RepositorySlug? slug,
     int? id,
   ) =>
       (super.noSuchMethod(
@@ -3160,21 +3402,21 @@
             id,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.IssueLabel> listLabels(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.IssueLabel> listLabels(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listLabels,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.IssueLabel>.empty(),
-      ) as _i20.Stream<_i13.IssueLabel>);
+        returnValue: _i21.Stream<_i14.IssueLabel>.empty(),
+      ) as _i21.Stream<_i14.IssueLabel>);
 
   @override
-  _i20.Future<_i13.IssueLabel> getLabel(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.IssueLabel> getLabel(
+    _i14.RepositorySlug? slug,
     String? name,
   ) =>
       (super.noSuchMethod(
@@ -3185,7 +3427,7 @@
             name,
           ],
         ),
-        returnValue: _i20.Future<_i13.IssueLabel>.value(_FakeIssueLabel_34(
+        returnValue: _i21.Future<_i14.IssueLabel>.value(_FakeIssueLabel_38(
           this,
           Invocation.method(
             #getLabel,
@@ -3195,11 +3437,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.IssueLabel>);
+      ) as _i21.Future<_i14.IssueLabel>);
 
   @override
-  _i20.Future<_i13.IssueLabel> createLabel(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.IssueLabel> createLabel(
+    _i14.RepositorySlug? slug,
     String? name, {
     String? color,
     String? description,
@@ -3216,7 +3458,7 @@
             #description: description,
           },
         ),
-        returnValue: _i20.Future<_i13.IssueLabel>.value(_FakeIssueLabel_34(
+        returnValue: _i21.Future<_i14.IssueLabel>.value(_FakeIssueLabel_38(
           this,
           Invocation.method(
             #createLabel,
@@ -3230,11 +3472,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.IssueLabel>);
+      ) as _i21.Future<_i14.IssueLabel>);
 
   @override
-  _i20.Future<_i13.IssueLabel> editLabel(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.IssueLabel> editLabel(
+    _i14.RepositorySlug? slug,
     String? name,
     String? color,
   ) =>
@@ -3247,7 +3489,7 @@
             color,
           ],
         ),
-        returnValue: _i20.Future<_i13.IssueLabel>.value(_FakeIssueLabel_34(
+        returnValue: _i21.Future<_i14.IssueLabel>.value(_FakeIssueLabel_38(
           this,
           Invocation.method(
             #editLabel,
@@ -3258,11 +3500,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.IssueLabel>);
+      ) as _i21.Future<_i14.IssueLabel>);
 
   @override
-  _i20.Future<_i13.IssueLabel> updateLabel(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.IssueLabel> updateLabel(
+    _i14.RepositorySlug? slug,
     String? name, {
     String? newName,
     String? color,
@@ -3281,7 +3523,7 @@
             #description: description,
           },
         ),
-        returnValue: _i20.Future<_i13.IssueLabel>.value(_FakeIssueLabel_34(
+        returnValue: _i21.Future<_i14.IssueLabel>.value(_FakeIssueLabel_38(
           this,
           Invocation.method(
             #updateLabel,
@@ -3296,11 +3538,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.IssueLabel>);
+      ) as _i21.Future<_i14.IssueLabel>);
 
   @override
-  _i20.Future<bool> deleteLabel(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> deleteLabel(
+    _i14.RepositorySlug? slug,
     String? name,
   ) =>
       (super.noSuchMethod(
@@ -3311,12 +3553,12 @@
             name,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.IssueLabel> listLabelsByIssue(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.IssueLabel> listLabelsByIssue(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
   ) =>
       (super.noSuchMethod(
@@ -3327,12 +3569,12 @@
             issueNumber,
           ],
         ),
-        returnValue: _i20.Stream<_i13.IssueLabel>.empty(),
-      ) as _i20.Stream<_i13.IssueLabel>);
+        returnValue: _i21.Stream<_i14.IssueLabel>.empty(),
+      ) as _i21.Stream<_i14.IssueLabel>);
 
   @override
-  _i20.Future<List<_i13.IssueLabel>> addLabelsToIssue(
-    _i13.RepositorySlug? slug,
+  _i21.Future<List<_i14.IssueLabel>> addLabelsToIssue(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
     List<String>? labels,
   ) =>
@@ -3345,12 +3587,12 @@
             labels,
           ],
         ),
-        returnValue: _i20.Future<List<_i13.IssueLabel>>.value(<_i13.IssueLabel>[]),
-      ) as _i20.Future<List<_i13.IssueLabel>>);
+        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
+      ) as _i21.Future<List<_i14.IssueLabel>>);
 
   @override
-  _i20.Future<List<_i13.IssueLabel>> replaceLabelsForIssue(
-    _i13.RepositorySlug? slug,
+  _i21.Future<List<_i14.IssueLabel>> replaceLabelsForIssue(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
     List<String>? labels,
   ) =>
@@ -3363,12 +3605,12 @@
             labels,
           ],
         ),
-        returnValue: _i20.Future<List<_i13.IssueLabel>>.value(<_i13.IssueLabel>[]),
-      ) as _i20.Future<List<_i13.IssueLabel>>);
+        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
+      ) as _i21.Future<List<_i14.IssueLabel>>);
 
   @override
-  _i20.Future<bool> removeLabelForIssue(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> removeLabelForIssue(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
     String? label,
   ) =>
@@ -3381,12 +3623,12 @@
             label,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> removeAllLabelsForIssue(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> removeAllLabelsForIssue(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
   ) =>
       (super.noSuchMethod(
@@ -3397,22 +3639,22 @@
             issueNumber,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.Milestone> listMilestones(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.Milestone> listMilestones(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listMilestones,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.Milestone>.empty(),
-      ) as _i20.Stream<_i13.Milestone>);
+        returnValue: _i21.Stream<_i14.Milestone>.empty(),
+      ) as _i21.Stream<_i14.Milestone>);
 
   @override
-  _i20.Future<_i13.Milestone> createMilestone(
-    _i13.RepositorySlug? slug,
-    _i13.CreateMilestone? request,
+  _i21.Future<_i14.Milestone> createMilestone(
+    _i14.RepositorySlug? slug,
+    _i14.CreateMilestone? request,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3422,7 +3664,7 @@
             request,
           ],
         ),
-        returnValue: _i20.Future<_i13.Milestone>.value(_FakeMilestone_35(
+        returnValue: _i21.Future<_i14.Milestone>.value(_FakeMilestone_39(
           this,
           Invocation.method(
             #createMilestone,
@@ -3432,11 +3674,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Milestone>);
+      ) as _i21.Future<_i14.Milestone>);
 
   @override
-  _i20.Future<bool> deleteMilestone(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> deleteMilestone(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -3447,12 +3689,12 @@
             number,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.TimelineEvent> listTimeline(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.TimelineEvent> listTimeline(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
   ) =>
       (super.noSuchMethod(
@@ -3463,12 +3705,12 @@
             issueNumber,
           ],
         ),
-        returnValue: _i20.Stream<_i13.TimelineEvent>.empty(),
-      ) as _i20.Stream<_i13.TimelineEvent>);
+        returnValue: _i21.Stream<_i14.TimelineEvent>.empty(),
+      ) as _i21.Stream<_i14.TimelineEvent>);
 
   @override
-  _i20.Future<void> lock(
-    _i13.RepositorySlug? slug,
+  _i21.Future<void> lock(
+    _i14.RepositorySlug? slug,
     int? number, {
     String? lockReason,
   }) =>
@@ -3481,13 +3723,13 @@
           ],
           {#lockReason: lockReason},
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<void> unlock(
-    _i13.RepositorySlug? slug,
+  _i21.Future<void> unlock(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -3498,15 +3740,15 @@
             number,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 }
 
 /// A class which mocks [GithubChecksService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockGithubChecksService extends _i1.Mock implements _i15.GithubChecksService {
+class MockGithubChecksService extends _i1.Mock implements _i16.GithubChecksService {
   MockGithubChecksService() {
     _i1.throwOnMissingStub(this);
   }
@@ -3530,16 +3772,16 @@
       );
 
   @override
-  _i24.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
+  _i25.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
         Invocation.getter(#githubChecksUtil),
-        returnValue: _FakeGithubChecksUtil_36(
+        returnValue: _FakeGithubChecksUtil_40(
           this,
           Invocation.getter(#githubChecksUtil),
         ),
-      ) as _i24.GithubChecksUtil);
+      ) as _i25.GithubChecksUtil);
 
   @override
-  set githubChecksUtil(_i24.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
+  set githubChecksUtil(_i25.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
         Invocation.setter(
           #githubChecksUtil,
           _githubChecksUtil,
@@ -3548,10 +3790,10 @@
       );
 
   @override
-  _i20.Future<void> handleCheckSuite(
-    _i13.PullRequest? pullRequest,
-    _i32.CheckSuiteEvent? checkSuiteEvent,
-    _i15.Scheduler? scheduler,
+  _i21.Future<void> handleCheckSuite(
+    _i14.PullRequest? pullRequest,
+    _i34.CheckSuiteEvent? checkSuiteEvent,
+    _i16.Scheduler? scheduler,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3562,15 +3804,15 @@
             scheduler,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<bool> updateCheckStatus(
-    _i41.BuildPushMessage? buildPushMessage,
-    _i15.LuciBuildService? luciBuildService,
-    _i13.RepositorySlug? slug, {
+  _i21.Future<bool> updateCheckStatus(
+    _i43.BuildPushMessage? buildPushMessage,
+    _i16.LuciBuildService? luciBuildService,
+    _i14.RepositorySlug? slug, {
     bool? rescheduled = false,
   }) =>
       (super.noSuchMethod(
@@ -3583,11 +3825,11 @@
           ],
           {#rescheduled: rescheduled},
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  bool taskFailed(_i41.BuildPushMessage? buildPushMessage) => (super.noSuchMethod(
+  bool taskFailed(_i43.BuildPushMessage? buildPushMessage) => (super.noSuchMethod(
         Invocation.method(
           #taskFailed,
           [buildPushMessage],
@@ -3596,7 +3838,7 @@
       ) as bool);
 
   @override
-  int currentAttempt(_i41.Build? build) => (super.noSuchMethod(
+  int currentAttempt(_i43.Build? build) => (super.noSuchMethod(
         Invocation.method(
           #currentAttempt,
           [build],
@@ -3610,7 +3852,7 @@
           #getGithubSummary,
           [summary],
         ),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.method(
             #getGithubSummary,
@@ -3620,38 +3862,38 @@
       ) as String);
 
   @override
-  _i13.CheckRunConclusion conclusionForResult(_i41.Result? result) => (super.noSuchMethod(
+  _i14.CheckRunConclusion conclusionForResult(_i43.Result? result) => (super.noSuchMethod(
         Invocation.method(
           #conclusionForResult,
           [result],
         ),
-        returnValue: _FakeCheckRunConclusion_37(
+        returnValue: _FakeCheckRunConclusion_41(
           this,
           Invocation.method(
             #conclusionForResult,
             [result],
           ),
         ),
-      ) as _i13.CheckRunConclusion);
+      ) as _i14.CheckRunConclusion);
 
   @override
-  _i13.CheckRunStatus statusForResult(_i41.Status? status) => (super.noSuchMethod(
+  _i14.CheckRunStatus statusForResult(_i43.Status? status) => (super.noSuchMethod(
         Invocation.method(
           #statusForResult,
           [status],
         ),
-        returnValue: _FakeCheckRunStatus_38(
+        returnValue: _FakeCheckRunStatus_42(
           this,
           Invocation.method(
             #statusForResult,
             [status],
           ),
         ),
-      ) as _i13.CheckRunStatus);
+      ) as _i14.CheckRunStatus);
 
   @override
-  _i20.Future<_i13.PullRequest?> findMatchingPullRequest(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.PullRequest?> findMatchingPullRequest(
+    _i14.RepositorySlug? slug,
     String? headSha,
     int? checkSuiteId,
   ) =>
@@ -3664,22 +3906,190 @@
             checkSuiteId,
           ],
         ),
-        returnValue: _i20.Future<_i13.PullRequest?>.value(),
-      ) as _i20.Future<_i13.PullRequest?>);
+        returnValue: _i21.Future<_i14.PullRequest?>.value(),
+      ) as _i21.Future<_i14.PullRequest?>);
+}
+
+/// A class which mocks [GithubChecksServiceV2].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockGithubChecksServiceV2 extends _i1.Mock implements _i44.GithubChecksServiceV2 {
+  MockGithubChecksServiceV2() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  _i3.Config get config => (super.noSuchMethod(
+        Invocation.getter(#config),
+        returnValue: _FakeConfig_1(
+          this,
+          Invocation.getter(#config),
+        ),
+      ) as _i3.Config);
+
+  @override
+  set config(_i3.Config? _config) => super.noSuchMethod(
+        Invocation.setter(
+          #config,
+          _config,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  _i25.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
+        Invocation.getter(#githubChecksUtil),
+        returnValue: _FakeGithubChecksUtil_40(
+          this,
+          Invocation.getter(#githubChecksUtil),
+        ),
+      ) as _i25.GithubChecksUtil);
+
+  @override
+  set githubChecksUtil(_i25.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
+        Invocation.setter(
+          #githubChecksUtil,
+          _githubChecksUtil,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  _i21.Future<void> handleCheckSuite(
+    _i14.PullRequest? pullRequest,
+    _i34.CheckSuiteEvent? checkSuiteEvent,
+    _i45.SchedulerV2? scheduler,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #handleCheckSuite,
+          [
+            pullRequest,
+            checkSuiteEvent,
+            scheduler,
+          ],
+        ),
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
+
+  @override
+  _i21.Future<bool> updateCheckStatus({
+    required _i9.Build? build,
+    required Map<String, dynamic>? userDataMap,
+    required _i46.LuciBuildServiceV2? luciBuildService,
+    required _i14.RepositorySlug? slug,
+    bool? rescheduled = false,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #updateCheckStatus,
+          [],
+          {
+            #build: build,
+            #userDataMap: userDataMap,
+            #luciBuildService: luciBuildService,
+            #slug: slug,
+            #rescheduled: rescheduled,
+          },
+        ),
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
+
+  @override
+  bool taskFailed(_i9.Status? status) => (super.noSuchMethod(
+        Invocation.method(
+          #taskFailed,
+          [status],
+        ),
+        returnValue: false,
+      ) as bool);
+
+  @override
+  int currentAttempt(List<_i9.StringPair>? tags) => (super.noSuchMethod(
+        Invocation.method(
+          #currentAttempt,
+          [tags],
+        ),
+        returnValue: 0,
+      ) as int);
+
+  @override
+  String getGithubSummary(String? summary) => (super.noSuchMethod(
+        Invocation.method(
+          #getGithubSummary,
+          [summary],
+        ),
+        returnValue: _i32.dummyValue<String>(
+          this,
+          Invocation.method(
+            #getGithubSummary,
+            [summary],
+          ),
+        ),
+      ) as String);
+
+  @override
+  _i14.CheckRunConclusion conclusionForResult(_i9.Status? status) => (super.noSuchMethod(
+        Invocation.method(
+          #conclusionForResult,
+          [status],
+        ),
+        returnValue: _FakeCheckRunConclusion_41(
+          this,
+          Invocation.method(
+            #conclusionForResult,
+            [status],
+          ),
+        ),
+      ) as _i14.CheckRunConclusion);
+
+  @override
+  _i14.CheckRunStatus statusForResult(_i9.Status? status) => (super.noSuchMethod(
+        Invocation.method(
+          #statusForResult,
+          [status],
+        ),
+        returnValue: _FakeCheckRunStatus_42(
+          this,
+          Invocation.method(
+            #statusForResult,
+            [status],
+          ),
+        ),
+      ) as _i14.CheckRunStatus);
+
+  @override
+  _i21.Future<_i14.PullRequest?> findMatchingPullRequest(
+    _i14.RepositorySlug? slug,
+    String? headSha,
+    int? checkSuiteId,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #findMatchingPullRequest,
+          [
+            slug,
+            headSha,
+            checkSuiteId,
+          ],
+        ),
+        returnValue: _i21.Future<_i14.PullRequest?>.value(),
+      ) as _i21.Future<_i14.PullRequest?>);
 }
 
 /// A class which mocks [GithubChecksUtil].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockGithubChecksUtil extends _i1.Mock implements _i24.GithubChecksUtil {
+class MockGithubChecksUtil extends _i1.Mock implements _i25.GithubChecksUtil {
   MockGithubChecksUtil() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i20.Future<Map<String, _i13.CheckRun>> allCheckRuns(
-    _i13.GitHub? gitHubClient,
-    _i32.CheckSuiteEvent? checkSuiteEvent,
+  _i21.Future<Map<String, _i14.CheckRun>> allCheckRuns(
+    _i14.GitHub? gitHubClient,
+    _i34.CheckSuiteEvent? checkSuiteEvent,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3689,13 +4099,13 @@
             checkSuiteEvent,
           ],
         ),
-        returnValue: _i20.Future<Map<String, _i13.CheckRun>>.value(<String, _i13.CheckRun>{}),
-      ) as _i20.Future<Map<String, _i13.CheckRun>>);
+        returnValue: _i21.Future<Map<String, _i14.CheckRun>>.value(<String, _i14.CheckRun>{}),
+      ) as _i21.Future<Map<String, _i14.CheckRun>>);
 
   @override
-  _i20.Future<_i13.CheckSuite> getCheckSuite(
-    _i13.GitHub? gitHubClient,
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.CheckSuite> getCheckSuite(
+    _i14.GitHub? gitHubClient,
+    _i14.RepositorySlug? slug,
     int? checkSuiteId,
   ) =>
       (super.noSuchMethod(
@@ -3707,7 +4117,7 @@
             checkSuiteId,
           ],
         ),
-        returnValue: _i20.Future<_i13.CheckSuite>.value(_FakeCheckSuite_39(
+        returnValue: _i21.Future<_i14.CheckSuite>.value(_FakeCheckSuite_43(
           this,
           Invocation.method(
             #getCheckSuite,
@@ -3718,12 +4128,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.CheckSuite>);
+      ) as _i21.Future<_i14.CheckSuite>);
 
   @override
-  _i20.Future<List<_i13.CheckSuite>> listCheckSuitesForRef(
-    _i13.GitHub? gitHubClient,
-    _i13.RepositorySlug? slug, {
+  _i21.Future<List<_i14.CheckSuite>> listCheckSuitesForRef(
+    _i14.GitHub? gitHubClient,
+    _i14.RepositorySlug? slug, {
     required String? ref,
     int? appId,
     String? checkName,
@@ -3741,18 +4151,18 @@
             #checkName: checkName,
           },
         ),
-        returnValue: _i20.Future<List<_i13.CheckSuite>>.value(<_i13.CheckSuite>[]),
-      ) as _i20.Future<List<_i13.CheckSuite>>);
+        returnValue: _i21.Future<List<_i14.CheckSuite>>.value(<_i14.CheckSuite>[]),
+      ) as _i21.Future<List<_i14.CheckSuite>>);
 
   @override
-  _i20.Future<void> updateCheckRun(
+  _i21.Future<void> updateCheckRun(
     _i3.Config? config,
-    _i13.RepositorySlug? slug,
-    _i13.CheckRun? checkRun, {
-    _i13.CheckRunStatus? status = _i13.CheckRunStatus.queued,
-    _i13.CheckRunConclusion? conclusion,
+    _i14.RepositorySlug? slug,
+    _i14.CheckRun? checkRun, {
+    _i14.CheckRunStatus? status = _i14.CheckRunStatus.queued,
+    _i14.CheckRunConclusion? conclusion,
     String? detailsUrl,
-    _i13.CheckRunOutput? output,
+    _i14.CheckRunOutput? output,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3769,14 +4179,14 @@
             #output: output,
           },
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<_i13.CheckRun> getCheckRun(
+  _i21.Future<_i14.CheckRun> getCheckRun(
     _i3.Config? config,
-    _i13.RepositorySlug? slug,
+    _i14.RepositorySlug? slug,
     int? id,
   ) =>
       (super.noSuchMethod(
@@ -3788,7 +4198,7 @@
             id,
           ],
         ),
-        returnValue: _i20.Future<_i13.CheckRun>.value(_FakeCheckRun_40(
+        returnValue: _i21.Future<_i14.CheckRun>.value(_FakeCheckRun_44(
           this,
           Invocation.method(
             #getCheckRun,
@@ -3799,15 +4209,15 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.CheckRun>);
+      ) as _i21.Future<_i14.CheckRun>);
 
   @override
-  _i20.Future<_i13.CheckRun> createCheckRun(
+  _i21.Future<_i14.CheckRun> createCheckRun(
     _i3.Config? config,
-    _i13.RepositorySlug? slug,
+    _i14.RepositorySlug? slug,
     String? sha,
     String? name, {
-    _i13.CheckRunOutput? output,
+    _i14.CheckRunOutput? output,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3820,7 +4230,7 @@
           ],
           {#output: output},
         ),
-        returnValue: _i20.Future<_i13.CheckRun>.value(_FakeCheckRun_40(
+        returnValue: _i21.Future<_i14.CheckRun>.value(_FakeCheckRun_44(
           this,
           Invocation.method(
             #createCheckRun,
@@ -3833,29 +4243,29 @@
             {#output: output},
           ),
         )),
-      ) as _i20.Future<_i13.CheckRun>);
+      ) as _i21.Future<_i14.CheckRun>);
 }
 
 /// A class which mocks [GithubService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockGithubService extends _i1.Mock implements _i17.GithubService {
+class MockGithubService extends _i1.Mock implements _i18.GithubService {
   MockGithubService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i13.GitHub get github => (super.noSuchMethod(
+  _i14.GitHub get github => (super.noSuchMethod(
         Invocation.getter(#github),
-        returnValue: _FakeGitHub_16(
+        returnValue: _FakeGitHub_20(
           this,
           Invocation.getter(#github),
         ),
-      ) as _i13.GitHub);
+      ) as _i14.GitHub);
 
   @override
-  _i20.Future<List<_i13.RepositoryCommit>> listBranchedCommits(
-    _i13.RepositorySlug? slug,
+  _i21.Future<List<_i14.RepositoryCommit>> listBranchedCommits(
+    _i14.RepositorySlug? slug,
     String? branch,
     int? lastCommitTimestampMills,
   ) =>
@@ -3868,12 +4278,12 @@
             lastCommitTimestampMills,
           ],
         ),
-        returnValue: _i20.Future<List<_i13.RepositoryCommit>>.value(<_i13.RepositoryCommit>[]),
-      ) as _i20.Future<List<_i13.RepositoryCommit>>);
+        returnValue: _i21.Future<List<_i14.RepositoryCommit>>.value(<_i14.RepositoryCommit>[]),
+      ) as _i21.Future<List<_i14.RepositoryCommit>>);
 
   @override
-  _i20.Future<List<_i13.PullRequest>> listPullRequests(
-    _i13.RepositorySlug? slug,
+  _i21.Future<List<_i14.PullRequest>> listPullRequests(
+    _i14.RepositorySlug? slug,
     String? branch,
   ) =>
       (super.noSuchMethod(
@@ -3884,17 +4294,17 @@
             branch,
           ],
         ),
-        returnValue: _i20.Future<List<_i13.PullRequest>>.value(<_i13.PullRequest>[]),
-      ) as _i20.Future<List<_i13.PullRequest>>);
+        returnValue: _i21.Future<List<_i14.PullRequest>>.value(<_i14.PullRequest>[]),
+      ) as _i21.Future<List<_i14.PullRequest>>);
 
   @override
-  _i20.Future<_i13.PullRequest> createPullRequest(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.PullRequest> createPullRequest(
+    _i14.RepositorySlug? slug, {
     required String? title,
     String? body,
     String? commitMessage,
-    required _i13.GitReference? baseRef,
-    List<_i13.CreateGitTreeEntry>? entries,
+    required _i14.GitReference? baseRef,
+    List<_i14.CreateGitTreeEntry>? entries,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -3908,7 +4318,7 @@
             #entries: entries,
           },
         ),
-        returnValue: _i20.Future<_i13.PullRequest>.value(_FakePullRequest_41(
+        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
           this,
           Invocation.method(
             #createPullRequest,
@@ -3922,11 +4332,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.PullRequest>);
+      ) as _i21.Future<_i14.PullRequest>);
 
   @override
-  _i20.Future<void> assignReviewer(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<void> assignReviewer(
+    _i14.RepositorySlug? slug, {
     int? pullRequestNumber,
     String? reviewer,
   }) =>
@@ -3939,13 +4349,13 @@
             #reviewer: reviewer,
           },
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<List<_i13.IssueLabel>> getIssueLabels(
-    _i13.RepositorySlug? slug,
+  _i21.Future<List<_i14.IssueLabel>> getIssueLabels(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
   ) =>
       (super.noSuchMethod(
@@ -3956,12 +4366,12 @@
             issueNumber,
           ],
         ),
-        returnValue: _i20.Future<List<_i13.IssueLabel>>.value(<_i13.IssueLabel>[]),
-      ) as _i20.Future<List<_i13.IssueLabel>>);
+        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
+      ) as _i21.Future<List<_i14.IssueLabel>>);
 
   @override
-  _i20.Future<List<_i13.IssueLabel>> addIssueLabels(
-    _i13.RepositorySlug? slug,
+  _i21.Future<List<_i14.IssueLabel>> addIssueLabels(
+    _i14.RepositorySlug? slug,
     int? issueNumber,
     List<String>? labels,
   ) =>
@@ -3974,12 +4384,12 @@
             labels,
           ],
         ),
-        returnValue: _i20.Future<List<_i13.IssueLabel>>.value(<_i13.IssueLabel>[]),
-      ) as _i20.Future<List<_i13.IssueLabel>>);
+        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
+      ) as _i21.Future<List<_i14.IssueLabel>>);
 
   @override
-  _i20.Future<List<_i13.Issue>> listIssues(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<List<_i14.Issue>> listIssues(
+    _i14.RepositorySlug? slug, {
     List<String>? labels,
     String? state = r'open',
   }) =>
@@ -3992,23 +4402,23 @@
             #state: state,
           },
         ),
-        returnValue: _i20.Future<List<_i13.Issue>>.value(<_i13.Issue>[]),
-      ) as _i20.Future<List<_i13.Issue>>);
+        returnValue: _i21.Future<List<_i14.Issue>>.value(<_i14.Issue>[]),
+      ) as _i21.Future<List<_i14.Issue>>);
 
   @override
-  _i20.Future<_i13.Issue>? getIssue(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.Issue>? getIssue(
+    _i14.RepositorySlug? slug, {
     required int? issueNumber,
   }) =>
       (super.noSuchMethod(Invocation.method(
         #getIssue,
         [slug],
         {#issueNumber: issueNumber},
-      )) as _i20.Future<_i13.Issue>?);
+      )) as _i21.Future<_i14.Issue>?);
 
   @override
-  _i20.Future<void> assignIssue(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<void> assignIssue(
+    _i14.RepositorySlug? slug, {
     required int? issueNumber,
     required String? assignee,
   }) =>
@@ -4021,13 +4431,13 @@
             #assignee: assignee,
           },
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<_i13.Issue> createIssue(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.Issue> createIssue(
+    _i14.RepositorySlug? slug, {
     String? title,
     String? body,
     List<String>? labels,
@@ -4044,7 +4454,7 @@
             #assignee: assignee,
           },
         ),
-        returnValue: _i20.Future<_i13.Issue>.value(_FakeIssue_32(
+        returnValue: _i21.Future<_i14.Issue>.value(_FakeIssue_36(
           this,
           Invocation.method(
             #createIssue,
@@ -4057,11 +4467,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.Issue>);
+      ) as _i21.Future<_i14.Issue>);
 
   @override
-  _i20.Future<_i13.IssueComment?> createComment(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.IssueComment?> createComment(
+    _i14.RepositorySlug? slug, {
     required int? issueNumber,
     required String? body,
   }) =>
@@ -4074,12 +4484,12 @@
             #body: body,
           },
         ),
-        returnValue: _i20.Future<_i13.IssueComment?>.value(),
-      ) as _i20.Future<_i13.IssueComment?>);
+        returnValue: _i21.Future<_i14.IssueComment?>.value(),
+      ) as _i21.Future<_i14.IssueComment?>);
 
   @override
-  _i20.Future<List<_i13.IssueLabel>> replaceLabelsForIssue(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<List<_i14.IssueLabel>> replaceLabelsForIssue(
+    _i14.RepositorySlug? slug, {
     required int? issueNumber,
     required List<String>? labels,
   }) =>
@@ -4092,21 +4502,21 @@
             #labels: labels,
           },
         ),
-        returnValue: _i20.Future<List<_i13.IssueLabel>>.value(<_i13.IssueLabel>[]),
-      ) as _i20.Future<List<_i13.IssueLabel>>);
+        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
+      ) as _i21.Future<List<_i14.IssueLabel>>);
 
   @override
-  _i20.Future<List<String>> listFiles(_i13.PullRequest? pullRequest) => (super.noSuchMethod(
+  _i21.Future<List<String>> listFiles(_i14.PullRequest? pullRequest) => (super.noSuchMethod(
         Invocation.method(
           #listFiles,
           [pullRequest],
         ),
-        returnValue: _i20.Future<List<String>>.value(<String>[]),
-      ) as _i20.Future<List<String>>);
+        returnValue: _i21.Future<List<String>>.value(<String>[]),
+      ) as _i21.Future<List<String>>);
 
   @override
-  _i20.Future<String> getFileContent(
-    _i13.RepositorySlug? slug,
+  _i21.Future<String> getFileContent(
+    _i14.RepositorySlug? slug,
     String? path, {
     String? ref,
   }) =>
@@ -4119,7 +4529,7 @@
           ],
           {#ref: ref},
         ),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.method(
             #getFileContent,
@@ -4130,11 +4540,11 @@
             {#ref: ref},
           ),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<_i13.GitReference> getReference(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitReference> getReference(
+    _i14.RepositorySlug? slug,
     String? ref,
   ) =>
       (super.noSuchMethod(
@@ -4145,7 +4555,7 @@
             ref,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitReference>.value(_FakeGitReference_42(
+        returnValue: _i21.Future<_i14.GitReference>.value(_FakeGitReference_46(
           this,
           Invocation.method(
             #getReference,
@@ -4155,26 +4565,26 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitReference>);
+      ) as _i21.Future<_i14.GitReference>);
 
   @override
-  _i20.Future<_i13.RateLimit> getRateLimit() => (super.noSuchMethod(
+  _i21.Future<_i14.RateLimit> getRateLimit() => (super.noSuchMethod(
         Invocation.method(
           #getRateLimit,
           [],
         ),
-        returnValue: _i20.Future<_i13.RateLimit>.value(_FakeRateLimit_43(
+        returnValue: _i21.Future<_i14.RateLimit>.value(_FakeRateLimit_47(
           this,
           Invocation.method(
             #getRateLimit,
             [],
           ),
         )),
-      ) as _i20.Future<_i13.RateLimit>);
+      ) as _i21.Future<_i14.RateLimit>);
 
   @override
-  _i20.Future<List<_i13.Issue>> searchIssuesAndPRs(
-    _i13.RepositorySlug? slug,
+  _i21.Future<List<_i14.Issue>> searchIssuesAndPRs(
+    _i14.RepositorySlug? slug,
     String? query, {
     String? sort,
     int? pages = 2,
@@ -4191,12 +4601,12 @@
             #pages: pages,
           },
         ),
-        returnValue: _i20.Future<List<_i13.Issue>>.value(<_i13.Issue>[]),
-      ) as _i20.Future<List<_i13.Issue>>);
+        returnValue: _i21.Future<List<_i14.Issue>>.value(<_i14.Issue>[]),
+      ) as _i21.Future<List<_i14.Issue>>);
 
   @override
-  _i20.Future<_i13.PullRequest> getPullRequest(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.PullRequest> getPullRequest(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -4207,7 +4617,7 @@
             number,
           ],
         ),
-        returnValue: _i20.Future<_i13.PullRequest>.value(_FakePullRequest_41(
+        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
           this,
           Invocation.method(
             #getPullRequest,
@@ -4217,29 +4627,29 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.PullRequest>);
+      ) as _i21.Future<_i14.PullRequest>);
 }
 
 /// A class which mocks [GitService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockGitService extends _i1.Mock implements _i13.GitService {
+class MockGitService extends _i1.Mock implements _i14.GitService {
   MockGitService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i13.GitHub get github => (super.noSuchMethod(
+  _i14.GitHub get github => (super.noSuchMethod(
         Invocation.getter(#github),
-        returnValue: _FakeGitHub_16(
+        returnValue: _FakeGitHub_20(
           this,
           Invocation.getter(#github),
         ),
-      ) as _i13.GitHub);
+      ) as _i14.GitHub);
 
   @override
-  _i20.Future<_i13.GitBlob> getBlob(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitBlob> getBlob(
+    _i14.RepositorySlug? slug,
     String? sha,
   ) =>
       (super.noSuchMethod(
@@ -4250,7 +4660,7 @@
             sha,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitBlob>.value(_FakeGitBlob_44(
+        returnValue: _i21.Future<_i14.GitBlob>.value(_FakeGitBlob_48(
           this,
           Invocation.method(
             #getBlob,
@@ -4260,12 +4670,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitBlob>);
+      ) as _i21.Future<_i14.GitBlob>);
 
   @override
-  _i20.Future<_i13.GitBlob> createBlob(
-    _i13.RepositorySlug? slug,
-    _i13.CreateGitBlob? blob,
+  _i21.Future<_i14.GitBlob> createBlob(
+    _i14.RepositorySlug? slug,
+    _i14.CreateGitBlob? blob,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -4275,7 +4685,7 @@
             blob,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitBlob>.value(_FakeGitBlob_44(
+        returnValue: _i21.Future<_i14.GitBlob>.value(_FakeGitBlob_48(
           this,
           Invocation.method(
             #createBlob,
@@ -4285,11 +4695,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitBlob>);
+      ) as _i21.Future<_i14.GitBlob>);
 
   @override
-  _i20.Future<_i13.GitCommit> getCommit(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitCommit> getCommit(
+    _i14.RepositorySlug? slug,
     String? sha,
   ) =>
       (super.noSuchMethod(
@@ -4300,7 +4710,7 @@
             sha,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitCommit>.value(_FakeGitCommit_45(
+        returnValue: _i21.Future<_i14.GitCommit>.value(_FakeGitCommit_49(
           this,
           Invocation.method(
             #getCommit,
@@ -4310,12 +4720,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitCommit>);
+      ) as _i21.Future<_i14.GitCommit>);
 
   @override
-  _i20.Future<_i13.GitCommit> createCommit(
-    _i13.RepositorySlug? slug,
-    _i13.CreateGitCommit? commit,
+  _i21.Future<_i14.GitCommit> createCommit(
+    _i14.RepositorySlug? slug,
+    _i14.CreateGitCommit? commit,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -4325,7 +4735,7 @@
             commit,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitCommit>.value(_FakeGitCommit_45(
+        returnValue: _i21.Future<_i14.GitCommit>.value(_FakeGitCommit_49(
           this,
           Invocation.method(
             #createCommit,
@@ -4335,11 +4745,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitCommit>);
+      ) as _i21.Future<_i14.GitCommit>);
 
   @override
-  _i20.Future<_i13.GitReference> getReference(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitReference> getReference(
+    _i14.RepositorySlug? slug,
     String? ref,
   ) =>
       (super.noSuchMethod(
@@ -4350,7 +4760,7 @@
             ref,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitReference>.value(_FakeGitReference_42(
+        returnValue: _i21.Future<_i14.GitReference>.value(_FakeGitReference_46(
           this,
           Invocation.method(
             #getReference,
@@ -4360,11 +4770,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitReference>);
+      ) as _i21.Future<_i14.GitReference>);
 
   @override
-  _i20.Stream<_i13.GitReference> listReferences(
-    _i13.RepositorySlug? slug, {
+  _i21.Stream<_i14.GitReference> listReferences(
+    _i14.RepositorySlug? slug, {
     String? type,
   }) =>
       (super.noSuchMethod(
@@ -4373,12 +4783,12 @@
           [slug],
           {#type: type},
         ),
-        returnValue: _i20.Stream<_i13.GitReference>.empty(),
-      ) as _i20.Stream<_i13.GitReference>);
+        returnValue: _i21.Stream<_i14.GitReference>.empty(),
+      ) as _i21.Stream<_i14.GitReference>);
 
   @override
-  _i20.Future<_i13.GitReference> createReference(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitReference> createReference(
+    _i14.RepositorySlug? slug,
     String? ref,
     String? sha,
   ) =>
@@ -4391,7 +4801,7 @@
             sha,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitReference>.value(_FakeGitReference_42(
+        returnValue: _i21.Future<_i14.GitReference>.value(_FakeGitReference_46(
           this,
           Invocation.method(
             #createReference,
@@ -4402,11 +4812,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitReference>);
+      ) as _i21.Future<_i14.GitReference>);
 
   @override
-  _i20.Future<_i13.GitReference> editReference(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitReference> editReference(
+    _i14.RepositorySlug? slug,
     String? ref,
     String? sha, {
     bool? force = false,
@@ -4421,7 +4831,7 @@
           ],
           {#force: force},
         ),
-        returnValue: _i20.Future<_i13.GitReference>.value(_FakeGitReference_42(
+        returnValue: _i21.Future<_i14.GitReference>.value(_FakeGitReference_46(
           this,
           Invocation.method(
             #editReference,
@@ -4433,11 +4843,11 @@
             {#force: force},
           ),
         )),
-      ) as _i20.Future<_i13.GitReference>);
+      ) as _i21.Future<_i14.GitReference>);
 
   @override
-  _i20.Future<bool> deleteReference(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> deleteReference(
+    _i14.RepositorySlug? slug,
     String? ref,
   ) =>
       (super.noSuchMethod(
@@ -4448,12 +4858,12 @@
             ref,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<_i13.GitTag> getTag(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitTag> getTag(
+    _i14.RepositorySlug? slug,
     String? sha,
   ) =>
       (super.noSuchMethod(
@@ -4464,7 +4874,7 @@
             sha,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitTag>.value(_FakeGitTag_46(
+        returnValue: _i21.Future<_i14.GitTag>.value(_FakeGitTag_50(
           this,
           Invocation.method(
             #getTag,
@@ -4474,12 +4884,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitTag>);
+      ) as _i21.Future<_i14.GitTag>);
 
   @override
-  _i20.Future<_i13.GitTag> createTag(
-    _i13.RepositorySlug? slug,
-    _i13.CreateGitTag? tag,
+  _i21.Future<_i14.GitTag> createTag(
+    _i14.RepositorySlug? slug,
+    _i14.CreateGitTag? tag,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -4489,7 +4899,7 @@
             tag,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitTag>.value(_FakeGitTag_46(
+        returnValue: _i21.Future<_i14.GitTag>.value(_FakeGitTag_50(
           this,
           Invocation.method(
             #createTag,
@@ -4499,11 +4909,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitTag>);
+      ) as _i21.Future<_i14.GitTag>);
 
   @override
-  _i20.Future<_i13.GitTree> getTree(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitTree> getTree(
+    _i14.RepositorySlug? slug,
     String? sha, {
     bool? recursive = false,
   }) =>
@@ -4516,7 +4926,7 @@
           ],
           {#recursive: recursive},
         ),
-        returnValue: _i20.Future<_i13.GitTree>.value(_FakeGitTree_47(
+        returnValue: _i21.Future<_i14.GitTree>.value(_FakeGitTree_51(
           this,
           Invocation.method(
             #getTree,
@@ -4527,12 +4937,12 @@
             {#recursive: recursive},
           ),
         )),
-      ) as _i20.Future<_i13.GitTree>);
+      ) as _i21.Future<_i14.GitTree>);
 
   @override
-  _i20.Future<_i13.GitTree> createTree(
-    _i13.RepositorySlug? slug,
-    _i13.CreateGitTree? tree,
+  _i21.Future<_i14.GitTree> createTree(
+    _i14.RepositorySlug? slug,
+    _i14.CreateGitTree? tree,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -4542,7 +4952,7 @@
             tree,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitTree>.value(_FakeGitTree_47(
+        returnValue: _i21.Future<_i14.GitTree>.value(_FakeGitTree_51(
           this,
           Invocation.method(
             #createTree,
@@ -4552,28 +4962,28 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitTree>);
+      ) as _i21.Future<_i14.GitTree>);
 }
 
 /// A class which mocks [GraphQLClient].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockGraphQLClient extends _i1.Mock implements _i14.GraphQLClient {
+class MockGraphQLClient extends _i1.Mock implements _i15.GraphQLClient {
   MockGraphQLClient() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i14.DefaultPolicies get defaultPolicies => (super.noSuchMethod(
+  _i15.DefaultPolicies get defaultPolicies => (super.noSuchMethod(
         Invocation.getter(#defaultPolicies),
-        returnValue: _FakeDefaultPolicies_48(
+        returnValue: _FakeDefaultPolicies_52(
           this,
           Invocation.getter(#defaultPolicies),
         ),
-      ) as _i14.DefaultPolicies);
+      ) as _i15.DefaultPolicies);
 
   @override
-  set defaultPolicies(_i14.DefaultPolicies? _defaultPolicies) => super.noSuchMethod(
+  set defaultPolicies(_i15.DefaultPolicies? _defaultPolicies) => super.noSuchMethod(
         Invocation.setter(
           #defaultPolicies,
           _defaultPolicies,
@@ -4582,34 +4992,34 @@
       );
 
   @override
-  _i14.Link get link => (super.noSuchMethod(
+  _i15.Link get link => (super.noSuchMethod(
         Invocation.getter(#link),
-        returnValue: _FakeLink_49(
+        returnValue: _FakeLink_53(
           this,
           Invocation.getter(#link),
         ),
-      ) as _i14.Link);
+      ) as _i15.Link);
 
   @override
-  _i14.GraphQLCache get cache => (super.noSuchMethod(
+  _i15.GraphQLCache get cache => (super.noSuchMethod(
         Invocation.getter(#cache),
-        returnValue: _FakeGraphQLCache_50(
+        returnValue: _FakeGraphQLCache_54(
           this,
           Invocation.getter(#cache),
         ),
-      ) as _i14.GraphQLCache);
+      ) as _i15.GraphQLCache);
 
   @override
-  _i14.QueryManager get queryManager => (super.noSuchMethod(
+  _i15.QueryManager get queryManager => (super.noSuchMethod(
         Invocation.getter(#queryManager),
-        returnValue: _FakeQueryManager_51(
+        returnValue: _FakeQueryManager_55(
           this,
           Invocation.getter(#queryManager),
         ),
-      ) as _i14.QueryManager);
+      ) as _i15.QueryManager);
 
   @override
-  set queryManager(_i14.QueryManager? _queryManager) => super.noSuchMethod(
+  set queryManager(_i15.QueryManager? _queryManager) => super.noSuchMethod(
         Invocation.setter(
           #queryManager,
           _queryManager,
@@ -4618,10 +5028,10 @@
       );
 
   @override
-  _i14.GraphQLClient copyWith({
-    _i14.Link? link,
-    _i14.GraphQLCache? cache,
-    _i14.DefaultPolicies? defaultPolicies,
+  _i15.GraphQLClient copyWith({
+    _i15.Link? link,
+    _i15.GraphQLCache? cache,
+    _i15.DefaultPolicies? defaultPolicies,
     bool? alwaysRebroadcast,
   }) =>
       (super.noSuchMethod(
@@ -4635,7 +5045,7 @@
             #alwaysRebroadcast: alwaysRebroadcast,
           },
         ),
-        returnValue: _FakeGraphQLClient_17(
+        returnValue: _FakeGraphQLClient_21(
           this,
           Invocation.method(
             #copyWith,
@@ -4648,83 +5058,83 @@
             },
           ),
         ),
-      ) as _i14.GraphQLClient);
+      ) as _i15.GraphQLClient);
 
   @override
-  _i14.ObservableQuery<TParsed> watchQuery<TParsed>(_i14.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
+  _i15.ObservableQuery<TParsed> watchQuery<TParsed>(_i15.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
         Invocation.method(
           #watchQuery,
           [options],
         ),
-        returnValue: _FakeObservableQuery_52<TParsed>(
+        returnValue: _FakeObservableQuery_56<TParsed>(
           this,
           Invocation.method(
             #watchQuery,
             [options],
           ),
         ),
-      ) as _i14.ObservableQuery<TParsed>);
+      ) as _i15.ObservableQuery<TParsed>);
 
   @override
-  _i14.ObservableQuery<TParsed> watchMutation<TParsed>(_i14.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
+  _i15.ObservableQuery<TParsed> watchMutation<TParsed>(_i15.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
         Invocation.method(
           #watchMutation,
           [options],
         ),
-        returnValue: _FakeObservableQuery_52<TParsed>(
+        returnValue: _FakeObservableQuery_56<TParsed>(
           this,
           Invocation.method(
             #watchMutation,
             [options],
           ),
         ),
-      ) as _i14.ObservableQuery<TParsed>);
+      ) as _i15.ObservableQuery<TParsed>);
 
   @override
-  _i20.Future<_i14.QueryResult<TParsed>> query<TParsed>(_i14.QueryOptions<TParsed>? options) => (super.noSuchMethod(
+  _i21.Future<_i15.QueryResult<TParsed>> query<TParsed>(_i15.QueryOptions<TParsed>? options) => (super.noSuchMethod(
         Invocation.method(
           #query,
           [options],
         ),
-        returnValue: _i20.Future<_i14.QueryResult<TParsed>>.value(_FakeQueryResult_53<TParsed>(
+        returnValue: _i21.Future<_i15.QueryResult<TParsed>>.value(_FakeQueryResult_57<TParsed>(
           this,
           Invocation.method(
             #query,
             [options],
           ),
         )),
-      ) as _i20.Future<_i14.QueryResult<TParsed>>);
+      ) as _i21.Future<_i15.QueryResult<TParsed>>);
 
   @override
-  _i20.Future<_i14.QueryResult<TParsed>> mutate<TParsed>(_i14.MutationOptions<TParsed>? options) => (super.noSuchMethod(
+  _i21.Future<_i15.QueryResult<TParsed>> mutate<TParsed>(_i15.MutationOptions<TParsed>? options) => (super.noSuchMethod(
         Invocation.method(
           #mutate,
           [options],
         ),
-        returnValue: _i20.Future<_i14.QueryResult<TParsed>>.value(_FakeQueryResult_53<TParsed>(
+        returnValue: _i21.Future<_i15.QueryResult<TParsed>>.value(_FakeQueryResult_57<TParsed>(
           this,
           Invocation.method(
             #mutate,
             [options],
           ),
         )),
-      ) as _i20.Future<_i14.QueryResult<TParsed>>);
+      ) as _i21.Future<_i15.QueryResult<TParsed>>);
 
   @override
-  _i20.Stream<_i14.QueryResult<TParsed>> subscribe<TParsed>(_i14.SubscriptionOptions<TParsed>? options) =>
+  _i21.Stream<_i15.QueryResult<TParsed>> subscribe<TParsed>(_i15.SubscriptionOptions<TParsed>? options) =>
       (super.noSuchMethod(
         Invocation.method(
           #subscribe,
           [options],
         ),
-        returnValue: _i20.Stream<_i14.QueryResult<TParsed>>.empty(),
-      ) as _i20.Stream<_i14.QueryResult<TParsed>>);
+        returnValue: _i21.Stream<_i15.QueryResult<TParsed>>.empty(),
+      ) as _i21.Stream<_i15.QueryResult<TParsed>>);
 
   @override
-  _i20.Future<_i14.QueryResult<TParsed>> fetchMore<TParsed>(
-    _i14.FetchMoreOptions? fetchMoreOptions, {
-    required _i14.QueryOptions<TParsed>? originalOptions,
-    required _i14.QueryResult<TParsed>? previousResult,
+  _i21.Future<_i15.QueryResult<TParsed>> fetchMore<TParsed>(
+    _i15.FetchMoreOptions? fetchMoreOptions, {
+    required _i15.QueryOptions<TParsed>? originalOptions,
+    required _i15.QueryResult<TParsed>? previousResult,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -4735,7 +5145,7 @@
             #previousResult: previousResult,
           },
         ),
-        returnValue: _i20.Future<_i14.QueryResult<TParsed>>.value(_FakeQueryResult_53<TParsed>(
+        returnValue: _i21.Future<_i15.QueryResult<TParsed>>.value(_FakeQueryResult_57<TParsed>(
           this,
           Invocation.method(
             #fetchMore,
@@ -4746,11 +5156,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i14.QueryResult<TParsed>>);
+      ) as _i21.Future<_i15.QueryResult<TParsed>>);
 
   @override
   Map<String, dynamic>? readQuery(
-    _i14.Request? request, {
+    _i15.Request? request, {
     bool? optimistic = true,
   }) =>
       (super.noSuchMethod(Invocation.method(
@@ -4761,7 +5171,7 @@
 
   @override
   Map<String, dynamic>? readFragment(
-    _i14.FragmentRequest? fragmentRequest, {
+    _i15.FragmentRequest? fragmentRequest, {
     bool? optimistic = true,
   }) =>
       (super.noSuchMethod(Invocation.method(
@@ -4772,7 +5182,7 @@
 
   @override
   void writeQuery(
-    _i14.Request? request, {
+    _i15.Request? request, {
     required Map<String, dynamic>? data,
     bool? broadcast = true,
   }) =>
@@ -4790,7 +5200,7 @@
 
   @override
   void writeFragment(
-    _i14.FragmentRequest? fragmentRequest, {
+    _i15.FragmentRequest? fragmentRequest, {
     bool? broadcast = true,
     required Map<String, dynamic>? data,
   }) =>
@@ -4807,18 +5217,18 @@
       );
 
   @override
-  _i20.Future<List<_i14.QueryResult<Object?>?>>? resetStore({bool? refetchQueries = true}) =>
+  _i21.Future<List<_i15.QueryResult<Object?>?>>? resetStore({bool? refetchQueries = true}) =>
       (super.noSuchMethod(Invocation.method(
         #resetStore,
         [],
         {#refetchQueries: refetchQueries},
-      )) as _i20.Future<List<_i14.QueryResult<Object?>?>>?);
+      )) as _i21.Future<List<_i15.QueryResult<Object?>?>>?);
 }
 
 /// A class which mocks [HttpClient].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockHttpClient extends _i1.Mock implements _i25.HttpClient {
+class MockHttpClient extends _i1.Mock implements _i26.HttpClient {
   MockHttpClient() {
     _i1.throwOnMissingStub(this);
   }
@@ -4826,7 +5236,7 @@
   @override
   Duration get idleTimeout => (super.noSuchMethod(
         Invocation.getter(#idleTimeout),
-        returnValue: _FakeDuration_15(
+        returnValue: _FakeDuration_19(
           this,
           Invocation.getter(#idleTimeout),
         ),
@@ -4885,7 +5295,7 @@
 
   @override
   set authenticate(
-          _i20.Future<bool> Function(
+          _i21.Future<bool> Function(
             Uri,
             String,
             String?,
@@ -4900,7 +5310,7 @@
 
   @override
   set connectionFactory(
-          _i20.Future<_i25.ConnectionTask<_i25.Socket>> Function(
+          _i21.Future<_i26.ConnectionTask<_i26.Socket>> Function(
             Uri,
             String?,
             int?,
@@ -4924,7 +5334,7 @@
 
   @override
   set authenticateProxy(
-          _i20.Future<bool> Function(
+          _i21.Future<bool> Function(
             String,
             int,
             String,
@@ -4941,7 +5351,7 @@
   @override
   set badCertificateCallback(
           bool Function(
-            _i25.X509Certificate,
+            _i26.X509Certificate,
             String,
             int,
           )? callback) =>
@@ -4963,7 +5373,7 @@
       );
 
   @override
-  _i20.Future<_i25.HttpClientRequest> open(
+  _i21.Future<_i26.HttpClientRequest> open(
     String? method,
     String? host,
     int? port,
@@ -4979,7 +5389,7 @@
             path,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #open,
@@ -4991,10 +5401,10 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> openUrl(
+  _i21.Future<_i26.HttpClientRequest> openUrl(
     String? method,
     Uri? url,
   ) =>
@@ -5006,7 +5416,7 @@
             url,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #openUrl,
@@ -5016,10 +5426,10 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> get(
+  _i21.Future<_i26.HttpClientRequest> get(
     String? host,
     int? port,
     String? path,
@@ -5033,7 +5443,7 @@
             path,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #get,
@@ -5044,25 +5454,25 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> getUrl(Uri? url) => (super.noSuchMethod(
+  _i21.Future<_i26.HttpClientRequest> getUrl(Uri? url) => (super.noSuchMethod(
         Invocation.method(
           #getUrl,
           [url],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #getUrl,
             [url],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> post(
+  _i21.Future<_i26.HttpClientRequest> post(
     String? host,
     int? port,
     String? path,
@@ -5076,7 +5486,7 @@
             path,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #post,
@@ -5087,25 +5497,25 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> postUrl(Uri? url) => (super.noSuchMethod(
+  _i21.Future<_i26.HttpClientRequest> postUrl(Uri? url) => (super.noSuchMethod(
         Invocation.method(
           #postUrl,
           [url],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #postUrl,
             [url],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> put(
+  _i21.Future<_i26.HttpClientRequest> put(
     String? host,
     int? port,
     String? path,
@@ -5119,7 +5529,7 @@
             path,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #put,
@@ -5130,25 +5540,25 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> putUrl(Uri? url) => (super.noSuchMethod(
+  _i21.Future<_i26.HttpClientRequest> putUrl(Uri? url) => (super.noSuchMethod(
         Invocation.method(
           #putUrl,
           [url],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #putUrl,
             [url],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> delete(
+  _i21.Future<_i26.HttpClientRequest> delete(
     String? host,
     int? port,
     String? path,
@@ -5162,7 +5572,7 @@
             path,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #delete,
@@ -5173,25 +5583,25 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> deleteUrl(Uri? url) => (super.noSuchMethod(
+  _i21.Future<_i26.HttpClientRequest> deleteUrl(Uri? url) => (super.noSuchMethod(
         Invocation.method(
           #deleteUrl,
           [url],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #deleteUrl,
             [url],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> patch(
+  _i21.Future<_i26.HttpClientRequest> patch(
     String? host,
     int? port,
     String? path,
@@ -5205,7 +5615,7 @@
             path,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #patch,
@@ -5216,25 +5626,25 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> patchUrl(Uri? url) => (super.noSuchMethod(
+  _i21.Future<_i26.HttpClientRequest> patchUrl(Uri? url) => (super.noSuchMethod(
         Invocation.method(
           #patchUrl,
           [url],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #patchUrl,
             [url],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> head(
+  _i21.Future<_i26.HttpClientRequest> head(
     String? host,
     int? port,
     String? path,
@@ -5248,7 +5658,7 @@
             path,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #head,
@@ -5259,28 +5669,28 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
-  _i20.Future<_i25.HttpClientRequest> headUrl(Uri? url) => (super.noSuchMethod(
+  _i21.Future<_i26.HttpClientRequest> headUrl(Uri? url) => (super.noSuchMethod(
         Invocation.method(
           #headUrl,
           [url],
         ),
-        returnValue: _i20.Future<_i25.HttpClientRequest>.value(_FakeHttpClientRequest_54(
+        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
           this,
           Invocation.method(
             #headUrl,
             [url],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientRequest>);
+      ) as _i21.Future<_i26.HttpClientRequest>);
 
   @override
   void addCredentials(
     Uri? url,
     String? realm,
-    _i25.HttpClientCredentials? credentials,
+    _i26.HttpClientCredentials? credentials,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -5299,7 +5709,7 @@
     String? host,
     int? port,
     String? realm,
-    _i25.HttpClientCredentials? credentials,
+    _i26.HttpClientCredentials? credentials,
   ) =>
       super.noSuchMethod(
         Invocation.method(
@@ -5328,7 +5738,7 @@
 /// A class which mocks [HttpClientRequest].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockHttpClientRequest extends _i1.Mock implements _i25.HttpClientRequest {
+class MockHttpClientRequest extends _i1.Mock implements _i26.HttpClientRequest {
   MockHttpClientRequest() {
     _i1.throwOnMissingStub(this);
   }
@@ -5411,7 +5821,7 @@
   @override
   String get method => (super.noSuchMethod(
         Invocation.getter(#method),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#method),
         ),
@@ -5420,47 +5830,47 @@
   @override
   Uri get uri => (super.noSuchMethod(
         Invocation.getter(#uri),
-        returnValue: _FakeUri_55(
+        returnValue: _FakeUri_59(
           this,
           Invocation.getter(#uri),
         ),
       ) as Uri);
 
   @override
-  _i25.HttpHeaders get headers => (super.noSuchMethod(
+  _i26.HttpHeaders get headers => (super.noSuchMethod(
         Invocation.getter(#headers),
-        returnValue: _FakeHttpHeaders_56(
+        returnValue: _FakeHttpHeaders_60(
           this,
           Invocation.getter(#headers),
         ),
-      ) as _i25.HttpHeaders);
+      ) as _i26.HttpHeaders);
 
   @override
-  List<_i25.Cookie> get cookies => (super.noSuchMethod(
+  List<_i26.Cookie> get cookies => (super.noSuchMethod(
         Invocation.getter(#cookies),
-        returnValue: <_i25.Cookie>[],
-      ) as List<_i25.Cookie>);
+        returnValue: <_i26.Cookie>[],
+      ) as List<_i26.Cookie>);
 
   @override
-  _i20.Future<_i25.HttpClientResponse> get done => (super.noSuchMethod(
+  _i21.Future<_i26.HttpClientResponse> get done => (super.noSuchMethod(
         Invocation.getter(#done),
-        returnValue: _i20.Future<_i25.HttpClientResponse>.value(_FakeHttpClientResponse_57(
+        returnValue: _i21.Future<_i26.HttpClientResponse>.value(_FakeHttpClientResponse_61(
           this,
           Invocation.getter(#done),
         )),
-      ) as _i20.Future<_i25.HttpClientResponse>);
+      ) as _i21.Future<_i26.HttpClientResponse>);
 
   @override
-  _i26.Encoding get encoding => (super.noSuchMethod(
+  _i27.Encoding get encoding => (super.noSuchMethod(
         Invocation.getter(#encoding),
-        returnValue: _FakeEncoding_58(
+        returnValue: _FakeEncoding_62(
           this,
           Invocation.getter(#encoding),
         ),
-      ) as _i26.Encoding);
+      ) as _i27.Encoding);
 
   @override
-  set encoding(_i26.Encoding? _encoding) => super.noSuchMethod(
+  set encoding(_i27.Encoding? _encoding) => super.noSuchMethod(
         Invocation.setter(
           #encoding,
           _encoding,
@@ -5469,19 +5879,19 @@
       );
 
   @override
-  _i20.Future<_i25.HttpClientResponse> close() => (super.noSuchMethod(
+  _i21.Future<_i26.HttpClientResponse> close() => (super.noSuchMethod(
         Invocation.method(
           #close,
           [],
         ),
-        returnValue: _i20.Future<_i25.HttpClientResponse>.value(_FakeHttpClientResponse_57(
+        returnValue: _i21.Future<_i26.HttpClientResponse>.value(_FakeHttpClientResponse_61(
           this,
           Invocation.method(
             #close,
             [],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientResponse>);
+      ) as _i21.Future<_i26.HttpClientResponse>);
 
   @override
   void abort([
@@ -5568,28 +5978,28 @@
       );
 
   @override
-  _i20.Future<dynamic> addStream(_i20.Stream<List<int>>? stream) => (super.noSuchMethod(
+  _i21.Future<dynamic> addStream(_i21.Stream<List<int>>? stream) => (super.noSuchMethod(
         Invocation.method(
           #addStream,
           [stream],
         ),
-        returnValue: _i20.Future<dynamic>.value(),
-      ) as _i20.Future<dynamic>);
+        returnValue: _i21.Future<dynamic>.value(),
+      ) as _i21.Future<dynamic>);
 
   @override
-  _i20.Future<dynamic> flush() => (super.noSuchMethod(
+  _i21.Future<dynamic> flush() => (super.noSuchMethod(
         Invocation.method(
           #flush,
           [],
         ),
-        returnValue: _i20.Future<dynamic>.value(),
-      ) as _i20.Future<dynamic>);
+        returnValue: _i21.Future<dynamic>.value(),
+      ) as _i21.Future<dynamic>);
 }
 
 /// A class which mocks [HttpClientResponse].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockHttpClientResponse extends _i1.Mock implements _i25.HttpClientResponse {
+class MockHttpClientResponse extends _i1.Mock implements _i26.HttpClientResponse {
   MockHttpClientResponse() {
     _i1.throwOnMissingStub(this);
   }
@@ -5603,7 +6013,7 @@
   @override
   String get reasonPhrase => (super.noSuchMethod(
         Invocation.getter(#reasonPhrase),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#reasonPhrase),
         ),
@@ -5616,10 +6026,10 @@
       ) as int);
 
   @override
-  _i25.HttpClientResponseCompressionState get compressionState => (super.noSuchMethod(
+  _i26.HttpClientResponseCompressionState get compressionState => (super.noSuchMethod(
         Invocation.getter(#compressionState),
-        returnValue: _i25.HttpClientResponseCompressionState.notCompressed,
-      ) as _i25.HttpClientResponseCompressionState);
+        returnValue: _i26.HttpClientResponseCompressionState.notCompressed,
+      ) as _i26.HttpClientResponseCompressionState);
 
   @override
   bool get persistentConnection => (super.noSuchMethod(
@@ -5634,25 +6044,25 @@
       ) as bool);
 
   @override
-  List<_i25.RedirectInfo> get redirects => (super.noSuchMethod(
+  List<_i26.RedirectInfo> get redirects => (super.noSuchMethod(
         Invocation.getter(#redirects),
-        returnValue: <_i25.RedirectInfo>[],
-      ) as List<_i25.RedirectInfo>);
+        returnValue: <_i26.RedirectInfo>[],
+      ) as List<_i26.RedirectInfo>);
 
   @override
-  _i25.HttpHeaders get headers => (super.noSuchMethod(
+  _i26.HttpHeaders get headers => (super.noSuchMethod(
         Invocation.getter(#headers),
-        returnValue: _FakeHttpHeaders_56(
+        returnValue: _FakeHttpHeaders_60(
           this,
           Invocation.getter(#headers),
         ),
-      ) as _i25.HttpHeaders);
+      ) as _i26.HttpHeaders);
 
   @override
-  List<_i25.Cookie> get cookies => (super.noSuchMethod(
+  List<_i26.Cookie> get cookies => (super.noSuchMethod(
         Invocation.getter(#cookies),
-        returnValue: <_i25.Cookie>[],
-      ) as List<_i25.Cookie>);
+        returnValue: <_i26.Cookie>[],
+      ) as List<_i26.Cookie>);
 
   @override
   bool get isBroadcast => (super.noSuchMethod(
@@ -5661,37 +6071,37 @@
       ) as bool);
 
   @override
-  _i20.Future<int> get length => (super.noSuchMethod(
+  _i21.Future<int> get length => (super.noSuchMethod(
         Invocation.getter(#length),
-        returnValue: _i20.Future<int>.value(0),
-      ) as _i20.Future<int>);
+        returnValue: _i21.Future<int>.value(0),
+      ) as _i21.Future<int>);
 
   @override
-  _i20.Future<bool> get isEmpty => (super.noSuchMethod(
+  _i21.Future<bool> get isEmpty => (super.noSuchMethod(
         Invocation.getter(#isEmpty),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<List<int>> get first => (super.noSuchMethod(
+  _i21.Future<List<int>> get first => (super.noSuchMethod(
         Invocation.getter(#first),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
 
   @override
-  _i20.Future<List<int>> get last => (super.noSuchMethod(
+  _i21.Future<List<int>> get last => (super.noSuchMethod(
         Invocation.getter(#last),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
 
   @override
-  _i20.Future<List<int>> get single => (super.noSuchMethod(
+  _i21.Future<List<int>> get single => (super.noSuchMethod(
         Invocation.getter(#single),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
 
   @override
-  _i20.Future<_i25.HttpClientResponse> redirect([
+  _i21.Future<_i26.HttpClientResponse> redirect([
     String? method,
     Uri? url,
     bool? followLoops,
@@ -5705,7 +6115,7 @@
             followLoops,
           ],
         ),
-        returnValue: _i20.Future<_i25.HttpClientResponse>.value(_FakeHttpClientResponse_57(
+        returnValue: _i21.Future<_i26.HttpClientResponse>.value(_FakeHttpClientResponse_61(
           this,
           Invocation.method(
             #redirect,
@@ -5716,27 +6126,27 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i25.HttpClientResponse>);
+      ) as _i21.Future<_i26.HttpClientResponse>);
 
   @override
-  _i20.Future<_i25.Socket> detachSocket() => (super.noSuchMethod(
+  _i21.Future<_i26.Socket> detachSocket() => (super.noSuchMethod(
         Invocation.method(
           #detachSocket,
           [],
         ),
-        returnValue: _i20.Future<_i25.Socket>.value(_FakeSocket_59(
+        returnValue: _i21.Future<_i26.Socket>.value(_FakeSocket_63(
           this,
           Invocation.method(
             #detachSocket,
             [],
           ),
         )),
-      ) as _i20.Future<_i25.Socket>);
+      ) as _i21.Future<_i26.Socket>);
 
   @override
-  _i20.Stream<List<int>> asBroadcastStream({
-    void Function(_i20.StreamSubscription<List<int>>)? onListen,
-    void Function(_i20.StreamSubscription<List<int>>)? onCancel,
+  _i21.Stream<List<int>> asBroadcastStream({
+    void Function(_i21.StreamSubscription<List<int>>)? onListen,
+    void Function(_i21.StreamSubscription<List<int>>)? onCancel,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -5747,11 +6157,11 @@
             #onCancel: onCancel,
           },
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 
   @override
-  _i20.StreamSubscription<List<int>> listen(
+  _i21.StreamSubscription<List<int>> listen(
     void Function(List<int>)? onData, {
     Function? onError,
     void Function()? onDone,
@@ -5767,7 +6177,7 @@
             #cancelOnError: cancelOnError,
           },
         ),
-        returnValue: _FakeStreamSubscription_60<List<int>>(
+        returnValue: _FakeStreamSubscription_64<List<int>>(
           this,
           Invocation.method(
             #listen,
@@ -5779,46 +6189,46 @@
             },
           ),
         ),
-      ) as _i20.StreamSubscription<List<int>>);
+      ) as _i21.StreamSubscription<List<int>>);
 
   @override
-  _i20.Stream<List<int>> where(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i21.Stream<List<int>> where(bool Function(List<int>)? test) => (super.noSuchMethod(
         Invocation.method(
           #where,
           [test],
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 
   @override
-  _i20.Stream<S> map<S>(S Function(List<int>)? convert) => (super.noSuchMethod(
+  _i21.Stream<S> map<S>(S Function(List<int>)? convert) => (super.noSuchMethod(
         Invocation.method(
           #map,
           [convert],
         ),
-        returnValue: _i20.Stream<S>.empty(),
-      ) as _i20.Stream<S>);
+        returnValue: _i21.Stream<S>.empty(),
+      ) as _i21.Stream<S>);
 
   @override
-  _i20.Stream<E> asyncMap<E>(_i20.FutureOr<E> Function(List<int>)? convert) => (super.noSuchMethod(
+  _i21.Stream<E> asyncMap<E>(_i21.FutureOr<E> Function(List<int>)? convert) => (super.noSuchMethod(
         Invocation.method(
           #asyncMap,
           [convert],
         ),
-        returnValue: _i20.Stream<E>.empty(),
-      ) as _i20.Stream<E>);
+        returnValue: _i21.Stream<E>.empty(),
+      ) as _i21.Stream<E>);
 
   @override
-  _i20.Stream<E> asyncExpand<E>(_i20.Stream<E>? Function(List<int>)? convert) => (super.noSuchMethod(
+  _i21.Stream<E> asyncExpand<E>(_i21.Stream<E>? Function(List<int>)? convert) => (super.noSuchMethod(
         Invocation.method(
           #asyncExpand,
           [convert],
         ),
-        returnValue: _i20.Stream<E>.empty(),
-      ) as _i20.Stream<E>);
+        returnValue: _i21.Stream<E>.empty(),
+      ) as _i21.Stream<E>);
 
   @override
-  _i20.Stream<List<int>> handleError(
+  _i21.Stream<List<int>> handleError(
     Function? onError, {
     bool Function(dynamic)? test,
   }) =>
@@ -5828,38 +6238,38 @@
           [onError],
           {#test: test},
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 
   @override
-  _i20.Stream<S> expand<S>(Iterable<S> Function(List<int>)? convert) => (super.noSuchMethod(
+  _i21.Stream<S> expand<S>(Iterable<S> Function(List<int>)? convert) => (super.noSuchMethod(
         Invocation.method(
           #expand,
           [convert],
         ),
-        returnValue: _i20.Stream<S>.empty(),
-      ) as _i20.Stream<S>);
+        returnValue: _i21.Stream<S>.empty(),
+      ) as _i21.Stream<S>);
 
   @override
-  _i20.Future<dynamic> pipe(_i20.StreamConsumer<List<int>>? streamConsumer) => (super.noSuchMethod(
+  _i21.Future<dynamic> pipe(_i21.StreamConsumer<List<int>>? streamConsumer) => (super.noSuchMethod(
         Invocation.method(
           #pipe,
           [streamConsumer],
         ),
-        returnValue: _i20.Future<dynamic>.value(),
-      ) as _i20.Future<dynamic>);
+        returnValue: _i21.Future<dynamic>.value(),
+      ) as _i21.Future<dynamic>);
 
   @override
-  _i20.Stream<S> transform<S>(_i20.StreamTransformer<List<int>, S>? streamTransformer) => (super.noSuchMethod(
+  _i21.Stream<S> transform<S>(_i21.StreamTransformer<List<int>, S>? streamTransformer) => (super.noSuchMethod(
         Invocation.method(
           #transform,
           [streamTransformer],
         ),
-        returnValue: _i20.Stream<S>.empty(),
-      ) as _i20.Stream<S>);
+        returnValue: _i21.Stream<S>.empty(),
+      ) as _i21.Stream<S>);
 
   @override
-  _i20.Future<List<int>> reduce(
+  _i21.Future<List<int>> reduce(
           List<int> Function(
             List<int>,
             List<int>,
@@ -5869,11 +6279,11 @@
           #reduce,
           [combine],
         ),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
 
   @override
-  _i20.Future<S> fold<S>(
+  _i21.Future<S> fold<S>(
     S? initialValue,
     S Function(
       S,
@@ -5888,8 +6298,8 @@
             combine,
           ],
         ),
-        returnValue: _i30.ifNotNull(
-              _i30.dummyValueOrNull<S>(
+        returnValue: _i32.ifNotNull(
+              _i32.dummyValueOrNull<S>(
                 this,
                 Invocation.method(
                   #fold,
@@ -5899,9 +6309,9 @@
                   ],
                 ),
               ),
-              (S v) => _i20.Future<S>.value(v),
+              (S v) => _i21.Future<S>.value(v),
             ) ??
-            _FakeFuture_23<S>(
+            _FakeFuture_27<S>(
               this,
               Invocation.method(
                 #fold,
@@ -5911,150 +6321,150 @@
                 ],
               ),
             ),
-      ) as _i20.Future<S>);
+      ) as _i21.Future<S>);
 
   @override
-  _i20.Future<String> join([String? separator = r'']) => (super.noSuchMethod(
+  _i21.Future<String> join([String? separator = r'']) => (super.noSuchMethod(
         Invocation.method(
           #join,
           [separator],
         ),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.method(
             #join,
             [separator],
           ),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<bool> contains(Object? needle) => (super.noSuchMethod(
+  _i21.Future<bool> contains(Object? needle) => (super.noSuchMethod(
         Invocation.method(
           #contains,
           [needle],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<void> forEach(void Function(List<int>)? action) => (super.noSuchMethod(
+  _i21.Future<void> forEach(void Function(List<int>)? action) => (super.noSuchMethod(
         Invocation.method(
           #forEach,
           [action],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<bool> every(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i21.Future<bool> every(bool Function(List<int>)? test) => (super.noSuchMethod(
         Invocation.method(
           #every,
           [test],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> any(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i21.Future<bool> any(bool Function(List<int>)? test) => (super.noSuchMethod(
         Invocation.method(
           #any,
           [test],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<R> cast<R>() => (super.noSuchMethod(
+  _i21.Stream<R> cast<R>() => (super.noSuchMethod(
         Invocation.method(
           #cast,
           [],
         ),
-        returnValue: _i20.Stream<R>.empty(),
-      ) as _i20.Stream<R>);
+        returnValue: _i21.Stream<R>.empty(),
+      ) as _i21.Stream<R>);
 
   @override
-  _i20.Future<List<List<int>>> toList() => (super.noSuchMethod(
+  _i21.Future<List<List<int>>> toList() => (super.noSuchMethod(
         Invocation.method(
           #toList,
           [],
         ),
-        returnValue: _i20.Future<List<List<int>>>.value(<List<int>>[]),
-      ) as _i20.Future<List<List<int>>>);
+        returnValue: _i21.Future<List<List<int>>>.value(<List<int>>[]),
+      ) as _i21.Future<List<List<int>>>);
 
   @override
-  _i20.Future<Set<List<int>>> toSet() => (super.noSuchMethod(
+  _i21.Future<Set<List<int>>> toSet() => (super.noSuchMethod(
         Invocation.method(
           #toSet,
           [],
         ),
-        returnValue: _i20.Future<Set<List<int>>>.value(<List<int>>{}),
-      ) as _i20.Future<Set<List<int>>>);
+        returnValue: _i21.Future<Set<List<int>>>.value(<List<int>>{}),
+      ) as _i21.Future<Set<List<int>>>);
 
   @override
-  _i20.Future<E> drain<E>([E? futureValue]) => (super.noSuchMethod(
+  _i21.Future<E> drain<E>([E? futureValue]) => (super.noSuchMethod(
         Invocation.method(
           #drain,
           [futureValue],
         ),
-        returnValue: _i30.ifNotNull(
-              _i30.dummyValueOrNull<E>(
+        returnValue: _i32.ifNotNull(
+              _i32.dummyValueOrNull<E>(
                 this,
                 Invocation.method(
                   #drain,
                   [futureValue],
                 ),
               ),
-              (E v) => _i20.Future<E>.value(v),
+              (E v) => _i21.Future<E>.value(v),
             ) ??
-            _FakeFuture_23<E>(
+            _FakeFuture_27<E>(
               this,
               Invocation.method(
                 #drain,
                 [futureValue],
               ),
             ),
-      ) as _i20.Future<E>);
+      ) as _i21.Future<E>);
 
   @override
-  _i20.Stream<List<int>> take(int? count) => (super.noSuchMethod(
+  _i21.Stream<List<int>> take(int? count) => (super.noSuchMethod(
         Invocation.method(
           #take,
           [count],
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 
   @override
-  _i20.Stream<List<int>> takeWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i21.Stream<List<int>> takeWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
         Invocation.method(
           #takeWhile,
           [test],
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 
   @override
-  _i20.Stream<List<int>> skip(int? count) => (super.noSuchMethod(
+  _i21.Stream<List<int>> skip(int? count) => (super.noSuchMethod(
         Invocation.method(
           #skip,
           [count],
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 
   @override
-  _i20.Stream<List<int>> skipWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i21.Stream<List<int>> skipWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
         Invocation.method(
           #skipWhile,
           [test],
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 
   @override
-  _i20.Stream<List<int>> distinct(
+  _i21.Stream<List<int>> distinct(
           [bool Function(
             List<int>,
             List<int>,
@@ -6064,11 +6474,11 @@
           #distinct,
           [equals],
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 
   @override
-  _i20.Future<List<int>> firstWhere(
+  _i21.Future<List<int>> firstWhere(
     bool Function(List<int>)? test, {
     List<int> Function()? orElse,
   }) =>
@@ -6078,11 +6488,11 @@
           [test],
           {#orElse: orElse},
         ),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
 
   @override
-  _i20.Future<List<int>> lastWhere(
+  _i21.Future<List<int>> lastWhere(
     bool Function(List<int>)? test, {
     List<int> Function()? orElse,
   }) =>
@@ -6092,11 +6502,11 @@
           [test],
           {#orElse: orElse},
         ),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
 
   @override
-  _i20.Future<List<int>> singleWhere(
+  _i21.Future<List<int>> singleWhere(
     bool Function(List<int>)? test, {
     List<int> Function()? orElse,
   }) =>
@@ -6106,22 +6516,22 @@
           [test],
           {#orElse: orElse},
         ),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
 
   @override
-  _i20.Future<List<int>> elementAt(int? index) => (super.noSuchMethod(
+  _i21.Future<List<int>> elementAt(int? index) => (super.noSuchMethod(
         Invocation.method(
           #elementAt,
           [index],
         ),
-        returnValue: _i20.Future<List<int>>.value(<int>[]),
-      ) as _i20.Future<List<int>>);
+        returnValue: _i21.Future<List<int>>.value(<int>[]),
+      ) as _i21.Future<List<int>>);
 
   @override
-  _i20.Stream<List<int>> timeout(
+  _i21.Stream<List<int>> timeout(
     Duration? timeLimit, {
-    void Function(_i20.EventSink<List<int>>)? onTimeout,
+    void Function(_i21.EventSink<List<int>>)? onTimeout,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6129,8 +6539,8 @@
           [timeLimit],
           {#onTimeout: onTimeout},
         ),
-        returnValue: _i20.Stream<List<int>>.empty(),
-      ) as _i20.Stream<List<int>>);
+        returnValue: _i21.Stream<List<int>>.empty(),
+      ) as _i21.Stream<List<int>>);
 }
 
 /// A class which mocks [JobsResource].
@@ -6142,7 +6552,7 @@
   }
 
   @override
-  _i20.Future<_i6.JobCancelResponse> cancel(
+  _i21.Future<_i6.JobCancelResponse> cancel(
     String? projectId,
     String? jobId, {
     String? location,
@@ -6160,7 +6570,7 @@
             #$fields: $fields,
           },
         ),
-        returnValue: _i20.Future<_i6.JobCancelResponse>.value(_FakeJobCancelResponse_61(
+        returnValue: _i21.Future<_i6.JobCancelResponse>.value(_FakeJobCancelResponse_65(
           this,
           Invocation.method(
             #cancel,
@@ -6174,10 +6584,10 @@
             },
           ),
         )),
-      ) as _i20.Future<_i6.JobCancelResponse>);
+      ) as _i21.Future<_i6.JobCancelResponse>);
 
   @override
-  _i20.Future<void> delete(
+  _i21.Future<void> delete(
     String? projectId,
     String? jobId, {
     String? location,
@@ -6195,12 +6605,12 @@
             #$fields: $fields,
           },
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<_i6.Job> get(
+  _i21.Future<_i6.Job> get(
     String? projectId,
     String? jobId, {
     String? location,
@@ -6218,7 +6628,7 @@
             #$fields: $fields,
           },
         ),
-        returnValue: _i20.Future<_i6.Job>.value(_FakeJob_62(
+        returnValue: _i21.Future<_i6.Job>.value(_FakeJob_66(
           this,
           Invocation.method(
             #get,
@@ -6232,10 +6642,10 @@
             },
           ),
         )),
-      ) as _i20.Future<_i6.Job>);
+      ) as _i21.Future<_i6.Job>);
 
   @override
-  _i20.Future<_i6.GetQueryResultsResponse> getQueryResults(
+  _i21.Future<_i6.GetQueryResultsResponse> getQueryResults(
     String? projectId,
     String? jobId, {
     String? location,
@@ -6261,7 +6671,7 @@
             #$fields: $fields,
           },
         ),
-        returnValue: _i20.Future<_i6.GetQueryResultsResponse>.value(_FakeGetQueryResultsResponse_63(
+        returnValue: _i21.Future<_i6.GetQueryResultsResponse>.value(_FakeGetQueryResultsResponse_67(
           this,
           Invocation.method(
             #getQueryResults,
@@ -6279,10 +6689,10 @@
             },
           ),
         )),
-      ) as _i20.Future<_i6.GetQueryResultsResponse>);
+      ) as _i21.Future<_i6.GetQueryResultsResponse>);
 
   @override
-  _i20.Future<_i6.Job> insert(
+  _i21.Future<_i6.Job> insert(
     _i6.Job? request,
     String? projectId, {
     String? $fields,
@@ -6302,7 +6712,7 @@
             #uploadMedia: uploadMedia,
           },
         ),
-        returnValue: _i20.Future<_i6.Job>.value(_FakeJob_62(
+        returnValue: _i21.Future<_i6.Job>.value(_FakeJob_66(
           this,
           Invocation.method(
             #insert,
@@ -6317,10 +6727,10 @@
             },
           ),
         )),
-      ) as _i20.Future<_i6.Job>);
+      ) as _i21.Future<_i6.Job>);
 
   @override
-  _i20.Future<_i6.JobList> list(
+  _i21.Future<_i6.JobList> list(
     String? projectId, {
     bool? allUsers,
     String? maxCreationTime,
@@ -6348,7 +6758,7 @@
             #$fields: $fields,
           },
         ),
-        returnValue: _i20.Future<_i6.JobList>.value(_FakeJobList_64(
+        returnValue: _i21.Future<_i6.JobList>.value(_FakeJobList_68(
           this,
           Invocation.method(
             #list,
@@ -6366,10 +6776,10 @@
             },
           ),
         )),
-      ) as _i20.Future<_i6.JobList>);
+      ) as _i21.Future<_i6.JobList>);
 
   @override
-  _i20.Future<_i6.QueryResponse> query(
+  _i21.Future<_i6.QueryResponse> query(
     _i6.QueryRequest? request,
     String? projectId, {
     String? $fields,
@@ -6383,7 +6793,7 @@
           ],
           {#$fields: $fields},
         ),
-        returnValue: _i20.Future<_i6.QueryResponse>.value(_FakeQueryResponse_65(
+        returnValue: _i21.Future<_i6.QueryResponse>.value(_FakeQueryResponse_69(
           this,
           Invocation.method(
             #query,
@@ -6394,28 +6804,28 @@
             {#$fields: $fields},
           ),
         )),
-      ) as _i20.Future<_i6.QueryResponse>);
+      ) as _i21.Future<_i6.QueryResponse>);
 }
 
 /// A class which mocks [LuciBuildService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockLuciBuildService extends _i1.Mock implements _i15.LuciBuildService {
+class MockLuciBuildService extends _i1.Mock implements _i16.LuciBuildService {
   MockLuciBuildService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i15.BuildBucketClient get buildBucketClient => (super.noSuchMethod(
+  _i16.BuildBucketClient get buildBucketClient => (super.noSuchMethod(
         Invocation.getter(#buildBucketClient),
-        returnValue: _FakeBuildBucketClient_66(
+        returnValue: _FakeBuildBucketClient_70(
           this,
           Invocation.getter(#buildBucketClient),
         ),
-      ) as _i15.BuildBucketClient);
+      ) as _i16.BuildBucketClient);
 
   @override
-  set buildBucketClient(_i15.BuildBucketClient? _buildBucketClient) => super.noSuchMethod(
+  set buildBucketClient(_i16.BuildBucketClient? _buildBucketClient) => super.noSuchMethod(
         Invocation.setter(
           #buildBucketClient,
           _buildBucketClient,
@@ -6424,13 +6834,31 @@
       );
 
   @override
-  _i15.CacheService get cache => (super.noSuchMethod(
+  _i28.BuildBucketV2Client get buildBucketV2Client => (super.noSuchMethod(
+        Invocation.getter(#buildBucketV2Client),
+        returnValue: _FakeBuildBucketV2Client_71(
+          this,
+          Invocation.getter(#buildBucketV2Client),
+        ),
+      ) as _i28.BuildBucketV2Client);
+
+  @override
+  set buildBucketV2Client(_i28.BuildBucketV2Client? _buildBucketV2Client) => super.noSuchMethod(
+        Invocation.setter(
+          #buildBucketV2Client,
+          _buildBucketV2Client,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  _i16.CacheService get cache => (super.noSuchMethod(
         Invocation.getter(#cache),
-        returnValue: _FakeCacheService_67(
+        returnValue: _FakeCacheService_72(
           this,
           Invocation.getter(#cache),
         ),
-      ) as _i15.CacheService);
+      ) as _i16.CacheService);
 
   @override
   _i3.Config get config => (super.noSuchMethod(
@@ -6451,16 +6879,16 @@
       );
 
   @override
-  _i24.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
+  _i25.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
         Invocation.getter(#githubChecksUtil),
-        returnValue: _FakeGithubChecksUtil_36(
+        returnValue: _FakeGithubChecksUtil_40(
           this,
           Invocation.getter(#githubChecksUtil),
         ),
-      ) as _i24.GithubChecksUtil);
+      ) as _i25.GithubChecksUtil);
 
   @override
-  set githubChecksUtil(_i24.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
+  set githubChecksUtil(_i25.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
         Invocation.setter(
           #githubChecksUtil,
           _githubChecksUtil,
@@ -6487,16 +6915,16 @@
       );
 
   @override
-  _i15.PubSub get pubsub => (super.noSuchMethod(
+  _i16.PubSub get pubsub => (super.noSuchMethod(
         Invocation.getter(#pubsub),
-        returnValue: _FakePubSub_68(
+        returnValue: _FakePubSub_73(
           this,
           Invocation.getter(#pubsub),
         ),
-      ) as _i15.PubSub);
+      ) as _i16.PubSub);
 
   @override
-  _i20.Future<List<List<_i8.Request>>> shard(
+  _i21.Future<List<List<_i8.Request>>> shard(
     List<_i8.Request>? requests,
     int? max,
   ) =>
@@ -6508,12 +6936,12 @@
             max,
           ],
         ),
-        returnValue: _i20.Future<List<List<_i8.Request>>>.value(<List<_i8.Request>>[]),
-      ) as _i20.Future<List<List<_i8.Request>>>);
+        returnValue: _i21.Future<List<List<_i8.Request>>>.value(<List<_i8.Request>>[]),
+      ) as _i21.Future<List<List<_i8.Request>>>);
 
   @override
-  _i20.Future<Iterable<_i8.Build>> getTryBuilds(
-    _i13.RepositorySlug? slug,
+  _i21.Future<Iterable<_i8.Build>> getTryBuilds(
+    _i14.RepositorySlug? slug,
     String? sha,
     String? builderName,
   ) =>
@@ -6526,21 +6954,48 @@
             builderName,
           ],
         ),
-        returnValue: _i20.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
-      ) as _i20.Future<Iterable<_i8.Build>>);
+        returnValue: _i21.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
+      ) as _i21.Future<Iterable<_i8.Build>>);
 
   @override
-  _i20.Future<Iterable<_i8.Build>> getTryBuildsByPullRequest(_i13.PullRequest? pullRequest) => (super.noSuchMethod(
+  _i21.Future<Iterable<_i9.Build>> getTryBuildsV2(
+    _i14.RepositorySlug? slug,
+    String? sha,
+    String? builderName,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTryBuildsV2,
+          [
+            slug,
+            sha,
+            builderName,
+          ],
+        ),
+        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
+      ) as _i21.Future<Iterable<_i9.Build>>);
+
+  @override
+  _i21.Future<Iterable<_i8.Build>> getTryBuildsByPullRequest(_i14.PullRequest? pullRequest) => (super.noSuchMethod(
         Invocation.method(
           #getTryBuildsByPullRequest,
           [pullRequest],
         ),
-        returnValue: _i20.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
-      ) as _i20.Future<Iterable<_i8.Build>>);
+        returnValue: _i21.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
+      ) as _i21.Future<Iterable<_i8.Build>>);
 
   @override
-  _i20.Future<Iterable<_i8.Build>> getProdBuilds(
-    _i13.RepositorySlug? slug,
+  _i21.Future<Iterable<_i9.Build>> getTryBuildsByPullRequestV2(_i14.PullRequest? pullRequest) => (super.noSuchMethod(
+        Invocation.method(
+          #getTryBuildsByPullRequestV2,
+          [pullRequest],
+        ),
+        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
+      ) as _i21.Future<Iterable<_i9.Build>>);
+
+  @override
+  _i21.Future<Iterable<_i8.Build>> getProdBuilds(
+    _i14.RepositorySlug? slug,
     String? commitSha,
     String? builderName,
   ) =>
@@ -6553,12 +7008,12 @@
             builderName,
           ],
         ),
-        returnValue: _i20.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
-      ) as _i20.Future<Iterable<_i8.Build>>);
+        returnValue: _i21.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
+      ) as _i21.Future<Iterable<_i8.Build>>);
 
   @override
-  _i20.Future<Iterable<_i8.Build>> getBuilds(
-    _i13.RepositorySlug? slug,
+  _i21.Future<Iterable<_i8.Build>> getBuilds(
+    _i14.RepositorySlug? slug,
     String? commitSha,
     String? builderName,
     String? bucket,
@@ -6575,14 +7030,36 @@
             tags,
           ],
         ),
-        returnValue: _i20.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
-      ) as _i20.Future<Iterable<_i8.Build>>);
+        returnValue: _i21.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
+      ) as _i21.Future<Iterable<_i8.Build>>);
 
   @override
-  _i20.Future<List<_i42.Target>> scheduleTryBuilds({
-    required List<_i42.Target>? targets,
-    required _i13.PullRequest? pullRequest,
-    _i32.CheckSuiteEvent? checkSuiteEvent,
+  _i21.Future<Iterable<_i9.Build>> getBuildsV2(
+    _i14.RepositorySlug? slug,
+    String? commitSha,
+    String? builderName,
+    String? bucket,
+    List<_i9.StringPair>? tags,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getBuildsV2,
+          [
+            slug,
+            commitSha,
+            builderName,
+            bucket,
+            tags,
+          ],
+        ),
+        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
+      ) as _i21.Future<Iterable<_i9.Build>>);
+
+  @override
+  _i21.Future<List<_i47.Target>> scheduleTryBuilds({
+    required List<_i47.Target>? targets,
+    required _i14.PullRequest? pullRequest,
+    _i34.CheckSuiteEvent? checkSuiteEvent,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6594,12 +7071,12 @@
             #checkSuiteEvent: checkSuiteEvent,
           },
         ),
-        returnValue: _i20.Future<List<_i42.Target>>.value(<_i42.Target>[]),
-      ) as _i20.Future<List<_i42.Target>>);
+        returnValue: _i21.Future<List<_i47.Target>>.value(<_i47.Target>[]),
+      ) as _i21.Future<List<_i47.Target>>);
 
   @override
-  _i20.Future<void> cancelBuilds(
-    _i13.PullRequest? pullRequest,
+  _i21.Future<void> cancelBuilds(
+    _i14.PullRequest? pullRequest,
     String? reason,
   ) =>
       (super.noSuchMethod(
@@ -6610,14 +7087,31 @@
             reason,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<List<_i8.Build?>> failedBuilds(
-    _i13.PullRequest? pullRequest,
-    List<_i42.Target>? targets,
+  _i21.Future<void> cancelBuildsV2(
+    _i14.PullRequest? pullRequest,
+    String? reason,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #cancelBuildsV2,
+          [
+            pullRequest,
+            reason,
+          ],
+        ),
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
+
+  @override
+  _i21.Future<List<_i8.Build?>> failedBuilds(
+    _i14.PullRequest? pullRequest,
+    List<_i47.Target>? targets,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6627,13 +7121,13 @@
             targets,
           ],
         ),
-        returnValue: _i20.Future<List<_i8.Build?>>.value(<_i8.Build?>[]),
-      ) as _i20.Future<List<_i8.Build?>>);
+        returnValue: _i21.Future<List<_i8.Build?>>.value(<_i8.Build?>[]),
+      ) as _i21.Future<List<_i8.Build?>>);
 
   @override
-  _i20.Future<_i8.Build> rescheduleBuild({
+  _i21.Future<_i8.Build> rescheduleBuild({
     required String? builderName,
-    required _i41.BuildPushMessage? buildPushMessage,
+    required _i43.BuildPushMessage? buildPushMessage,
     required int? rescheduleAttempt,
   }) =>
       (super.noSuchMethod(
@@ -6646,7 +7140,7 @@
             #rescheduleAttempt: rescheduleAttempt,
           },
         ),
-        returnValue: _i20.Future<_i8.Build>.value(_FakeBuild_7(
+        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
           this,
           Invocation.method(
             #rescheduleBuild,
@@ -6658,27 +7152,27 @@
             },
           ),
         )),
-      ) as _i20.Future<_i8.Build>);
+      ) as _i21.Future<_i8.Build>);
 
   @override
-  _i20.Future<_i8.Build> reschedulePresubmitBuildUsingCheckRunEvent(_i43.CheckRunEvent? checkRunEvent) =>
+  _i21.Future<_i8.Build> reschedulePresubmitBuildUsingCheckRunEvent(_i48.CheckRunEvent? checkRunEvent) =>
       (super.noSuchMethod(
         Invocation.method(
           #reschedulePresubmitBuildUsingCheckRunEvent,
           [checkRunEvent],
         ),
-        returnValue: _i20.Future<_i8.Build>.value(_FakeBuild_7(
+        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
           this,
           Invocation.method(
             #reschedulePresubmitBuildUsingCheckRunEvent,
             [checkRunEvent],
           ),
         )),
-      ) as _i20.Future<_i8.Build>);
+      ) as _i21.Future<_i8.Build>);
 
   @override
   List<String>? extractPrefixedLabels(
-    List<_i13.IssueLabel>? issueLabels,
+    List<_i14.IssueLabel>? issueLabels,
     String? prefix,
   ) =>
       (super.noSuchMethod(Invocation.method(
@@ -6690,11 +7184,11 @@
       )) as List<String>?);
 
   @override
-  _i20.Future<_i8.Build> reschedulePostsubmitBuildUsingCheckRunEvent(
-    _i43.CheckRunEvent? checkRunEvent, {
-    required _i34.Commit? commit,
-    required _i35.Task? task,
-    required _i42.Target? target,
+  _i21.Future<_i8.Build> reschedulePostsubmitBuildUsingCheckRunEvent(
+    _i48.CheckRunEvent? checkRunEvent, {
+    required _i36.Commit? commit,
+    required _i37.Task? task,
+    required _i47.Target? target,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6706,7 +7200,7 @@
             #target: target,
           },
         ),
-        returnValue: _i20.Future<_i8.Build>.value(_FakeBuild_7(
+        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
           this,
           Invocation.method(
             #reschedulePostsubmitBuildUsingCheckRunEvent,
@@ -6718,10 +7212,10 @@
             },
           ),
         )),
-      ) as _i20.Future<_i8.Build>);
+      ) as _i21.Future<_i8.Build>);
 
   @override
-  _i20.Future<_i8.Build> getBuildById(
+  _i21.Future<_i8.Build> getBuildById(
     String? id, {
     String? fields,
   }) =>
@@ -6731,7 +7225,7 @@
           [id],
           {#fields: fields},
         ),
-        returnValue: _i20.Future<_i8.Build>.value(_FakeBuild_7(
+        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
           this,
           Invocation.method(
             #getBuildById,
@@ -6739,10 +7233,31 @@
             {#fields: fields},
           ),
         )),
-      ) as _i20.Future<_i8.Build>);
+      ) as _i21.Future<_i8.Build>);
 
   @override
-  _i20.Future<Set<String>> getAvailableBuilderSet({
+  _i21.Future<_i9.Build> getBuildByIdV2(
+    _i49.Int64? id, {
+    _i9.BuildMask? buildMask,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getBuildByIdV2,
+          [id],
+          {#buildMask: buildMask},
+        ),
+        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
+          this,
+          Invocation.method(
+            #getBuildByIdV2,
+            [id],
+            {#buildMask: buildMask},
+          ),
+        )),
+      ) as _i21.Future<_i9.Build>);
+
+  @override
+  _i21.Future<Set<String>> getAvailableBuilderSet({
     String? project = r'flutter',
     String? bucket = r'prod',
   }) =>
@@ -6755,13 +7270,13 @@
             #bucket: bucket,
           },
         ),
-        returnValue: _i20.Future<Set<String>>.value(<String>{}),
-      ) as _i20.Future<Set<String>>);
+        returnValue: _i21.Future<Set<String>>.value(<String>{}),
+      ) as _i21.Future<Set<String>>);
 
   @override
-  _i20.Future<List<_i15.Tuple<_i42.Target, _i35.Task, int>>> schedulePostsubmitBuilds({
-    required _i34.Commit? commit,
-    required List<_i15.Tuple<_i42.Target, _i35.Task, int>>? toBeScheduled,
+  _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>> schedulePostsubmitBuilds({
+    required _i36.Commit? commit,
+    required List<_i16.Tuple<_i47.Target, _i37.Task, int>>? toBeScheduled,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6772,14 +7287,14 @@
             #toBeScheduled: toBeScheduled,
           },
         ),
-        returnValue: _i20.Future<List<_i15.Tuple<_i42.Target, _i35.Task, int>>>.value(
-            <_i15.Tuple<_i42.Target, _i35.Task, int>>[]),
-      ) as _i20.Future<List<_i15.Tuple<_i42.Target, _i35.Task, int>>>);
+        returnValue: _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>>.value(
+            <_i16.Tuple<_i47.Target, _i37.Task, int>>[]),
+      ) as _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>>);
 
   @override
-  _i20.Future<void> createPostsubmitCheckRun(
-    _i34.Commit? commit,
-    _i42.Target? target,
+  _i21.Future<void> createPostsubmitCheckRun(
+    _i36.Commit? commit,
+    _i47.Target? target,
     Map<String, dynamic>? rawUserData,
   ) =>
       (super.noSuchMethod(
@@ -6791,20 +7306,20 @@
             rawUserData,
           ],
         ),
-        returnValue: _i20.Future<void>.value(),
-        returnValueForMissingStub: _i20.Future<void>.value(),
-      ) as _i20.Future<void>);
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
 
   @override
-  _i20.Future<bool> checkRerunBuilder({
-    required _i34.Commit? commit,
-    required _i42.Target? target,
-    required _i35.Task? task,
-    required _i9.DatastoreService? datastore,
-    _i15.FirestoreService? firestoreService,
+  _i21.Future<bool> checkRerunBuilder({
+    required _i36.Commit? commit,
+    required _i47.Target? target,
+    required _i37.Task? task,
+    required _i10.DatastoreService? datastore,
+    required _i42.Task? taskDocument,
+    required _i16.FirestoreService? firestoreService,
     Map<String, List<String>>? tags,
     bool? ignoreChecks = false,
-    _i40.Task? taskDocument,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6815,32 +7330,474 @@
             #target: target,
             #task: task,
             #datastore: datastore,
+            #taskDocument: taskDocument,
             #firestoreService: firestoreService,
             #tags: tags,
             #ignoreChecks: ignoreChecks,
-            #taskDocument: taskDocument,
           },
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
+}
+
+/// A class which mocks [LuciBuildServiceV2].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockLuciBuildServiceV2 extends _i1.Mock implements _i46.LuciBuildServiceV2 {
+  MockLuciBuildServiceV2() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  _i28.BuildBucketV2Client get buildBucketV2Client => (super.noSuchMethod(
+        Invocation.getter(#buildBucketV2Client),
+        returnValue: _FakeBuildBucketV2Client_71(
+          this,
+          Invocation.getter(#buildBucketV2Client),
+        ),
+      ) as _i28.BuildBucketV2Client);
+
+  @override
+  set buildBucketV2Client(_i28.BuildBucketV2Client? _buildBucketV2Client) => super.noSuchMethod(
+        Invocation.setter(
+          #buildBucketV2Client,
+          _buildBucketV2Client,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  _i16.CacheService get cache => (super.noSuchMethod(
+        Invocation.getter(#cache),
+        returnValue: _FakeCacheService_72(
+          this,
+          Invocation.getter(#cache),
+        ),
+      ) as _i16.CacheService);
+
+  @override
+  _i3.Config get config => (super.noSuchMethod(
+        Invocation.getter(#config),
+        returnValue: _FakeConfig_1(
+          this,
+          Invocation.getter(#config),
+        ),
+      ) as _i3.Config);
+
+  @override
+  set config(_i3.Config? _config) => super.noSuchMethod(
+        Invocation.setter(
+          #config,
+          _config,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  _i25.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
+        Invocation.getter(#githubChecksUtil),
+        returnValue: _FakeGithubChecksUtil_40(
+          this,
+          Invocation.getter(#githubChecksUtil),
+        ),
+      ) as _i25.GithubChecksUtil);
+
+  @override
+  set githubChecksUtil(_i25.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
+        Invocation.setter(
+          #githubChecksUtil,
+          _githubChecksUtil,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  _i7.GerritService get gerritService => (super.noSuchMethod(
+        Invocation.getter(#gerritService),
+        returnValue: _FakeGerritService_6(
+          this,
+          Invocation.getter(#gerritService),
+        ),
+      ) as _i7.GerritService);
+
+  @override
+  set gerritService(_i7.GerritService? _gerritService) => super.noSuchMethod(
+        Invocation.setter(
+          #gerritService,
+          _gerritService,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  _i16.PubSub get pubsub => (super.noSuchMethod(
+        Invocation.getter(#pubsub),
+        returnValue: _FakePubSub_73(
+          this,
+          Invocation.getter(#pubsub),
+        ),
+      ) as _i16.PubSub);
+
+  @override
+  _i21.Future<List<List<_i9.BatchRequest_Request>>> shard({
+    required List<_i9.BatchRequest_Request>? requests,
+    required int? maxShardSize,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #shard,
+          [],
+          {
+            #requests: requests,
+            #maxShardSize: maxShardSize,
+          },
+        ),
+        returnValue: _i21.Future<List<List<_i9.BatchRequest_Request>>>.value(<List<_i9.BatchRequest_Request>>[]),
+      ) as _i21.Future<List<List<_i9.BatchRequest_Request>>>);
+
+  @override
+  _i21.Future<Iterable<_i9.Build>> getTryBuilds({
+    required _i14.RepositorySlug? slug,
+    required String? sha,
+    String? builderName,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTryBuilds,
+          [],
+          {
+            #slug: slug,
+            #sha: sha,
+            #builderName: builderName,
+          },
+        ),
+        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
+      ) as _i21.Future<Iterable<_i9.Build>>);
+
+  @override
+  _i21.Future<Iterable<_i9.Build>> getTryBuildsByPullRequest({required _i14.PullRequest? pullRequest}) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getTryBuildsByPullRequest,
+          [],
+          {#pullRequest: pullRequest},
+        ),
+        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
+      ) as _i21.Future<Iterable<_i9.Build>>);
+
+  @override
+  _i21.Future<Iterable<_i9.Build>> getProdBuilds({
+    required _i14.RepositorySlug? slug,
+    required String? commitSha,
+    String? builderName,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getProdBuilds,
+          [],
+          {
+            #slug: slug,
+            #commitSha: commitSha,
+            #builderName: builderName,
+          },
+        ),
+        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
+      ) as _i21.Future<Iterable<_i9.Build>>);
+
+  @override
+  _i21.Future<Iterable<_i9.Build>> getBuilds({
+    required _i14.RepositorySlug? slug,
+    required String? commitSha,
+    required String? builderName,
+    required String? bucket,
+    required List<_i9.StringPair>? tags,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getBuilds,
+          [],
+          {
+            #slug: slug,
+            #commitSha: commitSha,
+            #builderName: builderName,
+            #bucket: bucket,
+            #tags: tags,
+          },
+        ),
+        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
+      ) as _i21.Future<Iterable<_i9.Build>>);
+
+  @override
+  _i21.Future<List<_i47.Target>> scheduleTryBuilds({
+    required List<_i47.Target>? targets,
+    required _i14.PullRequest? pullRequest,
+    _i34.CheckSuiteEvent? checkSuiteEvent,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #scheduleTryBuilds,
+          [],
+          {
+            #targets: targets,
+            #pullRequest: pullRequest,
+            #checkSuiteEvent: checkSuiteEvent,
+          },
+        ),
+        returnValue: _i21.Future<List<_i47.Target>>.value(<_i47.Target>[]),
+      ) as _i21.Future<List<_i47.Target>>);
+
+  @override
+  _i21.Future<void> cancelBuilds({
+    required _i14.PullRequest? pullRequest,
+    required String? reason,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #cancelBuilds,
+          [],
+          {
+            #pullRequest: pullRequest,
+            #reason: reason,
+          },
+        ),
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
+
+  @override
+  _i21.Future<List<_i9.Build?>> failedBuilds({
+    required _i14.PullRequest? pullRequest,
+    required List<_i47.Target>? targets,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #failedBuilds,
+          [],
+          {
+            #pullRequest: pullRequest,
+            #targets: targets,
+          },
+        ),
+        returnValue: _i21.Future<List<_i9.Build?>>.value(<_i9.Build?>[]),
+      ) as _i21.Future<List<_i9.Build?>>);
+
+  @override
+  _i21.Future<_i9.Build> rescheduleBuild({
+    required String? builderName,
+    required _i9.Build? build,
+    required int? rescheduleAttempt,
+    required Map<String, dynamic>? userDataMap,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #rescheduleBuild,
+          [],
+          {
+            #builderName: builderName,
+            #build: build,
+            #rescheduleAttempt: rescheduleAttempt,
+            #userDataMap: userDataMap,
+          },
+        ),
+        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
+          this,
+          Invocation.method(
+            #rescheduleBuild,
+            [],
+            {
+              #builderName: builderName,
+              #build: build,
+              #rescheduleAttempt: rescheduleAttempt,
+              #userDataMap: userDataMap,
+            },
+          ),
+        )),
+      ) as _i21.Future<_i9.Build>);
+
+  @override
+  _i21.Future<_i9.Build> reschedulePresubmitBuildUsingCheckRunEvent({required _i48.CheckRunEvent? checkRunEvent}) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #reschedulePresubmitBuildUsingCheckRunEvent,
+          [],
+          {#checkRunEvent: checkRunEvent},
+        ),
+        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
+          this,
+          Invocation.method(
+            #reschedulePresubmitBuildUsingCheckRunEvent,
+            [],
+            {#checkRunEvent: checkRunEvent},
+          ),
+        )),
+      ) as _i21.Future<_i9.Build>);
+
+  @override
+  List<String>? extractPrefixedLabels({
+    List<_i14.IssueLabel>? issueLabels,
+    required String? prefix,
+  }) =>
+      (super.noSuchMethod(Invocation.method(
+        #extractPrefixedLabels,
+        [],
+        {
+          #issueLabels: issueLabels,
+          #prefix: prefix,
+        },
+      )) as List<String>?);
+
+  @override
+  _i21.Future<_i9.Build> reschedulePostsubmitBuildUsingCheckRunEvent(
+    _i48.CheckRunEvent? checkRunEvent, {
+    required _i36.Commit? commit,
+    required _i37.Task? task,
+    required _i47.Target? target,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #reschedulePostsubmitBuildUsingCheckRunEvent,
+          [checkRunEvent],
+          {
+            #commit: commit,
+            #task: task,
+            #target: target,
+          },
+        ),
+        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
+          this,
+          Invocation.method(
+            #reschedulePostsubmitBuildUsingCheckRunEvent,
+            [checkRunEvent],
+            {
+              #commit: commit,
+              #task: task,
+              #target: target,
+            },
+          ),
+        )),
+      ) as _i21.Future<_i9.Build>);
+
+  @override
+  _i21.Future<_i9.Build> getBuildById(
+    _i49.Int64? id, {
+    _i9.BuildMask? buildMask,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getBuildById,
+          [id],
+          {#buildMask: buildMask},
+        ),
+        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
+          this,
+          Invocation.method(
+            #getBuildById,
+            [id],
+            {#buildMask: buildMask},
+          ),
+        )),
+      ) as _i21.Future<_i9.Build>);
+
+  @override
+  _i21.Future<Set<String>> getAvailableBuilderSet({
+    String? project = r'flutter',
+    String? bucket = r'prod',
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getAvailableBuilderSet,
+          [],
+          {
+            #project: project,
+            #bucket: bucket,
+          },
+        ),
+        returnValue: _i21.Future<Set<String>>.value(<String>{}),
+      ) as _i21.Future<Set<String>>);
+
+  @override
+  _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>> schedulePostsubmitBuilds({
+    required _i36.Commit? commit,
+    required List<_i16.Tuple<_i47.Target, _i37.Task, int>>? toBeScheduled,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #schedulePostsubmitBuilds,
+          [],
+          {
+            #commit: commit,
+            #toBeScheduled: toBeScheduled,
+          },
+        ),
+        returnValue: _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>>.value(
+            <_i16.Tuple<_i47.Target, _i37.Task, int>>[]),
+      ) as _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>>);
+
+  @override
+  _i21.Future<void> createPostsubmitCheckRun(
+    _i36.Commit? commit,
+    _i47.Target? target,
+    Map<String, dynamic>? rawUserData,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createPostsubmitCheckRun,
+          [
+            commit,
+            target,
+            rawUserData,
+          ],
+        ),
+        returnValue: _i21.Future<void>.value(),
+        returnValueForMissingStub: _i21.Future<void>.value(),
+      ) as _i21.Future<void>);
+
+  @override
+  _i21.Future<bool> checkRerunBuilder({
+    required _i36.Commit? commit,
+    required _i47.Target? target,
+    required _i37.Task? task,
+    required _i10.DatastoreService? datastore,
+    required _i42.Task? taskDocument,
+    required _i16.FirestoreService? firestoreService,
+    List<_i9.StringPair>? tags,
+    bool? ignoreChecks = false,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #checkRerunBuilder,
+          [],
+          {
+            #commit: commit,
+            #target: target,
+            #task: task,
+            #datastore: datastore,
+            #taskDocument: taskDocument,
+            #firestoreService: firestoreService,
+            #tags: tags,
+            #ignoreChecks: ignoreChecks,
+          },
+        ),
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 }
 
 /// A class which mocks [ProcessManager].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockProcessManager extends _i1.Mock implements _i44.ProcessManager {
+class MockProcessManager extends _i1.Mock implements _i50.ProcessManager {
   MockProcessManager() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i20.Future<_i25.Process> start(
+  _i21.Future<_i26.Process> start(
     List<Object>? command, {
     String? workingDirectory,
     Map<String, String>? environment,
     bool? includeParentEnvironment = true,
     bool? runInShell = false,
-    _i25.ProcessStartMode? mode = _i25.ProcessStartMode.normal,
+    _i26.ProcessStartMode? mode = _i26.ProcessStartMode.normal,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6854,7 +7811,7 @@
             #mode: mode,
           },
         ),
-        returnValue: _i20.Future<_i25.Process>.value(_FakeProcess_69(
+        returnValue: _i21.Future<_i26.Process>.value(_FakeProcess_74(
           this,
           Invocation.method(
             #start,
@@ -6868,17 +7825,17 @@
             },
           ),
         )),
-      ) as _i20.Future<_i25.Process>);
+      ) as _i21.Future<_i26.Process>);
 
   @override
-  _i20.Future<_i25.ProcessResult> run(
+  _i21.Future<_i26.ProcessResult> run(
     List<Object>? command, {
     String? workingDirectory,
     Map<String, String>? environment,
     bool? includeParentEnvironment = true,
     bool? runInShell = false,
-    _i26.Encoding? stdoutEncoding = const _i25.SystemEncoding(),
-    _i26.Encoding? stderrEncoding = const _i25.SystemEncoding(),
+    _i27.Encoding? stdoutEncoding = const _i26.SystemEncoding(),
+    _i27.Encoding? stderrEncoding = const _i26.SystemEncoding(),
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6893,7 +7850,7 @@
             #stderrEncoding: stderrEncoding,
           },
         ),
-        returnValue: _i20.Future<_i25.ProcessResult>.value(_i30.dummyValue<_i25.ProcessResult>(
+        returnValue: _i21.Future<_i26.ProcessResult>.value(_i32.dummyValue<_i26.ProcessResult>(
           this,
           Invocation.method(
             #run,
@@ -6908,17 +7865,17 @@
             },
           ),
         )),
-      ) as _i20.Future<_i25.ProcessResult>);
+      ) as _i21.Future<_i26.ProcessResult>);
 
   @override
-  _i25.ProcessResult runSync(
+  _i26.ProcessResult runSync(
     List<Object>? command, {
     String? workingDirectory,
     Map<String, String>? environment,
     bool? includeParentEnvironment = true,
     bool? runInShell = false,
-    _i26.Encoding? stdoutEncoding = const _i25.SystemEncoding(),
-    _i26.Encoding? stderrEncoding = const _i25.SystemEncoding(),
+    _i27.Encoding? stdoutEncoding = const _i26.SystemEncoding(),
+    _i27.Encoding? stderrEncoding = const _i26.SystemEncoding(),
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6933,7 +7890,7 @@
             #stderrEncoding: stderrEncoding,
           },
         ),
-        returnValue: _i30.dummyValue<_i25.ProcessResult>(
+        returnValue: _i32.dummyValue<_i26.ProcessResult>(
           this,
           Invocation.method(
             #runSync,
@@ -6948,7 +7905,7 @@
             },
           ),
         ),
-      ) as _i25.ProcessResult);
+      ) as _i26.ProcessResult);
 
   @override
   bool canRun(
@@ -6967,7 +7924,7 @@
   @override
   bool killPid(
     int? pid, [
-    _i25.ProcessSignal? signal = _i25.ProcessSignal.sigterm,
+    _i26.ProcessSignal? signal = _i26.ProcessSignal.sigterm,
   ]) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -6984,23 +7941,23 @@
 /// A class which mocks [PullRequestsService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPullRequestsService extends _i1.Mock implements _i13.PullRequestsService {
+class MockPullRequestsService extends _i1.Mock implements _i14.PullRequestsService {
   MockPullRequestsService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i13.GitHub get github => (super.noSuchMethod(
+  _i14.GitHub get github => (super.noSuchMethod(
         Invocation.getter(#github),
-        returnValue: _FakeGitHub_16(
+        returnValue: _FakeGitHub_20(
           this,
           Invocation.getter(#github),
         ),
-      ) as _i13.GitHub);
+      ) as _i14.GitHub);
 
   @override
-  _i20.Stream<_i13.PullRequest> list(
-    _i13.RepositorySlug? slug, {
+  _i21.Stream<_i14.PullRequest> list(
+    _i14.RepositorySlug? slug, {
     int? pages,
     String? base,
     String? direction = r'desc',
@@ -7021,12 +7978,12 @@
             #state: state,
           },
         ),
-        returnValue: _i20.Stream<_i13.PullRequest>.empty(),
-      ) as _i20.Stream<_i13.PullRequest>);
+        returnValue: _i21.Stream<_i14.PullRequest>.empty(),
+      ) as _i21.Stream<_i14.PullRequest>);
 
   @override
-  _i20.Future<_i13.PullRequest> get(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.PullRequest> get(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -7037,7 +7994,7 @@
             number,
           ],
         ),
-        returnValue: _i20.Future<_i13.PullRequest>.value(_FakePullRequest_41(
+        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
           this,
           Invocation.method(
             #get,
@@ -7047,12 +8004,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.PullRequest>);
+      ) as _i21.Future<_i14.PullRequest>);
 
   @override
-  _i20.Future<_i13.PullRequest> create(
-    _i13.RepositorySlug? slug,
-    _i13.CreatePullRequest? request,
+  _i21.Future<_i14.PullRequest> create(
+    _i14.RepositorySlug? slug,
+    _i14.CreatePullRequest? request,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -7062,7 +8019,7 @@
             request,
           ],
         ),
-        returnValue: _i20.Future<_i13.PullRequest>.value(_FakePullRequest_41(
+        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
           this,
           Invocation.method(
             #create,
@@ -7072,11 +8029,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.PullRequest>);
+      ) as _i21.Future<_i14.PullRequest>);
 
   @override
-  _i20.Future<_i13.PullRequest> edit(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.PullRequest> edit(
+    _i14.RepositorySlug? slug,
     int? number, {
     String? title,
     String? body,
@@ -7097,7 +8054,7 @@
             #base: base,
           },
         ),
-        returnValue: _i20.Future<_i13.PullRequest>.value(_FakePullRequest_41(
+        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
           this,
           Invocation.method(
             #edit,
@@ -7113,11 +8070,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.PullRequest>);
+      ) as _i21.Future<_i14.PullRequest>);
 
   @override
-  _i20.Stream<_i13.RepositoryCommit> listCommits(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.RepositoryCommit> listCommits(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -7128,12 +8085,12 @@
             number,
           ],
         ),
-        returnValue: _i20.Stream<_i13.RepositoryCommit>.empty(),
-      ) as _i20.Stream<_i13.RepositoryCommit>);
+        returnValue: _i21.Stream<_i14.RepositoryCommit>.empty(),
+      ) as _i21.Stream<_i14.RepositoryCommit>);
 
   @override
-  _i20.Stream<_i13.PullRequestFile> listFiles(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.PullRequestFile> listFiles(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -7144,12 +8101,12 @@
             number,
           ],
         ),
-        returnValue: _i20.Stream<_i13.PullRequestFile>.empty(),
-      ) as _i20.Stream<_i13.PullRequestFile>);
+        returnValue: _i21.Stream<_i14.PullRequestFile>.empty(),
+      ) as _i21.Stream<_i14.PullRequestFile>);
 
   @override
-  _i20.Stream<_i13.PullRequestReview> listReviews(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.PullRequestReview> listReviews(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -7160,12 +8117,12 @@
             number,
           ],
         ),
-        returnValue: _i20.Stream<_i13.PullRequestReview>.empty(),
-      ) as _i20.Stream<_i13.PullRequestReview>);
+        returnValue: _i21.Stream<_i14.PullRequestReview>.empty(),
+      ) as _i21.Stream<_i14.PullRequestReview>);
 
   @override
-  _i20.Future<bool> isMerged(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> isMerged(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -7176,15 +8133,15 @@
             number,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<_i13.PullRequestMerge> merge(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.PullRequestMerge> merge(
+    _i14.RepositorySlug? slug,
     int? number, {
     String? message,
-    _i13.MergeMethod? mergeMethod = _i13.MergeMethod.merge,
+    _i14.MergeMethod? mergeMethod = _i14.MergeMethod.merge,
     String? requestSha,
   }) =>
       (super.noSuchMethod(
@@ -7200,7 +8157,7 @@
             #requestSha: requestSha,
           },
         ),
-        returnValue: _i20.Future<_i13.PullRequestMerge>.value(_FakePullRequestMerge_70(
+        returnValue: _i21.Future<_i14.PullRequestMerge>.value(_FakePullRequestMerge_75(
           this,
           Invocation.method(
             #merge,
@@ -7215,11 +8172,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.PullRequestMerge>);
+      ) as _i21.Future<_i14.PullRequestMerge>);
 
   @override
-  _i20.Stream<_i13.PullRequestComment> listCommentsByPullRequest(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.PullRequestComment> listCommentsByPullRequest(
+    _i14.RepositorySlug? slug,
     int? number,
   ) =>
       (super.noSuchMethod(
@@ -7230,23 +8187,23 @@
             number,
           ],
         ),
-        returnValue: _i20.Stream<_i13.PullRequestComment>.empty(),
-      ) as _i20.Stream<_i13.PullRequestComment>);
+        returnValue: _i21.Stream<_i14.PullRequestComment>.empty(),
+      ) as _i21.Stream<_i14.PullRequestComment>);
 
   @override
-  _i20.Stream<_i13.PullRequestComment> listComments(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.PullRequestComment> listComments(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listComments,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.PullRequestComment>.empty(),
-      ) as _i20.Stream<_i13.PullRequestComment>);
+        returnValue: _i21.Stream<_i14.PullRequestComment>.empty(),
+      ) as _i21.Stream<_i14.PullRequestComment>);
 
   @override
-  _i20.Future<_i13.PullRequestComment> createComment(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.PullRequestComment> createComment(
+    _i14.RepositorySlug? slug,
     int? number,
-    _i13.CreatePullRequestComment? comment,
+    _i14.CreatePullRequestComment? comment,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -7257,7 +8214,7 @@
             comment,
           ],
         ),
-        returnValue: _i20.Future<_i13.PullRequestComment>.value(_FakePullRequestComment_71(
+        returnValue: _i21.Future<_i14.PullRequestComment>.value(_FakePullRequestComment_76(
           this,
           Invocation.method(
             #createComment,
@@ -7268,12 +8225,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.PullRequestComment>);
+      ) as _i21.Future<_i14.PullRequestComment>);
 
   @override
-  _i20.Future<_i13.PullRequestReview> createReview(
-    _i13.RepositorySlug? slug,
-    _i13.CreatePullRequestReview? review,
+  _i21.Future<_i14.PullRequestReview> createReview(
+    _i14.RepositorySlug? slug,
+    _i14.CreatePullRequestReview? review,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -7283,7 +8240,7 @@
             review,
           ],
         ),
-        returnValue: _i20.Future<_i13.PullRequestReview>.value(_FakePullRequestReview_72(
+        returnValue: _i21.Future<_i14.PullRequestReview>.value(_FakePullRequestReview_77(
           this,
           Invocation.method(
             #createReview,
@@ -7293,28 +8250,28 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.PullRequestReview>);
+      ) as _i21.Future<_i14.PullRequestReview>);
 }
 
 /// A class which mocks [RepositoriesService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockRepositoriesService extends _i1.Mock implements _i13.RepositoriesService {
+class MockRepositoriesService extends _i1.Mock implements _i14.RepositoriesService {
   MockRepositoriesService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i13.GitHub get github => (super.noSuchMethod(
+  _i14.GitHub get github => (super.noSuchMethod(
         Invocation.getter(#github),
-        returnValue: _FakeGitHub_16(
+        returnValue: _FakeGitHub_20(
           this,
           Invocation.getter(#github),
         ),
-      ) as _i13.GitHub);
+      ) as _i14.GitHub);
 
   @override
-  _i20.Stream<_i13.Repository> listRepositories({
+  _i21.Stream<_i14.Repository> listRepositories({
     String? type = r'owner',
     String? sort = r'full_name',
     String? direction = r'asc',
@@ -7329,11 +8286,11 @@
             #direction: direction,
           },
         ),
-        returnValue: _i20.Stream<_i13.Repository>.empty(),
-      ) as _i20.Stream<_i13.Repository>);
+        returnValue: _i21.Stream<_i14.Repository>.empty(),
+      ) as _i21.Stream<_i14.Repository>);
 
   @override
-  _i20.Stream<_i13.Repository> listUserRepositories(
+  _i21.Stream<_i14.Repository> listUserRepositories(
     String? user, {
     String? type = r'owner',
     String? sort = r'full_name',
@@ -7349,11 +8306,11 @@
             #direction: direction,
           },
         ),
-        returnValue: _i20.Stream<_i13.Repository>.empty(),
-      ) as _i20.Stream<_i13.Repository>);
+        returnValue: _i21.Stream<_i14.Repository>.empty(),
+      ) as _i21.Stream<_i14.Repository>);
 
   @override
-  _i20.Stream<_i13.Repository> listOrganizationRepositories(
+  _i21.Stream<_i14.Repository> listOrganizationRepositories(
     String? org, {
     String? type = r'all',
   }) =>
@@ -7363,11 +8320,11 @@
           [org],
           {#type: type},
         ),
-        returnValue: _i20.Stream<_i13.Repository>.empty(),
-      ) as _i20.Stream<_i13.Repository>);
+        returnValue: _i21.Stream<_i14.Repository>.empty(),
+      ) as _i21.Stream<_i14.Repository>);
 
   @override
-  _i20.Stream<_i13.Repository> listPublicRepositories({
+  _i21.Stream<_i14.Repository> listPublicRepositories({
     int? limit = 50,
     DateTime? since,
   }) =>
@@ -7380,12 +8337,12 @@
             #since: since,
           },
         ),
-        returnValue: _i20.Stream<_i13.Repository>.empty(),
-      ) as _i20.Stream<_i13.Repository>);
+        returnValue: _i21.Stream<_i14.Repository>.empty(),
+      ) as _i21.Stream<_i14.Repository>);
 
   @override
-  _i20.Future<_i13.Repository> createRepository(
-    _i13.CreateRepository? repository, {
+  _i21.Future<_i14.Repository> createRepository(
+    _i14.CreateRepository? repository, {
     String? org,
   }) =>
       (super.noSuchMethod(
@@ -7394,7 +8351,7 @@
           [repository],
           {#org: org},
         ),
-        returnValue: _i20.Future<_i13.Repository>.value(_FakeRepository_73(
+        returnValue: _i21.Future<_i14.Repository>.value(_FakeRepository_78(
           this,
           Invocation.method(
             #createRepository,
@@ -7402,50 +8359,50 @@
             {#org: org},
           ),
         )),
-      ) as _i20.Future<_i13.Repository>);
+      ) as _i21.Future<_i14.Repository>);
 
   @override
-  _i20.Future<_i13.LicenseDetails> getLicense(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<_i14.LicenseDetails> getLicense(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #getLicense,
           [slug],
         ),
-        returnValue: _i20.Future<_i13.LicenseDetails>.value(_FakeLicenseDetails_74(
+        returnValue: _i21.Future<_i14.LicenseDetails>.value(_FakeLicenseDetails_79(
           this,
           Invocation.method(
             #getLicense,
             [slug],
           ),
         )),
-      ) as _i20.Future<_i13.LicenseDetails>);
+      ) as _i21.Future<_i14.LicenseDetails>);
 
   @override
-  _i20.Future<_i13.Repository> getRepository(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<_i14.Repository> getRepository(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #getRepository,
           [slug],
         ),
-        returnValue: _i20.Future<_i13.Repository>.value(_FakeRepository_73(
+        returnValue: _i21.Future<_i14.Repository>.value(_FakeRepository_78(
           this,
           Invocation.method(
             #getRepository,
             [slug],
           ),
         )),
-      ) as _i20.Future<_i13.Repository>);
+      ) as _i21.Future<_i14.Repository>);
 
   @override
-  _i20.Stream<_i13.Repository> getRepositories(List<_i13.RepositorySlug>? slugs) => (super.noSuchMethod(
+  _i21.Stream<_i14.Repository> getRepositories(List<_i14.RepositorySlug>? slugs) => (super.noSuchMethod(
         Invocation.method(
           #getRepositories,
           [slugs],
         ),
-        returnValue: _i20.Stream<_i13.Repository>.empty(),
-      ) as _i20.Stream<_i13.Repository>);
+        returnValue: _i21.Stream<_i14.Repository>.empty(),
+      ) as _i21.Stream<_i14.Repository>);
 
   @override
-  _i20.Future<_i13.Repository> editRepository(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.Repository> editRepository(
+    _i14.RepositorySlug? slug, {
     String? name,
     String? description,
     String? homepage,
@@ -7468,7 +8425,7 @@
             #hasDownloads: hasDownloads,
           },
         ),
-        returnValue: _i20.Future<_i13.Repository>.value(_FakeRepository_73(
+        returnValue: _i21.Future<_i14.Repository>.value(_FakeRepository_78(
           this,
           Invocation.method(
             #editRepository,
@@ -7484,20 +8441,20 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.Repository>);
+      ) as _i21.Future<_i14.Repository>);
 
   @override
-  _i20.Future<bool> deleteRepository(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<bool> deleteRepository(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #deleteRepository,
           [slug],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.Contributor> listContributors(
-    _i13.RepositorySlug? slug, {
+  _i21.Stream<_i14.Contributor> listContributors(
+    _i14.RepositorySlug? slug, {
     bool? anon = false,
   }) =>
       (super.noSuchMethod(
@@ -7506,36 +8463,36 @@
           [slug],
           {#anon: anon},
         ),
-        returnValue: _i20.Stream<_i13.Contributor>.empty(),
-      ) as _i20.Stream<_i13.Contributor>);
+        returnValue: _i21.Stream<_i14.Contributor>.empty(),
+      ) as _i21.Stream<_i14.Contributor>);
 
   @override
-  _i20.Stream<_i13.Team> listTeams(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.Team> listTeams(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listTeams,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.Team>.empty(),
-      ) as _i20.Stream<_i13.Team>);
+        returnValue: _i21.Stream<_i14.Team>.empty(),
+      ) as _i21.Stream<_i14.Team>);
 
   @override
-  _i20.Future<_i13.LanguageBreakdown> listLanguages(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<_i14.LanguageBreakdown> listLanguages(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listLanguages,
           [slug],
         ),
-        returnValue: _i20.Future<_i13.LanguageBreakdown>.value(_FakeLanguageBreakdown_75(
+        returnValue: _i21.Future<_i14.LanguageBreakdown>.value(_FakeLanguageBreakdown_80(
           this,
           Invocation.method(
             #listLanguages,
             [slug],
           ),
         )),
-      ) as _i20.Future<_i13.LanguageBreakdown>);
+      ) as _i21.Future<_i14.LanguageBreakdown>);
 
   @override
-  _i20.Stream<_i13.Tag> listTags(
-    _i13.RepositorySlug? slug, {
+  _i21.Stream<_i14.Tag> listTags(
+    _i14.RepositorySlug? slug, {
     int? page = 1,
     int? pages,
     int? perPage = 30,
@@ -7550,21 +8507,21 @@
             #perPage: perPage,
           },
         ),
-        returnValue: _i20.Stream<_i13.Tag>.empty(),
-      ) as _i20.Stream<_i13.Tag>);
+        returnValue: _i21.Stream<_i14.Tag>.empty(),
+      ) as _i21.Stream<_i14.Tag>);
 
   @override
-  _i20.Stream<_i13.Branch> listBranches(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.Branch> listBranches(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listBranches,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.Branch>.empty(),
-      ) as _i20.Stream<_i13.Branch>);
+        returnValue: _i21.Stream<_i14.Branch>.empty(),
+      ) as _i21.Stream<_i14.Branch>);
 
   @override
-  _i20.Future<_i13.Branch> getBranch(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.Branch> getBranch(
+    _i14.RepositorySlug? slug,
     String? branch,
   ) =>
       (super.noSuchMethod(
@@ -7575,7 +8532,7 @@
             branch,
           ],
         ),
-        returnValue: _i20.Future<_i13.Branch>.value(_FakeBranch_76(
+        returnValue: _i21.Future<_i14.Branch>.value(_FakeBranch_81(
           this,
           Invocation.method(
             #getBranch,
@@ -7585,20 +8542,20 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Branch>);
+      ) as _i21.Future<_i14.Branch>);
 
   @override
-  _i20.Stream<_i13.Collaborator> listCollaborators(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.Collaborator> listCollaborators(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listCollaborators,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.Collaborator>.empty(),
-      ) as _i20.Stream<_i13.Collaborator>);
+        returnValue: _i21.Stream<_i14.Collaborator>.empty(),
+      ) as _i21.Stream<_i14.Collaborator>);
 
   @override
-  _i20.Future<bool> isCollaborator(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> isCollaborator(
+    _i14.RepositorySlug? slug,
     String? user,
   ) =>
       (super.noSuchMethod(
@@ -7609,12 +8566,12 @@
             user,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> addCollaborator(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> addCollaborator(
+    _i14.RepositorySlug? slug,
     String? user,
   ) =>
       (super.noSuchMethod(
@@ -7625,12 +8582,12 @@
             user,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> removeCollaborator(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> removeCollaborator(
+    _i14.RepositorySlug? slug,
     String? user,
   ) =>
       (super.noSuchMethod(
@@ -7641,13 +8598,13 @@
             user,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.CommitComment> listSingleCommitComments(
-    _i13.RepositorySlug? slug,
-    _i13.RepositoryCommit? commit,
+  _i21.Stream<_i14.CommitComment> listSingleCommitComments(
+    _i14.RepositorySlug? slug,
+    _i14.RepositoryCommit? commit,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -7657,22 +8614,22 @@
             commit,
           ],
         ),
-        returnValue: _i20.Stream<_i13.CommitComment>.empty(),
-      ) as _i20.Stream<_i13.CommitComment>);
+        returnValue: _i21.Stream<_i14.CommitComment>.empty(),
+      ) as _i21.Stream<_i14.CommitComment>);
 
   @override
-  _i20.Stream<_i13.CommitComment> listCommitComments(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.CommitComment> listCommitComments(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listCommitComments,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.CommitComment>.empty(),
-      ) as _i20.Stream<_i13.CommitComment>);
+        returnValue: _i21.Stream<_i14.CommitComment>.empty(),
+      ) as _i21.Stream<_i14.CommitComment>);
 
   @override
-  _i20.Future<_i13.CommitComment> createCommitComment(
-    _i13.RepositorySlug? slug,
-    _i13.RepositoryCommit? commit, {
+  _i21.Future<_i14.CommitComment> createCommitComment(
+    _i14.RepositorySlug? slug,
+    _i14.RepositoryCommit? commit, {
     required String? body,
     String? path,
     int? position,
@@ -7692,7 +8649,7 @@
             #line: line,
           },
         ),
-        returnValue: _i20.Future<_i13.CommitComment>.value(_FakeCommitComment_77(
+        returnValue: _i21.Future<_i14.CommitComment>.value(_FakeCommitComment_82(
           this,
           Invocation.method(
             #createCommitComment,
@@ -7708,11 +8665,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.CommitComment>);
+      ) as _i21.Future<_i14.CommitComment>);
 
   @override
-  _i20.Future<_i13.CommitComment> getCommitComment(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.CommitComment> getCommitComment(
+    _i14.RepositorySlug? slug, {
     required int? id,
   }) =>
       (super.noSuchMethod(
@@ -7721,7 +8678,7 @@
           [slug],
           {#id: id},
         ),
-        returnValue: _i20.Future<_i13.CommitComment>.value(_FakeCommitComment_77(
+        returnValue: _i21.Future<_i14.CommitComment>.value(_FakeCommitComment_82(
           this,
           Invocation.method(
             #getCommitComment,
@@ -7729,11 +8686,11 @@
             {#id: id},
           ),
         )),
-      ) as _i20.Future<_i13.CommitComment>);
+      ) as _i21.Future<_i14.CommitComment>);
 
   @override
-  _i20.Future<_i13.CommitComment> updateCommitComment(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.CommitComment> updateCommitComment(
+    _i14.RepositorySlug? slug, {
     required int? id,
     required String? body,
   }) =>
@@ -7746,7 +8703,7 @@
             #body: body,
           },
         ),
-        returnValue: _i20.Future<_i13.CommitComment>.value(_FakeCommitComment_77(
+        returnValue: _i21.Future<_i14.CommitComment>.value(_FakeCommitComment_82(
           this,
           Invocation.method(
             #updateCommitComment,
@@ -7757,11 +8714,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.CommitComment>);
+      ) as _i21.Future<_i14.CommitComment>);
 
   @override
-  _i20.Future<bool> deleteCommitComment(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<bool> deleteCommitComment(
+    _i14.RepositorySlug? slug, {
     required int? id,
   }) =>
       (super.noSuchMethod(
@@ -7770,12 +8727,12 @@
           [slug],
           {#id: id},
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.RepositoryCommit> listCommits(
-    _i13.RepositorySlug? slug, {
+  _i21.Stream<_i14.RepositoryCommit> listCommits(
+    _i14.RepositorySlug? slug, {
     String? sha,
     String? path,
     String? author,
@@ -7796,12 +8753,12 @@
             #until: until,
           },
         ),
-        returnValue: _i20.Stream<_i13.RepositoryCommit>.empty(),
-      ) as _i20.Stream<_i13.RepositoryCommit>);
+        returnValue: _i21.Stream<_i14.RepositoryCommit>.empty(),
+      ) as _i21.Stream<_i14.RepositoryCommit>);
 
   @override
-  _i20.Future<_i13.RepositoryCommit> getCommit(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.RepositoryCommit> getCommit(
+    _i14.RepositorySlug? slug,
     String? sha,
   ) =>
       (super.noSuchMethod(
@@ -7812,7 +8769,7 @@
             sha,
           ],
         ),
-        returnValue: _i20.Future<_i13.RepositoryCommit>.value(_FakeRepositoryCommit_78(
+        returnValue: _i21.Future<_i14.RepositoryCommit>.value(_FakeRepositoryCommit_83(
           this,
           Invocation.method(
             #getCommit,
@@ -7822,11 +8779,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.RepositoryCommit>);
+      ) as _i21.Future<_i14.RepositoryCommit>);
 
   @override
-  _i20.Future<String> getCommitDiff(
-    _i13.RepositorySlug? slug,
+  _i21.Future<String> getCommitDiff(
+    _i14.RepositorySlug? slug,
     String? sha,
   ) =>
       (super.noSuchMethod(
@@ -7837,7 +8794,7 @@
             sha,
           ],
         ),
-        returnValue: _i20.Future<String>.value(_i30.dummyValue<String>(
+        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
           this,
           Invocation.method(
             #getCommitDiff,
@@ -7847,11 +8804,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<String>);
+      ) as _i21.Future<String>);
 
   @override
-  _i20.Future<_i13.GitHubComparison> compareCommits(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.GitHubComparison> compareCommits(
+    _i14.RepositorySlug? slug,
     String? refBase,
     String? refHead,
   ) =>
@@ -7864,7 +8821,7 @@
             refHead,
           ],
         ),
-        returnValue: _i20.Future<_i13.GitHubComparison>.value(_FakeGitHubComparison_79(
+        returnValue: _i21.Future<_i14.GitHubComparison>.value(_FakeGitHubComparison_84(
           this,
           Invocation.method(
             #compareCommits,
@@ -7875,11 +8832,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.GitHubComparison>);
+      ) as _i21.Future<_i14.GitHubComparison>);
 
   @override
-  _i20.Future<_i13.GitHubFile> getReadme(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.GitHubFile> getReadme(
+    _i14.RepositorySlug? slug, {
     String? ref,
   }) =>
       (super.noSuchMethod(
@@ -7888,7 +8845,7 @@
           [slug],
           {#ref: ref},
         ),
-        returnValue: _i20.Future<_i13.GitHubFile>.value(_FakeGitHubFile_80(
+        returnValue: _i21.Future<_i14.GitHubFile>.value(_FakeGitHubFile_85(
           this,
           Invocation.method(
             #getReadme,
@@ -7896,11 +8853,11 @@
             {#ref: ref},
           ),
         )),
-      ) as _i20.Future<_i13.GitHubFile>);
+      ) as _i21.Future<_i14.GitHubFile>);
 
   @override
-  _i20.Future<_i13.RepositoryContents> getContents(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.RepositoryContents> getContents(
+    _i14.RepositorySlug? slug,
     String? path, {
     String? ref,
   }) =>
@@ -7913,7 +8870,7 @@
           ],
           {#ref: ref},
         ),
-        returnValue: _i20.Future<_i13.RepositoryContents>.value(_FakeRepositoryContents_81(
+        returnValue: _i21.Future<_i14.RepositoryContents>.value(_FakeRepositoryContents_86(
           this,
           Invocation.method(
             #getContents,
@@ -7924,12 +8881,12 @@
             {#ref: ref},
           ),
         )),
-      ) as _i20.Future<_i13.RepositoryContents>);
+      ) as _i21.Future<_i14.RepositoryContents>);
 
   @override
-  _i20.Future<_i13.ContentCreation> createFile(
-    _i13.RepositorySlug? slug,
-    _i13.CreateFile? file,
+  _i21.Future<_i14.ContentCreation> createFile(
+    _i14.RepositorySlug? slug,
+    _i14.CreateFile? file,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -7939,7 +8896,7 @@
             file,
           ],
         ),
-        returnValue: _i20.Future<_i13.ContentCreation>.value(_FakeContentCreation_82(
+        returnValue: _i21.Future<_i14.ContentCreation>.value(_FakeContentCreation_87(
           this,
           Invocation.method(
             #createFile,
@@ -7949,11 +8906,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.ContentCreation>);
+      ) as _i21.Future<_i14.ContentCreation>);
 
   @override
-  _i20.Future<_i13.ContentCreation> updateFile(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.ContentCreation> updateFile(
+    _i14.RepositorySlug? slug,
     String? path,
     String? message,
     String? content,
@@ -7972,7 +8929,7 @@
           ],
           {#branch: branch},
         ),
-        returnValue: _i20.Future<_i13.ContentCreation>.value(_FakeContentCreation_82(
+        returnValue: _i21.Future<_i14.ContentCreation>.value(_FakeContentCreation_87(
           this,
           Invocation.method(
             #updateFile,
@@ -7986,11 +8943,11 @@
             {#branch: branch},
           ),
         )),
-      ) as _i20.Future<_i13.ContentCreation>);
+      ) as _i21.Future<_i14.ContentCreation>);
 
   @override
-  _i20.Future<_i13.ContentCreation> deleteFile(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.ContentCreation> deleteFile(
+    _i14.RepositorySlug? slug,
     String? path,
     String? message,
     String? sha,
@@ -8007,7 +8964,7 @@
             branch,
           ],
         ),
-        returnValue: _i20.Future<_i13.ContentCreation>.value(_FakeContentCreation_82(
+        returnValue: _i21.Future<_i14.ContentCreation>.value(_FakeContentCreation_87(
           this,
           Invocation.method(
             #deleteFile,
@@ -8020,11 +8977,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.ContentCreation>);
+      ) as _i21.Future<_i14.ContentCreation>);
 
   @override
-  _i20.Future<String?> getArchiveLink(
-    _i13.RepositorySlug? slug,
+  _i21.Future<String?> getArchiveLink(
+    _i14.RepositorySlug? slug,
     String? ref, {
     String? format = r'tarball',
   }) =>
@@ -8037,22 +8994,22 @@
           ],
           {#format: format},
         ),
-        returnValue: _i20.Future<String?>.value(),
-      ) as _i20.Future<String?>);
+        returnValue: _i21.Future<String?>.value(),
+      ) as _i21.Future<String?>);
 
   @override
-  _i20.Stream<_i13.Repository> listForks(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.Repository> listForks(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listForks,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.Repository>.empty(),
-      ) as _i20.Stream<_i13.Repository>);
+        returnValue: _i21.Stream<_i14.Repository>.empty(),
+      ) as _i21.Stream<_i14.Repository>);
 
   @override
-  _i20.Future<_i13.Repository> createFork(
-    _i13.RepositorySlug? slug, [
-    _i13.CreateFork? fork,
+  _i21.Future<_i14.Repository> createFork(
+    _i14.RepositorySlug? slug, [
+    _i14.CreateFork? fork,
   ]) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8062,7 +9019,7 @@
             fork,
           ],
         ),
-        returnValue: _i20.Future<_i13.Repository>.value(_FakeRepository_73(
+        returnValue: _i21.Future<_i14.Repository>.value(_FakeRepository_78(
           this,
           Invocation.method(
             #createFork,
@@ -8072,20 +9029,20 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Repository>);
+      ) as _i21.Future<_i14.Repository>);
 
   @override
-  _i20.Stream<_i13.Hook> listHooks(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.Hook> listHooks(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listHooks,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.Hook>.empty(),
-      ) as _i20.Stream<_i13.Hook>);
+        returnValue: _i21.Stream<_i14.Hook>.empty(),
+      ) as _i21.Stream<_i14.Hook>);
 
   @override
-  _i20.Future<_i13.Hook> getHook(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.Hook> getHook(
+    _i14.RepositorySlug? slug,
     int? id,
   ) =>
       (super.noSuchMethod(
@@ -8096,7 +9053,7 @@
             id,
           ],
         ),
-        returnValue: _i20.Future<_i13.Hook>.value(_FakeHook_83(
+        returnValue: _i21.Future<_i14.Hook>.value(_FakeHook_88(
           this,
           Invocation.method(
             #getHook,
@@ -8106,12 +9063,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Hook>);
+      ) as _i21.Future<_i14.Hook>);
 
   @override
-  _i20.Future<_i13.Hook> createHook(
-    _i13.RepositorySlug? slug,
-    _i13.CreateHook? hook,
+  _i21.Future<_i14.Hook> createHook(
+    _i14.RepositorySlug? slug,
+    _i14.CreateHook? hook,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8121,7 +9078,7 @@
             hook,
           ],
         ),
-        returnValue: _i20.Future<_i13.Hook>.value(_FakeHook_83(
+        returnValue: _i21.Future<_i14.Hook>.value(_FakeHook_88(
           this,
           Invocation.method(
             #createHook,
@@ -8131,12 +9088,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Hook>);
+      ) as _i21.Future<_i14.Hook>);
 
   @override
-  _i20.Future<_i13.Hook> editHook(
-    _i13.RepositorySlug? slug,
-    _i13.Hook? hookToEdit, {
+  _i21.Future<_i14.Hook> editHook(
+    _i14.RepositorySlug? slug,
+    _i14.Hook? hookToEdit, {
     String? configUrl,
     String? configContentType,
     String? configSecret,
@@ -8164,7 +9121,7 @@
             #active: active,
           },
         ),
-        returnValue: _i20.Future<_i13.Hook>.value(_FakeHook_83(
+        returnValue: _i21.Future<_i14.Hook>.value(_FakeHook_88(
           this,
           Invocation.method(
             #editHook,
@@ -8184,11 +9141,11 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.Hook>);
+      ) as _i21.Future<_i14.Hook>);
 
   @override
-  _i20.Future<bool> testPushHook(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> testPushHook(
+    _i14.RepositorySlug? slug,
     int? id,
   ) =>
       (super.noSuchMethod(
@@ -8199,12 +9156,12 @@
             id,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> pingHook(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> pingHook(
+    _i14.RepositorySlug? slug,
     int? id,
   ) =>
       (super.noSuchMethod(
@@ -8215,12 +9172,12 @@
             id,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> deleteHook(
-    _i13.RepositorySlug? slug,
+  _i21.Future<bool> deleteHook(
+    _i14.RepositorySlug? slug,
     int? id,
   ) =>
       (super.noSuchMethod(
@@ -8231,21 +9188,21 @@
             id,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.PublicKey> listDeployKeys(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.PublicKey> listDeployKeys(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listDeployKeys,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.PublicKey>.empty(),
-      ) as _i20.Stream<_i13.PublicKey>);
+        returnValue: _i21.Stream<_i14.PublicKey>.empty(),
+      ) as _i21.Stream<_i14.PublicKey>);
 
   @override
-  _i20.Future<_i13.PublicKey> getDeployKey(
-    _i13.RepositorySlug? slug, {
+  _i21.Future<_i14.PublicKey> getDeployKey(
+    _i14.RepositorySlug? slug, {
     required int? id,
   }) =>
       (super.noSuchMethod(
@@ -8254,7 +9211,7 @@
           [slug],
           {#id: id},
         ),
-        returnValue: _i20.Future<_i13.PublicKey>.value(_FakePublicKey_84(
+        returnValue: _i21.Future<_i14.PublicKey>.value(_FakePublicKey_89(
           this,
           Invocation.method(
             #getDeployKey,
@@ -8262,12 +9219,12 @@
             {#id: id},
           ),
         )),
-      ) as _i20.Future<_i13.PublicKey>);
+      ) as _i21.Future<_i14.PublicKey>);
 
   @override
-  _i20.Future<_i13.PublicKey> createDeployKey(
-    _i13.RepositorySlug? slug,
-    _i13.CreatePublicKey? key,
+  _i21.Future<_i14.PublicKey> createDeployKey(
+    _i14.RepositorySlug? slug,
+    _i14.CreatePublicKey? key,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8277,7 +9234,7 @@
             key,
           ],
         ),
-        returnValue: _i20.Future<_i13.PublicKey>.value(_FakePublicKey_84(
+        returnValue: _i21.Future<_i14.PublicKey>.value(_FakePublicKey_89(
           this,
           Invocation.method(
             #createDeployKey,
@@ -8287,12 +9244,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.PublicKey>);
+      ) as _i21.Future<_i14.PublicKey>);
 
   @override
-  _i20.Future<bool> deleteDeployKey({
-    required _i13.RepositorySlug? slug,
-    required _i13.PublicKey? key,
+  _i21.Future<bool> deleteDeployKey({
+    required _i14.RepositorySlug? slug,
+    required _i14.PublicKey? key,
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8303,13 +9260,13 @@
             #key: key,
           },
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<_i13.RepositoryCommit> merge(
-    _i13.RepositorySlug? slug,
-    _i13.CreateMerge? merge,
+  _i21.Future<_i14.RepositoryCommit> merge(
+    _i14.RepositorySlug? slug,
+    _i14.CreateMerge? merge,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8319,7 +9276,7 @@
             merge,
           ],
         ),
-        returnValue: _i20.Future<_i13.RepositoryCommit>.value(_FakeRepositoryCommit_78(
+        returnValue: _i21.Future<_i14.RepositoryCommit>.value(_FakeRepositoryCommit_83(
           this,
           Invocation.method(
             #merge,
@@ -8329,74 +9286,74 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.RepositoryCommit>);
+      ) as _i21.Future<_i14.RepositoryCommit>);
 
   @override
-  _i20.Future<_i13.RepositoryPages> getPagesInfo(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<_i14.RepositoryPages> getPagesInfo(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #getPagesInfo,
           [slug],
         ),
-        returnValue: _i20.Future<_i13.RepositoryPages>.value(_FakeRepositoryPages_85(
+        returnValue: _i21.Future<_i14.RepositoryPages>.value(_FakeRepositoryPages_90(
           this,
           Invocation.method(
             #getPagesInfo,
             [slug],
           ),
         )),
-      ) as _i20.Future<_i13.RepositoryPages>);
+      ) as _i21.Future<_i14.RepositoryPages>);
 
   @override
-  _i20.Stream<_i13.PageBuild> listPagesBuilds(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.PageBuild> listPagesBuilds(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listPagesBuilds,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.PageBuild>.empty(),
-      ) as _i20.Stream<_i13.PageBuild>);
+        returnValue: _i21.Stream<_i14.PageBuild>.empty(),
+      ) as _i21.Stream<_i14.PageBuild>);
 
   @override
-  _i20.Future<_i13.PageBuild> getLatestPagesBuild(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<_i14.PageBuild> getLatestPagesBuild(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #getLatestPagesBuild,
           [slug],
         ),
-        returnValue: _i20.Future<_i13.PageBuild>.value(_FakePageBuild_86(
+        returnValue: _i21.Future<_i14.PageBuild>.value(_FakePageBuild_91(
           this,
           Invocation.method(
             #getLatestPagesBuild,
             [slug],
           ),
         )),
-      ) as _i20.Future<_i13.PageBuild>);
+      ) as _i21.Future<_i14.PageBuild>);
 
   @override
-  _i20.Stream<_i13.Release> listReleases(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.Release> listReleases(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listReleases,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.Release>.empty(),
-      ) as _i20.Stream<_i13.Release>);
+        returnValue: _i21.Stream<_i14.Release>.empty(),
+      ) as _i21.Stream<_i14.Release>);
 
   @override
-  _i20.Future<_i13.Release> getLatestRelease(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<_i14.Release> getLatestRelease(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #getLatestRelease,
           [slug],
         ),
-        returnValue: _i20.Future<_i13.Release>.value(_FakeRelease_87(
+        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
           this,
           Invocation.method(
             #getLatestRelease,
             [slug],
           ),
         )),
-      ) as _i20.Future<_i13.Release>);
+      ) as _i21.Future<_i14.Release>);
 
   @override
-  _i20.Future<_i13.Release> getReleaseById(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.Release> getReleaseById(
+    _i14.RepositorySlug? slug,
     int? id,
   ) =>
       (super.noSuchMethod(
@@ -8407,7 +9364,7 @@
             id,
           ],
         ),
-        returnValue: _i20.Future<_i13.Release>.value(_FakeRelease_87(
+        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
           this,
           Invocation.method(
             #getReleaseById,
@@ -8417,11 +9374,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Release>);
+      ) as _i21.Future<_i14.Release>);
 
   @override
-  _i20.Future<_i13.Release> getReleaseByTagName(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.Release> getReleaseByTagName(
+    _i14.RepositorySlug? slug,
     String? tagName,
   ) =>
       (super.noSuchMethod(
@@ -8432,7 +9389,7 @@
             tagName,
           ],
         ),
-        returnValue: _i20.Future<_i13.Release>.value(_FakeRelease_87(
+        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
           this,
           Invocation.method(
             #getReleaseByTagName,
@@ -8442,12 +9399,12 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.Release>);
+      ) as _i21.Future<_i14.Release>);
 
   @override
-  _i20.Future<_i13.Release> createRelease(
-    _i13.RepositorySlug? slug,
-    _i13.CreateRelease? createRelease, {
+  _i21.Future<_i14.Release> createRelease(
+    _i14.RepositorySlug? slug,
+    _i14.CreateRelease? createRelease, {
     bool? getIfExists = true,
   }) =>
       (super.noSuchMethod(
@@ -8459,7 +9416,7 @@
           ],
           {#getIfExists: getIfExists},
         ),
-        returnValue: _i20.Future<_i13.Release>.value(_FakeRelease_87(
+        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
           this,
           Invocation.method(
             #createRelease,
@@ -8470,12 +9427,12 @@
             {#getIfExists: getIfExists},
           ),
         )),
-      ) as _i20.Future<_i13.Release>);
+      ) as _i21.Future<_i14.Release>);
 
   @override
-  _i20.Future<_i13.Release> editRelease(
-    _i13.RepositorySlug? slug,
-    _i13.Release? releaseToEdit, {
+  _i21.Future<_i14.Release> editRelease(
+    _i14.RepositorySlug? slug,
+    _i14.Release? releaseToEdit, {
     String? tagName,
     String? targetCommitish,
     String? name,
@@ -8499,7 +9456,7 @@
             #preRelease: preRelease,
           },
         ),
-        returnValue: _i20.Future<_i13.Release>.value(_FakeRelease_87(
+        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
           this,
           Invocation.method(
             #editRelease,
@@ -8517,12 +9474,12 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.Release>);
+      ) as _i21.Future<_i14.Release>);
 
   @override
-  _i20.Future<bool> deleteRelease(
-    _i13.RepositorySlug? slug,
-    _i13.Release? release,
+  _i21.Future<bool> deleteRelease(
+    _i14.RepositorySlug? slug,
+    _i14.Release? release,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8532,13 +9489,13 @@
             release,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.ReleaseAsset> listReleaseAssets(
-    _i13.RepositorySlug? slug,
-    _i13.Release? release,
+  _i21.Stream<_i14.ReleaseAsset> listReleaseAssets(
+    _i14.RepositorySlug? slug,
+    _i14.Release? release,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8548,13 +9505,13 @@
             release,
           ],
         ),
-        returnValue: _i20.Stream<_i13.ReleaseAsset>.empty(),
-      ) as _i20.Stream<_i13.ReleaseAsset>);
+        returnValue: _i21.Stream<_i14.ReleaseAsset>.empty(),
+      ) as _i21.Stream<_i14.ReleaseAsset>);
 
   @override
-  _i20.Future<_i13.ReleaseAsset> getReleaseAsset(
-    _i13.RepositorySlug? slug,
-    _i13.Release? release, {
+  _i21.Future<_i14.ReleaseAsset> getReleaseAsset(
+    _i14.RepositorySlug? slug,
+    _i14.Release? release, {
     required int? assetId,
   }) =>
       (super.noSuchMethod(
@@ -8566,7 +9523,7 @@
           ],
           {#assetId: assetId},
         ),
-        returnValue: _i20.Future<_i13.ReleaseAsset>.value(_FakeReleaseAsset_88(
+        returnValue: _i21.Future<_i14.ReleaseAsset>.value(_FakeReleaseAsset_93(
           this,
           Invocation.method(
             #getReleaseAsset,
@@ -8577,12 +9534,12 @@
             {#assetId: assetId},
           ),
         )),
-      ) as _i20.Future<_i13.ReleaseAsset>);
+      ) as _i21.Future<_i14.ReleaseAsset>);
 
   @override
-  _i20.Future<_i13.ReleaseAsset> editReleaseAsset(
-    _i13.RepositorySlug? slug,
-    _i13.ReleaseAsset? assetToEdit, {
+  _i21.Future<_i14.ReleaseAsset> editReleaseAsset(
+    _i14.RepositorySlug? slug,
+    _i14.ReleaseAsset? assetToEdit, {
     String? name,
     String? label,
   }) =>
@@ -8598,7 +9555,7 @@
             #label: label,
           },
         ),
-        returnValue: _i20.Future<_i13.ReleaseAsset>.value(_FakeReleaseAsset_88(
+        returnValue: _i21.Future<_i14.ReleaseAsset>.value(_FakeReleaseAsset_93(
           this,
           Invocation.method(
             #editReleaseAsset,
@@ -8612,12 +9569,12 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.ReleaseAsset>);
+      ) as _i21.Future<_i14.ReleaseAsset>);
 
   @override
-  _i20.Future<bool> deleteReleaseAsset(
-    _i13.RepositorySlug? slug,
-    _i13.ReleaseAsset? asset,
+  _i21.Future<bool> deleteReleaseAsset(
+    _i14.RepositorySlug? slug,
+    _i14.ReleaseAsset? asset,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8627,13 +9584,13 @@
             asset,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<List<_i13.ReleaseAsset>> uploadReleaseAssets(
-    _i13.Release? release,
-    Iterable<_i13.CreateReleaseAsset>? createReleaseAssets,
+  _i21.Future<List<_i14.ReleaseAsset>> uploadReleaseAssets(
+    _i14.Release? release,
+    Iterable<_i14.CreateReleaseAsset>? createReleaseAssets,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8643,63 +9600,63 @@
             createReleaseAssets,
           ],
         ),
-        returnValue: _i20.Future<List<_i13.ReleaseAsset>>.value(<_i13.ReleaseAsset>[]),
-      ) as _i20.Future<List<_i13.ReleaseAsset>>);
+        returnValue: _i21.Future<List<_i14.ReleaseAsset>>.value(<_i14.ReleaseAsset>[]),
+      ) as _i21.Future<List<_i14.ReleaseAsset>>);
 
   @override
-  _i20.Future<List<_i13.ContributorStatistics>> listContributorStats(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<List<_i14.ContributorStatistics>> listContributorStats(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listContributorStats,
           [slug],
         ),
-        returnValue: _i20.Future<List<_i13.ContributorStatistics>>.value(<_i13.ContributorStatistics>[]),
-      ) as _i20.Future<List<_i13.ContributorStatistics>>);
+        returnValue: _i21.Future<List<_i14.ContributorStatistics>>.value(<_i14.ContributorStatistics>[]),
+      ) as _i21.Future<List<_i14.ContributorStatistics>>);
 
   @override
-  _i20.Stream<_i13.YearCommitCountWeek> listCommitActivity(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.YearCommitCountWeek> listCommitActivity(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listCommitActivity,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.YearCommitCountWeek>.empty(),
-      ) as _i20.Stream<_i13.YearCommitCountWeek>);
+        returnValue: _i21.Stream<_i14.YearCommitCountWeek>.empty(),
+      ) as _i21.Stream<_i14.YearCommitCountWeek>);
 
   @override
-  _i20.Stream<_i13.WeeklyChangesCount> listCodeFrequency(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.WeeklyChangesCount> listCodeFrequency(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listCodeFrequency,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.WeeklyChangesCount>.empty(),
-      ) as _i20.Stream<_i13.WeeklyChangesCount>);
+        returnValue: _i21.Stream<_i14.WeeklyChangesCount>.empty(),
+      ) as _i21.Stream<_i14.WeeklyChangesCount>);
 
   @override
-  _i20.Future<_i13.ContributorParticipation> getParticipation(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Future<_i14.ContributorParticipation> getParticipation(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #getParticipation,
           [slug],
         ),
-        returnValue: _i20.Future<_i13.ContributorParticipation>.value(_FakeContributorParticipation_89(
+        returnValue: _i21.Future<_i14.ContributorParticipation>.value(_FakeContributorParticipation_94(
           this,
           Invocation.method(
             #getParticipation,
             [slug],
           ),
         )),
-      ) as _i20.Future<_i13.ContributorParticipation>);
+      ) as _i21.Future<_i14.ContributorParticipation>);
 
   @override
-  _i20.Stream<_i13.PunchcardEntry> listPunchcard(_i13.RepositorySlug? slug) => (super.noSuchMethod(
+  _i21.Stream<_i14.PunchcardEntry> listPunchcard(_i14.RepositorySlug? slug) => (super.noSuchMethod(
         Invocation.method(
           #listPunchcard,
           [slug],
         ),
-        returnValue: _i20.Stream<_i13.PunchcardEntry>.empty(),
-      ) as _i20.Stream<_i13.PunchcardEntry>);
+        returnValue: _i21.Stream<_i14.PunchcardEntry>.empty(),
+      ) as _i21.Stream<_i14.PunchcardEntry>);
 
   @override
-  _i20.Stream<_i13.RepositoryStatus> listStatuses(
-    _i13.RepositorySlug? slug,
+  _i21.Stream<_i14.RepositoryStatus> listStatuses(
+    _i14.RepositorySlug? slug,
     String? ref,
   ) =>
       (super.noSuchMethod(
@@ -8710,14 +9667,14 @@
             ref,
           ],
         ),
-        returnValue: _i20.Stream<_i13.RepositoryStatus>.empty(),
-      ) as _i20.Stream<_i13.RepositoryStatus>);
+        returnValue: _i21.Stream<_i14.RepositoryStatus>.empty(),
+      ) as _i21.Stream<_i14.RepositoryStatus>);
 
   @override
-  _i20.Future<_i13.RepositoryStatus> createStatus(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.RepositoryStatus> createStatus(
+    _i14.RepositorySlug? slug,
     String? ref,
-    _i13.CreateStatus? request,
+    _i14.CreateStatus? request,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -8728,7 +9685,7 @@
             request,
           ],
         ),
-        returnValue: _i20.Future<_i13.RepositoryStatus>.value(_FakeRepositoryStatus_90(
+        returnValue: _i21.Future<_i14.RepositoryStatus>.value(_FakeRepositoryStatus_95(
           this,
           Invocation.method(
             #createStatus,
@@ -8739,11 +9696,11 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.RepositoryStatus>);
+      ) as _i21.Future<_i14.RepositoryStatus>);
 
   @override
-  _i20.Future<_i13.CombinedRepositoryStatus> getCombinedStatus(
-    _i13.RepositorySlug? slug,
+  _i21.Future<_i14.CombinedRepositoryStatus> getCombinedStatus(
+    _i14.RepositorySlug? slug,
     String? ref,
   ) =>
       (super.noSuchMethod(
@@ -8754,7 +9711,7 @@
             ref,
           ],
         ),
-        returnValue: _i20.Future<_i13.CombinedRepositoryStatus>.value(_FakeCombinedRepositoryStatus_91(
+        returnValue: _i21.Future<_i14.CombinedRepositoryStatus>.value(_FakeCombinedRepositoryStatus_96(
           this,
           Invocation.method(
             #getCombinedStatus,
@@ -8764,43 +9721,43 @@
             ],
           ),
         )),
-      ) as _i20.Future<_i13.CombinedRepositoryStatus>);
+      ) as _i21.Future<_i14.CombinedRepositoryStatus>);
 
   @override
-  _i20.Future<_i13.ReleaseNotes> generateReleaseNotes(_i13.CreateReleaseNotes? crn) => (super.noSuchMethod(
+  _i21.Future<_i14.ReleaseNotes> generateReleaseNotes(_i14.CreateReleaseNotes? crn) => (super.noSuchMethod(
         Invocation.method(
           #generateReleaseNotes,
           [crn],
         ),
-        returnValue: _i20.Future<_i13.ReleaseNotes>.value(_FakeReleaseNotes_92(
+        returnValue: _i21.Future<_i14.ReleaseNotes>.value(_FakeReleaseNotes_97(
           this,
           Invocation.method(
             #generateReleaseNotes,
             [crn],
           ),
         )),
-      ) as _i20.Future<_i13.ReleaseNotes>);
+      ) as _i21.Future<_i14.ReleaseNotes>);
 }
 
 /// A class which mocks [SearchService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockSearchService extends _i1.Mock implements _i13.SearchService {
+class MockSearchService extends _i1.Mock implements _i14.SearchService {
   MockSearchService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i13.GitHub get github => (super.noSuchMethod(
+  _i14.GitHub get github => (super.noSuchMethod(
         Invocation.getter(#github),
-        returnValue: _FakeGitHub_16(
+        returnValue: _FakeGitHub_20(
           this,
           Invocation.getter(#github),
         ),
-      ) as _i13.GitHub);
+      ) as _i14.GitHub);
 
   @override
-  _i20.Stream<_i13.Repository> repositories(
+  _i21.Stream<_i14.Repository> repositories(
     String? query, {
     String? sort,
     int? pages = 2,
@@ -8814,11 +9771,11 @@
             #pages: pages,
           },
         ),
-        returnValue: _i20.Stream<_i13.Repository>.empty(),
-      ) as _i20.Stream<_i13.Repository>);
+        returnValue: _i21.Stream<_i14.Repository>.empty(),
+      ) as _i21.Stream<_i14.Repository>);
 
   @override
-  _i20.Stream<_i13.CodeSearchResults> code(
+  _i21.Stream<_i14.CodeSearchResults> code(
     String? query, {
     int? pages,
     int? perPage,
@@ -8854,11 +9811,11 @@
             #inPath: inPath,
           },
         ),
-        returnValue: _i20.Stream<_i13.CodeSearchResults>.empty(),
-      ) as _i20.Stream<_i13.CodeSearchResults>);
+        returnValue: _i21.Stream<_i14.CodeSearchResults>.empty(),
+      ) as _i21.Stream<_i14.CodeSearchResults>);
 
   @override
-  _i20.Stream<_i13.Issue> issues(
+  _i21.Stream<_i14.Issue> issues(
     String? query, {
     String? sort,
     int? pages = 2,
@@ -8872,11 +9829,11 @@
             #pages: pages,
           },
         ),
-        returnValue: _i20.Stream<_i13.Issue>.empty(),
-      ) as _i20.Stream<_i13.Issue>);
+        returnValue: _i21.Stream<_i14.Issue>.empty(),
+      ) as _i21.Stream<_i14.Issue>);
 
   @override
-  _i20.Stream<_i13.User> users(
+  _i21.Stream<_i14.User> users(
     String? query, {
     String? sort,
     int? pages = 2,
@@ -8892,8 +9849,8 @@
             #perPage: perPage,
           },
         ),
-        returnValue: _i20.Stream<_i13.User>.empty(),
-      ) as _i20.Stream<_i13.User>);
+        returnValue: _i21.Stream<_i14.User>.empty(),
+      ) as _i21.Stream<_i14.User>);
 }
 
 /// A class which mocks [TabledataResource].
@@ -8905,7 +9862,7 @@
   }
 
   @override
-  _i20.Future<_i6.TableDataInsertAllResponse> insertAll(
+  _i21.Future<_i6.TableDataInsertAllResponse> insertAll(
     _i6.TableDataInsertAllRequest? request,
     String? projectId,
     String? datasetId,
@@ -8923,7 +9880,7 @@
           ],
           {#$fields: $fields},
         ),
-        returnValue: _i20.Future<_i6.TableDataInsertAllResponse>.value(_FakeTableDataInsertAllResponse_93(
+        returnValue: _i21.Future<_i6.TableDataInsertAllResponse>.value(_FakeTableDataInsertAllResponse_98(
           this,
           Invocation.method(
             #insertAll,
@@ -8936,10 +9893,10 @@
             {#$fields: $fields},
           ),
         )),
-      ) as _i20.Future<_i6.TableDataInsertAllResponse>);
+      ) as _i21.Future<_i6.TableDataInsertAllResponse>);
 
   @override
-  _i20.Future<_i6.TableDataList> list(
+  _i21.Future<_i6.TableDataList> list(
     String? projectId,
     String? datasetId,
     String? tableId, {
@@ -8965,7 +9922,7 @@
             #$fields: $fields,
           },
         ),
-        returnValue: _i20.Future<_i6.TableDataList>.value(_FakeTableDataList_94(
+        returnValue: _i21.Future<_i6.TableDataList>.value(_FakeTableDataList_99(
           this,
           Invocation.method(
             #list,
@@ -8983,43 +9940,43 @@
             },
           ),
         )),
-      ) as _i20.Future<_i6.TableDataList>);
+      ) as _i21.Future<_i6.TableDataList>);
 }
 
 /// A class which mocks [UsersService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockUsersService extends _i1.Mock implements _i13.UsersService {
+class MockUsersService extends _i1.Mock implements _i14.UsersService {
   MockUsersService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i13.GitHub get github => (super.noSuchMethod(
+  _i14.GitHub get github => (super.noSuchMethod(
         Invocation.getter(#github),
-        returnValue: _FakeGitHub_16(
+        returnValue: _FakeGitHub_20(
           this,
           Invocation.getter(#github),
         ),
-      ) as _i13.GitHub);
+      ) as _i14.GitHub);
 
   @override
-  _i20.Future<_i13.User> getUser(String? name) => (super.noSuchMethod(
+  _i21.Future<_i14.User> getUser(String? name) => (super.noSuchMethod(
         Invocation.method(
           #getUser,
           [name],
         ),
-        returnValue: _i20.Future<_i13.User>.value(_FakeUser_95(
+        returnValue: _i21.Future<_i14.User>.value(_FakeUser_100(
           this,
           Invocation.method(
             #getUser,
             [name],
           ),
         )),
-      ) as _i20.Future<_i13.User>);
+      ) as _i21.Future<_i14.User>);
 
   @override
-  _i20.Future<_i13.CurrentUser> editCurrentUser({
+  _i21.Future<_i14.CurrentUser> editCurrentUser({
     String? name,
     String? email,
     String? blog,
@@ -9042,7 +9999,7 @@
             #bio: bio,
           },
         ),
-        returnValue: _i20.Future<_i13.CurrentUser>.value(_FakeCurrentUser_96(
+        returnValue: _i21.Future<_i14.CurrentUser>.value(_FakeCurrentUser_101(
           this,
           Invocation.method(
             #editCurrentUser,
@@ -9058,10 +10015,10 @@
             },
           ),
         )),
-      ) as _i20.Future<_i13.CurrentUser>);
+      ) as _i21.Future<_i14.CurrentUser>);
 
   @override
-  _i20.Stream<_i13.User> getUsers(
+  _i21.Stream<_i14.User> getUsers(
     List<String>? names, {
     int? pages,
   }) =>
@@ -9071,35 +10028,35 @@
           [names],
           {#pages: pages},
         ),
-        returnValue: _i20.Stream<_i13.User>.empty(),
-      ) as _i20.Stream<_i13.User>);
+        returnValue: _i21.Stream<_i14.User>.empty(),
+      ) as _i21.Stream<_i14.User>);
 
   @override
-  _i20.Future<_i13.CurrentUser> getCurrentUser() => (super.noSuchMethod(
+  _i21.Future<_i14.CurrentUser> getCurrentUser() => (super.noSuchMethod(
         Invocation.method(
           #getCurrentUser,
           [],
         ),
-        returnValue: _i20.Future<_i13.CurrentUser>.value(_FakeCurrentUser_96(
+        returnValue: _i21.Future<_i14.CurrentUser>.value(_FakeCurrentUser_101(
           this,
           Invocation.method(
             #getCurrentUser,
             [],
           ),
         )),
-      ) as _i20.Future<_i13.CurrentUser>);
+      ) as _i21.Future<_i14.CurrentUser>);
 
   @override
-  _i20.Future<bool> isUser(String? name) => (super.noSuchMethod(
+  _i21.Future<bool> isUser(String? name) => (super.noSuchMethod(
         Invocation.method(
           #isUser,
           [name],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.User> listUsers({
+  _i21.Stream<_i14.User> listUsers({
     int? pages,
     int? since,
   }) =>
@@ -9112,56 +10069,56 @@
             #since: since,
           },
         ),
-        returnValue: _i20.Stream<_i13.User>.empty(),
-      ) as _i20.Stream<_i13.User>);
+        returnValue: _i21.Stream<_i14.User>.empty(),
+      ) as _i21.Stream<_i14.User>);
 
   @override
-  _i20.Stream<_i13.UserEmail> listEmails() => (super.noSuchMethod(
+  _i21.Stream<_i14.UserEmail> listEmails() => (super.noSuchMethod(
         Invocation.method(
           #listEmails,
           [],
         ),
-        returnValue: _i20.Stream<_i13.UserEmail>.empty(),
-      ) as _i20.Stream<_i13.UserEmail>);
+        returnValue: _i21.Stream<_i14.UserEmail>.empty(),
+      ) as _i21.Stream<_i14.UserEmail>);
 
   @override
-  _i20.Stream<_i13.UserEmail> addEmails(List<String>? emails) => (super.noSuchMethod(
+  _i21.Stream<_i14.UserEmail> addEmails(List<String>? emails) => (super.noSuchMethod(
         Invocation.method(
           #addEmails,
           [emails],
         ),
-        returnValue: _i20.Stream<_i13.UserEmail>.empty(),
-      ) as _i20.Stream<_i13.UserEmail>);
+        returnValue: _i21.Stream<_i14.UserEmail>.empty(),
+      ) as _i21.Stream<_i14.UserEmail>);
 
   @override
-  _i20.Future<bool> deleteEmails(List<String>? emails) => (super.noSuchMethod(
+  _i21.Future<bool> deleteEmails(List<String>? emails) => (super.noSuchMethod(
         Invocation.method(
           #deleteEmails,
           [emails],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.User> listUserFollowers(String? user) => (super.noSuchMethod(
+  _i21.Stream<_i14.User> listUserFollowers(String? user) => (super.noSuchMethod(
         Invocation.method(
           #listUserFollowers,
           [user],
         ),
-        returnValue: _i20.Stream<_i13.User>.empty(),
-      ) as _i20.Stream<_i13.User>);
+        returnValue: _i21.Stream<_i14.User>.empty(),
+      ) as _i21.Stream<_i14.User>);
 
   @override
-  _i20.Future<bool> isFollowingUser(String? user) => (super.noSuchMethod(
+  _i21.Future<bool> isFollowingUser(String? user) => (super.noSuchMethod(
         Invocation.method(
           #isFollowingUser,
           [user],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> isUserFollowing(
+  _i21.Future<bool> isUserFollowing(
     String? user,
     String? target,
   ) =>
@@ -9173,158 +10130,158 @@
             target,
           ],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> followUser(String? user) => (super.noSuchMethod(
+  _i21.Future<bool> followUser(String? user) => (super.noSuchMethod(
         Invocation.method(
           #followUser,
           [user],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Future<bool> unfollowUser(String? user) => (super.noSuchMethod(
+  _i21.Future<bool> unfollowUser(String? user) => (super.noSuchMethod(
         Invocation.method(
           #unfollowUser,
           [user],
         ),
-        returnValue: _i20.Future<bool>.value(false),
-      ) as _i20.Future<bool>);
+        returnValue: _i21.Future<bool>.value(false),
+      ) as _i21.Future<bool>);
 
   @override
-  _i20.Stream<_i13.User> listCurrentUserFollowers() => (super.noSuchMethod(
+  _i21.Stream<_i14.User> listCurrentUserFollowers() => (super.noSuchMethod(
         Invocation.method(
           #listCurrentUserFollowers,
           [],
         ),
-        returnValue: _i20.Stream<_i13.User>.empty(),
-      ) as _i20.Stream<_i13.User>);
+        returnValue: _i21.Stream<_i14.User>.empty(),
+      ) as _i21.Stream<_i14.User>);
 
   @override
-  _i20.Stream<_i13.User> listCurrentUserFollowing() => (super.noSuchMethod(
+  _i21.Stream<_i14.User> listCurrentUserFollowing() => (super.noSuchMethod(
         Invocation.method(
           #listCurrentUserFollowing,
           [],
         ),
-        returnValue: _i20.Stream<_i13.User>.empty(),
-      ) as _i20.Stream<_i13.User>);
+        returnValue: _i21.Stream<_i14.User>.empty(),
+      ) as _i21.Stream<_i14.User>);
 
   @override
-  _i20.Stream<_i13.PublicKey> listPublicKeys([String? userLogin]) => (super.noSuchMethod(
+  _i21.Stream<_i14.PublicKey> listPublicKeys([String? userLogin]) => (super.noSuchMethod(
         Invocation.method(
           #listPublicKeys,
           [userLogin],
         ),
-        returnValue: _i20.Stream<_i13.PublicKey>.empty(),
-      ) as _i20.Stream<_i13.PublicKey>);
+        returnValue: _i21.Stream<_i14.PublicKey>.empty(),
+      ) as _i21.Stream<_i14.PublicKey>);
 
   @override
-  _i20.Future<_i13.PublicKey> createPublicKey(_i13.CreatePublicKey? key) => (super.noSuchMethod(
+  _i21.Future<_i14.PublicKey> createPublicKey(_i14.CreatePublicKey? key) => (super.noSuchMethod(
         Invocation.method(
           #createPublicKey,
           [key],
         ),
-        returnValue: _i20.Future<_i13.PublicKey>.value(_FakePublicKey_84(
+        returnValue: _i21.Future<_i14.PublicKey>.value(_FakePublicKey_89(
           this,
           Invocation.method(
             #createPublicKey,
             [key],
           ),
         )),
-      ) as _i20.Future<_i13.PublicKey>);
+      ) as _i21.Future<_i14.PublicKey>);
 }
 
 /// A class which mocks [Cache].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockCache extends _i1.Mock implements _i27.Cache<_i38.Uint8List> {
+class MockCache extends _i1.Mock implements _i29.Cache<_i40.Uint8List> {
   MockCache() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i27.Entry<_i38.Uint8List> operator [](String? key) => (super.noSuchMethod(
+  _i29.Entry<_i40.Uint8List> operator [](String? key) => (super.noSuchMethod(
         Invocation.method(
           #[],
           [key],
         ),
-        returnValue: _FakeEntry_97<_i38.Uint8List>(
+        returnValue: _FakeEntry_102<_i40.Uint8List>(
           this,
           Invocation.method(
             #[],
             [key],
           ),
         ),
-      ) as _i27.Entry<_i38.Uint8List>);
+      ) as _i29.Entry<_i40.Uint8List>);
 
   @override
-  _i27.Cache<_i38.Uint8List> withPrefix(String? prefix) => (super.noSuchMethod(
+  _i29.Cache<_i40.Uint8List> withPrefix(String? prefix) => (super.noSuchMethod(
         Invocation.method(
           #withPrefix,
           [prefix],
         ),
-        returnValue: _FakeCache_98<_i38.Uint8List>(
+        returnValue: _FakeCache_103<_i40.Uint8List>(
           this,
           Invocation.method(
             #withPrefix,
             [prefix],
           ),
         ),
-      ) as _i27.Cache<_i38.Uint8List>);
+      ) as _i29.Cache<_i40.Uint8List>);
 
   @override
-  _i27.Cache<S> withCodec<S>(_i26.Codec<S, _i38.Uint8List>? codec) => (super.noSuchMethod(
+  _i29.Cache<S> withCodec<S>(_i27.Codec<S, _i40.Uint8List>? codec) => (super.noSuchMethod(
         Invocation.method(
           #withCodec,
           [codec],
         ),
-        returnValue: _FakeCache_98<S>(
+        returnValue: _FakeCache_103<S>(
           this,
           Invocation.method(
             #withCodec,
             [codec],
           ),
         ),
-      ) as _i27.Cache<S>);
+      ) as _i29.Cache<S>);
 
   @override
-  _i27.Cache<_i38.Uint8List> withTTL(Duration? ttl) => (super.noSuchMethod(
+  _i29.Cache<_i40.Uint8List> withTTL(Duration? ttl) => (super.noSuchMethod(
         Invocation.method(
           #withTTL,
           [ttl],
         ),
-        returnValue: _FakeCache_98<_i38.Uint8List>(
+        returnValue: _FakeCache_103<_i40.Uint8List>(
           this,
           Invocation.method(
             #withTTL,
             [ttl],
           ),
         ),
-      ) as _i27.Cache<_i38.Uint8List>);
+      ) as _i29.Cache<_i40.Uint8List>);
 }
 
 /// A class which mocks [GitHub].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockGitHub extends _i1.Mock implements _i13.GitHub {
+class MockGitHub extends _i1.Mock implements _i14.GitHub {
   MockGitHub() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i13.Authentication get auth => (super.noSuchMethod(
+  _i14.Authentication get auth => (super.noSuchMethod(
         Invocation.getter(#auth),
-        returnValue: _FakeAuthentication_99(
+        returnValue: _FakeAuthentication_104(
           this,
           Invocation.getter(#auth),
         ),
-      ) as _i13.Authentication);
+      ) as _i14.Authentication);
 
   @override
-  set auth(_i13.Authentication? _auth) => super.noSuchMethod(
+  set auth(_i14.Authentication? _auth) => super.noSuchMethod(
         Invocation.setter(
           #auth,
           _auth,
@@ -9335,7 +10292,7 @@
   @override
   String get endpoint => (super.noSuchMethod(
         Invocation.getter(#endpoint),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#endpoint),
         ),
@@ -9344,7 +10301,7 @@
   @override
   String get version => (super.noSuchMethod(
         Invocation.getter(#version),
-        returnValue: _i30.dummyValue<String>(
+        returnValue: _i32.dummyValue<String>(
           this,
           Invocation.getter(#version),
         ),
@@ -9360,130 +10317,130 @@
       ) as _i2.Client);
 
   @override
-  _i13.ActivityService get activity => (super.noSuchMethod(
+  _i14.ActivityService get activity => (super.noSuchMethod(
         Invocation.getter(#activity),
-        returnValue: _FakeActivityService_100(
+        returnValue: _FakeActivityService_105(
           this,
           Invocation.getter(#activity),
         ),
-      ) as _i13.ActivityService);
+      ) as _i14.ActivityService);
 
   @override
-  _i13.AuthorizationsService get authorizations => (super.noSuchMethod(
+  _i14.AuthorizationsService get authorizations => (super.noSuchMethod(
         Invocation.getter(#authorizations),
-        returnValue: _FakeAuthorizationsService_101(
+        returnValue: _FakeAuthorizationsService_106(
           this,
           Invocation.getter(#authorizations),
         ),
-      ) as _i13.AuthorizationsService);
+      ) as _i14.AuthorizationsService);
 
   @override
-  _i13.GistsService get gists => (super.noSuchMethod(
+  _i14.GistsService get gists => (super.noSuchMethod(
         Invocation.getter(#gists),
-        returnValue: _FakeGistsService_102(
+        returnValue: _FakeGistsService_107(
           this,
           Invocation.getter(#gists),
         ),
-      ) as _i13.GistsService);
+      ) as _i14.GistsService);
 
   @override
-  _i13.GitService get git => (super.noSuchMethod(
+  _i14.GitService get git => (super.noSuchMethod(
         Invocation.getter(#git),
-        returnValue: _FakeGitService_103(
+        returnValue: _FakeGitService_108(
           this,
           Invocation.getter(#git),
         ),
-      ) as _i13.GitService);
+      ) as _i14.GitService);
 
   @override
-  _i13.IssuesService get issues => (super.noSuchMethod(
+  _i14.IssuesService get issues => (super.noSuchMethod(
         Invocation.getter(#issues),
-        returnValue: _FakeIssuesService_104(
+        returnValue: _FakeIssuesService_109(
           this,
           Invocation.getter(#issues),
         ),
-      ) as _i13.IssuesService);
+      ) as _i14.IssuesService);
 
   @override
-  _i13.MiscService get misc => (super.noSuchMethod(
+  _i14.MiscService get misc => (super.noSuchMethod(
         Invocation.getter(#misc),
-        returnValue: _FakeMiscService_105(
+        returnValue: _FakeMiscService_110(
           this,
           Invocation.getter(#misc),
         ),
-      ) as _i13.MiscService);
+      ) as _i14.MiscService);
 
   @override
-  _i13.OrganizationsService get organizations => (super.noSuchMethod(
+  _i14.OrganizationsService get organizations => (super.noSuchMethod(
         Invocation.getter(#organizations),
-        returnValue: _FakeOrganizationsService_106(
+        returnValue: _FakeOrganizationsService_111(
           this,
           Invocation.getter(#organizations),
         ),
-      ) as _i13.OrganizationsService);
+      ) as _i14.OrganizationsService);
 
   @override
-  _i13.PullRequestsService get pullRequests => (super.noSuchMethod(
+  _i14.PullRequestsService get pullRequests => (super.noSuchMethod(
         Invocation.getter(#pullRequests),
-        returnValue: _FakePullRequestsService_107(
+        returnValue: _FakePullRequestsService_112(
           this,
           Invocation.getter(#pullRequests),
         ),
-      ) as _i13.PullRequestsService);
+      ) as _i14.PullRequestsService);
 
   @override
-  _i13.RepositoriesService get repositories => (super.noSuchMethod(
+  _i14.RepositoriesService get repositories => (super.noSuchMethod(
         Invocation.getter(#repositories),
-        returnValue: _FakeRepositoriesService_108(
+        returnValue: _FakeRepositoriesService_113(
           this,
           Invocation.getter(#repositories),
         ),
-      ) as _i13.RepositoriesService);
+      ) as _i14.RepositoriesService);
 
   @override
-  _i13.SearchService get search => (super.noSuchMethod(
+  _i14.SearchService get search => (super.noSuchMethod(
         Invocation.getter(#search),
-        returnValue: _FakeSearchService_109(
+        returnValue: _FakeSearchService_114(
           this,
           Invocation.getter(#search),
         ),
-      ) as _i13.SearchService);
+      ) as _i14.SearchService);
 
   @override
-  _i13.UrlShortenerService get urlShortener => (super.noSuchMethod(
+  _i14.UrlShortenerService get urlShortener => (super.noSuchMethod(
         Invocation.getter(#urlShortener),
-        returnValue: _FakeUrlShortenerService_110(
+        returnValue: _FakeUrlShortenerService_115(
           this,
           Invocation.getter(#urlShortener),
         ),
-      ) as _i13.UrlShortenerService);
+      ) as _i14.UrlShortenerService);
 
   @override
-  _i13.UsersService get users => (super.noSuchMethod(
+  _i14.UsersService get users => (super.noSuchMethod(
         Invocation.getter(#users),
-        returnValue: _FakeUsersService_111(
+        returnValue: _FakeUsersService_116(
           this,
           Invocation.getter(#users),
         ),
-      ) as _i13.UsersService);
+      ) as _i14.UsersService);
 
   @override
-  _i13.ChecksService get checks => (super.noSuchMethod(
+  _i14.ChecksService get checks => (super.noSuchMethod(
         Invocation.getter(#checks),
-        returnValue: _FakeChecksService_112(
+        returnValue: _FakeChecksService_117(
           this,
           Invocation.getter(#checks),
         ),
-      ) as _i13.ChecksService);
+      ) as _i14.ChecksService);
 
   @override
-  _i20.Future<T> getJSON<S, T>(
+  _i21.Future<T> getJSON<S, T>(
     String? path, {
     int? statusCode,
     void Function(_i2.Response)? fail,
     Map<String, String>? headers,
     Map<String, String>? params,
-    _i13.JSONConverter<S, T>? convert,
+    _i14.JSONConverter<S, T>? convert,
     String? preview,
   }) =>
       (super.noSuchMethod(
@@ -9499,8 +10456,8 @@
             #preview: preview,
           },
         ),
-        returnValue: _i30.ifNotNull(
-              _i30.dummyValueOrNull<T>(
+        returnValue: _i32.ifNotNull(
+              _i32.dummyValueOrNull<T>(
                 this,
                 Invocation.method(
                   #getJSON,
@@ -9515,9 +10472,9 @@
                   },
                 ),
               ),
-              (T v) => _i20.Future<T>.value(v),
+              (T v) => _i21.Future<T>.value(v),
             ) ??
-            _FakeFuture_23<T>(
+            _FakeFuture_27<T>(
               this,
               Invocation.method(
                 #getJSON,
@@ -9532,16 +10489,16 @@
                 },
               ),
             ),
-      ) as _i20.Future<T>);
+      ) as _i21.Future<T>);
 
   @override
-  _i20.Future<T> postJSON<S, T>(
+  _i21.Future<T> postJSON<S, T>(
     String? path, {
     int? statusCode,
     void Function(_i2.Response)? fail,
     Map<String, String>? headers,
     Map<String, dynamic>? params,
-    _i13.JSONConverter<S, T>? convert,
+    _i14.JSONConverter<S, T>? convert,
     dynamic body,
     String? preview,
   }) =>
@@ -9559,7 +10516,7 @@
             #preview: preview,
           },
         ),
-        returnValue: _i45.postJsonShim<S, T>(
+        returnValue: _i51.postJsonShim<S, T>(
           path,
           statusCode: statusCode,
           fail: fail,
@@ -9569,16 +10526,16 @@
           body: body,
           preview: preview,
         ),
-      ) as _i20.Future<T>);
+      ) as _i21.Future<T>);
 
   @override
-  _i20.Future<T> putJSON<S, T>(
+  _i21.Future<T> putJSON<S, T>(
     String? path, {
     int? statusCode,
     void Function(_i2.Response)? fail,
     Map<String, String>? headers,
     Map<String, dynamic>? params,
-    _i13.JSONConverter<S, T>? convert,
+    _i14.JSONConverter<S, T>? convert,
     dynamic body,
     String? preview,
   }) =>
@@ -9596,8 +10553,8 @@
             #preview: preview,
           },
         ),
-        returnValue: _i30.ifNotNull(
-              _i30.dummyValueOrNull<T>(
+        returnValue: _i32.ifNotNull(
+              _i32.dummyValueOrNull<T>(
                 this,
                 Invocation.method(
                   #putJSON,
@@ -9613,9 +10570,9 @@
                   },
                 ),
               ),
-              (T v) => _i20.Future<T>.value(v),
+              (T v) => _i21.Future<T>.value(v),
             ) ??
-            _FakeFuture_23<T>(
+            _FakeFuture_27<T>(
               this,
               Invocation.method(
                 #putJSON,
@@ -9631,16 +10588,16 @@
                 },
               ),
             ),
-      ) as _i20.Future<T>);
+      ) as _i21.Future<T>);
 
   @override
-  _i20.Future<T> patchJSON<S, T>(
+  _i21.Future<T> patchJSON<S, T>(
     String? path, {
     int? statusCode,
     void Function(_i2.Response)? fail,
     Map<String, String>? headers,
     Map<String, dynamic>? params,
-    _i13.JSONConverter<S, T>? convert,
+    _i14.JSONConverter<S, T>? convert,
     dynamic body,
     String? preview,
   }) =>
@@ -9658,8 +10615,8 @@
             #preview: preview,
           },
         ),
-        returnValue: _i30.ifNotNull(
-              _i30.dummyValueOrNull<T>(
+        returnValue: _i32.ifNotNull(
+              _i32.dummyValueOrNull<T>(
                 this,
                 Invocation.method(
                   #patchJSON,
@@ -9675,9 +10632,9 @@
                   },
                 ),
               ),
-              (T v) => _i20.Future<T>.value(v),
+              (T v) => _i21.Future<T>.value(v),
             ) ??
-            _FakeFuture_23<T>(
+            _FakeFuture_27<T>(
               this,
               Invocation.method(
                 #patchJSON,
@@ -9693,17 +10650,17 @@
                 },
               ),
             ),
-      ) as _i20.Future<T>);
+      ) as _i21.Future<T>);
 
   @override
-  _i20.Future<T> requestJson<S, T>(
+  _i21.Future<T> requestJson<S, T>(
     String? method,
     String? path, {
     int? statusCode,
     void Function(_i2.Response)? fail,
     Map<String, String>? headers,
     Map<String, dynamic>? params,
-    _i13.JSONConverter<S, T?>? convert,
+    _i14.JSONConverter<S, T?>? convert,
     dynamic body,
     String? preview,
   }) =>
@@ -9724,8 +10681,8 @@
             #preview: preview,
           },
         ),
-        returnValue: _i30.ifNotNull(
-              _i30.dummyValueOrNull<T>(
+        returnValue: _i32.ifNotNull(
+              _i32.dummyValueOrNull<T>(
                 this,
                 Invocation.method(
                   #requestJson,
@@ -9744,9 +10701,9 @@
                   },
                 ),
               ),
-              (T v) => _i20.Future<T>.value(v),
+              (T v) => _i21.Future<T>.value(v),
             ) ??
-            _FakeFuture_23<T>(
+            _FakeFuture_27<T>(
               this,
               Invocation.method(
                 #requestJson,
@@ -9765,10 +10722,10 @@
                 },
               ),
             ),
-      ) as _i20.Future<T>);
+      ) as _i21.Future<T>);
 
   @override
-  _i20.Future<_i2.Response> request(
+  _i21.Future<_i2.Response> request(
     String? method,
     String? path, {
     Map<String, String>? headers,
@@ -9794,7 +10751,7 @@
             #preview: preview,
           },
         ),
-        returnValue: _i20.Future<_i2.Response>.value(_FakeResponse_113(
+        returnValue: _i21.Future<_i2.Response>.value(_FakeResponse_118(
           this,
           Invocation.method(
             #request,
@@ -9812,7 +10769,7 @@
             },
           ),
         )),
-      ) as _i20.Future<_i2.Response>);
+      ) as _i21.Future<_i2.Response>);
 
   @override
   Never handleStatusCode(_i2.Response? response) => (super.noSuchMethod(
diff --git a/cron.yaml b/cron.yaml
index bf1525e..3d9e976 100644
--- a/cron.yaml
+++ b/cron.yaml
@@ -4,7 +4,7 @@
 #   gcloud app deploy --project flutter-dashboard cron.yaml
 cron:
 - description: retrieve missing commits
-  url: /api/vacuum-github-commits
+  url: /api/v2/vacuum-github-commits
   schedule: every 6 hours
 
 # TODO(keyonghan): will delete if `In Progress` hanging issue is resolved:
@@ -14,7 +14,7 @@
   schedule: every 12 hours
 
 - description: backfills builds
-  url: /api/scheduler/batch-backfiller
+  url: /api/v2/scheduler/batch-backfiller
   schedule: every 5 minutes
 
 - description: sends build status to GitHub to annotate flutter PRs and commits
