[app_dart] Do not change baseRef on candidate branches (#2123)

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 2778e99..c514348 100644
--- a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart
+++ b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart
@@ -548,15 +548,21 @@
       return;
     }
 
-    // Assume this PR should be based against config.defaultBranch.
-    body = _getWrongBaseComment(base: baseName, defaultBranch: defaultBranchName);
-    if (!await _alreadyCommented(gitHubClient, pr, body)) {
-      await gitHubClient.pullRequests.edit(
-        slug,
-        pr.number!,
-        base: Config.defaultBranch(slug),
-      );
-      await gitHubClient.issues.createComment(slug, pr.number!, body);
+    // For repos migrated to main, close PRs opened against master.
+    final bool isMaster = pr.base?.ref == 'master';
+    final bool isMigrated = defaultBranchName == 'main';
+    // PRs should never be open to "beta" or "stable."
+    final bool isReleaseChannelBranch = releaseChannels.contains(pr.base?.ref);
+    if ((isMaster && isMigrated) || isReleaseChannelBranch) {
+      body = _getWrongBaseComment(base: baseName, defaultBranch: defaultBranchName);
+      if (!await _alreadyCommented(gitHubClient, pr, body)) {
+        await gitHubClient.pullRequests.edit(
+          slug,
+          pr.number!,
+          base: Config.defaultBranch(slug),
+        );
+        await gitHubClient.issues.createComment(slug, pr.number!, body);
+      }
     }
   }
 
diff --git a/app_dart/lib/src/service/config.dart b/app_dart/lib/src/service/config.dart
index 94fa1de..ff923b6 100644
--- a/app_dart/lib/src/service/config.dart
+++ b/app_dart/lib/src/service/config.dart
@@ -29,14 +29,6 @@
 /// Name of the default git branch.
 const String kDefaultBranchName = 'master';
 
-/// Name of an example release base branch name.
-// TODO(chillers): Delete this as it's only used for tests.
-const String kReleaseBaseRef = 'flutter-2.12-candidate.4';
-
-/// Name of an example release head branch name.
-// TODO(chillers): Delete this as it's only used for tests.
-const String kReleaseHeadRef = 'cherrypicks-flutter-2.12-candidate.4';
-
 class Config {
   Config(this._db, this._cache);
 
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 50cc2e5..4186417 100644
--- a/app_dart/test/request_handlers/github/webhook_subscription_test.dart
+++ b/app_dart/test/request_handlers/github/webhook_subscription_test.dart
@@ -41,6 +41,12 @@
   late MockPullRequestsService pullRequestsService;
   late SubscriptionTester tester;
 
+  /// Name of an example release base branch name.
+  const String kReleaseBaseRef = 'flutter-2.12-candidate.4';
+
+  /// Name of an example release head branch name.
+  const String kReleaseHeadRef = 'cherrypicks-flutter-2.12-candidate.4';
+
   setUp(() {
     request = FakeHttpRequest();
     db = FakeDatastoreDB();
@@ -140,6 +146,42 @@
       )).called(1);
     });
 
+    test('No action against candidate branches', () async {
+      const int issueNumber = 123;
+
+      tester.message = generateGithubWebhookMessage(
+        action: 'opened',
+        number: issueNumber,
+        baseRef: 'flutter-2.13-candidate.0',
+      );
+
+      when(pullRequestsService.listFiles(Config.flutterSlug, issueNumber)).thenAnswer(
+        (_) => Stream<PullRequestFile>.value(
+          PullRequestFile()..filename = 'packages/flutter/blah.dart',
+        ),
+      );
+
+      when(issuesService.listCommentsByIssue(Config.flutterSlug, issueNumber)).thenAnswer(
+        (_) => Stream<IssueComment>.value(
+          IssueComment()..body = 'some other comment',
+        ),
+      );
+
+      await tester.post(webhook);
+
+      verifyNever(pullRequestsService.edit(
+        Config.flutterSlug,
+        issueNumber,
+        base: kDefaultBranchName,
+      ));
+
+      verifyNever(issuesService.createComment(
+        Config.flutterSlug,
+        issueNumber,
+        argThat(contains('-> master')),
+      ));
+    });
+
     test('Acts on opened against dev', () async {
       const int issueNumber = 123;