chromite: update protos and generate for build api

We've fallen behind on these changes, this commit
updates them.

BUG=None
TEST=./run_tests

Change-Id: Ifb5d42e45b7ef26a78822791e17dce298f3671c1
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1910372
Reviewed-by: David Burger <dburger@chromium.org>
Tested-by: George Engelbrecht <engeg@google.com>
Commit-Queue: George Engelbrecht <engeg@google.com>
diff --git a/api/gen/chromite/api/artifacts_pb2.py b/api/gen/chromite/api/artifacts_pb2.py
index 9fff168..ad4691d 100644
--- a/api/gen/chromite/api/artifacts_pb2.py
+++ b/api/gen/chromite/api/artifacts_pb2.py
@@ -14,7 +14,6 @@
 
 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.chromite.api import toolchain_pb2 as chromite_dot_api_dot_toolchain__pb2
 from chromite.api.gen.chromiumos import common_pb2 as chromiumos_dot_common__pb2
 
 
@@ -23,9 +22,9 @@
   package='chromite.api',
   syntax='proto3',
   serialized_options=_b('Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api'),
-  serialized_pb=_b('\n\x1c\x63hromite/api/artifacts.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x1a\x63hromite/api/sysroot.proto\x1a\x1c\x63hromite/api/toolchain.proto\x1a\x17\x63hromiumos/common.proto\"\x18\n\x08\x41rtifact\x12\x0c\n\x04path\x18\x01 \x01(\t\"\x9e\x01\n\rBundleRequest\x12-\n\x0c\x62uild_target\x18\x01 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x12\n\noutput_dir\x18\x02 \x01(\t\x12\"\n\x06\x63hroot\x18\x03 \x01(\x0b\x32\x12.chromiumos.Chroot\x12&\n\x07sysroot\x18\x04 \x01(\x0b\x32\x15.chromite.api.Sysroot\";\n\x0e\x42undleResponse\x12)\n\tartifacts\x18\x01 \x03(\x0b\x32\x16.chromite.api.Artifact\"\x90\x01\n\x14\x42undleVmFilesRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12&\n\x07sysroot\x18\x02 \x01(\x0b\x32\x15.chromite.api.Sysroot\x12\x18\n\x10test_results_dir\x18\x03 \x01(\t\x12\x12\n\noutput_dir\x18\x04 \x01(\t\"\xb7\x01\n\x17\x42undleChromeAFDORequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x12\n\noutput_dir\x18\x03 \x01(\t\x12\x35\n\rartifact_type\x18\x04 \x01(\x0e\x32\x1e.chromite.api.AFDOArtifactType\"h\n\x1aPinnedGuestImageUriRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12&\n\x07sysroot\x18\x02 \x01(\x0b\x32\x15.chromite.api.Sysroot\"\xa3\x01\n\x1bPinnedGuestImageUriResponse\x12Q\n\rpinned_images\x18\x01 \x03(\x0b\x32:.chromite.api.PinnedGuestImageUriResponse.PinnedGuestImage\x1a\x31\n\x10PinnedGuestImage\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x0b\n\x03uri\x18\x02 \x01(\t2\xd3\t\n\x10\x41rtifactsService\x12P\n\x13\x42undleAutotestFiles\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12Q\n\x14\x42undleChromeOSConfig\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12M\n\x10\x42undleEbuildLogs\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12K\n\x0e\x42undleFirmware\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12P\n\x13\x42undleImageArchives\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12K\n\x0e\x42undleImageZip\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12\x64\n\x1d\x42undleAFDOGenerationArtifacts\x12%.chromite.api.BundleChromeAFDORequest\x1a\x1c.chromite.api.BundleResponse\x12T\n\x17\x42undlePinnedGuestImages\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12X\n\x1b\x42undleSimpleChromeArtifacts\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12L\n\x0f\x42undleTastFiles\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12U\n\x18\x42undleTestUpdatePayloads\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12Q\n\rBundleVmFiles\x12\".chromite.api.BundleVmFilesRequest\x1a\x1c.chromite.api.BundleResponse\x12L\n\x0f\x45xportCpeReport\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12p\n\x19\x46\x65tchPinnedGuestImageUris\x12(.chromite.api.PinnedGuestImageUriRequest\x1a).chromite.api.PinnedGuestImageUriResponse\x1a\x11\xc2\xed\x1a\r\n\tartifacts\x10\x02\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
+  serialized_pb=_b('\n\x1c\x63hromite/api/artifacts.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x1a\x63hromite/api/sysroot.proto\x1a\x17\x63hromiumos/common.proto\"\x18\n\x08\x41rtifact\x12\x0c\n\x04path\x18\x01 \x01(\t\"\x9e\x01\n\rBundleRequest\x12-\n\x0c\x62uild_target\x18\x01 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x12\n\noutput_dir\x18\x02 \x01(\t\x12\"\n\x06\x63hroot\x18\x03 \x01(\x0b\x32\x12.chromiumos.Chroot\x12&\n\x07sysroot\x18\x04 \x01(\x0b\x32\x15.chromite.api.Sysroot\";\n\x0e\x42undleResponse\x12)\n\tartifacts\x18\x01 \x03(\x0b\x32\x16.chromite.api.Artifact\"\x90\x01\n\x14\x42undleVmFilesRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12&\n\x07sysroot\x18\x02 \x01(\x0b\x32\x15.chromite.api.Sysroot\x12\x18\n\x10test_results_dir\x18\x03 \x01(\t\x12\x12\n\noutput_dir\x18\x04 \x01(\t\"\xb5\x01\n\x17\x42undleChromeAFDORequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x12\n\noutput_dir\x18\x03 \x01(\t\x12\x33\n\rartifact_type\x18\x04 \x01(\x0e\x32\x1c.chromiumos.AFDOArtifactType\"h\n\x1aPinnedGuestImageUriRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12&\n\x07sysroot\x18\x02 \x01(\x0b\x32\x15.chromite.api.Sysroot\"\xa3\x01\n\x1bPinnedGuestImageUriResponse\x12Q\n\rpinned_images\x18\x01 \x03(\x0b\x32:.chromite.api.PinnedGuestImageUriResponse.PinnedGuestImage\x1a\x31\n\x10PinnedGuestImage\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x0b\n\x03uri\x18\x02 \x01(\t2\xd3\t\n\x10\x41rtifactsService\x12P\n\x13\x42undleAutotestFiles\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12Q\n\x14\x42undleChromeOSConfig\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12M\n\x10\x42undleEbuildLogs\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12K\n\x0e\x42undleFirmware\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12P\n\x13\x42undleImageArchives\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12K\n\x0e\x42undleImageZip\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12\x64\n\x1d\x42undleAFDOGenerationArtifacts\x12%.chromite.api.BundleChromeAFDORequest\x1a\x1c.chromite.api.BundleResponse\x12T\n\x17\x42undlePinnedGuestImages\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12X\n\x1b\x42undleSimpleChromeArtifacts\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12L\n\x0f\x42undleTastFiles\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12U\n\x18\x42undleTestUpdatePayloads\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12Q\n\rBundleVmFiles\x12\".chromite.api.BundleVmFilesRequest\x1a\x1c.chromite.api.BundleResponse\x12L\n\x0f\x45xportCpeReport\x12\x1b.chromite.api.BundleRequest\x1a\x1c.chromite.api.BundleResponse\x12p\n\x19\x46\x65tchPinnedGuestImageUris\x12(.chromite.api.PinnedGuestImageUriRequest\x1a).chromite.api.PinnedGuestImageUriResponse\x1a\x11\xc2\xed\x1a\r\n\tartifacts\x10\x02\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
   ,
-  dependencies=[chromite_dot_api_dot_build__api__pb2.DESCRIPTOR,chromite_dot_api_dot_sysroot__pb2.DESCRIPTOR,chromite_dot_api_dot_toolchain__pb2.DESCRIPTOR,chromiumos_dot_common__pb2.DESCRIPTOR,])
+  dependencies=[chromite_dot_api_dot_build__api__pb2.DESCRIPTOR,chromite_dot_api_dot_sysroot__pb2.DESCRIPTOR,chromiumos_dot_common__pb2.DESCRIPTOR,])
 
 
 
@@ -56,8 +55,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=159,
-  serialized_end=183,
+  serialized_start=129,
+  serialized_end=153,
 )
 
 
@@ -108,8 +107,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=186,
-  serialized_end=344,
+  serialized_start=156,
+  serialized_end=314,
 )
 
 
@@ -139,8 +138,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=346,
-  serialized_end=405,
+  serialized_start=316,
+  serialized_end=375,
 )
 
 
@@ -191,8 +190,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=408,
-  serialized_end=552,
+  serialized_start=378,
+  serialized_end=522,
 )
 
 
@@ -243,8 +242,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=555,
-  serialized_end=738,
+  serialized_start=525,
+  serialized_end=706,
 )
 
 
@@ -281,8 +280,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=740,
-  serialized_end=844,
+  serialized_start=708,
+  serialized_end=812,
 )
 
 
@@ -319,8 +318,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=961,
-  serialized_end=1010,
+  serialized_start=929,
+  serialized_end=978,
 )
 
 _PINNEDGUESTIMAGEURIRESPONSE = _descriptor.Descriptor(
@@ -349,8 +348,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=847,
-  serialized_end=1010,
+  serialized_start=815,
+  serialized_end=978,
 )
 
 _BUNDLEREQUEST.fields_by_name['build_target'].message_type = chromiumos_dot_common__pb2._BUILDTARGET
@@ -361,7 +360,7 @@
 _BUNDLEVMFILESREQUEST.fields_by_name['sysroot'].message_type = chromite_dot_api_dot_sysroot__pb2._SYSROOT
 _BUNDLECHROMEAFDOREQUEST.fields_by_name['chroot'].message_type = chromiumos_dot_common__pb2._CHROOT
 _BUNDLECHROMEAFDOREQUEST.fields_by_name['build_target'].message_type = chromiumos_dot_common__pb2._BUILDTARGET
-_BUNDLECHROMEAFDOREQUEST.fields_by_name['artifact_type'].enum_type = chromite_dot_api_dot_toolchain__pb2._AFDOARTIFACTTYPE
+_BUNDLECHROMEAFDOREQUEST.fields_by_name['artifact_type'].enum_type = chromiumos_dot_common__pb2._AFDOARTIFACTTYPE
 _PINNEDGUESTIMAGEURIREQUEST.fields_by_name['chroot'].message_type = chromiumos_dot_common__pb2._CHROOT
 _PINNEDGUESTIMAGEURIREQUEST.fields_by_name['sysroot'].message_type = chromite_dot_api_dot_sysroot__pb2._SYSROOT
 _PINNEDGUESTIMAGEURIRESPONSE_PINNEDGUESTIMAGE.containing_type = _PINNEDGUESTIMAGEURIRESPONSE
@@ -441,8 +440,8 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=_b('\302\355\032\r\n\tartifacts\020\002'),
-  serialized_start=1013,
-  serialized_end=2248,
+  serialized_start=981,
+  serialized_end=2216,
   methods=[
   _descriptor.MethodDescriptor(
     name='BundleAutotestFiles',
diff --git a/api/gen/chromite/api/packages_pb2.py b/api/gen/chromite/api/packages_pb2.py
index dbcc1ec..6273a5e 100644
--- a/api/gen/chromite/api/packages_pb2.py
+++ b/api/gen/chromite/api/packages_pb2.py
@@ -22,7 +22,7 @@
   package='chromite.api',
   syntax='proto3',
   serialized_options=_b('Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api'),
-  serialized_pb=_b('\n\x1b\x63hromite/api/packages.proto\x12\x0c\x63hromite.api\x1a\x1a\x63hromite/api/binhost.proto\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\"\x93\x01\n\x13\x42uildsChromeRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12)\n\x08packages\x18\x03 \x03(\x0b\x32\x17.chromiumos.PackageInfo\"-\n\x14\x42uildsChromeResponse\x12\x15\n\rbuilds_chrome\x18\x01 \x01(\x08\"x\n\x15GetBestVisibleRequest\x12\x0c\n\x04\x61tom\x18\x01 \x01(\t\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x03 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"G\n\x16GetBestVisibleResponse\x12-\n\x0cpackage_info\x18\x01 \x01(\x0b\x32\x17.chromiumos.PackageInfo\"l\n\x17GetChromeVersionRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"+\n\x18GetChromeVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\"m\n\x18GetTargetVersionsRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"\xd7\x01\n\x19GetTargetVersionsResponse\x12\x17\n\x0f\x61ndroid_version\x18\x01 \x01(\t\x12\x1e\n\x16\x61ndroid_branch_version\x18\x02 \x01(\t\x12\x1e\n\x16\x61ndroid_target_version\x18\x03 \x01(\t\x12\x16\n\x0e\x63hrome_version\x18\x04 \x01(\t\x12\x14\n\x0c\x66ull_version\x18\x05 \x01(\t\x12\x19\n\x11milestone_version\x18\x06 \x01(\t\x12\x18\n\x10platform_version\x18\x07 \x01(\t\"m\n\x18HasChromePrebuiltRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"1\n\x19HasChromePrebuiltResponse\x12\x14\n\x0chas_prebuilt\x18\x01 \x01(\x08\"\xaf\x01\n\x14UprevPackagesRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12.\n\rbuild_targets\x18\x02 \x03(\x0b\x32\x17.chromiumos.BuildTarget\x12/\n\x0coverlay_type\x18\x03 \x01(\x0e\x32\x19.chromite.api.OverlayType\x12\x12\n\noutput_dir\x18\x04 \x01(\t\"\xa3\x02\n\x1cUprevVersionedPackageRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0cpackage_info\x18\x02 \x01(\x0b\x32\x17.chromiumos.PackageInfo\x12\x43\n\x08versions\x18\x03 \x03(\x0b\x32\x31.chromite.api.UprevVersionedPackageRequest.GitRef\x12.\n\rbuild_targets\x18\x04 \x03(\x0b\x32\x17.chromiumos.BuildTarget\x1a;\n\x06GitRef\x12\x12\n\nrepository\x18\x01 \x01(\t\x12\x0b\n\x03ref\x18\x02 \x01(\t\x12\x10\n\x08revision\x18\x03 \x01(\t\"\x86\x01\n\x15UprevPackagesResponse\x12\x44\n\x10modified_ebuilds\x18\x01 \x03(\x0b\x32*.chromite.api.UprevPackagesResponse.Ebuild\x12\x0f\n\x07version\x18\x02 \x01(\t\x1a\x16\n\x06\x45\x62uild\x12\x0c\n\x04path\x18\x01 \x01(\t\"W\n\x1dUprevVersionedPackageResponse\x12\x36\n\tresponses\x18\x01 \x03(\x0b\x32#.chromite.api.UprevPackagesResponse2\xd9\x05\n\x0ePackageService\x12U\n\x0c\x42uildsChrome\x12!.chromite.api.BuildsChromeRequest\x1a\".chromite.api.BuildsChromeResponse\x12[\n\x0eGetBestVisible\x12#.chromite.api.GetBestVisibleRequest\x1a$.chromite.api.GetBestVisibleResponse\x12\x61\n\x10GetChromeVersion\x12%.chromite.api.GetChromeVersionRequest\x1a&.chromite.api.GetChromeVersionResponse\x12\x64\n\x11GetTargetVersions\x12&.chromite.api.GetTargetVersionsRequest\x1a\'.chromite.api.GetTargetVersionsResponse\x12\x64\n\x11HasChromePrebuilt\x12&.chromite.api.HasChromePrebuiltRequest\x1a\'.chromite.api.HasChromePrebuiltResponse\x12X\n\x05Uprev\x12\".chromite.api.UprevPackagesRequest\x1a#.chromite.api.UprevPackagesResponse\"\x06\xc2\xed\x1a\x02\x10\x02\x12x\n\x15UprevVersionedPackage\x12*.chromite.api.UprevVersionedPackageRequest\x1a+.chromite.api.UprevVersionedPackageResponse\"\x06\xc2\xed\x1a\x02\x10\x02\x1a\x10\xc2\xed\x1a\x0c\n\x08packages\x10\x01\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
+  serialized_pb=_b('\n\x1b\x63hromite/api/packages.proto\x12\x0c\x63hromite.api\x1a\x1a\x63hromite/api/binhost.proto\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\"\x93\x01\n\x13\x42uildsChromeRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12)\n\x08packages\x18\x03 \x03(\x0b\x32\x17.chromiumos.PackageInfo\"-\n\x14\x42uildsChromeResponse\x12\x15\n\rbuilds_chrome\x18\x01 \x01(\x08\"x\n\x15GetBestVisibleRequest\x12\x0c\n\x04\x61tom\x18\x01 \x01(\t\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x03 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"G\n\x16GetBestVisibleResponse\x12-\n\x0cpackage_info\x18\x01 \x01(\x0b\x32\x17.chromiumos.PackageInfo\"l\n\x17GetChromeVersionRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"+\n\x18GetChromeVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\"m\n\x18GetTargetVersionsRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"\xd7\x01\n\x19GetTargetVersionsResponse\x12\x17\n\x0f\x61ndroid_version\x18\x01 \x01(\t\x12\x1e\n\x16\x61ndroid_branch_version\x18\x02 \x01(\t\x12\x1e\n\x16\x61ndroid_target_version\x18\x03 \x01(\t\x12\x16\n\x0e\x63hrome_version\x18\x04 \x01(\t\x12\x14\n\x0c\x66ull_version\x18\x05 \x01(\t\x12\x19\n\x11milestone_version\x18\x06 \x01(\t\x12\x18\n\x10platform_version\x18\x07 \x01(\t\"m\n\x18HasChromePrebuiltRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0c\x62uild_target\x18\x02 \x01(\x0b\x32\x17.chromiumos.BuildTarget\"1\n\x19HasChromePrebuiltResponse\x12\x14\n\x0chas_prebuilt\x18\x01 \x01(\x08\"\xaf\x01\n\x14UprevPackagesRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12.\n\rbuild_targets\x18\x02 \x03(\x0b\x32\x17.chromiumos.BuildTarget\x12/\n\x0coverlay_type\x18\x03 \x01(\x0e\x32\x19.chromite.api.OverlayType\x12\x12\n\noutput_dir\x18\x04 \x01(\t\"\xa3\x02\n\x1cUprevVersionedPackageRequest\x12\"\n\x06\x63hroot\x18\x01 \x01(\x0b\x32\x12.chromiumos.Chroot\x12-\n\x0cpackage_info\x18\x02 \x01(\x0b\x32\x17.chromiumos.PackageInfo\x12\x43\n\x08versions\x18\x03 \x03(\x0b\x32\x31.chromite.api.UprevVersionedPackageRequest.GitRef\x12.\n\rbuild_targets\x18\x04 \x03(\x0b\x32\x17.chromiumos.BuildTarget\x1a;\n\x06GitRef\x12\x12\n\nrepository\x18\x01 \x01(\t\x12\x0b\n\x03ref\x18\x02 \x01(\t\x12\x10\n\x08revision\x18\x03 \x01(\t\"\x9d\x01\n\x15UprevPackagesResponse\x12\x44\n\x10modified_ebuilds\x18\x01 \x03(\x0b\x32*.chromite.api.UprevPackagesResponse.Ebuild\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x15\n\ruprev_message\x18\x03 \x01(\t\x1a\x16\n\x06\x45\x62uild\x12\x0c\n\x04path\x18\x01 \x01(\t\"W\n\x1dUprevVersionedPackageResponse\x12\x36\n\tresponses\x18\x01 \x03(\x0b\x32#.chromite.api.UprevPackagesResponse2\xd9\x05\n\x0ePackageService\x12U\n\x0c\x42uildsChrome\x12!.chromite.api.BuildsChromeRequest\x1a\".chromite.api.BuildsChromeResponse\x12[\n\x0eGetBestVisible\x12#.chromite.api.GetBestVisibleRequest\x1a$.chromite.api.GetBestVisibleResponse\x12\x61\n\x10GetChromeVersion\x12%.chromite.api.GetChromeVersionRequest\x1a&.chromite.api.GetChromeVersionResponse\x12\x64\n\x11GetTargetVersions\x12&.chromite.api.GetTargetVersionsRequest\x1a\'.chromite.api.GetTargetVersionsResponse\x12\x64\n\x11HasChromePrebuilt\x12&.chromite.api.HasChromePrebuiltRequest\x1a\'.chromite.api.HasChromePrebuiltResponse\x12X\n\x05Uprev\x12\".chromite.api.UprevPackagesRequest\x1a#.chromite.api.UprevPackagesResponse\"\x06\xc2\xed\x1a\x02\x10\x02\x12x\n\x15UprevVersionedPackage\x12*.chromite.api.UprevVersionedPackageRequest\x1a+.chromite.api.UprevVersionedPackageResponse\"\x06\xc2\xed\x1a\x02\x10\x02\x1a\x10\xc2\xed\x1a\x0c\n\x08packages\x10\x01\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
   ,
   dependencies=[chromite_dot_api_dot_binhost__pb2.DESCRIPTOR,chromite_dot_api_dot_build__api__pb2.DESCRIPTOR,chromiumos_dot_common__pb2.DESCRIPTOR,])
 
@@ -604,8 +604,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1751,
-  serialized_end=1773,
+  serialized_start=1774,
+  serialized_end=1796,
 )
 
 _UPREVPACKAGESRESPONSE = _descriptor.Descriptor(
@@ -629,6 +629,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='uprev_message', full_name='chromite.api.UprevPackagesResponse.uprev_message', 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),
   ],
   extensions=[
   ],
@@ -642,7 +649,7 @@
   oneofs=[
   ],
   serialized_start=1639,
-  serialized_end=1773,
+  serialized_end=1796,
 )
 
 
@@ -672,8 +679,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1775,
-  serialized_end=1862,
+  serialized_start=1798,
+  serialized_end=1885,
 )
 
 _BUILDSCHROMEREQUEST.fields_by_name['chroot'].message_type = chromiumos_dot_common__pb2._CHROOT
@@ -838,8 +845,8 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=_b('\302\355\032\014\n\010packages\020\001'),
-  serialized_start=1865,
-  serialized_end=2594,
+  serialized_start=1888,
+  serialized_end=2617,
   methods=[
   _descriptor.MethodDescriptor(
     name='BuildsChrome',
diff --git a/api/gen/chromite/api/toolchain_pb2.py b/api/gen/chromite/api/toolchain_pb2.py
index 5185df6..66a3688 100644
--- a/api/gen/chromite/api/toolchain_pb2.py
+++ b/api/gen/chromite/api/toolchain_pb2.py
@@ -22,7 +22,7 @@
   package='chromite.api',
   syntax='proto3',
   serialized_options=_b('Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api'),
-  serialized_pb=_b('\n\x1c\x63hromite/api/toolchain.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\"\x82\x01\n\x1aVerifyAFDOArtifactsRequest\x12-\n\x0c\x62uild_target\x18\x01 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x35\n\rartifact_type\x18\x02 \x01(\x0e\x32\x1e.chromite.api.AFDOArtifactType\"-\n\x1bVerifyAFDOArtifactsResponse\x12\x0e\n\x06status\x18\x01 \x01(\x08*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\x32\x8d\x02\n\x10ToolchainService\x12t\n\x1dUpdateEbuildWithAFDOArtifacts\x12(.chromite.api.VerifyAFDOArtifactsRequest\x1a).chromite.api.VerifyAFDOArtifactsResponse\x12p\n\x19UploadVettedAFDOArtifacts\x12(.chromite.api.VerifyAFDOArtifactsRequest\x1a).chromite.api.VerifyAFDOArtifactsResponse\x1a\x11\xc2\xed\x1a\r\n\ttoolchain\x10\x01\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
+  serialized_pb=_b('\n\x1c\x63hromite/api/toolchain.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\"\x80\x01\n\x1aVerifyAFDOArtifactsRequest\x12-\n\x0c\x62uild_target\x18\x01 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x33\n\rartifact_type\x18\x02 \x01(\x0e\x32\x1c.chromiumos.AFDOArtifactType\"-\n\x1bVerifyAFDOArtifactsResponse\x12\x0e\n\x06status\x18\x01 \x01(\x08*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\x32\x8d\x02\n\x10ToolchainService\x12t\n\x1dUpdateEbuildWithAFDOArtifacts\x12(.chromite.api.VerifyAFDOArtifactsRequest\x1a).chromite.api.VerifyAFDOArtifactsResponse\x12p\n\x19UploadVettedAFDOArtifacts\x12(.chromite.api.VerifyAFDOArtifactsRequest\x1a).chromite.api.VerifyAFDOArtifactsResponse\x1a\x11\xc2\xed\x1a\r\n\ttoolchain\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,])
 
@@ -55,8 +55,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=281,
-  serialized_end=383,
+  serialized_start=279,
+  serialized_end=381,
 )
 _sym_db.RegisterEnumDescriptor(_AFDOARTIFACTTYPE)
 
@@ -103,7 +103,7 @@
   oneofs=[
   ],
   serialized_start=102,
-  serialized_end=232,
+  serialized_end=230,
 )
 
 
@@ -133,12 +133,12 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=234,
-  serialized_end=279,
+  serialized_start=232,
+  serialized_end=277,
 )
 
 _VERIFYAFDOARTIFACTSREQUEST.fields_by_name['build_target'].message_type = chromiumos_dot_common__pb2._BUILDTARGET
-_VERIFYAFDOARTIFACTSREQUEST.fields_by_name['artifact_type'].enum_type = _AFDOARTIFACTTYPE
+_VERIFYAFDOARTIFACTSREQUEST.fields_by_name['artifact_type'].enum_type = chromiumos_dot_common__pb2._AFDOARTIFACTTYPE
 DESCRIPTOR.message_types_by_name['VerifyAFDOArtifactsRequest'] = _VERIFYAFDOARTIFACTSREQUEST
 DESCRIPTOR.message_types_by_name['VerifyAFDOArtifactsResponse'] = _VERIFYAFDOARTIFACTSRESPONSE
 DESCRIPTOR.enum_types_by_name['AFDOArtifactType'] = _AFDOARTIFACTTYPE
@@ -167,8 +167,8 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=_b('\302\355\032\r\n\ttoolchain\020\001'),
-  serialized_start=386,
-  serialized_end=655,
+  serialized_start=384,
+  serialized_end=653,
   methods=[
   _descriptor.MethodDescriptor(
     name='UpdateEbuildWithAFDOArtifacts',
diff --git a/api/gen/chromiumos/builder_config_pb2.py b/api/gen/chromiumos/builder_config_pb2.py
index 421271f..2105743 100644
--- a/api/gen/chromiumos/builder_config_pb2.py
+++ b/api/gen/chromiumos/builder_config_pb2.py
@@ -13,6 +13,7 @@
 
 
 from chromite.api.gen.chromiumos import common_pb2 as chromiumos_dot_common__pb2
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
 from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
 
 
@@ -21,9 +22,9 @@
   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\x1egoogle/protobuf/wrappers.proto\"\xef\x10\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\x89\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\"4\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x06\n\x02\x43Q\x10\x01\x12\x0e\n\nPOSTSUBMIT\x10\x02\x1a\xc6\x03\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\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\x1a \n\x0cOrchestrator\x12\x10\n\x08\x63hildren\x18\x01 \x03(\t\x1a\x8c\x04\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\"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\"\xec\x01\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\x1a\x1a\n\x06\x43hrome\x12\x10\n\x08internal\x18\x01 \x01(\x08\x1a\xee\x02\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*\n\x0bimage_types\x18\x03 \x03(\x0e\x32\x15.chromiumos.ImageType\x12;\n\x10install_packages\x18\x04 \x01(\x0e\x32!.chromiumos.BuilderConfig.RunSpec\x12\x19\n\x11\x63ompile_toolchain\x18\x05 \x01(\x08\x12\x1c\n\x14\x61pply_gerrit_changes\x18\x06 \x01(\x08\x12)\n\x08packages\x18\x07 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x1a!\n\x0ePortageProfile\x12\x0f\n\x07profile\x18\x01 \x01(\tJ\x04\x08\t\x10\n\x1a\x93\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\"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\"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\"\x87\x13\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\x98\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\x1a\xf9\x03\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\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\x1a \n\x0cOrchestrator\x12\x10\n\x08\x63hildren\x18\x01 \x03(\t\x1a\x8c\x04\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\"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\"\xec\x01\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\x1a\x1a\n\x06\x43hrome\x12\x10\n\x08internal\x18\x01 \x01(\x08\x1a\xc4\x04\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*\n\x0bimage_types\x18\x03 \x03(\x0e\x32\x15.chromiumos.ImageType\x12;\n\x10install_packages\x18\x04 \x01(\x0e\x32!.chromiumos.BuilderConfig.RunSpec\x12\x19\n\x11\x63ompile_toolchain\x18\x05 \x01(\x08\x12\x1c\n\x14\x61pply_gerrit_changes\x18\x06 \x01(\x08\x12)\n\x08packages\x18\x07 \x03(\x0b\x32\x17.chromiumos.PackageInfo\x12\x46\n\x0ftoolchain_steps\x18\x08 \x03(\x0b\x32-.chromiumos.BuilderConfig.Build.ToolchainStep\x1a!\n\x0ePortageProfile\x12\x0f\n\x07profile\x18\x01 \x01(\t\x1a\x8b\x01\n\rToolchainStep\x12=\n\x17generate_artifact_types\x18\x01 \x03(\x0e\x32\x1c.chromiumos.AFDOArtifactType\x12;\n\x15verify_artifact_types\x18\x02 \x03(\x0e\x32\x1c.chromiumos.AFDOArtifactTypeJ\x04\x08\t\x10\n\x1a\x93\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\"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\"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_wrappers__pb2.DESCRIPTOR,])
+  dependencies=[chromiumos_dot_common__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,])
 
 
 
@@ -45,11 +46,15 @@
       name='POSTSUBMIT', index=2, number=2,
       serialized_options=None,
       type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TOOLCHAIN', index=3, number=3,
+      serialized_options=None,
+      type=None),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=575,
-  serialized_end=627,
+  serialized_start=608,
+  serialized_end=675,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_ID_TYPE)
 
@@ -78,8 +83,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=913,
-  serialized_end=1011,
+  serialized_start=1012,
+  serialized_end=1110,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_GENERAL_RUNWHEN_MODE)
 
@@ -104,8 +109,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1013,
-  serialized_end=1084,
+  serialized_start=1112,
+  serialized_end=1183,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_GENERAL_ENVIRONMENT)
 
@@ -134,8 +139,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1333,
-  serialized_end=1406,
+  serialized_start=1432,
+  serialized_end=1505,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_ARTIFACTS_PREBUILTS)
 
@@ -192,8 +197,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1409,
-  serialized_end=1645,
+  serialized_start=1508,
+  serialized_end=1744,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_ARTIFACTS_ARTIFACTTYPES)
 
@@ -222,8 +227,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2194,
-  serialized_end=2264,
+  serialized_start=2507,
+  serialized_end=2577,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDERCONFIG_RUNSPEC)
 
@@ -269,8 +274,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=490,
-  serialized_end=627,
+  serialized_start=523,
+  serialized_end=675,
 )
 
 _BUILDERCONFIG_GENERAL_RUNWHEN = _descriptor.Descriptor(
@@ -307,8 +312,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=817,
-  serialized_end=1011,
+  serialized_start=916,
+  serialized_end=1110,
 )
 
 _BUILDERCONFIG_GENERAL = _descriptor.Descriptor(
@@ -339,6 +344,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='broken_before', full_name='chromiumos.BuilderConfig.General.broken_before', 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),
   ],
   extensions=[
   ],
@@ -352,8 +364,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=630,
-  serialized_end=1084,
+  serialized_start=678,
+  serialized_end=1183,
 )
 
 _BUILDERCONFIG_ORCHESTRATOR = _descriptor.Descriptor(
@@ -382,8 +394,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1086,
-  serialized_end=1118,
+  serialized_start=1185,
+  serialized_end=1217,
 )
 
 _BUILDERCONFIG_ARTIFACTS = _descriptor.Descriptor(
@@ -435,8 +447,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1121,
-  serialized_end=1645,
+  serialized_start=1220,
+  serialized_end=1744,
 )
 
 _BUILDERCONFIG_CHROME = _descriptor.Descriptor(
@@ -465,8 +477,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1647,
-  serialized_end=1673,
+  serialized_start=1746,
+  serialized_end=1772,
 )
 
 _BUILDERCONFIG_BUILD_PORTAGEPROFILE = _descriptor.Descriptor(
@@ -495,8 +507,45 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2003,
-  serialized_end=2036,
+  serialized_start=2174,
+  serialized_end=2207,
+)
+
+_BUILDERCONFIG_BUILD_TOOLCHAINSTEP = _descriptor.Descriptor(
+  name='ToolchainStep',
+  full_name='chromiumos.BuilderConfig.Build.ToolchainStep',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='generate_artifact_types', full_name='chromiumos.BuilderConfig.Build.ToolchainStep.generate_artifact_types', index=0,
+      number=1, 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='verify_artifact_types', full_name='chromiumos.BuilderConfig.Build.ToolchainStep.verify_artifact_types', index=1,
+      number=2, 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2210,
+  serialized_end=2349,
 )
 
 _BUILDERCONFIG_BUILD = _descriptor.Descriptor(
@@ -555,10 +604,17 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='toolchain_steps', full_name='chromiumos.BuilderConfig.Build.toolchain_steps', index=7,
+      number=8, 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=[_BUILDERCONFIG_BUILD_PORTAGEPROFILE, ],
+  nested_types=[_BUILDERCONFIG_BUILD_PORTAGEPROFILE, _BUILDERCONFIG_BUILD_TOOLCHAINSTEP, ],
   enum_types=[
   ],
   serialized_options=None,
@@ -567,8 +623,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1676,
-  serialized_end=2042,
+  serialized_start=1775,
+  serialized_end=2355,
 )
 
 _BUILDERCONFIG_UNITTESTS = _descriptor.Descriptor(
@@ -611,8 +667,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2045,
-  serialized_end=2192,
+  serialized_start=2358,
+  serialized_end=2505,
 )
 
 _BUILDERCONFIG = _descriptor.Descriptor(
@@ -684,8 +740,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=105,
-  serialized_end=2264,
+  serialized_start=138,
+  serialized_end=2577,
 )
 
 
@@ -715,8 +771,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2266,
-  serialized_end=2334,
+  serialized_start=2579,
+  serialized_end=2647,
 )
 
 _BUILDERCONFIG_ID.fields_by_name['type'].enum_type = _BUILDERCONFIG_ID_TYPE
@@ -728,6 +784,7 @@
 _BUILDERCONFIG_GENERAL.fields_by_name['critical'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
 _BUILDERCONFIG_GENERAL.fields_by_name['environment'].enum_type = _BUILDERCONFIG_GENERAL_ENVIRONMENT
 _BUILDERCONFIG_GENERAL.fields_by_name['run_when'].message_type = _BUILDERCONFIG_GENERAL_RUNWHEN
+_BUILDERCONFIG_GENERAL.fields_by_name['broken_before'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
 _BUILDERCONFIG_GENERAL.containing_type = _BUILDERCONFIG
 _BUILDERCONFIG_GENERAL_ENVIRONMENT.containing_type = _BUILDERCONFIG_GENERAL
 _BUILDERCONFIG_ORCHESTRATOR.containing_type = _BUILDERCONFIG
@@ -738,11 +795,15 @@
 _BUILDERCONFIG_ARTIFACTS_ARTIFACTTYPES.containing_type = _BUILDERCONFIG_ARTIFACTS
 _BUILDERCONFIG_CHROME.containing_type = _BUILDERCONFIG
 _BUILDERCONFIG_BUILD_PORTAGEPROFILE.containing_type = _BUILDERCONFIG_BUILD
+_BUILDERCONFIG_BUILD_TOOLCHAINSTEP.fields_by_name['generate_artifact_types'].enum_type = chromiumos_dot_common__pb2._AFDOARTIFACTTYPE
+_BUILDERCONFIG_BUILD_TOOLCHAINSTEP.fields_by_name['verify_artifact_types'].enum_type = chromiumos_dot_common__pb2._AFDOARTIFACTTYPE
+_BUILDERCONFIG_BUILD_TOOLCHAINSTEP.containing_type = _BUILDERCONFIG_BUILD
 _BUILDERCONFIG_BUILD.fields_by_name['use_flags'].message_type = chromiumos_dot_common__pb2._USEFLAG
 _BUILDERCONFIG_BUILD.fields_by_name['portage_profile'].message_type = _BUILDERCONFIG_BUILD_PORTAGEPROFILE
 _BUILDERCONFIG_BUILD.fields_by_name['image_types'].enum_type = chromiumos_dot_common__pb2._IMAGETYPE
 _BUILDERCONFIG_BUILD.fields_by_name['install_packages'].enum_type = _BUILDERCONFIG_RUNSPEC
 _BUILDERCONFIG_BUILD.fields_by_name['packages'].message_type = chromiumos_dot_common__pb2._PACKAGEINFO
+_BUILDERCONFIG_BUILD.fields_by_name['toolchain_steps'].message_type = _BUILDERCONFIG_BUILD_TOOLCHAINSTEP
 _BUILDERCONFIG_BUILD.containing_type = _BUILDERCONFIG
 _BUILDERCONFIG_UNITTESTS.fields_by_name['package_blacklist'].message_type = chromiumos_dot_common__pb2._PACKAGEINFO
 _BUILDERCONFIG_UNITTESTS.fields_by_name['ebuilds_run_spec'].enum_type = _BUILDERCONFIG_RUNSPEC
@@ -812,6 +873,13 @@
       # @@protoc_insertion_point(class_scope:chromiumos.BuilderConfig.Build.PortageProfile)
       ))
     ,
+
+    ToolchainStep = _reflection.GeneratedProtocolMessageType('ToolchainStep', (_message.Message,), dict(
+      DESCRIPTOR = _BUILDERCONFIG_BUILD_TOOLCHAINSTEP,
+      __module__ = 'chromiumos.builder_config_pb2'
+      # @@protoc_insertion_point(class_scope:chromiumos.BuilderConfig.Build.ToolchainStep)
+      ))
+    ,
     DESCRIPTOR = _BUILDERCONFIG_BUILD,
     __module__ = 'chromiumos.builder_config_pb2'
     # @@protoc_insertion_point(class_scope:chromiumos.BuilderConfig.Build)
@@ -837,6 +905,7 @@
 _sym_db.RegisterMessage(BuilderConfig.Chrome)
 _sym_db.RegisterMessage(BuilderConfig.Build)
 _sym_db.RegisterMessage(BuilderConfig.Build.PortageProfile)
+_sym_db.RegisterMessage(BuilderConfig.Build.ToolchainStep)
 _sym_db.RegisterMessage(BuilderConfig.UnitTests)
 
 BuilderConfigs = _reflection.GeneratedProtocolMessageType('BuilderConfigs', (_message.Message,), dict(
diff --git a/api/gen/chromiumos/common_pb2.py b/api/gen/chromiumos/common_pb2.py
index b93ec0d..f2578d2 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\"\xea\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\x12$\n\x04goma\x18\x05 \x01(\x0b\x32\x16.chromiumos.GomaConfig\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.Feature\"\x1a\n\x07\x46\x65\x61ture\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\"\xea\x01\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\"Y\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\"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\"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\"\x17\n\x07UseFlag\x12\x0c\n\x04\x66lag\x18\x01 \x01(\t\"&\n\nProtoBytes\x12\x18\n\x10serialized_proto\x18\x01 \x01(\x0c*\x98\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*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\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\"\xea\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\x12$\n\x04goma\x18\x05 \x01(\x0b\x32\x16.chromiumos.GomaConfig\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.Feature\"\x1a\n\x07\x46\x65\x61ture\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\"\xea\x01\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\"Y\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\"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\"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\"\x17\n\x07UseFlag\x12\x0c\n\x04\x66lag\x18\x01 \x01(\t\"&\n\nProtoBytes\x12\x18\n\x10serialized_proto\x18\x01 \x01(\x0c*\x98\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*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*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(
@@ -113,6 +113,41 @@
 _sym_db.RegisterEnumDescriptor(_CHANNEL)
 
 Channel = enum_type_wrapper.EnumTypeWrapper(_CHANNEL)
+_AFDOARTIFACTTYPE = _descriptor.EnumDescriptor(
+  name='AFDOArtifactType',
+  full_name='chromiumos.AFDOArtifactType',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NONE_TYPE', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='ORDERFILE', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BENCHMARK_AFDO', index=2, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='KERNEL_AFDO', index=3, number=3,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='CHROME_AFDO', index=4, number=4,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1140,
+  serialized_end=1242,
+)
+_sym_db.RegisterEnumDescriptor(_AFDOARTIFACTTYPE)
+
+AFDOArtifactType = enum_type_wrapper.EnumTypeWrapper(_AFDOARTIFACTTYPE)
 IMAGE_TYPE_UNDEFINED = 0
 BASE = 1
 DEV = 2
@@ -128,6 +163,11 @@
 CHANNEL_BETA = 2
 CHANNEL_DEV = 3
 CHANNEL_CANARY = 4
+NONE_TYPE = 0
+ORDERFILE = 1
+BENCHMARK_AFDO = 2
+KERNEL_AFDO = 3
+CHROME_AFDO = 4
 
 
 _GOMACONFIG_GOMAAPPROACH = _descriptor.EnumDescriptor(
@@ -595,6 +635,7 @@
 DESCRIPTOR.message_types_by_name['ProtoBytes'] = _PROTOBYTES
 DESCRIPTOR.enum_types_by_name['ImageType'] = _IMAGETYPE
 DESCRIPTOR.enum_types_by_name['Channel'] = _CHANNEL
+DESCRIPTOR.enum_types_by_name['AFDOArtifactType'] = _AFDOARTIFACTTYPE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 BuildTarget = _reflection.GeneratedProtocolMessageType('BuildTarget', (_message.Message,), dict(
diff --git a/api/gen/test_platform/side_effects/config_pb2.py b/api/gen/test_platform/side_effects/config_pb2.py
index 8a9f757..1770d4b 100644
--- a/api/gen/test_platform/side_effects/config_pb2.py
+++ b/api/gen/test_platform/side_effects/config_pb2.py
@@ -19,7 +19,7 @@
   package='test_platform.side_effects',
   syntax='proto3',
   serialized_options=_b('ZDgo.chromium.org/chromiumos/infra/proto/go/test_platform/side_effects'),
-  serialized_pb=_b('\n\'test_platform/side_effects/config.proto\x12\x1atest_platform.side_effects\"\x81\x01\n\tTKOConfig\x12\"\n\x0cproxy_socket\x18\x01 \x01(\tR\x0cproxy_socket\x12\x1e\n\nmysql_user\x18\x02 \x01(\tR\nmysql_user\x12\x30\n\x13mysql_password_file\x18\x03 \x01(\tR\x13mysql_password_file\"Q\n\x13GoogleStorageConfig\x12\x0e\n\x06\x62ucket\x18\x01 \x01(\t\x12*\n\x10\x63redentials_file\x18\x02 \x01(\tR\x10\x63redentials_file\"#\n\x10\x43hromePerfConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"\x1c\n\tCTSConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"\x99\x02\n\x06\x43onfig\x12\x32\n\x03tko\x18\x01 \x01(\x0b\x32%.test_platform.side_effects.TKOConfig\x12W\n\x0egoogle_storage\x18\x02 \x01(\x0b\x32/.test_platform.side_effects.GoogleStorageConfigR\x0egoogle_storage\x12N\n\x0b\x63hrome_perf\x18\x03 \x01(\x0b\x32,.test_platform.side_effects.ChromePerfConfigR\x0b\x63hrome_perf\x12\x32\n\x03\x63ts\x18\x04 \x01(\x0b\x32%.test_platform.side_effects.CTSConfigBFZDgo.chromium.org/chromiumos/infra/proto/go/test_platform/side_effectsb\x06proto3')
+  serialized_pb=_b('\n\'test_platform/side_effects/config.proto\x12\x1atest_platform.side_effects\"\xbd\x01\n\tTKOConfig\x12\"\n\x0cproxy_socket\x18\x01 \x01(\tR\x0cproxy_socket\x12\x1e\n\nmysql_user\x18\x02 \x01(\tR\nmysql_user\x12\x30\n\x13mysql_password_file\x18\x03 \x01(\tR\x13mysql_password_file\x12:\n\x18\x65ncrypted_mysql_password\x18\x04 \x01(\tR\x18\x65ncrypted_mysql_password\"Q\n\x13GoogleStorageConfig\x12\x0e\n\x06\x62ucket\x18\x01 \x01(\t\x12*\n\x10\x63redentials_file\x18\x02 \x01(\tR\x10\x63redentials_file\"#\n\x10\x43hromePerfConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"\x1c\n\tCTSConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"\x99\x02\n\x06\x43onfig\x12\x32\n\x03tko\x18\x01 \x01(\x0b\x32%.test_platform.side_effects.TKOConfig\x12W\n\x0egoogle_storage\x18\x02 \x01(\x0b\x32/.test_platform.side_effects.GoogleStorageConfigR\x0egoogle_storage\x12N\n\x0b\x63hrome_perf\x18\x03 \x01(\x0b\x32,.test_platform.side_effects.ChromePerfConfigR\x0b\x63hrome_perf\x12\x32\n\x03\x63ts\x18\x04 \x01(\x0b\x32%.test_platform.side_effects.CTSConfigBFZDgo.chromium.org/chromiumos/infra/proto/go/test_platform/side_effectsb\x06proto3')
 )
 
 
@@ -53,6 +53,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, json_name='mysql_password_file', file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='encrypted_mysql_password', full_name='test_platform.side_effects.TKOConfig.encrypted_mysql_password', 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, json_name='encrypted_mysql_password', file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -66,7 +73,7 @@
   oneofs=[
   ],
   serialized_start=72,
-  serialized_end=201,
+  serialized_end=261,
 )
 
 
@@ -103,8 +110,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=203,
-  serialized_end=284,
+  serialized_start=263,
+  serialized_end=344,
 )
 
 
@@ -134,8 +141,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=286,
-  serialized_end=321,
+  serialized_start=346,
+  serialized_end=381,
 )
 
 
@@ -165,8 +172,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=323,
-  serialized_end=351,
+  serialized_start=383,
+  serialized_end=411,
 )
 
 
@@ -217,8 +224,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=354,
-  serialized_end=635,
+  serialized_start=414,
+  serialized_end=695,
 )
 
 _CONFIG.fields_by_name['tko'].message_type = _TKOCONFIG
diff --git a/api/gen/test_platform/steps/compute_backfill_pb2.py b/api/gen/test_platform/steps/compute_backfill_pb2.py
new file mode 100644
index 0000000..53391e8
--- /dev/null
+++ b/api/gen/test_platform/steps/compute_backfill_pb2.py
@@ -0,0 +1,211 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: test_platform/steps/compute_backfill.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 chromite.api.gen.test_platform import request_pb2 as test__platform_dot_request__pb2
+from chromite.api.gen.test_platform.steps import enumeration_pb2 as test__platform_dot_steps_dot_enumeration__pb2
+from chromite.api.gen.test_platform.steps import execution_pb2 as test__platform_dot_steps_dot_execution__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='test_platform/steps/compute_backfill.proto',
+  package='test_platform.steps',
+  syntax='proto3',
+  serialized_options=_b('Z=go.chromium.org/chromiumos/infra/proto/go/test_platform/steps'),
+  serialized_pb=_b('\n*test_platform/steps/compute_backfill.proto\x12\x13test_platform.steps\x1a\x1btest_platform/request.proto\x1a%test_platform/steps/enumeration.proto\x1a#test_platform/steps/execution.proto\"X\n\x17\x43omputeBackfillRequests\x12=\n\x08requests\x18\x01 \x03(\x0b\x32+.test_platform.steps.ComputeBackfillRequest\"[\n\x18\x43omputeBackfillResponses\x12?\n\tresponses\x18\x01 \x03(\x0b\x32,.test_platform.steps.ComputeBackfillResponse\"\xb9\x01\n\x16\x43omputeBackfillRequest\x12\'\n\x07request\x18\x01 \x01(\x0b\x32\x16.test_platform.Request\x12=\n\x0b\x65numeration\x18\x02 \x01(\x0b\x32(.test_platform.steps.EnumerationResponse\x12\x37\n\texecution\x18\x03 \x01(\x0b\x32$.test_platform.steps.ExecuteResponse\"B\n\x17\x43omputeBackfillResponse\x12\'\n\x07request\x18\x01 \x01(\x0b\x32\x16.test_platform.RequestB?Z=go.chromium.org/chromiumos/infra/proto/go/test_platform/stepsb\x06proto3')
+  ,
+  dependencies=[test__platform_dot_request__pb2.DESCRIPTOR,test__platform_dot_steps_dot_enumeration__pb2.DESCRIPTOR,test__platform_dot_steps_dot_execution__pb2.DESCRIPTOR,])
+
+
+
+
+_COMPUTEBACKFILLREQUESTS = _descriptor.Descriptor(
+  name='ComputeBackfillRequests',
+  full_name='test_platform.steps.ComputeBackfillRequests',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='requests', full_name='test_platform.steps.ComputeBackfillRequests.requests', 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=172,
+  serialized_end=260,
+)
+
+
+_COMPUTEBACKFILLRESPONSES = _descriptor.Descriptor(
+  name='ComputeBackfillResponses',
+  full_name='test_platform.steps.ComputeBackfillResponses',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='responses', full_name='test_platform.steps.ComputeBackfillResponses.responses', 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=262,
+  serialized_end=353,
+)
+
+
+_COMPUTEBACKFILLREQUEST = _descriptor.Descriptor(
+  name='ComputeBackfillRequest',
+  full_name='test_platform.steps.ComputeBackfillRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='request', full_name='test_platform.steps.ComputeBackfillRequest.request', 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='enumeration', full_name='test_platform.steps.ComputeBackfillRequest.enumeration', 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='execution', full_name='test_platform.steps.ComputeBackfillRequest.execution', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=356,
+  serialized_end=541,
+)
+
+
+_COMPUTEBACKFILLRESPONSE = _descriptor.Descriptor(
+  name='ComputeBackfillResponse',
+  full_name='test_platform.steps.ComputeBackfillResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='request', full_name='test_platform.steps.ComputeBackfillResponse.request', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=543,
+  serialized_end=609,
+)
+
+_COMPUTEBACKFILLREQUESTS.fields_by_name['requests'].message_type = _COMPUTEBACKFILLREQUEST
+_COMPUTEBACKFILLRESPONSES.fields_by_name['responses'].message_type = _COMPUTEBACKFILLRESPONSE
+_COMPUTEBACKFILLREQUEST.fields_by_name['request'].message_type = test__platform_dot_request__pb2._REQUEST
+_COMPUTEBACKFILLREQUEST.fields_by_name['enumeration'].message_type = test__platform_dot_steps_dot_enumeration__pb2._ENUMERATIONRESPONSE
+_COMPUTEBACKFILLREQUEST.fields_by_name['execution'].message_type = test__platform_dot_steps_dot_execution__pb2._EXECUTERESPONSE
+_COMPUTEBACKFILLRESPONSE.fields_by_name['request'].message_type = test__platform_dot_request__pb2._REQUEST
+DESCRIPTOR.message_types_by_name['ComputeBackfillRequests'] = _COMPUTEBACKFILLREQUESTS
+DESCRIPTOR.message_types_by_name['ComputeBackfillResponses'] = _COMPUTEBACKFILLRESPONSES
+DESCRIPTOR.message_types_by_name['ComputeBackfillRequest'] = _COMPUTEBACKFILLREQUEST
+DESCRIPTOR.message_types_by_name['ComputeBackfillResponse'] = _COMPUTEBACKFILLRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+ComputeBackfillRequests = _reflection.GeneratedProtocolMessageType('ComputeBackfillRequests', (_message.Message,), dict(
+  DESCRIPTOR = _COMPUTEBACKFILLREQUESTS,
+  __module__ = 'test_platform.steps.compute_backfill_pb2'
+  # @@protoc_insertion_point(class_scope:test_platform.steps.ComputeBackfillRequests)
+  ))
+_sym_db.RegisterMessage(ComputeBackfillRequests)
+
+ComputeBackfillResponses = _reflection.GeneratedProtocolMessageType('ComputeBackfillResponses', (_message.Message,), dict(
+  DESCRIPTOR = _COMPUTEBACKFILLRESPONSES,
+  __module__ = 'test_platform.steps.compute_backfill_pb2'
+  # @@protoc_insertion_point(class_scope:test_platform.steps.ComputeBackfillResponses)
+  ))
+_sym_db.RegisterMessage(ComputeBackfillResponses)
+
+ComputeBackfillRequest = _reflection.GeneratedProtocolMessageType('ComputeBackfillRequest', (_message.Message,), dict(
+  DESCRIPTOR = _COMPUTEBACKFILLREQUEST,
+  __module__ = 'test_platform.steps.compute_backfill_pb2'
+  # @@protoc_insertion_point(class_scope:test_platform.steps.ComputeBackfillRequest)
+  ))
+_sym_db.RegisterMessage(ComputeBackfillRequest)
+
+ComputeBackfillResponse = _reflection.GeneratedProtocolMessageType('ComputeBackfillResponse', (_message.Message,), dict(
+  DESCRIPTOR = _COMPUTEBACKFILLRESPONSE,
+  __module__ = 'test_platform.steps.compute_backfill_pb2'
+  # @@protoc_insertion_point(class_scope:test_platform.steps.ComputeBackfillResponse)
+  ))
+_sym_db.RegisterMessage(ComputeBackfillResponse)
+
+
+DESCRIPTOR._options = None
+# @@protoc_insertion_point(module_scope)
diff --git a/api/gen/test_platform/steps/execution_pb2.py b/api/gen/test_platform/steps/execution_pb2.py
index ab4bce5..f42de36 100644
--- a/api/gen/test_platform/steps/execution_pb2.py
+++ b/api/gen/test_platform/steps/execution_pb2.py
@@ -23,7 +23,7 @@
   package='test_platform.steps',
   syntax='proto3',
   serialized_options=_b('Z=go.chromium.org/chromiumos/infra/proto/go/test_platform/steps'),
-  serialized_pb=_b('\n#test_platform/steps/execution.proto\x12\x13test_platform.steps\x1a\x1btest_platform/request.proto\x1a%test_platform/steps/enumeration.proto\x1a!test_platform/config/config.proto\x1a\x1dtest_platform/taskstate.proto\"H\n\x0f\x45xecuteRequests\x12\x35\n\x08requests\x18\x01 \x03(\x0b\x32#.test_platform.steps.ExecuteRequest\"K\n\x10\x45xecuteResponses\x12\x37\n\tresponses\x18\x01 \x03(\x0b\x32$.test_platform.steps.ExecuteResponse\"\xb4\x01\n\x0e\x45xecuteRequest\x12\x35\n\x0erequest_params\x18\x01 \x01(\x0b\x32\x1d.test_platform.Request.Params\x12=\n\x0b\x65numeration\x18\x02 \x01(\x0b\x32(.test_platform.steps.EnumerationResponse\x12,\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x1c.test_platform.config.Config\"\x98\x04\n\x0f\x45xecuteResponse\x12\x45\n\x0ctask_results\x18\x01 \x03(\x0b\x32/.test_platform.steps.ExecuteResponse.TaskResult\x12\'\n\x05state\x18\x02 \x01(\x0b\x32\x18.test_platform.TaskState\x1a\x94\x03\n\nTaskResult\x12\x10\n\x08task_url\x18\x02 \x01(\t\x12\'\n\x05state\x18\x03 \x01(\x0b\x32\x18.test_platform.TaskState\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0f\n\x07log_url\x18\x05 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12R\n\ntest_cases\x18\x07 \x03(\x0b\x32>.test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult\x12T\n\x0cprejob_steps\x18\x08 \x03(\x0b\x32>.test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult\x1aq\n\x0eTestCaseResult\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\x07verdict\x18\x02 \x01(\x0e\x32 .test_platform.TaskState.Verdict\x12\x1e\n\x16human_readable_summary\x18\x03 \x01(\tB?Z=go.chromium.org/chromiumos/infra/proto/go/test_platform/stepsb\x06proto3')
+  serialized_pb=_b('\n#test_platform/steps/execution.proto\x12\x13test_platform.steps\x1a\x1btest_platform/request.proto\x1a%test_platform/steps/enumeration.proto\x1a!test_platform/config/config.proto\x1a\x1dtest_platform/taskstate.proto\"H\n\x0f\x45xecuteRequests\x12\x35\n\x08requests\x18\x01 \x03(\x0b\x32#.test_platform.steps.ExecuteRequest\"K\n\x10\x45xecuteResponses\x12\x37\n\tresponses\x18\x01 \x03(\x0b\x32$.test_platform.steps.ExecuteResponse\"\xb4\x01\n\x0e\x45xecuteRequest\x12\x35\n\x0erequest_params\x18\x01 \x01(\x0b\x32\x1d.test_platform.Request.Params\x12=\n\x0b\x65numeration\x18\x02 \x01(\x0b\x32(.test_platform.steps.EnumerationResponse\x12,\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x1c.test_platform.config.Config\"\xc8\x05\n\x0f\x45xecuteResponse\x12\x45\n\x0ctask_results\x18\x01 \x03(\x0b\x32/.test_platform.steps.ExecuteResponse.TaskResult\x12U\n\x14\x63onsolidated_results\x18\x03 \x03(\x0b\x32\x37.test_platform.steps.ExecuteResponse.ConsolidatedResult\x12\'\n\x05state\x18\x02 \x01(\x0b\x32\x18.test_platform.TaskState\x1a\x94\x03\n\nTaskResult\x12\x10\n\x08task_url\x18\x02 \x01(\t\x12\'\n\x05state\x18\x03 \x01(\x0b\x32\x18.test_platform.TaskState\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0f\n\x07log_url\x18\x05 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12R\n\ntest_cases\x18\x07 \x03(\x0b\x32>.test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult\x12T\n\x0cprejob_steps\x18\x08 \x03(\x0b\x32>.test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult\x1aq\n\x0eTestCaseResult\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\x07verdict\x18\x02 \x01(\x0e\x32 .test_platform.TaskState.Verdict\x12\x1e\n\x16human_readable_summary\x18\x03 \x01(\t\x1aW\n\x12\x43onsolidatedResult\x12\x41\n\x08\x61ttempts\x18\x01 \x03(\x0b\x32/.test_platform.steps.ExecuteResponse.TaskResultB?Z=go.chromium.org/chromiumos/infra/proto/go/test_platform/stepsb\x06proto3')
   ,
   dependencies=[test__platform_dot_request__pb2.DESCRIPTOR,test__platform_dot_steps_dot_enumeration__pb2.DESCRIPTOR,test__platform_dot_config_dot_config__pb2.DESCRIPTOR,test__platform_dot_taskstate__pb2.DESCRIPTOR,])
 
@@ -177,8 +177,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=952,
-  serialized_end=1065,
+  serialized_start=1039,
+  serialized_end=1152,
 )
 
 _EXECUTERESPONSE_TASKRESULT = _descriptor.Descriptor(
@@ -249,8 +249,38 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=661,
-  serialized_end=1065,
+  serialized_start=748,
+  serialized_end=1152,
+)
+
+_EXECUTERESPONSE_CONSOLIDATEDRESULT = _descriptor.Descriptor(
+  name='ConsolidatedResult',
+  full_name='test_platform.steps.ExecuteResponse.ConsolidatedResult',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='attempts', full_name='test_platform.steps.ExecuteResponse.ConsolidatedResult.attempts', 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=1154,
+  serialized_end=1241,
 )
 
 _EXECUTERESPONSE = _descriptor.Descriptor(
@@ -268,7 +298,14 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='state', full_name='test_platform.steps.ExecuteResponse.state', index=1,
+      name='consolidated_results', full_name='test_platform.steps.ExecuteResponse.consolidated_results', index=1,
+      number=3, 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='state', full_name='test_platform.steps.ExecuteResponse.state', index=2,
       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,
@@ -277,7 +314,7 @@
   ],
   extensions=[
   ],
-  nested_types=[_EXECUTERESPONSE_TASKRESULT, ],
+  nested_types=[_EXECUTERESPONSE_TASKRESULT, _EXECUTERESPONSE_CONSOLIDATEDRESULT, ],
   enum_types=[
   ],
   serialized_options=None,
@@ -287,7 +324,7 @@
   oneofs=[
   ],
   serialized_start=529,
-  serialized_end=1065,
+  serialized_end=1241,
 )
 
 _EXECUTEREQUESTS.fields_by_name['requests'].message_type = _EXECUTEREQUEST
@@ -301,7 +338,10 @@
 _EXECUTERESPONSE_TASKRESULT.fields_by_name['test_cases'].message_type = _EXECUTERESPONSE_TASKRESULT_TESTCASERESULT
 _EXECUTERESPONSE_TASKRESULT.fields_by_name['prejob_steps'].message_type = _EXECUTERESPONSE_TASKRESULT_TESTCASERESULT
 _EXECUTERESPONSE_TASKRESULT.containing_type = _EXECUTERESPONSE
+_EXECUTERESPONSE_CONSOLIDATEDRESULT.fields_by_name['attempts'].message_type = _EXECUTERESPONSE_TASKRESULT
+_EXECUTERESPONSE_CONSOLIDATEDRESULT.containing_type = _EXECUTERESPONSE
 _EXECUTERESPONSE.fields_by_name['task_results'].message_type = _EXECUTERESPONSE_TASKRESULT
+_EXECUTERESPONSE.fields_by_name['consolidated_results'].message_type = _EXECUTERESPONSE_CONSOLIDATEDRESULT
 _EXECUTERESPONSE.fields_by_name['state'].message_type = test__platform_dot_taskstate__pb2._TASKSTATE
 DESCRIPTOR.message_types_by_name['ExecuteRequests'] = _EXECUTEREQUESTS
 DESCRIPTOR.message_types_by_name['ExecuteResponses'] = _EXECUTERESPONSES
@@ -345,6 +385,13 @@
     # @@protoc_insertion_point(class_scope:test_platform.steps.ExecuteResponse.TaskResult)
     ))
   ,
+
+  ConsolidatedResult = _reflection.GeneratedProtocolMessageType('ConsolidatedResult', (_message.Message,), dict(
+    DESCRIPTOR = _EXECUTERESPONSE_CONSOLIDATEDRESULT,
+    __module__ = 'test_platform.steps.execution_pb2'
+    # @@protoc_insertion_point(class_scope:test_platform.steps.ExecuteResponse.ConsolidatedResult)
+    ))
+  ,
   DESCRIPTOR = _EXECUTERESPONSE,
   __module__ = 'test_platform.steps.execution_pb2'
   # @@protoc_insertion_point(class_scope:test_platform.steps.ExecuteResponse)
@@ -352,6 +399,7 @@
 _sym_db.RegisterMessage(ExecuteResponse)
 _sym_db.RegisterMessage(ExecuteResponse.TaskResult)
 _sym_db.RegisterMessage(ExecuteResponse.TaskResult.TestCaseResult)
+_sym_db.RegisterMessage(ExecuteResponse.ConsolidatedResult)
 
 
 DESCRIPTOR._options = None