checkout: Add logging to submodule matching

Change-Id: I540bdc7ad7c17a652ad94107a4d0f264670fdee9
Reviewed-on: https://pigweed-review.googlesource.com/c/infra/recipes/+/198650
Reviewed-by: Ted Pudlik <tpudlik@google.com>
Presubmit-Verified: CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
Pigweed-Auto-Submit: Rob Mohr <mohrr@google.com>
diff --git a/recipe_modules/checkout/api.py b/recipe_modules/checkout/api.py
index 3c7f917..d6119f7 100644
--- a/recipe_modules/checkout/api.py
+++ b/recipe_modules/checkout/api.py
@@ -1138,47 +1138,70 @@
                 #       the branch of the triggering change. In these cases we
                 #       error out.
                 for change in ctx.changes:
-                    matching_submodules = []
-                    for submodule in submodules:
-                        if submodule.initialized:
-                            if ctx.remotes_equivalent(
-                                submodule.remote, change.remote
-                            ):
-                                matching_submodules.append(submodule)
+                    with self.m.step.nest(f'matching {change.name}') as pres:
+                        pres.links['gerrit'] = change.gerrit_url
+                        pres.links['gitiles'] = change.gitiles_url
 
-                    if not matching_submodules:
-                        continue
+                        matching_submodules = []
+                        for submodule in submodules:
+                            if submodule.initialized:
+                                if ctx.remotes_equivalent(
+                                    submodule.remote, change.remote
+                                ):
+                                    self.m.step.empty(
+                                        f'match: {submodule.path} '
+                                        f'({submodule.remote})'
+                                    )
+                                    matching_submodules.append(submodule)
+                                else:
+                                    self.m.step.empty(
+                                        f'no match: {submodule.path} '
+                                        f'({submodule.remote})'
+                                    )
 
-                    if len(matching_submodules) > 1:
-                        submodule_info = ', '.join(
-                            f'{self.m.path.relpath(sub.path, ctx.root)} '
-                            f'(branch {sub.branch})'
-                            for sub in matching_submodules
-                        )
+                        if not matching_submodules:
+                            pres.step_summary_text = 'no matching submodules'
+                            continue
 
-                        matching_with_branch = []
-                        for submodule in matching_submodules:
-                            if submodule.branch == change.branch:
-                                matching_with_branch.append(submodule)
-
-                        if len(matching_with_branch) == 1:
-                            matching_submodules = matching_with_branch
-
-                        elif len(matching_with_branch) > 1:
-                            raise self.m.step.StepFailure(
-                                f'change {change.name} (branch '
-                                f'{change.branch}) matches multiple submodules '
-                                f'({submodule_info}), but too many branches '
-                                'match'
+                        if len(matching_submodules) > 1:
+                            submodule_info = ', '.join(
+                                f'{self.m.path.relpath(sub.path, ctx.root)} '
+                                f'(branch {sub.branch})'
+                                for sub in matching_submodules
                             )
 
-                        else:
-                            raise self.m.step.StepFailure(
-                                f'change {change.name} '
-                                f'(branch {change.branch}) matches multiple '
-                                f'submodules ({submodule_info}) but no '
-                                'branches match'
-                            )
+                            matching_with_branch = []
+                            for submodule in matching_submodules:
+                                if submodule.branch == change.branch:
+                                    matching_with_branch.append(submodule)
+
+                            if len(matching_with_branch) == 1:
+                                pres.step_summary_text = (
+                                    'one matching submodule'
+                                )
+                                matching_submodules = matching_with_branch
+
+                            elif len(matching_with_branch) > 1:
+                                pres.step_summary_text = (
+                                    'too many submodules match the branch'
+                                )
+                                raise self.m.step.StepFailure(
+                                    f'change {change.name} (branch '
+                                    f'{change.branch}) matches multiple '
+                                    f'submodules ({submodule_info}), but too '
+                                    'many branches match'
+                                )
+
+                            else:
+                                pres.step_summary_text = (
+                                    'zero submodules match the branch'
+                                )
+                                raise self.m.step.StepFailure(
+                                    f'change {change.name} '
+                                    f'(branch {change.branch}) matches '
+                                    f'multiple submodules ({submodule_info}) '
+                                    'but no branches match'
+                                )
 
                     if len(matching_submodules) == 1:
                         submodule = matching_submodules[0]
diff --git a/recipe_modules/checkout/tests/git.expected/ci.json b/recipe_modules/checkout/tests/git.expected/ci.json
index 39c6c08..b8ada79 100644
--- a/recipe_modules/checkout/tests/git.expected/ci.json
+++ b/recipe_modules/checkout/tests/git.expected/ci.json
@@ -1251,6 +1251,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/git.expected/not_in_gerrit.json b/recipe_modules/checkout/tests/git.expected/not_in_gerrit.json
index 5088ea4..10d57a0 100644
--- a/recipe_modules/checkout/tests/git.expected/not_in_gerrit.json
+++ b/recipe_modules/checkout/tests/git.expected/not_in_gerrit.json
@@ -800,6 +800,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:0",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/git.expected/other.json b/recipe_modules/checkout/tests/git.expected/other.json
index 5f5b019..d30f5d1 100644
--- a/recipe_modules/checkout/tests/git.expected/other.json
+++ b/recipe_modules/checkout/tests/git.expected/other.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/git.expected/trigger.json b/recipe_modules/checkout/tests/git.expected/trigger.json
index 64e0da1..2e63154 100644
--- a/recipe_modules/checkout/tests/git.expected/trigger.json
+++ b/recipe_modules/checkout/tests/git.expected/trigger.json
@@ -1303,6 +1303,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/git.expected/try.json b/recipe_modules/checkout/tests/git.expected/try.json
index c3f7a52..c1677d2 100644
--- a/recipe_modules/checkout/tests/git.expected/try.json
+++ b/recipe_modules/checkout/tests/git.expected/try.json
@@ -1383,6 +1383,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/insteadof.json b/recipe_modules/checkout/tests/submodule.expected/insteadof.json
index 3ab63df..90f20ec 100644
--- a/recipe_modules/checkout/tests/submodule.expected/insteadof.json
+++ b/recipe_modules/checkout/tests/submodule.expected/insteadof.json
@@ -1389,6 +1389,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-ci.json b/recipe_modules/checkout/tests/submodule.expected/submodule-ci.json
index 02fa771..b0268d7 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-ci.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-ci.json
@@ -947,6 +947,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/baz/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-not-initialized.json b/recipe_modules/checkout/tests/submodule.expected/submodule-not-initialized.json
index 59d112f..58a671f 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-not-initialized.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-not-initialized.json
@@ -947,6 +947,37 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/b/c/d/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.no changes were applied",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-match.json b/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-match.json
index 36d4f3d..550ee84 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-match.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-match.json
@@ -1017,6 +1017,30 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@one matching submodule@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/foo/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.match: [START_DIR]/co/foo1 (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.match: [START_DIR]/co/foo2 (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-nomatch.json b/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-nomatch.json
index 5187320..f0f02be 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-nomatch.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-nomatch.json
@@ -1016,6 +1016,31 @@
     ]
   },
   {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@zero submodules match the branch@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/foo/+/refs/changes/56/123456/7@@@",
+      "@@@STEP_FAILURE@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.match: [START_DIR]/co/foo1 (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.match: [START_DIR]/co/foo2 (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
     "failure": {
       "failure": {},
       "humanReason": "change x:123456 (branch main) matches multiple submodules (foo1 (branch release), foo2 (branch dev)) but no branches match"
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-twomatch.json b/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-twomatch.json
index dec6be1..efa2e14 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-twomatch.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-repeated-twomatch.json
@@ -1016,6 +1016,31 @@
     ]
   },
   {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@too many submodules match the branch@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/foo/+/refs/changes/56/123456/7@@@",
+      "@@@STEP_FAILURE@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.match: [START_DIR]/co/foo1 (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.match: [START_DIR]/co/foo2 (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
     "failure": {
       "failure": {},
       "humanReason": "change x:123456 (branch main) matches multiple submodules (foo1 (branch main), foo2 (branch main)), but too many branches match"
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try-equivalent.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try-equivalent.json
index 13059bc..7440e80 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try-equivalent.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try-equivalent.json
@@ -1049,6 +1049,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching z:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://z-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://z.googlesource.com/foo/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching z:123456.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching z:123456.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching z:123456.match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try-excluded.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try-excluded.json
index 5aa9afe..62c7841 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try-excluded.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try-excluded.json
@@ -1264,6 +1264,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try-included.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try-included.json
index e4c31b1..0dac9c9 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try-included.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try-included.json
@@ -1231,6 +1231,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-cqdeps.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-cqdeps.json
index dbb6bfb..739fc12 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-cqdeps.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-cqdeps.json
@@ -1821,6 +1821,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/foo/+/refs/changes/34/1234/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -2187,6 +2217,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:2345",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/2345@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/bar/+/refs/changes/45/2345/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s (2)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -2553,6 +2613,37 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/3456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/3456/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-one-missing-one-forbidden-cqdeps.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-one-missing-one-forbidden-cqdeps.json
index dd718db..dc32f47 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-one-missing-one-forbidden-cqdeps.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-one-missing-one-forbidden-cqdeps.json
@@ -1922,6 +1922,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/foo/+/refs/changes/34/1234/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -2288,6 +2318,99 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:2345",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/2345@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/not-a-submodule/+/refs/changes/45/2345/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/3456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/3456/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching forbidden:9999",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://forbidden-review.googlesource.com/c/9999@@@",
+      "@@@STEP_LINK@gitiles@None/+/None@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching forbidden:9999.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching forbidden:9999.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching forbidden:9999.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.some changes were not applied",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-one-missing.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-one-missing.json
index acb5750..926ad85 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-one-missing.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple-one-missing.json
@@ -1525,6 +1525,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/foo/+/refs/changes/34/1234/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -1891,6 +1921,68 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:2345",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/2345@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/not-a-submodule/+/refs/changes/45/2345/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/3456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/3456/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.some changes were not applied",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple.json
index 5bae63d..b51bf5e 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try-multiple.json
@@ -1524,6 +1524,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/foo/+/refs/changes/34/1234/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:1234.match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -1890,6 +1920,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:2345",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/2345@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/bar/+/refs/changes/45/2345/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:2345.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s (2)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
@@ -2256,6 +2316,37 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/3456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/3456/1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching pigweed:3456.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try-not-found.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try-not-found.json
index fe7e3d2..db3a26c 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try-not-found.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try-not-found.json
@@ -1049,6 +1049,37 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/xyz/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.no match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.no changes were applied",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipe_modules/checkout/tests/submodule.expected/submodule-try.json b/recipe_modules/checkout/tests/submodule.expected/submodule-try.json
index 5a5e452..1471553 100644
--- a/recipe_modules/checkout/tests/submodule.expected/submodule-try.json
+++ b/recipe_modules/checkout/tests/submodule.expected/submodule-try.json
@@ -1049,6 +1049,36 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching x:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@gerrit@https://x-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://x.googlesource.com/baz/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.no match: [START_DIR]/co/bar (https://x.googlesource.com/bar)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.match: [START_DIR]/co/baz (https://x.googlesource.com/baz)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "checkout pigweed.matching x:123456.no match: [START_DIR]/co/foo (https://x.googlesource.com/foo)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.timeout 10s",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
diff --git a/recipes/bazel.expected/simple.json b/recipes/bazel.expected/simple.json
index dcea58a..7ebdc9f 100644
--- a/recipes/bazel.expected/simple.json
+++ b/recipes/bazel.expected/simple.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/build.expected/basic.json b/recipes/build.expected/basic.json
index 53d3c2c..102c78b 100644
--- a/recipes/build.expected/basic.json
+++ b/recipes/build.expected/basic.json
@@ -1251,6 +1251,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/build.expected/skip_archive.json b/recipes/build.expected/skip_archive.json
index 32670b8..13def10 100644
--- a/recipes/build.expected/skip_archive.json
+++ b/recipes/build.expected/skip_archive.json
@@ -1251,6 +1251,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/docs_builder.expected/docs-dry_run-build.json b/recipes/docs_builder.expected/docs-dry_run-build.json
index a386c58..bf6303e 100644
--- a/recipes/docs_builder.expected/docs-dry_run-build.json
+++ b/recipes/docs_builder.expected/docs-dry_run-build.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/docs_builder.expected/docs-postsubmit.json b/recipes/docs_builder.expected/docs-postsubmit.json
index 7c0c220..8edb8bd 100644
--- a/recipes/docs_builder.expected/docs-postsubmit.json
+++ b/recipes/docs_builder.expected/docs-postsubmit.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/docs_builder.expected/docs-presubmit.json b/recipes/docs_builder.expected/docs-presubmit.json
index f2c2fc6..06f52a5 100644
--- a/recipes/docs_builder.expected/docs-presubmit.json
+++ b/recipes/docs_builder.expected/docs-presubmit.json
@@ -1406,6 +1406,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/envtest.expected/environment_variables.json b/recipes/envtest.expected/environment_variables.json
index 08a4f37..b65344c 100644
--- a/recipes/envtest.expected/environment_variables.json
+++ b/recipes/envtest.expected/environment_variables.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/envtest.expected/fail.json b/recipes/envtest.expected/fail.json
index 2bd7cc6..4b70c8a 100644
--- a/recipes/envtest.expected/fail.json
+++ b/recipes/envtest.expected/fail.json
@@ -1251,6 +1251,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/envtest.expected/pigweed.json b/recipes/envtest.expected/pigweed.json
index 97b9f25..e8b4177 100644
--- a/recipes/envtest.expected/pigweed.json
+++ b/recipes/envtest.expected/pigweed.json
@@ -1251,6 +1251,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/envtest.expected/windows.json b/recipes/envtest.expected/windows.json
index 3d07cab..7f257ff 100644
--- a/recipes/envtest.expected/windows.json
+++ b/recipes/envtest.expected/windows.json
@@ -1251,6 +1251,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/luci_config.expected/starlark.json b/recipes/luci_config.expected/starlark.json
index 85f7008..8ee2a5b 100644
--- a/recipes/luci_config.expected/starlark.json
+++ b/recipes/luci_config.expected/starlark.json
@@ -1406,6 +1406,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/pw_presubmit.expected/one_step_no_exit_not_in_cv.json b/recipes/pw_presubmit.expected/one_step_no_exit_not_in_cv.json
index 8356df8..bd1bf7e 100644
--- a/recipes/pw_presubmit.expected/one_step_no_exit_not_in_cv.json
+++ b/recipes/pw_presubmit.expected/one_step_no_exit_not_in_cv.json
@@ -1406,6 +1406,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/pw_presubmit.expected/one_step_no_exit_not_tryjob.json b/recipes/pw_presubmit.expected/one_step_no_exit_not_tryjob.json
index 8460e77..2f0ce5c 100644
--- a/recipes/pw_presubmit.expected/one_step_no_exit_not_tryjob.json
+++ b/recipes/pw_presubmit.expected/one_step_no_exit_not_tryjob.json
@@ -1251,6 +1251,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/pw_presubmit.expected/one_step_no_exit_passing_in_ci.json b/recipes/pw_presubmit.expected/one_step_no_exit_passing_in_ci.json
index 8356df8..bd1bf7e 100644
--- a/recipes/pw_presubmit.expected/one_step_no_exit_passing_in_ci.json
+++ b/recipes/pw_presubmit.expected/one_step_no_exit_passing_in_ci.json
@@ -1406,6 +1406,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/pw_presubmit.expected/sign.json b/recipes/pw_presubmit.expected/sign.json
index 000bd1f..98da74f 100644
--- a/recipes/pw_presubmit.expected/sign.json
+++ b/recipes/pw_presubmit.expected/sign.json
@@ -1251,6 +1251,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/pw_presubmit.expected/two_steps.json b/recipes/pw_presubmit.expected/two_steps.json
index 244e5b8..4752877 100644
--- a/recipes/pw_presubmit.expected/two_steps.json
+++ b/recipes/pw_presubmit.expected/two_steps.json
@@ -1406,6 +1406,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/recipes.expected/cq_try.json b/recipes/recipes.expected/cq_try.json
index b1424b7..9c2990a 100644
--- a/recipes/recipes.expected/cq_try.json
+++ b/recipes/recipes.expected/cq_try.json
@@ -1406,6 +1406,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/recipes.expected/unittest-only.json b/recipes/recipes.expected/unittest-only.json
index b14b3a5..e399db4 100644
--- a/recipes/recipes.expected/unittest-only.json
+++ b/recipes/recipes.expected/unittest-only.json
@@ -1414,6 +1414,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/run_script.expected/run_script.json b/recipes/run_script.expected/run_script.json
index 55fd461..b6f99f6 100644
--- a/recipes/run_script.expected/run_script.json
+++ b/recipes/run_script.expected/run_script.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/run_script.expected/variable_substitution.json b/recipes/run_script.expected/variable_substitution.json
index f51ea93..35c4511 100644
--- a/recipes/run_script.expected/variable_substitution.json
+++ b/recipes/run_script.expected/variable_substitution.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/target_to_cipd.expected/pw-presubmit.json b/recipes/target_to_cipd.expected/pw-presubmit.json
index d3cde5c..885364e 100644
--- a/recipes/target_to_cipd.expected/pw-presubmit.json
+++ b/recipes/target_to_cipd.expected/pw-presubmit.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/tokendb_check.expected/addition.json b/recipes/tokendb_check.expected/addition.json
index a51442c..70aed46 100644
--- a/recipes/tokendb_check.expected/addition.json
+++ b/recipes/tokendb_check.expected/addition.json
@@ -1531,6 +1531,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/tokendb_check.expected/no-change.json b/recipes/tokendb_check.expected/no-change.json
index bcffe22..7915443 100644
--- a/recipes/tokendb_check.expected/no-change.json
+++ b/recipes/tokendb_check.expected/no-change.json
@@ -1531,6 +1531,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/tokendb_check.expected/removal.json b/recipes/tokendb_check.expected/removal.json
index 6264a57..77b1c07 100644
--- a/recipes/tokendb_check.expected/removal.json
+++ b/recipes/tokendb_check.expected/removal.json
@@ -1531,6 +1531,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/tokendb_check.expected/update.json b/recipes/tokendb_check.expected/update.json
index 0b1a9ee..c1d78cf 100644
--- a/recipes/tokendb_check.expected/update.json
+++ b/recipes/tokendb_check.expected/update.json
@@ -1531,6 +1531,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/tokendb_updater.expected/dry-run.json b/recipes/tokendb_updater.expected/dry-run.json
index a174201..0a0c583 100644
--- a/recipes/tokendb_updater.expected/dry-run.json
+++ b/recipes/tokendb_updater.expected/dry-run.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/tokendb_updater.expected/simple.json b/recipes/tokendb_updater.expected/simple.json
index f226286..e60d807 100644
--- a/recipes/tokendb_updater.expected/simple.json
+++ b/recipes/tokendb_updater.expected/simple.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/txt_roller.expected/backwards.json b/recipes/txt_roller.expected/backwards.json
index 85267c7..d1ce48e 100644
--- a/recipes/txt_roller.expected/backwards.json
+++ b/recipes/txt_roller.expected/backwards.json
@@ -1284,6 +1284,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout foo.matching foo:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://foo-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://foo.googlesource.com/foo/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout foo.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/txt_roller.expected/no-trigger.json b/recipes/txt_roller.expected/no-trigger.json
index 1f0c555..1dc88e7 100644
--- a/recipes/txt_roller.expected/no-trigger.json
+++ b/recipes/txt_roller.expected/no-trigger.json
@@ -1284,6 +1284,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout foo.matching foo:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://foo-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://foo.googlesource.com/foo/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout foo.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/txt_roller.expected/success.json b/recipes/txt_roller.expected/success.json
index 9c03cb8..f6e7e7f 100644
--- a/recipes/txt_roller.expected/success.json
+++ b/recipes/txt_roller.expected/success.json
@@ -2027,6 +2027,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout foo.matching foo:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://foo-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://foo.googlesource.com/foo/+/2d72510e447ab60a9728aeea2362d8be2cbd7789@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout foo.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/update_python_versions.expected/simple.json b/recipes/update_python_versions.expected/simple.json
index 38a9cb9..ab65497 100644
--- a/recipes/update_python_versions.expected/simple.json
+++ b/recipes/update_python_versions.expected/simple.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/xrefs.expected/dry_run.json b/recipes/xrefs.expected/dry_run.json
index b34e3dd..03cf551 100644
--- a/recipes/xrefs.expected/dry_run.json
+++ b/recipes/xrefs.expected/dry_run.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/xrefs.expected/kythe.json b/recipes/xrefs.expected/kythe.json
index 046bebe..78993e9 100644
--- a/recipes/xrefs.expected/kythe.json
+++ b/recipes/xrefs.expected/kythe.json
@@ -806,6 +806,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:1234",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/1234@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/h3ll0@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
diff --git a/recipes/xrefs.expected/tryjob.json b/recipes/xrefs.expected/tryjob.json
index 726687f..c0deb00 100644
--- a/recipes/xrefs.expected/tryjob.json
+++ b/recipes/xrefs.expected/tryjob.json
@@ -1406,6 +1406,16 @@
   },
   {
     "cmd": [],
+    "name": "checkout pigweed.matching pigweed:123456",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no matching submodules@@@",
+      "@@@STEP_LINK@gerrit@https://pigweed-review.googlesource.com/c/123456@@@",
+      "@@@STEP_LINK@gitiles@https://pigweed.googlesource.com/pigweed/pigweed/+/refs/changes/56/123456/7@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "checkout pigweed.status",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",