repo_roll: Nest steps

Bug: b/341756093
Change-Id: Ib4702ee354ad2169676f2ccb7b155ad01109897e
Reviewed-on: https://pigweed-review.googlesource.com/c/infra/recipes/+/236057
Presubmit-Verified: CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Taylor Cramer <cramertj@google.com>
Pigweed-Auto-Submit: Rob Mohr <mohrr@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
diff --git a/recipe_modules/cipd_roll/api.py b/recipe_modules/cipd_roll/api.py
index df1dd2d..fa55400 100644
--- a/recipe_modules/cipd_roll/api.py
+++ b/recipe_modules/cipd_roll/api.py
@@ -276,7 +276,8 @@
                         cipd_json,
                         indent=2,
                         separators=(',', ': '),
-                    ) + '\n',
+                    )
+                    + '\n',
                 )
                 return [
                     Roll(
diff --git a/recipe_modules/repo_roll/api.py b/recipe_modules/repo_roll/api.py
index 3655f6e..d95c264 100644
--- a/recipe_modules/repo_roll/api.py
+++ b/recipe_modules/repo_roll/api.py
@@ -65,147 +65,154 @@
         checkout: checkout_api.CheckoutContext,
         project: Project,
     ) -> list[git_roll_util_api.Roll]:
-        new_revision = None
+        with self.m.step.nest(project.path_to_update):
+            new_revision = None
 
-        # Try to get new_revision from the trigger.
-        bb_remote = None
-        commit = self.m.buildbucket.build.input.gitiles_commit
-        if commit and commit.project:
-            new_revision = commit.id
-            host = commit.host
-            bb_remote = f'https://{host}/{commit.project}'
+            # Try to get new_revision from the trigger.
+            bb_remote = None
+            commit = self.m.buildbucket.build.input.gitiles_commit
+            if commit and commit.project:
+                new_revision = commit.id
+                host = commit.host
+                bb_remote = f'https://{host}/{commit.project}'
 
-        tree = _TreeBuilder()
-        parser = xml.etree.ElementTree.XMLParser(target=tree)
-        parser.feed(
-            self.m.file.read_text('read manifest', checkout.manifest_path)
-        )
-        parser.close()
-        root = tree.close()
-
-        defaults = {}
-        for default in root.findall('default'):
-            defaults.update(default.attrib)
-
-        remotes = {}
-        for rem in root.findall('remote'):
-            remotes[rem.attrib['name']] = rem.attrib
-
-        # Search for path_to_update and check the repository it refers to
-        # matches the triggering repository. This check is mostly a config check
-        # and shouldn't fail in real runs unless somebody moves around project
-        # paths in the manifest without updating the builder definition.
-        paths_found = []
-        proj = None
-        proj_attrib = {}
-
-        for proj in root.findall('project'):
-            # Sometimes projects don't define something in which case we need to
-            # fall back on the remote specified by the project or the default
-            # for the entire manifest.
-            proj_attrib = {}
-            proj_attrib.update(defaults)
-            remote_name = proj.attrib.get(
-                'remote', defaults.get('remote', None)
+            tree = _TreeBuilder()
+            parser = xml.etree.ElementTree.XMLParser(target=tree)
+            parser.feed(
+                self.m.file.read_text('read manifest', checkout.manifest_path)
             )
-            assert remote_name
-            proj_attrib.update(remotes[remote_name])
-            proj_attrib.update(proj.attrib)
-            proj_attrib['fetch'] = self.m.sso.sso_to_https(proj_attrib['fetch'])
+            parser.close()
+            root = tree.close()
 
-            # Apparently if path is left off name is used. This is mildly
-            # infuriating, but easy to work around.
-            if 'path' not in proj_attrib:
-                proj_attrib['path'] = proj_attrib['name']
+            defaults = {}
+            for default in root.findall('default'):
+                defaults.update(default.attrib)
 
-            paths_found.append(proj_attrib['path'])
-            if proj_attrib['path'] == project.path_to_update:
-                fetch_host = proj_attrib['fetch'].strip('/')
-                if fetch_host.startswith('..'):
-                    fetch_host = urllib.parse.urljoin(
-                        checkout.options.remote,
-                        fetch_host,
-                    )
+            remotes = {}
+            for rem in root.findall('remote'):
+                remotes[rem.attrib['name']] = rem.attrib
 
-                manifest_remote = (
-                    fetch_host.rstrip('/')
-                    + '/'
-                    + proj_attrib['name'].strip('/')
-                )
-                if bb_remote and not checkout.remotes_equivalent(
-                    manifest_remote, bb_remote
-                ):
-                    raise self.m.step.StepFailure(
-                        f"repo paths don't match: {manifest_remote!r} from "
-                        f'manifest and {bb_remote!r} from buildbucket'
-                    )
-                break
-
-            # Reset proj_attrib to None if this entry wasn't a match, so if this
-            # is the last iteration the condition a few lines down will work.
+            # Search for path_to_update and check the repository it refers to
+            # matches the triggering repository. This check is mostly a config
+            # check and shouldn't fail in real runs unless somebody moves around
+            # project paths in the manifest without updating the builder
+            # definition.
+            paths_found = []
+            proj = None
             proj_attrib = {}
 
-        if not proj_attrib:
-            raise self.m.step.StepFailure(
-                'cannot find "{}" in manifest (found {})'.format(
-                    project.path_to_update,
-                    ', '.join('"{}"'.format(x) for x in paths_found),
+            for proj in root.findall('project'):
+                # Sometimes projects don't define something in which case we
+                # need to fall back on the remote specified by the project or
+                # the default for the entire manifest.
+                proj_attrib = {}
+                proj_attrib.update(defaults)
+                remote_name = proj.attrib.get(
+                    'remote', defaults.get('remote', None)
                 )
-            )
+                assert remote_name
+                proj_attrib.update(remotes[remote_name])
+                proj_attrib.update(proj.attrib)
+                proj_attrib['fetch'] = self.m.sso.sso_to_https(
+                    proj_attrib['fetch'],
+                )
 
-        if 'upstream' in proj_attrib:
-            proj_branch = proj_attrib['upstream']
-        elif 'revision' in proj_attrib and self.is_branch(
-            proj_attrib['revision']
-        ):
-            proj_branch = proj_attrib['revision']
-        else:
-            proj_branch = 'main'
+                # Apparently if path is left off name is used. This is mildly
+                # infuriating, but easy to work around.
+                if 'path' not in proj_attrib:
+                    proj_attrib['path'] = proj_attrib['name']
 
-        new_revision = self.m.git_roll_util.resolve_new_revision(
-            manifest_remote,
-            proj_branch,
-            checkout.remotes_equivalent,
-        )
+                paths_found.append(proj_attrib['path'])
+                if proj_attrib['path'] == project.path_to_update:
+                    fetch_host = proj_attrib['fetch'].strip('/')
+                    if fetch_host.startswith('..'):
+                        fetch_host = urllib.parse.urljoin(
+                            checkout.options.remote,
+                            fetch_host,
+                        )
 
-        # If upstream not set we may be transitioning from tracking a branch to
-        # rolling. In that case set upstream to be the revision, but only if the
-        # revision appears to be a branch.
-        if 'upstream' not in proj_attrib:
-            if self.is_branch(proj_attrib['revision']):
-                # Explicitly update both proj.attrib and proj_attrib to minimize
-                # confusion if these statements are moved around later.
-                proj.attrib['upstream'] = proj_attrib['revision']
-                proj_attrib['upstream'] = proj.attrib['upstream']
-            else:
+                    manifest_remote = (
+                        fetch_host.rstrip('/')
+                        + '/'
+                        + proj_attrib['name'].strip('/')
+                    )
+                    if bb_remote and not checkout.remotes_equivalent(
+                        manifest_remote, bb_remote
+                    ):
+                        raise self.m.step.StepFailure(
+                            f"repo paths don't match: {manifest_remote!r} from "
+                            f'manifest and {bb_remote!r} from buildbucket'
+                        )
+                    break
+
+                # Reset proj_attrib to None if this entry wasn't a match, so if
+                # this is the last iteration the condition a few lines down will
+                # work.
+                proj_attrib = {}
+
+            if not proj_attrib:
                 raise self.m.step.StepFailure(
-                    'upstream not set and revision is not a branch, aborting'
+                    'cannot find "{}" in manifest (found {})'.format(
+                        project.path_to_update,
+                        ', '.join('"{}"'.format(x) for x in paths_found),
+                    )
                 )
 
-        old_revision = proj_attrib['revision']
-        # Explicitly update both proj.attrib and proj_attrib to minimize
-        # confusion.
-        proj_attrib['revision'] = proj.attrib['revision'] = new_revision
+            if 'upstream' in proj_attrib:
+                proj_branch = proj_attrib['upstream']
+            elif 'revision' in proj_attrib and self.is_branch(
+                proj_attrib['revision']
+            ):
+                proj_branch = proj_attrib['revision']
+            else:
+                proj_branch = 'main'
 
-        try:
-            roll = self.m.git_roll_util.get_roll(
-                repo_url=manifest_remote,
-                repo_short_name=project.path_to_update,
-                old_rev=old_revision,
-                new_rev=new_revision,
+            new_revision = self.m.git_roll_util.resolve_new_revision(
+                manifest_remote,
+                proj_branch,
+                checkout.remotes_equivalent,
             )
 
-        except self.m.git_roll_util.BackwardsRollError:
-            return []
+            # If upstream not set we may be transitioning from tracking a branch
+            # to rolling. In that case set upstream to be the revision, but only
+            # if the revision appears to be a branch.
+            if 'upstream' not in proj_attrib:
+                if self.is_branch(proj_attrib['revision']):
+                    # Explicitly update both proj.attrib and proj_attrib to
+                    # minimize confusion if these statements are moved around
+                    # later.
+                    proj.attrib['upstream'] = proj_attrib['revision']
+                    proj_attrib['upstream'] = proj.attrib['upstream']
+                else:
+                    raise self.m.step.StepFailure(
+                        'upstream not set and revision is not a branch, '
+                        'aborting'
+                    )
 
-        self._order_attributes(root)
+            old_revision = proj_attrib['revision']
+            # Explicitly update both proj.attrib and proj_attrib to minimize
+            # confusion.
+            proj_attrib['revision'] = proj.attrib['revision'] = new_revision
 
-        self.m.file.write_text(
-            'write manifest',
-            checkout.manifest_path,
-            '<?xml version="1.0" encoding="UTF-8"?>\n{}\n'.format(
-                xml.etree.ElementTree.tostring(root).decode(),
-            ),
-        )
+            try:
+                roll = self.m.git_roll_util.get_roll(
+                    repo_url=manifest_remote,
+                    repo_short_name=project.path_to_update,
+                    old_rev=old_revision,
+                    new_rev=new_revision,
+                )
 
-        return [roll]
+            except self.m.git_roll_util.BackwardsRollError:
+                return []
+
+            self._order_attributes(root)
+
+            self.m.file.write_text(
+                'write manifest',
+                checkout.manifest_path,
+                '<?xml version="1.0" encoding="UTF-8"?>\n{}\n'.format(
+                    xml.etree.ElementTree.tostring(root).decode(),
+                ),
+            )
+
+            return [roll]
diff --git a/recipe_modules/repo_roll/tests/full.expected/backwards.json b/recipe_modules/repo_roll/tests/full.expected/backwards.json
index a4566dd..b39e022 100644
--- a/recipe_modules/repo_roll/tests/full.expected/backwards.json
+++ b/recipe_modules/repo_roll/tests/full.expected/backwards.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "a1"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -11,8 +15,9 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "read manifest",
+    "name": "a1.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -51,22 +56,26 @@
       "https://foo.googlesource.com/a",
       "main"
     ],
-    "name": "git ls-remote",
+    "name": "a1.git ls-remote",
     "timeout": 600.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@stdout@h3ll0\trefs/heads/main@@@",
       "@@@STEP_LOG_END@stdout@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -81,18 +90,18 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -108,9 +117,9 @@
       "[START_DIR]/cipd_tool/infra/tools/luci/gitiles/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -127,9 +136,9 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -153,17 +162,19 @@
       "1111111111111111111111111111111111111111..h3ll0"
     ],
     "infra_step": true,
-    "name": "log a1",
+    "name": "a1.log a1",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[]@@@",
       "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "detected backwards roll",
+    "name": "a1.detected backwards roll",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_TEXT@Detected backwards roll: expected 1111111 to precede h3ll0 in git history@@@"
     ]
   },
diff --git a/recipe_modules/repo_roll/tests/full.expected/dotdot-prefix.json b/recipe_modules/repo_roll/tests/full.expected/dotdot-prefix.json
index dcb086e..8de7764 100644
--- a/recipe_modules/repo_roll/tests/full.expected/dotdot-prefix.json
+++ b/recipe_modules/repo_roll/tests/full.expected/dotdot-prefix.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "g7"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -23,8 +27,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "g7.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -57,13 +62,16 @@
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "g7.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "g7.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -90,18 +98,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "g7.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "g7.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -129,9 +137,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "g7.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -160,9 +168,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "g7.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -198,9 +206,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "log g7",
+    "name": "g7.log g7",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -292,23 +301,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "g7.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "g7.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "g7.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -332,18 +344,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "g7.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "g7.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -371,9 +383,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "g7.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -402,9 +414,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "g7.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -442,10 +454,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "g7.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -481,10 +493,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "g7.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -520,10 +532,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "g7.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -559,8 +571,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "write manifest",
+    "name": "g7.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/equivalent.json b/recipe_modules/repo_roll/tests/full.expected/equivalent.json
index cc5414e..4b2b687 100644
--- a/recipe_modules/repo_roll/tests/full.expected/equivalent.json
+++ b/recipe_modules/repo_roll/tests/full.expected/equivalent.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "b2"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -11,8 +15,9 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "read manifest",
+    "name": "b2.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -51,22 +56,26 @@
       "https://bar.googlesource.com/b",
       "main"
     ],
-    "name": "git ls-remote",
+    "name": "b2.git ls-remote",
     "timeout": 600.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@stdout@h3ll0\trefs/heads/main@@@",
       "@@@STEP_LOG_END@stdout@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -81,18 +90,18 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -108,9 +117,9 @@
       "[START_DIR]/cipd_tool/infra/tools/luci/gitiles/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -127,9 +136,9 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -153,9 +162,10 @@
       "2222222222222222222222222222222222222222..h3ll0"
     ],
     "infra_step": true,
-    "name": "log b2",
+    "name": "b2.log b2",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -247,23 +257,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "b2.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -275,18 +288,18 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -302,9 +315,9 @@
       "[START_DIR]/cipd_tool/infra/tools/luci/gerrit/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -321,9 +334,9 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -349,10 +362,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "b2.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -376,10 +389,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "b2.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -403,10 +416,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "b2.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -430,8 +443,9 @@
       "[START_DIR]/checkout/default.xml"
     ],
     "infra_step": true,
-    "name": "write manifest",
+    "name": "b2.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/host-dot-dot.json b/recipe_modules/repo_roll/tests/full.expected/host-dot-dot.json
index ef40780..e476af0 100644
--- a/recipe_modules/repo_roll/tests/full.expected/host-dot-dot.json
+++ b/recipe_modules/repo_roll/tests/full.expected/host-dot-dot.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "f6"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -23,8 +27,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "f6.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -57,13 +62,16 @@
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "f6.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "f6.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -90,18 +98,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "f6.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "f6.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -129,9 +137,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "f6.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -160,9 +168,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "f6.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -198,9 +206,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "log f6",
+    "name": "f6.log f6",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -292,23 +301,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "f6.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "f6.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "f6.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -332,18 +344,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "f6.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "f6.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -371,9 +383,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "f6.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -402,9 +414,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "f6.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -442,10 +454,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "f6.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -481,10 +493,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "f6.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -520,10 +532,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "f6.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -559,8 +571,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "write manifest",
+    "name": "f6.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/host-prefix.json b/recipe_modules/repo_roll/tests/full.expected/host-prefix.json
index b109063..c0d6ecc 100644
--- a/recipe_modules/repo_roll/tests/full.expected/host-prefix.json
+++ b/recipe_modules/repo_roll/tests/full.expected/host-prefix.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "h8"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -23,8 +27,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "h8.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -57,13 +62,16 @@
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "h8.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "h8.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -90,18 +98,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "h8.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "h8.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -129,9 +137,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "h8.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -160,9 +168,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "h8.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -198,9 +206,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "log h8",
+    "name": "h8.log h8",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -292,23 +301,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "h8.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "h8.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "h8.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -332,18 +344,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "h8.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "h8.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -371,9 +383,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "h8.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -402,9 +414,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "h8.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -442,10 +454,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "h8.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -481,10 +493,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "h8.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -520,10 +532,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "h8.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -559,8 +571,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "write manifest",
+    "name": "h8.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/name-not-found.json b/recipe_modules/repo_roll/tests/full.expected/name-not-found.json
index 6e6d452..1ebcea7 100644
--- a/recipe_modules/repo_roll/tests/full.expected/name-not-found.json
+++ b/recipe_modules/repo_roll/tests/full.expected/name-not-found.json
@@ -1,5 +1,12 @@
 [
   {
+    "cmd": [],
+    "name": "missing",
+    "~followup_annotations": [
+      "@@@STEP_FAILURE@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -23,8 +30,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "missing.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-branch.json b/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-branch.json
index e37f471..8590c52 100644
--- a/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-branch.json
+++ b/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-branch.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "c3"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -11,8 +15,9 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "read manifest",
+    "name": "c3.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -51,22 +56,26 @@
       "https://bar.googlesource.com/c",
       "main"
     ],
-    "name": "git ls-remote",
+    "name": "c3.git ls-remote",
     "timeout": 600.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@stdout@h3ll0\trefs/heads/main@@@",
       "@@@STEP_LOG_END@stdout@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -81,18 +90,18 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -108,9 +117,9 @@
       "[START_DIR]/cipd_tool/infra/tools/luci/gitiles/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -127,9 +136,9 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -153,9 +162,10 @@
       "main..h3ll0"
     ],
     "infra_step": true,
-    "name": "log c3",
+    "name": "c3.log c3",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -247,23 +257,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "c3.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -275,18 +288,18 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -302,9 +315,9 @@
       "[START_DIR]/cipd_tool/infra/tools/luci/gerrit/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -321,9 +334,9 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -349,10 +362,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "c3.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -376,10 +389,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "c3.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -403,10 +416,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "c3.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -430,8 +443,9 @@
       "[START_DIR]/checkout/default.xml"
     ],
     "infra_step": true,
-    "name": "write manifest",
+    "name": "c3.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-hash.json b/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-hash.json
index 4b62343..fb62159 100644
--- a/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-hash.json
+++ b/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-hash.json
@@ -1,5 +1,12 @@
 [
   {
+    "cmd": [],
+    "name": "d4",
+    "~followup_annotations": [
+      "@@@STEP_FAILURE@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -11,8 +18,9 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "read manifest",
+    "name": "d4.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -51,9 +59,10 @@
       "https://bar.googlesource.com/d",
       "main"
     ],
-    "name": "git ls-remote",
+    "name": "d4.git ls-remote",
     "timeout": 600.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@stdout@h3ll0\trefs/heads/main@@@",
       "@@@STEP_LOG_END@stdout@@@"
     ]
diff --git a/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-tag.json b/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-tag.json
index 54653e7..4fc98a7 100644
--- a/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-tag.json
+++ b/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-revision-tag.json
@@ -1,5 +1,12 @@
 [
   {
+    "cmd": [],
+    "name": "e5",
+    "~followup_annotations": [
+      "@@@STEP_FAILURE@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -11,8 +18,9 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "read manifest",
+    "name": "e5.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -51,9 +59,10 @@
       "https://bar.googlesource.com/e5",
       "main"
     ],
-    "name": "git ls-remote",
+    "name": "e5.git ls-remote",
     "timeout": 600.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@stdout@h3ll0\trefs/heads/main@@@",
       "@@@STEP_LOG_END@stdout@@@"
     ]
diff --git a/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-upstream.json b/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-upstream.json
index c1c37a3..5cb8892 100644
--- a/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-upstream.json
+++ b/recipe_modules/repo_roll/tests/full.expected/no-trigger-with-upstream.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "a1"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -11,8 +15,9 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "read manifest",
+    "name": "a1.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -51,22 +56,26 @@
       "https://foo.googlesource.com/a",
       "main"
     ],
-    "name": "git ls-remote",
+    "name": "a1.git ls-remote",
     "timeout": 600.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@stdout@h3ll0\trefs/heads/main@@@",
       "@@@STEP_LOG_END@stdout@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -81,18 +90,18 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -108,9 +117,9 @@
       "[START_DIR]/cipd_tool/infra/tools/luci/gitiles/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -127,9 +136,9 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -153,9 +162,10 @@
       "1111111111111111111111111111111111111111..h3ll0"
     ],
     "infra_step": true,
-    "name": "log a1",
+    "name": "a1.log a1",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -247,23 +257,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "a1.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -275,18 +288,18 @@
       "/path/to/tmp/"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -302,9 +315,9 @@
       "[START_DIR]/cipd_tool/infra/tools/luci/gerrit/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -321,9 +334,9 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -349,10 +362,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "a1.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -376,10 +389,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "a1.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -403,10 +416,10 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "a1.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -430,8 +443,9 @@
       "[START_DIR]/checkout/default.xml"
     ],
     "infra_step": true,
-    "name": "write manifest",
+    "name": "a1.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/success.json b/recipe_modules/repo_roll/tests/full.expected/success.json
index 54e1656..786f38d 100644
--- a/recipe_modules/repo_roll/tests/full.expected/success.json
+++ b/recipe_modules/repo_roll/tests/full.expected/success.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "a1"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -23,8 +27,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "a1.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -57,13 +62,16 @@
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -90,18 +98,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -129,9 +137,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -160,9 +168,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -198,9 +206,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "log a1",
+    "name": "a1.log a1",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -292,23 +301,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "a1.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -332,18 +344,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -371,9 +383,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -402,9 +414,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -442,10 +454,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "a1.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -481,10 +493,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "a1.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -520,10 +532,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "a1.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -559,8 +571,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "write manifest",
+    "name": "a1.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/upstream-not-set-revision-not-branch.json b/recipe_modules/repo_roll/tests/full.expected/upstream-not-set-revision-not-branch.json
index ef64d46..5c6101c 100644
--- a/recipe_modules/repo_roll/tests/full.expected/upstream-not-set-revision-not-branch.json
+++ b/recipe_modules/repo_roll/tests/full.expected/upstream-not-set-revision-not-branch.json
@@ -1,5 +1,12 @@
 [
   {
+    "cmd": [],
+    "name": "d4",
+    "~followup_annotations": [
+      "@@@STEP_FAILURE@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -23,8 +30,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "d4.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.expected/upstream-not-set.json b/recipe_modules/repo_roll/tests/full.expected/upstream-not-set.json
index 2fec22c..445021a 100644
--- a/recipe_modules/repo_roll/tests/full.expected/upstream-not-set.json
+++ b/recipe_modules/repo_roll/tests/full.expected/upstream-not-set.json
@@ -1,5 +1,9 @@
 [
   {
+    "cmd": [],
+    "name": "c3"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -23,8 +27,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "c3.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -57,13 +62,16 @@
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -90,18 +98,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -129,9 +137,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -160,9 +168,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "c3.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -198,9 +206,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "log c3",
+    "name": "c3.log c3",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -292,23 +301,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "c3.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -332,18 +344,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -371,9 +383,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -402,9 +414,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "c3.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -442,10 +454,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "c3.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -481,10 +493,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "c3.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -520,10 +532,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "c3.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -559,8 +571,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "write manifest",
+    "name": "c3.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipe_modules/repo_roll/tests/full.py b/recipe_modules/repo_roll/tests/full.py
index 2b59f79..5252f39 100644
--- a/recipe_modules/repo_roll/tests/full.py
+++ b/recipe_modules/repo_roll/tests/full.py
@@ -84,82 +84,82 @@
         'success',
         properties(path='a1'),
         api.buildbucket.ci_build(git_repo='https://foo.googlesource.com/a'),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log a1', 'A'),
+        api.repo_roll.read_step_data('a1'),
+        api.gitiles.log('a1.log a1', 'A'),
     )
 
     yield api.test(
         'name-not-found',
         properties(path='missing'),
         api.buildbucket.ci_build(git_repo='https://bar.googlesource.com/b'),
-        api.repo_roll.read_step_data(),
+        api.repo_roll.read_step_data('missing'),
         status='FAILURE',
     )
 
     yield api.test(
         'equivalent',
         properties(path='b2'),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log b2', 'A'),
+        api.repo_roll.read_step_data('b2'),
+        api.gitiles.log('b2.log b2', 'A'),
     )
 
     yield api.test(
         'upstream-not-set',
         properties(path='c3'),
         api.buildbucket.ci_build(git_repo='https://bar.googlesource.com/c'),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log c3', 'A'),
+        api.repo_roll.read_step_data('c3'),
+        api.gitiles.log('c3.log c3', 'A'),
     )
 
     yield api.test(
         'upstream-not-set-revision-not-branch',
         properties(path='d4'),
         api.buildbucket.ci_build(git_repo='https://bar.googlesource.com/c'),
-        api.repo_roll.read_step_data(),
+        api.repo_roll.read_step_data('d4'),
         status='FAILURE',
     )
 
     yield api.test(
         'no-trigger-with-upstream',
         properties(path='a1'),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log a1', 'A'),
+        api.repo_roll.read_step_data('a1'),
+        api.gitiles.log('a1.log a1', 'A'),
     )
 
     yield api.test(
         'no-trigger-with-revision-branch',
         properties(path='c3'),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log c3', 'A'),
+        api.repo_roll.read_step_data('c3'),
+        api.gitiles.log('c3.log c3', 'A'),
     )
 
     yield api.test(
         'no-trigger-with-revision-hash',
         properties(path='d4'),
-        api.repo_roll.read_step_data(),
+        api.repo_roll.read_step_data('d4'),
         status='FAILURE',
     )
 
     yield api.test(
         'no-trigger-with-revision-tag',
         properties(path='e5'),
-        api.repo_roll.read_step_data(),
+        api.repo_roll.read_step_data('e5'),
         status='FAILURE',
     )
 
     yield api.test(
         'backwards',
         properties(path='a1'),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log a1', 'A', n=0),
+        api.repo_roll.read_step_data('a1'),
+        api.gitiles.log('a1.log a1', 'A', n=0),
     )
 
     yield api.test(
         'host-dot-dot',
         properties(path='f6'),
         api.buildbucket.ci_build(git_repo='https://host.googlesource.com/f'),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log f6', 'A'),
+        api.repo_roll.read_step_data('f6'),
+        api.gitiles.log('f6.log f6', 'A'),
     )
 
     yield api.test(
@@ -168,8 +168,8 @@
         api.buildbucket.ci_build(
             git_repo='https://host.googlesource.com/prefix/g'
         ),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log g7', 'A'),
+        api.repo_roll.read_step_data('g7'),
+        api.gitiles.log('g7.log g7', 'A'),
     )
 
     yield api.test(
@@ -178,6 +178,6 @@
         api.buildbucket.ci_build(
             git_repo='https://host.googlesource.com/prefix/h'
         ),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log h8', 'A'),
+        api.repo_roll.read_step_data('h8'),
+        api.gitiles.log('h8.log h8', 'A'),
     )
diff --git a/recipes/cipd_roller.py b/recipes/cipd_roller.py
index 3d7a4ff..0708d96 100644
--- a/recipes/cipd_roller.py
+++ b/recipes/cipd_roller.py
@@ -35,7 +35,6 @@
     'pigweed/checkout',
     'pigweed/cipd_roll',
     'recipe_engine/properties',
-    'recipe_engine/step',
 ]
 
 PROPERTIES = InputProperties
diff --git a/recipes/repo_roller.expected/backwards.json b/recipes/repo_roller.expected/backwards.json
index 73d5819..6ffa2f4 100644
--- a/recipes/repo_roller.expected/backwards.json
+++ b/recipes/repo_roller.expected/backwards.json
@@ -950,6 +950,10 @@
     ]
   },
   {
+    "cmd": [],
+    "name": "a1"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -973,8 +977,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "a1.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -1007,13 +1012,16 @@
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1040,18 +1048,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1079,9 +1087,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -1110,9 +1118,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -1148,17 +1156,19 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "log a1",
+    "name": "a1.log a1",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[]@@@",
       "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "detected backwards roll",
+    "name": "a1.detected backwards roll",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_TEXT@Detected backwards roll: expected 1111111 to precede 2d72510 in git history@@@"
     ]
   },
diff --git a/recipes/repo_roller.expected/equivalent.json b/recipes/repo_roller.expected/equivalent.json
index 9463fb5..ddac89f 100644
--- a/recipes/repo_roller.expected/equivalent.json
+++ b/recipes/repo_roller.expected/equivalent.json
@@ -950,6 +950,10 @@
     ]
   },
   {
+    "cmd": [],
+    "name": "b2"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -973,8 +977,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "b2.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -1007,13 +1012,16 @@
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1040,18 +1048,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1079,9 +1087,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -1110,9 +1118,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "b2.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -1148,9 +1156,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "log b2",
+    "name": "b2.log b2",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -1242,23 +1251,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "b2.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -1282,18 +1294,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -1321,9 +1333,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -1352,9 +1364,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "b2.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -1392,10 +1404,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "b2.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -1431,10 +1443,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "b2.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -1470,10 +1482,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "b2.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -1509,8 +1521,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "write manifest",
+    "name": "b2.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipes/repo_roller.expected/success.json b/recipes/repo_roller.expected/success.json
index 912c86f..9ab1905 100644
--- a/recipes/repo_roller.expected/success.json
+++ b/recipes/repo_roller.expected/success.json
@@ -950,6 +950,10 @@
     ]
   },
   {
+    "cmd": [],
+    "name": "a1"
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -973,8 +977,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "read manifest",
+    "name": "a1.read manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
@@ -1007,13 +1012,16 @@
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}"
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1040,18 +1048,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gitiles/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -1079,9 +1087,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -1110,9 +1118,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
+    "name": "a1.ensure infra/tools/luci/gitiles/${platform}.install infra/tools/luci/gitiles.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_NEST_LEVEL@3@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -1148,9 +1156,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "log a1",
+    "name": "a1.log a1",
     "timeout": 300.0,
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"author\": {@@@",
@@ -1242,23 +1251,26 @@
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers"
-  },
-  {
-    "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
+    "name": "a1.get gerrit change numbers",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
+    "cmd": [],
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
     "cmd": [
       "vpython3",
       "-u",
@@ -1282,18 +1294,18 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
       "@@@STEP_LOG_END@cipd.ensure@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
+      "@@@STEP_NEST_LEVEL@3@@@"
     ]
   },
   {
@@ -1321,9 +1333,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
+      "@@@STEP_NEST_LEVEL@4@@@"
     ]
   },
   {
@@ -1352,9 +1364,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "a1.get gerrit change numbers.ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
@@ -1392,10 +1404,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3e30158",
+    "name": "a1.get gerrit change numbers.change details for 3e30158",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -1431,10 +1443,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 3380b83",
+    "name": "a1.get gerrit change numbers.change details for 3380b83",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -1470,10 +1482,10 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "get gerrit change numbers.change details for 363caa9",
+    "name": "a1.get gerrit change numbers.change details for 363caa9",
     "timeout": 600,
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"_number\": 12345@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -1509,8 +1521,9 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "write manifest",
+    "name": "a1.write manifest",
     "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@default.xml@<?xml version=\"1.0\" encoding=\"UTF-8\"?>@@@",
       "@@@STEP_LOG_LINE@default.xml@<manifest>@@@",
       "@@@STEP_LOG_LINE@default.xml@  <!-- single-line comment -->@@@",
diff --git a/recipes/repo_roller.py b/recipes/repo_roller.py
index 51d8778..db741ad 100644
--- a/recipes/repo_roller.py
+++ b/recipes/repo_roller.py
@@ -131,8 +131,8 @@
             always_cc=True,
         ),
         api.checkout.ci_test_data(git_repo='https://foo.googlesource.com/a'),
-        api.gitiles.log('log a1', 'A'),
-        api.repo_roll.read_step_data(),
+        api.gitiles.log('a1.log a1', 'A'),
+        api.repo_roll.read_step_data('a1'),
         api.auto_roller.dry_run_success(),
     )
 
@@ -150,8 +150,8 @@
             cc_reviewers_on_rolls=True,
         ),
         api.checkout.ci_test_data(git_repo='https://equiv.googlesource.com/b'),
-        api.gitiles.log('log b2', 'A'),
-        api.repo_roll.read_step_data(),
+        api.gitiles.log('b2.log b2', 'A'),
+        api.repo_roll.read_step_data('b2'),
         api.auto_roller.dry_run_success(),
     )
 
@@ -159,6 +159,6 @@
         'backwards',
         properties(api, Project(path_to_update='a1')),
         api.checkout.ci_test_data(git_repo='https://foo.googlesource.com/a'),
-        api.repo_roll.read_step_data(),
-        api.gitiles.log('log a1', 'A', n=0),
+        api.repo_roll.read_step_data('a1'),
+        api.gitiles.log('a1.log a1', 'A', n=0),
     )