Assert valid tag and release_channel combo in release MPA workflow.

In order to add an additional layer of validation, this change adds a regex match to ensure that for each release channel (i.e.g 'stable' or 'beta') there is a tag which is formatted appropriately.
After an issue of a tag malformed for the release channel on which it was pushed, this change will make the release workflow fail if the combination is incorrect, and will clearly show the assertion error of the tag not being valid.

Github issue link: https://github.com/flutter/flutter/issues/128792

Change-Id: I59b86e4b0db45666dabc29e8ea8196d9ba05660f
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/46000
Reviewed-by: Casey Hillers <chillers@google.com>
Commit-Queue: Jesse Seales <jseales@google.com>
Reviewed-by: Keyong Han <keyonghan@google.com>
diff --git a/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3-4.5.pre_stableFalse.json b/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3-4.5.pre_stableFalse.json
index 01ae027..66bf56b 100644
--- a/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3-4.5.pre_stableFalse.json
+++ b/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3-4.5.pre_stableFalse.json
@@ -1,568 +1,21 @@
 [
   {
     "cmd": [],
-    "name": "checkout flutter release branch"
-  },
-  {
-    "cmd": [],
-    "name": "checkout flutter release branch.Checkout flutter/flutter",
+    "name": "RECIPE CRASH (Uncaught exception)",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_EXCEPTION@@@",
+      "The recipe has crashed at point 'Uncaught exception'!",
+      "",
+      "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[flutter]/recipes/release/release_publish.py\", line 65, in RunSteps",
+      "    assert isValidTag(tag, release_channel)",
+      "AssertionError()"
     ]
   },
   {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/flutter",
-      "--url",
-      "https://github.com/flutter/flutter"
-    ],
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git setup",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "flutter-2.8-candidate.9",
-      "--recurse-submodules",
-      "--progress",
-      "--tags"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
+    "failure": {
+      "humanReason": "Uncaught Exception: AssertionError()"
     },
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git fetch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git checkout",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.read revision",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
-      "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git clean",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.submodule sync",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.submodule update",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "checkout engine release branch"
-  },
-  {
-    "cmd": [],
-    "name": "checkout engine release branch.Checkout flutter/engine",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/engine",
-      "--url",
-      "https://github.com/flutter/engine"
-    ],
-    "name": "checkout engine release branch.Checkout flutter/engine.git setup",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "flutter-2.8-candidate.9",
-      "--recurse-submodules",
-      "--progress",
-      "--tags"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
-    },
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git fetch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git checkout",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.read revision",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
-      "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git clean",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.submodule sync",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.submodule update",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "git rev-parse"
-  },
-  {
-    "cmd": [
-      "chmod",
-      "755",
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "infra_step": true,
-    "name": "Set execute permission"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
-      "--",
-      "RECIPE_REPO[depot_tools]/gsutil.py",
-      "----",
-      "cp",
-      "gs://flutter_configs/flutter-release-github-token.encrypted",
-      "[CLEANUP]/flutter-release-github-token.encrypted"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "infra_step": true,
-    "name": "gsutil download"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/flutter-release-github-token.encrypted",
-      "-output",
-      "[CLEANUP]/token.txt",
-      "projects/flutter-infra-staging/locations/global/keyRings/luci/cryptoKeys/flutter-infra"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "cloudkms get key"
-  },
-  {
-    "cmd": [
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "FORCE_FLAG": "--force",
-      "GITHUB_USER": "fluttergithubbot",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "RELEASE_CHANNEL": "stable",
-      "REL_HASH": "deadbeef",
-      "REPO": "flutter",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter",
-      "TAG": "1.2.3-4.5.pre",
-      "TOKEN_PATH": "[CLEANUP]/token.txt"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "Tag and push release on flutter/flutter"
-  },
-  {
-    "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[START_DIR]/flutter/bin/internal/engine.version",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "read engine hash",
-    "~followup_annotations": [
-      "@@@STEP_LOG_END@engine.version@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "ensure_installed (2)",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
-      "--",
-      "RECIPE_REPO[depot_tools]/gsutil.py",
-      "----",
-      "cp",
-      "gs://flutter_configs/flutter-release-github-token.encrypted",
-      "[CLEANUP]/flutter-release-github-token.encrypted"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "infra_step": true,
-    "name": "gsutil download (2)"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/flutter-release-github-token.encrypted",
-      "-output",
-      "[CLEANUP]/token.txt",
-      "projects/flutter-infra-staging/locations/global/keyRings/luci/cryptoKeys/flutter-infra"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "cloudkms get key (2)"
-  },
-  {
-    "cmd": [
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "FORCE_FLAG": "--force",
-      "GITHUB_USER": "fluttergithubbot",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "RELEASE_CHANNEL": "stable",
-      "REL_HASH": "",
-      "REPO": "engine",
-      "REVISION": "",
-      "TAG": "1.2.3-4.5.pre",
-      "TOKEN_PATH": "[CLEANUP]/token.txt"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin",
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "Tag and push release on flutter/engine"
-  },
-  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3-4.5.pre_stable_force.json b/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3-4.5.pre_stable_force.json
index 01ae027..66bf56b 100644
--- a/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3-4.5.pre_stable_force.json
+++ b/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3-4.5.pre_stable_force.json
@@ -1,568 +1,21 @@
 [
   {
     "cmd": [],
-    "name": "checkout flutter release branch"
-  },
-  {
-    "cmd": [],
-    "name": "checkout flutter release branch.Checkout flutter/flutter",
+    "name": "RECIPE CRASH (Uncaught exception)",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_EXCEPTION@@@",
+      "The recipe has crashed at point 'Uncaught exception'!",
+      "",
+      "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[flutter]/recipes/release/release_publish.py\", line 65, in RunSteps",
+      "    assert isValidTag(tag, release_channel)",
+      "AssertionError()"
     ]
   },
   {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/flutter",
-      "--url",
-      "https://github.com/flutter/flutter"
-    ],
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git setup",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "flutter-2.8-candidate.9",
-      "--recurse-submodules",
-      "--progress",
-      "--tags"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
+    "failure": {
+      "humanReason": "Uncaught Exception: AssertionError()"
     },
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git fetch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git checkout",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.read revision",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
-      "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git clean",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.submodule sync",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.submodule update",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "checkout engine release branch"
-  },
-  {
-    "cmd": [],
-    "name": "checkout engine release branch.Checkout flutter/engine",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/engine",
-      "--url",
-      "https://github.com/flutter/engine"
-    ],
-    "name": "checkout engine release branch.Checkout flutter/engine.git setup",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "flutter-2.8-candidate.9",
-      "--recurse-submodules",
-      "--progress",
-      "--tags"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
-    },
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git fetch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git checkout",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.read revision",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
-      "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git clean",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.submodule sync",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.submodule update",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "git rev-parse"
-  },
-  {
-    "cmd": [
-      "chmod",
-      "755",
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "infra_step": true,
-    "name": "Set execute permission"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
-      "--",
-      "RECIPE_REPO[depot_tools]/gsutil.py",
-      "----",
-      "cp",
-      "gs://flutter_configs/flutter-release-github-token.encrypted",
-      "[CLEANUP]/flutter-release-github-token.encrypted"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "infra_step": true,
-    "name": "gsutil download"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/flutter-release-github-token.encrypted",
-      "-output",
-      "[CLEANUP]/token.txt",
-      "projects/flutter-infra-staging/locations/global/keyRings/luci/cryptoKeys/flutter-infra"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "cloudkms get key"
-  },
-  {
-    "cmd": [
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "FORCE_FLAG": "--force",
-      "GITHUB_USER": "fluttergithubbot",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "RELEASE_CHANNEL": "stable",
-      "REL_HASH": "deadbeef",
-      "REPO": "flutter",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter",
-      "TAG": "1.2.3-4.5.pre",
-      "TOKEN_PATH": "[CLEANUP]/token.txt"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "Tag and push release on flutter/flutter"
-  },
-  {
-    "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[START_DIR]/flutter/bin/internal/engine.version",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "read engine hash",
-    "~followup_annotations": [
-      "@@@STEP_LOG_END@engine.version@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "ensure_installed (2)",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
-      "--",
-      "RECIPE_REPO[depot_tools]/gsutil.py",
-      "----",
-      "cp",
-      "gs://flutter_configs/flutter-release-github-token.encrypted",
-      "[CLEANUP]/flutter-release-github-token.encrypted"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "infra_step": true,
-    "name": "gsutil download (2)"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/flutter-release-github-token.encrypted",
-      "-output",
-      "[CLEANUP]/token.txt",
-      "projects/flutter-infra-staging/locations/global/keyRings/luci/cryptoKeys/flutter-infra"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "cloudkms get key (2)"
-  },
-  {
-    "cmd": [
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "FORCE_FLAG": "--force",
-      "GITHUB_USER": "fluttergithubbot",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "RELEASE_CHANNEL": "stable",
-      "REL_HASH": "",
-      "REPO": "engine",
-      "REVISION": "",
-      "TAG": "1.2.3-4.5.pre",
-      "TOKEN_PATH": "[CLEANUP]/token.txt"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin",
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "Tag and push release on flutter/engine"
-  },
-  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3_betaFalse.json b/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3_betaFalse.json
index 168bd09..66bf56b 100644
--- a/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3_betaFalse.json
+++ b/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3_betaFalse.json
@@ -1,568 +1,21 @@
 [
   {
     "cmd": [],
-    "name": "checkout flutter release branch"
-  },
-  {
-    "cmd": [],
-    "name": "checkout flutter release branch.Checkout flutter/flutter",
+    "name": "RECIPE CRASH (Uncaught exception)",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_EXCEPTION@@@",
+      "The recipe has crashed at point 'Uncaught exception'!",
+      "",
+      "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[flutter]/recipes/release/release_publish.py\", line 65, in RunSteps",
+      "    assert isValidTag(tag, release_channel)",
+      "AssertionError()"
     ]
   },
   {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/flutter",
-      "--url",
-      "https://github.com/flutter/flutter"
-    ],
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git setup",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "flutter-2.8-candidate.9",
-      "--recurse-submodules",
-      "--progress",
-      "--tags"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
+    "failure": {
+      "humanReason": "Uncaught Exception: AssertionError()"
     },
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git fetch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git checkout",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.read revision",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
-      "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git clean",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.submodule sync",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.submodule update",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "checkout engine release branch"
-  },
-  {
-    "cmd": [],
-    "name": "checkout engine release branch.Checkout flutter/engine",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/engine",
-      "--url",
-      "https://github.com/flutter/engine"
-    ],
-    "name": "checkout engine release branch.Checkout flutter/engine.git setup",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "flutter-2.8-candidate.9",
-      "--recurse-submodules",
-      "--progress",
-      "--tags"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
-    },
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git fetch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git checkout",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.read revision",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
-      "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git clean",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.submodule sync",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.submodule update",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "git rev-parse"
-  },
-  {
-    "cmd": [
-      "chmod",
-      "755",
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "infra_step": true,
-    "name": "Set execute permission"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
-      "--",
-      "RECIPE_REPO[depot_tools]/gsutil.py",
-      "----",
-      "cp",
-      "gs://flutter_configs/flutter-release-github-token.encrypted",
-      "[CLEANUP]/flutter-release-github-token.encrypted"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "infra_step": true,
-    "name": "gsutil download"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/flutter-release-github-token.encrypted",
-      "-output",
-      "[CLEANUP]/token.txt",
-      "projects/flutter-infra-staging/locations/global/keyRings/luci/cryptoKeys/flutter-infra"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "cloudkms get key"
-  },
-  {
-    "cmd": [
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "FORCE_FLAG": "--force",
-      "GITHUB_USER": "fluttergithubbot",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "RELEASE_CHANNEL": "beta",
-      "REL_HASH": "deadbeef",
-      "REPO": "flutter",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter",
-      "TAG": "1.2.3",
-      "TOKEN_PATH": "[CLEANUP]/token.txt"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "Tag and push release on flutter/flutter"
-  },
-  {
-    "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[START_DIR]/flutter/bin/internal/engine.version",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "read engine hash",
-    "~followup_annotations": [
-      "@@@STEP_LOG_END@engine.version@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "ensure_installed (2)",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
-      "--",
-      "RECIPE_REPO[depot_tools]/gsutil.py",
-      "----",
-      "cp",
-      "gs://flutter_configs/flutter-release-github-token.encrypted",
-      "[CLEANUP]/flutter-release-github-token.encrypted"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "infra_step": true,
-    "name": "gsutil download (2)"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/flutter-release-github-token.encrypted",
-      "-output",
-      "[CLEANUP]/token.txt",
-      "projects/flutter-infra-staging/locations/global/keyRings/luci/cryptoKeys/flutter-infra"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "cloudkms get key (2)"
-  },
-  {
-    "cmd": [
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "FORCE_FLAG": "--force",
-      "GITHUB_USER": "fluttergithubbot",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "RELEASE_CHANNEL": "beta",
-      "REL_HASH": "",
-      "REPO": "engine",
-      "REVISION": "",
-      "TAG": "1.2.3",
-      "TOKEN_PATH": "[CLEANUP]/token.txt"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin",
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "Tag and push release on flutter/engine"
-  },
-  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3_beta_force.json b/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3_beta_force.json
index 168bd09..66bf56b 100644
--- a/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3_beta_force.json
+++ b/recipes/release/release_publish.expected/flutter-2.8-candidate.9_1.2.3_beta_force.json
@@ -1,568 +1,21 @@
 [
   {
     "cmd": [],
-    "name": "checkout flutter release branch"
-  },
-  {
-    "cmd": [],
-    "name": "checkout flutter release branch.Checkout flutter/flutter",
+    "name": "RECIPE CRASH (Uncaught exception)",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_EXCEPTION@@@",
+      "The recipe has crashed at point 'Uncaught exception'!",
+      "",
+      "Traceback (most recent call last):",
+      "  File \"RECIPE_REPO[flutter]/recipes/release/release_publish.py\", line 65, in RunSteps",
+      "    assert isValidTag(tag, release_channel)",
+      "AssertionError()"
     ]
   },
   {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/flutter",
-      "--url",
-      "https://github.com/flutter/flutter"
-    ],
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git setup",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "flutter-2.8-candidate.9",
-      "--recurse-submodules",
-      "--progress",
-      "--tags"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
+    "failure": {
+      "humanReason": "Uncaught Exception: AssertionError()"
     },
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git fetch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git checkout",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.read revision",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
-      "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.git clean",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.submodule sync",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "checkout flutter release branch.Checkout flutter/flutter.submodule update",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "checkout engine release branch"
-  },
-  {
-    "cmd": [],
-    "name": "checkout engine release branch.Checkout flutter/engine",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/engine",
-      "--url",
-      "https://github.com/flutter/engine"
-    ],
-    "name": "checkout engine release branch.Checkout flutter/engine.git setup",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "flutter-2.8-candidate.9",
-      "--recurse-submodules",
-      "--progress",
-      "--tags"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
-    },
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git fetch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git checkout",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.read revision",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
-      "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.git clean",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.submodule sync",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "infra_step": true,
-    "name": "checkout engine release branch.Checkout flutter/engine.submodule update",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "infra_step": true,
-    "name": "git rev-parse"
-  },
-  {
-    "cmd": [
-      "chmod",
-      "755",
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "infra_step": true,
-    "name": "Set execute permission"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
-      "--",
-      "RECIPE_REPO[depot_tools]/gsutil.py",
-      "----",
-      "cp",
-      "gs://flutter_configs/flutter-release-github-token.encrypted",
-      "[CLEANUP]/flutter-release-github-token.encrypted"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "infra_step": true,
-    "name": "gsutil download"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/flutter-release-github-token.encrypted",
-      "-output",
-      "[CLEANUP]/token.txt",
-      "projects/flutter-infra-staging/locations/global/keyRings/luci/cryptoKeys/flutter-infra"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "cloudkms get key"
-  },
-  {
-    "cmd": [
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "cwd": "[START_DIR]/flutter",
-    "env": {
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "FORCE_FLAG": "--force",
-      "GITHUB_USER": "fluttergithubbot",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "OS": "linux",
-      "PUB_CACHE": "[START_DIR]/.pub-cache",
-      "RELEASE_CHANNEL": "beta",
-      "REL_HASH": "deadbeef",
-      "REPO": "flutter",
-      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "SDK_CHECKOUT_PATH": "[START_DIR]/flutter",
-      "TAG": "1.2.3",
-      "TOKEN_PATH": "[CLEANUP]/token.txt"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
-        "[START_DIR]/flutter/bin",
-        "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
-      ]
-    },
-    "name": "Tag and push release on flutter/flutter"
-  },
-  {
-    "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[START_DIR]/flutter/bin/internal/engine.version",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "read engine hash",
-    "~followup_annotations": [
-      "@@@STEP_LOG_END@engine.version@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "ensure_installed (2)",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python3",
-      "-u",
-      "RECIPE_MODULE[depot_tools::gsutil]/resources/gsutil_smart_retry.py",
-      "--",
-      "RECIPE_REPO[depot_tools]/gsutil.py",
-      "----",
-      "cp",
-      "gs://flutter_configs/flutter-release-github-token.encrypted",
-      "[CLEANUP]/flutter-release-github-token.encrypted"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "infra_step": true,
-    "name": "gsutil download (2)"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/flutter-release-github-token.encrypted",
-      "-output",
-      "[CLEANUP]/token.txt",
-      "projects/flutter-infra-staging/locations/global/keyRings/luci/cryptoKeys/flutter-infra"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "REVISION": ""
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "cloudkms get key (2)"
-  },
-  {
-    "cmd": [
-      "RECIPE[flutter::release/release_publish].resources/push_release.sh"
-    ],
-    "cwd": "[START_DIR]/engine",
-    "env": {
-      "ANDROID_HOME": "[START_DIR]/engine/src/third_party/android_tools/sdk",
-      "ANDROID_SDK_HOME": "[CLEANUP]/tmp_tmp_1",
-      "ANDROID_USER_HOME": "[CLEANUP]/tmp_tmp_1/.android",
-      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
-      "ENGINE_CHECKOUT_PATH": "[START_DIR]/engine",
-      "FORCE_FLAG": "--force",
-      "GITHUB_USER": "fluttergithubbot",
-      "GIT_BRANCH": "flutter-2.8-candidate.9",
-      "LUCI_BRANCH": "",
-      "LUCI_CI": "True",
-      "LUCI_PR": "",
-      "LUCI_WORKDIR": "[START_DIR]",
-      "OS": "linux",
-      "RELEASE_CHANNEL": "beta",
-      "REL_HASH": "",
-      "REPO": "engine",
-      "REVISION": "",
-      "TAG": "1.2.3",
-      "TOKEN_PATH": "[CLEANUP]/token.txt"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin",
-        "[START_DIR]/engine/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "name": "Tag and push release on flutter/engine"
-  },
-  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipes/release/release_publish.py b/recipes/release/release_publish.py
index b146a12..69ff254 100644
--- a/recipes/release/release_publish.py
+++ b/recipes/release/release_publish.py
@@ -23,11 +23,12 @@
 stableTagRegex = r'^(\d+)\.(\d+)\.(\d+)$'
 betaTagRegex = r'^(\d+)\.(\d+)\.(\d+)-(\d+)\.(\d+)\.pre$'
 
-
-def isValidTag(tag):
+def isValidTag(tag, release_channel):
   stable = re.search(stableTagRegex, tag)
-  development = re.search(betaTagRegex, tag)
-  return stable or development
+  beta = re.search(betaTagRegex, tag)
+  if release_channel=='stable':
+    return stable
+  return beta
 
 
 """
@@ -61,7 +62,7 @@
   engine_git_url = 'https://github.com/flutter/engine'
 
   # Validate the given tag is correctly formatted for either stable or latest
-  assert isValidTag(tag)
+  assert isValidTag(tag, release_channel)
 
   # This recipe is only able to be triggered on linux, and the other platforms
   # are not necessary
@@ -147,6 +148,19 @@
   for tag in ('1.2.3-4.5.pre', '1.2.3'):
     for release_channel in ('stable', 'beta'):
       for force in ('True', 'False'):
+        if ((tag == '1.2.3-4.5.pre' and release_channel=='stable') or (tag == '1.2.3' and release_channel=='beta')):
+          # These are invalid combinations of tag and release_channel.
+          # Expect assertion errors for these combinations
+          post_processing = [api.expect_exception('AssertionError')]
+        else:
+          # Remaining tag combinations of tag and release channel are valid.
+          post_processing = [api.post_process(
+                post_process.MustRun, 'Tag and push release on flutter/flutter'
+            ),
+            api.post_process(
+                post_process.MustRun, 'Tag and push release on flutter/engine'
+            ),
+            api.post_process(post_process.StatusSuccess)]
         test = api.test(
             '%s_%s_%s%s' % (
                 'flutter-2.8-candidate.9', tag, release_channel,
@@ -160,12 +174,6 @@
                 force=force
             ),
             api.repo_util.flutter_environment_data(checkout_dir=checkout_path),
-            api.post_process(
-                post_process.MustRun, 'Tag and push release on flutter/flutter'
-            ),
-            api.post_process(
-                post_process.MustRun, 'Tag and push release on flutter/engine'
-            ),
-            api.post_process(post_process.StatusSuccess),
+            *post_processing
         )
         yield test