Be robust to a repo having non-Gerrit commits

Previously if a commit was made without a code review,
gerrit.change_details() would return None and the recipe would crash.

Bug: 44606
Change-Id: If0e60c16844db7445e4bbbe346adda8a2b2be4ba
diff --git a/recipes/recipes.expected/no_latest_cl.json b/recipes/recipes.expected/no_latest_cl.json
new file mode 100644
index 0000000..2b98e98
--- /dev/null
+++ b/recipes/recipes.expected/no_latest_cl.json
@@ -0,0 +1,1026 @@
+[
+  {
+    "cmd": [],
+    "name": "checkout"
+  },
+  {
+    "cmd": [],
+    "name": "checkout.ensure jiri",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[START_DIR]/cipd/jiri",
+      "-ensure-file",
+      "fuchsia/tools/jiri/${platform} git_revision:4bbab8725bd3c64b56e70af3d973d526cd894b49",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "checkout.ensure jiri.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:4bb\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"fuchsia/tools/jiri/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/jiri/jiri",
+      "init",
+      "-vv",
+      "-time",
+      "-j=50",
+      "-analytics-opt=false",
+      "-rewrite-sso-to-https=true",
+      "-cache",
+      "[CACHE]/git",
+      "-shared",
+      "[START_DIR]"
+    ],
+    "infra_step": true,
+    "name": "checkout.jiri init",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/jiri/jiri",
+      "import",
+      "-vv",
+      "-time",
+      "-j=50",
+      "-name",
+      "garnet",
+      "-revision",
+      "HEAD",
+      "manifest/garnet",
+      "https://fuchsia.googlesource.com/garnet"
+    ],
+    "infra_step": true,
+    "name": "checkout.jiri import",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/jiri/jiri",
+      "override",
+      "-vv",
+      "-time",
+      "-j=50",
+      "-revision",
+      "2d72510e447ab60a9728aeea2362d8be2cbd7789",
+      "infra/recipes",
+      "https://fuchsia.googlesource.com/infra/recipes"
+    ],
+    "infra_step": true,
+    "name": "checkout.jiri override",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/jiri/jiri",
+      "update",
+      "-vv",
+      "-time",
+      "-j=50",
+      "-autoupdate=false",
+      "-attempts=3",
+      "-run-hooks=false"
+    ],
+    "infra_step": true,
+    "name": "checkout.jiri update",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/jiri/jiri",
+      "run-hooks",
+      "-vv",
+      "-time",
+      "-j=50",
+      "-attempts=3"
+    ],
+    "infra_step": true,
+    "name": "checkout.jiri run-hooks",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/jiri/jiri",
+      "source-manifest",
+      "-vv",
+      "-time",
+      "-j=50",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "checkout.jiri source-manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@{@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@  \"directories\": {@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@    \"manifest\": {@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@      \"git_checkout\": {@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@        \"repo_url\": \"https://fuchsia.googlesource.com/manifest\", @@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@        \"revision\": \"4c2b0da3c06341db5cebe4d02c78c93c3b2bd78b\"@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@      }@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@    }@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@  }@@@",
+      "@@@STEP_LOG_LINE@json.output[source manifest]@}@@@",
+      "@@@STEP_LOG_END@json.output[source manifest]@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "[START_DIR]/infra/recipes/recipes.py",
+      "test",
+      "run"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "name": "test"
+  },
+  {
+    "cmd": [],
+    "name": "get commit-queue"
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::url]/resources/pycurl.py",
+      "--url",
+      "https://luci-config.appspot.com/_ah/api/config/v1/config_sets/projects/fuchsia/config/commit-queue.cfg",
+      "--status-json",
+      "/path/to/tmp/json",
+      "--outfile",
+      "/path/to/tmp/json"
+    ],
+    "name": "get commit-queue.get",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "get commit-queue.response",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@raw@OrderedDict([('content', 'CiAgICBzdWJtaXRfb3B0aW9uczogPAogICAgICBtYXhfYnVyc3Q6IDQKICAgICAgYnVyc3RfZGVsYXk6IDwKICAgICAgICBzZWNvbmRzOiA0ODAKICAgICAgPgogICAgPgoKICAgIGNvbmZpZ19ncm91cHM6IDwKICAgICAgZ2Vycml0OiA8CiAgICAgICAgdXJsOiAiaHR0cHM6Ly9mdWNoc2lhLXJldmlldy5nb29nbGVzb3VyY2UuY29tIgogICAgICAgIHByb2plY3RzOiA8CiAgICAgICAgICBuYW1lOiAiY29iYWx0IgogICAgICAgICAgcmVmX3JlZ2V4cDogInJlZnMvaGVhZHMvLisiCiAgICAgICAgPgogICAgICA+CgogICAgICB2ZXJpZmllcnM6IDwKICAgICAgICBnZXJyaXRfY3FfYWJpbGl0eTogPAogICAgICAgICAgY29tbWl0dGVyX2xpc3Q6ICJwcm9qZWN0LWZ1Y2hzaWEtY29tbWl0dGVycyIKICAgICAgICAgIGRyeV9ydW5fYWNjZXNzX2xpc3Q6ICJwcm9qZWN0LWZ1Y2hzaWEtdHJ5am9iLWFjY2VzcyIKICAgICAgICA+CiAgICAgICAgdHJ5am9iOiA8CiAgICAgICAgICBidWlsZGVyczogPAogICAgICAgICAgICBuYW1lOiAiZnVjaHNpYS90cnkvY29iYWx0LXg2NC1saW51eCIKICAgICAgICAgICAgbG9jYXRpb25fcmVnZXhwOiAiLioiCiAgICAgICAgICAgIGxvY2F0aW9uX3JlZ2V4cF9leGNsdWRlOiAiLisvWytdLy4qXC5tZCIKICAgICAgICAgID4KICAgICAgICA+CiAgICAgID4KICAgID4KCiAgICBjb25maWdfZ3JvdXBzOiA8CiAgICAgIGdlcnJpdDogPAogICAgICAgIHVybDogImh0dHBzOi8vZnVjaHNpYS1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbSIKICAgICAgICBwcm9qZWN0czogPAogICAgICAgICAgbmFtZTogImRvY3MiCiAgICAgICAgICByZWZfcmVnZXhwOiAicmVmcy9oZWFkcy8uKyIKICAgICAgICA+CiAgICAgID4KCiAgICAgIHZlcmlmaWVyczogPAogICAgICAgIGdlcnJpdF9jcV9hYmlsaXR5OiA8CiAgICAgICAgICBjb21taXR0ZXJfbGlzdDogInByb2plY3QtZnVjaHNpYS1jb21taXR0ZXJzIgogICAgICAgICAgZHJ5X3J1bl9hY2Nlc3NfbGlzdDogInByb2plY3QtZnVjaHNpYS10cnlqb2ItYWNjZXNzIgogICAgICAgID4KICAgICAgICB0cnlqb2I6IDwKICAgICAgICAgIGJ1aWxkZXJzOiA8CiAgICAgICAgICAgIG5hbWU6ICJmdWNoc2lhL3RyeS9kb2MtY2hlY2tlciIKICAgICAgICAgICAgZXhwZXJpbWVudF9wZXJjZW50YWdlOiAxMDAKICAgICAgICAgICAgbG9jYXRpb25fcmVnZXhwOiAiLioiCiAgICAgICAgICAgIGxvY2F0aW9uX3JlZ2V4cF9leGNsdWRlOiAiLisvWytdLy4qXC5tZCIKICAgICAgICAgID4KICAgICAgICA+CiAgICAgID4KICAgID4KCiAgICBjb25maWdfZ3JvdXBzOiA8CiAgICAgIGdlcnJpdDogPAogICAgICAgIHVybDogImh0dHBzOi8vZnVjaHNpYS1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbSIKICAgICAgICBwcm9qZWN0czogPAogICAgICAgICAgbmFtZTogImV4cGVyaWVuY2VzIgogICAgICAgICAgcmVmX3JlZ2V4cDogInJlZnMvaGVhZHMvLisiCiAgICAgICAgPgogICAgICA+CiAgICAgIHZlcmlmaWVyczogPAogICAgICAgIGdlcnJpdF9jcV9hYmlsaXR5OiA8CiAgICAgICAgICBjb21taXR0ZXJfbGlzdDogInByb2plY3QtZnVjaHNpYS1jb21taXR0ZXJzIgogICAgICAgICAgZHJ5X3J1bl9hY2Nlc3NfbGlzdDogInByb2plY3QtZnVjaHNpYS10cnlqb2ItYWNjZXNzIgogICAgICAgID4KICAgICAgICB0cmVlX3N0YXR1czogPAogICAgICAgICAgdXJsOiAiaHR0cHM6Ly9mdWNoc2lhLXN0ZW0tc3RhdHVzLmFwcHNwb3QuY29tIgogICAgICAgID4KCiAgICAgICAgdHJ5am9iOiA8CiAgICAgICAgICBidWlsZGVyczogPAogICAgICAgICAgICBuYW1lOiAiZnVjaHNpYS90cnkvZnVjaHNpYS1hcm02NC1kZWJ1ZyIKICAgICAgICAgICAgbG9jYXRpb25fcmVnZXhwOiAiLioiCiAgICAgICAgICAgIGxvY2F0aW9uX3JlZ2V4cF9leGNsdWRlOiAiLisvWytdLy4qXC5tZCIKICAgICAgICAgICAgbG9jYXRpb25fcmVnZXhwX2V4Y2x1ZGU6ICIuKy9bK10uKi9kb2NzLy4rIgogICAgICAgICAgPgogICAgICAgICAgYnVpbGRlcnM6IDwKICAgICAgICAgICAgbmFtZTogImZ1Y2hzaWEvdHJ5L2Z1Y2hzaWEteDY0LWRlYnVnIgogICAgICAgICAgICBsb2NhdGlvbl9yZWdleHA6ICIuKiIKICAgICAgICAgICAgbG9jYXRpb25fcmVnZXhwX2V4Y2x1ZGU6ICIuKy9bK10vLipcLm1kIgogICAgICAgICAgICBsb2NhdGlvbl9yZWdleHBfZXhjbHVkZTogIi4rL1srXS4qL2RvY3MvLisiCiAgICAgICAgICA+CiAgICAgICAgPgogICAgICA+CiAgICA+CiAgICA=')])@@@",
+      "@@@STEP_LOG_END@raw@@@",
+      "@@@STEP_LOG_LINE@decoded@@@@",
+      "@@@STEP_LOG_LINE@decoded@    submit_options: <@@@",
+      "@@@STEP_LOG_LINE@decoded@      max_burst: 4@@@",
+      "@@@STEP_LOG_LINE@decoded@      burst_delay: <@@@",
+      "@@@STEP_LOG_LINE@decoded@        seconds: 480@@@",
+      "@@@STEP_LOG_LINE@decoded@      >@@@",
+      "@@@STEP_LOG_LINE@decoded@    >@@@",
+      "@@@STEP_LOG_LINE@decoded@@@@",
+      "@@@STEP_LOG_LINE@decoded@    config_groups: <@@@",
+      "@@@STEP_LOG_LINE@decoded@      gerrit: <@@@",
+      "@@@STEP_LOG_LINE@decoded@        url: \"https://fuchsia-review.googlesource.com\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        projects: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          name: \"cobalt\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          ref_regexp: \"refs/heads/.+\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@      >@@@",
+      "@@@STEP_LOG_LINE@decoded@@@@",
+      "@@@STEP_LOG_LINE@decoded@      verifiers: <@@@",
+      "@@@STEP_LOG_LINE@decoded@        gerrit_cq_ability: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          committer_list: \"project-fuchsia-committers\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          dry_run_access_list: \"project-fuchsia-tryjob-access\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@        tryjob: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          builders: <@@@",
+      "@@@STEP_LOG_LINE@decoded@            name: \"fuchsia/try/cobalt-x64-linux\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp: \".*\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp_exclude: \".+/[+]/.*\\.md\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          >@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@      >@@@",
+      "@@@STEP_LOG_LINE@decoded@    >@@@",
+      "@@@STEP_LOG_LINE@decoded@@@@",
+      "@@@STEP_LOG_LINE@decoded@    config_groups: <@@@",
+      "@@@STEP_LOG_LINE@decoded@      gerrit: <@@@",
+      "@@@STEP_LOG_LINE@decoded@        url: \"https://fuchsia-review.googlesource.com\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        projects: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          name: \"docs\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          ref_regexp: \"refs/heads/.+\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@      >@@@",
+      "@@@STEP_LOG_LINE@decoded@@@@",
+      "@@@STEP_LOG_LINE@decoded@      verifiers: <@@@",
+      "@@@STEP_LOG_LINE@decoded@        gerrit_cq_ability: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          committer_list: \"project-fuchsia-committers\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          dry_run_access_list: \"project-fuchsia-tryjob-access\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@        tryjob: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          builders: <@@@",
+      "@@@STEP_LOG_LINE@decoded@            name: \"fuchsia/try/doc-checker\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            experiment_percentage: 100@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp: \".*\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp_exclude: \".+/[+]/.*\\.md\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          >@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@      >@@@",
+      "@@@STEP_LOG_LINE@decoded@    >@@@",
+      "@@@STEP_LOG_LINE@decoded@@@@",
+      "@@@STEP_LOG_LINE@decoded@    config_groups: <@@@",
+      "@@@STEP_LOG_LINE@decoded@      gerrit: <@@@",
+      "@@@STEP_LOG_LINE@decoded@        url: \"https://fuchsia-review.googlesource.com\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        projects: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          name: \"experiences\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          ref_regexp: \"refs/heads/.+\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@      >@@@",
+      "@@@STEP_LOG_LINE@decoded@      verifiers: <@@@",
+      "@@@STEP_LOG_LINE@decoded@        gerrit_cq_ability: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          committer_list: \"project-fuchsia-committers\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          dry_run_access_list: \"project-fuchsia-tryjob-access\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@        tree_status: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          url: \"https://fuchsia-stem-status.appspot.com\"@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@@@@",
+      "@@@STEP_LOG_LINE@decoded@        tryjob: <@@@",
+      "@@@STEP_LOG_LINE@decoded@          builders: <@@@",
+      "@@@STEP_LOG_LINE@decoded@            name: \"fuchsia/try/fuchsia-arm64-debug\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp: \".*\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp_exclude: \".+/[+]/.*\\.md\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp_exclude: \".+/[+].*/docs/.+\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          >@@@",
+      "@@@STEP_LOG_LINE@decoded@          builders: <@@@",
+      "@@@STEP_LOG_LINE@decoded@            name: \"fuchsia/try/fuchsia-x64-debug\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp: \".*\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp_exclude: \".+/[+]/.*\\.md\"@@@",
+      "@@@STEP_LOG_LINE@decoded@            location_regexp_exclude: \".+/[+].*/docs/.+\"@@@",
+      "@@@STEP_LOG_LINE@decoded@          >@@@",
+      "@@@STEP_LOG_LINE@decoded@        >@@@",
+      "@@@STEP_LOG_LINE@decoded@      >@@@",
+      "@@@STEP_LOG_LINE@decoded@    >@@@",
+      "@@@STEP_LOG_LINE@decoded@    @@@",
+      "@@@STEP_LOG_END@decoded@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "all_tryjobs",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@tryjobs@fuchsia/try/cobalt-x64-linux@@@",
+      "@@@STEP_LOG_LINE@tryjobs@fuchsia/try/fuchsia-arm64-debug@@@",
+      "@@@STEP_LOG_LINE@tryjobs@fuchsia/try/fuchsia-x64-debug@@@",
+      "@@@STEP_LOG_END@tryjobs@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "normalized_tryjobs",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@tryjobs@fuchsia/try/cobalt-x64-linux@@@",
+      "@@@STEP_LOG_LINE@tryjobs@fuchsia/try/fuchsia-arm64-debug@@@",
+      "@@@STEP_LOG_LINE@tryjobs@fuchsia/try/fuchsia-x64-debug@@@",
+      "@@@STEP_LOG_END@tryjobs@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "get_affected_recipes",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@all recipes@fuchsia@@@",
+      "@@@STEP_LOG_LINE@all recipes@recipes@@@",
+      "@@@STEP_LOG_END@all recipes@@@",
+      "@@@STEP_LOG_LINE@changed files (raw)@recipes/fuchsia.py@@@",
+      "@@@STEP_LOG_LINE@changed files (raw)@recipes/foo@@@",
+      "@@@STEP_LOG_LINE@changed files (raw)@recipes/non_expected_json_file.json@@@",
+      "@@@STEP_LOG_LINE@changed files (raw)@recipe_modules/foo/examples/full.expected/bar.json@@@",
+      "@@@STEP_LOG_LINE@changed files (raw)@recipe_modules/foo/examples/full.py@@@",
+      "@@@STEP_LOG_LINE@changed files (raw)@recipe_modules/foo/test_api.py@@@",
+      "@@@STEP_LOG_END@changed files (raw)@@@",
+      "@@@STEP_LOG_LINE@changed files (filtered)@recipes/fuchsia.py@@@",
+      "@@@STEP_LOG_LINE@changed files (filtered)@recipes/foo@@@",
+      "@@@STEP_LOG_LINE@changed files (filtered)@recipes/non_expected_json_file.json@@@",
+      "@@@STEP_LOG_END@changed files (filtered)@@@",
+      "@@@STEP_LOG_LINE@affected recipes@fuchsia@@@",
+      "@@@STEP_LOG_END@affected recipes@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "listdir",
+      "[START_DIR]/infra/recipes/recipes",
+      "--recursive"
+    ],
+    "infra_step": true,
+    "name": "get_affected_recipes.ls-recipes",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@listdir@[START_DIR]/infra/recipes/recipes/foo@@@",
+      "@@@STEP_LOG_LINE@listdir@[START_DIR]/infra/recipes/recipes/fuchsia.py@@@",
+      "@@@STEP_LOG_LINE@listdir@[START_DIR]/infra/recipes/recipes/recipes.py@@@",
+      "@@@STEP_LOG_LINE@listdir@[START_DIR]/infra/recipes/recipes/sdk.expected@@@",
+      "@@@STEP_LOG_END@listdir@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "git",
+      "diff-tree",
+      "--no-commit-id",
+      "--name-only",
+      "-r",
+      "HEAD",
+      "-z"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "name": "get_affected_recipes.git diff-tree",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@files@recipes/fuchsia.py@@@",
+      "@@@STEP_LOG_LINE@files@recipes/foo@@@",
+      "@@@STEP_LOG_LINE@files@recipes/non_expected_json_file.json@@@",
+      "@@@STEP_LOG_LINE@files@recipe_modules/foo/examples/full.expected/bar.json@@@",
+      "@@@STEP_LOG_LINE@files@recipe_modules/foo/examples/full.py@@@",
+      "@@@STEP_LOG_LINE@files@recipe_modules/foo/test_api.py@@@",
+      "@@@STEP_LOG_END@files@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/infra/recipes/recipes.py",
+      "analyze",
+      "{\"files\": [\"recipes/fuchsia.py\", \"recipes/foo\", \"recipes/non_expected_json_file.json\"], \"recipes\": [\"fuchsia\", \"recipes\"]}",
+      "/path/to/tmp/json"
+    ],
+    "name": "get_affected_recipes.recipes-analyze",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"error\": \"\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"invalidRecipes\": [], @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"recipes\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  ]@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "get builders",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@selected 2 builds@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "get builders.fuchsia/try/cobalt-x64-linux",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@no recent builds found@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "bb",
+      "batch",
+      "-host",
+      "cr-buildbucket.appspot.com"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "infra_step": true,
+    "name": "get builders.fuchsia/try/cobalt-x64-linux.buildbucket.search",
+    "stdin": "{\"requests\": [{\"searchBuilds\": {\"fields\": \"builds.*.builder,builds.*.createTime,builds.*.createdBy,builds.*.critical,builds.*.endTime,builds.*.id,builds.*.infra.recipe,builds.*.input,builds.*.number,builds.*.output,builds.*.startTime,builds.*.status,builds.*.updateTime\", \"pageSize\": 1, \"predicate\": {\"builder\": {\"bucket\": \"try\", \"builder\": \"cobalt-x64-linux\", \"project\": \"fuchsia\"}, \"status\": \"SUCCESS\"}}}]}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{}@@@",
+      "@@@STEP_LOG_END@json.output@@@",
+      "@@@STEP_LOG_LINE@request@{@@@",
+      "@@@STEP_LOG_LINE@request@  \"requests\": [@@@",
+      "@@@STEP_LOG_LINE@request@    {@@@",
+      "@@@STEP_LOG_LINE@request@      \"searchBuilds\": {@@@",
+      "@@@STEP_LOG_LINE@request@        \"fields\": \"builds.*.builder,builds.*.createTime,builds.*.createdBy,builds.*.critical,builds.*.endTime,builds.*.id,builds.*.infra.recipe,builds.*.input,builds.*.number,builds.*.output,builds.*.startTime,builds.*.status,builds.*.updateTime\", @@@",
+      "@@@STEP_LOG_LINE@request@        \"pageSize\": 1, @@@",
+      "@@@STEP_LOG_LINE@request@        \"predicate\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"builder\": {@@@",
+      "@@@STEP_LOG_LINE@request@            \"bucket\": \"try\", @@@",
+      "@@@STEP_LOG_LINE@request@            \"builder\": \"cobalt-x64-linux\", @@@",
+      "@@@STEP_LOG_LINE@request@            \"project\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@request@          }, @@@",
+      "@@@STEP_LOG_LINE@request@          \"status\": \"SUCCESS\"@@@",
+      "@@@STEP_LOG_LINE@request@        }@@@",
+      "@@@STEP_LOG_LINE@request@      }@@@",
+      "@@@STEP_LOG_LINE@request@    }@@@",
+      "@@@STEP_LOG_LINE@request@  ]@@@",
+      "@@@STEP_LOG_LINE@request@}@@@",
+      "@@@STEP_LOG_END@request@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "get builders.fuchsia/try/fuchsia-arm64-debug",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@SELECTED@@@",
+      "@@@STEP_LOG_LINE@recipe_used@fuchsia@@@",
+      "@@@STEP_LOG_END@recipe_used@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "bb",
+      "batch",
+      "-host",
+      "cr-buildbucket.appspot.com"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "infra_step": true,
+    "name": "get builders.fuchsia/try/fuchsia-arm64-debug.buildbucket.search",
+    "stdin": "{\"requests\": [{\"searchBuilds\": {\"fields\": \"builds.*.builder,builds.*.createTime,builds.*.createdBy,builds.*.critical,builds.*.endTime,builds.*.id,builds.*.infra.recipe,builds.*.input,builds.*.number,builds.*.output,builds.*.startTime,builds.*.status,builds.*.updateTime\", \"pageSize\": 1, \"predicate\": {\"builder\": {\"bucket\": \"try\", \"builder\": \"fuchsia-arm64-debug\", \"project\": \"fuchsia\"}, \"status\": \"SUCCESS\"}}}]}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"responses\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"searchBuilds\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"builds\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@          {@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"builder\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@              \"builder\": \"fuchsia/try/fuchsia-arm64-debug\"@@@",
+      "@@@STEP_LOG_LINE@json.output@            }, @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"endTime\": \"2012-05-13T12:53:20Z\", @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"id\": \"37\", @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"infra\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@              \"recipe\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@                \"name\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@              }@@@",
+      "@@@STEP_LOG_LINE@json.output@            }, @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"input\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@              \"gerritChanges\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@                {@@@",
+      "@@@STEP_LOG_LINE@json.output@                  \"host\": \"fuchsia-review.googlesource.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@                  \"project\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@                }@@@",
+      "@@@STEP_LOG_LINE@json.output@              ]@@@",
+      "@@@STEP_LOG_LINE@json.output@            }, @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"status\": \"SUCCESS\"@@@",
+      "@@@STEP_LOG_LINE@json.output@          }@@@",
+      "@@@STEP_LOG_LINE@json.output@        ]@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@  ]@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@",
+      "@@@STEP_LOG_LINE@request@{@@@",
+      "@@@STEP_LOG_LINE@request@  \"requests\": [@@@",
+      "@@@STEP_LOG_LINE@request@    {@@@",
+      "@@@STEP_LOG_LINE@request@      \"searchBuilds\": {@@@",
+      "@@@STEP_LOG_LINE@request@        \"fields\": \"builds.*.builder,builds.*.createTime,builds.*.createdBy,builds.*.critical,builds.*.endTime,builds.*.id,builds.*.infra.recipe,builds.*.input,builds.*.number,builds.*.output,builds.*.startTime,builds.*.status,builds.*.updateTime\", @@@",
+      "@@@STEP_LOG_LINE@request@        \"pageSize\": 1, @@@",
+      "@@@STEP_LOG_LINE@request@        \"predicate\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"builder\": {@@@",
+      "@@@STEP_LOG_LINE@request@            \"bucket\": \"try\", @@@",
+      "@@@STEP_LOG_LINE@request@            \"builder\": \"fuchsia-arm64-debug\", @@@",
+      "@@@STEP_LOG_LINE@request@            \"project\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@request@          }, @@@",
+      "@@@STEP_LOG_LINE@request@          \"status\": \"SUCCESS\"@@@",
+      "@@@STEP_LOG_LINE@request@        }@@@",
+      "@@@STEP_LOG_LINE@request@      }@@@",
+      "@@@STEP_LOG_LINE@request@    }@@@",
+      "@@@STEP_LOG_LINE@request@  ]@@@",
+      "@@@STEP_LOG_LINE@request@}@@@",
+      "@@@STEP_LOG_END@request@@@",
+      "@@@STEP_LINK@37@https://cr-buildbucket.appspot.com/build/37@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/led",
+      "-ensure-file",
+      "infra/tools/luci/led/${platform} latest",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "name": "get builders.fuchsia/try/fuchsia-arm64-debug.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/led/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/led/led",
+      "get-build",
+      "37"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "name": "get builders.fuchsia/try/fuchsia-arm64-debug.led get-build",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"job_slices\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"userland\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"recipe_properties\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"recipe\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        }@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@  ], @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"top_level\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"led: bb-1-fuchsia/try/fuchsia-arm64-debug\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "get builders.fuchsia/try/fuchsia-arm64-debug.ensure gitiles",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[START_DIR]/cipd/gitiles",
+      "-ensure-file",
+      "infra/tools/luci/gitiles/${platform} latest",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "infra_step": true,
+    "name": "get builders.fuchsia/try/fuchsia-arm64-debug.ensure gitiles.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/gitiles/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/gitiles/gitiles",
+      "log",
+      "-json-output",
+      "/path/to/tmp/json",
+      "-limit",
+      "10",
+      "https://fuchsia.googlesource.com/fuchsia",
+      "refs/heads/master"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "name": "get builders.fuchsia/try/fuchsia-arm64-debug.log fuchsia",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@[]@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "get builders.fuchsia/try/fuchsia-x64-debug",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@SELECTED@@@",
+      "@@@STEP_LOG_LINE@recipe_used@fuchsia@@@",
+      "@@@STEP_LOG_END@recipe_used@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "bb",
+      "batch",
+      "-host",
+      "cr-buildbucket.appspot.com"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "infra_step": true,
+    "name": "get builders.fuchsia/try/fuchsia-x64-debug.buildbucket.search",
+    "stdin": "{\"requests\": [{\"searchBuilds\": {\"fields\": \"builds.*.builder,builds.*.createTime,builds.*.createdBy,builds.*.critical,builds.*.endTime,builds.*.id,builds.*.infra.recipe,builds.*.input,builds.*.number,builds.*.output,builds.*.startTime,builds.*.status,builds.*.updateTime\", \"pageSize\": 1, \"predicate\": {\"builder\": {\"bucket\": \"try\", \"builder\": \"fuchsia-x64-debug\", \"project\": \"fuchsia\"}, \"status\": \"SUCCESS\"}}}]}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"responses\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"searchBuilds\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"builds\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@          {@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"builder\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@              \"builder\": \"fuchsia/try/fuchsia-x64-debug\"@@@",
+      "@@@STEP_LOG_LINE@json.output@            }, @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"endTime\": \"2012-05-13T12:53:20Z\", @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"id\": \"37\", @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"infra\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@              \"recipe\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@                \"name\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@              }@@@",
+      "@@@STEP_LOG_LINE@json.output@            }, @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"input\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@              \"gerritChanges\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@                {@@@",
+      "@@@STEP_LOG_LINE@json.output@                  \"host\": \"fuchsia-review.googlesource.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@                  \"project\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@                }@@@",
+      "@@@STEP_LOG_LINE@json.output@              ]@@@",
+      "@@@STEP_LOG_LINE@json.output@            }, @@@",
+      "@@@STEP_LOG_LINE@json.output@            \"status\": \"SUCCESS\"@@@",
+      "@@@STEP_LOG_LINE@json.output@          }@@@",
+      "@@@STEP_LOG_LINE@json.output@        ]@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@  ]@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@",
+      "@@@STEP_LOG_LINE@request@{@@@",
+      "@@@STEP_LOG_LINE@request@  \"requests\": [@@@",
+      "@@@STEP_LOG_LINE@request@    {@@@",
+      "@@@STEP_LOG_LINE@request@      \"searchBuilds\": {@@@",
+      "@@@STEP_LOG_LINE@request@        \"fields\": \"builds.*.builder,builds.*.createTime,builds.*.createdBy,builds.*.critical,builds.*.endTime,builds.*.id,builds.*.infra.recipe,builds.*.input,builds.*.number,builds.*.output,builds.*.startTime,builds.*.status,builds.*.updateTime\", @@@",
+      "@@@STEP_LOG_LINE@request@        \"pageSize\": 1, @@@",
+      "@@@STEP_LOG_LINE@request@        \"predicate\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"builder\": {@@@",
+      "@@@STEP_LOG_LINE@request@            \"bucket\": \"try\", @@@",
+      "@@@STEP_LOG_LINE@request@            \"builder\": \"fuchsia-x64-debug\", @@@",
+      "@@@STEP_LOG_LINE@request@            \"project\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@request@          }, @@@",
+      "@@@STEP_LOG_LINE@request@          \"status\": \"SUCCESS\"@@@",
+      "@@@STEP_LOG_LINE@request@        }@@@",
+      "@@@STEP_LOG_LINE@request@      }@@@",
+      "@@@STEP_LOG_LINE@request@    }@@@",
+      "@@@STEP_LOG_LINE@request@  ]@@@",
+      "@@@STEP_LOG_LINE@request@}@@@",
+      "@@@STEP_LOG_END@request@@@",
+      "@@@STEP_LINK@37@https://cr-buildbucket.appspot.com/build/37@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/led/led",
+      "get-build",
+      "37"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "name": "get builders.fuchsia/try/fuchsia-x64-debug.led get-build",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"job_slices\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"userland\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"recipe_properties\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"recipe\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        }@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@  ], @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"top_level\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"led: bb-1-fuchsia/try/fuchsia-x64-debug\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "configure builds"
+  },
+  {
+    "cmd": [],
+    "name": "configure builds.fuchsia/try/fuchsia-arm64-debug",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/led/led",
+      "edit-recipe-bundle"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "name": "configure builds.fuchsia/try/fuchsia-arm64-debug.led edit-recipe-bundle",
+    "stdin": "{\"job_slices\": [{\"userland\": {\"recipe_properties\": {\"recipe\": \"fuchsia\"}}}], \"top_level\": {\"name\": \"recipes-cq:fuchsia/try/fuchsia-arm64-debug\"}}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_END@json.output (invalid)@@@",
+      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
+      "@@@STEP_LOG_END@json.output (exception)@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "configure builds.fuchsia/try/fuchsia-x64-debug",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/led/led",
+      "edit-recipe-bundle"
+    ],
+    "cwd": "[START_DIR]/infra/recipes",
+    "name": "configure builds.fuchsia/try/fuchsia-x64-debug.led edit-recipe-bundle",
+    "stdin": "{\"job_slices\": [{\"userland\": {\"recipe_properties\": {\"recipe\": \"fuchsia\"}}}], \"top_level\": {\"name\": \"recipes-cq:fuchsia/try/fuchsia-x64-debug\"}}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_END@json.output (invalid)@@@",
+      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
+      "@@@STEP_LOG_END@json.output (exception)@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect"
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect.0",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@2 launched, 2 passed@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect.0.launch",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect.0.launch.fuchsia/try/fuchsia-arm64-debug (attempt 0)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_LINK@Swarming task@https://chromium-swarm.appspot.com/task?id=200@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/led/led",
+      "launch"
+    ],
+    "infra_step": true,
+    "name": "launch/collect.0.launch.fuchsia/try/fuchsia-arm64-debug (attempt 0).led launch",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@4@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"swarming\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"host_name\": \"chromium-swarm.appspot.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"task_id\": \"200\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@",
+      "@@@STEP_LINK@Swarming task@https://chromium-swarm.appspot.com/task?id=200@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect.0.launch.fuchsia/try/fuchsia-x64-debug (attempt 0)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_LINK@Swarming task@https://chromium-swarm.appspot.com/task?id=100@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/led/led",
+      "launch"
+    ],
+    "infra_step": true,
+    "name": "launch/collect.0.launch.fuchsia/try/fuchsia-x64-debug (attempt 0).led launch",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@4@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"swarming\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"host_name\": \"chromium-swarm.appspot.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"task_id\": \"100\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@",
+      "@@@STEP_LINK@Swarming task@https://chromium-swarm.appspot.com/task?id=100@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect.0.ensure swarming",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/swarming_client",
+      "-ensure-file",
+      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "launch/collect.0.ensure swarming.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/swarming_client/swarming",
+      "collect",
+      "-server",
+      "https://example.swarmingserver.appspot.com",
+      "-task-summary-json",
+      "/path/to/tmp/json",
+      "-task-output-stdout",
+      "json",
+      "-timeout",
+      "5m",
+      "200",
+      "100"
+    ],
+    "infra_step": true,
+    "name": "launch/collect.0.collect",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"100\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"bot_id\": \"vm-123\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"name\": \"recipes-cq:fuchsia/try/fuchsia-x64-debug\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"task_id\": 100@@@",
+      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"200\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"bot_id\": \"vm-123\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"name\": \"recipes-cq:fuchsia/try/fuchsia-arm64-debug\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"task_id\": 200@@@",
+      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@",
+      "@@@STEP_LOG_LINE@task stdout+stderr: recipes-cq:fuchsia&#x2f;try&#x2f;fuchsia-arm64-debug@hello world!@@@",
+      "@@@STEP_LOG_END@task stdout+stderr: recipes-cq:fuchsia&#x2f;try&#x2f;fuchsia-arm64-debug@@@",
+      "@@@STEP_LOG_LINE@task stdout+stderr: recipes-cq:fuchsia&#x2f;try&#x2f;fuchsia-x64-debug@hello world!@@@",
+      "@@@STEP_LOG_END@task stdout+stderr: recipes-cq:fuchsia&#x2f;try&#x2f;fuchsia-x64-debug@@@",
+      "@@@STEP_LINK@task isolated outputs: recipes-cq:fuchsia/try/fuchsia-arm64-debug@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@",
+      "@@@STEP_LINK@task isolated outputs: recipes-cq:fuchsia/try/fuchsia-x64-debug@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect.0.process results",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect.0.process results.always pass",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "launch/collect.0.passed tasks",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LINK@fuchsia/try/fuchsia-arm64-debug (attempt 0)@https://chromium-swarm.appspot.com/task?id=200@@@",
+      "@@@STEP_LINK@fuchsia/try/fuchsia-x64-debug (attempt 0)@https://chromium-swarm.appspot.com/task?id=100@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "passes",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@2 passed@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "passes.fuchsia/try/fuchsia-arm64-debug",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@attempt 0 (pass)@https://chromium-swarm.appspot.com/task?id=200@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "passes.fuchsia/try/fuchsia-x64-debug",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@attempt 0 (pass)@https://chromium-swarm.appspot.com/task?id=100@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "flakes",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@0 flaked@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "failures",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@0 failed@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "all tasks passed"
+  },
+  {
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipes/recipes.expected/two_pass_one_skip.json b/recipes/recipes.expected/two_pass_one_skip.json
index d201701..1ff7160 100644
--- a/recipes/recipes.expected/two_pass_one_skip.json
+++ b/recipes/recipes.expected/two_pass_one_skip.json
@@ -653,7 +653,7 @@
       "-json-output",
       "/path/to/tmp/json",
       "-limit",
-      "1",
+      "10",
       "https://fuchsia.googlesource.com/fuchsia",
       "refs/heads/master"
     ],
diff --git a/recipes/recipes.py b/recipes/recipes.py
index 90ea66e..6407af0 100644
--- a/recipes/recipes.py
+++ b/recipes/recipes.py
@@ -205,7 +205,10 @@
   elif orig_build.input.gerrit_changes:
     orig_cl = orig_build.input.gerrit_changes[0]
     cl_id = get_latest_cl(api, orig_cl.host, orig_cl.project)
-    build.include_cl('https://%s/c/%d' % (orig_cl.host, cl_id))
+    # Setting the CL to a more recent CL helps avoid rebase errors, but if
+    # unable to find a recent CL, keep the original. It usually works.
+    if cl_id:
+      build.include_cl('https://%s/c/%d' % (orig_cl.host, cl_id))
 
   return build
 
@@ -225,16 +228,20 @@
   gitiles_host = gerrit_host.replace('-review', '')
   remote = 'https://%s/%s' % (gitiles_host, project)
   log = api.gitiles.log(
-      remote, 'refs/heads/master', limit=1, step_name='log %s' % project)
-  assert len(log) == 1
+      remote, 'refs/heads/master', limit=10, step_name='log %s' % project)
 
-  commit_hash = log[0]['id']
-  change = api.gerrit.change_details(
-      'latest change details for %s' % project,
-      commit_hash,
-      test_data=api.json.test_api.output({'_number': 12345}),
-      ok_ret='any')
-  return change['_number']
+  for log_entry in log:
+    commit_hash = log_entry['id']
+    change = api.gerrit.change_details(
+        'latest change details for %s' % project,
+        commit_hash,
+        test_data=api.json.test_api.output({'_number': 12345}),
+        ok_ret='any')
+    # Commits that are committed directly without code review don't have
+    # Gerrit change details.
+    if change:
+      return change['_number']
+  return None
 
 
 def RunSteps(api, project, manifest, remote, selftest_cl, unittest_only):
@@ -303,7 +310,7 @@
 def GenTests(api):
   # yapf:disable
   def build_data(name, recipe, age_seconds=ONE_DAY, cl_cached=False,
-                 skip=False):
+                 skip=False, num_log_entries=1):
     # This time is taken from the time recipe_engine module. I see no way
     # of getting it programmatically.
     curr_time = 1337000000
@@ -344,7 +351,7 @@
 
     if recipe != 'recipes' and not cl_cached:
       result += api.gitiles.log(
-          'get builders.{}.log {}'.format(name, cl.project), 'A', n=1)
+          'get builders.{}.log {}'.format(name, cl.project), 'A', n=num_log_entries)
 
     return result
 
@@ -521,4 +528,22 @@
       props(unittest_only=True) +
       ci_build
   )
+
+  yield (
+    api.status_check.test('no_latest_cl') +
+    props() +
+    ci_build +
+    api.commit_queue.test_data() +
+    affected_recipes_data(['fuchsia']) +
+    build_data('fuchsia/try/fuchsia-arm64-debug', 'fuchsia', num_log_entries=0) +
+    api.swarming_retry.led_data('fuchsia/try/fuchsia-arm64-debug',
+                                task_id=200) +
+    build_data('fuchsia/try/fuchsia-x64-debug', 'fuchsia', cl_cached=True) +
+    api.swarming_retry.led_data('fuchsia/try/fuchsia-x64-debug',
+                                task_id=100) +
+    api.swarming_retry.collect_data([
+        task_result(100, 'fuchsia/try/fuchsia-x64-debug'),
+        task_result(200, 'fuchsia/try/fuchsia-arm64-debug'),
+    ])
+  )
   # yapf:enable