Merge remote-tracking branch 'cros/main' into master

The main branch isn't active yet, but a commit landed there by
accident.  The change has also landed on the master branch now,
so Merge the histories so they're in sync again.

BUG=chromium:1159924

Change-Id: Id9be322ca3ac95fdab3fb1cca920d41439d8ae31
diff --git a/OWNERS b/OWNERS
index 66c95ee..98eb462 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,6 +1,7 @@
 include /OWNERS.build
 include /OWNERS.ci
 
+per-file OWNERS.au = file://OWNERS.au
 per-file OWNERS.kernel = file://OWNERS.kernel
 per-file OWNERS.testplatform = file://OWNERS.testplatform
 
diff --git a/OWNERS.au b/OWNERS.au
index 07e51d9..c27c88d 100644
--- a/OWNERS.au
+++ b/OWNERS.au
@@ -6,4 +6,4 @@
 ahassani@chromium.org
 dhaddock@chromium.org
 kimjae@chromium.org
-andrewlassalle@chromium.org
+vyshu@chromium.org
diff --git a/api/api_config.py b/api/api_config.py
index a26f5fa..17801c3 100644
--- a/api/api_config.py
+++ b/api/api_config.py
@@ -90,6 +90,12 @@
   def mock_invalid(self):
     return self._call_type == self.CALL_TYPE_MOCK_INVALID
 
+  @property
+  def run_endpoint(self) -> bool:
+    """Run the endpoint when none of the special calls are invoked."""
+    return (not self.validate_only and not self.mock_call and
+            not self.mock_error and not self.mock_invalid)
+
   def get_proto(self, for_inside_execution=True):
     """Get the config as a proto.
 
diff --git a/api/contrib/call_templates/image__push_image_example_input.json b/api/contrib/call_templates/image__push_image_example_input.json
new file mode 100644
index 0000000..2d0d4f7
--- /dev/null
+++ b/api/contrib/call_templates/image__push_image_example_input.json
@@ -0,0 +1,14 @@
+{
+    "dryrun": true,
+    "gs_image_dir": "gs://chromeos-image-archive/atlas-release/R89-13604.0.0",
+    "sysroot": {
+        "build_target": {
+            "name": "atlas"
+        }
+    },
+    "profile": {
+        "name": "baz"
+    },
+    "sign_types_description": ["IMAGE_TYPE_BASE", "IMAGE_TYPE_RECOVERY"],
+    "sign_types": [1, 6]
+}
diff --git a/api/controller/android.py b/api/controller/android.py
index cb2e2a3..b3fe214 100644
--- a/api/controller/android.py
+++ b/api/controller/android.py
@@ -35,7 +35,7 @@
 
 @faux.success(_MarkStableResponse)
 @faux.empty_error
-@validate.require('tracking_branch', 'package_name', 'android_build_branch')
+@validate.require('package_name', 'android_build_branch')
 @validate.validation_complete
 def MarkStable(input_proto, output_proto, _config):
   """Uprev Android, if able.
diff --git a/api/controller/android_unittest.py b/api/controller/android_unittest.py
index 7fdca0e..2be0ce9 100644
--- a/api/controller/android_unittest.py
+++ b/api/controller/android_unittest.py
@@ -57,13 +57,6 @@
                      'android-package-name')
     self.assertEqual(self.response.android_atom.version, '1.2')
 
-  def testFailsIfTrackingBranchMissing(self):
-    """Fails if tracking_branch is missing."""
-    self.input_proto.tracking_branch = ''
-    with self.assertRaises(cros_build_lib.DieSystemExit):
-      android.MarkStable(self.input_proto, self.response, self.api_config)
-    self.uprev.assert_not_called()
-
   def testFailsIfPackageNameMissing(self):
     """Fails if package_name is missing."""
     self.input_proto.package_name = ''
diff --git a/api/controller/artifacts.py b/api/controller/artifacts.py
index c7c0ccb..3a1def7 100644
--- a/api/controller/artifacts.py
+++ b/api/controller/artifacts.py
@@ -598,3 +598,55 @@
 
   tarball = artifacts.BundleGceTarball(output_dir, image_dir)
   output_proto.artifacts.add().path = tarball
+
+
+def _BundleDebugSymbolsResponse(input_proto, output_proto, _config):
+  """Add artifact tarball to a successful response."""
+  output_proto.artifacts.add().path = os.path.join(input_proto.output_dir,
+                                                   constants.DEBUG_SYMBOLS_TAR)
+
+
+@faux.success(_BundleDebugSymbolsResponse)
+@faux.empty_error
+@validate.require('build_target.name', 'output_dir')
+@validate.exists('output_dir')
+@validate.validation_complete
+def BundleDebugSymbols(input_proto, output_proto, _config):
+  """Bundle the debug symbols into a tarball suitable for importing into GCE.
+
+  Args:
+    input_proto (BundleRequest): The input proto.
+    output_proto (BundleResponse): The output proto.
+    _config (api_config.ApiConfig): The API call config.
+  """
+  target = input_proto.build_target.name
+  output_dir = input_proto.output_dir
+
+  chroot = controller_util.ParseChroot(input_proto.chroot)
+  result = artifacts.GenerateBreakpadSymbols(chroot,
+                                             target,
+                                             debug=True)
+
+  # Verify breakpad symbol generation before gathering the sym files.
+  if result.returncode != 0:
+    return controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY
+
+  with chroot.tempdir() as symbol_tmpdir, chroot.tempdir() as dest_tmpdir:
+    breakpad_dir = os.path.join('/build', target, 'usr/lib/debug/breakpad')
+    sym_file_list = artifacts.GatherSymbolFiles(tempdir=symbol_tmpdir,
+                                                destdir=dest_tmpdir,
+                                                paths=[breakpad_dir])
+    if len(sym_file_list) == 0:
+      logging.warning('No sym files found in %s.', breakpad_dir)
+    # Create tarball from destination_tmp, then copy it...
+    tarball_path = os.path.join(output_dir, constants.DEBUG_SYMBOLS_TAR)
+    result = cros_build_lib.CreateTarball(tarball_path, dest_tmpdir)
+    if result.returncode != 0:
+      logging.error('Error (%d) when creating tarball %s from %s',
+                    result.returncode,
+                    tarball_path,
+                    dest_tmpdir)
+      return controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY
+    output_proto.artifacts.add().path = tarball_path
+
+  return controller.RETURN_CODE_SUCCESS
diff --git a/api/controller/artifacts_unittest.py b/api/controller/artifacts_unittest.py
index 7a0364c..862340a 100644
--- a/api/controller/artifacts_unittest.py
+++ b/api/controller/artifacts_unittest.py
@@ -1130,3 +1130,71 @@
     with self.assertRaises(cros_build_lib.DieSystemExit):
       artifacts.BundleGceTarball(self.target_request, self.response,
                                  self.api_config)
+
+
+class BundleDebugSymbolsTest(BundleTestCase):
+  """Unittests for BundleDebugSymbols."""
+
+  def setUp(self):
+    # Create a chroot_path that also includes a chroot tmp dir.
+    self.chroot_path = os.path.join(self.tempdir, 'chroot_dir')
+    osutils.SafeMakedirs(self.chroot_path)
+    osutils.SafeMakedirs(os.path.join(self.chroot_path, 'tmp'))
+    # Create output dir.
+    output_dir = os.path.join(self.tempdir, 'output_dir')
+    osutils.SafeMakedirs(output_dir)
+    # Build target request.
+    self.target_request = self.BuildTargetRequest(
+        build_target='target',
+        output_dir=self.output_dir,
+        chroot=self.chroot_path)
+
+  def testValidateOnly(self):
+    """Check that a validate only call does not execute any logic."""
+    patch = self.PatchObject(artifacts_svc, 'GenerateBreakpadSymbols')
+    artifacts.BundleDebugSymbols(self.target_request, self.response,
+                                 self.validate_only_config)
+    patch.assert_not_called()
+
+  def testMockCall(self):
+    """Test that a mock call does not execute logic, returns mocked value."""
+    patch = self.PatchObject(artifacts_svc, 'GenerateBreakpadSymbols')
+    artifacts.BundleDebugSymbols(self.target_request, self.response,
+                                 self.mock_call_config)
+    patch.assert_not_called()
+    self.assertEqual(len(self.response.artifacts), 1)
+    self.assertEqual(self.response.artifacts[0].path,
+                     os.path.join(self.output_dir,
+                                  constants.DEBUG_SYMBOLS_TAR))
+
+  def testBundleDebugSymbols(self):
+    """BundleDebugSymbols calls cbuildbot/commands with correct args."""
+    # Patch service layer functions.
+    generate_breakpad_symbols_patch = self.PatchObject(
+        artifacts_svc, 'GenerateBreakpadSymbols',
+        return_value=cros_build_lib.CommandResult(returncode=0, output=''))
+    gather_symbol_files_patch = self.PatchObject(
+        artifacts_svc, 'GatherSymbolFiles',
+        return_value=[artifacts_svc.SymbolFileTuple(
+            source_file_name='path/to/source/file1.sym',
+            relative_path='file1.sym')])
+
+    artifacts.BundleDebugSymbols(self.target_request, self.response,
+                                 self.api_config)
+    # Verify mock objects were called.
+    generate_breakpad_symbols_patch.assert_called()
+    gather_symbol_files_patch.assert_called()
+
+    # Verify response proto contents and output directory contents.
+    self.assertEqual(
+        [artifact.path for artifact in self.response.artifacts],
+        [os.path.join(self.output_dir, constants.DEBUG_SYMBOLS_TAR)])
+    files = os.listdir(self.output_dir)
+    self.assertEqual(files, [constants.DEBUG_SYMBOLS_TAR])
+
+  def testBundleGceTarballNoImageDir(self):
+    """BundleDebugSymbols dies when image dir does not exist."""
+    self.PatchObject(os.path, 'exists', return_value=False)
+    with self.assertRaises(cros_build_lib.DieSystemExit):
+      artifacts.BundleDebugSymbols(self.target_request, self.response,
+                                   self.api_config)
diff --git a/api/controller/image.py b/api/controller/image.py
index bc25c15..0a75bad 100644
--- a/api/controller/image.py
+++ b/api/controller/image.py
@@ -21,10 +21,11 @@
 from chromite.lib import cros_build_lib
 from chromite.lib import constants
 from chromite.lib import image_lib
+from chromite.lib import cros_logging as logging
+from chromite.scripts import pushimage
 from chromite.service import image
 from chromite.utils import metrics
 
-
 # The image.proto ImageType enum ids.
 _BASE_ID = common_pb2.BASE
 _DEV_ID = common_pb2.DEV
@@ -60,6 +61,17 @@
     _TEST_GUEST_VM_ID: _IMAGE_MAPPING[_TEST_ID],
 }
 
+# Supported image types for PushImage.
+SUPPORTED_IMAGE_TYPES = {
+    common_pb2.IMAGE_TYPE_RECOVERY: constants.IMAGE_TYPE_RECOVERY,
+    common_pb2.IMAGE_TYPE_FACTORY: constants.IMAGE_TYPE_FACTORY,
+    common_pb2.IMAGE_TYPE_FIRMWARE: constants.IMAGE_TYPE_FIRMWARE,
+    common_pb2.IMAGE_TYPE_ACCESSORY_USBPD: constants.IMAGE_TYPE_ACCESSORY_USBPD,
+    common_pb2.IMAGE_TYPE_ACCESSORY_RWSIG: constants.IMAGE_TYPE_ACCESSORY_RWSIG,
+    common_pb2.IMAGE_TYPE_BASE: constants.IMAGE_TYPE_BASE,
+    common_pb2.IMAGE_TYPE_GSC_FIRMWARE: constants.IMAGE_TYPE_GSC_FIRMWARE
+}
+
 
 def _CreateResponse(_input_proto, output_proto, _config):
   """Set output_proto success field on a successful Create response."""
@@ -88,8 +100,8 @@
   build_config = _ParseCreateBuildConfig(input_proto)
 
   # Sorted isn't really necessary here, but it's much easier to test.
-  result = image.Build(board=board, images=sorted(list(image_types)),
-                       config=build_config)
+  result = image.Build(
+      board=board, images=sorted(list(image_types)), config=build_config)
 
   output_proto.success = result.success
 
@@ -171,8 +183,11 @@
   disk_layout = input_proto.disk_layout or None
   builder_path = input_proto.builder_path or None
   return image.BuildConfig(
-      enable_rootfs_verification=enable_rootfs_verification, replace=True,
-      version=version, disk_layout=disk_layout, builder_path=builder_path,
+      enable_rootfs_verification=enable_rootfs_verification,
+      replace=True,
+      version=version,
+      disk_layout=disk_layout,
+      builder_path=builder_path,
   )
 
 
@@ -258,3 +273,48 @@
     return controller.RETURN_CODE_SUCCESS
   else:
     return controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY
+
+
+@faux.empty_success
+@faux.empty_completed_unsuccessfully_error
+@validate.require('gs_image_dir', 'sysroot.build_target.name')
+def PushImage(input_proto, _output_proto, config):
+  """Push artifacts from the archive bucket to the release bucket.
+
+  Wraps chromite/scripts/pushimage.py.
+
+  Args:
+    input_proto (PushImageRequest): Input proto.
+    _output_proto (PushImageResponse): Output proto.
+    config (api.config.ApiConfig): The API call config.
+
+  Returns:
+    A controller return code (e.g. controller.RETURN_CODE_SUCCESS).
+  """
+  sign_types = []
+  if input_proto.sign_types:
+    for sign_type in input_proto.sign_types:
+      if sign_type not in SUPPORTED_IMAGE_TYPES:
+        logging.error('unsupported sign type %g', sign_type)
+        return controller.RETURN_CODE_INVALID_INPUT
+      sign_types.append(SUPPORTED_IMAGE_TYPES[sign_type])
+
+  # If configured for validation only we're done here.
+  if config.validate_only:
+    return controller.RETURN_CODE_VALID_INPUT
+
+  kwargs = {}
+  if input_proto.profile.name:
+    kwargs['profile'] = input_proto.profile.name
+  if input_proto.dest_bucket:
+    kwargs['dest_bucket'] = input_proto.dest_bucket
+  try:
+    pushimage.PushImage(
+        input_proto.gs_image_dir,
+        input_proto.sysroot.build_target.name,
+        dry_run=input_proto.dryrun,
+        sign_types=sign_types,
+        **kwargs)
+    return controller.RETURN_CODE_SUCCESS
+  except Exception:
+    return controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY
diff --git a/api/controller/image_unittest.py b/api/controller/image_unittest.py
index 56de3c3..6fabccf 100644
--- a/api/controller/image_unittest.py
+++ b/api/controller/image_unittest.py
@@ -16,11 +16,13 @@
 from chromite.api.controller import image as image_controller
 from chromite.api.gen.chromite.api import image_pb2
 from chromite.api.gen.chromiumos import common_pb2
+from chromite.api.gen.chromite.api import sysroot_pb2
 from chromite.lib import constants
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_test_lib
 from chromite.lib import image_lib
 from chromite.lib import osutils
+from chromite.scripts import pushimage
 from chromite.service import image as image_service
 
 
@@ -30,7 +32,11 @@
   def setUp(self):
     self.response = image_pb2.CreateImageResult()
 
-  def _GetRequest(self, board=None, types=None, version=None, builder_path=None,
+  def _GetRequest(self,
+                  board=None,
+                  types=None,
+                  version=None,
+                  builder_path=None,
                   disable_rootfs_verification=False):
     """Helper to build a request instance."""
     return image_pb2.CreateImageRequest(
@@ -84,8 +90,8 @@
     build_patch = self.PatchObject(image_service, 'Build', return_value=result)
 
     image_controller.Create(request, self.response, self.api_config)
-    build_patch.assert_called_with(images=[constants.IMAGE_TYPE_BASE],
-                                   board='board', config=mock.ANY)
+    build_patch.assert_called_with(
+        images=[constants.IMAGE_TYPE_BASE], board='board', config=mock.ANY)
 
   def testSingleTypeSpecified(self):
     """Test it's properly using a specified type."""
@@ -96,8 +102,8 @@
     build_patch = self.PatchObject(image_service, 'Build', return_value=result)
 
     image_controller.Create(request, self.response, self.api_config)
-    build_patch.assert_called_with(images=[constants.IMAGE_TYPE_DEV],
-                                   board='board', config=mock.ANY)
+    build_patch.assert_called_with(
+        images=[constants.IMAGE_TYPE_DEV], board='board', config=mock.ANY)
 
   def testMultipleAndImpliedTypes(self):
     """Test multiple types and implied type handling."""
@@ -112,8 +118,8 @@
     build_patch = self.PatchObject(image_service, 'Build', return_value=result)
 
     image_controller.Create(request, self.response, self.api_config)
-    build_patch.assert_called_with(images=expected_images, board='board',
-                                   config=mock.ANY)
+    build_patch.assert_called_with(
+        images=expected_images, board='board', config=mock.ANY)
 
   def testFailedPackageHandling(self):
     """Test failed packages are populated correctly."""
@@ -320,3 +326,112 @@
     self.PatchObject(image_service, 'Test', return_value=False)
     image_controller.Test(input_proto, output_proto, self.api_config)
     self.assertFalse(output_proto.success)
+
+
+class PushImageTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
+  """Push image test."""
+
+  def setUp(self):
+    self.response = image_pb2.PushImageResponse()
+
+  def _GetRequest(
+      self,
+      gs_image_dir='gs://chromeos-image-archive/atlas-release/R89-13604.0.0',
+      build_target_name='atlas',
+      profile='foo',
+      sign_types=None,
+      dryrun=True):
+    return image_pb2.PushImageRequest(
+        gs_image_dir=gs_image_dir,
+        sysroot=sysroot_pb2.Sysroot(
+            build_target=common_pb2.BuildTarget(name=build_target_name)),
+        profile=common_pb2.Profile(name=profile),
+        sign_types=sign_types,
+        dryrun=dryrun)
+
+  def testValidateOnly(self):
+    """Check that a validate only call does not execute any logic."""
+    patch = self.PatchObject(pushimage, 'PushImage')
+
+    req = self._GetRequest(sign_types=[
+        common_pb2.IMAGE_TYPE_RECOVERY, common_pb2.IMAGE_TYPE_FACTORY,
+        common_pb2.IMAGE_TYPE_FIRMWARE, common_pb2.IMAGE_TYPE_ACCESSORY_USBPD,
+        common_pb2.IMAGE_TYPE_ACCESSORY_RWSIG, common_pb2.IMAGE_TYPE_BASE,
+        common_pb2.IMAGE_TYPE_GSC_FIRMWARE
+    ])
+    res = image_controller.PushImage(req, self.response,
+                                     self.validate_only_config)
+    patch.assert_not_called()
+    self.assertEqual(res, controller.RETURN_CODE_VALID_INPUT)
+
+  def testValidateOnlyInvalid(self):
+    """Check that validate call rejects invalid sign types."""
+    patch = self.PatchObject(pushimage, 'PushImage')
+
+    # Pass unsupported image type.
+    req = self._GetRequest(sign_types=[common_pb2.IMAGE_TYPE_DLC])
+    res = image_controller.PushImage(req, self.response,
+                                     self.validate_only_config)
+    patch.assert_not_called()
+    self.assertEqual(res, controller.RETURN_CODE_INVALID_INPUT)
+
+  def testMockCall(self):
+    """Test that mock call does not execute any logic, returns mocked value."""
+    patch = self.PatchObject(pushimage, 'PushImage')
+
+    rc = image_controller.PushImage(self._GetRequest(), self.response,
+                                    self.mock_call_config)
+    patch.assert_not_called()
+    self.assertEqual(controller.RETURN_CODE_SUCCESS, rc)
+
+  def testMockError(self):
+    """Test that mock call does not execute any logic, returns error."""
+    patch = self.PatchObject(pushimage, 'PushImage')
+
+    rc = image_controller.PushImage(self._GetRequest(), self.response,
+                                    self.mock_error_config)
+    patch.assert_not_called()
+    self.assertEqual(controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY, rc)
+
+  def testNoBuildTarget(self):
+    """Test no build target given fails."""
+    request = self._GetRequest(build_target_name='')
+
+    # No build target should cause it to fail.
+    with self.assertRaises(cros_build_lib.DieSystemExit):
+      image_controller.PushImage(request, self.response, self.api_config)
+
+  def testNoGsImageDir(self):
+    """Test no image dir given fails."""
+    request = self._GetRequest(gs_image_dir='')
+
+    # No image dir should cause it to fail.
+    with self.assertRaises(cros_build_lib.DieSystemExit):
+      image_controller.PushImage(request, self.response, self.api_config)
+
+  def testCallCorrect(self):
+    """Check that a call is called with the correct parameters."""
+    patch = self.PatchObject(pushimage, 'PushImage')
+
+    request = self._GetRequest(
+        dryrun=False, profile='', sign_types=[common_pb2.IMAGE_TYPE_RECOVERY])
+    request.dest_bucket = 'gs://foo'
+    image_controller.PushImage(request, self.response, self.api_config)
+    patch.assert_called_with(
+        request.gs_image_dir,
+        request.sysroot.build_target.name,
+        dry_run=request.dryrun,
+        sign_types=['recovery'],
+        dest_bucket=request.dest_bucket)
+
+  def testCallSucceeds(self):
+    """Check that a (dry run) call is made successfully."""
+    request = self._GetRequest(sign_types=[common_pb2.IMAGE_TYPE_RECOVERY])
+    res = image_controller.PushImage(request, self.response, self.api_config)
+    self.assertEqual(res, controller.RETURN_CODE_SUCCESS)
+
+  def testCallFailsWithBadImageDir(self):
+    """Check that a (dry run) call fails when given a bad gs_image_dir."""
+    request = self._GetRequest(gs_image_dir='foo')
+    res = image_controller.PushImage(request, self.response, self.api_config)
+    self.assertEqual(res, controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY)
diff --git a/api/gen/chromite/api/build_api_test_pb2.py b/api/gen/chromite/api/build_api_test_pb2.py
index b7dc231..224f6e3 100644
--- a/api/gen/chromite/api/build_api_test_pb2.py
+++ b/api/gen/chromite/api/build_api_test_pb2.py
@@ -3,6 +3,7 @@
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf.internal import enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
@@ -22,10 +23,45 @@
   package='chromite.api',
   syntax='proto3',
   serialized_options=_b('Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api'),
-  serialized_pb=_b('\n!chromite/api/build_api_test.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\x1a\x18\x63hromiumos/metrics.proto\",\n\nNestedPath\x12\x1e\n\x04path\x18\x01 \x01(\x0b\x32\x10.chromiumos.Path\";\n\x11MultiFieldMessage\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04\x66lag\x18\x03 \x01(\x08\"\xd1\x03\n\x12TestRequestMessage\x12\n\n\x02id\x18\x01 \x01(\t\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12\x1e\n\x04path\x18\x03 \x01(\x0b\x32\x10.chromiumos.Path\x12&\n\x0c\x61nother_path\x18\x04 \x01(\x0b\x32\x10.chromiumos.Path\x12-\n\x0bnested_path\x18\x05 \x01(\x0b\x32\x18.chromite.api.NestedPath\x12+\n\x0bresult_path\x18\x06 \x01(\x0b\x32\x16.chromiumos.ResultPath\x12-\n\x0c\x62uild_target\x18\x07 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12.\n\rbuild_targets\x18\x08 \x03(\x0b\x32\x17.chromiumos.BuildTarget\x12)\n\nsynced_dir\x18\t \x01(\x0b\x32\x15.chromiumos.SyncedDir\x12*\n\x0bsynced_dirs\x18\n \x03(\x0b\x32\x15.chromiumos.SyncedDir\x12\x31\n\x08messages\x18\x0b \x03(\x0b\x32\x1f.chromite.api.MultiFieldMessage\"\xc8\x01\n\x11TestResultMessage\x12\x0e\n\x06result\x18\x01 \x01(\t\x12\"\n\x08\x61rtifact\x18\x02 \x01(\x0b\x32\x10.chromiumos.Path\x12\x31\n\x0fnested_artifact\x18\x03 \x01(\x0b\x32\x18.chromite.api.NestedPath\x12#\n\tartifacts\x18\x04 \x03(\x0b\x32\x10.chromiumos.Path\x12\'\n\x06\x65vents\x18\x05 \x03(\x0b\x32\x17.chromiumos.MetricEvent2\xe5\x01\n\x0eTestApiService\x12V\n\x11InputOutputMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\x12\x65\n\rRenamedMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\"\x11\xc2\xed\x1a\r\n\x0b\x43orrectName\x1a\x14\xc2\xed\x1a\x10\n\x0e\x62uild_api_test2\xf9\x01\n\x16InsideChrootApiService\x12^\n\x19InsideServiceInsideMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\x12g\n\x1aInsideServiceOutsideMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\"\x06\xc2\xed\x1a\x02\x10\x02\x1a\x16\xc2\xed\x1a\x12\n\x0e\x62uild_api_test\x10\x01\x32\xfc\x01\n\x17OutsideChrootApiService\x12`\n\x1bOutsideServiceOutsideMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\x12g\n\x1aOutsideServiceInsideMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\"\x06\xc2\xed\x1a\x02\x10\x01\x1a\x16\xc2\xed\x1a\x12\n\x0e\x62uild_api_test\x10\x02\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
+  serialized_pb=_b('\n!chromite/api/build_api_test.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\x1a\x18\x63hromiumos/metrics.proto\",\n\nNestedPath\x12\x1e\n\x04path\x18\x01 \x01(\x0b\x32\x10.chromiumos.Path\"f\n\x11MultiFieldMessage\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04\x66lag\x18\x03 \x01(\x08\x12)\n\ttest_enum\x18\x04 \x01(\x0e\x32\x16.chromite.api.TestEnum\"\xc9\x04\n\x12TestRequestMessage\x12\n\n\x02id\x18\x01 \x01(\t\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12\x1e\n\x04path\x18\x03 \x01(\x0b\x32\x10.chromiumos.Path\x12&\n\x0c\x61nother_path\x18\x04 \x01(\x0b\x32\x10.chromiumos.Path\x12-\n\x0bnested_path\x18\x05 \x01(\x0b\x32\x18.chromite.api.NestedPath\x12+\n\x0bresult_path\x18\x06 \x01(\x0b\x32\x16.chromiumos.ResultPath\x12-\n\x0c\x62uild_target\x18\x07 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12.\n\rbuild_targets\x18\x08 \x03(\x0b\x32\x17.chromiumos.BuildTarget\x12)\n\nsynced_dir\x18\t \x01(\x0b\x32\x15.chromiumos.SyncedDir\x12*\n\x0bsynced_dirs\x18\n \x03(\x0b\x32\x15.chromiumos.SyncedDir\x12\x31\n\x08messages\x18\x0b \x03(\x0b\x32\x1f.chromite.api.MultiFieldMessage\x12)\n\ttest_enum\x18\x0c \x01(\x0e\x32\x16.chromite.api.TestEnum\x12*\n\ntest_enums\x18\r \x03(\x0e\x32\x16.chromite.api.TestEnum\x12\x0e\n\x06number\x18\x0e \x01(\x05\x12\x0f\n\x07numbers\x18\x0f \x03(\x05\"\xc8\x01\n\x11TestResultMessage\x12\x0e\n\x06result\x18\x01 \x01(\t\x12\"\n\x08\x61rtifact\x18\x02 \x01(\x0b\x32\x10.chromiumos.Path\x12\x31\n\x0fnested_artifact\x18\x03 \x01(\x0b\x32\x18.chromite.api.NestedPath\x12#\n\tartifacts\x18\x04 \x03(\x0b\x32\x10.chromiumos.Path\x12\'\n\x06\x65vents\x18\x05 \x03(\x0b\x32\x17.chromiumos.MetricEvent*^\n\x08TestEnum\x12\x19\n\x15TEST_ENUM_UNSPECIFIED\x10\x00\x12\x11\n\rTEST_ENUM_FOO\x10\x01\x12\x11\n\rTEST_ENUM_BAR\x10\x02\x12\x11\n\rTEST_ENUM_BAZ\x10\x03\x32\xe5\x01\n\x0eTestApiService\x12V\n\x11InputOutputMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\x12\x65\n\rRenamedMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\"\x11\xc2\xed\x1a\r\n\x0b\x43orrectName\x1a\x14\xc2\xed\x1a\x10\n\x0e\x62uild_api_test2\xf9\x01\n\x16InsideChrootApiService\x12^\n\x19InsideServiceInsideMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\x12g\n\x1aInsideServiceOutsideMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\"\x06\xc2\xed\x1a\x02\x10\x02\x1a\x16\xc2\xed\x1a\x12\n\x0e\x62uild_api_test\x10\x01\x32\xfc\x01\n\x17OutsideChrootApiService\x12`\n\x1bOutsideServiceOutsideMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\x12g\n\x1aOutsideServiceInsideMethod\x12 .chromite.api.TestRequestMessage\x1a\x1f.chromite.api.TestResultMessage\"\x06\xc2\xed\x1a\x02\x10\x01\x1a\x16\xc2\xed\x1a\x12\n\x0e\x62uild_api_test\x10\x02\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
   ,
   dependencies=[chromite_dot_api_dot_build__api__pb2.DESCRIPTOR,chromiumos_dot_common__pb2.DESCRIPTOR,chromiumos_dot_metrics__pb2.DESCRIPTOR,])
 
+_TESTENUM = _descriptor.EnumDescriptor(
+  name='TestEnum',
+  full_name='chromite.api.TestEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='TEST_ENUM_UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TEST_ENUM_FOO', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TEST_ENUM_BAR', index=2, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TEST_ENUM_BAZ', index=3, number=3,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1073,
+  serialized_end=1167,
+)
+_sym_db.RegisterEnumDescriptor(_TESTENUM)
+
+TestEnum = enum_type_wrapper.EnumTypeWrapper(_TESTENUM)
+TEST_ENUM_UNSPECIFIED = 0
+TEST_ENUM_FOO = 1
+TEST_ENUM_BAR = 2
+TEST_ENUM_BAZ = 3
 
 
 
@@ -88,6 +124,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='test_enum', full_name='chromite.api.MultiFieldMessage.test_enum', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -101,7 +144,7 @@
   oneofs=[
   ],
   serialized_start=178,
-  serialized_end=237,
+  serialized_end=280,
 )
 
 
@@ -189,6 +232,34 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='test_enum', full_name='chromite.api.TestRequestMessage.test_enum', index=11,
+      number=12, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='test_enums', full_name='chromite.api.TestRequestMessage.test_enums', index=12,
+      number=13, type=14, cpp_type=8, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='number', full_name='chromite.api.TestRequestMessage.number', index=13,
+      number=14, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='numbers', full_name='chromite.api.TestRequestMessage.numbers', index=14,
+      number=15, type=5, cpp_type=1, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -201,8 +272,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=240,
-  serialized_end=705,
+  serialized_start=283,
+  serialized_end=868,
 )
 
 
@@ -260,11 +331,12 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=708,
-  serialized_end=908,
+  serialized_start=871,
+  serialized_end=1071,
 )
 
 _NESTEDPATH.fields_by_name['path'].message_type = chromiumos_dot_common__pb2._PATH
+_MULTIFIELDMESSAGE.fields_by_name['test_enum'].enum_type = _TESTENUM
 _TESTREQUESTMESSAGE.fields_by_name['chroot'].message_type = chromiumos_dot_common__pb2._CHROOT
 _TESTREQUESTMESSAGE.fields_by_name['path'].message_type = chromiumos_dot_common__pb2._PATH
 _TESTREQUESTMESSAGE.fields_by_name['another_path'].message_type = chromiumos_dot_common__pb2._PATH
@@ -275,6 +347,8 @@
 _TESTREQUESTMESSAGE.fields_by_name['synced_dir'].message_type = chromiumos_dot_common__pb2._SYNCEDDIR
 _TESTREQUESTMESSAGE.fields_by_name['synced_dirs'].message_type = chromiumos_dot_common__pb2._SYNCEDDIR
 _TESTREQUESTMESSAGE.fields_by_name['messages'].message_type = _MULTIFIELDMESSAGE
+_TESTREQUESTMESSAGE.fields_by_name['test_enum'].enum_type = _TESTENUM
+_TESTREQUESTMESSAGE.fields_by_name['test_enums'].enum_type = _TESTENUM
 _TESTRESULTMESSAGE.fields_by_name['artifact'].message_type = chromiumos_dot_common__pb2._PATH
 _TESTRESULTMESSAGE.fields_by_name['nested_artifact'].message_type = _NESTEDPATH
 _TESTRESULTMESSAGE.fields_by_name['artifacts'].message_type = chromiumos_dot_common__pb2._PATH
@@ -283,6 +357,7 @@
 DESCRIPTOR.message_types_by_name['MultiFieldMessage'] = _MULTIFIELDMESSAGE
 DESCRIPTOR.message_types_by_name['TestRequestMessage'] = _TESTREQUESTMESSAGE
 DESCRIPTOR.message_types_by_name['TestResultMessage'] = _TESTRESULTMESSAGE
+DESCRIPTOR.enum_types_by_name['TestEnum'] = _TESTENUM
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 NestedPath = _reflection.GeneratedProtocolMessageType('NestedPath', (_message.Message,), dict(
@@ -322,8 +397,8 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=_b('\302\355\032\020\n\016build_api_test'),
-  serialized_start=911,
-  serialized_end=1140,
+  serialized_start=1170,
+  serialized_end=1399,
   methods=[
   _descriptor.MethodDescriptor(
     name='InputOutputMethod',
@@ -355,8 +430,8 @@
   file=DESCRIPTOR,
   index=1,
   serialized_options=_b('\302\355\032\022\n\016build_api_test\020\001'),
-  serialized_start=1143,
-  serialized_end=1392,
+  serialized_start=1402,
+  serialized_end=1651,
   methods=[
   _descriptor.MethodDescriptor(
     name='InsideServiceInsideMethod',
@@ -388,8 +463,8 @@
   file=DESCRIPTOR,
   index=2,
   serialized_options=_b('\302\355\032\022\n\016build_api_test\020\002'),
-  serialized_start=1395,
-  serialized_end=1647,
+  serialized_start=1654,
+  serialized_end=1906,
   methods=[
   _descriptor.MethodDescriptor(
     name='OutsideServiceOutsideMethod',
diff --git a/api/gen/chromite/api/image_pb2.py b/api/gen/chromite/api/image_pb2.py
index 2217d48..32c0063 100644
--- a/api/gen/chromite/api/image_pb2.py
+++ b/api/gen/chromite/api/image_pb2.py
@@ -13,6 +13,7 @@
 
 
 from chromite.api.gen.chromite.api import build_api_pb2 as chromite_dot_api_dot_build__api__pb2
+from chromite.api.gen.chromite.api import sysroot_pb2 as chromite_dot_api_dot_sysroot__pb2
 from chromite.api.gen.chromiumos import common_pb2 as chromiumos_dot_common__pb2
 from chromite.api.gen.chromiumos import metrics_pb2 as chromiumos_dot_metrics__pb2
 
@@ -22,9 +23,9 @@
   package='chromite.api',
   syntax='proto3',
   serialized_options=_b('Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api'),
-  serialized_pb=_b('\n\x18\x63hromite/api/image.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\x1a\x18\x63hromiumos/metrics.proto\"i\n\x05Image\x12\x0c\n\x04path\x18\x01 \x01(\t\x12#\n\x04type\x18\x02 \x01(\x0e\x32\x15.chromiumos.ImageType\x12-\n\x0c\x62uild_target\x18\x03 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"\xf4\x01\n\x12\x43reateImageRequest\x12-\n\x0c\x62uild_target\x18\x01 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12*\n\x0bimage_types\x18\x02 \x03(\x0e\x32\x15.chromiumos.ImageType\x12#\n\x1b\x64isable_rootfs_verification\x18\x03 \x01(\x08\x12\x0f\n\x07version\x18\x04 \x01(\t\x12\x13\n\x0b\x64isk_layout\x18\x05 \x01(\t\x12\x14\n\x0c\x62uilder_path\x18\x06 \x01(\t\x12\"\n\x06\x63hroot\x18\x07 \x01(\x0b\x32\x12.chromiumos.Chroot\"\xa4\x01\n\x11\x43reateImageResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12#\n\x06images\x18\x02 \x03(\x0b\x32\x13.chromite.api.Image\x12\x30\n\x0f\x66\x61iled_packages\x18\x03 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12\'\n\x06\x65vents\x18\x04 \x03(\x0b\x32\x17.chromiumos.MetricEvent\"\xdd\x01\n\x10TestImageRequest\x12\"\n\x05image\x18\x01 \x01(\x0b\x32\x13.chromite.api.Image\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x35\n\x06result\x18\x03 \x01(\x0b\x32%.chromite.api.TestImageRequest.Result\x12\"\n\x06\x63hroot\x18\x04 \x01(\x0b\x32\x12.chromiumos.Chroot\x1a\x1b\n\x06Result\x12\x11\n\tdirectory\x18\x01 \x01(\t\"\"\n\x0fTestImageResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\x32\xfe\x01\n\x0cImageService\x12K\n\x06\x43reate\x12 .chromite.api.CreateImageRequest\x1a\x1f.chromite.api.CreateImageResult\x12\x45\n\x04Test\x12\x1e.chromite.api.TestImageRequest\x1a\x1d.chromite.api.TestImageResult\x12K\n\nSignerTest\x12\x1e.chromite.api.TestImageRequest\x1a\x1d.chromite.api.TestImageResult\x1a\r\xc2\xed\x1a\t\n\x05image\x10\x01\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
+  serialized_pb=_b('\n\x18\x63hromite/api/image.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x1a\x63hromite/api/sysroot.proto\x1a\x17\x63hromiumos/common.proto\x1a\x18\x63hromiumos/metrics.proto\"i\n\x05Image\x12\x0c\n\x04path\x18\x01 \x01(\t\x12#\n\x04type\x18\x02 \x01(\x0e\x32\x15.chromiumos.ImageType\x12-\n\x0c\x62uild_target\x18\x03 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"\xf4\x01\n\x12\x43reateImageRequest\x12-\n\x0c\x62uild_target\x18\x01 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12*\n\x0bimage_types\x18\x02 \x03(\x0e\x32\x15.chromiumos.ImageType\x12#\n\x1b\x64isable_rootfs_verification\x18\x03 \x01(\x08\x12\x0f\n\x07version\x18\x04 \x01(\t\x12\x13\n\x0b\x64isk_layout\x18\x05 \x01(\t\x12\x14\n\x0c\x62uilder_path\x18\x06 \x01(\t\x12\"\n\x06\x63hroot\x18\x07 \x01(\x0b\x32\x12.chromiumos.Chroot\"\xa4\x01\n\x11\x43reateImageResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12#\n\x06images\x18\x02 \x03(\x0b\x32\x13.chromite.api.Image\x12\x30\n\x0f\x66\x61iled_packages\x18\x03 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12\'\n\x06\x65vents\x18\x04 \x03(\x0b\x32\x17.chromiumos.MetricEvent\"\xdd\x01\n\x10TestImageRequest\x12\"\n\x05image\x18\x01 \x01(\x0b\x32\x13.chromite.api.Image\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x35\n\x06result\x18\x03 \x01(\x0b\x32%.chromite.api.TestImageRequest.Result\x12\"\n\x06\x63hroot\x18\x04 \x01(\x0b\x32\x12.chromiumos.Chroot\x1a\x1b\n\x06Result\x12\x11\n\tdirectory\x18\x01 \x01(\t\"\"\n\x0fTestImageResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\xea\x01\n\x10PushImageRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12\x0e\n\x06\x64ryrun\x18\x02 \x01(\x08\x12\x14\n\x0cgs_image_dir\x18\x03 \x01(\t\x12&\n\x07sysroot\x18\x04 \x01(\x0b\x32\x15.chromite.api.Sysroot\x12$\n\x07profile\x18\x05 \x01(\x0b\x32\x13.chromiumos.Profile\x12)\n\nsign_types\x18\x06 \x03(\x0e\x32\x15.chromiumos.ImageType\x12\x13\n\x0b\x64\x65st_bucket\x18\x07 \x01(\t\"\x13\n\x11PushImageResponse2\xcc\x02\n\x0cImageService\x12K\n\x06\x43reate\x12 .chromite.api.CreateImageRequest\x1a\x1f.chromite.api.CreateImageResult\x12\x45\n\x04Test\x12\x1e.chromite.api.TestImageRequest\x1a\x1d.chromite.api.TestImageResult\x12K\n\nSignerTest\x12\x1e.chromite.api.TestImageRequest\x1a\x1d.chromite.api.TestImageResult\x12L\n\tPushImage\x12\x1e.chromite.api.PushImageRequest\x1a\x1f.chromite.api.PushImageResponse\x1a\r\xc2\xed\x1a\t\n\x05image\x10\x01\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
   ,
-  dependencies=[chromite_dot_api_dot_build__api__pb2.DESCRIPTOR,chromiumos_dot_common__pb2.DESCRIPTOR,chromiumos_dot_metrics__pb2.DESCRIPTOR,])
+  dependencies=[chromite_dot_api_dot_build__api__pb2.DESCRIPTOR,chromite_dot_api_dot_sysroot__pb2.DESCRIPTOR,chromiumos_dot_common__pb2.DESCRIPTOR,chromiumos_dot_metrics__pb2.DESCRIPTOR,])
 
 
 
@@ -69,8 +70,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=123,
-  serialized_end=228,
+  serialized_start=151,
+  serialized_end=256,
 )
 
 
@@ -142,8 +143,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=231,
-  serialized_end=475,
+  serialized_start=259,
+  serialized_end=503,
 )
 
 
@@ -194,8 +195,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=478,
-  serialized_end=642,
+  serialized_start=506,
+  serialized_end=670,
 )
 
 
@@ -225,8 +226,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=839,
-  serialized_end=866,
+  serialized_start=867,
+  serialized_end=894,
 )
 
 _TESTIMAGEREQUEST = _descriptor.Descriptor(
@@ -276,8 +277,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=645,
-  serialized_end=866,
+  serialized_start=673,
+  serialized_end=894,
 )
 
 
@@ -307,8 +308,105 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=868,
-  serialized_end=902,
+  serialized_start=896,
+  serialized_end=930,
+)
+
+
+_PUSHIMAGEREQUEST = _descriptor.Descriptor(
+  name='PushImageRequest',
+  full_name='chromite.api.PushImageRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='chroot', full_name='chromite.api.PushImageRequest.chroot', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='dryrun', full_name='chromite.api.PushImageRequest.dryrun', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='gs_image_dir', full_name='chromite.api.PushImageRequest.gs_image_dir', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sysroot', full_name='chromite.api.PushImageRequest.sysroot', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='profile', full_name='chromite.api.PushImageRequest.profile', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sign_types', full_name='chromite.api.PushImageRequest.sign_types', index=5,
+      number=6, type=14, cpp_type=8, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='dest_bucket', full_name='chromite.api.PushImageRequest.dest_bucket', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=933,
+  serialized_end=1167,
+)
+
+
+_PUSHIMAGERESPONSE = _descriptor.Descriptor(
+  name='PushImageResponse',
+  full_name='chromite.api.PushImageResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1169,
+  serialized_end=1188,
 )
 
 _IMAGE.fields_by_name['type'].enum_type = chromiumos_dot_common__pb2._IMAGETYPE
@@ -324,11 +422,17 @@
 _TESTIMAGEREQUEST.fields_by_name['build_target'].message_type = chromiumos_dot_common__pb2._BUILDTARGET
 _TESTIMAGEREQUEST.fields_by_name['result'].message_type = _TESTIMAGEREQUEST_RESULT
 _TESTIMAGEREQUEST.fields_by_name['chroot'].message_type = chromiumos_dot_common__pb2._CHROOT
+_PUSHIMAGEREQUEST.fields_by_name['chroot'].message_type = chromiumos_dot_common__pb2._CHROOT
+_PUSHIMAGEREQUEST.fields_by_name['sysroot'].message_type = chromite_dot_api_dot_sysroot__pb2._SYSROOT
+_PUSHIMAGEREQUEST.fields_by_name['profile'].message_type = chromiumos_dot_common__pb2._PROFILE
+_PUSHIMAGEREQUEST.fields_by_name['sign_types'].enum_type = chromiumos_dot_common__pb2._IMAGETYPE
 DESCRIPTOR.message_types_by_name['Image'] = _IMAGE
 DESCRIPTOR.message_types_by_name['CreateImageRequest'] = _CREATEIMAGEREQUEST
 DESCRIPTOR.message_types_by_name['CreateImageResult'] = _CREATEIMAGERESULT
 DESCRIPTOR.message_types_by_name['TestImageRequest'] = _TESTIMAGEREQUEST
 DESCRIPTOR.message_types_by_name['TestImageResult'] = _TESTIMAGERESULT
+DESCRIPTOR.message_types_by_name['PushImageRequest'] = _PUSHIMAGEREQUEST
+DESCRIPTOR.message_types_by_name['PushImageResponse'] = _PUSHIMAGERESPONSE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 Image = _reflection.GeneratedProtocolMessageType('Image', (_message.Message,), dict(
@@ -374,6 +478,20 @@
   ))
 _sym_db.RegisterMessage(TestImageResult)
 
+PushImageRequest = _reflection.GeneratedProtocolMessageType('PushImageRequest', (_message.Message,), dict(
+  DESCRIPTOR = _PUSHIMAGEREQUEST,
+  __module__ = 'chromite.api.image_pb2'
+  # @@protoc_insertion_point(class_scope:chromite.api.PushImageRequest)
+  ))
+_sym_db.RegisterMessage(PushImageRequest)
+
+PushImageResponse = _reflection.GeneratedProtocolMessageType('PushImageResponse', (_message.Message,), dict(
+  DESCRIPTOR = _PUSHIMAGERESPONSE,
+  __module__ = 'chromite.api.image_pb2'
+  # @@protoc_insertion_point(class_scope:chromite.api.PushImageResponse)
+  ))
+_sym_db.RegisterMessage(PushImageResponse)
+
 
 DESCRIPTOR._options = None
 
@@ -383,8 +501,8 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=_b('\302\355\032\t\n\005image\020\001'),
-  serialized_start=905,
-  serialized_end=1159,
+  serialized_start=1191,
+  serialized_end=1523,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
@@ -413,6 +531,15 @@
     output_type=_TESTIMAGERESULT,
     serialized_options=None,
   ),
+  _descriptor.MethodDescriptor(
+    name='PushImage',
+    full_name='chromite.api.ImageService.PushImage',
+    index=3,
+    containing_service=None,
+    input_type=_PUSHIMAGEREQUEST,
+    output_type=_PUSHIMAGERESPONSE,
+    serialized_options=None,
+  ),
 ])
 _sym_db.RegisterServiceDescriptor(_IMAGESERVICE)
 
diff --git a/api/gen/chromiumos/bot_scaling_pb2.py b/api/gen/chromiumos/bot_scaling_pb2.py
index d03714e..81d61e6 100644
--- a/api/gen/chromiumos/bot_scaling_pb2.py
+++ b/api/gen/chromiumos/bot_scaling_pb2.py
@@ -19,7 +19,7 @@
   package='chromiumos',
   syntax='proto3',
   serialized_options=_b('Z4go.chromium.org/chromiumos/infra/proto/go/chromiumos'),
-  serialized_pb=_b('\n\x1c\x63hromiumos/bot_scaling.proto\x12\nchromiumos\"Z\n\x07\x42otType\x12\x10\n\x08\x62ot_size\x18\x01 \x01(\t\x12\x15\n\rcores_per_bot\x18\x02 \x01(\x02\x12\x13\n\x0bhourly_cost\x18\x03 \x01(\x02\x12\x11\n\tmemory_gb\x18\x04 \x01(\x02\"@\n\x11SwarmingDimension\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x0e\n\x06values\x18\x03 \x03(\t\"\xff\x05\n\tBotPolicy\x12\x11\n\tbot_group\x18\x01 \x01(\t\x12%\n\x08\x62ot_type\x18\x02 \x01(\x0b\x32\x13.chromiumos.BotType\x12\x45\n\x13scaling_restriction\x18\x03 \x01(\x0b\x32(.chromiumos.BotPolicy.ScalingRestriction\x12\x44\n\x13region_restrictions\x18\x04 \x03(\x0b\x32\'.chromiumos.BotPolicy.RegionRestriction\x12:\n\x13swarming_dimensions\x18\x05 \x03(\x0b\x32\x1d.chromiumos.SwarmingDimension\x12/\n\x0bpolicy_mode\x18\x06 \x01(\x0e\x32\x1a.chromiumos.BotPolicy.Mode\x12\x16\n\x0elookback_hours\x18\x07 \x01(\x11\x12:\n\x0cscaling_mode\x18\x08 \x01(\x0e\x32$.chromiumos.BotPolicy.BotScalingMode\x12\x19\n\x11swarming_instance\x18\t \x01(\t\x12\x13\n\x0b\x61pplication\x18\n \x01(\t\x1aw\n\x12ScalingRestriction\x12\x13\n\x0b\x62ot_ceiling\x18\x01 \x01(\x05\x12\x11\n\tbot_floor\x18\x02 \x01(\x05\x12\x10\n\x08min_idle\x18\x03 \x01(\x05\x12\x11\n\tstep_size\x18\x04 \x01(\x05\x12\x14\n\x0c\x62ot_fallback\x18\x05 \x01(\x05\x1a\x43\n\x11RegionRestriction\x12\x0e\n\x06region\x18\x01 \x01(\t\x12\x0e\n\x06prefix\x18\x02 \x01(\t\x12\x0e\n\x06weight\x18\x03 \x01(\x02\"7\n\x04Mode\x12\x10\n\x0cUNKNOWN_MODE\x10\x00\x12\r\n\tMONITORED\x10\x01\x12\x0e\n\nCONFIGURED\x10\x02\"C\n\x0e\x42otScalingMode\x12\x18\n\x14UNKNOWN_SCALING_MODE\x10\x00\x12\x0b\n\x07STEPPED\x10\x01\x12\n\n\x06\x44\x45MAND\x10\x02\";\n\x0c\x42otPolicyCfg\x12+\n\x0c\x62ot_policies\x18\x01 \x03(\x0b\x32\x15.chromiumos.BotPolicy\"\xab\x03\n\rScalingAction\x12\x11\n\tbot_group\x18\x01 \x01(\t\x12%\n\x08\x62ot_type\x18\x02 \x01(\x0b\x32\x13.chromiumos.BotType\x12\x38\n\nactionable\x18\x03 \x01(\x0e\x32$.chromiumos.ScalingAction.Actionable\x12\x16\n\x0e\x62ots_requested\x18\x04 \x01(\x05\x12\x42\n\x10regional_actions\x18\x05 \x03(\x0b\x32(.chromiumos.ScalingAction.RegionalAction\x12\x19\n\x11\x65stimated_savings\x18\x06 \x01(\x02\x12\x0f\n\x07\x62ot_min\x18\x07 \x01(\x05\x12\x0f\n\x07\x62ot_max\x18\x08 \x01(\x05\x12\x13\n\x0b\x61pplication\x18\t \x01(\t\x1aH\n\x0eRegionalAction\x12\x0e\n\x06region\x18\x01 \x01(\t\x12\x0e\n\x06prefix\x18\x02 \x01(\t\x12\x16\n\x0e\x62ots_requested\x18\x03 \x01(\x05\".\n\nActionable\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x07\n\x03YES\x10\x01\x12\x06\n\x02NO\x10\x02\"v\n\x13ResourceUtilization\x12\x0e\n\x06region\x18\x01 \x01(\t\x12\x0b\n\x03vms\x18\x02 \x01(\x05\x12\x0c\n\x04\x63pus\x18\x03 \x01(\x02\x12\x11\n\tmemory_gb\x18\x04 \x01(\x02\x12\x0f\n\x07\x64isk_gb\x18\x05 \x01(\x02\x12\x10\n\x08max_cpus\x18\x06 \x01(\x02\"l\n\x16\x41pplicationUtilization\x12\x13\n\x0b\x61pplication\x18\x01 \x01(\t\x12=\n\x14resource_utilization\x18\x02 \x03(\x0b\x32\x1f.chromiumos.ResourceUtilization\"\xca\x01\n\x0eRoboCropAction\x12\x32\n\x0fscaling_actions\x18\x01 \x03(\x0b\x32\x19.chromiumos.ScalingAction\x12=\n\x14resource_utilization\x18\x02 \x03(\x0b\x32\x1f.chromiumos.ResourceUtilization\x12\x45\n\x19\x61ppl_resource_utilization\x18\x03 \x03(\x0b\x32\".chromiumos.ApplicationUtilizationB6Z4go.chromium.org/chromiumos/infra/proto/go/chromiumosb\x06proto3')
+  serialized_pb=_b('\n\x1c\x63hromiumos/bot_scaling.proto\x12\nchromiumos\"Z\n\x07\x42otType\x12\x10\n\x08\x62ot_size\x18\x01 \x01(\t\x12\x15\n\rcores_per_bot\x18\x02 \x01(\x02\x12\x13\n\x0bhourly_cost\x18\x03 \x01(\x02\x12\x11\n\tmemory_gb\x18\x04 \x01(\x02\"@\n\x11SwarmingDimension\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x0e\n\x06values\x18\x03 \x03(\t\"\x95\x06\n\tBotPolicy\x12\x11\n\tbot_group\x18\x01 \x01(\t\x12%\n\x08\x62ot_type\x18\x02 \x01(\x0b\x32\x13.chromiumos.BotType\x12\x45\n\x13scaling_restriction\x18\x03 \x01(\x0b\x32(.chromiumos.BotPolicy.ScalingRestriction\x12\x44\n\x13region_restrictions\x18\x04 \x03(\x0b\x32\'.chromiumos.BotPolicy.RegionRestriction\x12:\n\x13swarming_dimensions\x18\x05 \x03(\x0b\x32\x1d.chromiumos.SwarmingDimension\x12/\n\x0bpolicy_mode\x18\x06 \x01(\x0e\x32\x1a.chromiumos.BotPolicy.Mode\x12\x16\n\x0elookback_hours\x18\x07 \x01(\x11\x12:\n\x0cscaling_mode\x18\x08 \x01(\x0e\x32$.chromiumos.BotPolicy.BotScalingMode\x12\x19\n\x11swarming_instance\x18\t \x01(\t\x12\x13\n\x0b\x61pplication\x18\n \x01(\t\x1aw\n\x12ScalingRestriction\x12\x13\n\x0b\x62ot_ceiling\x18\x01 \x01(\x05\x12\x11\n\tbot_floor\x18\x02 \x01(\x05\x12\x10\n\x08min_idle\x18\x03 \x01(\x05\x12\x11\n\tstep_size\x18\x04 \x01(\x05\x12\x14\n\x0c\x62ot_fallback\x18\x05 \x01(\x05\x1a\x43\n\x11RegionRestriction\x12\x0e\n\x06region\x18\x01 \x01(\t\x12\x0e\n\x06prefix\x18\x02 \x01(\t\x12\x0e\n\x06weight\x18\x03 \x01(\x02\"7\n\x04Mode\x12\x10\n\x0cUNKNOWN_MODE\x10\x00\x12\r\n\tMONITORED\x10\x01\x12\x0e\n\nCONFIGURED\x10\x02\"Y\n\x0e\x42otScalingMode\x12\x18\n\x14UNKNOWN_SCALING_MODE\x10\x00\x12\x0b\n\x07STEPPED\x10\x01\x12\n\n\x06\x44\x45MAND\x10\x02\x12\x14\n\x10STEPPED_DECREASE\x10\x03\";\n\x0c\x42otPolicyCfg\x12+\n\x0c\x62ot_policies\x18\x01 \x03(\x0b\x32\x15.chromiumos.BotPolicy\"\xbd\x01\n\x10ReducedBotPolicy\x12\x11\n\tbot_group\x18\x01 \x01(\t\x12%\n\x08\x62ot_type\x18\x02 \x01(\x0b\x32\x13.chromiumos.BotType\x12\x36\n\x0bpolicy_mode\x18\x03 \x01(\x0e\x32!.chromiumos.ReducedBotPolicy.Mode\"7\n\x04Mode\x12\x10\n\x0cUNKNOWN_MODE\x10\x00\x12\r\n\tMONITORED\x10\x01\x12\x0e\n\nCONFIGURED\x10\x02\"I\n\x13ReducedBotPolicyCfg\x12\x32\n\x0c\x62ot_policies\x18\x01 \x03(\x0b\x32\x1c.chromiumos.ReducedBotPolicy\"\xab\x03\n\rScalingAction\x12\x11\n\tbot_group\x18\x01 \x01(\t\x12%\n\x08\x62ot_type\x18\x02 \x01(\x0b\x32\x13.chromiumos.BotType\x12\x38\n\nactionable\x18\x03 \x01(\x0e\x32$.chromiumos.ScalingAction.Actionable\x12\x16\n\x0e\x62ots_requested\x18\x04 \x01(\x05\x12\x42\n\x10regional_actions\x18\x05 \x03(\x0b\x32(.chromiumos.ScalingAction.RegionalAction\x12\x19\n\x11\x65stimated_savings\x18\x06 \x01(\x02\x12\x0f\n\x07\x62ot_min\x18\x07 \x01(\x05\x12\x0f\n\x07\x62ot_max\x18\x08 \x01(\x05\x12\x13\n\x0b\x61pplication\x18\t \x01(\t\x1aH\n\x0eRegionalAction\x12\x0e\n\x06region\x18\x01 \x01(\t\x12\x0e\n\x06prefix\x18\x02 \x01(\t\x12\x16\n\x0e\x62ots_requested\x18\x03 \x01(\x05\".\n\nActionable\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x07\n\x03YES\x10\x01\x12\x06\n\x02NO\x10\x02\"v\n\x13ResourceUtilization\x12\x0e\n\x06region\x18\x01 \x01(\t\x12\x0b\n\x03vms\x18\x02 \x01(\x05\x12\x0c\n\x04\x63pus\x18\x03 \x01(\x02\x12\x11\n\tmemory_gb\x18\x04 \x01(\x02\x12\x0f\n\x07\x64isk_gb\x18\x05 \x01(\x02\x12\x10\n\x08max_cpus\x18\x06 \x01(\x02\"l\n\x16\x41pplicationUtilization\x12\x13\n\x0b\x61pplication\x18\x01 \x01(\t\x12=\n\x14resource_utilization\x18\x02 \x03(\x0b\x32\x1f.chromiumos.ResourceUtilization\"\xca\x01\n\x0eRoboCropAction\x12\x32\n\x0fscaling_actions\x18\x01 \x03(\x0b\x32\x19.chromiumos.ScalingAction\x12=\n\x14resource_utilization\x18\x02 \x03(\x0b\x32\x1f.chromiumos.ResourceUtilization\x12\x45\n\x19\x61ppl_resource_utilization\x18\x03 \x03(\x0b\x32\".chromiumos.ApplicationUtilizationB6Z4go.chromium.org/chromiumos/infra/proto/go/chromiumosb\x06proto3')
 )
 
 
@@ -68,14 +68,44 @@
       name='DEMAND', index=2, number=2,
       serialized_options=None,
       type=None),
+    _descriptor.EnumValueDescriptor(
+      name='STEPPED_DECREASE', index=3, number=3,
+      serialized_options=None,
+      type=None),
   ],
   containing_type=None,
   serialized_options=None,
   serialized_start=903,
-  serialized_end=970,
+  serialized_end=992,
 )
 _sym_db.RegisterEnumDescriptor(_BOTPOLICY_BOTSCALINGMODE)
 
+_REDUCEDBOTPOLICY_MODE = _descriptor.EnumDescriptor(
+  name='Mode',
+  full_name='chromiumos.ReducedBotPolicy.Mode',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='UNKNOWN_MODE', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='MONITORED', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='CONFIGURED', index=2, number=2,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=846,
+  serialized_end=901,
+)
+_sym_db.RegisterEnumDescriptor(_REDUCEDBOTPOLICY_MODE)
+
 _SCALINGACTION_ACTIONABLE = _descriptor.EnumDescriptor(
   name='Actionable',
   full_name='chromiumos.ScalingAction.Actionable',
@@ -97,8 +127,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1415,
-  serialized_end=1461,
+  serialized_start=1704,
+  serialized_end=1750,
 )
 _sym_db.RegisterEnumDescriptor(_SCALINGACTION_ACTIONABLE)
 
@@ -394,7 +424,7 @@
   oneofs=[
   ],
   serialized_start=203,
-  serialized_end=970,
+  serialized_end=992,
 )
 
 
@@ -424,8 +454,85 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=972,
-  serialized_end=1031,
+  serialized_start=994,
+  serialized_end=1053,
+)
+
+
+_REDUCEDBOTPOLICY = _descriptor.Descriptor(
+  name='ReducedBotPolicy',
+  full_name='chromiumos.ReducedBotPolicy',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='bot_group', full_name='chromiumos.ReducedBotPolicy.bot_group', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='bot_type', full_name='chromiumos.ReducedBotPolicy.bot_type', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='policy_mode', full_name='chromiumos.ReducedBotPolicy.policy_mode', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _REDUCEDBOTPOLICY_MODE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1056,
+  serialized_end=1245,
+)
+
+
+_REDUCEDBOTPOLICYCFG = _descriptor.Descriptor(
+  name='ReducedBotPolicyCfg',
+  full_name='chromiumos.ReducedBotPolicyCfg',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='bot_policies', full_name='chromiumos.ReducedBotPolicyCfg.bot_policies', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1247,
+  serialized_end=1320,
 )
 
 
@@ -469,8 +576,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1341,
-  serialized_end=1413,
+  serialized_start=1630,
+  serialized_end=1702,
 )
 
 _SCALINGACTION = _descriptor.Descriptor(
@@ -556,8 +663,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1034,
-  serialized_end=1461,
+  serialized_start=1323,
+  serialized_end=1750,
 )
 
 
@@ -622,8 +729,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1463,
-  serialized_end=1581,
+  serialized_start=1752,
+  serialized_end=1870,
 )
 
 
@@ -660,8 +767,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1583,
-  serialized_end=1691,
+  serialized_start=1872,
+  serialized_end=1980,
 )
 
 
@@ -705,8 +812,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1694,
-  serialized_end=1896,
+  serialized_start=1983,
+  serialized_end=2185,
 )
 
 _BOTPOLICY_SCALINGRESTRICTION.containing_type = _BOTPOLICY
@@ -720,6 +827,10 @@
 _BOTPOLICY_MODE.containing_type = _BOTPOLICY
 _BOTPOLICY_BOTSCALINGMODE.containing_type = _BOTPOLICY
 _BOTPOLICYCFG.fields_by_name['bot_policies'].message_type = _BOTPOLICY
+_REDUCEDBOTPOLICY.fields_by_name['bot_type'].message_type = _BOTTYPE
+_REDUCEDBOTPOLICY.fields_by_name['policy_mode'].enum_type = _REDUCEDBOTPOLICY_MODE
+_REDUCEDBOTPOLICY_MODE.containing_type = _REDUCEDBOTPOLICY
+_REDUCEDBOTPOLICYCFG.fields_by_name['bot_policies'].message_type = _REDUCEDBOTPOLICY
 _SCALINGACTION_REGIONALACTION.containing_type = _SCALINGACTION
 _SCALINGACTION.fields_by_name['bot_type'].message_type = _BOTTYPE
 _SCALINGACTION.fields_by_name['actionable'].enum_type = _SCALINGACTION_ACTIONABLE
@@ -733,6 +844,8 @@
 DESCRIPTOR.message_types_by_name['SwarmingDimension'] = _SWARMINGDIMENSION
 DESCRIPTOR.message_types_by_name['BotPolicy'] = _BOTPOLICY
 DESCRIPTOR.message_types_by_name['BotPolicyCfg'] = _BOTPOLICYCFG
+DESCRIPTOR.message_types_by_name['ReducedBotPolicy'] = _REDUCEDBOTPOLICY
+DESCRIPTOR.message_types_by_name['ReducedBotPolicyCfg'] = _REDUCEDBOTPOLICYCFG
 DESCRIPTOR.message_types_by_name['ScalingAction'] = _SCALINGACTION
 DESCRIPTOR.message_types_by_name['ResourceUtilization'] = _RESOURCEUTILIZATION
 DESCRIPTOR.message_types_by_name['ApplicationUtilization'] = _APPLICATIONUTILIZATION
@@ -783,6 +896,20 @@
   ))
 _sym_db.RegisterMessage(BotPolicyCfg)
 
+ReducedBotPolicy = _reflection.GeneratedProtocolMessageType('ReducedBotPolicy', (_message.Message,), dict(
+  DESCRIPTOR = _REDUCEDBOTPOLICY,
+  __module__ = 'chromiumos.bot_scaling_pb2'
+  # @@protoc_insertion_point(class_scope:chromiumos.ReducedBotPolicy)
+  ))
+_sym_db.RegisterMessage(ReducedBotPolicy)
+
+ReducedBotPolicyCfg = _reflection.GeneratedProtocolMessageType('ReducedBotPolicyCfg', (_message.Message,), dict(
+  DESCRIPTOR = _REDUCEDBOTPOLICYCFG,
+  __module__ = 'chromiumos.bot_scaling_pb2'
+  # @@protoc_insertion_point(class_scope:chromiumos.ReducedBotPolicyCfg)
+  ))
+_sym_db.RegisterMessage(ReducedBotPolicyCfg)
+
 ScalingAction = _reflection.GeneratedProtocolMessageType('ScalingAction', (_message.Message,), dict(
 
   RegionalAction = _reflection.GeneratedProtocolMessageType('RegionalAction', (_message.Message,), dict(
diff --git a/api/gen/chromiumos/builder_config_pb2.py b/api/gen/chromiumos/builder_config_pb2.py
index c1c467a..77b5b5c 100644
--- a/api/gen/chromiumos/builder_config_pb2.py
+++ b/api/gen/chromiumos/builder_config_pb2.py
@@ -22,7 +22,7 @@
   package='chromiumos',
   syntax='proto3',
   serialized_options=_b('Z4go.chromium.org/chromiumos/infra/proto/go/chromiumos'),
-  serialized_pb=_b('\n\x1f\x63hromiumos/builder_config.proto\x12\nchromiumos\x1a\x17\x63hromiumos/common.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xaf\'\n\rBuilderConfig\x12(\n\x02id\x18\x01 \x01(\x0b\x32\x1c.chromiumos.BuilderConfig.Id\x12\x32\n\x07general\x18\x02 \x01(\x0b\x32!.chromiumos.BuilderConfig.General\x12<\n\x0corchestrator\x18\x03 \x01(\x0b\x32&.chromiumos.BuilderConfig.Orchestrator\x12\x36\n\tartifacts\x18\x04 \x01(\x0b\x32#.chromiumos.BuilderConfig.Artifacts\x12\x30\n\x06\x63hrome\x18\x05 \x01(\x0b\x32 .chromiumos.BuilderConfig.Chrome\x12.\n\x05\x62uild\x18\x06 \x01(\x0b\x32\x1f.chromiumos.BuilderConfig.Build\x12\x37\n\nunit_tests\x18\x07 \x01(\x0b\x32#.chromiumos.BuilderConfig.UnitTests\x1a\xb8\x01\n\x02Id\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x62ranch\x18\x02 \x01(\t\x12/\n\x04type\x18\x03 \x01(\x0e\x32!.chromiumos.BuilderConfig.Id.Type\"c\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x06\n\x02\x43Q\x10\x01\x12\x0e\n\nPOSTSUBMIT\x10\x02\x12\r\n\tTOOLCHAIN\x10\x03\x12\x11\n\rINFORMATIONAL\x10\x04\x12\x0b\n\x07RELEASE\x10\x05\x1a\xa3\x05\n\x07General\x12,\n\x08\x63ritical\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x42\n\x0b\x65nvironment\x18\x02 \x01(\x0e\x32-.chromiumos.BuilderConfig.General.Environment\x12;\n\x08run_when\x18\x03 \x01(\x0b\x32).chromiumos.BuilderConfig.General.RunWhen\x12\x31\n\rbroken_before\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x19\n\x11sdk_cache_version\x18\x05 \x01(\x05\x12\x10\n\x08unibuild\x18\x06 \x01(\x08\x12<\n\x08manifest\x18\x07 \x01(\x0e\x32*.chromiumos.BuilderConfig.General.Manifest\x1a\xc2\x01\n\x07RunWhen\x12<\n\x04mode\x18\x01 \x01(\x0e\x32..chromiumos.BuilderConfig.General.RunWhen.Mode\x12\x15\n\rfile_patterns\x18\x02 \x03(\t\"b\n\x04Mode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x0e\n\nALWAYS_RUN\x10\x01\x12\x1a\n\x16ONLY_RUN_ON_FILE_MATCH\x10\x02\x12\x18\n\x14NO_RUN_ON_FILE_MATCH\x10\x03\"G\n\x0b\x45nvironment\x12\x1b\n\x17\x45NVIRONMENT_UNSPECIFIED\x10\x00\x12\x0e\n\nPRODUCTION\x10\x01\x12\x0b\n\x07STAGING\x10\x02\"=\n\x08Manifest\x12\x18\n\x14MANIFEST_UNSPECIFIED\x10\x00\x12\n\n\x06PUBLIC\x10\x01\x12\x0b\n\x07PRIVATE\x10\x02\x1a\xc2\x04\n\x0cOrchestrator\x12\x45\n\x0b\x63hild_specs\x18\x05 \x03(\x0b\x32\x30.chromiumos.BuilderConfig.Orchestrator.ChildSpec\x12\x31\n\x0egitiles_commit\x18\x02 \x01(\x0b\x32\x19.chromiumos.GitilesCommit\x12\x30\n\x0egerrit_changes\x18\x03 \x03(\x0b\x32\x18.chromiumos.GerritChange\x12[\n\x16\x66ollow_on_orchestrator\x18\x04 \x01(\x0b\x32;.chromiumos.BuilderConfig.Orchestrator.FollowOnOrchestrator\x1a\xe2\x01\n\tChildSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12Z\n\x10\x63ollect_handling\x18\x02 \x01(\x0e\x32@.chromiumos.BuilderConfig.Orchestrator.ChildSpec.CollectHandling\"k\n\x0f\x43ollectHandling\x12 \n\x1c\x43OLLECT_HANDLING_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x43OLLECT\x10\x01\x12\x0e\n\nNO_COLLECT\x10\x02\x12\x19\n\x15\x43OLLECT_AFTER_HW_TEST\x10\x03\x1a>\n\x14\x46ollowOnOrchestrator\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10\x61wait_completion\x18\x02 \x01(\x08J\x04\x08\x01\x10\x02\x1a\x92\r\n\tArtifacts\x12@\n\tprebuilts\x18\x01 \x01(\x0e\x32-.chromiumos.BuilderConfig.Artifacts.Prebuilts\x12I\n\x0e\x61rtifact_types\x18\x02 \x03(\x0e\x32\x31.chromiumos.BuilderConfig.Artifacts.ArtifactTypes\x12\x1b\n\x13prebuilts_gs_bucket\x18\x03 \x01(\t\x12\x1b\n\x13\x61rtifacts_gs_bucket\x18\x04 \x01(\t\x12J\n\x11publish_artifacts\x18\x05 \x03(\x0b\x32/.chromiumos.BuilderConfig.Artifacts.PublishInfo\x12N\n\x0finput_artifacts\x18\x06 \x03(\x0b\x32\x35.chromiumos.BuilderConfig.Artifacts.InputArtifactInfo\x12>\n\x15\x61rtifact_profile_info\x18\x07 \x01(\x0b\x32\x1f.chromiumos.ArtifactProfileInfo\x12\x36\n\x0e\x61rtifacts_info\x18\x08 \x01(\x0b\x32\x1e.chromiumos.ArtifactsByService\x1a\x8c\x01\n\x0bPublishInfo\x12H\n\rpublish_types\x18\x02 \x03(\x0e\x32\x31.chromiumos.BuilderConfig.Artifacts.ArtifactTypes\x12\x1b\n\x13publish_gs_location\x18\x03 \x01(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\tJ\x04\x08\x01\x10\x02\x1a\x88\x01\n\x11InputArtifactInfo\x12N\n\x13input_artifact_type\x18\x01 \x01(\x0e\x32\x31.chromiumos.BuilderConfig.Artifacts.ArtifactTypes\x12#\n\x1binput_artifact_gs_locations\x18\x02 \x03(\t\"I\n\tPrebuilts\x12\x19\n\x15PREBUILTS_UNSPECIFIED\x10\x00\x12\n\n\x06PUBLIC\x10\x01\x12\x0b\n\x07PRIVATE\x10\x02\x12\x08\n\x04NONE\x10\x03\"\xc4\x06\n\rArtifactTypes\x12\x1e\n\x1a\x41RTIFACT_TYPES_UNSPECIFIED\x10\x00\x12\r\n\tIMAGE_ZIP\x10\x01\x12\x17\n\x13TEST_UPDATE_PAYLOAD\x10\x02\x12\x12\n\x0e\x41UTOTEST_FILES\x10\x03\x12\x0e\n\nTAST_FILES\x10\x04\x12\x17\n\x13PINNED_GUEST_IMAGES\x10\x05\x12\x0c\n\x08\x46IRMWARE\x10\x06\x12\x0f\n\x0b\x45\x42UILD_LOGS\x10\x07\x12\x13\n\x0f\x43HROMEOS_CONFIG\x10\x08\x12\x0e\n\nCPE_REPORT\x10\t\x12\x12\n\x0eIMAGE_ARCHIVES\x10\n\x12$\n UNVERIFIED_CHROME_LLVM_ORDERFILE\x10\x0b\x12\"\n\x1eVERIFIED_CHROME_LLVM_ORDERFILE\x10\x0c\x12\x1e\n\x1a\x43HROME_CLANG_WARNINGS_FILE\x10\r\x12\x1c\n\x18UNVERIFIED_LLVM_PGO_FILE\x10\x0e\x12)\n%UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE\x10\x0f\x12\'\n#VERIFIED_CHROME_BENCHMARK_AFDO_FILE\x10\x10\x12!\n\x1dVERIFIED_KERNEL_CWP_AFDO_FILE\x10\x11\x12#\n\x1fUNVERIFIED_KERNEL_CWP_AFDO_FILE\x10\x12\x12#\n\x1fUNVERIFIED_CHROME_CWP_AFDO_FILE\x10\x13\x12!\n\x1dVERIFIED_CHROME_CWP_AFDO_FILE\x10\x14\x12\x1e\n\x1aVERIFIED_RELEASE_AFDO_FILE\x10\x15\x12)\n%UNVERIFIED_CHROME_BENCHMARK_PERF_FILE\x10\x16\x12\x17\n\x13\x43HROME_DEBUG_BINARY\x10\x17\x12\x1a\n\x16TOOLCHAIN_WARNING_LOGS\x10\x18\x12)\n%CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX\x10\x19\x12\x19\n\x15\x43LANG_CRASH_DIAGNOSES\x10\x1a\x12\x13\n\x0f\x46PMCU_UNITTESTS\x10\x1b\x12\x0f\n\x0bGCE_TARBALL\x10\x1c\x1a\x1a\n\x06\x43hrome\x12\x10\n\x08internal\x18\x01 \x01(\x08\x1a\xae\x08\n\x05\x42uild\x12&\n\tuse_flags\x18\x01 \x03(\x0b\x32\x13.chromiumos.UseFlag\x12G\n\x0fportage_profile\x18\x02 \x01(\x0b\x32..chromiumos.BuilderConfig.Build.PortageProfile\x12\x1c\n\x14\x61pply_gerrit_changes\x18\x06 \x01(\x08\x12J\n\x11prepare_for_build\x18\x11 \x01(\x0b\x32/.chromiumos.BuilderConfig.Build.PrepareForBuild\x12=\n\nsdk_update\x18\x0c \x01(\x0b\x32).chromiumos.BuilderConfig.Build.SdkUpdate\x12K\n\x11install_toolchain\x18\r \x01(\x0b\x32\x30.chromiumos.BuilderConfig.Build.InstallToolchain\x12I\n\x10install_packages\x18\x10 \x01(\x0b\x32/.chromiumos.BuilderConfig.Build.InstallPackages\x12\x41\n\x0c\x62uild_images\x18\x0f \x01(\x0b\x32+.chromiumos.BuilderConfig.Build.BuildImages\x1a!\n\x0ePortageProfile\x12\x0f\n\x07profile\x18\x01 \x01(\t\x1aU\n\x0fPrepareForBuild\x12\x42\n\x0f\x61\x64\x64itional_args\x18\x01 \x01(\x0b\x32).chromiumos.PrepareForBuildAdditionalArgs\x1a#\n\tSdkUpdate\x12\x16\n\x0e\x63ompile_source\x18\x01 \x01(\x08\x1a*\n\x10InstallToolchain\x12\x16\n\x0e\x63ompile_source\x18\x01 \x01(\x08\x1a\xdd\x01\n\x0fInstallPackages\x12\x16\n\x0e\x63ompile_source\x18\x01 \x01(\x08\x12\x33\n\x08run_spec\x18\x02 \x01(\x0e\x32!.chromiumos.BuilderConfig.RunSpec\x12)\n\x08packages\x18\x03 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12\x14\n\x0c\x64isable_goma\x18\x04 \x01(\x08\x12<\n\x0c\x64\x65pendencies\x18\x05 \x01(\x0e\x32&.chromiumos.BuilderConfig.Dependencies\x1as\n\x0b\x42uildImages\x12*\n\x0bimage_types\x18\x01 \x03(\x0e\x32\x15.chromiumos.ImageType\x12#\n\x1b\x64isable_rootfs_verification\x18\x02 \x01(\x08\x12\x13\n\x0b\x64isk_layout\x18\x03 \x01(\tJ\x04\x08\x03\x10\x06J\x04\x08\x07\x10\x0cJ\x04\x08\x0e\x10\x0f\x1a\xfc\x01\n\tUnitTests\x12\x32\n\x11package_blacklist\x18\x04 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12;\n\x10\x65\x62uilds_run_spec\x18\x05 \x01(\x0e\x32!.chromiumos.BuilderConfig.RunSpec\x12\x15\n\rempty_sysroot\x18\x06 \x01(\x08\x12)\n\x08packages\x18\x07 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12<\n\x0c\x64\x65pendencies\x18\x08 \x01(\x0e\x32&.chromiumos.BuilderConfig.Dependencies\"F\n\x07RunSpec\x12\x18\n\x14RUN_SPEC_UNSPECIFIED\x10\x00\x12\n\n\x06NO_RUN\x10\x01\x12\x07\n\x03RUN\x10\x02\x12\x0c\n\x08RUN_EXIT\x10\x03\"`\n\x0c\x44\x65pendencies\x12\x1c\n\x18\x44\x45PENDENCIES_UNSPECIFIED\x10\x00\x12\x14\n\x10\x41LL_DEPENDENCIES\x10\x01\x12\x1c\n\x18\x43L_AFFECTED_DEPENDENCIES\x10\x02\"D\n\x0e\x42uilderConfigs\x12\x32\n\x0f\x62uilder_configs\x18\x01 \x03(\x0b\x32\x19.chromiumos.BuilderConfigB6Z4go.chromium.org/chromiumos/infra/proto/go/chromiumosb\x06proto3')
+  serialized_pb=_b('\n\x1f\x63hromiumos/builder_config.proto\x12\nchromiumos\x1a\x17\x63hromiumos/common.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xc8\'\n\rBuilderConfig\x12(\n\x02id\x18\x01 \x01(\x0b\x32\x1c.chromiumos.BuilderConfig.Id\x12\x32\n\x07general\x18\x02 \x01(\x0b\x32!.chromiumos.BuilderConfig.General\x12<\n\x0corchestrator\x18\x03 \x01(\x0b\x32&.chromiumos.BuilderConfig.Orchestrator\x12\x36\n\tartifacts\x18\x04 \x01(\x0b\x32#.chromiumos.BuilderConfig.Artifacts\x12\x30\n\x06\x63hrome\x18\x05 \x01(\x0b\x32 .chromiumos.BuilderConfig.Chrome\x12.\n\x05\x62uild\x18\x06 \x01(\x0b\x32\x1f.chromiumos.BuilderConfig.Build\x12\x37\n\nunit_tests\x18\x07 \x01(\x0b\x32#.chromiumos.BuilderConfig.UnitTests\x1a\xb8\x01\n\x02Id\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x62ranch\x18\x02 \x01(\t\x12/\n\x04type\x18\x03 \x01(\x0e\x32!.chromiumos.BuilderConfig.Id.Type\"c\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x06\n\x02\x43Q\x10\x01\x12\x0e\n\nPOSTSUBMIT\x10\x02\x12\r\n\tTOOLCHAIN\x10\x03\x12\x11\n\rINFORMATIONAL\x10\x04\x12\x0b\n\x07RELEASE\x10\x05\x1a\xa3\x05\n\x07General\x12,\n\x08\x63ritical\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x42\n\x0b\x65nvironment\x18\x02 \x01(\x0e\x32-.chromiumos.BuilderConfig.General.Environment\x12;\n\x08run_when\x18\x03 \x01(\x0b\x32).chromiumos.BuilderConfig.General.RunWhen\x12\x31\n\rbroken_before\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x19\n\x11sdk_cache_version\x18\x05 \x01(\x05\x12\x10\n\x08unibuild\x18\x06 \x01(\x08\x12<\n\x08manifest\x18\x07 \x01(\x0e\x32*.chromiumos.BuilderConfig.General.Manifest\x1a\xc2\x01\n\x07RunWhen\x12<\n\x04mode\x18\x01 \x01(\x0e\x32..chromiumos.BuilderConfig.General.RunWhen.Mode\x12\x15\n\rfile_patterns\x18\x02 \x03(\t\"b\n\x04Mode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x0e\n\nALWAYS_RUN\x10\x01\x12\x1a\n\x16ONLY_RUN_ON_FILE_MATCH\x10\x02\x12\x18\n\x14NO_RUN_ON_FILE_MATCH\x10\x03\"G\n\x0b\x45nvironment\x12\x1b\n\x17\x45NVIRONMENT_UNSPECIFIED\x10\x00\x12\x0e\n\nPRODUCTION\x10\x01\x12\x0b\n\x07STAGING\x10\x02\"=\n\x08Manifest\x12\x18\n\x14MANIFEST_UNSPECIFIED\x10\x00\x12\n\n\x06PUBLIC\x10\x01\x12\x0b\n\x07PRIVATE\x10\x02\x1a\xc2\x04\n\x0cOrchestrator\x12\x45\n\x0b\x63hild_specs\x18\x05 \x03(\x0b\x32\x30.chromiumos.BuilderConfig.Orchestrator.ChildSpec\x12\x31\n\x0egitiles_commit\x18\x02 \x01(\x0b\x32\x19.chromiumos.GitilesCommit\x12\x30\n\x0egerrit_changes\x18\x03 \x03(\x0b\x32\x18.chromiumos.GerritChange\x12[\n\x16\x66ollow_on_orchestrator\x18\x04 \x01(\x0b\x32;.chromiumos.BuilderConfig.Orchestrator.FollowOnOrchestrator\x1a\xe2\x01\n\tChildSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12Z\n\x10\x63ollect_handling\x18\x02 \x01(\x0e\x32@.chromiumos.BuilderConfig.Orchestrator.ChildSpec.CollectHandling\"k\n\x0f\x43ollectHandling\x12 \n\x1c\x43OLLECT_HANDLING_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x43OLLECT\x10\x01\x12\x0e\n\nNO_COLLECT\x10\x02\x12\x19\n\x15\x43OLLECT_AFTER_HW_TEST\x10\x03\x1a>\n\x14\x46ollowOnOrchestrator\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10\x61wait_completion\x18\x02 \x01(\x08J\x04\x08\x01\x10\x02\x1a\xab\r\n\tArtifacts\x12@\n\tprebuilts\x18\x01 \x01(\x0e\x32-.chromiumos.BuilderConfig.Artifacts.Prebuilts\x12I\n\x0e\x61rtifact_types\x18\x02 \x03(\x0e\x32\x31.chromiumos.BuilderConfig.Artifacts.ArtifactTypes\x12\x1b\n\x13prebuilts_gs_bucket\x18\x03 \x01(\t\x12\x1b\n\x13\x61rtifacts_gs_bucket\x18\x04 \x01(\t\x12J\n\x11publish_artifacts\x18\x05 \x03(\x0b\x32/.chromiumos.BuilderConfig.Artifacts.PublishInfo\x12N\n\x0finput_artifacts\x18\x06 \x03(\x0b\x32\x35.chromiumos.BuilderConfig.Artifacts.InputArtifactInfo\x12>\n\x15\x61rtifact_profile_info\x18\x07 \x01(\x0b\x32\x1f.chromiumos.ArtifactProfileInfo\x12\x36\n\x0e\x61rtifacts_info\x18\x08 \x01(\x0b\x32\x1e.chromiumos.ArtifactsByService\x1a\x8c\x01\n\x0bPublishInfo\x12H\n\rpublish_types\x18\x02 \x03(\x0e\x32\x31.chromiumos.BuilderConfig.Artifacts.ArtifactTypes\x12\x1b\n\x13publish_gs_location\x18\x03 \x01(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\tJ\x04\x08\x01\x10\x02\x1a\x88\x01\n\x11InputArtifactInfo\x12N\n\x13input_artifact_type\x18\x01 \x01(\x0e\x32\x31.chromiumos.BuilderConfig.Artifacts.ArtifactTypes\x12#\n\x1binput_artifact_gs_locations\x18\x02 \x03(\t\"I\n\tPrebuilts\x12\x19\n\x15PREBUILTS_UNSPECIFIED\x10\x00\x12\n\n\x06PUBLIC\x10\x01\x12\x0b\n\x07PRIVATE\x10\x02\x12\x08\n\x04NONE\x10\x03\"\xdd\x06\n\rArtifactTypes\x12\x1e\n\x1a\x41RTIFACT_TYPES_UNSPECIFIED\x10\x00\x12\r\n\tIMAGE_ZIP\x10\x01\x12\x17\n\x13TEST_UPDATE_PAYLOAD\x10\x02\x12\x12\n\x0e\x41UTOTEST_FILES\x10\x03\x12\x0e\n\nTAST_FILES\x10\x04\x12\x17\n\x13PINNED_GUEST_IMAGES\x10\x05\x12\x0c\n\x08\x46IRMWARE\x10\x06\x12\x0f\n\x0b\x45\x42UILD_LOGS\x10\x07\x12\x13\n\x0f\x43HROMEOS_CONFIG\x10\x08\x12\x0e\n\nCPE_REPORT\x10\t\x12\x12\n\x0eIMAGE_ARCHIVES\x10\n\x12$\n UNVERIFIED_CHROME_LLVM_ORDERFILE\x10\x0b\x12\"\n\x1eVERIFIED_CHROME_LLVM_ORDERFILE\x10\x0c\x12\x1e\n\x1a\x43HROME_CLANG_WARNINGS_FILE\x10\r\x12\x1c\n\x18UNVERIFIED_LLVM_PGO_FILE\x10\x0e\x12)\n%UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE\x10\x0f\x12\'\n#VERIFIED_CHROME_BENCHMARK_AFDO_FILE\x10\x10\x12!\n\x1dVERIFIED_KERNEL_CWP_AFDO_FILE\x10\x11\x12#\n\x1fUNVERIFIED_KERNEL_CWP_AFDO_FILE\x10\x12\x12#\n\x1fUNVERIFIED_CHROME_CWP_AFDO_FILE\x10\x13\x12!\n\x1dVERIFIED_CHROME_CWP_AFDO_FILE\x10\x14\x12\x1e\n\x1aVERIFIED_RELEASE_AFDO_FILE\x10\x15\x12)\n%UNVERIFIED_CHROME_BENCHMARK_PERF_FILE\x10\x16\x12\x17\n\x13\x43HROME_DEBUG_BINARY\x10\x17\x12\x1a\n\x16TOOLCHAIN_WARNING_LOGS\x10\x18\x12)\n%CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX\x10\x19\x12\x19\n\x15\x43LANG_CRASH_DIAGNOSES\x10\x1a\x12\x13\n\x0f\x46PMCU_UNITTESTS\x10\x1b\x12\x0f\n\x0bGCE_TARBALL\x10\x1c\x12\x17\n\x13\x43OMPILER_RUSAGE_LOG\x10\x1d\x1a\x1a\n\x06\x43hrome\x12\x10\n\x08internal\x18\x01 \x01(\x08\x1a\xae\x08\n\x05\x42uild\x12&\n\tuse_flags\x18\x01 \x03(\x0b\x32\x13.chromiumos.UseFlag\x12G\n\x0fportage_profile\x18\x02 \x01(\x0b\x32..chromiumos.BuilderConfig.Build.PortageProfile\x12\x1c\n\x14\x61pply_gerrit_changes\x18\x06 \x01(\x08\x12J\n\x11prepare_for_build\x18\x11 \x01(\x0b\x32/.chromiumos.BuilderConfig.Build.PrepareForBuild\x12=\n\nsdk_update\x18\x0c \x01(\x0b\x32).chromiumos.BuilderConfig.Build.SdkUpdate\x12K\n\x11install_toolchain\x18\r \x01(\x0b\x32\x30.chromiumos.BuilderConfig.Build.InstallToolchain\x12I\n\x10install_packages\x18\x10 \x01(\x0b\x32/.chromiumos.BuilderConfig.Build.InstallPackages\x12\x41\n\x0c\x62uild_images\x18\x0f \x01(\x0b\x32+.chromiumos.BuilderConfig.Build.BuildImages\x1a!\n\x0ePortageProfile\x12\x0f\n\x07profile\x18\x01 \x01(\t\x1aU\n\x0fPrepareForBuild\x12\x42\n\x0f\x61\x64\x64itional_args\x18\x01 \x01(\x0b\x32).chromiumos.PrepareForBuildAdditionalArgs\x1a#\n\tSdkUpdate\x12\x16\n\x0e\x63ompile_source\x18\x01 \x01(\x08\x1a*\n\x10InstallToolchain\x12\x16\n\x0e\x63ompile_source\x18\x01 \x01(\x08\x1a\xdd\x01\n\x0fInstallPackages\x12\x16\n\x0e\x63ompile_source\x18\x01 \x01(\x08\x12\x33\n\x08run_spec\x18\x02 \x01(\x0e\x32!.chromiumos.BuilderConfig.RunSpec\x12)\n\x08packages\x18\x03 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12\x14\n\x0c\x64isable_goma\x18\x04 \x01(\x08\x12<\n\x0c\x64\x65pendencies\x18\x05 \x01(\x0e\x32&.chromiumos.BuilderConfig.Dependencies\x1as\n\x0b\x42uildImages\x12*\n\x0bimage_types\x18\x01 \x03(\x0e\x32\x15.chromiumos.ImageType\x12#\n\x1b\x64isable_rootfs_verification\x18\x02 \x01(\x08\x12\x13\n\x0b\x64isk_layout\x18\x03 \x01(\tJ\x04\x08\x03\x10\x06J\x04\x08\x07\x10\x0cJ\x04\x08\x0e\x10\x0f\x1a\xfc\x01\n\tUnitTests\x12\x32\n\x11package_blacklist\x18\x04 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12;\n\x10\x65\x62uilds_run_spec\x18\x05 \x01(\x0e\x32!.chromiumos.BuilderConfig.RunSpec\x12\x15\n\rempty_sysroot\x18\x06 \x01(\x08\x12)\n\x08packages\x18\x07 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12<\n\x0c\x64\x65pendencies\x18\x08 \x01(\x0e\x32&.chromiumos.BuilderConfig.Dependencies\"F\n\x07RunSpec\x12\x18\n\x14RUN_SPEC_UNSPECIFIED\x10\x00\x12\n\n\x06NO_RUN\x10\x01\x12\x07\n\x03RUN\x10\x02\x12\x0c\n\x08RUN_EXIT\x10\x03\"`\n\x0c\x44\x65pendencies\x12\x1c\n\x18\x44\x45PENDENCIES_UNSPECIFIED\x10\x00\x12\x14\n\x10\x41LL_DEPENDENCIES\x10\x01\x12\x1c\n\x18\x43L_AFFECTED_DEPENDENCIES\x10\x02\"D\n\x0e\x42uilderConfigs\x12\x32\n\x0f\x62uilder_configs\x18\x01 \x03(\x0b\x32\x19.chromiumos.BuilderConfigB6Z4go.chromium.org/chromiumos/infra/proto/go/chromiumosb\x06proto3')
   ,
   dependencies=[chromiumos_dot_common__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,])
 
@@ -330,11 +330,15 @@
       name='GCE_TARBALL', index=28, number=28,
       serialized_options=None,
       type=None),
+    _descriptor.EnumValueDescriptor(
+      name='COMPILER_RUSAGE_LOG', index=29, number=29,
+      serialized_options=None,
+      type=None),
   ],
   containing_type=None,
   serialized_options=None,
   serialized_start=2815,
-  serialized_end=3651,
+  serialized_end=3676,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_ARTIFACTS_ARTIFACTTYPES)
 
@@ -363,8 +367,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=5009,
-  serialized_end=5079,
+  serialized_start=5034,
+  serialized_end=5104,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_RUNSPEC)
 
@@ -389,8 +393,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=5081,
-  serialized_end=5177,
+  serialized_start=5106,
+  serialized_end=5202,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_DEPENDENCIES)
 
@@ -837,7 +841,7 @@
   oneofs=[
   ],
   serialized_start=1969,
-  serialized_end=3651,
+  serialized_end=3676,
 )
 
 _BUILDERCONFIG_CHROME = _descriptor.Descriptor(
@@ -866,8 +870,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3653,
-  serialized_end=3679,
+  serialized_start=3678,
+  serialized_end=3704,
 )
 
 _BUILDERCONFIG_BUILD_PORTAGEPROFILE = _descriptor.Descriptor(
@@ -896,8 +900,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4192,
-  serialized_end=4225,
+  serialized_start=4217,
+  serialized_end=4250,
 )
 
 _BUILDERCONFIG_BUILD_PREPAREFORBUILD = _descriptor.Descriptor(
@@ -926,8 +930,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4227,
-  serialized_end=4312,
+  serialized_start=4252,
+  serialized_end=4337,
 )
 
 _BUILDERCONFIG_BUILD_SDKUPDATE = _descriptor.Descriptor(
@@ -956,8 +960,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4314,
-  serialized_end=4349,
+  serialized_start=4339,
+  serialized_end=4374,
 )
 
 _BUILDERCONFIG_BUILD_INSTALLTOOLCHAIN = _descriptor.Descriptor(
@@ -986,8 +990,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4351,
-  serialized_end=4393,
+  serialized_start=4376,
+  serialized_end=4418,
 )
 
 _BUILDERCONFIG_BUILD_INSTALLPACKAGES = _descriptor.Descriptor(
@@ -1044,8 +1048,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4396,
-  serialized_end=4617,
+  serialized_start=4421,
+  serialized_end=4642,
 )
 
 _BUILDERCONFIG_BUILD_BUILDIMAGES = _descriptor.Descriptor(
@@ -1088,8 +1092,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4619,
-  serialized_end=4734,
+  serialized_start=4644,
+  serialized_end=4759,
 )
 
 _BUILDERCONFIG_BUILD = _descriptor.Descriptor(
@@ -1167,8 +1171,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3682,
-  serialized_end=4752,
+  serialized_start=3707,
+  serialized_end=4777,
 )
 
 _BUILDERCONFIG_UNITTESTS = _descriptor.Descriptor(
@@ -1225,8 +1229,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4755,
-  serialized_end=5007,
+  serialized_start=4780,
+  serialized_end=5032,
 )
 
 _BUILDERCONFIG = _descriptor.Descriptor(
@@ -1300,7 +1304,7 @@
   oneofs=[
   ],
   serialized_start=138,
-  serialized_end=5177,
+  serialized_end=5202,
 )
 
 
@@ -1330,8 +1334,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5179,
-  serialized_end=5247,
+  serialized_start=5204,
+  serialized_end=5272,
 )
 
 _BUILDERCONFIG_ID.fields_by_name['type'].enum_type = _BUILDERCONFIG_ID_TYPE
diff --git a/api/gen/chromiumos/common_pb2.py b/api/gen/chromiumos/common_pb2.py
index 179d8e3..916580d 100644
--- a/api/gen/chromiumos/common_pb2.py
+++ b/api/gen/chromiumos/common_pb2.py
@@ -20,7 +20,7 @@
   package='chromiumos',
   syntax='proto3',
   serialized_options=_b('Z4go.chromium.org/chromiumos/infra/proto/go/chromiumos'),
-  serialized_pb=_b('\n\x17\x63hromiumos/common.proto\x12\nchromiumos\"\x1b\n\x0b\x42uildTarget\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xca\x01\n\x06\x43hroot\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x11\n\tcache_dir\x18\x02 \x01(\t\x12)\n\x03\x65nv\x18\x03 \x01(\x0b\x32\x1c.chromiumos.Chroot.ChrootEnv\x12\x12\n\nchrome_dir\x18\x04 \x01(\t\x1aZ\n\tChrootEnv\x12&\n\tuse_flags\x18\x01 \x03(\x0b\x32\x13.chromiumos.UseFlag\x12%\n\x08\x66\x65\x61tures\x18\x02 \x03(\x0b\x32\x13.chromiumos.FeatureJ\x04\x08\x05\x10\x06\"\x1a\n\x07\x46\x65\x61ture\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\"\xcf\x02\n\nGomaConfig\x12\x10\n\x08goma_dir\x18\x01 \x01(\t\x12\x18\n\x10goma_client_json\x18\x02 \x01(\t\x12\x19\n\x11\x63hromeos_goma_dir\x18\x03 \x01(\t\x12:\n\rgoma_approach\x18\x04 \x01(\x0e\x32#.chromiumos.GomaConfig.GomaApproach\x12&\n\x07log_dir\x18\x05 \x01(\x0b\x32\x15.chromiumos.SyncedDir\x12\x12\n\nstats_file\x18\x06 \x01(\t\x12\x15\n\rcounterz_file\x18\x07 \x01(\t\"k\n\x0cGomaApproach\x12\x1d\n\x19GOMA_APPROACH_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01\x12\x0c\n\x08RBE_PROD\x10\x02\x12\x0f\n\x0bRBE_STAGING\x10\x03\x12\x10\n\x0cRBE_CHROMEOS\x10\x04\"M\n\rGomaArtifacts\x12\x12\n\nstats_file\x18\x01 \x01(\t\x12\x15\n\rcounterz_file\x18\x02 \x01(\t\x12\x11\n\tlog_files\x18\x03 \x03(\t\"F\n\x0bPackageInfo\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\"\x17\n\x07Profile\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xa8\x01\n\x10PackageIndexInfo\x12\x14\n\x0csnapshot_sha\x18\x01 \x01(\t\x12\x17\n\x0fsnapshot_number\x18\x02 \x01(\x05\x12-\n\x0c\x62uild_target\x18\x03 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x10\n\x08location\x18\x04 \x01(\t\x12$\n\x07profile\x18\x05 \x01(\x0b\x32\x13.chromiumos.Profile\"w\n\x04Path\x12\x0c\n\x04path\x18\x01 \x01(\t\x12+\n\x08location\x18\x02 \x01(\x0e\x32\x19.chromiumos.Path.Location\"4\n\x08Location\x12\x0f\n\x0bNO_LOCATION\x10\x00\x12\n\n\x06INSIDE\x10\x01\x12\x0b\n\x07OUTSIDE\x10\x02\",\n\nResultPath\x12\x1e\n\x04path\x18\x01 \x01(\x0b\x32\x10.chromiumos.Path\"\x18\n\tSyncedDir\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"O\n\x0cGerritChange\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0f\n\x07project\x18\x02 \x01(\t\x12\x0e\n\x06\x63hange\x18\x03 \x01(\x03\x12\x10\n\x08patchset\x18\x04 \x01(\x03\"Y\n\rGitilesCommit\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0f\n\x07project\x18\x02 \x01(\t\x12\n\n\x02id\x18\x03 \x01(\t\x12\x0b\n\x03ref\x18\x04 \x01(\t\x12\x10\n\x08position\x18\x05 \x01(\r\"\x17\n\x07UseFlag\x12\x0c\n\x04\x66lag\x18\x01 \x01(\t\"&\n\nProtoBytes\x12\x18\n\x10serialized_proto\x18\x01 \x01(\x0c\"q\n\x1dPrepareForBuildAdditionalArgs\x12\x1c\n\x12\x63hrome_cwp_profile\x18\x01 \x01(\tH\x00\x12\x18\n\x0ekernel_version\x18\x02 \x01(\tH\x00\x42\x18\n\x16prepare_for_build_args\"A\n\x0b\x41\x66\x64oRelease\x12\x1a\n\x12\x63hrome_cwp_profile\x18\x01 \x01(\t\x12\x16\n\x0eimage_build_id\x18\x02 \x01(\x03\"\x97\x01\n\x13\x41rtifactProfileInfo\x12\x1c\n\x12\x63hrome_cwp_profile\x18\x01 \x01(\tH\x00\x12\x18\n\x0ekernel_version\x18\x02 \x01(\tH\x00\x12/\n\x0c\x61\x66\x64o_release\x18\x03 \x01(\x0b\x32\x17.chromiumos.AfdoReleaseH\x00\x42\x17\n\x15\x61rtifact_profile_info\"\xb0\x19\n\x12\x41rtifactsByService\x12\x35\n\x06legacy\x18\x01 \x01(\x0b\x32%.chromiumos.ArtifactsByService.Legacy\x12;\n\ttoolchain\x18\x02 \x01(\x0b\x32(.chromiumos.ArtifactsByService.Toolchain\x12\x33\n\x05image\x18\x03 \x01(\x0b\x32$.chromiumos.ArtifactsByService.Image\x12\x37\n\x07package\x18\x04 \x01(\x0b\x32&.chromiumos.ArtifactsByService.Package\x12\x37\n\x07sysroot\x18\x05 \x01(\x0b\x32&.chromiumos.ArtifactsByService.Sysroot\x12\x31\n\x04test\x18\x06 \x01(\x0b\x32#.chromiumos.ArtifactsByService.Test\x12\x35\n\x0cprofile_info\x18\x07 \x01(\x0b\x32\x1f.chromiumos.ArtifactProfileInfo\x1a\xb9\x04\n\x06Legacy\x12K\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x32.chromiumos.ArtifactsByService.Legacy.ArtifactInfo\x12L\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x32.chromiumos.ArtifactsByService.Legacy.ArtifactInfo\x1a\x88\x01\n\x0c\x41rtifactInfo\x12J\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x32.chromiumos.ArtifactsByService.Legacy.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\tJ\x04\x08\x03\x10\x04\"\x88\x02\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\r\n\tIMAGE_ZIP\x10\x01\x12\x17\n\x13TEST_UPDATE_PAYLOAD\x10\x02\x12\x12\n\x0e\x41UTOTEST_FILES\x10\x03\x12\x0e\n\nTAST_FILES\x10\x04\x12\x17\n\x13PINNED_GUEST_IMAGES\x10\x05\x12\x0c\n\x08\x46IRMWARE\x10\x06\x12\x0f\n\x0b\x45\x42UILD_LOGS\x10\x07\x12\x13\n\x0f\x43HROMEOS_CONFIG\x10\x08\x12\x0e\n\nCPE_REPORT\x10\t\x12\x12\n\x0eIMAGE_ARCHIVES\x10\n\x12\x13\n\x0f\x46PMCU_UNITTESTS\x10\x1b\x12\x0f\n\x0bGCE_TARBALL\x10\x1c\"\x04\x08\x0b\x10\x1a\x1a\x94\x07\n\tToolchain\x12N\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x35.chromiumos.ArtifactsByService.Toolchain.ArtifactInfo\x12O\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x35.chromiumos.ArtifactsByService.Toolchain.ArtifactInfo\x1a\x85\x01\n\x0c\x41rtifactInfo\x12M\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x35.chromiumos.ArtifactsByService.Toolchain.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\"\xdd\x04\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12$\n UNVERIFIED_CHROME_LLVM_ORDERFILE\x10\x0b\x12\"\n\x1eVERIFIED_CHROME_LLVM_ORDERFILE\x10\x0c\x12\x1e\n\x1a\x43HROME_CLANG_WARNINGS_FILE\x10\r\x12\x1c\n\x18UNVERIFIED_LLVM_PGO_FILE\x10\x0e\x12)\n%UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE\x10\x0f\x12\'\n#VERIFIED_CHROME_BENCHMARK_AFDO_FILE\x10\x10\x12!\n\x1dVERIFIED_KERNEL_CWP_AFDO_FILE\x10\x11\x12#\n\x1fUNVERIFIED_KERNEL_CWP_AFDO_FILE\x10\x12\x12#\n\x1fUNVERIFIED_CHROME_CWP_AFDO_FILE\x10\x13\x12!\n\x1dVERIFIED_CHROME_CWP_AFDO_FILE\x10\x14\x12\x1e\n\x1aVERIFIED_RELEASE_AFDO_FILE\x10\x15\x12)\n%UNVERIFIED_CHROME_BENCHMARK_PERF_FILE\x10\x16\x12\x17\n\x13\x43HROME_DEBUG_BINARY\x10\x17\x12\x1a\n\x16TOOLCHAIN_WARNING_LOGS\x10\x18\x12)\n%CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX\x10\x19\x12\x19\n\x15\x43LANG_CRASH_DIAGNOSES\x10\x1a\"\x04\x08\x01\x10\n\"\x04\x08\x1b\x10\x1c\x1a\xcb\x02\n\x05Image\x12J\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x31.chromiumos.ArtifactsByService.Image.ArtifactInfo\x12K\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x31.chromiumos.ArtifactsByService.Image.ArtifactInfo\x1a\x81\x01\n\x0c\x41rtifactInfo\x12I\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x31.chromiumos.ArtifactsByService.Image.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\"%\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\"\x04\x08\x01\x10\x1c\x1a\xd3\x02\n\x07Package\x12L\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x33.chromiumos.ArtifactsByService.Package.ArtifactInfo\x12M\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x33.chromiumos.ArtifactsByService.Package.ArtifactInfo\x1a\x83\x01\n\x0c\x41rtifactInfo\x12K\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x33.chromiumos.ArtifactsByService.Package.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\"%\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\"\x04\x08\x01\x10\x1c\x1a\xd3\x02\n\x07Sysroot\x12L\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x33.chromiumos.ArtifactsByService.Sysroot.ArtifactInfo\x12M\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x33.chromiumos.ArtifactsByService.Sysroot.ArtifactInfo\x1a\x83\x01\n\x0c\x41rtifactInfo\x12K\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x33.chromiumos.ArtifactsByService.Sysroot.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\"%\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\"\x04\x08\x01\x10\x1c\x1a\xc7\x02\n\x04Test\x12I\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x30.chromiumos.ArtifactsByService.Test.ArtifactInfo\x12J\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x30.chromiumos.ArtifactsByService.Test.ArtifactInfo\x1a\x80\x01\n\x0c\x41rtifactInfo\x12H\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x30.chromiumos.ArtifactsByService.Test.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\"%\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\"\x04\x08\x01\x10\x1c\"\xc4\x0c\n\x1aUploadedArtifactsByService\x12=\n\x06legacy\x18\x01 \x01(\x0b\x32-.chromiumos.UploadedArtifactsByService.Legacy\x12\x43\n\ttoolchain\x18\x02 \x01(\x0b\x32\x30.chromiumos.UploadedArtifactsByService.Toolchain\x12;\n\x05image\x18\x03 \x01(\x0b\x32,.chromiumos.UploadedArtifactsByService.Image\x12?\n\x07package\x18\x04 \x01(\x0b\x32..chromiumos.UploadedArtifactsByService.Package\x12?\n\x07sysroot\x18\x05 \x01(\x0b\x32..chromiumos.UploadedArtifactsByService.Sysroot\x12\x39\n\x04test\x18\x06 \x01(\x0b\x32+.chromiumos.UploadedArtifactsByService.Test\x1a\xc3\x01\n\x06Legacy\x12N\n\tartifacts\x18\x01 \x03(\x0b\x32;.chromiumos.UploadedArtifactsByService.Legacy.ArtifactPaths\x1ai\n\rArtifactPaths\x12I\n\rartifact_type\x18\x01 \x01(\x0e\x32\x32.chromiumos.ArtifactsByService.Legacy.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xcc\x01\n\tToolchain\x12Q\n\tartifacts\x18\x01 \x03(\x0b\x32>.chromiumos.UploadedArtifactsByService.Toolchain.ArtifactPaths\x1al\n\rArtifactPaths\x12L\n\rartifact_type\x18\x01 \x01(\x0e\x32\x35.chromiumos.ArtifactsByService.Toolchain.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xc0\x01\n\x05Image\x12M\n\tartifacts\x18\x01 \x03(\x0b\x32:.chromiumos.UploadedArtifactsByService.Image.ArtifactPaths\x1ah\n\rArtifactPaths\x12H\n\rartifact_type\x18\x01 \x01(\x0e\x32\x31.chromiumos.ArtifactsByService.Image.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xc6\x01\n\x07Package\x12O\n\tartifacts\x18\x01 \x03(\x0b\x32<.chromiumos.UploadedArtifactsByService.Package.ArtifactPaths\x1aj\n\rArtifactPaths\x12J\n\rartifact_type\x18\x01 \x01(\x0e\x32\x33.chromiumos.ArtifactsByService.Package.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xc6\x01\n\x07Sysroot\x12O\n\tartifacts\x18\x01 \x03(\x0b\x32<.chromiumos.UploadedArtifactsByService.Sysroot.ArtifactPaths\x1aj\n\rArtifactPaths\x12J\n\rartifact_type\x18\x01 \x01(\x0e\x32\x33.chromiumos.ArtifactsByService.Sysroot.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xbd\x01\n\x04Test\x12L\n\tartifacts\x18\x01 \x03(\x0b\x32\x39.chromiumos.UploadedArtifactsByService.Test.ArtifactPaths\x1ag\n\rArtifactPaths\x12G\n\rartifact_type\x18\x01 \x01(\x0e\x32\x30.chromiumos.ArtifactsByService.Test.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t*\xd9\x01\n\tImageType\x12\x18\n\x14IMAGE_TYPE_UNDEFINED\x10\x00\x12\x08\n\x04\x42\x41SE\x10\x01\x12\x07\n\x03\x44\x45V\x10\x02\x12\x08\n\x04TEST\x10\x03\x12\x0b\n\x07\x42\x41SE_VM\x10\x04\x12\x0b\n\x07TEST_VM\x10\x05\x12\x0c\n\x08RECOVERY\x10\x06\x12\x0b\n\x07\x46\x41\x43TORY\x10\x07\x12\x0c\n\x08\x46IRMWARE\x10\x08\x12\x11\n\rCR50_FIRMWARE\x10\t\x12\x11\n\rBASE_GUEST_VM\x10\n\x12\x11\n\rTEST_GUEST_VM\x10\x0b\x12\x07\n\x03\x44LC\x10\x0c\x12\x10\n\x0cGSC_FIRMWARE\x10\r*m\n\x07\x43hannel\x12\x17\n\x13\x43HANNEL_UNSPECIFIED\x10\x00\x12\x12\n\x0e\x43HANNEL_STABLE\x10\x01\x12\x10\n\x0c\x43HANNEL_BETA\x10\x02\x12\x0f\n\x0b\x43HANNEL_DEV\x10\x03\x12\x12\n\x0e\x43HANNEL_CANARY\x10\x04*c\n\tDeltaType\x12\x11\n\rDELTA_UNKNOWN\x10\x00\x12\x0c\n\x08NO_DELTA\x10\x01\x12\x07\n\x03\x46SI\x10\x02\x12\r\n\tMILESTONE\x10\x03\x12\t\n\x05OMAHA\x10\x04\x12\x12\n\x0eSTEPPING_STONE\x10\x05*f\n\x10\x41\x46\x44OArtifactType\x12\r\n\tNONE_TYPE\x10\x00\x12\r\n\tORDERFILE\x10\x01\x12\x12\n\x0e\x42\x45NCHMARK_AFDO\x10\x02\x12\x0f\n\x0bKERNEL_AFDO\x10\x03\x12\x0f\n\x0b\x43HROME_AFDO\x10\x04\x42\x36Z4go.chromium.org/chromiumos/infra/proto/go/chromiumosb\x06proto3')
+  serialized_pb=_b('\n\x17\x63hromiumos/common.proto\x12\nchromiumos\"\x1b\n\x0b\x42uildTarget\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xca\x01\n\x06\x43hroot\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x11\n\tcache_dir\x18\x02 \x01(\t\x12)\n\x03\x65nv\x18\x03 \x01(\x0b\x32\x1c.chromiumos.Chroot.ChrootEnv\x12\x12\n\nchrome_dir\x18\x04 \x01(\t\x1aZ\n\tChrootEnv\x12&\n\tuse_flags\x18\x01 \x03(\x0b\x32\x13.chromiumos.UseFlag\x12%\n\x08\x66\x65\x61tures\x18\x02 \x03(\x0b\x32\x13.chromiumos.FeatureJ\x04\x08\x05\x10\x06\"\x1a\n\x07\x46\x65\x61ture\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\"\xcf\x02\n\nGomaConfig\x12\x10\n\x08goma_dir\x18\x01 \x01(\t\x12\x18\n\x10goma_client_json\x18\x02 \x01(\t\x12\x19\n\x11\x63hromeos_goma_dir\x18\x03 \x01(\t\x12:\n\rgoma_approach\x18\x04 \x01(\x0e\x32#.chromiumos.GomaConfig.GomaApproach\x12&\n\x07log_dir\x18\x05 \x01(\x0b\x32\x15.chromiumos.SyncedDir\x12\x12\n\nstats_file\x18\x06 \x01(\t\x12\x15\n\rcounterz_file\x18\x07 \x01(\t\"k\n\x0cGomaApproach\x12\x1d\n\x19GOMA_APPROACH_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01\x12\x0c\n\x08RBE_PROD\x10\x02\x12\x0f\n\x0bRBE_STAGING\x10\x03\x12\x10\n\x0cRBE_CHROMEOS\x10\x04\"M\n\rGomaArtifacts\x12\x12\n\nstats_file\x18\x01 \x01(\t\x12\x15\n\rcounterz_file\x18\x02 \x01(\t\x12\x11\n\tlog_files\x18\x03 \x03(\t\"F\n\x0bPackageInfo\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\"\x17\n\x07Profile\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xa8\x01\n\x10PackageIndexInfo\x12\x14\n\x0csnapshot_sha\x18\x01 \x01(\t\x12\x17\n\x0fsnapshot_number\x18\x02 \x01(\x05\x12-\n\x0c\x62uild_target\x18\x03 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x10\n\x08location\x18\x04 \x01(\t\x12$\n\x07profile\x18\x05 \x01(\x0b\x32\x13.chromiumos.Profile\"w\n\x04Path\x12\x0c\n\x04path\x18\x01 \x01(\t\x12+\n\x08location\x18\x02 \x01(\x0e\x32\x19.chromiumos.Path.Location\"4\n\x08Location\x12\x0f\n\x0bNO_LOCATION\x10\x00\x12\n\n\x06INSIDE\x10\x01\x12\x0b\n\x07OUTSIDE\x10\x02\",\n\nResultPath\x12\x1e\n\x04path\x18\x01 \x01(\x0b\x32\x10.chromiumos.Path\"\x18\n\tSyncedDir\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"O\n\x0cGerritChange\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0f\n\x07project\x18\x02 \x01(\t\x12\x0e\n\x06\x63hange\x18\x03 \x01(\x03\x12\x10\n\x08patchset\x18\x04 \x01(\x03\"Y\n\rGitilesCommit\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0f\n\x07project\x18\x02 \x01(\t\x12\n\n\x02id\x18\x03 \x01(\t\x12\x0b\n\x03ref\x18\x04 \x01(\t\x12\x10\n\x08position\x18\x05 \x01(\r\"\x17\n\x07UseFlag\x12\x0c\n\x04\x66lag\x18\x01 \x01(\t\"&\n\nProtoBytes\x12\x18\n\x10serialized_proto\x18\x01 \x01(\x0c\"q\n\x1dPrepareForBuildAdditionalArgs\x12\x1c\n\x12\x63hrome_cwp_profile\x18\x01 \x01(\tH\x00\x12\x18\n\x0ekernel_version\x18\x02 \x01(\tH\x00\x42\x18\n\x16prepare_for_build_args\"A\n\x0b\x41\x66\x64oRelease\x12\x1a\n\x12\x63hrome_cwp_profile\x18\x01 \x01(\t\x12\x16\n\x0eimage_build_id\x18\x02 \x01(\x03\"\x97\x01\n\x13\x41rtifactProfileInfo\x12\x1c\n\x12\x63hrome_cwp_profile\x18\x01 \x01(\tH\x00\x12\x18\n\x0ekernel_version\x18\x02 \x01(\tH\x00\x12/\n\x0c\x61\x66\x64o_release\x18\x03 \x01(\x0b\x32\x17.chromiumos.AfdoReleaseH\x00\x42\x17\n\x15\x61rtifact_profile_info\"\xea\x1d\n\x12\x41rtifactsByService\x12\x35\n\x06legacy\x18\x01 \x01(\x0b\x32%.chromiumos.ArtifactsByService.Legacy\x12;\n\ttoolchain\x18\x02 \x01(\x0b\x32(.chromiumos.ArtifactsByService.Toolchain\x12\x33\n\x05image\x18\x03 \x01(\x0b\x32$.chromiumos.ArtifactsByService.Image\x12\x37\n\x07package\x18\x04 \x01(\x0b\x32&.chromiumos.ArtifactsByService.Package\x12\x37\n\x07sysroot\x18\x05 \x01(\x0b\x32&.chromiumos.ArtifactsByService.Sysroot\x12\x31\n\x04test\x18\x06 \x01(\x0b\x32#.chromiumos.ArtifactsByService.Test\x12\x35\n\x0cprofile_info\x18\x07 \x01(\x0b\x32\x1f.chromiumos.ArtifactProfileInfo\x1a\x85\x05\n\x06Legacy\x12K\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x32.chromiumos.ArtifactsByService.Legacy.ArtifactInfo\x12L\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x32.chromiumos.ArtifactsByService.Legacy.ArtifactInfo\x1a\xd4\x01\n\x0c\x41rtifactInfo\x12J\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x32.chromiumos.ArtifactsByService.Legacy.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\x12J\n\x11publish_condition\x18\x05 \x01(\x0e\x32/.chromiumos.ArtifactsByService.PublishConditionJ\x04\x08\x03\x10\x04\"\x88\x02\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\r\n\tIMAGE_ZIP\x10\x01\x12\x17\n\x13TEST_UPDATE_PAYLOAD\x10\x02\x12\x12\n\x0e\x41UTOTEST_FILES\x10\x03\x12\x0e\n\nTAST_FILES\x10\x04\x12\x17\n\x13PINNED_GUEST_IMAGES\x10\x05\x12\x0c\n\x08\x46IRMWARE\x10\x06\x12\x0f\n\x0b\x45\x42UILD_LOGS\x10\x07\x12\x13\n\x0f\x43HROMEOS_CONFIG\x10\x08\x12\x0e\n\nCPE_REPORT\x10\t\x12\x12\n\x0eIMAGE_ARCHIVES\x10\n\x12\x13\n\x0f\x46PMCU_UNITTESTS\x10\x1b\x12\x0f\n\x0bGCE_TARBALL\x10\x1c\"\x04\x08\x0b\x10\x1a\x1a\xf9\x07\n\tToolchain\x12N\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x35.chromiumos.ArtifactsByService.Toolchain.ArtifactInfo\x12O\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x35.chromiumos.ArtifactsByService.Toolchain.ArtifactInfo\x1a\xd1\x01\n\x0c\x41rtifactInfo\x12M\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x35.chromiumos.ArtifactsByService.Toolchain.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\x12J\n\x11publish_condition\x18\x05 \x01(\x0e\x32/.chromiumos.ArtifactsByService.PublishCondition\"\xf6\x04\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12$\n UNVERIFIED_CHROME_LLVM_ORDERFILE\x10\x0b\x12\"\n\x1eVERIFIED_CHROME_LLVM_ORDERFILE\x10\x0c\x12\x1e\n\x1a\x43HROME_CLANG_WARNINGS_FILE\x10\r\x12\x1c\n\x18UNVERIFIED_LLVM_PGO_FILE\x10\x0e\x12)\n%UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE\x10\x0f\x12\'\n#VERIFIED_CHROME_BENCHMARK_AFDO_FILE\x10\x10\x12!\n\x1dVERIFIED_KERNEL_CWP_AFDO_FILE\x10\x11\x12#\n\x1fUNVERIFIED_KERNEL_CWP_AFDO_FILE\x10\x12\x12#\n\x1fUNVERIFIED_CHROME_CWP_AFDO_FILE\x10\x13\x12!\n\x1dVERIFIED_CHROME_CWP_AFDO_FILE\x10\x14\x12\x1e\n\x1aVERIFIED_RELEASE_AFDO_FILE\x10\x15\x12)\n%UNVERIFIED_CHROME_BENCHMARK_PERF_FILE\x10\x16\x12\x17\n\x13\x43HROME_DEBUG_BINARY\x10\x17\x12\x1a\n\x16TOOLCHAIN_WARNING_LOGS\x10\x18\x12)\n%CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX\x10\x19\x12\x19\n\x15\x43LANG_CRASH_DIAGNOSES\x10\x1a\x12\x17\n\x13\x43OMPILER_RUSAGE_LOG\x10\x1d\"\x04\x08\x01\x10\n\"\x04\x08\x1b\x10\x1c\x1a\x97\x03\n\x05Image\x12J\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x31.chromiumos.ArtifactsByService.Image.ArtifactInfo\x12K\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x31.chromiumos.ArtifactsByService.Image.ArtifactInfo\x1a\xcd\x01\n\x0c\x41rtifactInfo\x12I\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x31.chromiumos.ArtifactsByService.Image.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\x12J\n\x11publish_condition\x18\x05 \x01(\x0e\x32/.chromiumos.ArtifactsByService.PublishCondition\"%\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\"\x04\x08\x01\x10\x1c\x1a\x9f\x03\n\x07Package\x12L\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x33.chromiumos.ArtifactsByService.Package.ArtifactInfo\x12M\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x33.chromiumos.ArtifactsByService.Package.ArtifactInfo\x1a\xcf\x01\n\x0c\x41rtifactInfo\x12K\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x33.chromiumos.ArtifactsByService.Package.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\x12J\n\x11publish_condition\x18\x05 \x01(\x0e\x32/.chromiumos.ArtifactsByService.PublishCondition\"%\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\"\x04\x08\x01\x10\x1c\x1a\x9f\x03\n\x07Sysroot\x12L\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x33.chromiumos.ArtifactsByService.Sysroot.ArtifactInfo\x12M\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x33.chromiumos.ArtifactsByService.Sysroot.ArtifactInfo\x1a\xcf\x01\n\x0c\x41rtifactInfo\x12K\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x33.chromiumos.ArtifactsByService.Sysroot.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\x12J\n\x11publish_condition\x18\x05 \x01(\x0e\x32/.chromiumos.ArtifactsByService.PublishCondition\"%\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\"\x04\x08\x01\x10\x1c\x1a\x93\x03\n\x04Test\x12I\n\x0finput_artifacts\x18\x01 \x03(\x0b\x32\x30.chromiumos.ArtifactsByService.Test.ArtifactInfo\x12J\n\x10output_artifacts\x18\x02 \x03(\x0b\x32\x30.chromiumos.ArtifactsByService.Test.ArtifactInfo\x1a\xcc\x01\n\x0c\x41rtifactInfo\x12H\n\x0e\x61rtifact_types\x18\x01 \x03(\x0e\x32\x30.chromiumos.ArtifactsByService.Test.ArtifactType\x12\x14\n\x0cgs_locations\x18\x02 \x03(\t\x12\x10\n\x08\x61\x63l_name\x18\x04 \x01(\t\x12J\n\x11publish_condition\x18\x05 \x01(\x0e\x32/.chromiumos.ArtifactsByService.PublishCondition\"%\n\x0c\x41rtifactType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\"\x04\x08\x01\x10\x1c\"W\n\x10PublishCondition\x12\x17\n\x13PUBLISH_UNSPECIFIED\x10\x00\x12\x16\n\x12PUBLISH_ON_SUCCESS\x10\x01\x12\x12\n\x0ePUBLISH_ALWAYS\x10\x02\"\xc4\x0c\n\x1aUploadedArtifactsByService\x12=\n\x06legacy\x18\x01 \x01(\x0b\x32-.chromiumos.UploadedArtifactsByService.Legacy\x12\x43\n\ttoolchain\x18\x02 \x01(\x0b\x32\x30.chromiumos.UploadedArtifactsByService.Toolchain\x12;\n\x05image\x18\x03 \x01(\x0b\x32,.chromiumos.UploadedArtifactsByService.Image\x12?\n\x07package\x18\x04 \x01(\x0b\x32..chromiumos.UploadedArtifactsByService.Package\x12?\n\x07sysroot\x18\x05 \x01(\x0b\x32..chromiumos.UploadedArtifactsByService.Sysroot\x12\x39\n\x04test\x18\x06 \x01(\x0b\x32+.chromiumos.UploadedArtifactsByService.Test\x1a\xc3\x01\n\x06Legacy\x12N\n\tartifacts\x18\x01 \x03(\x0b\x32;.chromiumos.UploadedArtifactsByService.Legacy.ArtifactPaths\x1ai\n\rArtifactPaths\x12I\n\rartifact_type\x18\x01 \x01(\x0e\x32\x32.chromiumos.ArtifactsByService.Legacy.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xcc\x01\n\tToolchain\x12Q\n\tartifacts\x18\x01 \x03(\x0b\x32>.chromiumos.UploadedArtifactsByService.Toolchain.ArtifactPaths\x1al\n\rArtifactPaths\x12L\n\rartifact_type\x18\x01 \x01(\x0e\x32\x35.chromiumos.ArtifactsByService.Toolchain.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xc0\x01\n\x05Image\x12M\n\tartifacts\x18\x01 \x03(\x0b\x32:.chromiumos.UploadedArtifactsByService.Image.ArtifactPaths\x1ah\n\rArtifactPaths\x12H\n\rartifact_type\x18\x01 \x01(\x0e\x32\x31.chromiumos.ArtifactsByService.Image.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xc6\x01\n\x07Package\x12O\n\tartifacts\x18\x01 \x03(\x0b\x32<.chromiumos.UploadedArtifactsByService.Package.ArtifactPaths\x1aj\n\rArtifactPaths\x12J\n\rartifact_type\x18\x01 \x01(\x0e\x32\x33.chromiumos.ArtifactsByService.Package.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xc6\x01\n\x07Sysroot\x12O\n\tartifacts\x18\x01 \x03(\x0b\x32<.chromiumos.UploadedArtifactsByService.Sysroot.ArtifactPaths\x1aj\n\rArtifactPaths\x12J\n\rartifact_type\x18\x01 \x01(\x0e\x32\x33.chromiumos.ArtifactsByService.Sysroot.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t\x1a\xbd\x01\n\x04Test\x12L\n\tartifacts\x18\x01 \x03(\x0b\x32\x39.chromiumos.UploadedArtifactsByService.Test.ArtifactPaths\x1ag\n\rArtifactPaths\x12G\n\rartifact_type\x18\x01 \x01(\x0e\x32\x30.chromiumos.ArtifactsByService.Test.ArtifactType\x12\r\n\x05paths\x18\x02 \x03(\t*\xe0\x04\n\tImageType\x12\x18\n\x14IMAGE_TYPE_UNDEFINED\x10\x00\x12\x13\n\x0fIMAGE_TYPE_BASE\x10\x01\x12\x12\n\x0eIMAGE_TYPE_DEV\x10\x02\x12\x13\n\x0fIMAGE_TYPE_TEST\x10\x03\x12\x16\n\x12IMAGE_TYPE_BASE_VM\x10\x04\x12\x16\n\x12IMAGE_TYPE_TEST_VM\x10\x05\x12\x17\n\x13IMAGE_TYPE_RECOVERY\x10\x06\x12\x16\n\x12IMAGE_TYPE_FACTORY\x10\x07\x12\x17\n\x13IMAGE_TYPE_FIRMWARE\x10\x08\x12\x1c\n\x18IMAGE_TYPE_CR50_FIRMWARE\x10\t\x12\x1c\n\x18IMAGE_TYPE_BASE_GUEST_VM\x10\n\x12\x1c\n\x18IMAGE_TYPE_TEST_GUEST_VM\x10\x0b\x12\x12\n\x0eIMAGE_TYPE_DLC\x10\x0c\x12\x1b\n\x17IMAGE_TYPE_GSC_FIRMWARE\x10\r\x12\x1e\n\x1aIMAGE_TYPE_ACCESSORY_USBPD\x10\x0e\x12\x1e\n\x1aIMAGE_TYPE_ACCESSORY_RWSIG\x10\x0f\x12\x08\n\x04\x42\x41SE\x10\x01\x12\x07\n\x03\x44\x45V\x10\x02\x12\x08\n\x04TEST\x10\x03\x12\x0b\n\x07\x42\x41SE_VM\x10\x04\x12\x0b\n\x07TEST_VM\x10\x05\x12\x0c\n\x08RECOVERY\x10\x06\x12\x0b\n\x07\x46\x41\x43TORY\x10\x07\x12\x0c\n\x08\x46IRMWARE\x10\x08\x12\x11\n\rCR50_FIRMWARE\x10\t\x12\x11\n\rBASE_GUEST_VM\x10\n\x12\x11\n\rTEST_GUEST_VM\x10\x0b\x12\x07\n\x03\x44LC\x10\x0c\x12\x10\n\x0cGSC_FIRMWARE\x10\r\x1a\x02\x10\x01*m\n\x07\x43hannel\x12\x17\n\x13\x43HANNEL_UNSPECIFIED\x10\x00\x12\x12\n\x0e\x43HANNEL_STABLE\x10\x01\x12\x10\n\x0c\x43HANNEL_BETA\x10\x02\x12\x0f\n\x0b\x43HANNEL_DEV\x10\x03\x12\x12\n\x0e\x43HANNEL_CANARY\x10\x04*c\n\tDeltaType\x12\x11\n\rDELTA_UNKNOWN\x10\x00\x12\x0c\n\x08NO_DELTA\x10\x01\x12\x07\n\x03\x46SI\x10\x02\x12\r\n\tMILESTONE\x10\x03\x12\t\n\x05OMAHA\x10\x04\x12\x12\n\x0eSTEPPING_STONE\x10\x05*f\n\x10\x41\x46\x44OArtifactType\x12\r\n\tNONE_TYPE\x10\x00\x12\r\n\tORDERFILE\x10\x01\x12\x12\n\x0e\x42\x45NCHMARK_AFDO\x10\x02\x12\x0f\n\x0bKERNEL_AFDO\x10\x03\x12\x0f\n\x0b\x43HROME_AFDO\x10\x04\x42\x36Z4go.chromium.org/chromiumos/infra/proto/go/chromiumosb\x06proto3')
 )
 
 _IMAGETYPE = _descriptor.EnumDescriptor(
@@ -34,62 +34,122 @@
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='BASE', index=1, number=1,
+      name='IMAGE_TYPE_BASE', index=1, number=1,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='DEV', index=2, number=2,
+      name='IMAGE_TYPE_DEV', index=2, number=2,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='TEST', index=3, number=3,
+      name='IMAGE_TYPE_TEST', index=3, number=3,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='BASE_VM', index=4, number=4,
+      name='IMAGE_TYPE_BASE_VM', index=4, number=4,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='TEST_VM', index=5, number=5,
+      name='IMAGE_TYPE_TEST_VM', index=5, number=5,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='RECOVERY', index=6, number=6,
+      name='IMAGE_TYPE_RECOVERY', index=6, number=6,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='FACTORY', index=7, number=7,
+      name='IMAGE_TYPE_FACTORY', index=7, number=7,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='FIRMWARE', index=8, number=8,
+      name='IMAGE_TYPE_FIRMWARE', index=8, number=8,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='CR50_FIRMWARE', index=9, number=9,
+      name='IMAGE_TYPE_CR50_FIRMWARE', index=9, number=9,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='BASE_GUEST_VM', index=10, number=10,
+      name='IMAGE_TYPE_BASE_GUEST_VM', index=10, number=10,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='TEST_GUEST_VM', index=11, number=11,
+      name='IMAGE_TYPE_TEST_GUEST_VM', index=11, number=11,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='DLC', index=12, number=12,
+      name='IMAGE_TYPE_DLC', index=12, number=12,
       serialized_options=None,
       type=None),
     _descriptor.EnumValueDescriptor(
-      name='GSC_FIRMWARE', index=13, number=13,
+      name='IMAGE_TYPE_GSC_FIRMWARE', index=13, number=13,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='IMAGE_TYPE_ACCESSORY_USBPD', index=14, number=14,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='IMAGE_TYPE_ACCESSORY_RWSIG', index=15, number=15,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BASE', index=16, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='DEV', index=17, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TEST', index=18, number=3,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BASE_VM', index=19, number=4,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TEST_VM', index=20, number=5,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='RECOVERY', index=21, number=6,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='FACTORY', index=22, number=7,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='FIRMWARE', index=23, number=8,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='CR50_FIRMWARE', index=24, number=9,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BASE_GUEST_VM', index=25, number=10,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TEST_GUEST_VM', index=26, number=11,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='DLC', index=27, number=12,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='GSC_FIRMWARE', index=28, number=13,
       serialized_options=None,
       type=None),
   ],
   containing_type=None,
-  serialized_options=None,
-  serialized_start=6611,
-  serialized_end=6828,
+  serialized_options=_b('\020\001'),
+  serialized_start=7181,
+  serialized_end=7789,
 )
 _sym_db.RegisterEnumDescriptor(_IMAGETYPE)
 
@@ -123,8 +183,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=6830,
-  serialized_end=6939,
+  serialized_start=7791,
+  serialized_end=7900,
 )
 _sym_db.RegisterEnumDescriptor(_CHANNEL)
 
@@ -162,8 +222,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=6941,
-  serialized_end=7040,
+  serialized_start=7902,
+  serialized_end=8001,
 )
 _sym_db.RegisterEnumDescriptor(_DELTATYPE)
 
@@ -197,13 +257,28 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=7042,
-  serialized_end=7144,
+  serialized_start=8003,
+  serialized_end=8105,
 )
 _sym_db.RegisterEnumDescriptor(_AFDOARTIFACTTYPE)
 
 AFDOArtifactType = enum_type_wrapper.EnumTypeWrapper(_AFDOARTIFACTTYPE)
 IMAGE_TYPE_UNDEFINED = 0
+IMAGE_TYPE_BASE = 1
+IMAGE_TYPE_DEV = 2
+IMAGE_TYPE_TEST = 3
+IMAGE_TYPE_BASE_VM = 4
+IMAGE_TYPE_TEST_VM = 5
+IMAGE_TYPE_RECOVERY = 6
+IMAGE_TYPE_FACTORY = 7
+IMAGE_TYPE_FIRMWARE = 8
+IMAGE_TYPE_CR50_FIRMWARE = 9
+IMAGE_TYPE_BASE_GUEST_VM = 10
+IMAGE_TYPE_TEST_GUEST_VM = 11
+IMAGE_TYPE_DLC = 12
+IMAGE_TYPE_GSC_FIRMWARE = 13
+IMAGE_TYPE_ACCESSORY_USBPD = 14
+IMAGE_TYPE_ACCESSORY_RWSIG = 15
 BASE = 1
 DEV = 2
 TEST = 3
@@ -356,8 +431,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2470,
-  serialized_end=2734,
+  serialized_start=2546,
+  serialized_end=2810,
 )
 _sym_db.RegisterEnumDescriptor(_ARTIFACTSBYSERVICE_LEGACY_ARTIFACTTYPE)
 
@@ -435,11 +510,15 @@
       name='CLANG_CRASH_DIAGNOSES', index=16, number=26,
       serialized_options=None,
       type=None),
+    _descriptor.EnumValueDescriptor(
+      name='COMPILER_RUSAGE_LOG', index=17, number=29,
+      serialized_options=None,
+      type=None),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3048,
-  serialized_end=3653,
+  serialized_start=3200,
+  serialized_end=3830,
 )
 _sym_db.RegisterEnumDescriptor(_ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTTYPE)
 
@@ -456,8 +535,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3950,
-  serialized_end=3987,
+  serialized_start=4203,
+  serialized_end=4240,
 )
 _sym_db.RegisterEnumDescriptor(_ARTIFACTSBYSERVICE_IMAGE_ARTIFACTTYPE)
 
@@ -474,8 +553,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3950,
-  serialized_end=3987,
+  serialized_start=4203,
+  serialized_end=4240,
 )
 _sym_db.RegisterEnumDescriptor(_ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTTYPE)
 
@@ -492,8 +571,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3950,
-  serialized_end=3987,
+  serialized_start=4203,
+  serialized_end=4240,
 )
 _sym_db.RegisterEnumDescriptor(_ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTTYPE)
 
@@ -510,11 +589,37 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3950,
-  serialized_end=3987,
+  serialized_start=4203,
+  serialized_end=4240,
 )
 _sym_db.RegisterEnumDescriptor(_ARTIFACTSBYSERVICE_TEST_ARTIFACTTYPE)
 
+_ARTIFACTSBYSERVICE_PUBLISHCONDITION = _descriptor.EnumDescriptor(
+  name='PublishCondition',
+  full_name='chromiumos.ArtifactsByService.PublishCondition',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='PUBLISH_UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='PUBLISH_ON_SUCCESS', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='PUBLISH_ALWAYS', index=2, number=2,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=5484,
+  serialized_end=5571,
+)
+_sym_db.RegisterEnumDescriptor(_ARTIFACTSBYSERVICE_PUBLISHCONDITION)
+
 
 _BUILDTARGET = _descriptor.Descriptor(
   name='BuildTarget',
@@ -1350,6 +1455,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='publish_condition', full_name='chromiumos.ArtifactsByService.Legacy.ArtifactInfo.publish_condition', index=3,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -1363,7 +1475,7 @@
   oneofs=[
   ],
   serialized_start=2331,
-  serialized_end=2467,
+  serialized_end=2543,
 )
 
 _ARTIFACTSBYSERVICE_LEGACY = _descriptor.Descriptor(
@@ -1401,7 +1513,7 @@
   oneofs=[
   ],
   serialized_start=2165,
-  serialized_end=2734,
+  serialized_end=2810,
 )
 
 _ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTINFO = _descriptor.Descriptor(
@@ -1432,6 +1544,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='publish_condition', full_name='chromiumos.ArtifactsByService.Toolchain.ArtifactInfo.publish_condition', index=3,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -1444,8 +1563,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2912,
-  serialized_end=3045,
+  serialized_start=2988,
+  serialized_end=3197,
 )
 
 _ARTIFACTSBYSERVICE_TOOLCHAIN = _descriptor.Descriptor(
@@ -1482,8 +1601,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2737,
-  serialized_end=3653,
+  serialized_start=2813,
+  serialized_end=3830,
 )
 
 _ARTIFACTSBYSERVICE_IMAGE_ARTIFACTINFO = _descriptor.Descriptor(
@@ -1514,6 +1633,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='publish_condition', full_name='chromiumos.ArtifactsByService.Image.ArtifactInfo.publish_condition', index=3,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -1526,8 +1652,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3819,
-  serialized_end=3948,
+  serialized_start=3996,
+  serialized_end=4201,
 )
 
 _ARTIFACTSBYSERVICE_IMAGE = _descriptor.Descriptor(
@@ -1564,8 +1690,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3656,
-  serialized_end=3987,
+  serialized_start=3833,
+  serialized_end=4240,
 )
 
 _ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTINFO = _descriptor.Descriptor(
@@ -1596,6 +1722,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='publish_condition', full_name='chromiumos.ArtifactsByService.Package.ArtifactInfo.publish_condition', index=3,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -1608,8 +1741,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4159,
-  serialized_end=4290,
+  serialized_start=4412,
+  serialized_end=4619,
 )
 
 _ARTIFACTSBYSERVICE_PACKAGE = _descriptor.Descriptor(
@@ -1646,8 +1779,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3990,
-  serialized_end=4329,
+  serialized_start=4243,
+  serialized_end=4658,
 )
 
 _ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTINFO = _descriptor.Descriptor(
@@ -1678,6 +1811,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='publish_condition', full_name='chromiumos.ArtifactsByService.Sysroot.ArtifactInfo.publish_condition', index=3,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -1690,8 +1830,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4501,
-  serialized_end=4632,
+  serialized_start=4830,
+  serialized_end=5037,
 )
 
 _ARTIFACTSBYSERVICE_SYSROOT = _descriptor.Descriptor(
@@ -1728,8 +1868,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4332,
-  serialized_end=4671,
+  serialized_start=4661,
+  serialized_end=5076,
 )
 
 _ARTIFACTSBYSERVICE_TEST_ARTIFACTINFO = _descriptor.Descriptor(
@@ -1760,6 +1900,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='publish_condition', full_name='chromiumos.ArtifactsByService.Test.ArtifactInfo.publish_condition', index=3,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -1772,8 +1919,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4834,
-  serialized_end=4962,
+  serialized_start=5239,
+  serialized_end=5443,
 )
 
 _ARTIFACTSBYSERVICE_TEST = _descriptor.Descriptor(
@@ -1810,8 +1957,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4674,
-  serialized_end=5001,
+  serialized_start=5079,
+  serialized_end=5482,
 )
 
 _ARTIFACTSBYSERVICE = _descriptor.Descriptor(
@@ -1875,6 +2022,7 @@
   ],
   nested_types=[_ARTIFACTSBYSERVICE_LEGACY, _ARTIFACTSBYSERVICE_TOOLCHAIN, _ARTIFACTSBYSERVICE_IMAGE, _ARTIFACTSBYSERVICE_PACKAGE, _ARTIFACTSBYSERVICE_SYSROOT, _ARTIFACTSBYSERVICE_TEST, ],
   enum_types=[
+    _ARTIFACTSBYSERVICE_PUBLISHCONDITION,
   ],
   serialized_options=None,
   is_extendable=False,
@@ -1883,7 +2031,7 @@
   oneofs=[
   ],
   serialized_start=1753,
-  serialized_end=5001,
+  serialized_end=5571,
 )
 
 
@@ -1920,8 +2068,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5507,
-  serialized_end=5612,
+  serialized_start=6077,
+  serialized_end=6182,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_LEGACY = _descriptor.Descriptor(
@@ -1950,8 +2098,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5417,
-  serialized_end=5612,
+  serialized_start=5987,
+  serialized_end=6182,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTPATHS = _descriptor.Descriptor(
@@ -1987,8 +2135,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5711,
-  serialized_end=5819,
+  serialized_start=6281,
+  serialized_end=6389,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_TOOLCHAIN = _descriptor.Descriptor(
@@ -2017,8 +2165,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5615,
-  serialized_end=5819,
+  serialized_start=6185,
+  serialized_end=6389,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_IMAGE_ARTIFACTPATHS = _descriptor.Descriptor(
@@ -2054,8 +2202,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5910,
-  serialized_end=6014,
+  serialized_start=6480,
+  serialized_end=6584,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_IMAGE = _descriptor.Descriptor(
@@ -2084,8 +2232,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5822,
-  serialized_end=6014,
+  serialized_start=6392,
+  serialized_end=6584,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_PACKAGE_ARTIFACTPATHS = _descriptor.Descriptor(
@@ -2121,8 +2269,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6109,
-  serialized_end=6215,
+  serialized_start=6679,
+  serialized_end=6785,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_PACKAGE = _descriptor.Descriptor(
@@ -2151,8 +2299,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6017,
-  serialized_end=6215,
+  serialized_start=6587,
+  serialized_end=6785,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_SYSROOT_ARTIFACTPATHS = _descriptor.Descriptor(
@@ -2188,8 +2336,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6310,
-  serialized_end=6416,
+  serialized_start=6880,
+  serialized_end=6986,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_SYSROOT = _descriptor.Descriptor(
@@ -2218,8 +2366,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6218,
-  serialized_end=6416,
+  serialized_start=6788,
+  serialized_end=6986,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_TEST_ARTIFACTPATHS = _descriptor.Descriptor(
@@ -2255,8 +2403,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6505,
-  serialized_end=6608,
+  serialized_start=7075,
+  serialized_end=7178,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE_TEST = _descriptor.Descriptor(
@@ -2285,8 +2433,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6419,
-  serialized_end=6608,
+  serialized_start=6989,
+  serialized_end=7178,
 )
 
 _UPLOADEDARTIFACTSBYSERVICE = _descriptor.Descriptor(
@@ -2350,8 +2498,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5004,
-  serialized_end=6608,
+  serialized_start=5574,
+  serialized_end=7178,
 )
 
 _CHROOT_CHROOTENV.fields_by_name['use_flags'].message_type = _USEFLAG
@@ -2383,36 +2531,42 @@
   _ARTIFACTPROFILEINFO.fields_by_name['afdo_release'])
 _ARTIFACTPROFILEINFO.fields_by_name['afdo_release'].containing_oneof = _ARTIFACTPROFILEINFO.oneofs_by_name['artifact_profile_info']
 _ARTIFACTSBYSERVICE_LEGACY_ARTIFACTINFO.fields_by_name['artifact_types'].enum_type = _ARTIFACTSBYSERVICE_LEGACY_ARTIFACTTYPE
+_ARTIFACTSBYSERVICE_LEGACY_ARTIFACTINFO.fields_by_name['publish_condition'].enum_type = _ARTIFACTSBYSERVICE_PUBLISHCONDITION
 _ARTIFACTSBYSERVICE_LEGACY_ARTIFACTINFO.containing_type = _ARTIFACTSBYSERVICE_LEGACY
 _ARTIFACTSBYSERVICE_LEGACY.fields_by_name['input_artifacts'].message_type = _ARTIFACTSBYSERVICE_LEGACY_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_LEGACY.fields_by_name['output_artifacts'].message_type = _ARTIFACTSBYSERVICE_LEGACY_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_LEGACY.containing_type = _ARTIFACTSBYSERVICE
 _ARTIFACTSBYSERVICE_LEGACY_ARTIFACTTYPE.containing_type = _ARTIFACTSBYSERVICE_LEGACY
 _ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTINFO.fields_by_name['artifact_types'].enum_type = _ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTTYPE
+_ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTINFO.fields_by_name['publish_condition'].enum_type = _ARTIFACTSBYSERVICE_PUBLISHCONDITION
 _ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTINFO.containing_type = _ARTIFACTSBYSERVICE_TOOLCHAIN
 _ARTIFACTSBYSERVICE_TOOLCHAIN.fields_by_name['input_artifacts'].message_type = _ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_TOOLCHAIN.fields_by_name['output_artifacts'].message_type = _ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_TOOLCHAIN.containing_type = _ARTIFACTSBYSERVICE
 _ARTIFACTSBYSERVICE_TOOLCHAIN_ARTIFACTTYPE.containing_type = _ARTIFACTSBYSERVICE_TOOLCHAIN
 _ARTIFACTSBYSERVICE_IMAGE_ARTIFACTINFO.fields_by_name['artifact_types'].enum_type = _ARTIFACTSBYSERVICE_IMAGE_ARTIFACTTYPE
+_ARTIFACTSBYSERVICE_IMAGE_ARTIFACTINFO.fields_by_name['publish_condition'].enum_type = _ARTIFACTSBYSERVICE_PUBLISHCONDITION
 _ARTIFACTSBYSERVICE_IMAGE_ARTIFACTINFO.containing_type = _ARTIFACTSBYSERVICE_IMAGE
 _ARTIFACTSBYSERVICE_IMAGE.fields_by_name['input_artifacts'].message_type = _ARTIFACTSBYSERVICE_IMAGE_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_IMAGE.fields_by_name['output_artifacts'].message_type = _ARTIFACTSBYSERVICE_IMAGE_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_IMAGE.containing_type = _ARTIFACTSBYSERVICE
 _ARTIFACTSBYSERVICE_IMAGE_ARTIFACTTYPE.containing_type = _ARTIFACTSBYSERVICE_IMAGE
 _ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTINFO.fields_by_name['artifact_types'].enum_type = _ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTTYPE
+_ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTINFO.fields_by_name['publish_condition'].enum_type = _ARTIFACTSBYSERVICE_PUBLISHCONDITION
 _ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTINFO.containing_type = _ARTIFACTSBYSERVICE_PACKAGE
 _ARTIFACTSBYSERVICE_PACKAGE.fields_by_name['input_artifacts'].message_type = _ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_PACKAGE.fields_by_name['output_artifacts'].message_type = _ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_PACKAGE.containing_type = _ARTIFACTSBYSERVICE
 _ARTIFACTSBYSERVICE_PACKAGE_ARTIFACTTYPE.containing_type = _ARTIFACTSBYSERVICE_PACKAGE
 _ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTINFO.fields_by_name['artifact_types'].enum_type = _ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTTYPE
+_ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTINFO.fields_by_name['publish_condition'].enum_type = _ARTIFACTSBYSERVICE_PUBLISHCONDITION
 _ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTINFO.containing_type = _ARTIFACTSBYSERVICE_SYSROOT
 _ARTIFACTSBYSERVICE_SYSROOT.fields_by_name['input_artifacts'].message_type = _ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_SYSROOT.fields_by_name['output_artifacts'].message_type = _ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_SYSROOT.containing_type = _ARTIFACTSBYSERVICE
 _ARTIFACTSBYSERVICE_SYSROOT_ARTIFACTTYPE.containing_type = _ARTIFACTSBYSERVICE_SYSROOT
 _ARTIFACTSBYSERVICE_TEST_ARTIFACTINFO.fields_by_name['artifact_types'].enum_type = _ARTIFACTSBYSERVICE_TEST_ARTIFACTTYPE
+_ARTIFACTSBYSERVICE_TEST_ARTIFACTINFO.fields_by_name['publish_condition'].enum_type = _ARTIFACTSBYSERVICE_PUBLISHCONDITION
 _ARTIFACTSBYSERVICE_TEST_ARTIFACTINFO.containing_type = _ARTIFACTSBYSERVICE_TEST
 _ARTIFACTSBYSERVICE_TEST.fields_by_name['input_artifacts'].message_type = _ARTIFACTSBYSERVICE_TEST_ARTIFACTINFO
 _ARTIFACTSBYSERVICE_TEST.fields_by_name['output_artifacts'].message_type = _ARTIFACTSBYSERVICE_TEST_ARTIFACTINFO
@@ -2425,6 +2579,7 @@
 _ARTIFACTSBYSERVICE.fields_by_name['sysroot'].message_type = _ARTIFACTSBYSERVICE_SYSROOT
 _ARTIFACTSBYSERVICE.fields_by_name['test'].message_type = _ARTIFACTSBYSERVICE_TEST
 _ARTIFACTSBYSERVICE.fields_by_name['profile_info'].message_type = _ARTIFACTPROFILEINFO
+_ARTIFACTSBYSERVICE_PUBLISHCONDITION.containing_type = _ARTIFACTSBYSERVICE
 _UPLOADEDARTIFACTSBYSERVICE_LEGACY_ARTIFACTPATHS.fields_by_name['artifact_type'].enum_type = _ARTIFACTSBYSERVICE_LEGACY_ARTIFACTTYPE
 _UPLOADEDARTIFACTSBYSERVICE_LEGACY_ARTIFACTPATHS.containing_type = _UPLOADEDARTIFACTSBYSERVICE_LEGACY
 _UPLOADEDARTIFACTSBYSERVICE_LEGACY.fields_by_name['artifacts'].message_type = _UPLOADEDARTIFACTSBYSERVICE_LEGACY_ARTIFACTPATHS
@@ -2823,4 +2978,5 @@
 
 
 DESCRIPTOR._options = None
+_IMAGETYPE._options = None
 # @@protoc_insertion_point(module_scope)
diff --git a/api/gen/test_platform/phosphorus/fetchcrashes_pb2.py b/api/gen/test_platform/phosphorus/fetchcrashes_pb2.py
new file mode 100644
index 0000000..fbee171
--- /dev/null
+++ b/api/gen/test_platform/phosphorus/fetchcrashes_pb2.py
@@ -0,0 +1,268 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: test_platform/phosphorus/fetchcrashes.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+from chromite.api.gen.test_platform.phosphorus import common_pb2 as test__platform_dot_phosphorus_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='test_platform/phosphorus/fetchcrashes.proto',
+  package='test_platform.phosphorus',
+  syntax='proto3',
+  serialized_options=_b('ZBgo.chromium.org/chromiumos/infra/proto/go/test_platform/phosphorus'),
+  serialized_pb=_b('\n+test_platform/phosphorus/fetchcrashes.proto\x12\x18test_platform.phosphorus\x1a\x1fgoogle/protobuf/timestamp.proto\x1a%test_platform/phosphorus/common.proto\"\xb8\x01\n\x13\x46\x65tchCrashesRequest\x12\x30\n\x06\x63onfig\x18\x01 \x01(\x0b\x32 .test_platform.phosphorus.Config\x12\x14\n\x0c\x64ut_hostname\x18\x02 \x01(\t\x12,\n\x08\x64\x65\x61\x64line\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0eupload_crashes\x18\x04 \x01(\x08\x12\x13\n\x0buse_staging\x18\x05 \x01(\x08\"\x7f\n\x0c\x43rashSummary\x12\x11\n\texec_name\x18\x01 \x01(\t\x12\x12\n\nupload_url\x18\x02 \x01(\t\x12$\n\x1cin_progress_integration_test\x18\x03 \x01(\t\x12\x0b\n\x03sig\x18\x04 \x01(\t\x12\x15\n\rfilename_base\x18\x05 \x01(\t\"\x9f\x02\n\x14\x46\x65tchCrashesResponse\x12\x43\n\x05state\x18\x01 \x01(\x0e\x32\x34.test_platform.phosphorus.FetchCrashesResponse.State\x12\x37\n\x07\x63rashes\x18\x02 \x03(\x0b\x32&.test_platform.phosphorus.CrashSummary\x12\x18\n\x10\x63rashes_rtd_only\x18\x04 \x03(\t\x12\x18\n\x10\x63rashes_tls_only\x18\x05 \x03(\t\"U\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\r\n\tSUCCEEDED\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x12\r\n\tTIMED_OUT\x10\x03\x12\x0b\n\x07\x41\x42ORTED\x10\x04\x42\x44ZBgo.chromium.org/chromiumos/infra/proto/go/test_platform/phosphorusb\x06proto3')
+  ,
+  dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,test__platform_dot_phosphorus_dot_common__pb2.DESCRIPTOR,])
+
+
+
+_FETCHCRASHESRESPONSE_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='test_platform.phosphorus.FetchCrashesResponse.State',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='STATE_UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='SUCCEEDED', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='FAILED', index=2, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TIMED_OUT', index=3, number=3,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='ABORTED', index=4, number=4,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=664,
+  serialized_end=749,
+)
+_sym_db.RegisterEnumDescriptor(_FETCHCRASHESRESPONSE_STATE)
+
+
+_FETCHCRASHESREQUEST = _descriptor.Descriptor(
+  name='FetchCrashesRequest',
+  full_name='test_platform.phosphorus.FetchCrashesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='config', full_name='test_platform.phosphorus.FetchCrashesRequest.config', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='dut_hostname', full_name='test_platform.phosphorus.FetchCrashesRequest.dut_hostname', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='deadline', full_name='test_platform.phosphorus.FetchCrashesRequest.deadline', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='upload_crashes', full_name='test_platform.phosphorus.FetchCrashesRequest.upload_crashes', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='use_staging', full_name='test_platform.phosphorus.FetchCrashesRequest.use_staging', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=146,
+  serialized_end=330,
+)
+
+
+_CRASHSUMMARY = _descriptor.Descriptor(
+  name='CrashSummary',
+  full_name='test_platform.phosphorus.CrashSummary',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='exec_name', full_name='test_platform.phosphorus.CrashSummary.exec_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='upload_url', full_name='test_platform.phosphorus.CrashSummary.upload_url', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='in_progress_integration_test', full_name='test_platform.phosphorus.CrashSummary.in_progress_integration_test', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sig', full_name='test_platform.phosphorus.CrashSummary.sig', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='filename_base', full_name='test_platform.phosphorus.CrashSummary.filename_base', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=332,
+  serialized_end=459,
+)
+
+
+_FETCHCRASHESRESPONSE = _descriptor.Descriptor(
+  name='FetchCrashesResponse',
+  full_name='test_platform.phosphorus.FetchCrashesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='test_platform.phosphorus.FetchCrashesResponse.state', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='crashes', full_name='test_platform.phosphorus.FetchCrashesResponse.crashes', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='crashes_rtd_only', full_name='test_platform.phosphorus.FetchCrashesResponse.crashes_rtd_only', index=2,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='crashes_tls_only', full_name='test_platform.phosphorus.FetchCrashesResponse.crashes_tls_only', index=3,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _FETCHCRASHESRESPONSE_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=462,
+  serialized_end=749,
+)
+
+_FETCHCRASHESREQUEST.fields_by_name['config'].message_type = test__platform_dot_phosphorus_dot_common__pb2._CONFIG
+_FETCHCRASHESREQUEST.fields_by_name['deadline'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_FETCHCRASHESRESPONSE.fields_by_name['state'].enum_type = _FETCHCRASHESRESPONSE_STATE
+_FETCHCRASHESRESPONSE.fields_by_name['crashes'].message_type = _CRASHSUMMARY
+_FETCHCRASHESRESPONSE_STATE.containing_type = _FETCHCRASHESRESPONSE
+DESCRIPTOR.message_types_by_name['FetchCrashesRequest'] = _FETCHCRASHESREQUEST
+DESCRIPTOR.message_types_by_name['CrashSummary'] = _CRASHSUMMARY
+DESCRIPTOR.message_types_by_name['FetchCrashesResponse'] = _FETCHCRASHESRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+FetchCrashesRequest = _reflection.GeneratedProtocolMessageType('FetchCrashesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _FETCHCRASHESREQUEST,
+  __module__ = 'test_platform.phosphorus.fetchcrashes_pb2'
+  # @@protoc_insertion_point(class_scope:test_platform.phosphorus.FetchCrashesRequest)
+  ))
+_sym_db.RegisterMessage(FetchCrashesRequest)
+
+CrashSummary = _reflection.GeneratedProtocolMessageType('CrashSummary', (_message.Message,), dict(
+  DESCRIPTOR = _CRASHSUMMARY,
+  __module__ = 'test_platform.phosphorus.fetchcrashes_pb2'
+  # @@protoc_insertion_point(class_scope:test_platform.phosphorus.CrashSummary)
+  ))
+_sym_db.RegisterMessage(CrashSummary)
+
+FetchCrashesResponse = _reflection.GeneratedProtocolMessageType('FetchCrashesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _FETCHCRASHESRESPONSE,
+  __module__ = 'test_platform.phosphorus.fetchcrashes_pb2'
+  # @@protoc_insertion_point(class_scope:test_platform.phosphorus.FetchCrashesResponse)
+  ))
+_sym_db.RegisterMessage(FetchCrashesResponse)
+
+
+DESCRIPTOR._options = None
+# @@protoc_insertion_point(module_scope)
diff --git a/api/router.py b/api/router.py
index 0fd85be..f556552 100644
--- a/api/router.py
+++ b/api/router.py
@@ -208,7 +208,7 @@
 
     # Check the chroot settings before running.
     service_options = self._get_service_options(service_name, method_name)
-    if self._ChrootCheck(service_options, method_options):
+    if self._ChrootCheck(service_options, method_options, config):
       # Run inside the chroot instead.
       logging.info('Re-executing the endpoint inside the chroot.')
       return self._ReexecuteInside(input_msg, output_msg, config, input_handler,
@@ -235,12 +235,14 @@
 
     return return_code
 
-  def _ChrootCheck(self, service_options, method_options):
+  def _ChrootCheck(self, service_options, method_options,
+                   config: 'api_config.ApiConfig'):
     """Check the chroot options, and execute assertion or note reexec as needed.
 
     Args:
       service_options (google.protobuf.Message): The service options.
       method_options (google.protobuf.Message): The method options.
+      config: The Build API call config instance.
 
     Returns:
       bool - True iff it needs to be reexeced inside the chroot.
@@ -248,6 +250,10 @@
     Raises:
       cros_build_lib.DieSystemExit when the chroot setting cannot be satisfied.
     """
+    if not config.run_endpoint:
+      # Do not enter the chroot for validate only and mock calls.
+      return False
+
     chroot_assert = build_api_pb2.NO_ASSERTION
     if method_options.HasField('method_chroot_assert'):
       # Prefer the method option when set.
diff --git a/api/validate.py b/api/validate.py
index d8a075d..0f61a39 100644
--- a/api/validate.py
+++ b/api/validate.py
@@ -132,6 +132,35 @@
   return decorator
 
 
+# pylint: disable=docstring-misnamed-args
+def require_any(*fields):
+  """Verify at least one of |fields| have been set.
+
+  Args:
+    fields (str): The fields being checked. May be . separated nested fields.
+  """
+  assert fields
+
+  def decorator(func):
+    @functools.wraps(func)
+    def _require(input_proto, output_proto, config, *args, **kwargs):
+      if config.do_validation:
+        for field in fields:
+          logging.debug('Validating %s is set.', field)
+          value = _value(field, input_proto)
+          if value:
+            break
+        else:
+          cros_build_lib.Die('At least one of the following must be set: %s',
+                             ', '.join(fields))
+
+      return func(input_proto, output_proto, config, *args, **kwargs)
+
+    return _require
+
+  return decorator
+
+
 def require_each(field, subfields, allow_empty=True):
   """Verify |field| each have all of the |subfields| set.
 
diff --git a/api/validate_unittest.py b/api/validate_unittest.py
index e42b740..00e57ab 100644
--- a/api/validate_unittest.py
+++ b/api/validate_unittest.py
@@ -100,8 +100,8 @@
     impl(common_pb2.Chroot(), None, self.no_validate_config)
 
 
-class RequiredTest(cros_test_lib.TestCase, api_config.ApiConfigMixin):
-  """Tests for the required validator."""
+class RequireTest(cros_test_lib.TestCase, api_config.ApiConfigMixin):
+  """Tests for the require validator."""
 
   def test_invalid_field(self):
     """Test validator fails when given an unset value."""
@@ -135,7 +135,7 @@
     impl(in_proto, None, self.api_config)
 
   def test_mixed(self):
-    """Test validator passes when given a set value."""
+    """Test validator fails when given a set value and an unset value."""
 
     @validate.require('path', 'env.use_flags')
     def impl(_input_proto, _output_proto, _config):
@@ -154,6 +154,54 @@
     impl(common_pb2.Chroot(), None, self.no_validate_config)
 
 
+class RequireAnyTest(cros_test_lib.TestCase, api_config.ApiConfigMixin):
+  """Tests for the require_any validator."""
+
+  def _get_request(self, mid: int = None, name: str = None, flag: bool = None):
+    """Build a request instance from the given data."""
+    request = build_api_test_pb2.MultiFieldMessage()
+
+    if mid:
+      request.id = mid
+    if name:
+      request.name = name
+    if flag:
+      request.flag = flag
+
+    return request
+
+  def test_invalid_field(self):
+    """Test validator fails when given an invalid field."""
+
+    @validate.require_any('does.not.exist', 'also.invalid')
+    def impl(_input_proto, _output_proto, _config):
+      self.fail('Incorrectly allowed method to execute.')
+
+    with self.assertRaises(cros_build_lib.DieSystemExit):
+      impl(self._get_request(), None, self.api_config)
+
+  def test_not_set(self):
+    """Test validator fails when given unset values."""
+
+    @validate.require_any('id', 'name')
+    def impl(_input_proto, _output_proto, _config):
+      self.fail('Incorrectly allowed method to execute.')
+
+    with self.assertRaises(cros_build_lib.DieSystemExit):
+      impl(self._get_request(flag=True), None, self.api_config)
+
+  def test_set(self):
+    """Test validator passes when given set values."""
+
+    @validate.require_any('id', 'name')
+    def impl(_input_proto, _output_proto, _config):
+      pass
+
+    impl(self._get_request(1), None, self.api_config)
+    impl(self._get_request(name='foo'), None, self.api_config)
+    impl(self._get_request(1, name='foo'), None, self.api_config)
+
+
 class RequireEachTest(cros_test_lib.TestCase, api_config.ApiConfigMixin):
   """Tests for the require_each validator."""
 
diff --git a/cbuildbot/stages/artifact_stages.py b/cbuildbot/stages/artifact_stages.py
index bd4705f..f6ef467 100644
--- a/cbuildbot/stages/artifact_stages.py
+++ b/cbuildbot/stages/artifact_stages.py
@@ -126,6 +126,12 @@
         basename = os.path.basename(image_file)
         info = {'input': [basename], 'archive': 'tar', 'compress': 'xz'}
         artifacts.append(info)
+      if self._run.config.guest_vm_image:
+        for image in (constants.BASE_GUEST_VM_DIR, constants.TEST_GUEST_VM_DIR):
+          artifacts.append({'input': [image + '/*'],
+                            'output': image + '.tbz',
+                            'archive': 'tar',
+                            'compress': 'bz2'})
       # We add the dlc folder (if exists) as artifact so we can copy all DLC
       # artifacts as is.
       if os.path.isdir(os.path.join(image_dir, 'dlc')):
diff --git a/cbuildbot/stages/build_stages.py b/cbuildbot/stages/build_stages.py
index 9b465cd..1467848 100644
--- a/cbuildbot/stages/build_stages.py
+++ b/cbuildbot/stages/build_stages.py
@@ -19,6 +19,7 @@
 from chromite.lib import buildbucket_lib
 from chromite.lib import builder_status_lib
 from chromite.lib import build_summary
+from chromite.lib import chroot_lib
 from chromite.lib import constants
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_logging as logging
@@ -30,6 +31,7 @@
 from chromite.lib import portage_util
 from chromite.lib import request_build
 from chromite.lib.parser import package_info
+from chromite.service import image as image_service
 
 
 class CleanUpStage(generic_stages.BuilderStage):
@@ -811,7 +813,9 @@
 
     self.board_runattrs.SetParallel('images_generated', True)
 
-    parallel.RunParallelSteps([self._BuildVMImage, self._BuildGceTarballs])
+    parallel.RunParallelSteps([self._BuildVMImage,
+                               self._BuildGuestVMImage,
+                               self._BuildGceTarballs])
 
   def _BuildVMImage(self):
     # Adding startswith('betty') hack to create VM image for betty-arc-r.
@@ -826,6 +830,20 @@
           extra_env=self._portage_extra_env,
           disk_layout=self._run.config.disk_layout)
 
+  def _BuildGuestVMImage(self):
+    if self._run.config.guest_vm_image:
+      chroot_path = os.path.join(self._build_root, constants.DEFAULT_CHROOT_DIR)
+      chroot = chroot_lib.Chroot(path=chroot_path)
+      for image in self._run.config.images:
+        if image in (constants.IMAGE_TYPE_BASE, constants.IMAGE_TYPE_TEST):
+          image_service.CreateGuestVm(
+              self._current_board,
+              is_test=(image == constants.IMAGE_TYPE_TEST),
+              chroot=chroot)
+        else:
+          # ignore other kinds of image
+          pass
+
   def _BuildGceTarballs(self):
     """Creates .tar.gz files that can be converted to GCE images.
 
diff --git a/cli/cros/lint_unittest b/cli/cros/lint_unittest
deleted file mode 120000
index ef3e37b..0000000
--- a/cli/cros/lint_unittest
+++ /dev/null
@@ -1 +0,0 @@
-../../scripts/wrapper.py
\ No newline at end of file
diff --git a/cli/deploy.py b/cli/deploy.py
index 74b8d6f..f677fcf 100644
--- a/cli/deploy.py
+++ b/cli/deploy.py
@@ -936,7 +936,7 @@
   if device.run(['qmerge', '--version'], check=False).returncode != 0:
     cmd = ['emerge']
 
-  cmd.extend(['--unmerge', pkg, '--root=%s' % root])
+  cmd.extend(['--unmerge', f'={pkg}', '--root=%s' % root])
   try:
     # Always showing the emerge output for clarity.
     device.run(cmd, capture_output=False, remote_sudo=True,
@@ -1164,7 +1164,9 @@
 
       sysroot = cros_build_lib.GetSysroot(board=board)
 
-      if clean_binpkg:
+      # Don't bother trying to clean for unmerges.  We won't use the local db,
+      # and it just slows things down for the user.
+      if emerge and clean_binpkg:
         logging.notice('Cleaning outdated binary packages from %s', sysroot)
         portage_util.CleanOutdatedBinaryPackages(sysroot)
 
@@ -1186,14 +1188,15 @@
         logging.notice('No packages to %s', action_str)
         return
 
-      # Warn when the user seems to forget `cros workon start`.
-      worked_on_cps = workon_helper.WorkonHelper(sysroot).ListAtoms()
-      for package in listed:
-        cp = package_info.SplitCPV(package).cp
-        if cp not in worked_on_cps:
-          logging.warning(
-              'Are you intentionally deploying unmodified packages, or did '
-              'you forget to run `cros workon --board=$BOARD start %s`?', cp)
+      # Warn when the user installs & didn't `cros workon start`.
+      if emerge:
+        worked_on_cps = workon_helper.WorkonHelper(sysroot).ListAtoms()
+        for package in listed:
+          cp = package_info.SplitCPV(package).cp
+          if cp not in worked_on_cps:
+            logging.warning(
+                'Are you intentionally deploying unmodified packages, or did '
+                'you forget to run `cros workon --board=$BOARD start %s`?', cp)
 
       logging.notice('These are the packages to %s:', action_str)
       for i, pkg in enumerate(pkgs):
diff --git a/config/chromeos_config.py b/config/chromeos_config.py
index 0b530e3..49fe1d4 100644
--- a/config/chromeos_config.py
+++ b/config/chromeos_config.py
@@ -276,6 +276,7 @@
       upload_hw_test_artifacts=False,
       upload_stripped_packages=['sys-kernel/*kernel*'],
       image_test=False,
+      guest_vm_image=True,
       images=['base', 'test'],
       packages=['virtual/target-os',
                 'virtual/target-os-dev',
@@ -1710,7 +1711,7 @@
   WEEKLY = 'with 168h interval'  # 1 week interval
   MONTHLY = 'with 720h interval'  # 30 day interval
   # Override these template variables via kwargs.
-  CR50 = {'sign_types': ['cr50_firmware']}
+  GSC = {'sign_types': ['gsc_firmware']}
   firmware_branch_builders = [
       (MONTHLY, 'firmware-monroe-4921.B', ['monroe'], {}),
       (MONTHLY, 'firmware-enguarde-5216.201.B', ['enguarde'], {}),
@@ -1720,9 +1721,9 @@
       (MONTHLY, 'firmware-gnawty-5216.239.B', ['gnawty'], {}),
       (MONTHLY, 'firmware-winky-5216.265.B', ['winky'], {}),
       (MONTHLY, 'firmware-candy-5216.310.B', ['candy'], {}),
-      (MONTHLY, 'firmware-cr50-9308.B', ['reef'], CR50),
-      (MONTHLY, 'firmware-cr50-guc-factory-9308.26.B', ['reef'], CR50),
-      (MONTHLY, 'firmware-cr50-mp-release-9308.87.B', ['reef'], CR50),
+      (MONTHLY, 'firmware-cr50-9308.B', ['reef'], GSC),
+      (MONTHLY, 'firmware-cr50-guc-factory-9308.26.B', ['reef'], GSC),
+      (MONTHLY, 'firmware-cr50-mp-release-9308.87.B', ['reef'], GSC),
       (MONTHLY, 'firmware-banjo-5216.334.B', ['banjo'], {}),
       (MONTHLY, 'firmware-orco-5216.362.B', ['orco'], {}),
       (MONTHLY, 'firmware-sumo-5216.382.B', ['sumo'], {}),
@@ -2392,6 +2393,19 @@
           'hw_tests_disabled_bug': 'http://crbug.com/1091053',
       },
 
+      # No hw_tests for eve-kernelnext and eve-arc-r.  See crbug.com/1161335
+      'eve-kernelnext-release': {
+          'hw_tests': [],
+          'hw_tests_override': [],
+          'hw_tests_disabled_bug': 'http://crbug.com/1161335',
+      },
+
+      'eve-arc-r-release': {
+          'hw_tests': [],
+          'hw_tests_override': [],
+          'hw_tests_disabled_bug': 'http://crbug.com/1161335',
+      },
+
       # No hw_tests for eve-kvm.  See crbug.com/1085769.
       'eve-kvm-release': {
           'hw_tests': [],
@@ -2634,6 +2648,8 @@
   # Some Unibuild boards need to have hardware tests disabled.  This means
   # disabling it at the model level as well.
   _unibuild_disabled_hw_tests = frozenset([
+      'eve-kernelnext-release',  # crbug.com/1161335
+      'eve-arc-r-release',  # crbug.com/1161335
   ])
 
   for config_name in _unibuild_disabled_hw_tests:
@@ -3098,7 +3114,7 @@
 
       ('release-R87-13505.B',
        ['grunt-android-pi-pre-flight-branch'],
-       'chell-chrome-no-afdo-uprev-pre-flight-branch',
+       '',
        ['orderfile-generate-toolchain',
         'orderfile-verify-toolchain'],
        ['benchmark-afdo-generate',
diff --git a/config/chromeos_config_boards.py b/config/chromeos_config_boards.py
index d2afe41..6133941 100644
--- a/config/chromeos_config_boards.py
+++ b/config/chromeos_config_boards.py
@@ -32,6 +32,7 @@
     'nyan_big',
     'nyan_blaze',
     'oak',
+    'tael',
     'veyron_jaq',
     'veyron_jerry',
     'veyron_mighty',
@@ -47,7 +48,6 @@
     'arm-generic',
     'arm64-generic',
     'arm64-llvmpipe',
-    'tael',
 ])
 
 x86_internal_release_boards = frozenset([
@@ -64,13 +64,13 @@
     'poppy',
     'samus-kernelnext',
     'sludge',
+    'tatl',
     'wristpin',
 ])
 
 x86_external_boards = frozenset([
     'amd64-generic',
     'moblab-generic-vm',
-    'tatl',
     'x32-generic',
 ])
 
@@ -163,6 +163,9 @@
 builder_incompatible_binaries_boards = frozenset([
     'grunt',
     'grunt-arc-r',
+    'guybrush',
+    'majolica',
+    'mancomb',
     'zork',
     'zork-borealis',
 ])
diff --git a/config/config_dump.json b/config/config_dump.json
index 3d9cc6f..1ea6f53 100644
--- a/config/config_dump.json
+++ b/config/config_dump.json
@@ -57,6 +57,7 @@
         "goma_client_type": null,
         "grouped": false,
         "gs_path": "default",
+        "guest_vm_image": false,
         "health_alert_recipients": [],
         "health_threshold": 0,
         "hw_tests": [],
@@ -987,7 +988,8 @@
         ],
         "important": false,
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"ambassador\",\n    \"name\": \"ambassador\",\n    \"test_suites\": []\n}"
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"ambassador\",\n    \"name\": \"ambassador\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"ambassador\",\n    \"name\": \"genesis\",\n    \"test_suites\": []\n}"
         ],
         "vm_tests": [],
         "vm_tests_override": null
@@ -1011,7 +1013,8 @@
         "hw_tests_override": null,
         "luci_builder": "Try",
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"ambassador\",\n    \"name\": \"ambassador\",\n    \"test_suites\": []\n}"
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"ambassador\",\n    \"name\": \"ambassador\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"ambassador\",\n    \"name\": \"genesis\",\n    \"test_suites\": []\n}"
         ],
         "paygen": false,
         "push_image": false,
@@ -4613,6 +4616,140 @@
             "{\n    \"max_retries\": 5,\n    \"retry\": false,\n    \"test_suite\": \"vmtest-informational4\",\n    \"test_type\": \"vm_suite\",\n    \"timeout\": 43200,\n    \"use_ctest\": true,\n    \"warn_only\": true\n}"
         ]
     },
+    "bob-arc64-full": {
+        "_template": "full",
+        "boards": [
+            "bob-arc64"
+        ],
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "bob-arc64-full-tryjob": {
+        "_template": "full",
+        "boards": [
+            "bob-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "bob-arc64-llvm-next-toolchain": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "bob-arc64"
+        ]
+    },
+    "bob-arc64-llvm-next-toolchain-tryjob": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "bob-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "bob-arc64-llvm-toolchain": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "bob-arc64"
+        ]
+    },
+    "bob-arc64-llvm-toolchain-tryjob": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "bob-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "bob-arc64-payloads": {
+        "_template": "payloads",
+        "boards": [
+            "bob-arc64"
+        ]
+    },
+    "bob-arc64-payloads-tryjob": {
+        "_template": "payloads",
+        "boards": [
+            "bob-arc64"
+        ],
+        "debug": true,
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "bob-arc64-release": {
+        "_template": "release",
+        "boards": [
+            "bob-arc64"
+        ],
+        "important": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "bob-arc64-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "bob-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "paygen": false,
+        "push_image": false,
+        "suite_scheduling": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "bob-arc64-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "bob-arc64"
+        ],
+        "hw_tests_override": null,
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "useflags": [
+            "chrome_internal"
+        ]
+    },
     "bob-factory-gru-9017.B-factorybranch": {
         "_template": "factorybranch",
         "boards": [
@@ -8667,13 +8804,15 @@
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"boten\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"boten_legacy\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"botenflex\",\n    \"test_suites\": []\n}",
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawcia\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawcia\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawcia_legacy\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawlat\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawman\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"madoo\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"lantis\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"madoo\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"maglia\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"magolor\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"metaknight\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"waddledee\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"waddledoo\",\n    \"test_suites\": []\n}"
         ],
@@ -8709,13 +8848,15 @@
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"boten\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"boten_legacy\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"botenflex\",\n    \"test_suites\": []\n}",
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawcia\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawcia\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawcia_legacy\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawlat\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"drawman\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"madoo\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"lantis\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"madoo\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"maglia\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"magolor\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"metaknight\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"waddledee\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"dedede\",\n    \"name\": \"waddledoo\",\n    \"test_suites\": []\n}"
         ],
@@ -9245,6 +9386,146 @@
             "chrome_internal"
         ]
     },
+    "elm-arc64-full": {
+        "_template": "full",
+        "boards": [
+            "elm-arc64"
+        ],
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "elm-arc64-full-tryjob": {
+        "_template": "full",
+        "boards": [
+            "elm-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "elm-arc64-llvm-next-toolchain": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "elm-arc64"
+        ]
+    },
+    "elm-arc64-llvm-next-toolchain-tryjob": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "elm-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "elm-arc64-llvm-toolchain": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "elm-arc64"
+        ]
+    },
+    "elm-arc64-llvm-toolchain-tryjob": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "elm-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "elm-arc64-payloads": {
+        "_template": "payloads",
+        "boards": [
+            "elm-arc64"
+        ]
+    },
+    "elm-arc64-payloads-tryjob": {
+        "_template": "payloads",
+        "boards": [
+            "elm-arc64"
+        ],
+        "debug": true,
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "elm-arc64-release": {
+        "_template": "release",
+        "boards": [
+            "elm-arc64"
+        ],
+        "important": false,
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"elm-arc64\",\n    \"name\": \"elm\",\n    \"test_suites\": []\n}"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "elm-arc64-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "elm-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"elm-arc64\",\n    \"name\": \"elm\",\n    \"test_suites\": []\n}"
+        ],
+        "paygen": false,
+        "push_image": false,
+        "suite_scheduling": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "elm-arc64-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "elm-arc64"
+        ],
+        "hw_tests_override": null,
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "useflags": [
+            "chrome_internal"
+        ]
+    },
     "elm-factory-oak-8182.B-factorybranch": {
         "_template": "factorybranch",
         "boards": [
@@ -10010,9 +10291,12 @@
         "boards": [
             "eve-arc-r"
         ],
+        "hw_tests": [],
+        "hw_tests_disabled_bug": "http://crbug.com/1161335",
+        "hw_tests_override": [],
         "important": false,
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}"
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": []\n}"
         ],
         "vm_tests": [],
         "vm_tests_override": null
@@ -10024,19 +10308,12 @@
         ],
         "debug": true,
         "display_label": "tryjob",
-        "hw_tests": [
-            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
-        ],
+        "hw_tests": [],
+        "hw_tests_disabled_bug": "http://crbug.com/1161335",
         "hw_tests_override": null,
         "luci_builder": "Try",
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}"
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": []\n}"
         ],
         "paygen": false,
         "push_image": false,
@@ -10491,6 +10768,9 @@
         "boards": [
             "eve-kernelnext"
         ],
+        "hw_tests": [],
+        "hw_tests_disabled_bug": "http://crbug.com/1161335",
+        "hw_tests_override": [],
         "important": false,
         "models": [
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": []\n}"
@@ -10505,15 +10785,8 @@
         ],
         "debug": true,
         "display_label": "tryjob",
-        "hw_tests": [
-            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
-            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
-        ],
+        "hw_tests": [],
+        "hw_tests_disabled_bug": "http://crbug.com/1161335",
         "hw_tests_override": null,
         "luci_builder": "Try",
         "models": [
@@ -10799,7 +11072,7 @@
             "eve"
         ],
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}"
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": []\n}"
         ],
         "vm_tests": [],
         "vm_tests_override": null
@@ -10810,7 +11083,7 @@
             "eve"
         ],
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}"
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": []\n}"
         ]
     },
     "eve-release-basic-tryjob": {
@@ -10823,7 +11096,7 @@
         "hw_tests_override": null,
         "luci_builder": "Try",
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}"
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": []\n}"
         ],
         "notification_configs": []
     },
@@ -10846,7 +11119,7 @@
         "hw_tests_override": null,
         "luci_builder": "Try",
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}"
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"eve\",\n    \"name\": \"eve\",\n    \"test_suites\": []\n}"
         ],
         "paygen": false,
         "push_image": false,
@@ -12595,7 +12868,7 @@
         ],
         "schedule": "with 720h interval",
         "sign_types": [
-            "cr50_firmware"
+            "gsc_firmware"
         ],
         "workspace_branch": "firmware-cr50-9308.B"
     },
@@ -12609,7 +12882,7 @@
         "luci_builder": "Try",
         "push_image": false,
         "sign_types": [
-            "cr50_firmware"
+            "gsc_firmware"
         ],
         "suite_scheduling": false,
         "workspace_branch": "firmware-cr50-9308.B"
@@ -12621,7 +12894,7 @@
         ],
         "schedule": "with 720h interval",
         "sign_types": [
-            "cr50_firmware"
+            "gsc_firmware"
         ],
         "workspace_branch": "firmware-cr50-guc-factory-9308.26.B"
     },
@@ -12635,7 +12908,7 @@
         "luci_builder": "Try",
         "push_image": false,
         "sign_types": [
-            "cr50_firmware"
+            "gsc_firmware"
         ],
         "suite_scheduling": false,
         "workspace_branch": "firmware-cr50-guc-factory-9308.26.B"
@@ -12647,7 +12920,7 @@
         ],
         "schedule": "with 720h interval",
         "sign_types": [
-            "cr50_firmware"
+            "gsc_firmware"
         ],
         "workspace_branch": "firmware-cr50-mp-release-9308.87.B"
     },
@@ -12661,7 +12934,7 @@
         "luci_builder": "Try",
         "push_image": false,
         "sign_types": [
-            "cr50_firmware"
+            "gsc_firmware"
         ],
         "suite_scheduling": false,
         "workspace_branch": "firmware-cr50-mp-release-9308.87.B"
@@ -15969,6 +16242,166 @@
             "chrome_internal"
         ]
     },
+    "grunt-arc64-full": {
+        "_template": "full",
+        "boards": [
+            "grunt-arc64"
+        ],
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "grunt-arc64-full-tryjob": {
+        "_template": "full",
+        "boards": [
+            "grunt-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "grunt-arc64-llvm-next-toolchain": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "grunt-arc64"
+        ]
+    },
+    "grunt-arc64-llvm-next-toolchain-tryjob": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "grunt-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "grunt-arc64-llvm-toolchain": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "grunt-arc64"
+        ]
+    },
+    "grunt-arc64-llvm-toolchain-tryjob": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "grunt-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "grunt-arc64-payloads": {
+        "_template": "payloads",
+        "boards": [
+            "grunt-arc64"
+        ]
+    },
+    "grunt-arc64-payloads-tryjob": {
+        "_template": "payloads",
+        "boards": [
+            "grunt-arc64"
+        ],
+        "debug": true,
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "grunt-arc64-release": {
+        "_template": "release",
+        "boards": [
+            "grunt-arc64"
+        ],
+        "important": false,
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"aleena\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"barla\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"careena\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"grunt\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"kasumi\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"kasumi360\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"liara\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"nuwani\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"nuwani360\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"treeya\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"treeya360\",\n    \"test_suites\": []\n}"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "grunt-arc64-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "grunt-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"aleena\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"barla\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"careena\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"grunt\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"kasumi\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"kasumi360\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"liara\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"nuwani\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"nuwani360\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"treeya\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"grunt-arc64\",\n    \"name\": \"treeya360\",\n    \"test_suites\": []\n}"
+        ],
+        "paygen": false,
+        "push_image": false,
+        "suite_scheduling": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "grunt-arc64-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "grunt-arc64"
+        ],
+        "hw_tests_override": null,
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "useflags": [
+            "chrome_internal"
+        ]
+    },
     "grunt-factory-grunt-11164.B-factorybranch": {
         "_template": "factorybranch",
         "boards": [
@@ -17017,6 +17450,7 @@
         "manifest_branch": "main",
         "prebuilts": "public",
         "run_cpeexport": true,
+        "unittests": false,
         "useflags": [
             "-chrome_internal"
         ],
@@ -17043,6 +17477,7 @@
         "manifest_branch": "main",
         "prebuilts": "public",
         "run_cpeexport": true,
+        "unittests": false,
         "useflags": [
             "-chrome_internal"
         ],
@@ -17052,7 +17487,8 @@
         "_template": "llvm_next_toolchain",
         "boards": [
             "guybrush"
-        ]
+        ],
+        "unittests": false
     },
     "guybrush-llvm-next-toolchain-tryjob": {
         "_template": "llvm_next_toolchain",
@@ -17062,13 +17498,15 @@
         "debug": true,
         "display_label": "tryjob",
         "hw_tests_override": null,
-        "luci_builder": "Try"
+        "luci_builder": "Try",
+        "unittests": false
     },
     "guybrush-llvm-toolchain": {
         "_template": "llvm_toolchain",
         "boards": [
             "guybrush"
-        ]
+        ],
+        "unittests": false
     },
     "guybrush-llvm-toolchain-tryjob": {
         "_template": "llvm_toolchain",
@@ -17078,7 +17516,8 @@
         "debug": true,
         "display_label": "tryjob",
         "hw_tests_override": null,
-        "luci_builder": "Try"
+        "luci_builder": "Try",
+        "unittests": false
     },
     "guybrush-payloads": {
         "_template": "payloads",
@@ -17101,6 +17540,7 @@
             "guybrush"
         ],
         "important": false,
+        "unittests": false,
         "vm_tests": [],
         "vm_tests_override": null
     },
@@ -17125,6 +17565,7 @@
         "paygen": false,
         "push_image": false,
         "suite_scheduling": false,
+        "unittests": false,
         "vm_tests": [],
         "vm_tests_override": null
     },
@@ -17143,6 +17584,140 @@
             "chrome_internal"
         ]
     },
+    "hana-arc64-full": {
+        "_template": "full",
+        "boards": [
+            "hana-arc64"
+        ],
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "hana-arc64-full-tryjob": {
+        "_template": "full",
+        "boards": [
+            "hana-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "hana-arc64-llvm-next-toolchain": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "hana-arc64"
+        ]
+    },
+    "hana-arc64-llvm-next-toolchain-tryjob": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "hana-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "hana-arc64-llvm-toolchain": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "hana-arc64"
+        ]
+    },
+    "hana-arc64-llvm-toolchain-tryjob": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "hana-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "hana-arc64-payloads": {
+        "_template": "payloads",
+        "boards": [
+            "hana-arc64"
+        ]
+    },
+    "hana-arc64-payloads-tryjob": {
+        "_template": "payloads",
+        "boards": [
+            "hana-arc64"
+        ],
+        "debug": true,
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "hana-arc64-release": {
+        "_template": "release",
+        "boards": [
+            "hana-arc64"
+        ],
+        "important": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "hana-arc64-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "hana-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "paygen": false,
+        "push_image": false,
+        "suite_scheduling": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "hana-arc64-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "hana-arc64"
+        ],
+        "hw_tests_override": null,
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "useflags": [
+            "chrome_internal"
+        ]
+    },
     "hana-factory-oak-8182.B-factorybranch": {
         "_template": "factorybranch",
         "boards": [
@@ -18995,6 +19570,168 @@
             "chrome_internal"
         ]
     },
+    "jacuzzi-arc64-full": {
+        "_template": "full",
+        "boards": [
+            "jacuzzi-arc64"
+        ],
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "jacuzzi-arc64-full-tryjob": {
+        "_template": "full",
+        "boards": [
+            "jacuzzi-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "jacuzzi-arc64-llvm-next-toolchain": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "jacuzzi-arc64"
+        ]
+    },
+    "jacuzzi-arc64-llvm-next-toolchain-tryjob": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "jacuzzi-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "jacuzzi-arc64-llvm-toolchain": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "jacuzzi-arc64"
+        ]
+    },
+    "jacuzzi-arc64-llvm-toolchain-tryjob": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "jacuzzi-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "jacuzzi-arc64-payloads": {
+        "_template": "payloads",
+        "boards": [
+            "jacuzzi-arc64"
+        ]
+    },
+    "jacuzzi-arc64-payloads-tryjob": {
+        "_template": "payloads",
+        "boards": [
+            "jacuzzi-arc64"
+        ],
+        "debug": true,
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "jacuzzi-arc64-release": {
+        "_template": "release",
+        "boards": [
+            "jacuzzi-arc64"
+        ],
+        "important": false,
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"burnet\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"cerise\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"damu\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"esche\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"fennel\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"fennel14\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"jacuzzi\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"juniper\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"kappa\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"kenzo\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"stern\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"willow\",\n    \"test_suites\": []\n}"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "jacuzzi-arc64-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "jacuzzi-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"burnet\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"cerise\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"damu\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"esche\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"fennel\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"fennel14\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"jacuzzi\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"juniper\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"kappa\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"kenzo\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"stern\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"jacuzzi-arc64\",\n    \"name\": \"willow\",\n    \"test_suites\": []\n}"
+        ],
+        "paygen": false,
+        "push_image": false,
+        "suite_scheduling": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "jacuzzi-arc64-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "jacuzzi-arc64"
+        ],
+        "hw_tests_override": null,
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "useflags": [
+            "chrome_internal"
+        ]
+    },
     "jacuzzi-factory-kukui-12587.B-factorybranch": {
         "_template": "factorybranch",
         "boards": [
@@ -22500,6 +23237,7 @@
         "manifest_branch": "main",
         "prebuilts": "public",
         "run_cpeexport": true,
+        "unittests": false,
         "useflags": [
             "-chrome_internal"
         ],
@@ -22526,6 +23264,7 @@
         "manifest_branch": "main",
         "prebuilts": "public",
         "run_cpeexport": true,
+        "unittests": false,
         "useflags": [
             "-chrome_internal"
         ],
@@ -22535,7 +23274,8 @@
         "_template": "llvm_next_toolchain",
         "boards": [
             "majolica"
-        ]
+        ],
+        "unittests": false
     },
     "majolica-llvm-next-toolchain-tryjob": {
         "_template": "llvm_next_toolchain",
@@ -22545,13 +23285,15 @@
         "debug": true,
         "display_label": "tryjob",
         "hw_tests_override": null,
-        "luci_builder": "Try"
+        "luci_builder": "Try",
+        "unittests": false
     },
     "majolica-llvm-toolchain": {
         "_template": "llvm_toolchain",
         "boards": [
             "majolica"
-        ]
+        ],
+        "unittests": false
     },
     "majolica-llvm-toolchain-tryjob": {
         "_template": "llvm_toolchain",
@@ -22561,7 +23303,8 @@
         "debug": true,
         "display_label": "tryjob",
         "hw_tests_override": null,
-        "luci_builder": "Try"
+        "luci_builder": "Try",
+        "unittests": false
     },
     "majolica-payloads": {
         "_template": "payloads",
@@ -22583,7 +23326,7 @@
         "boards": [
             "majolica"
         ],
-        "important": false,
+        "unittests": false,
         "vm_tests": [],
         "vm_tests_override": null
     },
@@ -22608,6 +23351,7 @@
         "paygen": false,
         "push_image": false,
         "suite_scheduling": false,
+        "unittests": false,
         "vm_tests": [],
         "vm_tests_override": null
     },
@@ -22634,6 +23378,7 @@
         "manifest_branch": "main",
         "prebuilts": "public",
         "run_cpeexport": true,
+        "unittests": false,
         "useflags": [
             "-chrome_internal"
         ],
@@ -22660,6 +23405,7 @@
         "manifest_branch": "main",
         "prebuilts": "public",
         "run_cpeexport": true,
+        "unittests": false,
         "useflags": [
             "-chrome_internal"
         ],
@@ -22669,7 +23415,8 @@
         "_template": "llvm_next_toolchain",
         "boards": [
             "mancomb"
-        ]
+        ],
+        "unittests": false
     },
     "mancomb-llvm-next-toolchain-tryjob": {
         "_template": "llvm_next_toolchain",
@@ -22679,13 +23426,15 @@
         "debug": true,
         "display_label": "tryjob",
         "hw_tests_override": null,
-        "luci_builder": "Try"
+        "luci_builder": "Try",
+        "unittests": false
     },
     "mancomb-llvm-toolchain": {
         "_template": "llvm_toolchain",
         "boards": [
             "mancomb"
-        ]
+        ],
+        "unittests": false
     },
     "mancomb-llvm-toolchain-tryjob": {
         "_template": "llvm_toolchain",
@@ -22695,7 +23444,8 @@
         "debug": true,
         "display_label": "tryjob",
         "hw_tests_override": null,
-        "luci_builder": "Try"
+        "luci_builder": "Try",
+        "unittests": false
     },
     "mancomb-payloads": {
         "_template": "payloads",
@@ -22718,6 +23468,7 @@
             "mancomb"
         ],
         "important": false,
+        "unittests": false,
         "vm_tests": [],
         "vm_tests_override": null
     },
@@ -22742,6 +23493,7 @@
         "paygen": false,
         "push_image": false,
         "suite_scheduling": false,
+        "unittests": false,
         "vm_tests": [],
         "vm_tests_override": null
     },
@@ -23017,6 +23769,7 @@
             "betty-pi-arc-release",
             "betty-qt-arc-release",
             "betty-release",
+            "bob-arc64-release",
             "bob-release",
             "brya-release",
             "bubs-release",
@@ -23040,6 +23793,7 @@
             "dedede-release",
             "drallion-release",
             "edgar-release",
+            "elm-arc64-release",
             "elm-kernelnext-release",
             "elm-release",
             "endeavour-release",
@@ -23063,6 +23817,7 @@
             "gnawty-release",
             "gonzo-release",
             "grunt-arc-r-release",
+            "grunt-arc64-release",
             "grunt-kernelnext-release",
             "grunt-release",
             "guado-cfm-release",
@@ -23070,6 +23825,7 @@
             "guado-release",
             "guado_labstation-release",
             "guybrush-release",
+            "hana-arc64-release",
             "hana-kernelnext-release",
             "hana-release",
             "hatch-arc-r-ack-release",
@@ -23081,6 +23837,7 @@
             "hatch-kernelnext-release",
             "hatch-release",
             "heli-release",
+            "jacuzzi-arc64-release",
             "jacuzzi-release",
             "kalista-cfm-release",
             "kalista-release",
@@ -23129,7 +23886,9 @@
             "romer-release",
             "samus-release",
             "sand-release",
+            "sarien-arc64-release",
             "sarien-release",
+            "scarlet-arc64-release",
             "scarlet-release",
             "sentry-release",
             "setzer-release",
@@ -23140,6 +23899,8 @@
             "strongbad-release",
             "sumo-release",
             "swanky-release",
+            "tael-release",
+            "tatl-release",
             "terra-release",
             "tidus-release",
             "trogdor-release",
@@ -23232,6 +23993,7 @@
             "betty-pi-arc-release-tryjob",
             "betty-qt-arc-release-tryjob",
             "betty-release-tryjob",
+            "bob-arc64-release-tryjob",
             "bob-release-tryjob",
             "brya-release-tryjob",
             "bubs-release-tryjob",
@@ -23255,6 +24017,7 @@
             "dedede-release-tryjob",
             "drallion-release-tryjob",
             "edgar-release-tryjob",
+            "elm-arc64-release-tryjob",
             "elm-kernelnext-release-tryjob",
             "elm-release-tryjob",
             "endeavour-release-tryjob",
@@ -23278,6 +24041,7 @@
             "gnawty-release-tryjob",
             "gonzo-release-tryjob",
             "grunt-arc-r-release-tryjob",
+            "grunt-arc64-release-tryjob",
             "grunt-kernelnext-release-tryjob",
             "grunt-release-tryjob",
             "guado-cfm-release-tryjob",
@@ -23285,6 +24049,7 @@
             "guado-release-tryjob",
             "guado_labstation-release-tryjob",
             "guybrush-release-tryjob",
+            "hana-arc64-release-tryjob",
             "hana-kernelnext-release-tryjob",
             "hana-release-tryjob",
             "hatch-arc-r-ack-release-tryjob",
@@ -23296,6 +24061,7 @@
             "hatch-kernelnext-release-tryjob",
             "hatch-release-tryjob",
             "heli-release-tryjob",
+            "jacuzzi-arc64-release-tryjob",
             "jacuzzi-release-tryjob",
             "kalista-cfm-release-tryjob",
             "kalista-release-tryjob",
@@ -23344,7 +24110,9 @@
             "romer-release-tryjob",
             "samus-release-tryjob",
             "sand-release-tryjob",
+            "sarien-arc64-release-tryjob",
             "sarien-release-tryjob",
+            "scarlet-arc64-release-tryjob",
             "scarlet-release-tryjob",
             "sentry-release-tryjob",
             "setzer-release-tryjob",
@@ -23355,6 +24123,8 @@
             "strongbad-release-tryjob",
             "sumo-release-tryjob",
             "swanky-release-tryjob",
+            "tael-release-tryjob",
+            "tatl-release-tryjob",
             "terra-release-tryjob",
             "tidus-release-tryjob",
             "trogdor-release-tryjob",
@@ -27029,7 +27799,7 @@
             "puff"
         ],
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"dooly\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"dooly\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"duffy\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"faffy\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"kaisa\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
@@ -27067,7 +27837,7 @@
         "hw_tests_override": null,
         "luci_builder": "Try",
         "models": [
-            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"dooly\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"dooly\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"duffy\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"faffy\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"puff\",\n    \"name\": \"kaisa\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
@@ -29500,6 +30270,152 @@
             "chrome_internal"
         ]
     },
+    "sarien-arc64-full": {
+        "_template": "full",
+        "boards": [
+            "sarien-arc64"
+        ],
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "sarien-arc64-full-tryjob": {
+        "_template": "full",
+        "boards": [
+            "sarien-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "sarien-arc64-llvm-next-toolchain": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "sarien-arc64"
+        ]
+    },
+    "sarien-arc64-llvm-next-toolchain-tryjob": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "sarien-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "sarien-arc64-llvm-toolchain": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "sarien-arc64"
+        ]
+    },
+    "sarien-arc64-llvm-toolchain-tryjob": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "sarien-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "sarien-arc64-payloads": {
+        "_template": "payloads",
+        "boards": [
+            "sarien-arc64"
+        ]
+    },
+    "sarien-arc64-payloads-tryjob": {
+        "_template": "payloads",
+        "boards": [
+            "sarien-arc64"
+        ],
+        "debug": true,
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "sarien-arc64-release": {
+        "_template": "release",
+        "boards": [
+            "sarien-arc64"
+        ],
+        "important": false,
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"sarien-arc64\",\n    \"name\": \"arcada\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"sarien-arc64\",\n    \"name\": \"arcada_signed\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"sarien-arc64\",\n    \"name\": \"sarien\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"sarien-arc64\",\n    \"name\": \"sarien_signed\",\n    \"test_suites\": []\n}"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "sarien-arc64-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "sarien-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"sarien-arc64\",\n    \"name\": \"arcada\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"sarien-arc64\",\n    \"name\": \"arcada_signed\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"sarien-arc64\",\n    \"name\": \"sarien\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"sarien-arc64\",\n    \"name\": \"sarien_signed\",\n    \"test_suites\": []\n}"
+        ],
+        "paygen": false,
+        "push_image": false,
+        "suite_scheduling": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "sarien-arc64-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "sarien-arc64"
+        ],
+        "hw_tests_override": null,
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "useflags": [
+            "chrome_internal"
+        ]
+    },
     "sarien-factory-sarien-12033.B-factorybranch": {
         "_template": "factorybranch",
         "boards": [
@@ -29693,6 +30609,150 @@
             "chrome_internal"
         ]
     },
+    "scarlet-arc64-full": {
+        "_template": "full",
+        "boards": [
+            "scarlet-arc64"
+        ],
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "scarlet-arc64-full-tryjob": {
+        "_template": "full",
+        "boards": [
+            "scarlet-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "manifest_branch": "main",
+        "prebuilts": "public",
+        "run_cpeexport": true,
+        "useflags": [
+            "-chrome_internal"
+        ],
+        "vm_tests": []
+    },
+    "scarlet-arc64-llvm-next-toolchain": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "scarlet-arc64"
+        ]
+    },
+    "scarlet-arc64-llvm-next-toolchain-tryjob": {
+        "_template": "llvm_next_toolchain",
+        "boards": [
+            "scarlet-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "scarlet-arc64-llvm-toolchain": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "scarlet-arc64"
+        ]
+    },
+    "scarlet-arc64-llvm-toolchain-tryjob": {
+        "_template": "llvm_toolchain",
+        "boards": [
+            "scarlet-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "scarlet-arc64-payloads": {
+        "_template": "payloads",
+        "boards": [
+            "scarlet-arc64"
+        ]
+    },
+    "scarlet-arc64-payloads-tryjob": {
+        "_template": "payloads",
+        "boards": [
+            "scarlet-arc64"
+        ],
+        "debug": true,
+        "hw_tests_override": null,
+        "luci_builder": "Try"
+    },
+    "scarlet-arc64-release": {
+        "_template": "release",
+        "boards": [
+            "scarlet-arc64"
+        ],
+        "important": false,
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"scarlet-arc64\",\n    \"name\": \"dru\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"scarlet-arc64\",\n    \"name\": \"druwl\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"scarlet-arc64\",\n    \"name\": \"dumo\",\n    \"test_suites\": []\n}"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "scarlet-arc64-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "scarlet-arc64"
+        ],
+        "debug": true,
+        "display_label": "tryjob",
+        "hw_tests": [
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-inline\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-arc\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": false,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"Build\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 0,\n    \"timeout\": 10800,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-tast-informational\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-installer\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-cq\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}",
+            "{\n    \"async\": true,\n    \"blocking\": false,\n    \"critical\": false,\n    \"enable_skylab\": true,\n    \"file_bugs\": false,\n    \"max_retries\": 5,\n    \"minimum_duts\": 0,\n    \"offload_failures_only\": false,\n    \"pool\": \"quota\",\n    \"priority\": \"PostBuild\",\n    \"quota_account\": \"legacypool-suites\",\n    \"retry\": true,\n    \"suite\": \"bvt-perbuild\",\n    \"suite_args\": null,\n    \"suite_min_duts\": 1,\n    \"timeout\": 15000,\n    \"warn_only\": false\n}"
+        ],
+        "hw_tests_override": null,
+        "luci_builder": "Try",
+        "models": [
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"scarlet-arc64\",\n    \"name\": \"dru\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"scarlet-arc64\",\n    \"name\": \"druwl\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"scarlet-arc64\",\n    \"name\": \"dumo\",\n    \"test_suites\": []\n}"
+        ],
+        "paygen": false,
+        "push_image": false,
+        "suite_scheduling": false,
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "scarlet-arc64-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "scarlet-arc64"
+        ],
+        "hw_tests_override": null,
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "useflags": [
+            "chrome_internal"
+        ]
+    },
     "scarlet-factory-scarlet-10211.B-factorybranch": {
         "_template": "factorybranch",
         "boards": [
@@ -30350,6 +31410,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests_override": [],
         "image_test": false,
         "images": [
@@ -30386,6 +31447,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests_override": null,
         "image_test": false,
         "images": [
@@ -30421,6 +31483,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": [],
         "image_test": false,
@@ -30451,6 +31514,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": null,
         "image_test": false,
@@ -30480,6 +31544,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": [],
         "image_test": false,
@@ -30510,6 +31575,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": null,
         "image_test": false,
@@ -30540,6 +31606,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": [],
         "hwqual": false,
@@ -30577,6 +31644,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": null,
         "hwqual": false,
@@ -30613,6 +31681,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests_override": null,
         "images": [
             "base",
@@ -31652,6 +32721,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests_override": [],
         "image_test": false,
         "images": [
@@ -31689,6 +32759,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests_override": null,
         "image_test": false,
         "images": [
@@ -31725,6 +32796,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": [],
         "image_test": false,
@@ -31755,6 +32827,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": null,
         "image_test": false,
@@ -31784,6 +32857,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": [],
         "image_test": false,
@@ -31814,6 +32888,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": null,
         "image_test": false,
@@ -31833,16 +32908,63 @@
             "sys-kernel/*kernel*"
         ]
     },
-    "tael-unittest-stress": {
-        "_template": "unittest_stress",
+    "tael-release": {
+        "_template": "release",
         "boards": [
             "tael"
         ],
+        "chrome_sdk": false,
+        "chrome_sdk_build_chrome": false,
+        "dev_installer_prebuilts": false,
         "disk_layout": "base",
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
+        "hw_tests": [],
+        "hw_tests_override": [],
+        "hwqual": false,
+        "image_test": false,
+        "images": [
+            "base",
+            "test"
+        ],
+        "important": false,
+        "packages": [
+            "virtual/target-os",
+            "virtual/target-os-dev",
+            "virtual/target-os-test"
+        ],
+        "paygen": false,
+        "sign_types": null,
+        "signer_tests": false,
+        "sync_chrome": false,
+        "upload_hw_test_artifacts": false,
+        "upload_stripped_packages": [
+            "sys-kernel/*kernel*"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "tael-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "tael"
+        ],
+        "chrome_sdk": false,
+        "chrome_sdk_build_chrome": false,
+        "debug": true,
+        "dev_installer_prebuilts": false,
+        "disk_layout": "base",
+        "display_label": "tryjob",
+        "factory": false,
+        "factory_install_netboot": false,
+        "factory_toolkit": false,
+        "guest_vm_image": true,
+        "hw_tests": [],
         "hw_tests_override": null,
+        "hwqual": false,
+        "image_test": false,
         "images": [
             "base",
             "test"
@@ -31853,10 +32975,51 @@
             "virtual/target-os-dev",
             "virtual/target-os-test"
         ],
+        "paygen": false,
+        "push_image": false,
+        "sign_types": null,
+        "signer_tests": false,
+        "suite_scheduling": false,
         "sync_chrome": false,
         "upload_hw_test_artifacts": false,
         "upload_stripped_packages": [
             "sys-kernel/*kernel*"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "tael-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "tael"
+        ],
+        "disk_layout": "base",
+        "factory": false,
+        "factory_install_netboot": false,
+        "factory_toolkit": false,
+        "guest_vm_image": true,
+        "hw_tests_override": null,
+        "images": [
+            "base",
+            "test"
+        ],
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "packages": [
+            "virtual/target-os",
+            "virtual/target-os-dev",
+            "virtual/target-os-test"
+        ],
+        "sync_chrome": false,
+        "upload_hw_test_artifacts": false,
+        "upload_stripped_packages": [
+            "sys-kernel/*kernel*"
+        ],
+        "useflags": [
+            "chrome_internal"
         ]
     },
     "tatl-full": {
@@ -31869,6 +33032,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests_override": [],
         "image_test": false,
         "images": [
@@ -31906,6 +33070,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests_override": null,
         "image_test": false,
         "images": [
@@ -31942,6 +33107,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": [],
         "image_test": false,
@@ -31972,6 +33138,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": null,
         "image_test": false,
@@ -32001,6 +33168,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": [],
         "image_test": false,
@@ -32031,6 +33199,7 @@
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
         "hw_tests": [],
         "hw_tests_override": null,
         "image_test": false,
@@ -32050,16 +33219,63 @@
             "sys-kernel/*kernel*"
         ]
     },
-    "tatl-unittest-stress": {
-        "_template": "unittest_stress",
+    "tatl-release": {
+        "_template": "release",
         "boards": [
             "tatl"
         ],
+        "chrome_sdk": false,
+        "chrome_sdk_build_chrome": false,
+        "dev_installer_prebuilts": false,
         "disk_layout": "base",
         "factory": false,
         "factory_install_netboot": false,
         "factory_toolkit": false,
+        "guest_vm_image": true,
+        "hw_tests": [],
+        "hw_tests_override": [],
+        "hwqual": false,
+        "image_test": false,
+        "images": [
+            "base",
+            "test"
+        ],
+        "important": false,
+        "packages": [
+            "virtual/target-os",
+            "virtual/target-os-dev",
+            "virtual/target-os-test"
+        ],
+        "paygen": false,
+        "sign_types": null,
+        "signer_tests": false,
+        "sync_chrome": false,
+        "upload_hw_test_artifacts": false,
+        "upload_stripped_packages": [
+            "sys-kernel/*kernel*"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "tatl-release-tryjob": {
+        "_template": "release",
+        "boards": [
+            "tatl"
+        ],
+        "chrome_sdk": false,
+        "chrome_sdk_build_chrome": false,
+        "debug": true,
+        "dev_installer_prebuilts": false,
+        "disk_layout": "base",
+        "display_label": "tryjob",
+        "factory": false,
+        "factory_install_netboot": false,
+        "factory_toolkit": false,
+        "guest_vm_image": true,
+        "hw_tests": [],
         "hw_tests_override": null,
+        "hwqual": false,
+        "image_test": false,
         "images": [
             "base",
             "test"
@@ -32070,10 +33286,51 @@
             "virtual/target-os-dev",
             "virtual/target-os-test"
         ],
+        "paygen": false,
+        "push_image": false,
+        "sign_types": null,
+        "signer_tests": false,
+        "suite_scheduling": false,
         "sync_chrome": false,
         "upload_hw_test_artifacts": false,
         "upload_stripped_packages": [
             "sys-kernel/*kernel*"
+        ],
+        "vm_tests": [],
+        "vm_tests_override": null
+    },
+    "tatl-unittest-stress": {
+        "_template": "unittest_stress",
+        "boards": [
+            "tatl"
+        ],
+        "disk_layout": "base",
+        "factory": false,
+        "factory_install_netboot": false,
+        "factory_toolkit": false,
+        "guest_vm_image": true,
+        "hw_tests_override": null,
+        "images": [
+            "base",
+            "test"
+        ],
+        "internal": true,
+        "luci_builder": "Try",
+        "manifest": "official.xml",
+        "manifest_repo_url": "https://chrome-internal-review.googlesource.com/chromeos/manifest-internal",
+        "overlays": "both",
+        "packages": [
+            "virtual/target-os",
+            "virtual/target-os-dev",
+            "virtual/target-os-test"
+        ],
+        "sync_chrome": false,
+        "upload_hw_test_artifacts": false,
+        "upload_stripped_packages": [
+            "sys-kernel/*kernel*"
+        ],
+        "useflags": [
+            "chrome_internal"
         ]
     },
     "terra-factory-strago-7458.B-factorybranch": {
@@ -35032,7 +36289,9 @@
         "important": false,
         "models": [
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"delbin\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"delbin_npcx796fc\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"eldrid\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"eldrid_npcx796\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"elemi\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"halvor\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"lillipup\",\n    \"test_suites\": []\n}",
@@ -35074,7 +36333,9 @@
         "luci_builder": "Try",
         "models": [
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"delbin\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"delbin_npcx796fc\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"eldrid\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"eldrid_npcx796\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"elemi\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"halvor\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"lillipup\",\n    \"test_suites\": []\n}",
@@ -35168,6 +36429,9 @@
         ],
         "models": [
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"delbin\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"delbin_npcx796fc\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"eldrid\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"eldrid_npcx796\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"elemi\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"halvor\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"lillipup\",\n    \"test_suites\": []\n}",
@@ -35215,6 +36479,9 @@
         "luci_builder": "Try",
         "models": [
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"delbin\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"delbin_npcx796fc\",\n    \"test_suites\": []\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"eldrid\",\n    \"test_suites\": [\n        \"sanity\",\n        \"bvt-inline\",\n        \"bvt-tast-cq\",\n        \"bvt-installer\",\n        \"bvt-arc\",\n        \"au\",\n        \"bvt-cq\",\n        \"bvt-perbuild\",\n        \"bvt-tast-informational\"\n    ]\n}",
+            "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"eldrid_npcx796\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"elemi\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"halvor\",\n    \"test_suites\": []\n}",
             "{\n    \"enable_skylab\": true,\n    \"lab_board_name\": \"volteer\",\n    \"name\": \"lillipup\",\n    \"test_suites\": []\n}",
diff --git a/config/ge_build_config.json b/config/ge_build_config.json
index 5a47335..c04a75f 100644
--- a/config/ge_build_config.json
+++ b/config/ge_build_config.json
@@ -194,6 +194,18 @@
       ]
     },
     {
+      "name": "bob-arc64",
+      "configs": [
+        {
+          "builder": "RELEASE",
+          "experimental": true,
+          "leader_board": false,
+          "board_group": "",
+          "arch": "ARM_INTERNAL"
+        }
+      ]
+    },
+    {
       "name": "brya",
       "configs": [
         {
@@ -542,6 +554,18 @@
       ]
     },
     {
+      "name": "hana-arc64",
+      "configs": [
+        {
+          "builder": "RELEASE",
+          "experimental": true,
+          "leader_board": false,
+          "board_group": "",
+          "arch": "ARM_INTERNAL"
+        }
+      ]
+    },
+    {
       "name": "hana-kernelnext",
       "configs": [
         {
@@ -702,7 +726,7 @@
       "configs": [
         {
           "builder": "RELEASE",
-          "experimental": true,
+          "experimental": false,
           "leader_board": true,
           "board_group": "",
           "arch": "UNKNOWN"
@@ -938,6 +962,30 @@
       ]
     },
     {
+      "name": "tael",
+      "configs": [
+        {
+          "builder": "RELEASE",
+          "experimental": true,
+          "leader_board": false,
+          "board_group": "guest vm builds",
+          "arch": "ARM_INTERNAL"
+        }
+      ]
+    },
+    {
+      "name": "tatl",
+      "configs": [
+        {
+          "builder": "RELEASE",
+          "experimental": true,
+          "leader_board": false,
+          "board_group": "guest vm builds",
+          "arch": "X86_INTERNAL"
+        }
+      ]
+    },
+    {
       "name": "terra",
       "configs": [
         {
@@ -1077,6 +1125,14 @@
           "release_builder_test_pool": "bvt",
           "board_id": 466,
           "is_active": true
+        },
+        {
+          "board_name": "ambassador",
+          "name": "genesis",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 466,
+          "is_active": true
         }
       ]
     },
@@ -1450,6 +1506,17 @@
         {
           "board_name": "dedede",
           "name": "drawcia",
+          "test_suites": [
+            "sanity",
+            "bvt-inline",
+            "bvt-tast-cq",
+            "bvt-installer",
+            "bvt-arc",
+            "au",
+            "bvt-cq",
+            "bvt-perbuild",
+            "bvt-tast-informational"
+          ],
           "cq_test_enabled": true,
           "release_builder_test_pool": "bvt",
           "board_id": 419,
@@ -1503,7 +1570,7 @@
         },
         {
           "board_name": "dedede",
-          "name": "madoo",
+          "name": "lantis",
           "cq_test_enabled": false,
           "release_builder_test_pool": "bvt",
           "board_id": 419,
@@ -1511,6 +1578,25 @@
         },
         {
           "board_name": "dedede",
+          "name": "madoo",
+          "test_suites": [
+            "sanity",
+            "bvt-inline",
+            "bvt-tast-cq",
+            "bvt-installer",
+            "bvt-arc",
+            "au",
+            "bvt-cq",
+            "bvt-perbuild",
+            "bvt-tast-informational"
+          ],
+          "cq_test_enabled": true,
+          "release_builder_test_pool": "bvt",
+          "board_id": 419,
+          "is_active": true
+        },
+        {
+          "board_name": "dedede",
           "name": "maglia",
           "cq_test_enabled": false,
           "release_builder_test_pool": "bvt",
@@ -1527,6 +1613,25 @@
         },
         {
           "board_name": "dedede",
+          "name": "metaknight",
+          "test_suites": [
+            "sanity",
+            "bvt-inline",
+            "bvt-tast-cq",
+            "bvt-installer",
+            "bvt-arc",
+            "au",
+            "bvt-cq",
+            "bvt-perbuild",
+            "bvt-tast-informational"
+          ],
+          "cq_test_enabled": true,
+          "release_builder_test_pool": "bvt",
+          "board_id": 419,
+          "is_active": true
+        },
+        {
+          "board_name": "dedede",
           "name": "waddledee",
           "cq_test_enabled": false,
           "release_builder_test_pool": "bvt",
@@ -1635,6 +1740,23 @@
       ]
     },
     {
+      "name": "elm-arc64",
+      "reference_board_name": "elm-arc64",
+      "arch": "ARM_INTERNAL",
+      "builder": "RELEASE",
+      "experimental": true,
+      "models": [
+        {
+          "board_name": "elm-arc64",
+          "name": "elm",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7156,
+          "is_active": true
+        }
+      ]
+    },
+    {
       "name": "elm-kernelnext",
       "reference_board_name": "elm-kernelnext",
       "arch": "ARM_INTERNAL",
@@ -1689,17 +1811,6 @@
         {
           "board_name": "eve",
           "name": "eve",
-          "test_suites": [
-            "sanity",
-            "bvt-inline",
-            "bvt-tast-cq",
-            "bvt-installer",
-            "bvt-arc",
-            "au",
-            "bvt-cq",
-            "bvt-perbuild",
-            "bvt-tast-informational"
-          ],
           "cq_test_enabled": false,
           "release_builder_test_pool": "bvt",
           "board_id": 294,
@@ -1779,6 +1890,17 @@
         {
           "board_name": "eve-kernelnext",
           "name": "eve",
+          "test_suites": [
+            "sanity",
+            "bvt-inline",
+            "bvt-tast-cq",
+            "bvt-installer",
+            "bvt-arc",
+            "au",
+            "bvt-cq",
+            "bvt-perbuild",
+            "bvt-tast-informational"
+          ],
           "cq_test_enabled": false,
           "release_builder_test_pool": "bvt",
           "board_id": 446,
@@ -2353,6 +2475,103 @@
       ]
     },
     {
+      "name": "grunt-arc64",
+      "reference_board_name": "grunt-arc64",
+      "arch": "X86_INTERNAL",
+      "builder": "RELEASE",
+      "experimental": true,
+      "models": [
+        {
+          "board_name": "grunt-arc64",
+          "name": "aleena",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "barla",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "careena",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "grunt",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "kasumi",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "kasumi360",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "liara",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "nuwani",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "nuwani360",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "treeya",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        },
+        {
+          "board_name": "grunt-arc64",
+          "name": "treeya360",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7153,
+          "is_active": true
+        }
+      ]
+    },
+    {
       "name": "grunt-kernelnext",
       "reference_board_name": "grunt-kernelnext",
       "arch": "X86_INTERNAL",
@@ -3688,6 +3907,111 @@
       ]
     },
     {
+      "name": "jacuzzi-arc64",
+      "reference_board_name": "jacuzzi-arc64",
+      "arch": "ARM_INTERNAL",
+      "builder": "RELEASE",
+      "experimental": true,
+      "models": [
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "burnet",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "cerise",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "damu",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "esche",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "fennel",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "fennel14",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "jacuzzi",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "juniper",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "kappa",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "kenzo",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "stern",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        },
+        {
+          "board_name": "jacuzzi-arc64",
+          "name": "willow",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7154,
+          "is_active": true
+        }
+      ]
+    },
+    {
       "name": "kalista",
       "reference_board_name": "kalista",
       "arch": "X86_INTERNAL",
@@ -4911,7 +5235,18 @@
         {
           "board_name": "puff",
           "name": "dooly",
-          "cq_test_enabled": false,
+          "test_suites": [
+            "sanity",
+            "bvt-inline",
+            "bvt-tast-cq",
+            "bvt-installer",
+            "bvt-arc",
+            "au",
+            "bvt-cq",
+            "bvt-perbuild",
+            "bvt-tast-informational"
+          ],
+          "cq_test_enabled": true,
           "release_builder_test_pool": "bvt",
           "board_id": 411,
           "is_active": true
@@ -5520,6 +5855,47 @@
       ]
     },
     {
+      "name": "sarien-arc64",
+      "reference_board_name": "sarien-arc64",
+      "arch": "X86_INTERNAL",
+      "builder": "RELEASE",
+      "experimental": true,
+      "models": [
+        {
+          "board_name": "sarien-arc64",
+          "name": "arcada",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7158,
+          "is_active": true
+        },
+        {
+          "board_name": "sarien-arc64",
+          "name": "arcada_signed",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7158,
+          "is_active": true
+        },
+        {
+          "board_name": "sarien-arc64",
+          "name": "sarien",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7158,
+          "is_active": true
+        },
+        {
+          "board_name": "sarien-arc64",
+          "name": "sarien_signed",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7158,
+          "is_active": true
+        }
+      ]
+    },
+    {
       "name": "scarlet",
       "reference_board_name": "scarlet",
       "arch": "ARM_INTERNAL",
@@ -5574,6 +5950,39 @@
       ]
     },
     {
+      "name": "scarlet-arc64",
+      "reference_board_name": "scarlet-arc64",
+      "arch": "ARM_INTERNAL",
+      "builder": "RELEASE",
+      "experimental": true,
+      "models": [
+        {
+          "board_name": "scarlet-arc64",
+          "name": "dru",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7155,
+          "is_active": true
+        },
+        {
+          "board_name": "scarlet-arc64",
+          "name": "druwl",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7155,
+          "is_active": true
+        },
+        {
+          "board_name": "scarlet-arc64",
+          "name": "dumo",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 7155,
+          "is_active": true
+        }
+      ]
+    },
+    {
       "name": "snappy",
       "reference_board_name": "snappy",
       "arch": "X86_INTERNAL",
@@ -5800,6 +6209,41 @@
         },
         {
           "board_name": "volteer",
+          "name": "delbin_npcx796fc",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 405,
+          "is_active": true
+        },
+        {
+          "board_name": "volteer",
+          "name": "eldrid",
+          "test_suites": [
+            "sanity",
+            "bvt-inline",
+            "bvt-tast-cq",
+            "bvt-installer",
+            "bvt-arc",
+            "au",
+            "bvt-cq",
+            "bvt-perbuild",
+            "bvt-tast-informational"
+          ],
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 405,
+          "is_active": true
+        },
+        {
+          "board_name": "volteer",
+          "name": "eldrid_npcx796",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 405,
+          "is_active": true
+        },
+        {
+          "board_name": "volteer",
           "name": "elemi",
           "cq_test_enabled": false,
           "release_builder_test_pool": "bvt",
@@ -5991,6 +6435,14 @@
         },
         {
           "board_name": "volteer-kernelnext",
+          "name": "delbin_npcx796fc",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 451,
+          "is_active": true
+        },
+        {
+          "board_name": "volteer-kernelnext",
           "name": "eldrid",
           "cq_test_enabled": false,
           "release_builder_test_pool": "bvt",
@@ -5999,6 +6451,14 @@
         },
         {
           "board_name": "volteer-kernelnext",
+          "name": "eldrid_npcx796",
+          "cq_test_enabled": false,
+          "release_builder_test_pool": "bvt",
+          "board_id": 451,
+          "is_active": true
+        },
+        {
+          "board_name": "volteer-kernelnext",
           "name": "elemi",
           "cq_test_enabled": false,
           "release_builder_test_pool": "bvt",
diff --git a/config/luci-scheduler.cfg b/config/luci-scheduler.cfg
index dcebc5c..ecc0c5e 100644
--- a/config/luci-scheduler.cfg
+++ b/config/luci-scheduler.cfg
@@ -56,17 +56,6 @@
   acl_sets: "default"
   schedule: "with 5m interval"
   gitiles: {
-    repo: "https://chromium.googlesource.com/chromium/src"
-    refs: "regexp:refs/tags/87\\..*"
-  }
-  triggers: "release-R87-13505.B-chell-chrome-no-afdo-uprev-pre-flight-branch"
-}
-
-trigger {
-  id: "trigger_3"
-  acl_sets: "default"
-  schedule: "with 5m interval"
-  gitiles: {
     repo: "https://chromium.googlesource.com/chromiumos/chromite"
     refs: "refs/heads/master"
     path_regexps: "config/luci-scheduler.cfg"
@@ -75,7 +64,7 @@
 }
 
 trigger {
-  id: "trigger_4"
+  id: "trigger_3"
   acl_sets: "default"
   schedule: "with 5m interval"
   gitiles: {
@@ -86,7 +75,7 @@
 }
 
 trigger {
-  id: "trigger_5"
+  id: "trigger_4"
   acl_sets: "default"
   schedule: "with 5m interval"
   gitiles: {
@@ -97,7 +86,7 @@
 }
 
 trigger {
-  id: "trigger_6"
+  id: "trigger_5"
   acl_sets: "default"
   schedule: "with 5m interval"
   gitiles: {
@@ -109,7 +98,7 @@
 }
 
 trigger {
-  id: "trigger_7"
+  id: "trigger_6"
   acl_sets: "default"
   schedule: "with 5m interval"
   gitiles: {
@@ -121,7 +110,7 @@
 }
 
 trigger {
-  id: "trigger_8"
+  id: "trigger_7"
   acl_sets: "default"
   schedule: "with 5m interval"
   gitiles: {
@@ -2759,24 +2748,6 @@
 }
 
 job {
-  id: "release-R87-13505.B-chell-chrome-no-afdo-uprev-pre-flight-branch"
-  acl_sets: "default"
-  schedule: "triggered"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromeos.general"
-    builder: "LegacyRelease"
-    tags: "cbb_branch:release-R87-13505.B"
-    tags: "cbb_config:chell-chrome-no-afdo-uprev-pre-flight-branch"
-    tags: "cbb_display_label:release"
-    properties: "cbb_branch:release-R87-13505.B"
-    properties: "cbb_config:chell-chrome-no-afdo-uprev-pre-flight-branch"
-    properties: "cbb_display_label:release"
-    properties: "cbb_extra_args:[\"--buildbot\"]"
-  }
-}
-
-job {
   id: "release-R87-13505.B-orderfile-generate-toolchain"
   acl_sets: "default"
   schedule: "0 8/12 * * *"
diff --git a/config/waterfall_layout_dump.txt b/config/waterfall_layout_dump.txt
index 782428f..d849b8e 100644
--- a/config/waterfall_layout_dump.txt
+++ b/config/waterfall_layout_dump.txt
@@ -265,6 +265,7 @@
     betty-pi-arc-release
     betty-qt-arc-release
     betty-release
+    bob-arc64-release
     bob-release
     brya-release
     bubs-release
@@ -288,6 +289,7 @@
     dedede-release
     drallion-release
     edgar-release
+    elm-arc64-release
     elm-kernelnext-release
     elm-release
     endeavour-release
@@ -311,6 +313,7 @@
     gnawty-release
     gonzo-release
     grunt-arc-r-release
+    grunt-arc64-release
     grunt-kernelnext-release
     grunt-release
     guado-cfm-release
@@ -318,6 +321,7 @@
     guado-release
     guado_labstation-release
     guybrush-release
+    hana-arc64-release
     hana-kernelnext-release
     hana-release
     hatch-arc-r-ack-release
@@ -329,6 +333,7 @@
     hatch-kernelnext-release
     hatch-release
     heli-release
+    jacuzzi-arc64-release
     jacuzzi-release
     kalista-cfm-release
     kalista-release
@@ -377,7 +382,9 @@
     romer-release
     samus-release
     sand-release
+    sarien-arc64-release
     sarien-release
+    scarlet-arc64-release
     scarlet-release
     sentry-release
     setzer-release
@@ -388,6 +395,8 @@
     strongbad-release
     sumo-release
     swanky-release
+    tael-release
+    tatl-release
     terra-release
     tidus-release
     trogdor-release
@@ -579,6 +588,12 @@
   betty-release-tryjob
   betty-unittest-stress
   betty-vmtest-informational-tryjob
+  bob-arc64-full-tryjob
+  bob-arc64-llvm-next-toolchain-tryjob
+  bob-arc64-llvm-toolchain-tryjob
+  bob-arc64-payloads-tryjob
+  bob-arc64-release-tryjob
+  bob-arc64-unittest-stress
   bob-factory-gru-9017.B-factorybranch-tryjob
   bob-full-tryjob
   bob-llvm-next-toolchain-tryjob
@@ -755,6 +770,12 @@
   edgar-payloads-tryjob
   edgar-release-tryjob
   edgar-unittest-stress
+  elm-arc64-full-tryjob
+  elm-arc64-llvm-next-toolchain-tryjob
+  elm-arc64-llvm-toolchain-tryjob
+  elm-arc64-payloads-tryjob
+  elm-arc64-release-tryjob
+  elm-arc64-unittest-stress
   elm-factory-oak-8182.B-factorybranch-tryjob
   elm-full-tryjob
   elm-kernelnext-full-tryjob
@@ -1130,6 +1151,12 @@
   grunt-arc-r-release-tryjob
   grunt-arc-r-unittest-stress
   grunt-arc-r-vmrvc-android-pfq-tryjob
+  grunt-arc64-full-tryjob
+  grunt-arc64-llvm-next-toolchain-tryjob
+  grunt-arc64-llvm-toolchain-tryjob
+  grunt-arc64-payloads-tryjob
+  grunt-arc64-release-tryjob
+  grunt-arc64-unittest-stress
   grunt-factory-grunt-11164.B-factorybranch-tryjob
   grunt-full-tryjob
   grunt-kernelnext-full-tryjob
@@ -1176,6 +1203,12 @@
   guybrush-payloads-tryjob
   guybrush-release-tryjob
   guybrush-unittest-stress
+  hana-arc64-full-tryjob
+  hana-arc64-llvm-next-toolchain-tryjob
+  hana-arc64-llvm-toolchain-tryjob
+  hana-arc64-payloads-tryjob
+  hana-arc64-release-tryjob
+  hana-arc64-unittest-stress
   hana-factory-oak-8182.B-factorybranch-tryjob
   hana-full-tryjob
   hana-kernelnext-full-tryjob
@@ -1246,6 +1279,12 @@
   heli-payloads-tryjob
   heli-release-tryjob
   heli-unittest-stress
+  jacuzzi-arc64-full-tryjob
+  jacuzzi-arc64-llvm-next-toolchain-tryjob
+  jacuzzi-arc64-llvm-toolchain-tryjob
+  jacuzzi-arc64-payloads-tryjob
+  jacuzzi-arc64-release-tryjob
+  jacuzzi-arc64-unittest-stress
   jacuzzi-factory-kukui-12587.B-factorybranch-tryjob
   jacuzzi-full-tryjob
   jacuzzi-llvm-next-toolchain-tryjob
@@ -1449,6 +1488,7 @@
     betty-pi-arc-release-tryjob
     betty-qt-arc-release-tryjob
     betty-release-tryjob
+    bob-arc64-release-tryjob
     bob-release-tryjob
     brya-release-tryjob
     bubs-release-tryjob
@@ -1472,6 +1512,7 @@
     dedede-release-tryjob
     drallion-release-tryjob
     edgar-release-tryjob
+    elm-arc64-release-tryjob
     elm-kernelnext-release-tryjob
     elm-release-tryjob
     endeavour-release-tryjob
@@ -1495,6 +1536,7 @@
     gnawty-release-tryjob
     gonzo-release-tryjob
     grunt-arc-r-release-tryjob
+    grunt-arc64-release-tryjob
     grunt-kernelnext-release-tryjob
     grunt-release-tryjob
     guado-cfm-release-tryjob
@@ -1502,6 +1544,7 @@
     guado-release-tryjob
     guado_labstation-release-tryjob
     guybrush-release-tryjob
+    hana-arc64-release-tryjob
     hana-kernelnext-release-tryjob
     hana-release-tryjob
     hatch-arc-r-ack-release-tryjob
@@ -1513,6 +1556,7 @@
     hatch-kernelnext-release-tryjob
     hatch-release-tryjob
     heli-release-tryjob
+    jacuzzi-arc64-release-tryjob
     jacuzzi-release-tryjob
     kalista-cfm-release-tryjob
     kalista-release-tryjob
@@ -1561,7 +1605,9 @@
     romer-release-tryjob
     samus-release-tryjob
     sand-release-tryjob
+    sarien-arc64-release-tryjob
     sarien-release-tryjob
+    scarlet-arc64-release-tryjob
     scarlet-release-tryjob
     sentry-release-tryjob
     setzer-release-tryjob
@@ -1572,6 +1618,8 @@
     strongbad-release-tryjob
     sumo-release-tryjob
     swanky-release-tryjob
+    tael-release-tryjob
+    tatl-release-tryjob
     terra-release-tryjob
     tidus-release-tryjob
     trogdor-release-tryjob
@@ -1837,6 +1885,12 @@
   sand-payloads-tryjob
   sand-release-tryjob
   sand-unittest-stress
+  sarien-arc64-full-tryjob
+  sarien-arc64-llvm-next-toolchain-tryjob
+  sarien-arc64-llvm-toolchain-tryjob
+  sarien-arc64-payloads-tryjob
+  sarien-arc64-release-tryjob
+  sarien-arc64-unittest-stress
   sarien-factory-sarien-12033.B-factorybranch-tryjob
   sarien-full-tryjob
   sarien-llvm-next-toolchain-tryjob
@@ -1845,6 +1899,12 @@
   sarien-payloads-tryjob
   sarien-release-tryjob
   sarien-unittest-stress
+  scarlet-arc64-full-tryjob
+  scarlet-arc64-llvm-next-toolchain-tryjob
+  scarlet-arc64-llvm-toolchain-tryjob
+  scarlet-arc64-payloads-tryjob
+  scarlet-arc64-release-tryjob
+  scarlet-arc64-unittest-stress
   scarlet-factory-scarlet-10211.B-factorybranch-tryjob
   scarlet-full-tryjob
   scarlet-llvm-next-toolchain-tryjob
@@ -1923,10 +1983,12 @@
   tael-full-tryjob
   tael-llvm-next-toolchain-tryjob
   tael-llvm-toolchain-tryjob
+  tael-release-tryjob
   tael-unittest-stress
   tatl-full-tryjob
   tatl-llvm-next-toolchain-tryjob
   tatl-llvm-toolchain-tryjob
+  tatl-release-tryjob
   tatl-unittest-stress
   terra-factory-strago-7458.B-factorybranch-tryjob
   terra-full-tryjob
diff --git a/cros/test/image_test.py b/cros/test/image_test.py
index 8fecee7..4e6bb79 100644
--- a/cros/test/image_test.py
+++ b/cros/test/image_test.py
@@ -113,8 +113,8 @@
     The allow list has higher precedence than the block list.
     """
     blocked_patterns = [re.compile(x) for x in [
-        r'text/x-c\+\+',
-        r'text/x-c',
+        r'^text/x-c\+\+$',
+        r'^text/x-c$',
     ]]
     allowed_patterns = [re.compile(x) for x in [
         r'.*/braille/.*',
diff --git a/cros/test/usergroup_baseline.py b/cros/test/usergroup_baseline.py
index 3056eca..831c5e5 100644
--- a/cros/test/usergroup_baseline.py
+++ b/cros/test/usergroup_baseline.py
@@ -177,7 +177,8 @@
     GroupEntry(group='suzy-q', gid=415, users={'chronos', 'rma_fw_keeper'}),
     GroupEntry(group='cros_ec-access', gid=416, users={'runtime_probe',
                                                        'healthd_ec',
-                                                       'power'}),
+                                                       'power',
+                                                       'typecd_ec'}),
     GroupEntry(group='shill', gid=20104, users={'shill', 'ipsec'}),
     GroupEntry(group='fuse-drivefs', gid=304, users={'chronos'}),
     GroupEntry(group='password-viewers', gid=611, users={'kerberosd', 'shill',
@@ -196,7 +197,8 @@
     GroupEntry(group='usbprinter', gid=20155, users={'cups', 'saned'}),
     GroupEntry(group='traced-producer', gid=20162, users={'traced',
                                                           'traced-probes',
-                                                          'chronos'}),
+                                                          'chronos',
+                                                          'crosvm'}),
     GroupEntry(group='traced-consumer', gid=20164, users={'traced',
                                                           'chronos'}),
 ))
@@ -236,10 +238,10 @@
                       'ap-lb-update-manager', 'ap-monitor', 'ap-monlog',
                       'ap-net-acc-manager', 'ap-net-controller',
                       'ap-net-monitor', 'ap-pal', 'ap-pcap-manager', 'ap-pfd',
-                      'ap-pipe-reader', 'ap-qos-monitor', 'ap-rodizio',
-                      'ap-taxonomy', 'ap-update-manager', 'ap-vorlon-client',
-                      'ap-wifi-diagnostics', 'ap-wifi-manager',
-                      'ap-wireless-optimizer', 'gdisp'}),
+                      'ap-pipe-reader', 'ap-process-manager', 'ap-qos-monitor',
+                      'ap-rodizio', 'ap-taxonomy', 'ap-update-manager',
+                      'ap-vorlon-client', 'ap-wifi-diagnostics',
+                      'ap-wifi-manager', 'ap-wireless-optimizer', 'gdisp'}),
 ))
 
 # rialtod:!:400:rialto
diff --git a/lib/config_lib.py b/lib/config_lib.py
index 4d6abca..0112ac7 100644
--- a/lib/config_lib.py
+++ b/lib/config_lib.py
@@ -951,6 +951,9 @@
       # List of images we want to build -- see build_image for more details.
       images=['test'],
 
+      # Whether to convert the image into a guest VM image.
+      guest_vm_image=False,
+
       # Image from which we will build update payloads.  Must either be None
       # or name one of the images in the 'images' list, above.
       payload_image=None,
diff --git a/lib/constants.py b/lib/constants.py
index 1bf2e04..00e9aea 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -40,7 +40,7 @@
 DEFAULT_CHROOT_DIR = 'chroot'
 DEFAULT_CHROOT_PATH = os.path.join(SOURCE_ROOT, DEFAULT_CHROOT_DIR)
 TERMINA_TOOLS_DIR = os.path.join(
-    SOURCE_ROOT, 'src/platform/container-guest-tools/termina')
+    CHROOT_SOURCE_ROOT, 'src/platform/container-guest-tools/termina')
 
 STATEFUL_DIR = '/mnt/stateful_partition'
 
@@ -415,12 +415,23 @@
     MERGE_BRANCH
 ]
 
+# SDK target.
+TARGET_SDK = 'virtual/target-sdk'
 # Default OS target packages.
 TARGET_OS_PKG = 'virtual/target-os'
 TARGET_OS_DEV_PKG = 'virtual/target-os-dev'
 TARGET_OS_TEST_PKG = 'virtual/target-os-test'
 TARGET_OS_FACTORY_PKG = 'virtual/target-os-factory'
 TARGET_OS_FACTORY_SHIM_PKG = 'virtual/target-os-factory-shim'
+# The virtuals composing a "full" build, e.g. what's built in the cq.
+# Local (developer) builds only use target-os by default.
+ALL_TARGET_PACKAGES = (
+    TARGET_OS_PKG,
+    TARGET_OS_DEV_PKG,
+    TARGET_OS_TEST_PKG,
+    TARGET_OS_FACTORY_PKG,
+    TARGET_OS_FACTORY_SHIM_PKG,
+)
 
 # Constants for uprevving Chrome
 
@@ -804,6 +815,9 @@
 TEST_KEY_PRIVATE = 'id_rsa'
 TEST_KEY_PUBLIC = 'id_rsa.pub'
 
+DEBUG_SYMBOLS_NAME = 'debug_breakpad'
+DEBUG_SYMBOLS_TAR = '%s.tar.xz' % DEBUG_SYMBOLS_NAME
+
 DEV_IMAGE_NAME = 'chromiumos_image'
 DEV_IMAGE_BIN = '%s.bin' % DEV_IMAGE_NAME
 
@@ -822,8 +836,10 @@
 IMAGE_TYPE_ACCESSORY_USBPD = 'accessory_usbpd'
 # Standalone accessory microcontroller firmware (e.g. wireless keyboard).
 IMAGE_TYPE_ACCESSORY_RWSIG = 'accessory_rwsig'
-# Cr50 Firmware.
-IMAGE_TYPE_CR50_FIRMWARE = 'cr50_firmware'
+# GSC Firmware.
+IMAGE_TYPE_GSC_FIRMWARE = 'gsc_firmware'
+# TODO(b/173049030): Deprecate this alias after 2021-06.
+IMAGE_TYPE_CR50_FIRMWARE = IMAGE_TYPE_GSC_FIRMWARE
 
 IMAGE_TYPE_TO_NAME = {
     IMAGE_TYPE_BASE: BASE_IMAGE_BIN,
diff --git a/lib/depgraph.py b/lib/depgraph.py
index a5c9938..f5b16d4 100644
--- a/lib/depgraph.py
+++ b/lib/depgraph.py
@@ -7,12 +7,17 @@
 
 from __future__ import print_function
 
+import collections
 import copy
 import os
 import sys
 import time
+from typing import List, Optional, Union
 
+from chromite.lib import constants
+from chromite.lib import cros_logging as logging
 from chromite.lib import cros_test_lib
+from chromite.lib.parser import package_info
 
 assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
 
@@ -395,7 +400,8 @@
               break
 
           deps[cpv] = dict(
-              action=action, deptypes=[str(x) for x in priorities], deps={})
+              action=action, deptypes=[str(x) for x in priorities], deps={},
+              root=child.root)
 
       # We've built our list of deps, so we can add our package to the tree.
 
@@ -409,7 +415,8 @@
         # for a board and the package is a BDEPEND. We only want to add that
         # package to the deps_tree if include_bdepend is set.
         if (node.root == root or self.include_bdepend):
-          deps_tree[str(node.cpv)] = dict(action=str(node.operation), deps=deps)
+          deps_tree[str(node.cpv)] = dict(action=str(node.operation), deps=deps,
+                                          root=node.root)
 
         # The only packages that will have a distinct root (in the Chrome OS
         # build) are BDEPEND packages for a board target. If we are building
@@ -422,7 +429,7 @@
         # bdeps_tree.
         if node.root != root:
           bdeps_tree[str(node.cpv)] = dict(
-              action=str(node.operation), deps=deps)
+              action=str(node.operation), deps=deps, root=node.root)
 
     # Ask portage for its install plan, so that we can only throw out
     # dependencies that portage throws out.
@@ -852,3 +859,125 @@
       print('    %s' % (j))
     if not needs:
       print('    no dependencies')
+
+
+# Depgraph results data container used by the raw depgraph functions. The
+# deps attribute has the main depgraph info, while the bdeps attribute
+# contains just the bdepends depgraph, i.e. the depgraph installed to the SDK.
+DepgraphResult = collections.namedtuple('DepgraphResult',
+                                        ('deps', 'bdeps', 'packages'))
+
+
+def _get_emerge_args(sysroot_path: str,
+                     packages: Union[List[str], List[package_info.PackageInfo]],
+                     include_bdeps: bool) -> List[str]:
+  """Get the default emerge arguments for building a depgraph."""
+  # Pretend: Don't actually install anything.
+  # Emptytree: Act as though nothing is installed (even if some packages are).
+  # Sysroot: Which sysroot we're considering.
+  args = ['--quiet', '--pretend', '--emptytree', '--sysroot', sysroot_path]
+  # Also set the root for DepGraphGenerator specific semantics. This might not
+  # be necessary, pending more investigation.
+  # TODO: Document final reason or remove if unnecessary.
+  args.extend(['--root', sysroot_path])
+  if include_bdeps:
+    args.append('--include-bdepend')
+
+  try:
+    # Assume PackageInfo instance.
+    final_pkgs = [p.atom for p in packages]
+  except AttributeError:
+    # Also accept strings.
+    final_pkgs = [str(p) for p in packages]
+  args.extend(final_pkgs)
+
+  logging.info('Generating depgraph for packages: %s', ', '.join(final_pkgs))
+
+  return args
+
+
+def _get_sysroot_path(
+    sysroot: Union[str, 'sysroot_lib.Sysroot'],
+    build_target: Union[str, 'build_target_lib.BuildTarget']) -> str:
+  """Convenience function to support sysroot paths from a variety of sources.
+
+  Get the sysroot path from a sysroot (the path, or a Sysroot instance), or
+  a build target (by name, or from the BuildTarget instance).
+  """
+  if sysroot:
+    try:
+      return sysroot.path
+    except AttributeError:
+      return sysroot
+  else:
+    try:
+      return build_target.root
+    except AttributeError:
+      return cros_build_lib.GetSysroot(build_target)
+
+
+def _get_raw_sdk_depgraph(
+    packages: Optional[Union[List[str], List[package_info.PackageInfo]]] = None
+) -> DepgraphResult:
+  """Get the depgraph for the SDK itself.
+
+  The SDK deps will contain the packages installed to a fresh SDK.
+  The bdeps will always be empty since everything is installed to the SDK.
+  """
+  sysroot_path = cros_build_lib.GetSysroot(board=None)
+  packages = packages or [constants.TARGET_SDK]
+  lib_argv = _get_emerge_args(sysroot_path, packages, include_bdeps=True)
+  deps = DepGraphGenerator()
+  deps.Initialize(lib_argv)
+  deps_tree, _deps_info, bdeps_tree = deps.GenDependencyTree()
+
+  return DepgraphResult(deps=deps_tree, bdeps=bdeps_tree, packages=packages)
+
+
+def _get_raw_sysroot_depgraph(
+    sysroot: Optional['sysroot_lib.Sysroot'] = None,
+    build_target: Optional['build_target_lib.BuildTarget'] = None,
+    packages: Optional[Union[List[str], List[package_info.PackageInfo]]] = None
+) -> DepgraphResult:
+  """Get the sysroot depgraph for a build target.
+
+  The sysroot deps are the packages installed to a sysroot -- effectively
+  the packages installed on a device. The bdeps contains all the packages
+  installed to the SDK when the board is built. The two graphs are technically
+  disjoint, but packages can appear in both (with different roots).
+  """
+  assert build_target or sysroot
+  packages = packages or constants.ALL_TARGET_PACKAGES
+  sysroot_path = _get_sysroot_path(sysroot, build_target)
+  lib_argv = _get_emerge_args(sysroot_path, packages, include_bdeps=False)
+
+  deps = DepGraphGenerator()
+  deps.Initialize(lib_argv)
+  deps_tree, _deps_info, bdeps_tree = deps.GenDependencyTree()
+
+  return DepgraphResult(deps=deps_tree, bdeps=bdeps_tree, packages=packages)
+
+
+def _get_raw_build_target_depgraph(
+    sysroot: Optional['sysroot_lib.Sysroot'] = None,
+    build_target: Optional['build_target_lib.BuildTarget'] = None,
+    packages: Optional[Union[List[str], List[package_info.PackageInfo]]] = None
+) -> DepgraphResult:
+  """Get the full depgraph for a build target - its sysroot and bdepends.
+
+  The build target deps contains the [r]depends packages installed
+  to the sysroot and bdepends packages installed to the SDK.
+  The bdeps contains only the bdepends packages installed to
+  the SDK. The bdeps graph is a subgraph of the deps graph.
+  """
+  assert build_target or sysroot
+  packages = packages or constants.ALL_TARGET_PACKAGES
+  sysroot_path = _get_sysroot_path(sysroot, build_target)
+  lib_argv = _get_emerge_args(sysroot_path, packages, include_bdeps=True)
+
+  deps = DepGraphGenerator()
+  deps.Initialize(lib_argv)
+
+  deps_tree, _deps_info, bdeps_tree = deps.GenDependencyTree()
+  return DepgraphResult(deps=deps_tree, bdeps=bdeps_tree, packages=packages)
+
diff --git a/lib/gs.py b/lib/gs.py
index c63b4ae..f5b8547 100644
--- a/lib/gs.py
+++ b/lib/gs.py
@@ -1035,7 +1035,11 @@
     cmd = ['ls']
     if details:
       cmd += ['-l']
-    cmd += ['--', path]
+    cmd += ['--']
+    if isinstance(path, str):
+      cmd.append(path)
+    else:
+      cmd.extend(path)
 
     # We always request the extended details as the overhead compared to a plain
     # listing is negligible.
@@ -1090,11 +1094,11 @@
     cmd = ['mv', '--', src_path, dest_path]
     return self.DoCommand(cmd, **kwargs)
 
-  def SetACL(self, upload_url, acl=None, **kwargs):
+  def SetACL(self, path, acl=None, **kwargs):
     """Set access on a file already in google storage.
 
     Args:
-      upload_url: gs:// url that will have acl applied to it.
+      path: gs:// url that will have acl applied to it.
       acl: An ACL permissions file or canned ACL.
       kwargs: See options that DoCommand takes.
     """
@@ -1104,7 +1108,13 @@
             'SetAcl invoked w/out a specified acl, nor a default acl.')
       acl = self.acl
 
-    self.DoCommand(['acl', 'set', acl, upload_url], **kwargs)
+    cmd = ['acl', 'set', '--', acl]
+    if isinstance(path, str):
+      cmd.append(path)
+    else:
+      cmd.extend(path)
+
+    self.DoCommand(cmd, **kwargs)
 
   def ChangeACL(self, upload_url, acl_args_file=None, acl_args=None, **kwargs):
     """Change access on a file already in google storage with "acl ch".
@@ -1177,7 +1187,10 @@
     if recursive:
       cmd.append('-R')
     cmd.append('--')
-    cmd.append(path)
+    if isinstance(path, str):
+      cmd.append(path)
+    else:
+      cmd.extend(path)
     try:
       self.DoCommand(cmd, **kwargs)
     except GSNoSuchKey:
diff --git a/lib/gs_unittest.py b/lib/gs_unittest.py
index 717b9b5..9a6d39e 100644
--- a/lib/gs_unittest.py
+++ b/lib/gs_unittest.py
@@ -405,6 +405,10 @@
       found = ctx.List(tempuri, details=True)
       self.assertEqual(files, sorted([os.path.basename(x.url) for x in found]))
 
+      # Check the detailed listing with multiple paths.
+      found = ctx.List(['%s/%s' % (tempuri, x) for x in files], details=True)
+      self.assertEqual(files, sorted([os.path.basename(x.url) for x in found]))
+
       # Make sure sizes line up.
       for f in found:
         l = len(os.path.basename(f.url)) * 10
@@ -646,6 +650,12 @@
     self.ctx.Remove('gs://foo/bar', recursive=True)
     self.gs_mock.assertCommandContains(['rm', '-R'])
 
+  def testMultiple(self):
+    """Test handling of multiple paths."""
+    self.ctx.Remove(['gs://foo/bar', 'gs://fat/cow'], recursive=True)
+    self.gs_mock.assertCommandContains(
+        ['rm', '-R', '--', 'gs://foo/bar', 'gs://fat/cow'])
+
 
 class UnmockedRemoveTest(cros_test_lib.TestCase):
   """Tests Remove functionality w/out mocks."""
@@ -680,6 +690,18 @@
         self.assertFalse(ctx.Exists(os.path.join(tempuri, p)))
 
   @cros_test_lib.NetworkTest()
+  def testMultiple(self):
+    """Test handling of multiple paths."""
+    files = ('a', 'b/c', 'd/e/ffff')
+    ctx = gs.GSContext()
+    with gs.TemporaryURL('chromite.rm') as tempuri:
+      for p in files:
+        ctx.Copy('/dev/null', os.path.join(tempuri, p))
+      ctx.Remove(['%s/%s' % (tempuri, x) for x in files])
+      for p in files:
+        self.assertFalse(ctx.Exists(os.path.join(tempuri, p)))
+
+  @cros_test_lib.NetworkTest()
   def testGeneration(self):
     """Test conditional remove behavior."""
     ctx = gs.GSContext()
@@ -1074,7 +1096,8 @@
   def testSetDefaultAcl(self):
     """Test default ACL behavior."""
     self.ctx.SetACL('gs://abc/1', 'monkeys')
-    self.gs_mock.assertCommandContains(['acl', 'set', 'monkeys', 'gs://abc/1'])
+    self.gs_mock.assertCommandContains(
+        ['acl', 'set', '--', 'monkeys', 'gs://abc/1'])
 
   def testSetAcl(self):
     """Base ACL setting functionality."""
@@ -1083,6 +1106,13 @@
     self.gs_mock.assertCommandContains(['acl', 'set', '/my/file/acl',
                                         'gs://abc/1'])
 
+  def testSetAclMultiple(self):
+    """Test multiple paths at once."""
+    ctx = gs.GSContext(acl='/my/file/acl')
+    ctx.SetACL(['gs://abc/1', 'gs://abc/2'])
+    self.gs_mock.assertCommandContains(
+        ['acl', 'set', '--', '/my/file/acl', 'gs://abc/1', 'gs://abc/2'])
+
   def testChangeAcl(self):
     """Test changing an ACL."""
     basic_file = """
diff --git a/lib/loas.py b/lib/loas.py
index 75d7402..3deed94 100644
--- a/lib/loas.py
+++ b/lib/loas.py
@@ -14,7 +14,6 @@
 from __future__ import print_function
 
 import datetime
-import re
 import socket
 import sys
 
@@ -44,7 +43,7 @@
     self.user = user
     self.email_notify = email_notify
     self.email_server = email_server
-    self.enroll_msg = 'become -t -c "prodaccess --sslenroll" %s@%s' % (
+    self.enroll_msg = 'become -t -c "gcert --loas2" %s@%s' % (
         self.user, socket.getfqdn())
     self.last_notification = (
         datetime.date.today() - datetime.timedelta(weeks=10))
@@ -70,24 +69,18 @@
         self.last_notification + datetime.timedelta(days=1)):
       return
 
-    cmd = ['prodcertstatus', '--check_loas_cert_location', 'sslenrolled']
+    # Let the tool tell us whether things will fail soon.
+    cmd = ['gcertstatus', '--check_loas2', '--nocheck_ssh',
+           f'--check_remaining={7 * 24}h']
     result = cros_build_lib.sudo_run(cmd,
                                      user=self.user,
                                      check=False,
                                      stdout=True,
                                      encoding='utf-8')
 
-    # Figure out how many days are left.  The command should display:
-    # SSL-ENROLLED CERT cert expires in about 22 days
-    m = re.search(r'cert expires in about ([0-9]+) days', result.output)
-    if m:
-      days_left = int(m.group(1))
-    else:
-      days_left = 0
-
     # Send out one notification a day if there's a week or less left
     # before our creds expire.
-    if days_left <= 7:
+    if result.returncode:
       alerts.SendEmail(
           'Loas certs expiring soon!',
           self.email_notify,
@@ -98,4 +91,4 @@
     else:
       # We won't expire for a while, so stop the periodic polling.
       self.last_notification = (
-          datetime.date.today() + datetime.timedelta(days=days_left - 8))
+          datetime.date.today() + datetime.timedelta(days=7))
diff --git a/lib/loas_unittest.py b/lib/loas_unittest.py
index 14b254e..a4d1792 100644
--- a/lib/loas_unittest.py
+++ b/lib/loas_unittest.py
@@ -41,34 +41,34 @@
     self.assertRaises(loas.LoasError, self.loas.Check)
 
   def testStatusError(self):
-    """Verify that errors from prodcertstatus result in an e-mail."""
+    """Verify that errors from gcertstatus result in an e-mail."""
     self.rc_mock.AddCmdResult(
-        partial_mock.In('prodcertstatus'), returncode=1,
-        error='No valid SSL-ENROLLED CERT certs')
+        partial_mock.In('gcertstatus'), returncode=1,
+        error='WARNING no LOAS2 certificate found')
     self.loas.Status()
     self.assertEqual(self.email_mock.call_count, 1)
 
   def testStatusUpToDate(self):
     """Verify that up-to-date certs delay further checks for a while."""
     self.rc_mock.AddCmdResult(
-        partial_mock.In('prodcertstatus'), returncode=0,
-        error='SSL-ENROLLED CERT cert expires in about 39 days')
+        partial_mock.In('gcertstatus'), returncode=0,
+        error='LOAS2 expires in 1234h')
 
-    # This should invoke prodcertstatus.
+    # This should invoke gcertstatus.
     self.loas.Status()
-    self.assertEqual(self.email_mock.call_count, 1)
+    self.assertEqual(self.rc_mock.call_count, 1)
 
     # While this should return quickly.
     self.loas.Status()
-    self.assertEqual(self.email_mock.call_count, 1)
+    self.assertEqual(self.rc_mock.call_count, 1)
 
   def testStatusExpiresSoon(self):
     """Verify that expiring certs generate e-mails once a day."""
     self.rc_mock.AddCmdResult(
-        partial_mock.In('prodcertstatus'), returncode=0,
-        error='SSL-ENROLLED CERT cert expires in about 3 days')
+        partial_mock.In('gcertstatus'), returncode=1,
+        error='  WARNING LOAS2 expires in 76h')
 
-    # This should invoke prodcertstatus & send an e-mail.
+    # This should invoke gcertstatus & send an e-mail.
     self.loas.Status()
     self.assertEqual(self.email_mock.call_count, 1)
 
diff --git a/lib/parser/package_info.py b/lib/parser/package_info.py
index d231239..98f3907 100644
--- a/lib/parser/package_info.py
+++ b/lib/parser/package_info.py
@@ -148,6 +148,12 @@
   def __hash__(self):
     return hash((self._category, self._package, self._version, self._revision))
 
+  def __repr__(self):
+    return f'PackageInfo<{str(self)}>'
+
+  def __str__(self):
+    return self.cpvr or self.atom
+
   @functools.lru_cache()
   def __format__(self, format_spec):
     """Formatter function.
diff --git a/lib/sysroot_lib.py b/lib/sysroot_lib.py
index daefc4f..a86fab9 100644
--- a/lib/sysroot_lib.py
+++ b/lib/sysroot_lib.py
@@ -11,6 +11,7 @@
 import multiprocessing
 import os
 import sys
+from typing import Iterable
 
 from chromite.api.gen.chromiumos import common_pb2
 from chromite.lib import constants
@@ -20,6 +21,7 @@
 from chromite.lib import osutils
 from chromite.lib import portage_util
 from chromite.lib import toolchain
+from chromite.lib.parser import package_info
 
 
 assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
@@ -801,3 +803,30 @@
         os._exit(result.returncode)
     else:
       cros_build_lib.sudo_run(rm + [self.path], quiet=True)
+
+  def get_sdk_provided_packages(self) -> Iterable[package_info.PackageInfo]:
+    """Find all packages provided by the SDK (i.e. package.provided)."""
+    # Look at packages in package.provided.
+    sdk_file_path = self._Path('etc', 'portage', 'profile', 'package.provided')
+    for line in osutils.ReadFile(sdk_file_path).splitlines():
+      # Skip comments and empty lines.
+      line = line.split('#', 1)[0].strip()
+      if not line:
+        continue
+      yield package_info.parse(line)
+
+
+def get_sdk_provided_packages(
+    sysroot_path: str) -> Iterable[package_info.PackageInfo]:
+  """Find all packages provided by the SDK (i.e. package.provided).
+
+  Convenience wrapper for the Sysroot method.
+
+  Args:
+    sysroot_path: The sysroot to use when finding SDK packages.
+
+  Returns:
+    The provided packages.
+  """
+  sysroot = Sysroot(sysroot_path)
+  return sysroot.get_sdk_provided_packages()
diff --git a/lib/sysroot_lib_unittest.py b/lib/sysroot_lib_unittest.py
index 052eca7..277e98e 100644
--- a/lib/sysroot_lib_unittest.py
+++ b/lib/sysroot_lib_unittest.py
@@ -271,3 +271,17 @@
 
     with self.assertRaises(sysroot_lib.ToolchainInstallError):
       self.sysroot.UpdateToolchain('board', local_init=True)
+
+
+def test_get_sdk_provided_packages(simple_sysroot):
+  pkg_provided = simple_sysroot.path / 'etc/portage/profile/package.provided'
+  content = """
+foo/bar-2-r3
+
+# Comment line.
+cat/pkg-1.0.0 # Comment after package.
+"""
+  osutils.WriteFile(pkg_provided, content, makedirs=True)
+  pkgs = list(sysroot_lib.get_sdk_provided_packages(simple_sysroot.path))
+  expected = [package_info.parse(p) for p in ('foo/bar-2-r3', 'cat/pkg-1.0.0')]
+  assert pkgs == expected
diff --git a/lib/uprev_lib.py b/lib/uprev_lib.py
index 7c9071e..b779018 100644
--- a/lib/uprev_lib.py
+++ b/lib/uprev_lib.py
@@ -505,14 +505,11 @@
       result = ebuild.RevWorkOnEBuild(
           os.path.join(constants.SOURCE_ROOT, 'src'), self.manifest,
           reject_self_repo=self._reject_self_repo)
-    except portage_util.InvalidUprevSourceError as e:
+    except (portage_util.InvalidUprevSourceError,
+            portage_util.EbuildVersionError) as e:
       logging.error('An error occurred while uprevving %s: %s',
                     ebuild.package, e)
       raise
-    except portage_util.EbuildVersionError as e:
-      logging.warning('An error occurred while uprevving %s, skipping: %s',
-                      ebuild.package, e)
-      return
     except OSError:
       logging.warning(
           'Cannot rev %s\n'
@@ -820,8 +817,11 @@
     raise EbuildManifestError(
         f'Unable to update manifest for {package}: {e.stderr}')
 
-  result = UprevResult(
-      outcome=outcome, changed_files=[new_ebuild_src_path, manifest_src_path])
+  changed_files = [new_ebuild_src_path]
+  if os.path.exists(manifest_src_path):
+    changed_files.append(manifest_src_path)
+
+  result = UprevResult(outcome=outcome, changed_files=changed_files)
 
   if stable_ebuild is not None:
     result.changed_files.append(stable_ebuild.ebuild_path)
diff --git a/lib/xbuddy/xbuddy.py b/lib/xbuddy/xbuddy.py
index c618bbe..bfc9436 100644
--- a/lib/xbuddy/xbuddy.py
+++ b/lib/xbuddy/xbuddy.py
@@ -575,7 +575,7 @@
     if os.path.exists(dev_image):
       return 'dev'
 
-    raise XBuddyException('No images found in %s' % local_dir)
+    return None
 
   @staticmethod
   def InterpretPath(path, default_board=None, default_version=None):
@@ -854,6 +854,7 @@
     # Parse the path.
     image_type, board, version, is_local = self.InterpretPath(
         path, default_board, default_version)
+    file_name = None
     if is_local:
       # Get a local image.
       if version == LATEST:
@@ -865,10 +866,13 @@
       if image_type == ANY:
         image_type = self._FindAny(artifact_dir)
 
-      file_name = os.path.join(artifact_dir,
-                               LOCAL_ALIAS_TO_FILENAME[image_type])
-      if not os.path.exists(file_name):
-        raise XBuddyException('Local %s artifact not in static_dir at %s' %
+      # If there was an image type discovered, get the file name otherwise, just
+      # return with no file name.
+      if image_type:
+        file_name = os.path.join(artifact_dir,
+                                 LOCAL_ALIAS_TO_FILENAME[image_type])
+        if not os.path.exists(file_name):
+          raise XBuddyException('Local %s artifact not in static_dir at %s' %
                               (image_type, file_name))
     else:
       # Get a remote image.
@@ -879,7 +883,6 @@
           board, suffix, version, image_dir=image_dir)
       _Log('Resolved version %s to %s.', version, build_id)
 
-      file_name = None
       if not lookup_only:
         file_name = self._GetFromGS(build_id, image_type, image_dir=image_dir,
                                     channel=channel)[0]
diff --git a/licensing/licenses_lib.py b/licensing/licenses_lib.py
index 81e4e0a..e4eff85 100644
--- a/licensing/licenses_lib.py
+++ b/licensing/licenses_lib.py
@@ -134,10 +134,11 @@
 # attribution from them.
 COPYRIGHT_ATTRIBUTION_LICENSES = [
     'BSD',    # requires distribution of copyright notice
-    'BSD-2',  # so does BSD-2 http://opensource.org/licenses/BSD-2-Clause
-    'BSD-3',  # and BSD-3? http://opensource.org/licenses/BSD-3-Clause
+    'BSD-2',  # so does BSD-2 https://opensource.org/licenses/BSD-2-Clause
+    'BSD-3',  # and BSD-3? https://opensource.org/licenses/BSD-3-Clause
     'BSD-4',  # and 4?
     'BSD-with-attribution',
+    'ISC',    # so does ISC https://opensource.org/licenses/ISC
     'MIT',
     'MIT-with-advertising',
     'Old-MIT',
diff --git a/scripts/cros_extract_deps.py b/scripts/cros_extract_deps.py
index 1ef8e07..6f31cc3 100644
--- a/scripts/cros_extract_deps.py
+++ b/scripts/cros_extract_deps.py
@@ -11,7 +11,6 @@
 from __future__ import print_function
 from __future__ import absolute_import
 
-import os
 import sys
 
 from chromite.lib.depgraph import DepGraphGenerator
@@ -19,8 +18,8 @@
 from chromite.lib import commandline
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_logging as logging
-from chromite.lib import osutils
 from chromite.lib import pformat
+from chromite.lib import sysroot_lib
 from chromite.lib.parser import package_info
 
 
@@ -154,27 +153,6 @@
   return cpes
 
 
-def GenerateSDKCPVList(sysroot):
-  """Find all SDK packages from package.provided
-
-  Args:
-    sysroot: The board directory to use when finding SDK packages.
-
-  Returns:
-    A list of CPV Name strings, e.g.
-    ["sys-libs/glibc-2.23-r9", "dev-lang/go-1.8.3-r1"]
-  """
-  # Look at packages in package.provided.
-  sdk_file_path = os.path.join(sysroot, 'etc', 'portage',
-                               'profile', 'package.provided')
-  for line in osutils.ReadFile(sdk_file_path).splitlines():
-    # Skip comments and empty lines.
-    line = line.split('#', 1)[0].strip()
-    if not line:
-      continue
-    yield line
-
-
 def GenerateCPEList(deps_list, sysroot):
   """Generate all CPEs for the packages included in deps_list and SDK packages
 
@@ -203,20 +181,20 @@
   """
   cpe_dump = []
 
-  # Generage CPEs for SDK packages.
-  for sdk_cpv in sorted(GenerateSDKCPVList(sysroot)):
+  # Generate CPEs for SDK packages.
+  for pkg_info in sorted(
+      sysroot_lib.get_sdk_provided_packages(sysroot), key=lambda x: x.cpvr):
     # Only add CPE for SDK CPVs missing in deps_list.
-    if deps_list.get(sdk_cpv) is not None:
+    if deps_list.get(pkg_info.cpvr) is not None:
       continue
 
-    split = package_info.SplitCPV(sdk_cpv)
-    cpes = GetCPEFromCPV(split.category, split.package, split.version_no_rev)
+    cpes = GetCPEFromCPV(pkg_info.category, pkg_info.package, pkg_info.version)
     if cpes:
-      cpe_dump.append({'ComponentName': '%s' % split.cp,
+      cpe_dump.append({'ComponentName': '%s' % pkg_info.atom,
                        'Repository': 'cros',
                        'Targets': sorted(cpes)})
     else:
-      logging.warning('No CPE entry for %s', sdk_cpv)
+      logging.warning('No CPE entry for %s', pkg_info.cpvr)
 
   # Generage CPEs for packages in deps_list.
   for cpv, record in sorted(deps_list.items()):
diff --git a/scripts/cros_portage_upgrade.py b/scripts/cros_portage_upgrade.py
index b502b32..84c5378 100644
--- a/scripts/cros_portage_upgrade.py
+++ b/scripts/cros_portage_upgrade.py
@@ -1866,7 +1866,7 @@
       '\n'
   )
 
-  parser = commandline.ArgumentParser(epilog=epilog)
+  parser = commandline.ArgumentParser(epilog=epilog, default_log_level='notice')
   parser.add_argument('packages', nargs='*', default=None,
                       help='Packages to process.')
   parser.add_argument('--amend', action='store_true', default=False,
diff --git a/scripts/cros_sdk.py b/scripts/cros_sdk.py
index dc87c78..11cfb21 100644
--- a/scripts/cros_sdk.py
+++ b/scripts/cros_sdk.py
@@ -21,6 +21,7 @@
 import random
 import re
 import resource
+import subprocess
 import sys
 
 from six.moves import urllib
@@ -971,11 +972,19 @@
   # --use-image after a reboot to avoid losing access to their existing chroot.
   chroot_exists = cros_sdk_lib.IsChrootReady(options.chroot)
   img_path = _ImageFileForChroot(options.chroot)
-  if (not options.use_image and not chroot_exists and not options.delete and
-      not options.unmount and os.path.exists(img_path)):
-    logging.notice('Existing chroot image %s found.  Forcing --use-image on.',
-                   img_path)
-    options.use_image = True
+  if (not options.use_image and not options.delete and not options.unmount
+      and os.path.exists(img_path)):
+    if chroot_exists:
+      # If the chroot is already populated, make sure it has something
+      # mounted on it before we assume it came from an image.
+      cmd = ['mountpoint', '-q', options.chroot]
+      if cros_build_lib.dbg_run(cmd, check=False).returncode == 0:
+        options.use_image = True
+
+    else:
+      logging.notice('Existing chroot image %s found.  Forcing --use-image on.',
+                     img_path)
+      options.use_image = True
 
   if any_snapshot_operation and not options.use_image:
     if os.path.exists(img_path):
@@ -1138,14 +1147,19 @@
     extra_gbs = (img_used_bytes - mount_used_bytes) // 2**30
     if extra_gbs > MAX_UNUSED_IMAGE_GBS:
       logging.notice('%s is using %s GiB more than needed.  Running '
-                     'fstrim.', img_path, extra_gbs)
-      cmd = ['fstrim', options.chroot]
-      try:
-        cros_build_lib.dbg_run(cmd)
-      except cros_build_lib.RunCommandError as e:
-        logging.warning(
-            'Running fstrim failed. Consider running fstrim on '
-            'your chroot manually.\n%s', e)
+                     'fstrim in background.', img_path, extra_gbs)
+      pid = os.fork()
+      if pid == 0:
+        try:
+          # Directly call Popen to run fstrim concurrently.
+          cmd = ['fstrim', options.chroot]
+          subprocess.Popen(cmd, close_fds=True, shell=False)
+        except subprocess.SubprocessError as e:
+          logging.warning(
+              'Running fstrim failed. Consider running fstrim on '
+              'your chroot manually.\n%s', e)
+        os._exit(0)  # pylint: disable=protected-access
+      os.waitpid(pid, 0)
 
   # Enter a new set of namespaces.  Everything after here cannot directly affect
   # the hosts's mounts or alter LVM volumes.
diff --git a/scripts/pushimage.py b/scripts/pushimage.py
index b5fd647..90ee2fd 100644
--- a/scripts/pushimage.py
+++ b/scripts/pushimage.py
@@ -56,7 +56,7 @@
     constants.IMAGE_TYPE_ACCESSORY_USBPD,
     constants.IMAGE_TYPE_ACCESSORY_RWSIG,
     constants.IMAGE_TYPE_BASE,
-    constants.IMAGE_TYPE_CR50_FIRMWARE,
+    constants.IMAGE_TYPE_GSC_FIRMWARE,
 )
 
 
@@ -292,7 +292,8 @@
 
 def PushImage(src_path, board, versionrev=None, profile=None, priority=50,
               sign_types=None, dry_run=False, mock=False, force_keysets=(),
-              force_channels=None, buildroot=constants.SOURCE_ROOT):
+              force_channels=None, buildroot=constants.SOURCE_ROOT,
+              dest_bucket=constants.RELEASE_BUCKET):
   """Push the image from the archive bucket to the release bucket.
 
   Args:
@@ -309,6 +310,7 @@
     force_keysets: Set of keysets to use rather than what the inputs say.
     force_channels: Set of channels to use rather than what the inputs say.
     buildroot: Buildroot in which to look for signing instructions.
+    dest_bucket: Bucket to push results to.
 
   Returns:
     A dictionary that maps 'channel' -> ['gs://signer_instruction_uri1',
@@ -371,7 +373,7 @@
     gs_base = os.path.join(tbs_base, getpass.getuser())
   else:
     logging.info('Upload mode: normal; signers will process the images')
-    tbs_base = gs_base = constants.RELEASE_BUCKET
+    tbs_base = gs_base = dest_bucket
 
   sect_general = {
       'config_board': board,
@@ -408,7 +410,7 @@
     firmware_basename = _ImageNameBase(constants.IMAGE_TYPE_FIRMWARE)
     acc_usbpd_basename = _ImageNameBase(constants.IMAGE_TYPE_ACCESSORY_USBPD)
     acc_rwsig_basename = _ImageNameBase(constants.IMAGE_TYPE_ACCESSORY_RWSIG)
-    cr50_firmware_basename = _ImageNameBase(constants.IMAGE_TYPE_CR50_FIRMWARE)
+    gsc_firmware_basename = _ImageNameBase(constants.IMAGE_TYPE_GSC_FIRMWARE)
     test_basename = _ImageNameBase(constants.IMAGE_TYPE_TEST)
     base_basename = _ImageNameBase(constants.IMAGE_TYPE_BASE)
     hwqual_tarball = 'chromeos-hwqual-%s-%s.tar.bz2' % (board, versionrev)
@@ -447,8 +449,8 @@
         ('firmware_from_source.tar.bz2', acc_rwsig_basename, 'tar.bz2',
          constants.IMAGE_TYPE_ACCESSORY_RWSIG),
 
-        ('firmware_from_source.tar.bz2', cr50_firmware_basename, 'tar.bz2',
-         constants.IMAGE_TYPE_CR50_FIRMWARE),
+        ('firmware_from_source.tar.bz2', gsc_firmware_basename, 'tar.bz2',
+         constants.IMAGE_TYPE_GSC_FIRMWARE),
     )
 
     # The following build artifacts are copied and marked for signing, if
@@ -616,6 +618,8 @@
                       help='Buildroot to use. Defaults to current.')
   parser.add_argument('--yes', action='store_true', default=False,
                       help='answer yes to all prompts')
+  parser.add_argument('--dest-bucket', default=constants.RELEASE_BUCKET,
+                      help='dest bucket. Default to %(default)s')
 
   return parser
 
@@ -644,4 +648,4 @@
             profile=opts.profile, priority=opts.priority,
             sign_types=opts.sign_types, dry_run=opts.dry_run, mock=opts.mock,
             force_keysets=force_keysets, force_channels=opts.channels,
-            buildroot=opts.buildroot)
+            buildroot=opts.buildroot, dest_bucket=opts.dest_bucket)
diff --git a/scripts/pushimage_unittest.py b/scripts/pushimage_unittest.py
index c8b2e92..bcbecc4 100644
--- a/scripts/pushimage_unittest.py
+++ b/scripts/pushimage_unittest.py
@@ -320,20 +320,20 @@
     self.assertTrue(self.mark_mock.called)
     self.assertEqual(urls, EXPECTED)
 
-  def testSignTypesCr50Firmware(self):
+  def testSignTypesGscFirmware(self):
     """Only sign the requested type"""
     EXPECTED = {
         'canary': [
             ('gs://chromeos-releases/canary-channel/board2/5126.0.0/'
-             'ChromeOS-cr50_firmware-R34-5126.0.0-board2.instructions')],
+             'ChromeOS-gsc_firmware-R34-5126.0.0-board2.instructions')],
         'dev': [
             ('gs://chromeos-releases/dev-channel/board2/5126.0.0/'
-             'ChromeOS-cr50_firmware-R34-5126.0.0-board2.instructions')],
+             'ChromeOS-gsc_firmware-R34-5126.0.0-board2.instructions')],
     }
 
     with mock.patch.object(gs.GSContext, 'Exists', return_value=True):
       urls = pushimage.PushImage('/src', 'board2', 'R34-5126.0.0',
-                                 sign_types=['cr50_firmware'])
+                                 sign_types=['gsc_firmware'])
     self.assertEqual(self.gs_mock.call_count, 30)
     self.assertTrue(self.mark_mock.called)
     self.assertEqual(urls, EXPECTED)
diff --git a/scripts/run_pytest.py b/scripts/run_pytest.py
index 53fdda7..499a559 100644
--- a/scripts/run_pytest.py
+++ b/scripts/run_pytest.py
@@ -35,7 +35,6 @@
     ensure_chroot_exists()
     re_execute_inside_chroot(argv)
   else:
-    os.chdir(constants.CHROMITE_DIR)
     pytest_args += ['--no-chroot']
 
   # This is a cheesy hack to make sure gsutil is populated in the cache before
@@ -81,15 +80,22 @@
 
 def re_execute_inside_chroot(argv):
   """Re-execute the test wrapper inside the chroot."""
+  if cros_build_lib.IsInsideChroot():
+    return
+
+  target = os.path.join(constants.CHROMITE_DIR, 'scripts', 'run_pytest')
+  relpath = os.path.relpath(target, '.')
+  # If we're in the scripts dir, make sure we always have a relative path,
+  # otherwise cros_sdk will search $PATH and fail.
+  if os.path.sep not in relpath:
+    relpath = os.path.join('.', relpath)
   cmd = [
       'cros_sdk',
+      '--working-dir', '.',
       '--',
-      os.path.join('..', '..', 'chromite', 'run_pytest'),
+      relpath,
   ]
-  if not cros_build_lib.IsInsideChroot():
-    os.execvp(cmd[0], cmd + argv)
-  else:
-    os.chdir(constants.CHROMITE_DIR)
+  os.execvp(cmd[0], cmd + argv)
 
 
 def ensure_chroot_exists():
diff --git a/scripts/run_tests.py b/scripts/run_tests.py
index 82c99dc..90a78f8 100644
--- a/scripts/run_tests.py
+++ b/scripts/run_tests.py
@@ -73,7 +73,6 @@
 # List all exceptions, with a token describing what's odd here.
 SPECIAL_TESTS = {
     # Tests that need to run inside the chroot.
-    'cli/cros/lint_unittest': INSIDE,
     'lib/cros_test_lib_unittest': INSIDE,
     'lib/operation_unittest': INSIDE,
 
diff --git a/scripts/trigger_cr50_signing b/scripts/trigger_gsc_signing
similarity index 100%
rename from scripts/trigger_cr50_signing
rename to scripts/trigger_gsc_signing
diff --git a/scripts/trigger_cr50_signing.py b/scripts/trigger_gsc_signing.py
similarity index 87%
rename from scripts/trigger_cr50_signing.py
rename to scripts/trigger_gsc_signing.py
index 11b1de1..155afb2 100644
--- a/scripts/trigger_cr50_signing.py
+++ b/scripts/trigger_gsc_signing.py
@@ -3,7 +3,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Trigger signing for cr50 images.
+"""Trigger signing for gsc images.
 
 Causes signing to occur for a given artifact.
 """
@@ -26,8 +26,9 @@
 assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
 
 
-CR50_PRODUCTION_JOB = 'chromeos/packaging/sign-image'
-CR50_STAGING_JOB = 'chromeos/staging/staging-sign-image'
+GSC_PRODUCTION_JOB = 'chromeos/packaging/sign-image'
+GSC_STAGING_JOB = 'chromeos/staging/staging-sign-image'
+_IMAGE_TYPE = 'gsc_firmware'
 
 # See ../infra/proto/src/chromiumos/common.proto.
 _channels = {k.lower().replace('channel_', ''): v
@@ -42,7 +43,7 @@
 
 # See ../infra/proto/src/chromiumos/sign_image.proto.
 _target_types = {k.lower(): v
-                 for k, v in sign_image_pb2.Cr50Instructions.Target.items()
+                 for k, v in sign_image_pb2.GscInstructions.Target.items()
                  if v}
 
 
@@ -88,10 +89,6 @@
       '--keyset', default='cr50-accessory-mp', help='The keyset to use.')
 
   parser.add_argument(
-      '--image-type', choices=_image_types, default='cr50_firmware',
-      help='The image type.')
-
-  parser.add_argument(
       '--signer-type', choices=_signer_types,
       default='production', help='The image type.')
 
@@ -136,9 +133,6 @@
   options.Freeze()
 
   passes = True
-  if options.image_type != 'cr50_firmware':
-    logging.error('Unsupported --image-type %s', options.image_type)
-    passes = False
 
   if options.target == 'node_locked':
     if not options.dev_ids:
@@ -156,16 +150,16 @@
   if not passes:
     return 1
 
-  builder = CR50_STAGING_JOB if options.staging else CR50_PRODUCTION_JOB
+  builder = GSC_STAGING_JOB if options.staging else GSC_PRODUCTION_JOB
 
   properties = {
       'archive': options.archive,
       'build_target': {'name': options.build_target},
       'channel': _channels[options.channel],
-      'cr50_instructions': {
+      'gsc_instructions': {
           'target': _target_types[options.target],
       },
-      'image_type': _image_types[options.image_type],
+      'image_type': _image_types[_IMAGE_TYPE],
       'keyset': options.keyset,
       'signer_type': _signer_types[options.signer_type],
   }
@@ -180,6 +174,6 @@
     LaunchOne(options.dry_run, builder, properties)
   else:
     for dev in options.dev_ids:
-      properties['cr50_instructions']['device_id'] = dev
+      properties['gsc_instructions']['device_id'] = dev
       LaunchOne(options.dry_run, builder, properties)
   return 0
diff --git a/scripts/trigger_cr50_signing_unittest.py b/scripts/trigger_gsc_signing_unittest.py
similarity index 83%
rename from scripts/trigger_cr50_signing_unittest.py
rename to scripts/trigger_gsc_signing_unittest.py
index 6e7f93a..6f4d9f4 100644
--- a/scripts/trigger_cr50_signing_unittest.py
+++ b/scripts/trigger_gsc_signing_unittest.py
@@ -3,7 +3,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Unittests for trigger_cr50_signing.py."""
+"""Unittests for trigger_gsc_signing.py."""
 
 from __future__ import print_function
 
@@ -12,7 +12,7 @@
 
 import mock
 
-from chromite.scripts import trigger_cr50_signing as trigger
+from chromite.scripts import trigger_gsc_signing as trigger
 from chromite.api.gen.chromiumos import common_pb2
 from chromite.api.gen.chromiumos import sign_image_pb2
 from chromite.lib import cros_logging as logging
@@ -63,13 +63,13 @@
     args = ['--archive', 'gs://test/file.bin', '--keyset', 'test-keyset']
     self.assertEqual(0, trigger.main(args))
     launch.assert_called_once_with(
-        False, trigger.CR50_PRODUCTION_JOB, {
+        False, trigger.GSC_PRODUCTION_JOB, {
             'archive': 'gs://test/file.bin',
             'build_target': {'name': 'unknown'},
             'channel': common_pb2.CHANNEL_UNSPECIFIED,
-            'cr50_instructions': {
-                'target': sign_image_pb2.Cr50Instructions.PREPVT},
-            'image_type': common_pb2.CR50_FIRMWARE,
+            'gsc_instructions': {
+                'target': sign_image_pb2.GscInstructions.PREPVT},
+            'image_type': common_pb2.GSC_FIRMWARE,
             'keyset': 'test-keyset',
             'signer_type': sign_image_pb2.SIGNER_PRODUCTION})
 
@@ -82,18 +82,18 @@
     build_target = 'board'
     target = 'prepvt'
     signer = 'production'
-    image = 'cr50_firmware'
+    image = 'gsc_firmware'
 
     args = ['--archive', archive, '--keyset', keyset, '--channel', channel,
             '--build-target', build_target, '--target', target,
-            '--signer-type', signer, '--image-type', image]
+            '--signer-type', signer]
     self.assertEqual(0, trigger.main(args))
     launch.assert_called_once_with(
-        False, trigger.CR50_PRODUCTION_JOB, {
+        False, trigger.GSC_PRODUCTION_JOB, {
             'archive': archive,
             'build_target': {'name': build_target},
             'channel': trigger._channels[channel],
-            'cr50_instructions': {'target': trigger._target_types[target]},
+            'gsc_instructions': {'target': trigger._target_types[target]},
             'image_type': trigger._image_types[image],
             'keyset': keyset,
             'signer_type': trigger._signer_types[signer]})
@@ -105,13 +105,13 @@
             '--staging']
     self.assertEqual(0, trigger.main(args))
     launch.assert_called_once_with(
-        False, trigger.CR50_STAGING_JOB, {
+        False, trigger.GSC_STAGING_JOB, {
             'archive': 'gs://test/file.bin',
             'build_target': {'name': 'unknown'},
             'channel': common_pb2.CHANNEL_UNSPECIFIED,
-            'cr50_instructions': {
-                'target': sign_image_pb2.Cr50Instructions.PREPVT},
-            'image_type': common_pb2.CR50_FIRMWARE,
+            'gsc_instructions': {
+                'target': sign_image_pb2.GscInstructions.PREPVT},
+            'image_type': common_pb2.GSC_FIRMWARE,
             'keyset': 'test-keyset',
             'signer_type': sign_image_pb2.SIGNER_PRODUCTION})
 
@@ -122,13 +122,13 @@
             '--dry-run']
     self.assertEqual(0, trigger.main(args))
     launch.assert_called_once_with(
-        True, trigger.CR50_PRODUCTION_JOB, {
+        True, trigger.GSC_PRODUCTION_JOB, {
             'archive': 'gs://test/file.bin',
             'build_target': {'name': 'unknown'},
             'channel': common_pb2.CHANNEL_UNSPECIFIED,
-            'cr50_instructions': {
-                'target': sign_image_pb2.Cr50Instructions.PREPVT},
-            'image_type': common_pb2.CR50_FIRMWARE,
+            'gsc_instructions': {
+                'target': sign_image_pb2.GscInstructions.PREPVT},
+            'image_type': common_pb2.GSC_FIRMWARE,
             'keyset': 'test-keyset',
             'signer_type': sign_image_pb2.SIGNER_PRODUCTION})
 
@@ -171,21 +171,21 @@
     expected_properties = [
         {'archive': 'gs://test/file.bin', 'build_target': {'name': 'unknown'},
          'channel': 0,
-         'cr50_instructions': {'target': trigger._target_types['node_locked'],
+         'gsc_instructions': {'target': trigger._target_types['node_locked'],
                                'device_id': '00000001-00001234'},
          'signer_type': sign_image_pb2.SIGNER_PRODUCTION,
-         'image_type': common_pb2.CR50_FIRMWARE, 'keyset': 'test-keyset'},
+         'image_type': common_pb2.GSC_FIRMWARE, 'keyset': 'test-keyset'},
         {'archive': 'gs://test/file.bin', 'build_target': {'name': 'unknown'},
          'channel': 0,
-         'cr50_instructions': {'target': trigger._target_types['node_locked'],
+         'gsc_instructions': {'target': trigger._target_types['node_locked'],
                                'device_id': '00000002-00000021'},
          'signer_type': sign_image_pb2.SIGNER_PRODUCTION,
-         'image_type': common_pb2.CR50_FIRMWARE, 'keyset': 'test-keyset'}]
+         'image_type': common_pb2.GSC_FIRMWARE, 'keyset': 'test-keyset'}]
     # Check the calls in two parts, since we need to convert the json string
     # back to a dict.
     self.assertEqual(self.rc.call_args_list, [
         mock.call(
-            ['bb', 'add', '-p', '@/dev/stdin', trigger.CR50_PRODUCTION_JOB],
+            ['bb', 'add', '-p', '@/dev/stdin', trigger.GSC_PRODUCTION_JOB],
             log_output=True, input=mock.ANY) for _ in expected_properties])
     self.assertEqual(
         expected_properties,
diff --git a/sdk/README.md b/sdk/README.md
new file mode 100644
index 0000000..865a341
--- /dev/null
+++ b/sdk/README.md
@@ -0,0 +1,5 @@
+# Chromium OS SDK
+
+Here we hold files related to the SDK.
+These will largely be symlinked into place so they're always fresh.
+Nothing should be executed directly out of here.
diff --git a/sdk/etc/bash_completion.d/cros b/sdk/etc/bash_completion.d/cros
new file mode 100644
index 0000000..63929bb
--- /dev/null
+++ b/sdk/etc/bash_completion.d/cros
@@ -0,0 +1,294 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Add programmable completion to some Chromium OS build scripts
+
+# Declare one cache for all bash complete operations to
+# allow it to be easiley cleared if need be.
+# > unset _comp_cache
+declare -A _comp_cache
+
+# Usage: cros --help | _subcmds_from_help
+# Parse subcommands from a commands's help message.
+# Trims the help outputs after it see any token with "command"
+# in it. Then, it searches for a no-space bracketed token,
+# similar to the following:
+# {subcmd1,subcmd2,subcmd3}
+_subcmds_from_help() {
+  sed -n -e '/commands:/,$p' \
+    | egrep -o '\{[[:alnum:]_,-]+\}' | sort -u \
+    | tr -d '{}' | tr ',' ' '
+  return ${PIPESTATUS[0]}
+}
+
+# Echo a list of -- flags that the current command accepts. The
+# function assumes that the command supports shflags' --help flag.
+_flags() {
+  command "$@" --help 2>&1 \
+    | egrep -o -- '--(\[no\])?[[:alnum:]=_-]+' \
+    | sed -E -e 's|--\[no\](.+)|--\1 --no\1|'
+}
+
+# Complete flags, i.e., current words starting with --. Return 1 if
+# the current word doesn't start with --, 0 otherwise.
+_complete_flag_help() {
+  COMPREPLY=()
+  local cur="${COMP_WORDS[COMP_CWORD]}"
+  if [[ "${cur}" == --* ]]; then
+    local key="flags/${COMP_WORDS[0]}"
+    if [[ -z "${_comp_cache[${key}]}" ]]; then
+      _comp_cache[${key}]="$(_flags "${COMP_WORDS[0]}")"
+    fi
+    COMPREPLY=( $(compgen -W "${_comp_cache[${key}]}" -- "${cur}") )
+    return 0
+  fi
+  return 1
+}
+
+# Look for "--arg=foo" or "--arg foo" (where foo can be an empty string) in the
+# word to be completed. If found, echo "--arg=foo".
+_argeq() {
+  local arg=$1
+  local w0="${COMP_WORDS[COMP_CWORD]}"
+  local w1="${COMP_WORDS[COMP_CWORD-1]}"
+
+  # Check for completing "--arg="
+  if [ "${w1}" == ${arg} -a "${w0}" == "=" ]; then
+    echo "${w1}${w0}"
+    return 0
+  fi
+
+  # Check for completing "--arg foo"
+  if [ "${w1}" == ${arg} ]; then
+    echo "${w1}=${w0}"
+    return 0
+  fi
+
+  # Check for completing "--arg=foo"
+  if [ ${COMP_CWORD} -gt 2 ]; then
+    local w2="${COMP_WORDS[COMP_CWORD-2]}"
+    if [ "${w2}" == ${arg} -a "${w1}" == "=" ]; then
+      echo "${w2}${w1}${w0}"
+      return 0
+    fi
+  fi
+}
+
+
+# echo the existing target board sysroots
+_board_sysroots() {
+  local builddir=/build
+  if [ -d ${builddir} ]; then
+    echo $(command ls "${builddir}")
+  fi
+}
+
+_complete_board_sysroot_flag() {
+  COMPREPLY=()
+  local arg=$(_argeq --board)
+  if [[ ${arg} == --board=* ]]; then
+    COMPREPLY=( $(compgen -W "$(_board_sysroots)" -- ${arg#--board=}) )
+    return 0
+  fi
+  return 1
+}
+
+# Completion for --board= argument for existing board sysroots
+_complete_basic() {
+  _complete_flag_help && return 0
+  _complete_board_sysroot_flag && return 0
+}
+
+# echo the existing target board overlays
+_board_overlays() {
+  local overlaydir=../overlays
+  if [ -d ${overlaydir} ]; then
+    echo $(command ls $overlaydir | grep overlay- | sed s,overlay-,,)
+  fi
+}
+
+# Completion for --board= argument for existing board overlays
+_board_overlay() {
+  _complete_flag_help && return 0
+
+  COMPREPLY=()
+  local arg=$(_argeq --board)
+  if [[ ${arg} == --board=* ]]; then
+    COMPREPLY=( $(compgen -W "$(_board_overlays)" -- ${arg#--board=}) )
+  fi
+}
+
+# Completion for -c and -s argument for autotest script
+_ls_autotest() {
+  local autotest_dir=../third_party/autotest/files
+  ls --color=never -dBFH ${autotest_dir}/$1* 2>/dev/null \
+    | sed s/"..\/third_party\/autotest\/files\/"//g
+}
+
+_autotest_complete() {
+  _complete_flag_help && return 0
+
+  local arg=$(_argeq -c)
+  if [[ ${arg} == -c=* ]]; then
+    COMPREPLY=($(compgen -W "$(_ls_autotest ${arg#-c=})"))
+    return 0
+  fi
+
+  arg=$(_argeq -s)
+  if [[ ${arg} == -s=* ]]; then
+    COMPREPLY=($(compgen -W "$(_ls_autotest ${arg#-s=})"))
+    return 0
+  fi
+
+  _complete_board_sysroot_flag && return 0
+}
+
+_test_that_complete() {
+  _complete_flag_help && return 0
+  return 0
+}
+
+# Complete cros_workon's <command> argument.
+#
+# TODO(petkov): We should probably extract the list of commands from
+# cros_workon --help, just like we do for flags (see _complete_flag_help).
+#
+# TODO(petkov): Currently, this assumes that the command is the first
+# argument. In practice, the command is the first non-flag
+# argument. I.e., this should be fixed to support something like
+# "cros_workon --all list".
+_complete_cros_workon_command() {
+  [ ${COMP_CWORD} -eq 1 ] || return 1
+  local command="${COMP_WORDS[1]}"
+
+  # TODO(hesling): Local scoped references to associative arrays
+  # seems to be broken in bash version 4.3.48, but working in version 5.
+  # We can beautify this by using the following command, when cros bash
+  # is updated.
+  # local -n cache="_comp_cache[subcmds/cros_workon]"
+
+  local key="subcmds/cros_workon"
+  if [[ -z "${_comp_cache[${key}]}" ]]; then
+    _comp_cache[${key}]="$(command cros_workon --help | _subcmds_from_help)"
+  fi
+  COMPREPLY=($(compgen -W "${_comp_cache[${key}]}" -- "${command}"))
+  return 0
+}
+
+# Prints the full path to the cros_workon executable, handling tilde
+# expansion for the current user.
+_cros_workon_executable() {
+  local cros_workon="${COMP_WORDS[0]}"
+  if [[ "$cros_workon" == '~/'* ]]; then
+    cros_workon="$HOME/${cros_workon#'~/'}"
+  fi
+  echo "$cros_workon"
+}
+
+# Lists the workon (or live, if --all is passed in) ebuilds. Lists
+# both the full names (e.g., chromeos-base/metrics) as well as just
+# the ebuild names (e.g., metrics).
+_cros_workon_list() {
+  local cros_workon=$(_cros_workon_executable)
+  ${cros_workon} $1 list | sed 's,\(.\+\)/\(.\+\),\1/\2 \2,'
+}
+
+# Completes the current cros_workon argument assuming it's a
+# package/ebuild name.
+_complete_cros_workon_package() {
+  [ ${COMP_CWORD} -gt 1 ] || return 1
+  local package="${COMP_WORDS[COMP_CWORD]}"
+  local command="${COMP_WORDS[1]}"
+  # If "start", complete based on all workon packages.
+  if [[ ${command} == "start" ]]; then
+    local key="pkgs/all"
+    if [[ -z "${_comp_cache[${key}]}" ]]; then
+      _comp_cache[${key}]="$(_cros_workon_list --all)"
+    fi
+    COMPREPLY=($(compgen -W "${_comp_cache[${key}]}" -- "${package}"))
+    return 0
+  fi
+  # If "stop" or "iterate", complete based on all live packages.
+  if [[ ${command} == "stop" ]] || [[ ${command} == "iterate" ]]; then
+    COMPREPLY=($(compgen -W "$(_cros_workon_list)" -- "$package"))
+    return 0
+  fi
+  return 1
+}
+
+# Complete cros_workon arguments.
+_cros_workon() {
+  COMPREPLY=()
+  _complete_flag_help && return 0
+  _complete_board_sysroot_flag && return 0
+  _complete_cros_workon_command && return 0
+  _complete_cros_workon_package && return 0
+  return 0
+}
+
+_complete_cros_command() {
+  local command="${COMP_WORDS[COMP_CWORD]}"
+  if [ ${COMP_CWORD} -ne 1 ]; then
+    return 1
+  fi
+
+  local key="subcmds/cros"
+  if [[ -z "${_comp_cache[${key}]}" ]]; then
+    _comp_cache[${key}]="$(command cros --help | _subcmds_from_help)"
+  fi
+  COMPREPLY=($(compgen -W "${_comp_cache[${key}]}" -- "${command}"))
+  return 0
+}
+
+# Complete cros arguments.
+_cros() {
+  COMPREPLY=()
+  _complete_flag_help && return 0
+  _complete_board_sysroot_flag && return 0
+  _complete_cros_command && return 0
+  # TODO(hesling): Add package completion like cros_workon.
+  return 0
+}
+
+# Complete equery's <module-name> argument.
+_complete_equery_module_name() {
+  [ ${COMP_CWORD} -eq 1 ] || return 1
+  local command="${COMP_WORDS[1]}"
+  COMPREPLY=($(compgen -W "belongs changes check depends depgraph files has \
+                           hasuse keywords list meta size uses which" \
+                           -- "$command"))
+  return 0
+}
+
+# Complete equery arguments.
+_complete_equery() {
+  COMPREPLY=()
+  _complete_equery_module_name && return 0
+  return 0
+}
+
+complete -o bashdefault -o default -F _complete_basic \
+  build_autotest.sh \
+  build_image \
+  build_packages \
+  mod_image_for_test.sh \
+  cros_portage_upgrade
+
+complete -o bashdefault -o default -F _board_overlay setup_board
+complete -o bashdefault -o default -o nospace -F _autotest_complete autotest
+complete -o bashdefault -o default -o nospace -F _test_that_complete test_that
+complete -o bashdefault -o default -F _cros cros
+complete -F _cros_workon cros_workon
+complete -o bashdefault -o default -F _complete_equery equery
+
+# Use equery completion for equery-$board for known boards
+_boardlist=$(cros_list_overlays | egrep "^.*/overlays/overlay-.*$" |
+             sed -n "s/.*overlay-//p")
+for board in $_boardlist; do
+  complete -o bashdefault -o default -F _complete_equery equery-$board
+done
+
+###  Local Variables:
+###  mode: shell-script
+###  End:
diff --git a/sdk/etc/bash_completion.d/repo b/sdk/etc/bash_completion.d/repo
new file mode 100644
index 0000000..f9bf898
--- /dev/null
+++ b/sdk/etc/bash_completion.d/repo
@@ -0,0 +1,105 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Programmable completion for some Chromium OS build scripts.
+
+_list_repo_commands() {
+  local repo=${COMP_WORDS[0]}
+  "${repo}" help --all | grep -E '^  ' | sed 's/  \([^ ]\+\) .\+/\1/'
+}
+
+_list_repo_branches() {
+  local repo=${COMP_WORDS[0]}
+  "${repo}" branches 2>&1 | grep \| | sed 's/[ *][Pp ] *\([^ ]\+\) .*/\1/'
+}
+
+_list_repo_projects() {
+  local repo=${COMP_WORDS[0]}
+  "${repo}" list -n
+}
+
+# Complete the repo <command> argument.
+_complete_repo_command() {
+  [ ${COMP_CWORD} -eq 1 ] || return 1
+  local command=${COMP_WORDS[1]}
+  COMPREPLY=($(compgen -W "$(_list_repo_commands)" -- "${command}"))
+  return 0
+}
+
+_complete_repo_arg() {
+  [ ${COMP_CWORD} -gt 1 ] || return 1
+  local command=${COMP_WORDS[1]}
+  local current=${COMP_WORDS[COMP_CWORD]}
+  if [[ ${command} == "abandon" ]]; then
+    if [[ ${COMP_CWORD} -eq 2 ]]; then
+      COMPREPLY=($(compgen -W "$(_list_repo_branches)" -- "${current}"))
+    else
+      COMPREPLY=($(compgen -W "$(_list_repo_projects)" -- "${current}"))
+    fi
+    return 0
+  fi
+  if [[ ${command} == "help" ]]; then
+    [ ${COMP_CWORD} -eq 2 ] && \
+      COMPREPLY=($(compgen -W "$(_list_repo_commands)" -- "${current}"))
+    return 0
+  fi
+  if [[ ${command} == "start" ]]; then
+    [ ${COMP_CWORD} -gt 2 ] && \
+      COMPREPLY=($(compgen -W "$(_list_repo_projects)" -- "${current}"))
+    return 0
+  fi
+  return 1
+}
+
+# Complete the repo arguments.
+_complete_repo() {
+  COMPREPLY=()
+  _complete_repo_command && return 0
+  _complete_repo_arg && return 0
+  return 0
+}
+
+complete -F _complete_repo repo
+
+if [[ -f /usr/share/git/git-prompt.sh ]]; then
+  # Path in the cros_sdk chroot
+  source /usr/share/git/git-prompt.sh
+elif [[ -f /usr/share/bash-completion/completions/git ]]; then
+  # Path on Ubuntu 19.10
+  source /usr/share/bash-completion/completions/git
+fi
+
+# Add a way to get the "m" branch from repo easily; used by __git_branch_ps1()
+#
+# Repo seems to maintain a phony 'm/' remote and it always seems to be the name
+# of the manifest branch.  This will retrieve it.
+__git_m_branch() {
+  local git_dir=$(git rev-parse --git-dir 2> /dev/null)
+  if [ -n "${git_dir}" ]; then
+    echo $(cd ${git_dir}/refs/remotes/m 2> /dev/null && ls)
+  fi
+}
+
+# A "subclass" of __git_ps1 that adds the manifest branch name into the prompt.
+# ...if you're on manifest branch "0.11.257.B" and local branch "lo" and
+# pass " (%s)", we'll output " (0.11.257.B/lo)".  Note that we'll never show
+# the manifest branch 'master', since it's so common.
+__git_branch_ps1() {
+  local format_str="${1:- (%s)}"
+  local m_branch=$(__git_m_branch)
+  # Do not print the branch name if it includes 'master'.
+  if [[ "${m_branch}" != *master* && -n "${m_branch}" ]]; then
+    format_str=$(printf "${format_str}" "${m_branch}/%s")
+  fi
+  # for subshells, prefix the prompt with the shell nesting level
+  local lshlvl=""
+  [ ! -z "${SHLVL##*[!0-9]*}" ] && [ ${SHLVL} -gt 1 ] && lshlvl="${SHLVL} "
+  __git_ps1 "${lshlvl}${format_str}"
+}
+
+# Prompt functions should not error when in subshells
+export -f __gitdir
+export -f __git_ps1
+export -f __git_m_branch
+export -f __git_branch_ps1
diff --git a/service/artifacts.py b/service/artifacts.py
index 184f727..1edc44d 100644
--- a/service/artifacts.py
+++ b/service/artifacts.py
@@ -13,6 +13,7 @@
 import collections
 import fnmatch
 import glob
+import multiprocessing
 import os
 import shutil
 import tempfile
@@ -21,7 +22,9 @@
 from six.moves import urllib
 
 from chromite.lib import autotest_util
+from chromite.lib import build_target_lib
 from chromite.lib import cache
+from chromite.lib import chroot_lib
 from chromite.lib import constants
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_logging as logging
@@ -721,7 +724,7 @@
 
 
 def GatherSymbolFiles(tempdir:str, destdir:str,
-                    paths: List[str]) -> List[SymbolFileTuple]:
+                      paths: List[str]) -> List[SymbolFileTuple]:
   """Locate symbol files in |paths|
 
   This generator function searches all paths for .sym files and copies them to
@@ -729,13 +732,18 @@
   examined. A path to a directory will result in the directory being searched
   for .sym files. The generator yields SymbolFileTuple objects that contain
   symbol file references which are valid after this exits. Those files may exist
-  externally, or be created in the tempdir (when expanding tarballs).
+  externally, or be created in the tempdir (when expanding tarballs). Typical
+  usage in the BuildAPI will be for the .sym files to exist under a directory
+  such as /build/<board>/usr/lib/debug/breakpad so that the path to a sym file
+  will always be unique.
   Note: the caller must clean up the tempdir.
   Note: this function is recursive for tar files.
 
   Args:
     tempdir: Path to use for temporary files.
-    destdir: All .sym files are copied to this path.
+    destdir: All .sym files are copied to this path. Tarfiles are opened inside
+      a tempdir and any .sym files within them are copied to destdir from within
+      that temp path.
     paths: A list of input paths to walk. Files are returned based on .sym name
       w/out any checking internal symbol file format.
       Dirs are searched for files that end in ".sym". Urls are not handled.
@@ -760,11 +768,6 @@
             filename = os.path.join(root, f)
             relative_path = filename[len(p):].lstrip('/')
             try:
-              # TODO(crbug.com/1031380): Put calls to shutil.copy in a function
-              # that handles collisions in destdir due to different paths
-              # to the same filename (foo/a/a.sym from path foo, bar/a/a.sym
-              # from path bar) since the last shutil.copy will overwrite
-              # previous one.
               shutil.copy(filename, os.path.join(destdir, relative_path))
             except IOError:
               # Handles pre-3.3 Python where we may need to make the target
@@ -805,3 +808,44 @@
         shutil.copy(p, destdir)
         yield SymbolFileTuple(relative_path=os.path.basename(p),
                               source_file_name=p)
+
+
+def GenerateBreakpadSymbols(chroot: chroot_lib.Chroot,
+                            build_target: build_target_lib.BuildTarget,
+                            debug: bool) -> cros_build_lib.CommandResult:
+  """Generate breakpad (go/breakpad) symbols for debugging.
+
+  This function generates .sym files to /build/<board>/usr/lib/debug/breakpad
+  from .debug files found in /build/<board>/usr/lib/debug by calling
+  cros_generate_breakpad_symbols.
+
+  Args:
+    chroot (chroot_lib.Chroot): The chroot in which the sysroot should be built.
+    build_target: The sysroot's build target.
+    debug: Include extra debugging output.
+  """
+  # The firmware directory contains elf symbols that we have trouble parsing
+  # and that don't help with breakpad debugging (see https://crbug.com/213670).
+  exclude_dirs = ['firmware']
+
+  cmd = [
+      'cros_generate_breakpad_symbols'
+  ]
+  if debug:
+    cmd += ['--debug']
+
+  # Execute for board in parallel with half # of cpus available to avoid
+  # starving other parallel processes on the same machine.
+  cmd += [
+      '--board=%s' % build_target.name,
+      '--jobs', max(1, multiprocessing.cpu_count() // 2)
+  ]
+  cmd += ['--exclude-dir=%s' % x for x in exclude_dirs]
+
+  logging.info('Generating breakpad symbols: %s.', cmd)
+  result = cros_build_lib.run(
+      cmd,
+      capture_output=True,
+      enter_chroot=True,
+      chroot_args=chroot.get_enter_args())
+  return result
diff --git a/service/artifacts_unittest.py b/service/artifacts_unittest.py
index 69dbadb..820bf64 100644
--- a/service/artifacts_unittest.py
+++ b/service/artifacts_unittest.py
@@ -694,7 +694,7 @@
     self.assertEqual(os.readlink(disk_raw), self.image_file)
 
 
-class TestGatherSymbolFiles(cros_test_lib.MockTempDirTestCase):
+class GatherSymbolFilesTest(cros_test_lib.MockTempDirTestCase):
   """Base class for testing GatherSymbolFiles."""
 
   SLIM_CONTENT = """
@@ -876,6 +876,9 @@
     symbol_file_relative_paths.sort()
     self.assertEqual(symbol_file_relative_paths,
                      ['dir1/fileU.sym', 'fileD.sym'])
+    for symfile in symbol_file_relative_paths:
+      extension = symfile.split('.')[1]
+      self.assertEqual(extension, 'sym')
 
   def test_GatherSymbolFileFullFilePaths(self):
     """Test full filepaths (.sym and .txt) only gather .sym files."""
@@ -911,6 +914,17 @@
     files_in_output_dir = self.getFilesWithRelativeDir(output_dir)
     self.assertEqual(files_in_output_dir, ['a_file.sym'])
 
+  def test_IsTarball(self):
+    """Test IsTarball helper function."""
+    self.assertTrue(artifacts.IsTarball('file.tar'))
+    self.assertTrue(artifacts.IsTarball('file.tar.bz2'))
+    self.assertTrue(artifacts.IsTarball('file.tar.gz'))
+    self.assertTrue(artifacts.IsTarball('file.tbz'))
+    self.assertTrue(artifacts.IsTarball('file.txz'))
+    self.assertFalse(artifacts.IsTarball('file.txt'))
+    self.assertFalse(artifacts.IsTarball('file.tart'))
+    self.assertFalse(artifacts.IsTarball('file.bz2'))
+
   def getFilesWithRelativeDir(self, dest_dir):
     """Find all files below dest_dir using dir relative to dest_dir."""
     relative_files = []
@@ -920,3 +934,46 @@
         relpath = os.path.relpath(fullpath, dest_dir)
         relative_files.append(relpath)
     return relative_files
+
+
+class GenerateBreakpadSymbolsTest(cros_test_lib.MockTempDirTestCase):
+  """Base class for testing GenerateBreakpadSymbols."""
+
+  def setUp(self):
+    self.chroot_dir = os.path.join(self.tempdir, 'chroot_dir')
+    osutils.SafeMakedirs(self.chroot_dir)
+
+  def test_generateBreakpadSymbols(self):
+    """Verify that calling the service layer invokes the script as expected."""
+    chroot = chroot_lib.Chroot(self.chroot_dir)
+    build_target = build_target_lib.BuildTarget('board')
+    self.PatchObject(cros_build_lib, 'run')
+
+    # Call the method being tested.
+    artifacts.GenerateBreakpadSymbols(chroot, build_target, False)
+
+    cros_build_lib.run.assert_called_with(['cros_generate_breakpad_symbols',
+                                           '--board=board',
+                                           '--jobs', mock.ANY,
+                                           '--exclude-dir=firmware'],
+                                          capture_output=True,
+                                          enter_chroot=True,
+                                          chroot_args=['--chroot', mock.ANY])
+
+  def test_generateBreakpadSymbolsWithDebug(self):
+    """Verify that calling with debug invokes the script as expected."""
+    chroot = chroot_lib.Chroot(self.chroot_dir)
+    build_target = build_target_lib.BuildTarget('board')
+    self.PatchObject(cros_build_lib, 'run')
+
+    # Call the method being tested.
+    artifacts.GenerateBreakpadSymbols(chroot, build_target, True)
+
+    cros_build_lib.run.assert_called_with(['cros_generate_breakpad_symbols',
+                                           '--debug',
+                                           '--board=board',
+                                           '--jobs', mock.ANY,
+                                           '--exclude-dir=firmware'],
+                                          capture_output=True,
+                                          enter_chroot=True,
+                                          chroot_args=['--chroot', mock.ANY])
diff --git a/service/image.py b/service/image.py
index 02f96bf..2ad44c9 100644
--- a/service/image.py
+++ b/service/image.py
@@ -197,14 +197,17 @@
     str: Path to the created guest VM folder.
   """
   assert board
+
   cmd = [os.path.join(constants.TERMINA_TOOLS_DIR, 'termina_build_image.py')]
 
+  image_dir = image_lib.GetLatestImageLink(board, force_chroot=True)
+
   image_file = constants.TEST_IMAGE_BIN if is_test else constants.BASE_IMAGE_BIN
-  image_path = os.path.join(image_lib.GetLatestImageLink(board), image_file)
+  image_path = os.path.join(image_dir, image_file)
 
   output_dir = (constants.TEST_GUEST_VM_DIR if is_test
                 else constants.BASE_GUEST_VM_DIR)
-  output_path = os.path.join(image_lib.GetLatestImageLink(board), output_dir)
+  output_path = os.path.join(image_dir, output_dir)
 
   cmd.append(image_path)
   cmd.append(output_path)
diff --git a/service/packages.py b/service/packages.py
index 5cb37c3..4a152b9 100644
--- a/service/packages.py
+++ b/service/packages.py
@@ -8,14 +8,14 @@
 from __future__ import print_function
 
 import collections
+from distutils.version import LooseVersion
 import fileinput
 import functools
 import json
 import os
 import re
 import sys
-
-import six
+from typing import List
 
 from google.protobuf import json_format
 
@@ -296,25 +296,20 @@
     UprevVersionedPackageResult: The result of updating drivefs ebuilds.
   """
 
-  DRIVEFS_REFS = 'refs/tags/drivefs_'
-  DRIVEFS_PATH = 'src/private-overlays/chromeos-overlay/chromeos-base'
+  DRIVEFS_PATH_PREFIX = 'src/private-overlays/chromeos-overlay/chromeos-base'
 
-  # parse like the example PUpr (go/pupr#steps)
-  valid_refs = [ref.ref for ref in refs if ref.ref.startswith(DRIVEFS_REFS)]
-  if not valid_refs:
-    # False alarm, there is no new package release. So do nothing.
+  drivefs_version = get_latest_drivefs_version_from_refs(refs)
+  if not drivefs_version:
+    # No valid DriveFS version is identified.
     return None
 
-  # Take the newest release, always.
-  target_version = sorted(valid_refs,
-                          reverse=True)[0][len(DRIVEFS_REFS):]
+  logging.debug('DriveFS version determined from refs: %s', drivefs_version)
 
   result = uprev_lib.UprevVersionedPackageResult()
 
-  pkg_path = os.path.join(DRIVEFS_PATH, 'drivefs')
-
+  pkg_path = os.path.join(DRIVEFS_PATH_PREFIX, 'drivefs')
   uprev_result = uprev_lib.uprev_workon_ebuild_to_version(pkg_path,
-                                                          target_version,
+                                                          drivefs_version,
                                                           chroot)
   all_changed_files = []
 
@@ -323,10 +318,10 @@
 
   all_changed_files.extend(uprev_result.changed_files)
 
-  pkg_path = os.path.join(DRIVEFS_PATH, 'drivefs-ipc')
+  pkg_path = os.path.join(DRIVEFS_PATH_PREFIX, 'drivefs-ipc')
 
   uprev_result = uprev_lib.uprev_workon_ebuild_to_version(pkg_path,
-                                                          target_version,
+                                                          drivefs_version,
                                                           chroot)
 
   if not uprev_result:
@@ -334,7 +329,7 @@
 
   all_changed_files.extend(uprev_result.changed_files)
 
-  result.add_result(target_version, all_changed_files)
+  result.add_result(drivefs_version, all_changed_files)
 
   return result
 
@@ -501,6 +496,36 @@
   return result.add_result(chrome_version, uprev_manager.modified_ebuilds)
 
 
+def get_latest_drivefs_version_from_refs(refs: List[uprev_lib.GitRef]) -> str:
+  """Get the latest DriveFS version from refs
+
+  DriveFS versions follow the tag format of refs/tags/drivefs_1.2.3.
+  Versions are compared using |distutils.version.LooseVersion| and
+  the latest version is returned.
+
+  Args:
+    refs: The tags to parse for the latest DriveFS version.
+
+  Returns:
+    The latest DriveFS version to use.
+  """
+  DRIVEFS_REFS_PREFIX = 'refs/tags/drivefs_'
+
+  valid_refs = []
+  for gitiles in refs:
+    if gitiles.ref.startswith(DRIVEFS_REFS_PREFIX):
+      valid_refs.append(gitiles.ref)
+
+  if not valid_refs:
+    return None
+
+  # Sort by version and take the latest version.
+  target_version_ref = sorted(valid_refs,
+                              key=LooseVersion,
+                              reverse=True)[0]
+  return target_version_ref.replace(DRIVEFS_REFS_PREFIX, '')
+
+
 def _generate_platform_c_files(replication_config, chroot):
   """Generates platform C files from a platform JSON payload.
 
@@ -676,7 +701,7 @@
   extra_env = None
   if useflags:
     new_flags = useflags
-    if not isinstance(useflags, six.string_types):
+    if not isinstance(useflags, str):
       new_flags = ' '.join(useflags)
 
     existing = os.environ.get('USE', '')
diff --git a/service/packages_unittest.py b/service/packages_unittest.py
index 9bcae74..ad9183e 100644
--- a/service/packages_unittest.py
+++ b/service/packages_unittest.py
@@ -1054,3 +1054,31 @@
                      return_value=['key1', 'key2'])
     result = packages.get_key_id(self.build_target, 'model')
     self.assertEqual(result, None)
+
+
+class GetLatestDrivefsVersionTest(cros_test_lib.TestCase):
+  """Tests for get_latest_drivefs_version_from_refs."""
+
+  def setUp(self):
+    # The tag ref template.
+    ref_tpl = 'refs/tags/drivefs_%s'
+
+    self.latest = '44.0.20'
+    self.versions = ['42.0.1', self.latest, '44.0.19', '39.0.15']
+    self.latest_ref = uprev_lib.GitRef('/path', ref_tpl % self.latest, 'abc123')
+    self.refs = [uprev_lib.GitRef('/path', ref_tpl % v, 'abc123')
+                 for v in self.versions]
+
+  def test_single_ref(self):
+    """Test a single ref is supplied."""
+    self.assertEqual(self.latest,
+        packages.get_latest_drivefs_version_from_refs([self.latest_ref]))
+
+  def test_multiple_ref_versions(self):
+    """Test multiple refs supplied."""
+    self.assertEqual(self.latest,
+        packages.get_latest_drivefs_version_from_refs(self.refs))
+
+  def test_no_refs_returns_none(self):
+    """Test no refs supplied."""
+    self.assertEqual(packages.get_latest_drivefs_version_from_refs([]), None)
diff --git a/service/payload_unittest.py b/service/payload_unittest.py
index a794818..9081801 100644
--- a/service/payload_unittest.py
+++ b/service/payload_unittest.py
@@ -85,12 +85,12 @@
 
     payload_config.GeneratePayload()
 
-
-class PayloadUtilitiesTest(cros_test_lib.TestCase):
-  """Test utilities related to payloads."""
-
-  def testImageType(self):
-    """Test _ImageTypeToStr works."""
-    # pylint: disable=protected-access
-    self.assertEqual('image_type_base', payload._ImageTypeToStr(1))
-    # pylint: enable=protected-access
+# TODO(crbug/1155212): Fix aliased enum value.
+# class PayloadUtilitiesTest(cros_test_lib.TestCase):
+#   """Test utilities related to payloads."""
+#
+#   def testImageType(self):
+#     """Test _ImageTypeToStr works."""
+#     # pylint: disable=protected-access
+#     self.assertEqual('image_type_base', payload._ImageTypeToStr(1))
+#     # pylint: enable=protected-access
diff --git a/signing/signer_instructions/board2.cr50_firmware.instructions b/signing/signer_instructions/board2.gsc_firmware.instructions
similarity index 100%
rename from signing/signer_instructions/board2.cr50_firmware.instructions
rename to signing/signer_instructions/board2.gsc_firmware.instructions
diff --git a/test/portage_fixtures.py b/test/portage_fixtures.py
index f6a45cb..a329c7d 100644
--- a/test/portage_fixtures.py
+++ b/test/portage_fixtures.py
@@ -43,3 +43,13 @@
       yield overlays[i]
 
   return make_overlay_stack
+
+
+# pylint: disable=redefined-outer-name
+@pytest.fixture
+def simple_sysroot(overlay_stack, tmp_path):
+  """Create the simplest possible sysroot."""
+  # pylint: disable=redefined-outer-name
+  overlay, = overlay_stack(1)
+  profile = overlay.create_profile()
+  return cr.test.Sysroot(tmp_path, profile, [overlay])
diff --git a/test/portage_testables.py b/test/portage_testables.py
index 7bd1789..998f66d 100644
--- a/test/portage_testables.py
+++ b/test/portage_testables.py
@@ -11,7 +11,6 @@
 import itertools
 import os
 import pathlib  # pylint: disable=import-error
-import shlex
 from typing import Dict, Iterable, Tuple, Union
 
 from chromite.lib import constants
@@ -38,7 +37,7 @@
   """Helper to format a dictionary into an ebuild file."""
   output = []
   for key in dictionary.keys():
-    output.append(f'{key}={shlex.quote(dictionary[key])}')
+    output.append(f'{key}="{dictionary[key]}"')
 
   output.append('\n')
   return '\n'.join(output)
@@ -300,10 +299,18 @@
 
   @property
   def cpv(self) -> package_info.CPV:
-    """Returns a CPV object constructed from this package's metadata."""
+    """Returns a CPV object constructed from this package's metadata.
+
+    Deprecated, use package_info instead.
+    """
     return package_info.SplitCPV(self.category + '/' + self.package + '-' +
                                  self.version)
 
+  @property
+  def package_info(self) -> package_info.PackageInfo:
+    """Returns a PackageInfo object constructed from this package's metadata."""
+    return package_info.parse(f'{self.category}/{self.package}-{self.version}')
+
   def format_eclass_line(self) -> str:
     """Returns a string containing this package's eclass inheritance line."""
     if self.inherit and isinstance(self.inherit, str):