multi_roller: Add ready_labels option

Bug: 338115792

The ready_labels multi_roller option will allow the user to specify
which labels will indicate when a sub-roll is ready to submit.

Change-Id: I36d9d8884bb486eb18b85d1ad02a1d97eb11c211
Reviewed-on: https://pigweed-review.googlesource.com/c/infra/recipes/+/227181
Presubmit-Verified: CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
Reviewed-by: Rob Mohr <mohrr@google.com>
Commit-Queue: Samuel Liu <slliu@google.com>
diff --git a/recipes/multi_roller.expected/bypass-presubmit label does not exist.json b/recipes/multi_roller.expected/bypass-presubmit label does not exist.json
new file mode 100644
index 0000000..96cb3a2
--- /dev/null
+++ b/recipes/multi_roller.expected/bypass-presubmit label does not exist.json
@@ -0,0 +1,446 @@
+[
+  {
+    "cmd": [],
+    "name": "Launching Rollers",
+    "~followup_annotations": [
+      "@@@STEP_LINK@roller-1@https://ci.chromium.org/b/1000@@@",
+      "@@@STEP_FAILURE@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "bb",
+      "batch",
+      "-host",
+      "cr-buildbucket.appspot.com"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "fuchsia:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Launching Rollers.schedule",
+    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"ci\", \"builder\": \"roller-1\", \"project\": \"fuchsia\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\", \"project\": \"fuchsia\", \"ref\": \"refs/heads/main\"}, \"properties\": {\"override_auto_roller_options\": {\"push_options\": [\"topic=pigweed-s5400-roller-8945511751514863184\"]}}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"hide-in-gerrit\", \"value\": \"subbuild\"}, {\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"skip-retry-in-gerrit\", \"value\": \"subbuild\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"responses\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"scheduleBuild\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"builder\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"bucket\": \"ci\",@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"roller-1\",@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"project\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        },@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"id\": \"1000\"@@@",
+      "@@@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@      \"scheduleBuild\": {@@@",
+      "@@@STEP_LOG_LINE@request@        \"builder\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"bucket\": \"ci\",@@@",
+      "@@@STEP_LOG_LINE@request@          \"builder\": \"roller-1\",@@@",
+      "@@@STEP_LOG_LINE@request@          \"project\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@request@        },@@@",
+      "@@@STEP_LOG_LINE@request@        \"experimental\": \"NO\",@@@",
+      "@@@STEP_LOG_LINE@request@        \"experiments\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"luci.buildbucket.parent_tracking\": false@@@",
+      "@@@STEP_LOG_LINE@request@        },@@@",
+      "@@@STEP_LOG_LINE@request@        \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\",@@@",
+      "@@@STEP_LOG_LINE@request@        \"gitilesCommit\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"host\": \"fuchsia.googlesource.com\",@@@",
+      "@@@STEP_LOG_LINE@request@          \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\",@@@",
+      "@@@STEP_LOG_LINE@request@          \"project\": \"fuchsia\",@@@",
+      "@@@STEP_LOG_LINE@request@          \"ref\": \"refs/heads/main\"@@@",
+      "@@@STEP_LOG_LINE@request@        },@@@",
+      "@@@STEP_LOG_LINE@request@        \"properties\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"override_auto_roller_options\": {@@@",
+      "@@@STEP_LOG_LINE@request@            \"push_options\": [@@@",
+      "@@@STEP_LOG_LINE@request@              \"topic=pigweed-s5400-roller-8945511751514863184\"@@@",
+      "@@@STEP_LOG_LINE@request@            ]@@@",
+      "@@@STEP_LOG_LINE@request@          }@@@",
+      "@@@STEP_LOG_LINE@request@        },@@@",
+      "@@@STEP_LOG_LINE@request@        \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\",@@@",
+      "@@@STEP_LOG_LINE@request@        \"swarming\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"parentRunId\": \"fake-task-id\"@@@",
+      "@@@STEP_LOG_LINE@request@        },@@@",
+      "@@@STEP_LOG_LINE@request@        \"tags\": [@@@",
+      "@@@STEP_LOG_LINE@request@          {@@@",
+      "@@@STEP_LOG_LINE@request@            \"key\": \"hide-in-gerrit\",@@@",
+      "@@@STEP_LOG_LINE@request@            \"value\": \"subbuild\"@@@",
+      "@@@STEP_LOG_LINE@request@          },@@@",
+      "@@@STEP_LOG_LINE@request@          {@@@",
+      "@@@STEP_LOG_LINE@request@            \"key\": \"parent_buildbucket_id\",@@@",
+      "@@@STEP_LOG_LINE@request@            \"value\": \"8945511751514863184\"@@@",
+      "@@@STEP_LOG_LINE@request@          },@@@",
+      "@@@STEP_LOG_LINE@request@          {@@@",
+      "@@@STEP_LOG_LINE@request@            \"key\": \"skip-retry-in-gerrit\",@@@",
+      "@@@STEP_LOG_LINE@request@            \"value\": \"subbuild\"@@@",
+      "@@@STEP_LOG_LINE@request@          },@@@",
+      "@@@STEP_LOG_LINE@request@          {@@@",
+      "@@@STEP_LOG_LINE@request@            \"key\": \"user_agent\",@@@",
+      "@@@STEP_LOG_LINE@request@            \"value\": \"recipe\"@@@",
+      "@@@STEP_LOG_LINE@request@          }@@@",
+      "@@@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@1000@https://cr-buildbucket.appspot.com/build/1000@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "Launching Rollers.Get sub-roller change IDs (0)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@Got all change ids: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "bb",
+      "batch",
+      "-host",
+      "cr-buildbucket.appspot.com"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "fuchsia:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Launching Rollers.Get sub-roller change IDs (0).buildbucket.get_multi",
+    "stdin": "{\"requests\": [{\"getBuild\": {\"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"id\": \"1000\"}}]}",
+    "~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@      \"getBuild\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"builder\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"bucket\": \"ci\",@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"roller-1\",@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"project\": \"fuchsia\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        },@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"createTime\": \"2018-05-25T23:50:17Z\",@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"createdBy\": \"user:luci-scheduler@appspot.gserviceaccount.com\",@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"id\": \"1000\",@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"infra\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"backend\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"task\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@              \"id\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@                \"id\": \"abc123\"@@@",
+      "@@@STEP_LOG_LINE@json.output@              }@@@",
+      "@@@STEP_LOG_LINE@json.output@            }@@@",
+      "@@@STEP_LOG_LINE@json.output@          },@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"resultdb\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"invocation\": \"invocations/build:1000\"@@@",
+      "@@@STEP_LOG_LINE@json.output@          },@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"swarming\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"priority\": 30@@@",
+      "@@@STEP_LOG_LINE@json.output@          }@@@",
+      "@@@STEP_LOG_LINE@json.output@        },@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"input\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"gitilesCommit\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"host\": \"chromium.googlesource.com\",@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\",@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"project\": \"fuchsia\",@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"ref\": \"refs/heads/main\"@@@",
+      "@@@STEP_LOG_LINE@json.output@          }@@@",
+      "@@@STEP_LOG_LINE@json.output@        },@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"output\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@          \"properties\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@            \"gerrit_changes\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@              {@@@",
+      "@@@STEP_LOG_LINE@json.output@                \"change_id\": \"11111111\",@@@",
+      "@@@STEP_LOG_LINE@json.output@                \"host\": \"change_host_1\"@@@",
+      "@@@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@        \"status\": \"SUCCESS\"@@@",
+      "@@@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@      \"getBuild\": {@@@",
+      "@@@STEP_LOG_LINE@request@        \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\",@@@",
+      "@@@STEP_LOG_LINE@request@        \"id\": \"1000\"@@@",
+      "@@@STEP_LOG_LINE@request@      }@@@",
+      "@@@STEP_LOG_LINE@request@    }@@@",
+      "@@@STEP_LOG_LINE@request@  ]@@@",
+      "@@@STEP_LOG_LINE@request@}@@@",
+      "@@@STEP_LOG_END@request@@@",
+      "@@@STEP_LINK@1000@https://cr-buildbucket.appspot.com/build/1000@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "Launching Rollers.Get sub-roller change IDs (0).got changes for 1000",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LINK@1000@https://ci.chromium.org/ui/b/1000@@@",
+      "@@@STEP_LINK@change_host_1:11111111@https://change_host_1-review.googlesource.com/q/11111111@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0)",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_SUMMARY_TEXT@Waiting on Bypass-Presubmit or Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython3",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "RECIPE_MODULE[fuchsia::gerrit]/resources/cipd.ensure",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "fuchsia:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@4@@@",
+      "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
+      "@@@STEP_LOG_END@cipd.ensure@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@3@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython3",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0o777",
+      "[START_DIR]/cipd_tool/infra/tools/luci/gerrit/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "fuchsia:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@4@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[START_DIR]/cipd_tool/infra/tools/luci/gerrit/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07",
+      "-ensure-file",
+      "infra/tools/luci/gerrit/${platform} version:pinned-version",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "fuchsia:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@4@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:pinned-v\",@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/gerrit/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_tool/infra/tools/luci/gerrit/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07/gerrit",
+      "change-detail",
+      "-host",
+      "https://change_host_1-review.googlesource.com",
+      "-input",
+      "{\"change_id\": \"11111111\"}",
+      "-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "fuchsia:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+    "timeout": 600,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {}@@@",
+      "@@@STEP_LOG_LINE@json.output@  },@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"status\": \"NEW\"@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@",
+      "@@@STEP_LOG_LINE@json.input@{@@@",
+      "@@@STEP_LOG_LINE@json.input@  \"change_id\": \"11111111\"@@@",
+      "@@@STEP_LOG_LINE@json.input@}@@@",
+      "@@@STEP_LOG_END@json.input@@@",
+      "@@@STEP_LINK@gerrit link@https://change_host_1-review.googlesource.com/q/11111111@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Check CL 11111111",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_SUMMARY_TEXT@Bypass-Presubmit label does not exist@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd_tool/infra/tools/luci/gerrit/0e548aa33f8113a45a5b3b62201e114e98e63d00f97296912380138f44597b07/gerrit",
+      "set-review",
+      "-host",
+      "https://change_host_1-review.googlesource.com",
+      "-input",
+      "{\"change_id\": \"11111111\", \"input\": {\"labels\": {\"Rolls-Synced\": -1}, \"tag\": \"autogenerated:fuchsia:builder:bbid=8945511751514863184\"}, \"revision_id\": \"current\"}",
+      "-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "fuchsia:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Launching Rollers.Set Rolls-Synced -1 on 11111111",
+    "timeout": 600,
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{}@@@",
+      "@@@STEP_LOG_END@json.output@@@",
+      "@@@STEP_LOG_LINE@json.input@{@@@",
+      "@@@STEP_LOG_LINE@json.input@  \"change_id\": \"11111111\",@@@",
+      "@@@STEP_LOG_LINE@json.input@  \"input\": {@@@",
+      "@@@STEP_LOG_LINE@json.input@    \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.input@      \"Rolls-Synced\": -1@@@",
+      "@@@STEP_LOG_LINE@json.input@    },@@@",
+      "@@@STEP_LOG_LINE@json.input@    \"tag\": \"autogenerated:fuchsia:builder:bbid=8945511751514863184\"@@@",
+      "@@@STEP_LOG_LINE@json.input@  },@@@",
+      "@@@STEP_LOG_LINE@json.input@  \"revision_id\": \"current\"@@@",
+      "@@@STEP_LOG_LINE@json.input@}@@@",
+      "@@@STEP_LOG_END@json.input@@@",
+      "@@@STEP_LINK@gerrit link@https://change_host_1-review.googlesource.com/q/11111111@@@"
+    ]
+  },
+  {
+    "failure": {
+      "failure": {},
+      "humanReason": "Some roller presubmits failed."
+    },
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipes/multi_roller.expected/check for presubmit-verified timeout.json b/recipes/multi_roller.expected/check for presubmit-verified timeout.json
index 912e0dd..343b9ac 100644
--- a/recipes/multi_roller.expected/check for presubmit-verified timeout.json
+++ b/recipes/multi_roller.expected/check for presubmit-verified timeout.json
@@ -211,22 +211,22 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0)",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@Waiting on Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
+      "@@@STEP_SUMMARY_TEXT@Waiting on Bypass-Presubmit or Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -255,7 +255,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
@@ -264,7 +264,7 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -294,7 +294,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@"
     ]
@@ -325,7 +325,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -365,13 +365,14 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
     "timeout": 600,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
       "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Bypass-Presubmit\": {},@@@",
       "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {}@@@",
       "@@@STEP_LOG_LINE@json.output@  },@@@",
       "@@@STEP_LOG_LINE@json.output@  \"status\": \"NEW\"@@@",
@@ -386,10 +387,10 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Check CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Check CL 11111111",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_SUMMARY_TEXT@Presubmit-Verified not set@@@"
+      "@@@STEP_SUMMARY_TEXT@Bypass-Presubmit or Presubmit-Verified not set@@@"
     ]
   },
   {
diff --git a/recipes/multi_roller.expected/presubmit fails.json b/recipes/multi_roller.expected/presubmit fails.json
index d9ea3d4..31c4468 100644
--- a/recipes/multi_roller.expected/presubmit fails.json
+++ b/recipes/multi_roller.expected/presubmit fails.json
@@ -211,22 +211,22 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0)",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@Waiting on Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
+      "@@@STEP_SUMMARY_TEXT@Waiting on Bypass-Presubmit or Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -255,7 +255,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
@@ -264,7 +264,7 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -294,7 +294,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@"
     ]
@@ -325,7 +325,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -365,13 +365,14 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
     "timeout": 600,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
       "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Bypass-Presubmit\": {},@@@",
       "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {@@@",
       "@@@STEP_LOG_LINE@json.output@      \"rejected\": {}@@@",
       "@@@STEP_LOG_LINE@json.output@    }@@@",
@@ -388,10 +389,10 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Check CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Check CL 11111111",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_SUMMARY_TEXT@Presubmit checks failed@@@"
+      "@@@STEP_SUMMARY_TEXT@Roll failed. Presubmit-Verified label set to {'rejected': {}}@@@"
     ]
   },
   {
diff --git a/recipes/multi_roller.expected/presubmit-verified label does not exist.json b/recipes/multi_roller.expected/presubmit-verified label does not exist.json
index 77a80d5..81c2d2f 100644
--- a/recipes/multi_roller.expected/presubmit-verified label does not exist.json
+++ b/recipes/multi_roller.expected/presubmit-verified label does not exist.json
@@ -211,22 +211,22 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0)",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@Waiting on Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
+      "@@@STEP_SUMMARY_TEXT@Waiting on Bypass-Presubmit or Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -255,7 +255,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
@@ -264,7 +264,7 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -294,7 +294,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@"
     ]
@@ -325,7 +325,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -365,13 +365,15 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
     "timeout": 600,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"labels\": {},@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Bypass-Presubmit\": {}@@@",
+      "@@@STEP_LOG_LINE@json.output@  },@@@",
       "@@@STEP_LOG_LINE@json.output@  \"status\": \"NEW\"@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@",
@@ -384,10 +386,10 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Check CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Check CL 11111111",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_SUMMARY_TEXT@f{PRESUBMIT_VERIFIED_LABEL} does not exist@@@"
+      "@@@STEP_SUMMARY_TEXT@Presubmit-Verified label does not exist@@@"
     ]
   },
   {
diff --git a/recipes/multi_roller.expected/roll CL manually abandoned.json b/recipes/multi_roller.expected/roll CL manually abandoned.json
index 59ea01c..0c21d38 100644
--- a/recipes/multi_roller.expected/roll CL manually abandoned.json
+++ b/recipes/multi_roller.expected/roll CL manually abandoned.json
@@ -211,22 +211,22 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0)",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@Waiting on Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
+      "@@@STEP_SUMMARY_TEXT@Waiting on Bypass-Presubmit or Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111')]@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -255,7 +255,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
@@ -264,7 +264,7 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -294,7 +294,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@"
     ]
@@ -325,7 +325,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -365,13 +365,14 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
     "timeout": 600,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
       "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Bypass-Presubmit\": {},@@@",
       "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {@@@",
       "@@@STEP_LOG_LINE@json.output@      \"approved\": {}@@@",
       "@@@STEP_LOG_LINE@json.output@    }@@@",
@@ -388,7 +389,7 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Roll CL 11111111 was manually abandoned.",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Roll CL 11111111 was manually abandoned.",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
diff --git a/recipes/multi_roller.expected/roll CL manually merged.json b/recipes/multi_roller.expected/roll CL manually merged.json
index 5f90c2e..b8c3912 100644
--- a/recipes/multi_roller.expected/roll CL manually merged.json
+++ b/recipes/multi_roller.expected/roll CL manually merged.json
@@ -210,22 +210,22 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0)",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@All roll CLs have Presubmit-Verified@@@"
+      "@@@STEP_SUMMARY_TEXT@All roll CLs have Bypass-Presubmit or Presubmit-Verified!@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -254,7 +254,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
@@ -263,7 +263,7 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -293,7 +293,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@"
     ]
@@ -324,7 +324,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -364,13 +364,14 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
     "timeout": 600,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
       "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Bypass-Presubmit\": {},@@@",
       "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {@@@",
       "@@@STEP_LOG_LINE@json.output@      \"approved\": {}@@@",
       "@@@STEP_LOG_LINE@json.output@    }@@@",
@@ -387,7 +388,7 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Roll CL 11111111 was manually merged.",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Roll CL 11111111 was manually merged.",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
diff --git a/recipes/multi_roller.expected/success with two sub-rollers.json b/recipes/multi_roller.expected/success with two sub-rollers.json
index f883d8b..04eb135 100644
--- a/recipes/multi_roller.expected/success with two sub-rollers.json
+++ b/recipes/multi_roller.expected/success with two sub-rollers.json
@@ -419,22 +419,22 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0)",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@Waiting on Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111'), GerritChange(host='change_host_2', change_id='22222222')]@@@"
+      "@@@STEP_SUMMARY_TEXT@Waiting on Bypass-Presubmit or Presubmit-Verified for: [GerritChange(host='change_host_1', change_id='11111111'), GerritChange(host='change_host_2', change_id='22222222')]@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -463,7 +463,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.get packages.read ensure file",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@cipd.ensure@infra/tools/luci/gerrit/${platform} version:pinned-version@@@",
@@ -472,7 +472,7 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@3@@@"
     ]
@@ -502,7 +502,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure package directory",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@"
     ]
@@ -533,7 +533,7 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).ensure infra/tools/luci/gerrit/${platform}.install infra/tools/luci/gerrit.ensure_installed",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@4@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -573,16 +573,17 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
     "timeout": 600,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
       "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"approved\": {}@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Bypass-Presubmit\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"recommended\": {}@@@",
+      "@@@STEP_LOG_LINE@json.output@    },@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {}@@@",
       "@@@STEP_LOG_LINE@json.output@  },@@@",
       "@@@STEP_LOG_LINE@json.output@  \"status\": \"NEW\"@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -596,10 +597,10 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Check CL 11111111",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Check CL 11111111",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_SUMMARY_TEXT@Presubmit checks passed@@@"
+      "@@@STEP_SUMMARY_TEXT@Ready to submit. Bypass-Presubmit label detected with score {'recommended': {}}.@@@"
     ]
   },
   {
@@ -626,13 +627,14 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 22222222",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 22222222",
     "timeout": 600,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
       "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Bypass-Presubmit\": {},@@@",
       "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {}@@@",
       "@@@STEP_LOG_LINE@json.output@  },@@@",
       "@@@STEP_LOG_LINE@json.output@  \"status\": \"NEW\"@@@",
@@ -647,18 +649,18 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Check CL 22222222",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Check CL 22222222",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_SUMMARY_TEXT@Presubmit-Verified not set@@@"
+      "@@@STEP_SUMMARY_TEXT@Bypass-Presubmit or Presubmit-Verified not set@@@"
     ]
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (1)",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (1)",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@All roll CLs have Presubmit-Verified@@@"
+      "@@@STEP_SUMMARY_TEXT@All roll CLs have Bypass-Presubmit or Presubmit-Verified!@@@"
     ]
   },
   {
@@ -685,13 +687,14 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (1).Get CL details for CL 22222222",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (1).Get CL details for CL 22222222",
     "timeout": 600,
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"current_revision\": \"abc\",@@@",
       "@@@STEP_LOG_LINE@json.output@  \"labels\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"Bypass-Presubmit\": {},@@@",
       "@@@STEP_LOG_LINE@json.output@    \"Presubmit-Verified\": {@@@",
       "@@@STEP_LOG_LINE@json.output@      \"approved\": {}@@@",
       "@@@STEP_LOG_LINE@json.output@    }@@@",
@@ -708,10 +711,10 @@
   },
   {
     "cmd": [],
-    "name": "Launching Rollers.Wait for Presubmit-Verified for roll CLs (1).Check CL 22222222",
+    "name": "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (1).Check CL 22222222",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_SUMMARY_TEXT@Presubmit checks passed@@@"
+      "@@@STEP_SUMMARY_TEXT@Ready to submit. Presubmit-Verified label detected with score {'approved': {}}.@@@"
     ]
   },
   {
diff --git a/recipes/multi_roller.proto b/recipes/multi_roller.proto
index 21bf639..f150c4b 100644
--- a/recipes/multi_roller.proto
+++ b/recipes/multi_roller.proto
@@ -39,4 +39,14 @@
     // Gerrit Label to indicate when a roll CL is synced with the other roll
     // CLs in its multi_roller group.
     string rolls_synced_label = 3;
+
+    // Labels that indicate that a sub-roll is ready to be submitted.
+    // If a sub-roll has ANY of the labels in ready_labels with a
+    // score of "approved" (or also "recommended" if the permit_recommended
+    // option is set to True), then it is ready.
+    repeated string ready_labels = 4;
+
+    // Treat "recommended" votes on labels_to_wait_on as "approved" votes.
+    bool permit_recommended = 5;
+
 }
\ No newline at end of file
diff --git a/recipes/multi_roller.py b/recipes/multi_roller.py
index f602ec4..33b32e7 100644
--- a/recipes/multi_roller.py
+++ b/recipes/multi_roller.py
@@ -37,8 +37,6 @@
 PROPERTIES = InputProperties
 
 LABEL_STATUSES = ("rejected", "approved", "disliked", "recommended")
-PRESUBMIT_VERIFIED_LABEL = "Presubmit-Verified"
-
 DEFAULT_POLL_INTERVAL_SECONDS = 5 * 60
 
 
@@ -186,14 +184,21 @@
     Returns:
         Whether or not all sub-roller CLs passed presubmits.
     """
-    success_status = {"approved"}
-    failure_status = set(LABEL_STATUSES) - success_status
+    success_statuses = {"approved"}
+    if props.permit_recommended:
+        success_statuses.add("recommended")
+    failure_statuses = set(LABEL_STATUSES) - success_statuses
+
+    ready_labels: list[str] = props.ready_labels
+    ready_labels_text = " or ".join(ready_labels)
     remaining_rollers: list[GerritChange] = list(roller_changes)
     for i in itertools.count():
         with api.step.nest(
-            f"Wait for {PRESUBMIT_VERIFIED_LABEL} for roll CLs ({i})"
+            f"Wait for {ready_labels_text} for roll CLs ({i})"
         ) as pres:
-            pres.step_summary_text = f"Waiting on {PRESUBMIT_VERIFIED_LABEL} for: {remaining_rollers}"
+            pres.step_summary_text = (
+                f"Waiting on {ready_labels_text} for: {remaining_rollers}"
+            )
             for change in list(remaining_rollers):
                 step = api.gerrit.change_details(
                     f"Get CL details for CL {change.change_id}",
@@ -219,29 +224,42 @@
                     f"Check CL {change.change_id}"
                 ) as label_pres:
                     label_pres.step_summary_text = (
-                        f"{PRESUBMIT_VERIFIED_LABEL} not set"
+                        f"{ready_labels_text} not set"
                     )
-                    if PRESUBMIT_VERIFIED_LABEL not in details["labels"]:
-                        label_pres.step_summary_text = (
-                            "f{PRESUBMIT_VERIFIED_LABEL} does not exist"
-                        )
-                        return False
 
-                    if failure_status.intersection(
-                        details["labels"][PRESUBMIT_VERIFIED_LABEL]
-                    ):
-                        label_pres.step_summary_text = "Presubmit checks failed"
-                        return False
+                    # Check if this roll CL is ready to submit.
+                    for label in ready_labels:
+                        # Ensure label exists.
+                        if label not in details["labels"]:
+                            label_pres.step_summary_text = (
+                                f"{label} label does not exist"
+                            )
+                            return False
 
-                    if success_status.intersection(
-                        details["labels"][PRESUBMIT_VERIFIED_LABEL]
-                    ):
-                        label_pres.step_summary_text = "Presubmit checks passed"
-                        remaining_rollers.remove(change)
+                        label_score = details["labels"][label]
+
+                        # If label is not set yet, ignore it.
+                        if not label_score:
+                            continue
+
+                        if failure_statuses.intersection(label_score):
+                            label_pres.step_summary_text = (
+                                f"Roll failed. {label} "
+                                f"label set to {label_score}"
+                            )
+                            return False
+
+                        # Roll CL has one of the labels indicating it is ready.
+                        if success_statuses.intersection(label_score):
+                            label_pres.step_summary_text = (
+                                f"Ready to submit. {label} label "
+                                f"detected with score {label_score}."
+                            )
+                            remaining_rollers.remove(change)
 
             if not remaining_rollers:
                 pres.step_summary_text = (
-                    f"All roll CLs have {PRESUBMIT_VERIFIED_LABEL}"
+                    f"All roll CLs have {ready_labels_text}!"
                 )
                 return True
 
@@ -286,6 +304,8 @@
         props.rollers_to_launch.extend(list(builders))
         props.poll_interval_secs = 5
         props.rolls_synced_label = "Rolls-Synced"
+        props.ready_labels.extend(["Bypass-Presubmit", "Presubmit-Verified"])
+        props.permit_recommended = True
         return api.properties(props)
 
     def simulate_subroller_launch(builds, launch_step="Launching Rollers"):
@@ -351,37 +371,40 @@
             launch_step="Launching Rollers.Get sub-roller change IDs (1)",
         )
         + api.step_data(
-            "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
             api.json.output(
                 {
                     "current_revision": "abc",
                     "status": "NEW",
                     "labels": {
-                        "Presubmit-Verified": {"approved": {}},
-                    },
-                }
-            ),
-        )
-        + api.step_data(
-            "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 22222222",
-            api.json.output(
-                {
-                    "current_revision": "abc",
-                    "status": "NEW",
-                    "labels": {
-                        # Presubmit-Verified label doesn't have a vote yet!
+                        "Bypass-Presubmit": {"recommended": {}},
                         "Presubmit-Verified": {},
                     },
                 }
             ),
         )
         + api.step_data(
-            "Launching Rollers.Wait for Presubmit-Verified for roll CLs (1).Get CL details for CL 22222222",
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 22222222",
             api.json.output(
                 {
                     "current_revision": "abc",
                     "status": "NEW",
                     "labels": {
+                        # Presubmit-Verified label doesn't have a vote yet!
+                        "Bypass-Presubmit": {},
+                        "Presubmit-Verified": {},
+                    },
+                }
+            ),
+        )
+        + api.step_data(
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (1).Get CL details for CL 22222222",
+            api.json.output(
+                {
+                    "current_revision": "abc",
+                    "status": "NEW",
+                    "labels": {
+                        "Bypass-Presubmit": {},
                         "Presubmit-Verified": {"approved": {}},
                     },
                 }
@@ -410,12 +433,13 @@
             launch_step="Launching Rollers.Get sub-roller change IDs (0)",
         )
         + api.step_data(
-            "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
             api.json.output(
                 {
                     "current_revision": "abc",
                     "status": "NEW",
                     "labels": {
+                        "Bypass-Presubmit": {},
                         "Presubmit-Verified": {"rejected": {}},
                     },
                 }
@@ -444,12 +468,13 @@
             launch_step="Launching Rollers.Get sub-roller change IDs (0)",
         )
         + api.step_data(
-            "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
             api.json.output(
                 {
                     "current_revision": "abc",
                     "status": "MERGED",
                     "labels": {
+                        "Bypass-Presubmit": {},
                         "Presubmit-Verified": {"approved": {}},
                     },
                 }
@@ -478,12 +503,13 @@
             launch_step="Launching Rollers.Get sub-roller change IDs (0)",
         )
         + api.step_data(
-            "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
             api.json.output(
                 {
                     "current_revision": "abc",
                     "status": "ABANDONED",
                     "labels": {
+                        "Bypass-Presubmit": {},
                         "Presubmit-Verified": {"approved": {}},
                     },
                 }
@@ -512,12 +538,48 @@
             launch_step="Launching Rollers.Get sub-roller change IDs (0)",
         )
         + api.step_data(
-            "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
             api.json.output(
                 {
                     "current_revision": "abc",
                     "status": "NEW",
-                    "labels": {},
+                    "labels": {
+                        "Bypass-Presubmit": {},
+                    },
+                }
+            ),
+        )
+    )
+
+    yield (
+        test("bypass-presubmit label does not exist", status="FAILURE")
+        + properties(builder("roller-1"))
+        + simulate_subroller_launch(
+            builds=[result_ci(name="roller-1", id=1000)],
+        )
+        + simulate_get_multi(
+            builds=[
+                result_ci(
+                    name="roller-1",
+                    id=1000,
+                    output_props={
+                        "gerrit_changes": [
+                            {"host": "change_host_1", "change_id": "11111111"}
+                        ]
+                    },
+                )
+            ],
+            launch_step="Launching Rollers.Get sub-roller change IDs (0)",
+        )
+        + api.step_data(
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+            api.json.output(
+                {
+                    "current_revision": "abc",
+                    "status": "NEW",
+                    "labels": {
+                        "Presubmit-Verified": {},
+                    },
                 }
             ),
         )
@@ -566,12 +628,13 @@
             launch_step="Launching Rollers.Get sub-roller change IDs (0)",
         )
         + api.step_data(
-            "Launching Rollers.Wait for Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
+            "Launching Rollers.Wait for Bypass-Presubmit or Presubmit-Verified for roll CLs (0).Get CL details for CL 11111111",
             api.json.output(
                 {
                     "current_revision": "abc",
                     "status": "NEW",
                     "labels": {
+                        "Bypass-Presubmit": {},
                         "Presubmit-Verified": {},
                     },
                 }