Switch api.git.checkout calls to api.git_checkout

The fuchsia recipe `api.git.checkout*()` functions are deprecated in
favor of `api.git_checkout()`, so switch to using that instead.

Bug: fuchsia:99125
Change-Id: I58451112b9f32733b0a932babc83a11944fe18e8
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/29461
Commit-Queue: Oliver Newman <olivernewman@google.com>
Reviewed-by: Casey Hillers <chillers@google.com>
diff --git a/recipe_modules/repo_util/api.py b/recipe_modules/repo_util/api.py
index daa1f7b..ff4d982 100644
--- a/recipe_modules/repo_util/api.py
+++ b/recipe_modules/repo_util/api.py
@@ -167,7 +167,7 @@
     if self.m.properties.get('git_branch', '') in ['beta', 'stable']:
       branches = self.current_commit_branches(checkout_path)
       branches = [b for b in branches if b.startswith('flutter')]
-    # The following paragraph justifies why we need to write in the logic as one - liners 
+    # The following paragraph justifies why we need to write in the logic as one - liners
     # the way these tests work are that they will not execute the actual command, but execute a placeholder command
     #  given its original format of if statement, the closest I can get to trigger the logic is the following:
         #   release_checkout_path = api.path['start_dir'].join('release')
diff --git a/recipes/infra/luci_config.expected/basic.json b/recipes/infra/luci_config.expected/basic.json
index 946c7bd..25a46f1 100644
--- a/recipes/infra/luci_config.expected/basic.json
+++ b/recipes/infra/luci_config.expected/basic.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "checkout"
+  },
+  {
     "cmd": [
       "vpython",
       "-u",
@@ -9,19 +13,26 @@
       "ensure-directory",
       "--mode",
       "0777",
-      "[START_DIR]/flutter-infra"
+      "[START_DIR]/infra"
     ],
     "infra_step": true,
-    "name": "makedirs"
+    "name": "checkout.makedirs",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
       "git",
       "init"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "git init",
-    "timeout": 60.0
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.git init",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -31,9 +42,13 @@
       "origin",
       "https://flutter.googlesource.com/infra"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "git remote",
-    "timeout": 600.0
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.git remote",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -42,13 +57,20 @@
       "fetch.uriprotocols",
       "https"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "set fetch.uriprotocols",
-    "timeout": 60.0
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.set fetch.uriprotocols",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "cache"
+    "name": "checkout.cache",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -62,11 +84,11 @@
       "0777",
       "[CACHE]/git"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
+    "cwd": "[START_DIR]/infra",
     "infra_step": true,
-    "name": "cache.ensure git cache dir",
+    "name": "checkout.cache.ensure git cache dir",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -80,11 +102,11 @@
       "",
       "[CACHE]/git/.GUARD_FILE"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
+    "cwd": "[START_DIR]/infra",
     "infra_step": true,
-    "name": "cache.write git cache guard file",
+    "name": "checkout.cache.write git cache guard file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -99,11 +121,11 @@
       "0777",
       "[CACHE]/git/flutter.googlesource.com-infra"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
+    "cwd": "[START_DIR]/infra",
     "infra_step": true,
-    "name": "cache.makedirs",
+    "name": "checkout.cache.makedirs",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -113,10 +135,11 @@
       "--bare"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
-    "name": "cache.git init",
+    "infra_step": true,
+    "name": "checkout.cache.git init",
     "timeout": 60.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -127,10 +150,11 @@
       "https://flutter.googlesource.com/infra"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
-    "name": "cache.remote set-url",
+    "infra_step": true,
+    "name": "checkout.cache.remote set-url",
     "timeout": 60.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -141,10 +165,11 @@
       "https"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
-    "name": "cache.set fetch.uriprotocols",
+    "infra_step": true,
+    "name": "checkout.cache.set fetch.uriprotocols",
     "timeout": 60.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -157,10 +182,11 @@
       "\\+refs/heads/\\*:.*"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
-    "name": "cache.replace fetch configs",
+    "infra_step": true,
+    "name": "checkout.cache.replace fetch configs",
     "timeout": 60.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -172,10 +198,11 @@
       "origin"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
-    "name": "cache.git fetch",
+    "infra_step": true,
+    "name": "checkout.cache.git fetch",
     "timeout": 1200.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -188,13 +215,13 @@
       "ensure-directory",
       "--mode",
       "0777",
-      "[START_DIR]/flutter-infra/.git/objects/info"
+      "[START_DIR]/infra/.git/objects/info"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
+    "cwd": "[START_DIR]/infra",
     "infra_step": true,
-    "name": "cache.makedirs object/info",
+    "name": "checkout.cache.makedirs object/info",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -206,13 +233,13 @@
       "/path/to/tmp/json",
       "copy",
       "[CACHE]/git/flutter.googlesource.com-infra/objects\n",
-      "[START_DIR]/flutter-infra/.git/objects/info/alternates"
+      "[START_DIR]/infra/.git/objects/info/alternates"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
+    "cwd": "[START_DIR]/infra",
     "infra_step": true,
-    "name": "cache.alternates",
+    "name": "checkout.cache.alternates",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-infra/objects@@@",
       "@@@STEP_LOG_END@alternates@@@"
     ]
@@ -227,11 +254,11 @@
       "remove",
       "[CACHE]/git/.GUARD_FILE"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
+    "cwd": "[START_DIR]/infra",
     "infra_step": true,
-    "name": "cache.remove git cache guard file",
+    "name": "checkout.cache.remove git cache guard file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -242,9 +269,13 @@
       "origin",
       "main"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "git fetch",
-    "timeout": 1200.0
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.git fetch",
+    "timeout": 1200.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -253,9 +284,13 @@
       "-f",
       "FETCH_HEAD"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "git checkout",
-    "timeout": 600.0
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.git checkout",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -263,9 +298,13 @@
       "rev-parse",
       "HEAD"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "git rev-parse",
-    "timeout": 60.0
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.git rev-parse",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -275,13 +314,20 @@
       "-d",
       "-x"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "git clean",
-    "timeout": 600.0
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.git clean",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "submodule"
+    "name": "checkout.submodule",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -289,11 +335,12 @@
       "submodule",
       "sync"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "submodule.git submodule sync",
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.submodule.git submodule sync",
     "timeout": 600.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -305,11 +352,12 @@
       "--jobs",
       "4"
     ],
-    "cwd": "[START_DIR]/flutter-infra",
-    "name": "submodule.git submodule update",
+    "cwd": "[START_DIR]/infra",
+    "infra_step": true,
+    "name": "checkout.submodule.git submodule update",
     "timeout": 600.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
diff --git a/recipes/infra/luci_config.expected/cq.json b/recipes/infra/luci_config.expected/cq.json
index 1037dfb..7707174 100644
--- a/recipes/infra/luci_config.expected/cq.json
+++ b/recipes/infra/luci_config.expected/cq.json
@@ -1,7 +1,7 @@
 [
   {
     "cmd": [],
-    "name": "fetch refs/heads/main"
+    "name": "checkout"
   },
   {
     "cmd": [
@@ -28,7 +28,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.makedirs",
+    "name": "checkout.makedirs",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
@@ -39,6 +39,7 @@
       "init"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -51,7 +52,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.git init",
+    "name": "checkout.git init",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -63,9 +64,10 @@
       "remote",
       "add",
       "origin",
-      "https://flutter.googlesource.com/recipes"
+      "https://flutter.googlesource.com/infra"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -78,7 +80,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.git remote",
+    "name": "checkout.git remote",
     "timeout": 600.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -92,6 +94,7 @@
       "https"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -104,7 +107,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.set fetch.uriprotocols",
+    "name": "checkout.set fetch.uriprotocols",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -112,7 +115,7 @@
   },
   {
     "cmd": [],
-    "name": "fetch refs/heads/main.cache",
+    "name": "checkout.cache",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
@@ -143,7 +146,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.ensure git cache dir",
+    "name": "checkout.cache.ensure git cache dir",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -173,7 +176,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.write git cache guard file",
+    "name": "checkout.cache.write git cache guard file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -188,7 +191,7 @@
       "ensure-directory",
       "--mode",
       "0777",
-      "[CACHE]/git/flutter.googlesource.com-recipes"
+      "[CACHE]/git/flutter.googlesource.com-infra"
     ],
     "cwd": "[START_DIR]/infra",
     "infra_step": true,
@@ -204,7 +207,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.makedirs",
+    "name": "checkout.cache.makedirs",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -215,7 +218,8 @@
       "init",
       "--bare"
     ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -228,7 +232,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.git init",
+    "name": "checkout.cache.git init",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -239,9 +243,10 @@
       "git",
       "config",
       "remote.origin.url",
-      "https://flutter.googlesource.com/recipes"
+      "https://flutter.googlesource.com/infra"
     ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -254,7 +259,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.remote set-url",
+    "name": "checkout.cache.remote set-url",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -267,7 +272,8 @@
       "fetch.uriprotocols",
       "https"
     ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -280,7 +286,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.set fetch.uriprotocols",
+    "name": "checkout.cache.set fetch.uriprotocols",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -295,7 +301,8 @@
       "+refs/heads/*:refs/heads/*",
       "\\+refs/heads/\\*:.*"
     ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -308,7 +315,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.replace fetch configs",
+    "name": "checkout.cache.replace fetch configs",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -322,7 +329,8 @@
       "--tags",
       "origin"
     ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "cwd": "[CACHE]/git/flutter.googlesource.com-infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -335,7 +343,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.git fetch",
+    "name": "checkout.cache.git fetch",
     "timeout": 1200.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -367,7 +375,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.makedirs object/info",
+    "name": "checkout.cache.makedirs object/info",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -380,7 +388,7 @@
       "--json-output",
       "/path/to/tmp/json",
       "copy",
-      "[CACHE]/git/flutter.googlesource.com-recipes/objects\n",
+      "[CACHE]/git/flutter.googlesource.com-infra/objects\n",
       "[START_DIR]/infra/.git/objects/info/alternates"
     ],
     "cwd": "[START_DIR]/infra",
@@ -397,10 +405,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.alternates",
+    "name": "checkout.cache.alternates",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-recipes/objects@@@",
+      "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-infra/objects@@@",
       "@@@STEP_LOG_END@alternates@@@"
     ]
   },
@@ -428,7 +436,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.cache.remove git cache guard file",
+    "name": "checkout.cache.remove git cache guard file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -442,6 +450,7 @@
       "main"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -454,7 +463,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.git fetch",
+    "name": "checkout.git fetch",
     "timeout": 1200.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -468,6 +477,7 @@
       "FETCH_HEAD"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -480,7 +490,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.git checkout",
+    "name": "checkout.git checkout",
     "timeout": 600.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -493,6 +503,7 @@
       "HEAD"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -505,7 +516,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.git rev-parse",
+    "name": "checkout.git rev-parse",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -520,6 +531,7 @@
       "-x"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -532,7 +544,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.git clean",
+    "name": "checkout.git clean",
     "timeout": 600.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -540,7 +552,7 @@
   },
   {
     "cmd": [],
-    "name": "fetch refs/heads/main.submodule",
+    "name": "checkout.submodule",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
@@ -552,6 +564,7 @@
       "sync"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -564,7 +577,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.submodule.git submodule sync",
+    "name": "checkout.submodule.git submodule sync",
     "timeout": 600.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -580,6 +593,7 @@
       "4"
     ],
     "cwd": "[START_DIR]/infra",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -592,7 +606,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch refs/heads/main.submodule.git submodule update",
+    "name": "checkout.submodule.git submodule update",
     "timeout": 600.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -600,564 +614,6 @@
   },
   {
     "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/infra"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "makedirs"
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "--remove-section",
-      "remote.origin"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "remove section",
-    "timeout": 60.0
-  },
-  {
-    "cmd": [
-      "git",
-      "remote",
-      "add",
-      "origin",
-      "https://flutter.googlesource.com/recipes"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "git remote",
-    "timeout": 600.0
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "fetch.uriprotocols",
-      "https"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "set fetch.uriprotocols",
-    "timeout": 60.0
-  },
-  {
-    "cmd": [],
-    "name": "cache"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "",
-      "[CACHE]/git/.GUARD_FILE"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.write git cache guard file",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[CACHE]/git/flutter.googlesource.com-recipes"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.makedirs",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "init",
-      "--bare"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.git init",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "remote.origin.url",
-      "https://flutter.googlesource.com/recipes"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.remote set-url",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "fetch.uriprotocols",
-      "https"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.set fetch.uriprotocols",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "--replace-all",
-      "remote.origin.fetch",
-      "+refs/heads/*:refs/heads/*",
-      "\\+refs/heads/\\*:.*"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.replace fetch configs",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "--prune",
-      "--tags",
-      "origin"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.git fetch",
-    "timeout": 1200.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/infra/.git/objects/info"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.makedirs object/info",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CACHE]/git/flutter.googlesource.com-recipes/objects\n",
-      "[START_DIR]/infra/.git/objects/info/alternates"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.alternates",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-recipes/objects@@@",
-      "@@@STEP_LOG_END@alternates@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CACHE]/git/.GUARD_FILE"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.remove git cache guard file",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "--tags",
-      "origin",
-      "refs/changes/56/123456/7"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "git fetch",
-    "timeout": 1200.0
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "git checkout",
-    "timeout": 600.0
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "git rev-parse",
-    "timeout": 60.0
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "git clean",
-    "timeout": 600.0
-  },
-  {
-    "cmd": [],
-    "name": "submodule"
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "submodule.git submodule sync",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--jobs",
-      "4"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "submodule.git submodule update",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rebase",
-      "deadbeef"
-    ],
-    "cwd": "[START_DIR]/infra",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "git rebase",
-    "timeout": 60.0
-  },
-  {
-    "cmd": [
       "git",
       "log",
       "--oneline",
diff --git a/recipes/infra/luci_config.py b/recipes/infra/luci_config.py
index e026497..510f0bd 100644
--- a/recipes/infra/luci_config.py
+++ b/recipes/infra/luci_config.py
@@ -8,6 +8,7 @@
 
 DEPS = [
     'fuchsia/git',
+    'fuchsia/git_checkout',
     'recipe_engine/buildbucket',
     'recipe_engine/context',
     'recipe_engine/path',
@@ -19,15 +20,7 @@
   start_path = api.path['start_dir']
   infra_path = start_path.join('infra')
   # Checkout flutter/infra
-  bb_input = api.buildbucket.build.input
-  if bb_input.gerrit_changes:
-    api.git.checkout_cl(
-        bb_input.gerrit_changes[0], infra_path, onto='refs/heads/main'
-    )
-  else:
-    api.git.checkout(
-        'https://flutter.googlesource.com/infra', ref='refs/heads/main'
-    )
+  api.git_checkout('https://flutter.googlesource.com/infra', path=infra_path)
   with api.context(cwd=infra_path):
     api.git('log', 'log', '--oneline', '-n', '10')
   # Validate LUCI config
diff --git a/recipes/recipes.expected/ci.json b/recipes/recipes.expected/ci.json
index 8277f1e..6e5a4b3 100644
--- a/recipes/recipes.expected/ci.json
+++ b/recipes/recipes.expected/ci.json
@@ -1,45 +1,11 @@
 [
   {
     "cmd": [],
-    "name": "ensure gerrit"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "RECIPE_MODULE[fuchsia::gerrit]/resources/tool_manifest.json",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "ensure gerrit.read manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@tool_manifest.json@{@@@",
-      "@@@STEP_LOG_LINE@tool_manifest.json@  \"path\": \"path/to/gerrit\",@@@",
-      "@@@STEP_LOG_LINE@tool_manifest.json@  \"version\": \"version:pinned-version\"@@@",
-      "@@@STEP_LOG_LINE@tool_manifest.json@}@@@",
-      "@@@STEP_LOG_END@tool_manifest.json@@@"
-    ]
+    "name": "checkout"
   },
   {
     "cmd": [],
-    "name": "ensure gerrit.install path/to/gerrit",
+    "name": "checkout.fetch refs/heads/main",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
@@ -54,135 +20,6 @@
       "ensure-directory",
       "--mode",
       "0777",
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "ensure gerrit.install path/to/gerrit.ensure package directory",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version",
-      "-ensure-file",
-      "path/to/gerrit version:pinned-version",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "ensure gerrit.install path/to/gerrit.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@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-version:pinned-v\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"path/to/gerrit\"@@@",
-      "@@@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": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "change-detail",
-      "-host",
-      "https://flutter-review.googlesource.com",
-      "-input",
-      "{\"change_id\": \"123456\", \"params\": {\"o\": [\"CURRENT_COMMIT\", \"CURRENT_REVISION\"]}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "details",
-    "timeout": 30,
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"branch\": \"main\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"ffffffffffffffffffffffffffffffffffffffff\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"revisions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"ffffffffffffffffffffffffffffffffffffffff\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"commit\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"parents\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@          {}@@@",
-      "@@@STEP_LOG_LINE@json.output@        ]@@@",
-      "@@@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@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"change_id\": \"123456\", @@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"o\": [@@@",
-      "@@@STEP_LOG_LINE@json.input@      \"CURRENT_COMMIT\", @@@",
-      "@@@STEP_LOG_LINE@json.input@      \"CURRENT_REVISION\"@@@",
-      "@@@STEP_LOG_LINE@json.input@    ]@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@",
-      "@@@STEP_LINK@gerrit link@https://flutter-review.googlesource.com/q/123456@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "fetch main"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
       "[START_DIR]/recipes"
     ],
     "infra_step": true,
@@ -198,9 +35,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.makedirs",
+    "name": "checkout.fetch refs/heads/main.makedirs",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -209,6 +46,7 @@
       "init"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -221,10 +59,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.git init",
+    "name": "checkout.fetch refs/heads/main.git init",
     "timeout": 60.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -236,6 +74,7 @@
       "https://flutter.googlesource.com/recipes"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -248,10 +87,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.git remote",
+    "name": "checkout.fetch refs/heads/main.git remote",
     "timeout": 600.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -262,6 +101,7 @@
       "https"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -274,17 +114,17 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.set fetch.uriprotocols",
+    "name": "checkout.fetch refs/heads/main.set fetch.uriprotocols",
     "timeout": 60.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "fetch main.cache",
+    "name": "checkout.fetch refs/heads/main.cache",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -313,9 +153,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.ensure git cache dir",
+    "name": "checkout.fetch refs/heads/main.cache.ensure git cache dir",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -343,7 +183,587 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.write git cache guard file",
+    "name": "checkout.fetch refs/heads/main.cache.write git cache guard file",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[CACHE]/git/flutter.googlesource.com-recipes"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.makedirs",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "init",
+      "--bare"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.git init",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "remote.origin.url",
+      "https://flutter.googlesource.com/recipes"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.remote set-url",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "fetch.uriprotocols",
+      "https"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.set fetch.uriprotocols",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "--replace-all",
+      "remote.origin.fetch",
+      "+refs/heads/*:refs/heads/*",
+      "\\+refs/heads/\\*:.*"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.replace fetch configs",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "fetch",
+      "--prune",
+      "--tags",
+      "origin"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.git fetch",
+    "timeout": 1200.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/recipes/.git/objects/info"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.makedirs object/info",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CACHE]/git/flutter.googlesource.com-recipes/objects\n",
+      "[START_DIR]/recipes/.git/objects/info/alternates"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.alternates",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-recipes/objects@@@",
+      "@@@STEP_LOG_END@alternates@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "remove",
+      "[CACHE]/git/.GUARD_FILE"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.remove git cache guard file",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "fetch",
+      "--tags",
+      "origin",
+      "main"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.git fetch",
+    "timeout": 1200.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "checkout",
+      "-f",
+      "FETCH_HEAD"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.git checkout",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "rev-parse",
+      "HEAD"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.git rev-parse",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "clean",
+      "-f",
+      "-d",
+      "-x"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.git clean",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout.fetch refs/heads/main.submodule",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "submodule",
+      "sync"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.submodule.git submodule sync",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "submodule",
+      "update",
+      "--init",
+      "--jobs",
+      "4"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.submodule.git submodule update",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/recipes"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.makedirs",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "--remove-section",
+      "remote.origin"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.remove section",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "remote",
+      "add",
+      "origin",
+      "https://flutter.googlesource.com/recipes"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.git remote",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "fetch.uriprotocols",
+      "https"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.set fetch.uriprotocols",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout.cache",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "",
+      "[CACHE]/git/.GUARD_FILE"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.cache.write git cache guard file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -374,7 +794,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.makedirs",
+    "name": "checkout.cache.makedirs",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -386,6 +806,7 @@
       "--bare"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -398,7 +819,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.git init",
+    "name": "checkout.cache.git init",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -412,6 +833,7 @@
       "https://flutter.googlesource.com/recipes"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -424,7 +846,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.remote set-url",
+    "name": "checkout.cache.remote set-url",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -438,6 +860,7 @@
       "https"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -450,7 +873,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.set fetch.uriprotocols",
+    "name": "checkout.cache.set fetch.uriprotocols",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -466,6 +889,7 @@
       "\\+refs/heads/\\*:.*"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -478,7 +902,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.replace fetch configs",
+    "name": "checkout.cache.replace fetch configs",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -493,6 +917,7 @@
       "origin"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -505,7 +930,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.git fetch",
+    "name": "checkout.cache.git fetch",
     "timeout": 1200.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -537,7 +962,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.makedirs object/info",
+    "name": "checkout.cache.makedirs object/info",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -567,7 +992,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.alternates",
+    "name": "checkout.cache.alternates",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-recipes/objects@@@",
@@ -598,7 +1023,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.remove git cache guard file",
+    "name": "checkout.cache.remove git cache guard file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -609,560 +1034,10 @@
       "fetch",
       "--tags",
       "origin",
-      "main"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.git fetch",
-    "timeout": 1200.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.git checkout",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.git rev-parse",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.git clean",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "fetch main.submodule",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.submodule.git submodule sync",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--jobs",
-      "4"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.submodule.git submodule update",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/recipes"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "makedirs"
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "--remove-section",
-      "remote.origin"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "remove section",
-    "timeout": 60.0
-  },
-  {
-    "cmd": [
-      "git",
-      "remote",
-      "add",
-      "origin",
-      "https://flutter.googlesource.com/recipes"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "git remote",
-    "timeout": 600.0
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "fetch.uriprotocols",
-      "https"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "set fetch.uriprotocols",
-    "timeout": 60.0
-  },
-  {
-    "cmd": [],
-    "name": "cache"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "",
-      "[CACHE]/git/.GUARD_FILE"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.write git cache guard file",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[CACHE]/git/flutter.googlesource.com-recipes"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.makedirs",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "init",
-      "--bare"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.git init",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "remote.origin.url",
-      "https://flutter.googlesource.com/recipes"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.remote set-url",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "fetch.uriprotocols",
-      "https"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.set fetch.uriprotocols",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "--replace-all",
-      "remote.origin.fetch",
-      "+refs/heads/*:refs/heads/*",
-      "\\+refs/heads/\\*:.*"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.replace fetch configs",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "--prune",
-      "--tags",
-      "origin"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.git fetch",
-    "timeout": 1200.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/recipes/.git/objects/info"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.makedirs object/info",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CACHE]/git/flutter.googlesource.com-recipes/objects\n",
-      "[START_DIR]/recipes/.git/objects/info/alternates"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.alternates",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-recipes/objects@@@",
-      "@@@STEP_LOG_END@alternates@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CACHE]/git/.GUARD_FILE"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.remove git cache guard file",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "--tags",
-      "origin",
       "refs/changes/56/123456/7"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1175,8 +1050,11 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git fetch",
-    "timeout": 1200.0
+    "name": "checkout.git fetch",
+    "timeout": 1200.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -1186,6 +1064,7 @@
       "FETCH_HEAD"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1198,8 +1077,11 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git checkout",
-    "timeout": 600.0
+    "name": "checkout.git checkout",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -1208,6 +1090,7 @@
       "HEAD"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1220,8 +1103,11 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git rev-parse",
-    "timeout": 60.0
+    "name": "checkout.git rev-parse",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -1232,6 +1118,7 @@
       "-x"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1244,12 +1131,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git clean",
-    "timeout": 600.0
+    "name": "checkout.git clean",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "submodule"
+    "name": "checkout.submodule",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -1258,6 +1151,7 @@
       "sync"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1270,10 +1164,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "submodule.git submodule sync",
+    "name": "checkout.submodule.git submodule sync",
     "timeout": 600.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1286,6 +1180,7 @@
       "4"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1298,10 +1193,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "submodule.git submodule update",
+    "name": "checkout.submodule.git submodule update",
     "timeout": 600.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1311,6 +1206,7 @@
       "deadbeef"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1323,8 +1219,11 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git rebase",
-    "timeout": 60.0
+    "name": "checkout.git rebase",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
diff --git a/recipes/recipes.expected/cq_try.json b/recipes/recipes.expected/cq_try.json
index 8277f1e..6e5a4b3 100644
--- a/recipes/recipes.expected/cq_try.json
+++ b/recipes/recipes.expected/cq_try.json
@@ -1,45 +1,11 @@
 [
   {
     "cmd": [],
-    "name": "ensure gerrit"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "RECIPE_MODULE[fuchsia::gerrit]/resources/tool_manifest.json",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "ensure gerrit.read manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@tool_manifest.json@{@@@",
-      "@@@STEP_LOG_LINE@tool_manifest.json@  \"path\": \"path/to/gerrit\",@@@",
-      "@@@STEP_LOG_LINE@tool_manifest.json@  \"version\": \"version:pinned-version\"@@@",
-      "@@@STEP_LOG_LINE@tool_manifest.json@}@@@",
-      "@@@STEP_LOG_END@tool_manifest.json@@@"
-    ]
+    "name": "checkout"
   },
   {
     "cmd": [],
-    "name": "ensure gerrit.install path/to/gerrit",
+    "name": "checkout.fetch refs/heads/main",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
@@ -54,135 +20,6 @@
       "ensure-directory",
       "--mode",
       "0777",
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "ensure gerrit.install path/to/gerrit.ensure package directory",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version",
-      "-ensure-file",
-      "path/to/gerrit version:pinned-version",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "ensure gerrit.install path/to/gerrit.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@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-version:pinned-v\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"path/to/gerrit\"@@@",
-      "@@@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": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "change-detail",
-      "-host",
-      "https://flutter-review.googlesource.com",
-      "-input",
-      "{\"change_id\": \"123456\", \"params\": {\"o\": [\"CURRENT_COMMIT\", \"CURRENT_REVISION\"]}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "details",
-    "timeout": 30,
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"branch\": \"main\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"ffffffffffffffffffffffffffffffffffffffff\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"revisions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"ffffffffffffffffffffffffffffffffffffffff\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"commit\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"parents\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@          {}@@@",
-      "@@@STEP_LOG_LINE@json.output@        ]@@@",
-      "@@@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@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"change_id\": \"123456\", @@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"o\": [@@@",
-      "@@@STEP_LOG_LINE@json.input@      \"CURRENT_COMMIT\", @@@",
-      "@@@STEP_LOG_LINE@json.input@      \"CURRENT_REVISION\"@@@",
-      "@@@STEP_LOG_LINE@json.input@    ]@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@",
-      "@@@STEP_LINK@gerrit link@https://flutter-review.googlesource.com/q/123456@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "fetch main"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
       "[START_DIR]/recipes"
     ],
     "infra_step": true,
@@ -198,9 +35,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.makedirs",
+    "name": "checkout.fetch refs/heads/main.makedirs",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -209,6 +46,7 @@
       "init"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -221,10 +59,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.git init",
+    "name": "checkout.fetch refs/heads/main.git init",
     "timeout": 60.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -236,6 +74,7 @@
       "https://flutter.googlesource.com/recipes"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -248,10 +87,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.git remote",
+    "name": "checkout.fetch refs/heads/main.git remote",
     "timeout": 600.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -262,6 +101,7 @@
       "https"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -274,17 +114,17 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.set fetch.uriprotocols",
+    "name": "checkout.fetch refs/heads/main.set fetch.uriprotocols",
     "timeout": 60.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "fetch main.cache",
+    "name": "checkout.fetch refs/heads/main.cache",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -313,9 +153,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.ensure git cache dir",
+    "name": "checkout.fetch refs/heads/main.cache.ensure git cache dir",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -343,7 +183,587 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.write git cache guard file",
+    "name": "checkout.fetch refs/heads/main.cache.write git cache guard file",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[CACHE]/git/flutter.googlesource.com-recipes"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.makedirs",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "init",
+      "--bare"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.git init",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "remote.origin.url",
+      "https://flutter.googlesource.com/recipes"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.remote set-url",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "fetch.uriprotocols",
+      "https"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.set fetch.uriprotocols",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "--replace-all",
+      "remote.origin.fetch",
+      "+refs/heads/*:refs/heads/*",
+      "\\+refs/heads/\\*:.*"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.replace fetch configs",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "fetch",
+      "--prune",
+      "--tags",
+      "origin"
+    ],
+    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.git fetch",
+    "timeout": 1200.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/recipes/.git/objects/info"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.makedirs object/info",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CACHE]/git/flutter.googlesource.com-recipes/objects\n",
+      "[START_DIR]/recipes/.git/objects/info/alternates"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.alternates",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-recipes/objects@@@",
+      "@@@STEP_LOG_END@alternates@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "remove",
+      "[CACHE]/git/.GUARD_FILE"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.cache.remove git cache guard file",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "fetch",
+      "--tags",
+      "origin",
+      "main"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.git fetch",
+    "timeout": 1200.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "checkout",
+      "-f",
+      "FETCH_HEAD"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.git checkout",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "rev-parse",
+      "HEAD"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.git rev-parse",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "clean",
+      "-f",
+      "-d",
+      "-x"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.git clean",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout.fetch refs/heads/main.submodule",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "submodule",
+      "sync"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.submodule.git submodule sync",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "submodule",
+      "update",
+      "--init",
+      "--jobs",
+      "4"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.fetch refs/heads/main.submodule.git submodule update",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/recipes"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.makedirs",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "--remove-section",
+      "remote.origin"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.remove section",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "remote",
+      "add",
+      "origin",
+      "https://flutter.googlesource.com/recipes"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.git remote",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "config",
+      "fetch.uriprotocols",
+      "https"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.set fetch.uriprotocols",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout.cache",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "",
+      "[CACHE]/git/.GUARD_FILE"
+    ],
+    "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:try"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "checkout.cache.write git cache guard file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -374,7 +794,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.makedirs",
+    "name": "checkout.cache.makedirs",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -386,6 +806,7 @@
       "--bare"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -398,7 +819,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.git init",
+    "name": "checkout.cache.git init",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -412,6 +833,7 @@
       "https://flutter.googlesource.com/recipes"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -424,7 +846,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.remote set-url",
+    "name": "checkout.cache.remote set-url",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -438,6 +860,7 @@
       "https"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -450,7 +873,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.set fetch.uriprotocols",
+    "name": "checkout.cache.set fetch.uriprotocols",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -466,6 +889,7 @@
       "\\+refs/heads/\\*:.*"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -478,7 +902,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.replace fetch configs",
+    "name": "checkout.cache.replace fetch configs",
     "timeout": 60.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -493,6 +917,7 @@
       "origin"
     ],
     "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -505,7 +930,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.git fetch",
+    "name": "checkout.cache.git fetch",
     "timeout": 1200.0,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
@@ -537,7 +962,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.makedirs object/info",
+    "name": "checkout.cache.makedirs object/info",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -567,7 +992,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.alternates",
+    "name": "checkout.cache.alternates",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-recipes/objects@@@",
@@ -598,7 +1023,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "fetch main.cache.remove git cache guard file",
+    "name": "checkout.cache.remove git cache guard file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -609,560 +1034,10 @@
       "fetch",
       "--tags",
       "origin",
-      "main"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.git fetch",
-    "timeout": 1200.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.git checkout",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.git rev-parse",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.git clean",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "fetch main.submodule",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.submodule.git submodule sync",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--jobs",
-      "4"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "fetch main.submodule.git submodule update",
-    "timeout": 600.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/recipes"
-    ],
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "makedirs"
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "--remove-section",
-      "remote.origin"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "remove section",
-    "timeout": 60.0
-  },
-  {
-    "cmd": [
-      "git",
-      "remote",
-      "add",
-      "origin",
-      "https://flutter.googlesource.com/recipes"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "git remote",
-    "timeout": 600.0
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "fetch.uriprotocols",
-      "https"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "set fetch.uriprotocols",
-    "timeout": 60.0
-  },
-  {
-    "cmd": [],
-    "name": "cache"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "",
-      "[CACHE]/git/.GUARD_FILE"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.write git cache guard file",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[CACHE]/git/flutter.googlesource.com-recipes"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.makedirs",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "init",
-      "--bare"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.git init",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "remote.origin.url",
-      "https://flutter.googlesource.com/recipes"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.remote set-url",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "fetch.uriprotocols",
-      "https"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.set fetch.uriprotocols",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "config",
-      "--replace-all",
-      "remote.origin.fetch",
-      "+refs/heads/*:refs/heads/*",
-      "\\+refs/heads/\\*:.*"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.replace fetch configs",
-    "timeout": 60.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "--prune",
-      "--tags",
-      "origin"
-    ],
-    "cwd": "[CACHE]/git/flutter.googlesource.com-recipes",
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.git fetch",
-    "timeout": 1200.0,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/recipes/.git/objects/info"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.makedirs object/info",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CACHE]/git/flutter.googlesource.com-recipes/objects\n",
-      "[START_DIR]/recipes/.git/objects/info/alternates"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.alternates",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@alternates@[CACHE]/git/flutter.googlesource.com-recipes/objects@@@",
-      "@@@STEP_LOG_END@alternates@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CACHE]/git/.GUARD_FILE"
-    ],
-    "cwd": "[START_DIR]/recipes",
-    "infra_step": true,
-    "luci_context": {
-      "realm": {
-        "name": "project:try"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cache.remove git cache guard file",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "--tags",
-      "origin",
       "refs/changes/56/123456/7"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1175,8 +1050,11 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git fetch",
-    "timeout": 1200.0
+    "name": "checkout.git fetch",
+    "timeout": 1200.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -1186,6 +1064,7 @@
       "FETCH_HEAD"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1198,8 +1077,11 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git checkout",
-    "timeout": 600.0
+    "name": "checkout.git checkout",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -1208,6 +1090,7 @@
       "HEAD"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1220,8 +1103,11 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git rev-parse",
-    "timeout": 60.0
+    "name": "checkout.git rev-parse",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -1232,6 +1118,7 @@
       "-x"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1244,12 +1131,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git clean",
-    "timeout": 600.0
+    "name": "checkout.git clean",
+    "timeout": 600.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "submodule"
+    "name": "checkout.submodule",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
@@ -1258,6 +1151,7 @@
       "sync"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1270,10 +1164,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "submodule.git submodule sync",
+    "name": "checkout.submodule.git submodule sync",
     "timeout": 600.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1286,6 +1180,7 @@
       "4"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1298,10 +1193,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "submodule.git submodule update",
+    "name": "checkout.submodule.git submodule update",
     "timeout": 600.0,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1311,6 +1206,7 @@
       "deadbeef"
     ],
     "cwd": "[START_DIR]/recipes",
+    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "project:try"
@@ -1323,8 +1219,11 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "git rebase",
-    "timeout": 60.0
+    "name": "checkout.git rebase",
+    "timeout": 60.0,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [
diff --git a/recipes/recipes.py b/recipes/recipes.py
index 2f70856..3f62cc2 100644
--- a/recipes/recipes.py
+++ b/recipes/recipes.py
@@ -15,6 +15,7 @@
 DEPS = [
     'fuchsia/commit_queue',
     'fuchsia/git',
+    'fuchsia/git_checkout',
     'fuchsia/recipe_testing',
     'fuchsia/status_check',
     'fuchsia/gerrit',
@@ -124,33 +125,9 @@
   use_buildbucket = attr.ib(default=False)
 
 
-def GetBranch(api, change):
-  details = api.gerrit.change_details(
-      'details',
-      change_id=str(change.change),
-      host=change.host,
-      max_attempts=5,
-      query_params=['CURRENT_COMMIT', 'CURRENT_REVISION',],
-      timeout=30,
-      test_data=api.json.test_api.output(
-         {
-           'branch': 'main',
-           'current_revision': 'f' * 40,
-           'revisions': {'f' * 40: {'commit': {'parents': [{}],},},},
-         }
-      ),
-  ).json.output
-  return details['branch']
-
-
 def RunSteps(api, remote, unittest_only):
   checkout_path = api.path['start_dir'].join('recipes')
-  bb_input = api.buildbucket.build.input
-  branch = GetBranch(api, bb_input.gerrit_changes[0])
-  api.git.checkout_cl(
-      bb_input.gerrit_changes[0], checkout_path,
-      onto=branch
-  )
+  api.git_checkout(remote, path=checkout_path)
   with api.context(cwd=checkout_path):
     api.git('log', 'log', '--oneline', '-n', '10')
   api.recipe_testing.projects = ('flutter',)
@@ -173,7 +150,7 @@
       api.recipe_testing
       .build_data('flutter/try/flutter-bar', 'flutter', skip=True) +
       api.recipe_testing
-      .build_data('flutter/try/flutter-baz', 'project', skip=True) + 
+      .build_data('flutter/try/flutter-baz', 'project', skip=True) +
       api.buildbucket.try_build(
           git_repo='https://flutter.googlesource.com/recipes'
       )